添加骨传导sdk
authorliangzhenying <867174124@qq.com>
Sat, 6 Dec 2025 09:37:47 +0000 (17:37 +0800)
committerliangzhenying <867174124@qq.com>
Sat, 6 Dec 2025 09:37:47 +0000 (17:37 +0800)
360 files changed:
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk.xcworkspace/contents.xcworkspacedata [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/project.pbxproj [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/xcshareddata/xcschemes/DeepChordsSdk.xcscheme [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Any.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/BleSender.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DCBleManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DCDevice.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Data.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Date.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DeepChordsAiSdk.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Demo.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/LogManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/ReceiveManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Any.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/BleSender.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCLogger.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Data.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Date.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsAiSdk.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsSdk.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/ReceiveManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbaustVoiceChatModel.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrConfig.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrModel.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstConfig.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstFileAsrModel.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstOffLineFile.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstPhoneSdk.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdk.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdkManager.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstStreamModel.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbusrtSpeaker.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstDecoderConfig.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassChat.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassesSdk.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstMixSdk.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Modules/module.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1 [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeResources [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/project.pbxproj [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/xcshareddata/xcschemes/DeepChordsSdk.xcscheme [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/Contents.json [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Base.lproj/LaunchScreen.storyboard [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Base.lproj/Main.storyboard [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/App.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/AppDelegate.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/BaseVC.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/DeviceListVC.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/HomeVC.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/LogVC.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SceneDelegate.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SdkLogVC.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/ViewController.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Podfile.lock [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+ResignObjc.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/LICENSE.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Classes/IQTextView.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Manifest.lock [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Pods.xcodeproj/project.pbxproj [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Constraint.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintAttributes.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintConfig.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintConstantTarget.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDSL.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDescription.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintInsetTarget.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintInsets.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintItem.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMaker.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerEditable.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintPriority.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintRelation.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintView+Extensions.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintView.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintViewDSL.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Debugging.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/LayoutConstraint.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/LayoutConstraintItem.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Typealiases.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/LICENSE-examples [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Delegate/SRDelegateController.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Delegate/SRDelegateController.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumer.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumer.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumerPool.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumerPool.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/NSRunLoop+SRWebSocketPrivate.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/NSURLRequest+SRWebSocketPrivate.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Proxy/SRProxyConnect.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Proxy/SRProxyConnect.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/RunLoop/SRRunLoopThread.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/RunLoop/SRRunLoopThread.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/SRConstants.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/SRConstants.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Security/SRPinningSecurityPolicy.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Security/SRPinningSecurityPolicy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRError.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRError.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHTTPConnectMessage.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHTTPConnectMessage.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHash.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHash.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRLog.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRLog.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRMutex.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRMutex.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRRandom.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRRandom.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRSIMDHelpers.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRSIMDHelpers.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRURLUtilities.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRURLUtilities.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSRunLoop+SRWebSocket.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSRunLoop+SRWebSocket.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSURLRequest+SRWebSocket.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSURLRequest+SRWebSocket.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRSecurityPolicy.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRSecurityPolicy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRWebSocket.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRWebSocket.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SocketRocket.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-acknowledgements.markdown [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-acknowledgements.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh [new file with mode: 0755]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/ResourceBundle-Toast-Swift-Toast-Swift-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-Info.plist [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-dummy.m [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-prefix.pch [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-umbrella.h [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.debug.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.modulemap [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.release.xcconfig [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/LICENSE [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/README.md [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/Toast/Resources/PrivacyInfo.xcprivacy [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/Toast/Toast.swift [new file with mode: 0644]
DeepChordsSdk_iOS/DeepChordsSdk/podfile [new file with mode: 0644]
DeepChordsSdk_iOS/document/豆包APP自定义协议.txt [new file with mode: 0644]

diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk.xcworkspace/contents.xcworkspacedata b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk.xcworkspace/contents.xcworkspacedata
new file mode 100644 (file)
index 0000000..5f1604d
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "group:Example/Example.xcodeproj">
+   </FileRef>
+   <FileRef
+      location = "group:Pods/Pods.xcodeproj">
+   </FileRef>
+</Workspace>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/project.pbxproj b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/project.pbxproj
new file mode 100644 (file)
index 0000000..2251754
--- /dev/null
@@ -0,0 +1,428 @@
+// !$*UTF8*$!
+{
+       archiveVersion = 1;
+       classes = {
+       };
+       objectVersion = 77;
+       objects = {
+
+/* Begin PBXBuildFile section */
+               3F3F136C2ED5A22E0038A1C8 /* StarburstSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F3F136B2ED5A22E0038A1C8 /* StarburstSdk.framework */; };
+               D73D7454A559775C8509DED8 /* Pods_DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7D18BA322C9EA11864268108 /* Pods_DeepChordsSdk.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+               17B96CE5C2D98C0ADD6178A2 /* Pods-DeepChordsSdk.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DeepChordsSdk.debug.xcconfig"; path = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.debug.xcconfig"; sourceTree = "<group>"; };
+               3F3F01C92ED44F730038A1C8 /* DeepChordsSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DeepChordsSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               3F3F136B2ED5A22E0038A1C8 /* StarburstSdk.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = StarburstSdk.framework; sourceTree = "<group>"; };
+               6EE04442B3D4D41107912962 /* Pods-DeepChordsSdk.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DeepChordsSdk.release.xcconfig"; path = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.release.xcconfig"; sourceTree = "<group>"; };
+               7D18BA322C9EA11864268108 /* Pods_DeepChordsSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DeepChordsSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+               3F3F01CB2ED44F730038A1C8 /* DeepChordsSdk */ = {
+                       isa = PBXFileSystemSynchronizedRootGroup;
+                       exceptions = (
+                       );
+                       path = DeepChordsSdk;
+                       sourceTree = "<group>";
+               };
+/* End PBXFileSystemSynchronizedRootGroup section */
+
+/* Begin PBXFrameworksBuildPhase section */
+               3F3F01C62ED44F730038A1C8 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               3F3F136C2ED5A22E0038A1C8 /* StarburstSdk.framework in Frameworks */,
+                               D73D7454A559775C8509DED8 /* Pods_DeepChordsSdk.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+               307CE89A03DD9FBA70338107 /* Pods */ = {
+                       isa = PBXGroup;
+                       children = (
+                               17B96CE5C2D98C0ADD6178A2 /* Pods-DeepChordsSdk.debug.xcconfig */,
+                               6EE04442B3D4D41107912962 /* Pods-DeepChordsSdk.release.xcconfig */,
+                       );
+                       name = Pods;
+                       path = ../Pods;
+                       sourceTree = "<group>";
+               };
+               3F3F01BF2ED44F730038A1C8 = {
+                       isa = PBXGroup;
+                       children = (
+                               3F3F136B2ED5A22E0038A1C8 /* StarburstSdk.framework */,
+                               3F3F01CB2ED44F730038A1C8 /* DeepChordsSdk */,
+                               3F3F01CA2ED44F730038A1C8 /* Products */,
+                               307CE89A03DD9FBA70338107 /* Pods */,
+                               4BB8E763A1CE0D92C14AFAA9 /* Frameworks */,
+                       );
+                       sourceTree = "<group>";
+               };
+               3F3F01CA2ED44F730038A1C8 /* Products */ = {
+                       isa = PBXGroup;
+                       children = (
+                               3F3F01C92ED44F730038A1C8 /* DeepChordsSdk.framework */,
+                       );
+                       name = Products;
+                       sourceTree = "<group>";
+               };
+               4BB8E763A1CE0D92C14AFAA9 /* Frameworks */ = {
+                       isa = PBXGroup;
+                       children = (
+                               7D18BA322C9EA11864268108 /* Pods_DeepChordsSdk.framework */,
+                       );
+                       name = Frameworks;
+                       sourceTree = "<group>";
+               };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+               3F3F01C42ED44F730038A1C8 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+               3F3F01C82ED44F730038A1C8 /* DeepChordsSdk */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 3F3F01D02ED44F730038A1C8 /* Build configuration list for PBXNativeTarget "DeepChordsSdk" */;
+                       buildPhases = (
+                               462F2EA8BC431272853A0953 /* [CP] Check Pods Manifest.lock */,
+                               3F3F01C42ED44F730038A1C8 /* Headers */,
+                               3F3F01C52ED44F730038A1C8 /* Sources */,
+                               3F3F01C62ED44F730038A1C8 /* Frameworks */,
+                               3F3F01C72ED44F730038A1C8 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       fileSystemSynchronizedGroups = (
+                               3F3F01CB2ED44F730038A1C8 /* DeepChordsSdk */,
+                       );
+                       name = DeepChordsSdk;
+                       productName = DeepChordsSdk;
+                       productReference = 3F3F01C92ED44F730038A1C8 /* DeepChordsSdk.framework */;
+                       productType = "com.apple.product-type.framework";
+               };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+               3F3F01C02ED44F730038A1C8 /* Project object */ = {
+                       isa = PBXProject;
+                       attributes = {
+                               BuildIndependentTargetsInParallel = 1;
+                               LastSwiftUpdateCheck = 1640;
+                               LastUpgradeCheck = 1640;
+                               TargetAttributes = {
+                                       3F3F01C82ED44F730038A1C8 = {
+                                               CreatedOnToolsVersion = 16.4;
+                                       };
+                               };
+                       };
+                       buildConfigurationList = 3F3F01C32ED44F730038A1C8 /* Build configuration list for PBXProject "DeepChordsSdk" */;
+                       developmentRegion = en;
+                       hasScannedForEncodings = 0;
+                       knownRegions = (
+                               en,
+                               Base,
+                       );
+                       mainGroup = 3F3F01BF2ED44F730038A1C8;
+                       minimizedProjectReferenceProxies = 1;
+                       preferredProjectObjectVersion = 77;
+                       productRefGroup = 3F3F01BF2ED44F730038A1C8;
+                       projectDirPath = "";
+                       projectRoot = "";
+                       targets = (
+                               3F3F01C82ED44F730038A1C8 /* DeepChordsSdk */,
+                       );
+               };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+               3F3F01C72ED44F730038A1C8 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+               462F2EA8BC431272853A0953 /* [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-DeepChordsSdk-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 */
+               3F3F01C52ED44F730038A1C8 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+               3F3F01CE2ED44F730038A1C8 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+                               CLANG_ANALYZER_NONNULL = YES;
+                               CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+                               CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+                               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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+                               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;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DEBUG_INFORMATION_FORMAT = dwarf;
+                               ENABLE_STRICT_OBJC_MSGSEND = YES;
+                               ENABLE_TESTABILITY = YES;
+                               ENABLE_USER_SCRIPT_SANDBOXING = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu17;
+                               GCC_DYNAMIC_NO_PIC = NO;
+                               GCC_NO_COMMON_BLOCKS = YES;
+                               GCC_OPTIMIZATION_LEVEL = 0;
+                               GCC_PREPROCESSOR_DEFINITIONS = (
+                                       "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 = 18.5;
+                               LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+                               MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+                               MTL_FAST_MATH = YES;
+                               ONLY_ACTIVE_ARCH = YES;
+                               SDKROOT = iphoneos;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+                               SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               3F3F01CF2ED44F730038A1C8 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+                               CLANG_ANALYZER_NONNULL = YES;
+                               CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+                               CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+                               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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+                               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;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               ENABLE_NS_ASSERTIONS = NO;
+                               ENABLE_STRICT_OBJC_MSGSEND = YES;
+                               ENABLE_USER_SCRIPT_SANDBOXING = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu17;
+                               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 = 18.5;
+                               LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+                               MTL_ENABLE_DEBUG_INFO = NO;
+                               MTL_FAST_MATH = YES;
+                               SDKROOT = iphoneos;
+                               SWIFT_COMPILATION_MODE = wholemodule;
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               3F3F01D12ED44F730038A1C8 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 17B96CE5C2D98C0ADD6178A2 /* Pods-DeepChordsSdk.debug.xcconfig */;
+                       buildSettings = {
+                               BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+                               CODE_SIGN_STYLE = Automatic;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DYLIB_COMPATIBILITY_VERSION = 1;
+                               DYLIB_CURRENT_VERSION = 1;
+                               DYLIB_INSTALL_NAME_BASE = "@rpath";
+                               ENABLE_MODULE_VERIFIER = YES;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(PROJECT_DIR)/DeepChordsSdk",
+                                       "$(PROJECT_DIR)",
+                               );
+                               GENERATE_INFOPLIST_FILE = YES;
+                               INFOPLIST_KEY_NSHumanReadableCopyright = "";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               LINK_WITH_STANDARD_LIBRARIES = NO;
+                               MACH_O_TYPE = staticlib;
+                               MARKETING_VERSION = 1.0;
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+                               PRODUCT_BUNDLE_IDENTIFIER = demo.DeepChordsSdk;
+                               PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+                               SKIP_INSTALL = YES;
+                               SWIFT_EMIT_LOC_STRINGS = YES;
+                               SWIFT_INSTALL_MODULE = YES;
+                               SWIFT_INSTALL_OBJC_HEADER = NO;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                       };
+                       name = Debug;
+               };
+               3F3F01D22ED44F730038A1C8 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 6EE04442B3D4D41107912962 /* Pods-DeepChordsSdk.release.xcconfig */;
+                       buildSettings = {
+                               BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+                               CODE_SIGN_STYLE = Automatic;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DYLIB_COMPATIBILITY_VERSION = 1;
+                               DYLIB_CURRENT_VERSION = 1;
+                               DYLIB_INSTALL_NAME_BASE = "@rpath";
+                               ENABLE_MODULE_VERIFIER = YES;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(PROJECT_DIR)/DeepChordsSdk",
+                                       "$(PROJECT_DIR)",
+                               );
+                               GENERATE_INFOPLIST_FILE = YES;
+                               INFOPLIST_KEY_NSHumanReadableCopyright = "";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               LINK_WITH_STANDARD_LIBRARIES = NO;
+                               MACH_O_TYPE = staticlib;
+                               MARKETING_VERSION = 1.0;
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+                               PRODUCT_BUNDLE_IDENTIFIER = demo.DeepChordsSdk;
+                               PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+                               SKIP_INSTALL = YES;
+                               SWIFT_EMIT_LOC_STRINGS = YES;
+                               SWIFT_INSTALL_MODULE = YES;
+                               SWIFT_INSTALL_OBJC_HEADER = NO;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                       };
+                       name = Release;
+               };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+               3F3F01C32ED44F730038A1C8 /* Build configuration list for PBXProject "DeepChordsSdk" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               3F3F01CE2ED44F730038A1C8 /* Debug */,
+                               3F3F01CF2ED44F730038A1C8 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               3F3F01D02ED44F730038A1C8 /* Build configuration list for PBXNativeTarget "DeepChordsSdk" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               3F3F01D12ED44F730038A1C8 /* Debug */,
+                               3F3F01D22ED44F730038A1C8 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+/* End XCConfigurationList section */
+       };
+       rootObject = 3F3F01C02ED44F730038A1C8 /* Project object */;
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644 (file)
index 0000000..919434a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/xcshareddata/xcschemes/DeepChordsSdk.xcscheme b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.xcodeproj/xcshareddata/xcschemes/DeepChordsSdk.xcscheme
new file mode 100644 (file)
index 0000000..1b2a161
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1640"
+   version = "1.7">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES"
+      buildArchitectures = "Automatic">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "3F3F01C82ED44F730038A1C8"
+               BuildableName = "DeepChordsSdk.framework"
+               BlueprintName = "DeepChordsSdk"
+               ReferencedContainer = "container:DeepChordsSdk.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      shouldAutocreateTestPlan = "YES">
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "3F3F01C82ED44F730038A1C8"
+            BuildableName = "DeepChordsSdk.framework"
+            BlueprintName = "DeepChordsSdk"
+            ReferencedContainer = "container:DeepChordsSdk.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Any.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Any.swift
new file mode 100644 (file)
index 0000000..9ecfd13
--- /dev/null
@@ -0,0 +1,194 @@
+//
+//  Untitled.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+
+/// 判断可选类型是否为 nil
+func isNil(_ any: Any?) -> Bool {
+    switch any {
+    case .none: return true
+    case .some: return false
+    }
+}
+
+/// 判断可选类型是否有值
+func isValue(_ any: Any?) -> Bool {
+    return isNil(any) == false
+}
+
+/// for Array
+func isEmpty(_ value: [Any]?) -> Bool {
+    return isNil(value) || value!.count == 0
+}
+
+/// for Array
+func isNotEmpty(_ value: [Any]?) -> Bool {
+    return isEmpty(value) == false
+}
+
+/// for Dictionary
+func isEmpty(_ value: [AnyHashable: Any]?) -> Bool {
+    return isNil(value) || value!.count == 0
+}
+
+/// for Dictionary
+func isNotEmpty(_ value: [AnyHashable: Any]?) -> Bool {
+    return isEmpty(value) == false
+}
+
+/// for String
+func isEmpty(_ value: String?) -> Bool {
+    return isNil(value) || value!.count == 0
+}
+
+/// for String
+func isNotEmpty(_ value: String?) -> Bool {
+    return isEmpty(value) == false
+}
+
+public extension String {
+    
+    /// 补足8位(长度为8的整数倍)
+    var binary: String {
+        let bytes = (Double(count) / 8.0).upInt
+        let offset = bytes * 8 - count
+        let prefix = Array(repeating: "0", count: offset).joined()
+        return prefix + self
+    }
+}
+
+public extension Double {
+    var upInt: Int { Int(ceil(self)) }
+}
+
+public extension Int {
+    private static let binaryPack = 0b11111111
+    
+    /// convert to data with byte (max is 4294967295)
+    ///
+    /// 低位 --> 高位
+    var bytes: [UInt8] {
+        var mutatingSelf = self
+        var bytes = [UInt8(mutatingSelf & Self.binaryPack)]
+        
+        var count = 1
+        mutatingSelf = mutatingSelf >> (count * 8)
+        while mutatingSelf > 0 {
+            bytes.append(UInt8(mutatingSelf & Self.binaryPack))
+            mutatingSelf = mutatingSelf >> (count * 8)
+            count = count + 1
+        }
+        return bytes
+    }
+    
+    /// convert to data with 1 byte
+    var byte: UInt8 {
+        UInt8(self & Self.binaryPack)
+    }
+    
+    /// convert to data with 2 byte
+    ///
+    /// 低位 --> 高位
+    var byte2: [UInt8] {
+        [
+            UInt8(self & Self.binaryPack),
+            UInt8(self >> 8 & Self.binaryPack)
+        ]
+    }
+    
+    /// convert to data with 3 byte
+    ///
+    /// 低位 --> 高位
+    var byte3: [UInt8] {
+        [
+            UInt8(self & Self.binaryPack),
+            UInt8(self >> 8 & Self.binaryPack),
+            UInt8(self >> 16 & Self.binaryPack)
+        ]
+    }
+    
+    /// convert to data with 4 byte
+    ///
+    /// 低位 --> 高位
+    var byte4: [UInt8] {
+        [
+            UInt8(self & Self.binaryPack),
+            UInt8(self >> 8 & Self.binaryPack),
+            UInt8(self >> 16 & Self.binaryPack),
+            UInt8(self >> 24 & Self.binaryPack)
+        ]
+    }
+}
+
+public extension BinaryInteger {
+    
+    /// e.g. 0000100110010101
+    var binaryString: String {
+        .init(self, radix: 2).binary
+    }
+}
+
+public extension Array where Element == UInt8 {
+    
+    var int: Int {
+        self
+            .map { Int($0) }
+            .enumerated()
+            .map { $1 << ($0 * 8) }
+            .reduce(0, { partialResult, value in
+                partialResult | value
+            })
+    }
+    
+    var data: Data { Data(self) }
+}
+
+public extension Data {
+    
+    func joined(format: String = "%02x", _ separator: String = "") -> String {
+        self
+            .map { String(format: format, $0) }
+            .joined(separator: separator)
+    }
+    
+    func reversedJoined(format: String = "%02x", _ separator: String = "") -> String {
+        self
+            .map { String(format: format, $0) }
+            .reversed()
+            .joined(separator: separator)
+    }
+    
+    var int: Int {
+        self
+            .map { Int($0) }
+            .enumerated()
+            .map { $1 << ($0 * 8) }
+            .reduce(0, { partialResult, value in
+                partialResult | value
+            })
+    }
+    
+}
+
+public extension UInt8 {
+    var int: Int { Int(self) }
+}
+
+
+extension Data{
+    var float: Float {
+        var floatValue: Float = 0.0
+        let size = MemoryLayout<Float>.size
+        guard self.count >= size else { return 0 }
+        
+        self.withUnsafeBytes { (buffer: UnsafeRawBufferPointer) -> Void in
+            _ = memcpy(&floatValue, buffer.baseAddress!, size)
+        }
+        
+        return floatValue
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/BleSender.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/BleSender.swift
new file mode 100644 (file)
index 0000000..d39a40d
--- /dev/null
@@ -0,0 +1,125 @@
+//
+//  BleSender.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+
+class BleSender{
+    var completion: DCCompletionHandler!
+    var data = Data()
+    
+    static var all: [BleSender] = []
+    
+    init() {
+        Self.all.append(self)
+        startTimer()
+    }
+    var timer: Timer?
+    func startTimer() {
+        deinitTimer()
+        
+        self.timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: false, block: { [unowned self] _ in
+            deinitTimer()
+            self.completion?(.response.code(.timeout))
+            self.remove()
+        })
+    }
+    
+    @discardableResult
+    func deinitTimer() ->Self{
+        guard let _ = self.timer else { return self}
+        self.timer?.invalidate()
+        self.timer = nil
+        //        Logger.log("销毁定时器")
+        return self
+    }
+    
+    /// 从缓存实例集合中移除该实例
+    func remove() {
+        Self.all.removeAll { $0 === self }
+    }
+    
+    func isAnswer(_ receiveData:Data)->Bool{
+        if data.count < 3{
+            return false
+        }
+        if receiveData[1] == data[1] {
+            return true
+        }
+        return false
+    }
+    
+    static func answer(_ data: Data) -> BleSender? {
+        if data.count < 3{
+            return nil
+        }
+        for item in Self.all {
+            if item.isAnswer(data) {
+                return item
+            }
+        }
+        return nil
+    }
+}
+
+public typealias DCCompletionHandler = (_ result: DCResponse) -> Void
+
+/// 状态码
+public enum DCCode: Int,CustomStringConvertible {
+    
+    public var description: String{
+        return "MSCode(rawValue:\(rawValue), message:\(message))"
+    }
+    
+    /// 操作成功
+    case success = 1000
+    /// 操作失败
+    case failure = 1001
+    /// 请求超时
+    case timeout = 1004
+    /// 未知错误
+    case unknow = 1005
+    
+    var message:String{
+        switch self {
+        case .failure:
+            return "失败"
+        case .success:
+            return "成功"
+        case .timeout:
+            return "超时"
+        default:
+            return "未知错误"
+        }
+    }
+}
+
+public class DCResponse {
+    public private(set) var code: DCCode = .success
+    public private(set) var data: Data = Data()
+    static var response: DCResponse { DCResponse() }
+    
+    
+    var isSuccess:Bool{
+        return code == .success
+    }
+    
+    public var description: String{
+        return code.description + "data = " +  data.joined()
+    }
+    
+    @discardableResult
+    func code(_ value: DCCode) -> Self {
+        code = value
+        return self
+    }
+    
+    @discardableResult
+    func value(_ value: Data) -> Self {
+        self.data = value
+        return self
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DCBleManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DCBleManager.swift
new file mode 100644 (file)
index 0000000..c999b27
--- /dev/null
@@ -0,0 +1,78 @@
+//
+//  Untitled.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+import CoreBluetooth
+
+public class DCBleManager{
+    
+    public static let shared = DCBleManager()
+    private var connectPeripheral: CBPeripheral?
+    private var writeCha: CBCharacteristic?
+
+    func send(_ sender:BleSender){
+        if let connectPeripheral = connectPeripheral, let writeCha = writeCha {
+            Logger.debug("发送数据 = ",writeCha.uuid.uuidString,sender.data.joined())
+            connectPeripheral.writeValue(sender.data, for: writeCha, type:.withoutResponse)
+        }
+    }
+    func sendToStarburst(_ data:Data){
+        if let connectPeripheral = connectPeripheral, let writeCha = writeCha {
+            Logger.debug("发送数据 = ",writeCha.uuid.uuidString,data.joined())
+            connectPeripheral.writeValue(data, for: writeCha, type:.withoutResponse)
+        }
+    }
+}
+
+public extension DCBleManager{
+    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
+        Logger.debug("蓝牙已连接 \(peripheral)")
+        connectPeripheral = peripheral
+    }
+    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
+        Logger.debug("peripheral: %@ failed to connect", peripheral)
+    }
+    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
+        Logger.debug("蓝牙已断开 \(peripheral)")
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
+        Logger.debug("发现服务成功")
+        for service in peripheral.services! {
+            Logger.debug("peripheral service: %@", service)
+            peripheral.discoverCharacteristics(nil, for: service)
+        }
+
+    }
+    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
+        if let list = service.characteristics{
+            Logger.debug("发现特征",list)
+            for char in  list{
+                Logger.debug(char)
+                peripheral.setNotifyValue(true, for: char)
+                if char.uuid.uuidString == "AE03" {
+                    writeCha = char
+                }
+            }
+        }
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
+        Logger.debug("收到数据 ===UUID",characteristic.uuid,characteristic.value?.joined() ?? "")
+        guard let data = characteristic.value else { return  }
+        
+        if let sender = BleSender.answer(data) {
+            sender.completion?(.response.code(.success).value(data))
+            sender.deinitTimer()
+            sender.remove()
+            return
+        }
+        else{
+            Logger.debug("通知数据 ")
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DCDevice.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DCDevice.swift
new file mode 100644 (file)
index 0000000..7b32f46
--- /dev/null
@@ -0,0 +1,73 @@
+//
+//  DCDevice.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+
+public class DCDevice{
+    public static let shared = DCDevice()
+
+    public func getBatery(finished:@escaping ((Int,Int)?)->Void){
+        var data = Data.dataWithHexString("BA090000")
+        data.addCrc()
+
+        let sender = BleSender()
+        sender.data = data
+        sender.completion = { result in
+            Logger.debug("\(result.description)")
+            if result.isSuccess{
+                let leftValue = result.data[3].int
+                let rightValue = result.data[5].int
+                Logger.debug(leftValue,rightValue)
+                finished((leftValue,rightValue))
+            }
+            else{
+                finished(nil)
+            }
+        }
+        DCBleManager.shared.send(sender)
+    }
+    public func getSoftVersion(finished:@escaping (String?)->Void){
+        var data = Data.dataWithHexString("BA0A0001")
+        data.addCrc()
+        
+        let sender = BleSender()
+        sender.data = data
+        sender.completion = { result in
+            Logger.debug("\(result.description)")
+            if result.isSuccess{
+                let data = result.data[2...6]
+                let text = String(data: data, encoding:.utf8)
+                Logger.debug(text)
+                finished((text))
+            }
+            else{
+                finished(nil)
+            }
+        }
+        DCBleManager.shared.send(sender)
+    }
+    public func getHardVersion(finished:@escaping (String?)->Void){
+        var data = Data.dataWithHexString("BA0A0101")
+        data.addCrc()
+        
+        let sender = BleSender()
+        sender.data = data
+        sender.completion = { result in
+            Logger.debug("\(result.description)")
+            if result.isSuccess{
+                let data = result.data[2...6]
+                let text = String(data: data, encoding:.utf8)
+                Logger.debug(text)
+                finished((text))
+            }
+            else{
+                finished(nil)
+            }
+        }
+        DCBleManager.shared.send(sender)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Data.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Data.swift
new file mode 100644 (file)
index 0000000..4ae786e
--- /dev/null
@@ -0,0 +1,88 @@
+//
+//  Data.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+import Foundation
+
+extension Data {
+
+    
+    static func dataWithHexString(_ hexStr: String) -> Data {
+        let hexStrWithoutSpaces = hexStr.replacingOccurrences(of: " ", with: "")
+        let lowercasedHexStr = hexStrWithoutSpaces.lowercased()
+        let len = lowercasedHexStr.count
+        if len == 0 {
+            return Data()
+        }
+        
+        let utf16Chars = lowercasedHexStr.utf16
+        
+        var result = Data()
+        var bytes: UInt8
+        var str = [CChar](repeating: 0, count: 3)
+        for i in 0..<len / 2 {
+            str[0] = CChar(utf16Chars[utf16Chars.index(utf16Chars.startIndex, offsetBy: 2 * i)])
+            str[1] = CChar(utf16Chars[utf16Chars.index(utf16Chars.startIndex, offsetBy: 2 * i + 1)])
+            bytes = UInt8(strtoul(str, nil, 16))
+            result.append(&bytes, count: 1)
+        }
+        return result
+    }
+    
+    static func crc8(_ data: Data) -> UInt8 {
+        var crc: UInt8 = 0
+        for byte in data {
+            crc ^= byte
+            for _ in 0..<8 {
+                if crc & 0x01 != 0 {
+                    crc = (crc >> 1) ^ 0x8C
+                } else {
+                    crc >>= 1
+                }
+            }
+        }
+        return crc
+    }
+    
+    mutating func addCrc(){
+        var crc = Data.crc8(self)
+        self.append(&crc, count: 1)
+    }
+    
+//    mutating func addCrc(){
+//       var  list = self.map({ $0 })
+//       var crc = chargestore_crc8(list, len: list.count)
+//        self.append(&crc, count: 1)
+//    }
+}
+
+
+func chargestore_crc8(_ ptr: UnsafePointer<UInt8>, len: Int) -> UInt8 {
+    var crc: UInt8 = 0
+    var length = len
+    var currentPtr = ptr
+    
+    while length > 0 {
+        crc ^= currentPtr.pointee
+        currentPtr = currentPtr.advanced(by: 1)
+        length -= 1
+        
+        for _ in 0..<8 {
+            if crc & 0x01 != 0 {
+                crc = (crc >> 1) ^ 0x8C
+            } else {
+                crc >>= 1
+            }
+        }
+    }
+    return crc
+}
+
+//// 调用示例
+//let data: [UInt8] = [0x01, 0x02, 0x03]
+//let crcResult = data.withUnsafeBufferPointer { buffer in
+//    chargestore_crc8(buffer.baseAddress!, len: buffer.count)
+//}
+//print("CRC8 结果: \(crcResult)")
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Date.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Date.swift
new file mode 100644 (file)
index 0000000..3fd88f0
--- /dev/null
@@ -0,0 +1,152 @@
+//
+//  Date.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+
+import Foundation
+
+// MARK: - Extension Date
+extension Date {
+    
+    static let formatter = DateFormatter()
+    
+    struct Format {
+        
+        let rawValue: String
+        init(_ rawValue: String) {
+            self.rawValue = rawValue
+        }
+        
+        /// e.g. 01:01:01
+        static let time: Format = .init("HH:mm:ss")
+        
+        /// e.g. 01:01
+        static let shortTime: Format = .init("HH:mm")
+        
+        /// e.g. 01-01
+        static let date: Format = .init("MM-dd")
+        
+        /// e.g. 01月01日
+        static let date1: Format = .init("MM月dd日")
+        
+        /// e.g. 2020-01-01
+        static let short: Format = .init("yyyy-MM-dd")
+        
+        
+        /// e.g. 2020年01月01日
+        static let short1: Format = .init("yyy年MM月dd日")
+        
+        /// e.g. 2020-01-01 01:01
+        static let middle: Format = .init("yyyy-MM-dd HH:mm")
+        
+        /// e.g. 2020年01月01日 01:01
+        static let middle1: Format = .init("yyy年MM月dd日 HH:mm")
+        
+        /// e.g. 2020-01-01 01:01:01
+        static let long: Format = .init("yyyy-MM-dd HH:mm:ss")
+        
+        /// e.g. 2020年01月01日 01:01:01
+        static let long1: Format = .init("yyyy年MM月dd日 HH:mm:ss")
+        
+        /// e.g. 2020-01-01 01:01:01.088
+        static let full: Format = .init("yyyy-MM-dd HH:mm:ss.SSS")
+        
+        /// e.g. 2020年01月01日 01:01:01.088
+        static let full1: Format = .init("yyyy年MM月dd日 HH:mm:ss.SSS")
+        static let full2: Format = .init("yyyy-MM-ddTHH:mm")
+        static let full3: Format = .init("yyyy-MM-dd HH:mm")
+        static let full4: Format = .init("yyyyMMdd00000000")
+        static let full5: Format = .init("yyyyMMddHHmmss")
+        static let full6: Format = .init("yyyyMMddHHmmssSSS")
+    }
+    
+    /// 格式化成本地时间
+    func format(_ format: Date.Format = .middle) -> String {
+        Self.formatter.dateFormat = format.rawValue
+        return Self.formatter.string(from: self)
+    }
+    
+    enum Unit {
+        case minute(Int)
+        case hour(Int)
+        case day(Int)
+        
+        /// 转换成秒
+        var second: TimeInterval {
+            switch self {
+            case .minute(let minute): return 60.0 * Double(minute)
+            case .hour(let hour): return 60.0 * 60.0 * Double(hour)
+            case .day(let day): return 60.0 * 60.0 * 24.0 * Double(day)
+            }
+        }
+    }
+}
+
+let today: Date = .init()
+
+/// 本地化
+extension Date {
+    /// 星期几
+    enum Week: Int {
+        /// 星期日
+        case sun = 1
+        /// 星期一
+        case mon
+        /// 星期二
+        case tue
+        /// 星期三
+        case wed
+        /// 星期四
+        case thur
+        /// 星期五
+        case fri
+        /// 星期六
+        case sat
+    }
+    
+    //    /// 当天的第一秒
+    //    var fromTimeInterval: TimeInterval {
+    //        let today = format(.short)
+    //        return today.timeIntervalSince1970(.short)
+    //    }
+    //
+    //    /// 当天最后一秒
+    //    var toTimeInterval: TimeInterval { fromTimeInterval + Unit.day(1).second }
+    
+    /// 哪一年
+    var year: Int { component(.year) }
+    
+    /// 哪个月
+    var month: Int { component(.month) }
+    
+    /// 当月的第几天
+    var day: Int { component(.day) }
+    
+    /// 当月的第几天
+    var hour: Int { component(.hour)}
+    
+    /// 当月的第几天
+    var minute: Int { component(.minute)}
+    
+    /// 当月的第几天
+    var second: Int { component(.second)}
+    
+    /// 当月的第几周
+    var  weekOfMonth: Int { component(.weekOfMonth) }
+    
+    /// 今年的第几周
+    var  weekOfYear: Int { component(.weekOfYear) }
+    
+    /// 星期几
+    var weekDay: Week { Week(rawValue: component(.weekday))! }
+    
+    /// 假设当天是周五,表示本月的第几个周五
+    var weekdayOrdinal: Int { component(.weekdayOrdinal) }
+    
+    private func component(_ component: Calendar.Component) -> Int {
+        return Calendar.autoupdatingCurrent.component(component, from: self)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DeepChordsAiSdk.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DeepChordsAiSdk.swift
new file mode 100644 (file)
index 0000000..0586f1c
--- /dev/null
@@ -0,0 +1,68 @@
+//
+//  DeepChords.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+import Foundation
+import StarburstSdk
+public class DeepChordsAiSdk{
+    public static let shared = DeepChordsAiSdk()
+    
+    
+    
+    public func initSDK(){
+//        StarburstConfig.shared().switch(to: .ble)
+//        StarburstConfig.shared().appId =  "app_ro4n4nwljr20kwqo"
+//        //MARK: 配置缓存路径
+//        StarburstConfig.shared().sdkFolder = NSTemporaryDirectory()
+//        StarburstConfig.shared().isDebug = true
+//        StarburstConfig.shared().enableTextSyncToDevice = true
+//        StarburstConfig.shared().enableEmotionSyncToDevice = true
+//        StarburstConfig.shared().enableEarbudsSwitchSync = true
+        
+        //切换sdk
+        StarburstConfig.shared().switch(to: .ble)
+        //设置appid
+        StarburstConfig.shared().appId = "app_ro4n4nwljr20kwqo"
+        //debug模式会打印日志
+        StarburstConfig.shared().isDebug = true
+        // sdk缓存路径
+        StarburstConfig.shared().sdkFolder = NSHomeDirectory() + "/Documents/AiSdk"
+        // 日志路径
+        StarburstConfig.shared().logPath = logPath()
+        //        //是否下发文字到耳机仓
+        //        StarburstConfig.shared().enableTextSyncToDevice = true;
+        //        //主从耳机切换是否同步sdk信息到耳机
+        //        StarburstConfig.shared().enableEarbudsSwitchSync = true;
+        //        //耳机仓表情下发开关
+        //        StarburstConfig.shared().enableEmotionSyncToDevice = true;
+        //添加调试信息
+        StarburstConfig.shared().debugInfo = [
+            "x-use-ppe":"1",
+            "x-tt-env": "ppe_tischarge_test",
+        ]
+        // voicechat配置
+        StarburstConfig.shared().user_custom_prompt_init = "1.用户位置在上海市杨浦区。2.用户名称叫小明。"
+        
+        StarburstSdk.shared().authCallback = {[weak self] (code,msg) in
+            
+        }
+        //sdk发给蓝牙设备
+        StarburstSdk.shared().sendToBleCallback = {data in
+            guard let data = data else {return}
+            DCBleManager.shared.sendToStarburst(data)
+        }
+        StarburstSdk.shared().bleRecordStateCallback = {[weak self] state in
+            
+        }
+    }
+    
+    func logPath()->String{
+        let format = DateFormatter()
+        format.dateFormat = "yyyyMMddHHmmss"
+        let text = format.string(from: Date())
+        return NSHomeDirectory() + "/Documents/\(text).log"
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk.swift
new file mode 100644 (file)
index 0000000..7c4aefc
--- /dev/null
@@ -0,0 +1,9 @@
+//
+//  DeepChordsSdk.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import Foundation
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Demo.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/Demo.swift
new file mode 100644 (file)
index 0000000..68abb80
--- /dev/null
@@ -0,0 +1,14 @@
+//
+//  Demo.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import UIKit
+
+public class DeepChordsSdkDemo{
+    static public func log(){
+        print("1111")
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/LogManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/LogManager.swift
new file mode 100644 (file)
index 0000000..2a6c991
--- /dev/null
@@ -0,0 +1,64 @@
+//
+//  LogManager.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import Foundation
+
+/// 日记管理
+public class Logger {
+    static var isDebug: Bool = true
+    
+    fileprivate static let shared = Logger()
+    private var fileHandle:FileHandle?
+    private init() {
+        let path = getPath()
+        fileHandle = FileHandle(forWritingAtPath: path)!
+        //fileHandle?.seekToEndOfFile()
+    }
+    
+    fileprivate var dateString: String { Date().format(.full) }
+    
+    public static var logs: [String] = []
+    
+    
+    private func getPath()->String{
+        let foldPath = NSHomeDirectory() + "/Documents/"
+        let fileManager = FileManager.default
+        if !fileManager.fileExists(atPath: foldPath) {
+            do {
+                try FileManager.default.createDirectory(atPath: foldPath, withIntermediateDirectories: true, attributes: nil)
+            } catch {
+                return ""
+            }
+        }
+        let path = foldPath + "Example_\(Date().format(.middle)).log"
+        if !FileManager.default.fileExists(atPath: path) {
+            FileManager.default.createFile(atPath: path, contents: nil, attributes: nil)
+            
+        }
+        return path
+    }
+}
+
+extension Logger {
+    public static func debug(_ logs: Any..., line: Int = #line, separator: String = " ", terminator: String = "\n") {
+        objc_sync_enter(Logger.shared)
+        if Logger.isDebug {
+            print(Logger.shared.dateString, terminator: " [DeepChordsSdk-\(String(format: "%03d", line))]: ")
+            print(logs, separator: separator, terminator: terminator)
+            let logString = Logger.shared.dateString + " [DeepChordsSdk-\(String(format: "%03d", line))]: " + logs.map({ "\($0)" }).joined(separator: separator) + terminator
+            Self.logs.append(logString)
+            Logger.shared.saveLog(log: logString)
+        }
+        objc_sync_exit(Logger.shared)
+        
+        
+    }
+    
+    private func saveLog(log:String){
+        fileHandle?.write(log.data(using: .utf8)!)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/ReceiveManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/DeepChordsSdk/DeepChordsSdk/ReceiveManager.swift
new file mode 100644 (file)
index 0000000..e482cd6
--- /dev/null
@@ -0,0 +1,15 @@
+//
+//  ReceiveManager.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+import Foundation
+
+class ReceiveManager{
+    
+    
+    static func receiveData(_ data:Data){
+        
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Any.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Any.swift
new file mode 100644 (file)
index 0000000..9ecfd13
--- /dev/null
@@ -0,0 +1,194 @@
+//
+//  Untitled.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+
+/// 判断可选类型是否为 nil
+func isNil(_ any: Any?) -> Bool {
+    switch any {
+    case .none: return true
+    case .some: return false
+    }
+}
+
+/// 判断可选类型是否有值
+func isValue(_ any: Any?) -> Bool {
+    return isNil(any) == false
+}
+
+/// for Array
+func isEmpty(_ value: [Any]?) -> Bool {
+    return isNil(value) || value!.count == 0
+}
+
+/// for Array
+func isNotEmpty(_ value: [Any]?) -> Bool {
+    return isEmpty(value) == false
+}
+
+/// for Dictionary
+func isEmpty(_ value: [AnyHashable: Any]?) -> Bool {
+    return isNil(value) || value!.count == 0
+}
+
+/// for Dictionary
+func isNotEmpty(_ value: [AnyHashable: Any]?) -> Bool {
+    return isEmpty(value) == false
+}
+
+/// for String
+func isEmpty(_ value: String?) -> Bool {
+    return isNil(value) || value!.count == 0
+}
+
+/// for String
+func isNotEmpty(_ value: String?) -> Bool {
+    return isEmpty(value) == false
+}
+
+public extension String {
+    
+    /// 补足8位(长度为8的整数倍)
+    var binary: String {
+        let bytes = (Double(count) / 8.0).upInt
+        let offset = bytes * 8 - count
+        let prefix = Array(repeating: "0", count: offset).joined()
+        return prefix + self
+    }
+}
+
+public extension Double {
+    var upInt: Int { Int(ceil(self)) }
+}
+
+public extension Int {
+    private static let binaryPack = 0b11111111
+    
+    /// convert to data with byte (max is 4294967295)
+    ///
+    /// 低位 --> 高位
+    var bytes: [UInt8] {
+        var mutatingSelf = self
+        var bytes = [UInt8(mutatingSelf & Self.binaryPack)]
+        
+        var count = 1
+        mutatingSelf = mutatingSelf >> (count * 8)
+        while mutatingSelf > 0 {
+            bytes.append(UInt8(mutatingSelf & Self.binaryPack))
+            mutatingSelf = mutatingSelf >> (count * 8)
+            count = count + 1
+        }
+        return bytes
+    }
+    
+    /// convert to data with 1 byte
+    var byte: UInt8 {
+        UInt8(self & Self.binaryPack)
+    }
+    
+    /// convert to data with 2 byte
+    ///
+    /// 低位 --> 高位
+    var byte2: [UInt8] {
+        [
+            UInt8(self & Self.binaryPack),
+            UInt8(self >> 8 & Self.binaryPack)
+        ]
+    }
+    
+    /// convert to data with 3 byte
+    ///
+    /// 低位 --> 高位
+    var byte3: [UInt8] {
+        [
+            UInt8(self & Self.binaryPack),
+            UInt8(self >> 8 & Self.binaryPack),
+            UInt8(self >> 16 & Self.binaryPack)
+        ]
+    }
+    
+    /// convert to data with 4 byte
+    ///
+    /// 低位 --> 高位
+    var byte4: [UInt8] {
+        [
+            UInt8(self & Self.binaryPack),
+            UInt8(self >> 8 & Self.binaryPack),
+            UInt8(self >> 16 & Self.binaryPack),
+            UInt8(self >> 24 & Self.binaryPack)
+        ]
+    }
+}
+
+public extension BinaryInteger {
+    
+    /// e.g. 0000100110010101
+    var binaryString: String {
+        .init(self, radix: 2).binary
+    }
+}
+
+public extension Array where Element == UInt8 {
+    
+    var int: Int {
+        self
+            .map { Int($0) }
+            .enumerated()
+            .map { $1 << ($0 * 8) }
+            .reduce(0, { partialResult, value in
+                partialResult | value
+            })
+    }
+    
+    var data: Data { Data(self) }
+}
+
+public extension Data {
+    
+    func joined(format: String = "%02x", _ separator: String = "") -> String {
+        self
+            .map { String(format: format, $0) }
+            .joined(separator: separator)
+    }
+    
+    func reversedJoined(format: String = "%02x", _ separator: String = "") -> String {
+        self
+            .map { String(format: format, $0) }
+            .reversed()
+            .joined(separator: separator)
+    }
+    
+    var int: Int {
+        self
+            .map { Int($0) }
+            .enumerated()
+            .map { $1 << ($0 * 8) }
+            .reduce(0, { partialResult, value in
+                partialResult | value
+            })
+    }
+    
+}
+
+public extension UInt8 {
+    var int: Int { Int(self) }
+}
+
+
+extension Data{
+    var float: Float {
+        var floatValue: Float = 0.0
+        let size = MemoryLayout<Float>.size
+        guard self.count >= size else { return 0 }
+        
+        self.withUnsafeBytes { (buffer: UnsafeRawBufferPointer) -> Void in
+            _ = memcpy(&floatValue, buffer.baseAddress!, size)
+        }
+        
+        return floatValue
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/BleSender.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/BleSender.swift
new file mode 100644 (file)
index 0000000..39ae733
--- /dev/null
@@ -0,0 +1,125 @@
+//
+//  BleSender.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+
+class BleSender{
+    var completion: DCCompletionHandler!
+    var data = Data()
+    
+    static var all: [BleSender] = []
+    
+    init() {
+        Self.all.append(self)
+        startTimer()
+    }
+    var timer: Timer?
+    func startTimer() {
+        deinitTimer()
+        
+        self.timer = Timer.scheduledTimer(withTimeInterval: 3, repeats: false, block: { [unowned self] _ in
+            deinitTimer()
+            self.completion?(.response.code(.timeout))
+            self.remove()
+        })
+    }
+    
+    @discardableResult
+    func deinitTimer() ->Self{
+        guard let _ = self.timer else { return self}
+        self.timer?.invalidate()
+        self.timer = nil
+        //        DCLogger.log("销毁定时器")
+        return self
+    }
+    
+    /// 从缓存实例集合中移除该实例
+    func remove() {
+        Self.all.removeAll { $0 === self }
+    }
+    
+    func isAnswer(_ receiveData:Data)->Bool{
+        if data.count < 3{
+            return false
+        }
+        if receiveData[1] == data[1] {
+            return true
+        }
+        return false
+    }
+    
+    static func answer(_ data: Data) -> BleSender? {
+        if data.count < 3{
+            return nil
+        }
+        for item in Self.all {
+            if item.isAnswer(data) {
+                return item
+            }
+        }
+        return nil
+    }
+}
+
+public typealias DCCompletionHandler = (_ result: DCResponse) -> Void
+
+/// 状态码
+public enum DCCode: Int,CustomStringConvertible {
+    
+    public var description: String{
+        return "MSCode(rawValue:\(rawValue), message:\(message))"
+    }
+    
+    /// 操作成功
+    case success = 1000
+    /// 操作失败
+    case failure = 1001
+    /// 请求超时
+    case timeout = 1004
+    /// 未知错误
+    case unknow = 1005
+    
+    var message:String{
+        switch self {
+        case .failure:
+            return "失败"
+        case .success:
+            return "成功"
+        case .timeout:
+            return "超时"
+        default:
+            return "未知错误"
+        }
+    }
+}
+
+public class DCResponse {
+    public private(set) var code: DCCode = .success
+    public private(set) var data: Data = Data()
+    static var response: DCResponse { DCResponse() }
+    
+    
+    var isSuccess:Bool{
+        return code == .success
+    }
+    
+    public var description: String{
+        return code.description + "data = " +  data.joined()
+    }
+    
+    @discardableResult
+    func code(_ value: DCCode) -> Self {
+        code = value
+        return self
+    }
+    
+    @discardableResult
+    func value(_ value: Data) -> Self {
+        self.data = value
+        return self
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCBleManager.swift
new file mode 100644 (file)
index 0000000..4cd4c3d
--- /dev/null
@@ -0,0 +1,89 @@
+//
+//  Untitled.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+import CoreBluetooth
+import StarburstSdk
+
+public class DCBleManager{
+    
+    public static let shared = DCBleManager()
+    private var connectPeripheral: CBPeripheral?
+    private var writeCha: CBCharacteristic?
+
+    func send(_ sender:BleSender){
+        if let connectPeripheral = connectPeripheral, let writeCha = writeCha {
+            DCLogger.debug("发",writeCha.uuid.uuidString,sender.data.joined())
+            connectPeripheral.writeValue(sender.data, for: writeCha, type:.withoutResponse)
+        }
+    }
+    func sendToStarburst(_ data:Data){
+        var full = Data.dataWithHexString("BA0D")
+        full.append(data)
+        full.addCrc()
+        if let connectPeripheral = connectPeripheral, let writeCha = writeCha {
+            DCLogger.debug("发",writeCha.uuid.uuidString,full.joined())
+            connectPeripheral.writeValue(full, for: writeCha, type:.withoutResponse)
+        }
+    }
+}
+
+public extension DCBleManager{
+    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
+        DCLogger.debug("蓝牙已连接 \(peripheral)")
+        connectPeripheral = peripheral
+    }
+    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
+        DCLogger.debug("peripheral: %@ failed to connect", peripheral)
+    }
+    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
+        DCLogger.debug("蓝牙已断开 \(peripheral)")
+        StarburstSdk.shared().bleDisConnected()
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
+        DCLogger.debug("发现服务成功")
+        for service in peripheral.services! {
+            DCLogger.debug("peripheral service: %@", service)
+            peripheral.discoverCharacteristics(nil, for: service)
+        }
+
+    }
+    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
+        if let list = service.characteristics{
+            DCLogger.debug("发现特征",list)
+            for char in  list{
+                DCLogger.debug(char)
+                peripheral.setNotifyValue(true, for: char)
+                if char.uuid.uuidString == "AE03" {
+                    writeCha = char
+                    StarburstSdk.shared().bleConnected()
+                }
+            }
+        }
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
+        DCLogger.debug("收 ",characteristic.uuid,characteristic.value?.joined() ?? "")
+        guard let data = characteristic.value else { return  }
+        if data.count < 4 {
+            return
+        }
+        
+        if let sender = BleSender.answer(data) {
+            sender.completion?(.response.code(.success).value(data))
+            sender.deinitTimer()
+            sender.remove()
+            return
+        }
+        else if data[1] == 0x0D{
+            let subData = data.subdata(in: 2..<data.count - 2)
+//            DCLogger.debug("传给字节sdk",subData.joined())
+            StarburstSdk.shared().receiveBleData(subData)
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCDevice.swift
new file mode 100644 (file)
index 0000000..74bbf2d
--- /dev/null
@@ -0,0 +1,73 @@
+//
+//  DCDevice.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+
+import Foundation
+
+public class DCDevice{
+    public static let shared = DCDevice()
+
+    public func getBatery(finished:@escaping ((Int,Int)?)->Void){
+        var data = Data.dataWithHexString("BA0900")
+        data.addCrc()
+
+        let sender = BleSender()
+        sender.data = data
+        sender.completion = { result in
+            DCLogger.debug("\(result.description)")
+            if result.isSuccess{
+                let leftValue = result.data[3].int
+                let rightValue = result.data[5].int
+                DCLogger.debug(leftValue,rightValue)
+                finished((leftValue,rightValue))
+            }
+            else{
+                finished(nil)
+            }
+        }
+        DCBleManager.shared.send(sender)
+    }
+    public func getSoftVersion(finished:@escaping (String?)->Void){
+        var data = Data.dataWithHexString("BA0A00")
+        data.addCrc()
+        
+        let sender = BleSender()
+        sender.data = data
+        sender.completion = { result in
+            DCLogger.debug("\(result.description)")
+            if result.isSuccess{
+                let data = result.data[2...6]
+                let text = String(data: data, encoding:.utf8)
+                DCLogger.debug(text)
+                finished((text))
+            }
+            else{
+                finished(nil)
+            }
+        }
+        DCBleManager.shared.send(sender)
+    }
+    public func getHardVersion(finished:@escaping (String?)->Void){
+        var data = Data.dataWithHexString("BA0A01")
+        data.addCrc()
+        
+        let sender = BleSender()
+        sender.data = data
+        sender.completion = { result in
+            DCLogger.debug("\(result.description)")
+            if result.isSuccess{
+                let data = result.data[2...6]
+                let text = String(data: data, encoding:.utf8)
+                DCLogger.debug(text)
+                finished((text))
+            }
+            else{
+                finished(nil)
+            }
+        }
+        DCBleManager.shared.send(sender)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCLogger.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DCLogger.swift
new file mode 100644 (file)
index 0000000..c605936
--- /dev/null
@@ -0,0 +1,64 @@
+//
+//  LogManager.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import Foundation
+
+/// 日记管理
+public class DCLogger {
+    static var isDebug: Bool = true
+    
+    fileprivate static let shared = DCLogger()
+    private var fileHandle:FileHandle?
+    private init() {
+        let path = getPath()
+        fileHandle = FileHandle(forWritingAtPath: path)!
+        //fileHandle?.seekToEndOfFile()
+    }
+    
+    fileprivate var dateString: String { Date().format(.full) }
+    
+    public static var logs: [String] = []
+    
+    
+    private func getPath()->String{
+        let foldPath = NSHomeDirectory() + "/Documents/"
+        let fileManager = FileManager.default
+        if !fileManager.fileExists(atPath: foldPath) {
+            do {
+                try FileManager.default.createDirectory(atPath: foldPath, withIntermediateDirectories: true, attributes: nil)
+            } catch {
+                return ""
+            }
+        }
+        let path = foldPath + "Example_\(Date().format(.middle)).log"
+        if !FileManager.default.fileExists(atPath: path) {
+            FileManager.default.createFile(atPath: path, contents: nil, attributes: nil)
+            
+        }
+        return path
+    }
+}
+
+extension DCLogger {
+    public static func debug(_ logs: Any..., line: Int = #line, separator: String = " ", terminator: String = "\n") {
+        objc_sync_enter(DCLogger.shared)
+        if DCLogger.isDebug {
+            print(DCLogger.shared.dateString, terminator: " [DeepChordsSdk-\(String(format: "%03d", line))]: ")
+            print(logs, separator: separator, terminator: terminator)
+            let logString = DCLogger.shared.dateString + " [DeepChordsSdk-\(String(format: "%03d", line))]: " + logs.map({ "\($0)" }).joined(separator: separator) + terminator
+            Self.logs.append(logString)
+            DCLogger.shared.saveLog(log: logString)
+        }
+        objc_sync_exit(DCLogger.shared)
+        
+        
+    }
+    
+    private func saveLog(log:String){
+        fileHandle?.write(log.data(using: .utf8)!)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Data.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Data.swift
new file mode 100644 (file)
index 0000000..e3a160c
--- /dev/null
@@ -0,0 +1,88 @@
+//
+//  Data.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+import Foundation
+
+extension Data {
+    static func dataWithHexString(_ hexStr: String) -> Data {
+        let hexStrWithoutSpaces = hexStr.replacingOccurrences(of: " ", with: "")
+        let lowercasedHexStr = hexStrWithoutSpaces.lowercased()
+        let len = lowercasedHexStr.count
+        if len == 0 {
+            return Data()
+        }
+        
+        let utf16Chars = lowercasedHexStr.utf16
+        
+        var result = Data()
+        var bytes: UInt8
+        var str = [CChar](repeating: 0, count: 3)
+        for i in 0..<len / 2 {
+            str[0] = CChar(utf16Chars[utf16Chars.index(utf16Chars.startIndex, offsetBy: 2 * i)])
+            str[1] = CChar(utf16Chars[utf16Chars.index(utf16Chars.startIndex, offsetBy: 2 * i + 1)])
+            bytes = UInt8(strtoul(str, nil, 16))
+            result.append(&bytes, count: 1)
+        }
+        return result
+    }
+    
+    static func crc8(_ data: Data) -> UInt8 {
+        var crc: UInt8 = 0
+        for byte in data {
+            crc ^= byte
+            for _ in 0..<8 {
+                if crc & 0x01 != 0 {
+                    crc = (crc >> 1) ^ 0x8C
+                } else {
+                    crc >>= 1
+                }
+            }
+        }
+        return crc
+    }
+    
+    mutating func addCrc(){
+        var len = UInt8(self.count - 2)
+        self.append(&len, count: 1)
+        var crc = Data.crc8(self)
+        self.append(&crc, count: 1)
+    }
+    
+//    mutating func addCrc(){
+//       var  list = self.map({ $0 })
+//       var crc = chargestore_crc8(list, len: list.count)
+//        self.append(&crc, count: 1)
+//    }
+}
+
+
+func chargestore_crc8(_ ptr: UnsafePointer<UInt8>, len: Int) -> UInt8 {
+    var crc: UInt8 = 0
+    var length = len
+    var currentPtr = ptr
+    
+    while length > 0 {
+        crc ^= currentPtr.pointee
+        currentPtr = currentPtr.advanced(by: 1)
+        length -= 1
+        
+        for _ in 0..<8 {
+            if crc & 0x01 != 0 {
+                crc = (crc >> 1) ^ 0x8C
+            } else {
+                crc >>= 1
+            }
+        }
+    }
+    return crc
+}
+
+//// 调用示例
+//let data: [UInt8] = [0x01, 0x02, 0x03]
+//let crcResult = data.withUnsafeBufferPointer { buffer in
+//    chargestore_crc8(buffer.baseAddress!, len: buffer.count)
+//}
+//print("CRC8 结果: \(crcResult)")
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Date.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/Date.swift
new file mode 100644 (file)
index 0000000..3fd88f0
--- /dev/null
@@ -0,0 +1,152 @@
+//
+//  Date.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+
+import Foundation
+
+// MARK: - Extension Date
+extension Date {
+    
+    static let formatter = DateFormatter()
+    
+    struct Format {
+        
+        let rawValue: String
+        init(_ rawValue: String) {
+            self.rawValue = rawValue
+        }
+        
+        /// e.g. 01:01:01
+        static let time: Format = .init("HH:mm:ss")
+        
+        /// e.g. 01:01
+        static let shortTime: Format = .init("HH:mm")
+        
+        /// e.g. 01-01
+        static let date: Format = .init("MM-dd")
+        
+        /// e.g. 01月01日
+        static let date1: Format = .init("MM月dd日")
+        
+        /// e.g. 2020-01-01
+        static let short: Format = .init("yyyy-MM-dd")
+        
+        
+        /// e.g. 2020年01月01日
+        static let short1: Format = .init("yyy年MM月dd日")
+        
+        /// e.g. 2020-01-01 01:01
+        static let middle: Format = .init("yyyy-MM-dd HH:mm")
+        
+        /// e.g. 2020年01月01日 01:01
+        static let middle1: Format = .init("yyy年MM月dd日 HH:mm")
+        
+        /// e.g. 2020-01-01 01:01:01
+        static let long: Format = .init("yyyy-MM-dd HH:mm:ss")
+        
+        /// e.g. 2020年01月01日 01:01:01
+        static let long1: Format = .init("yyyy年MM月dd日 HH:mm:ss")
+        
+        /// e.g. 2020-01-01 01:01:01.088
+        static let full: Format = .init("yyyy-MM-dd HH:mm:ss.SSS")
+        
+        /// e.g. 2020年01月01日 01:01:01.088
+        static let full1: Format = .init("yyyy年MM月dd日 HH:mm:ss.SSS")
+        static let full2: Format = .init("yyyy-MM-ddTHH:mm")
+        static let full3: Format = .init("yyyy-MM-dd HH:mm")
+        static let full4: Format = .init("yyyyMMdd00000000")
+        static let full5: Format = .init("yyyyMMddHHmmss")
+        static let full6: Format = .init("yyyyMMddHHmmssSSS")
+    }
+    
+    /// 格式化成本地时间
+    func format(_ format: Date.Format = .middle) -> String {
+        Self.formatter.dateFormat = format.rawValue
+        return Self.formatter.string(from: self)
+    }
+    
+    enum Unit {
+        case minute(Int)
+        case hour(Int)
+        case day(Int)
+        
+        /// 转换成秒
+        var second: TimeInterval {
+            switch self {
+            case .minute(let minute): return 60.0 * Double(minute)
+            case .hour(let hour): return 60.0 * 60.0 * Double(hour)
+            case .day(let day): return 60.0 * 60.0 * 24.0 * Double(day)
+            }
+        }
+    }
+}
+
+let today: Date = .init()
+
+/// 本地化
+extension Date {
+    /// 星期几
+    enum Week: Int {
+        /// 星期日
+        case sun = 1
+        /// 星期一
+        case mon
+        /// 星期二
+        case tue
+        /// 星期三
+        case wed
+        /// 星期四
+        case thur
+        /// 星期五
+        case fri
+        /// 星期六
+        case sat
+    }
+    
+    //    /// 当天的第一秒
+    //    var fromTimeInterval: TimeInterval {
+    //        let today = format(.short)
+    //        return today.timeIntervalSince1970(.short)
+    //    }
+    //
+    //    /// 当天最后一秒
+    //    var toTimeInterval: TimeInterval { fromTimeInterval + Unit.day(1).second }
+    
+    /// 哪一年
+    var year: Int { component(.year) }
+    
+    /// 哪个月
+    var month: Int { component(.month) }
+    
+    /// 当月的第几天
+    var day: Int { component(.day) }
+    
+    /// 当月的第几天
+    var hour: Int { component(.hour)}
+    
+    /// 当月的第几天
+    var minute: Int { component(.minute)}
+    
+    /// 当月的第几天
+    var second: Int { component(.second)}
+    
+    /// 当月的第几周
+    var  weekOfMonth: Int { component(.weekOfMonth) }
+    
+    /// 今年的第几周
+    var  weekOfYear: Int { component(.weekOfYear) }
+    
+    /// 星期几
+    var weekDay: Week { Week(rawValue: component(.weekday))! }
+    
+    /// 假设当天是周五,表示本月的第几个周五
+    var weekdayOrdinal: Int { component(.weekdayOrdinal) }
+    
+    private func component(_ component: Calendar.Component) -> Int {
+        return Calendar.autoupdatingCurrent.component(component, from: self)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsAiSdk.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsAiSdk.swift
new file mode 100644 (file)
index 0000000..eb5c089
--- /dev/null
@@ -0,0 +1,70 @@
+//
+//  DeepChords.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+import Foundation
+import StarburstSdk
+public class DeepChordsAiSdk{
+    public static let shared = DeepChordsAiSdk()
+    public var authCallback: ((Int,String) -> Void)?
+    public var sdkLog:String{
+        return StarburstConfig.shared().logPath
+    }
+    
+    
+    public func initSDK(){
+        StarburstConfig.shared().switch(to: .ble)
+        StarburstConfig.shared().appId =  "app_ro4n4nwljr20kwqo"
+        //MARK: 配置缓存路径
+        StarburstConfig.shared().sdkFolder = NSTemporaryDirectory()
+        StarburstConfig.shared().isDebug = true
+        StarburstConfig.shared().enableTextSyncToDevice = true
+        StarburstConfig.shared().enableEmotionSyncToDevice = true
+        StarburstConfig.shared().enableEarbudsSwitchSync = true
+        
+        StarburstConfig.shared().switch(to: .ble)
+        StarburstConfig.shared().appId = "prjzVnOEpKL1N"
+
+
+        //debug模式会打印日志
+        StarburstConfig.shared().isDebug = true
+        // sdk缓存路径
+        StarburstConfig.shared().sdkFolder = NSHomeDirectory() + "/Documents/DeepChordsSdk"
+        // 日志路径
+        StarburstConfig.shared().logPath = logPath()
+        //        //是否下发文字到耳机仓
+        //        StarburstConfig.shared().enableTextSyncToDevice = true;
+        //        //主从耳机切换是否同步sdk信息到耳机
+        //        StarburstConfig.shared().enableEarbudsSwitchSync = true;
+        //        //耳机仓表情下发开关
+        //        StarburstConfig.shared().enableEmotionSyncToDevice = true;
+        //添加调试信息
+//        StarburstConfig.shared().debugInfo = [
+//            "x-use-ppe":"1",
+//            "x-tt-env": "ppe_tischarge_test",
+//        ]
+        // voicechat配置
+        StarburstConfig.shared().user_custom_prompt_init = "1.用户位置在上海市杨浦区。2.用户名称叫小明。"
+        
+        StarburstSdk.shared().authCallback = {[weak self] (code,msg) in
+            self?.authCallback?(Int(code),msg ?? "")
+        }
+        //sdk发给蓝牙设备
+        StarburstSdk.shared().sendToBleCallback = {data in
+            guard let data = data else {return}
+            DCBleManager.shared.sendToStarburst(data)
+        }
+        StarburstSdk.shared().bleRecordStateCallback = {[weak self] state in
+            
+        }
+    }
+    
+    func logPath()->String{
+        let format = DateFormatter()
+        format.dateFormat = "yyyyMMddHHmmss"
+        let text = format.string(from: Date())
+        return NSHomeDirectory() + "/Documents/\(text).log"
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsSdk.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/DeepChordsSdk.swift
new file mode 100644 (file)
index 0000000..7c4aefc
--- /dev/null
@@ -0,0 +1,9 @@
+//
+//  DeepChordsSdk.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import Foundation
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/ReceiveManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/ReceiveManager.swift
new file mode 100644 (file)
index 0000000..e482cd6
--- /dev/null
@@ -0,0 +1,15 @@
+//
+//  ReceiveManager.swift
+//  DeepChordsSdk
+//
+//  Created by liangshi on 2025/11/25.
+//
+import Foundation
+
+class ReceiveManager{
+    
+    
+    static func receiveData(_ data:Data){
+        
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbaustVoiceChatModel.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbaustVoiceChatModel.h
new file mode 100644 (file)
index 0000000..1b1e33e
--- /dev/null
@@ -0,0 +1,28 @@
+//
+//  StarbaustVoiceChatModel.h
+//  StarburstSdk
+//
+//  Created by incar on 2024/11/22.
+//
+
+#import <Foundation/Foundation.h>
+#import <StarburstSdk/StarburstAsrModel.h>
+
+@interface StarbaustVoiceChatModel : NSObject
+@property (nonatomic, assign) NSInteger code;/// 状态码,200成功
+@property (nonatomic, strong) NSString *msg;/// 提示语
+@property (nonatomic, strong) NSString *requestId;/// 请求id
+@property (nonatomic, assign) NSInteger dialogId;/// 对话id
+@property (nonatomic, strong) NSString *textResult;/// 语⾳识别结果⽚段内容
+@property (nonatomic, strong) NSString *responseText;/// 响应结果⽚段内容
+@property (nonatomic, strong) NSString *intent;/// 意图
+@property (nonatomic, assign) NSInteger sequence;/// 响应的编号
+@property (nonatomic, assign) BOOL definite;/// 语⾳识别结果⽚段是否已确定,后序不会有变化
+@property (nonatomic, assign) NSInteger definiteIndex;/// 已确定的识别结果序列号
+//@property (nonatomic, assign) NSInteger conversationIndex;/// 已确定的响应结果序列号
+@property (nonatomic, assign) BOOL conversationFinish;/// 对话是否结束
+@property (nonatomic, strong) StarburstTranslateResult *translateResult;///翻译结果
+@property (nonatomic, strong) StarburstAsrTtsResult *ttsResult;///tts音频流
+
+@end
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrConfig.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrConfig.h
new file mode 100644 (file)
index 0000000..70275c1
--- /dev/null
@@ -0,0 +1,66 @@
+//
+//  StarburstAsrConfig.h
+//  StarburstSdk
+//
+//  Created by incar on 2024/9/14.
+//
+
+#import <Foundation/Foundation.h>
+
+//语言
+//简体中文 zh-CN
+//四川话 sc
+//粤语 cant
+//上海话 zh_shanghai
+//英文  en-US
+//日语 ja-JP
+//韩语 ko-KR
+//法语 fr-FR
+//西班牙语 es-MX
+//葡萄牙语 pt-BR
+//印尼语 id-ID
+//俄语 ru-RU
+//马来语 ms-MY
+
+/// voice chat配置
+@interface StarburstVoiceChatConfig : NSObject
+@property (nonatomic, strong) NSString *role;/// 对话⻆⾊设定;默认为⽆特⾊的智能助⼿
+//@property (nonatomic, assign) int channel;/// 默认为1,只⽀持1:单声道、2:双声道
+@property (nonatomic, strong) NSString *language;/// 语⾔编码,默认为普通话(zh-CN)
+@property (nonatomic, assign) BOOL tts;/// 是否进⾏Tts,默认false
+@property (nonatomic, strong) NSString *ttsAudioFormat;/// 默认pcm。⽀持pcm / ogg_opus / mp3
+@property (nonatomic, strong) NSString *ttsSpeakerType;/// tts声⾊类型,仅当传"clone"时,ttsSpeaker为单⾊克隆⽣成的speakerId
+@property (nonatomic, strong) NSString *ttsSpeakerId;/// tts声⾊设置,默认使⽤“⾃然⼥声”
+@end
+
+/// 手机录音asr配置
+@interface StarburstAsrConfig : NSObject
+@property (nonatomic, assign) BOOL isTranslate;/// 是否翻译,默认false。如果为true翻译源语言和目标语言不能是同一种语言
+@property (nonatomic, strong) NSString *fromLanguage;/// 语⾔编码,默认为普通话(zh-CN),auto_lang自动识别
+@property (nonatomic, strong) NSString *toLanguage;/// ⽬标语⾔编码,默认为英语(en-US),auto_lang自动识别
+@property (nonatomic, assign) BOOL isTTs;/// 是否进⾏Tts,默认false
+@property (nonatomic, strong) NSString *ttsFormat;/// 默认pcm ⽀持pcm / ogg_opus / mp3
+@property (nonatomic, strong) NSString *ttsType;/// 默认只⽀持"stream",
+@property (nonatomic, strong) NSString *ttsSpeaker;/// tts声⾊设置
+@end
+
+/// 蓝牙耳机录音asr配置
+@interface StarburstBleAsrConfig : NSObject
+@property (nonatomic, assign) NSInteger type;/// 0x00实时录音,0x0c通话录音,其他待定
+@end
+
+/// 文件/文本asr配置
+@interface StarburstAsrFileConfig : NSObject
+@property (nonatomic, assign) BOOL isTranslate;/// 是否翻译,默认false
+@property (nonatomic, strong) NSString *fromLanguage;/// 语⾔编码
+@property (nonatomic, strong) NSString *toLanguage;/// ⽬标语⾔编码
+@property (nonatomic, assign) BOOL summary;/// 是否进行总结,默认false
+@property (nonatomic, assign) BOOL speakerSplit;/// 是否区分说话人,默认false
+@end
+
+
+/// 翻译配置
+@interface StarburstTslConfig : NSObject
+@property (nonatomic, strong) NSString *fromLanguage;/// 语⾔编码
+@property (nonatomic, strong) NSString *toLanguage;/// ⽬标语⾔编码
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrModel.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstAsrModel.h
new file mode 100644 (file)
index 0000000..e09478f
--- /dev/null
@@ -0,0 +1,40 @@
+//
+//  StarburstAsrModel.h
+//  StarburstSdk
+//
+//  Created by incar on 2024/9/13.
+//
+
+#import <Foundation/Foundation.h>
+
+/// 翻译结果
+@interface StarburstTranslateResult : NSObject
+@property (nonatomic, strong) NSString *text;/// 语⾳识别后翻译的结果⽚段
+@property (nonatomic, assign) BOOL definite;/// 当前翻译⽚段是否确定
+@property (nonatomic, assign) int definiteIndex;/// 已翻译⽚段序号
+@end
+
+/// tts音频流
+@interface StarburstAsrTtsResult : NSObject
+@property (nonatomic, assign) NSInteger index;/// 音频数据⽚段的序号
+@property (nonatomic, assign) NSInteger translateIndex;/// 翻译的序号
+@property (nonatomic, strong) NSString *streamPiece;/// 音频流
+@end
+
+
+/// 识别结果
+@interface StarburstAsrModel : NSObject
+@property (nonatomic, assign) NSInteger channel;/// 0非立体声,1左声道,2右声道
+@property (nonatomic, assign) NSInteger code;/// 状态码
+@property (nonatomic, strong) NSString *msg;/// 提示语
+@property (nonatomic, strong) NSString *requestId;/// 请求id
+@property (nonatomic, strong) NSString *textResult;/// 语⾳识别结果⽚段内容
+@property (nonatomic, assign) NSInteger sequence;/// 响应的编号
+@property (nonatomic, assign) BOOL definite;/// 语⾳识别结果⽚段是否已确定,后序不会有变化
+@property (nonatomic, assign) NSInteger definiteIndex;/// 已确定的识别结果序列号
+@property (nonatomic, strong) StarburstTranslateResult *translateResult;///翻译结果
+@property (nonatomic, strong) StarburstAsrTtsResult *ttsResult;///tts音频流
+
++ (StarburstAsrModel *)modelWith:(NSDictionary *)dict;
+@end
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstConfig.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstConfig.h
new file mode 100644 (file)
index 0000000..9b4dd0a
--- /dev/null
@@ -0,0 +1,42 @@
+//
+//  StarburstConfig.h
+//  StarburstSdk
+//
+//  Created by liangshi on 2025/6/18.
+//
+
+#import <Foundation/Foundation.h>
+
+typedef NS_OPTIONS(NSInteger,StarburstSdkType) {
+    StarburstSdkType_Ble = 1,/// 设备鉴权+设备拾音
+    StarburstSdkType_Phone = 2,/// 账号鉴权+手机拾音
+    StarburstSdkType_Mix = 3,/// 设备鉴权+手机拾音
+    StarburstSdkType_Glasses_Ble = 4,/// 眼镜板+设备鉴权
+    StarburstSdkType_Glasses_Account = 5,/// 眼镜板+账号鉴权
+};
+
+
+@interface StarburstConfig : NSObject
+@property (nonatomic, readonly)NSString *logs;/// 获取日志
+@property (nonatomic, strong)void (^logCallback)(NSString *log);/// 日志输出回调
+@property (nonatomic, assign)BOOL isDebug;/// 是否打印日志,默认false
+@property (nonatomic, strong)NSString *logPath;/// 日志路径,不设置不保存日志
+@property (nonatomic, strong)NSString *sdkFolder;/// sdk路径,可以自定义
+@property (nonatomic, strong)NSDictionary *debugInfo;/// 调试信息
+@property (nonatomic, strong)NSString *user_custom_prompt_init;/// voicechat配置
+
+@property (nonatomic, assign)BOOL enableEarbudsSwitchSync;/// 主从耳机切换是否同步sdk信息到耳机,默认false
+@property (nonatomic, assign)BOOL enableTextSyncToDevice;/// 是否下发文字到耳机仓,默认false
+@property (nonatomic, assign)BOOL enableEmotionSyncToDevice;/// 耳机仓表情下发开关,默认false
+@property (nonatomic, assign)NSInteger callRecordChannel;/// 通话录音声道数。1:单声道 ;2:⽴体声;默认单声道
+//enableExternalOpusDecoder
+@property (nonatomic, strong)NSString *appId;/// 分配的id
+@property (nonatomic, readonly)StarburstSdkType sdkType;/// sdk类型
+
+/// 单利
++ (instancetype)shared;
+
+/// 切换sdk
+- (void)switchTo:(StarburstSdkType)type;
+@end
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstFileAsrModel.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstFileAsrModel.h
new file mode 100644 (file)
index 0000000..b409f7b
--- /dev/null
@@ -0,0 +1,36 @@
+//
+//  StarburstFileAsrModel.h
+//  StarburstSdk
+//
+//  Created by incar on 2024/9/27.
+//
+
+#import <Foundation/Foundation.h>
+
+/// 该段说话人
+@interface StarburstFileAsrAdditions : NSObject
+@property (nonatomic, strong) NSString *speaker;/// 该段说话人编号
+@end
+
+/// 识别片段
+@interface StarburstFileAsrPieces : NSObject
+@property (nonatomic, strong) NSString *text;/// 片段识别的内筒
+@property (nonatomic, assign) NSInteger start_time;///片段对应文件进度,单位毫秒
+@property (nonatomic, assign) NSInteger end_time;///  片段对应文件进度,单位毫秒
+@property (nonatomic, strong) StarburstFileAsrAdditions *additions;///该段说话人
+@end
+
+/// 文件识别结果模型
+@interface StarburstFileAsrModel : NSObject
+@property (nonatomic, assign) NSInteger code;/// 状态码
+@property (nonatomic, strong) NSString *msg;/// 提示语
+@property (nonatomic, strong) NSString *requestId;/// 请求id
+@property (nonatomic, strong) NSString *taskId;/// 任务id
+@property (nonatomic, strong) NSString *text;/// 语⾳识别内容
+@property (nonatomic, strong) NSString *summary;/// 识别摘要内容
+@property (nonatomic, strong) NSString *transText;///识别后翻译结果
+@property (nonatomic, strong) NSArray<StarburstFileAsrPieces *> *pieces;///识别片段
+
++ (StarburstFileAsrModel *)modelWith:(NSDictionary *)dict;
+@end
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstOffLineFile.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstOffLineFile.h
new file mode 100644 (file)
index 0000000..9e7a192
--- /dev/null
@@ -0,0 +1,20 @@
+//
+//  StarburstOffLineFile.h
+//  StarburstSdk
+//
+//  Created by incar on 2024/10/8.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// 离线文件
+@interface StarburstOffLineFile : NSObject
+
+@property (nonatomic, assign) uint8_t fileType;/// 0x00所有文件、0x01左耳列表、0x02右耳列表
+@property (nonatomic, assign) NSInteger fileId;/// 文件id
+@property (nonatomic, assign) NSInteger fileSize;/// 文件大小
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstPhoneSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstPhoneSdk.h
new file mode 100644 (file)
index 0000000..903da21
--- /dev/null
@@ -0,0 +1,121 @@
+//
+//  StarburstPhoneSdk.h
+//  StarburstSdk
+//
+//  Created by liangshi on 2025/3/11.
+//
+
+#import <Foundation/Foundation.h>
+#import <StarburstSdk/StarburstSdkManager.h>
+#import <StarburstSdk/StarburstAsrConfig.h>
+#import <StarburstSdk/StarburstAsrModel.h>
+#import <StarburstSdk/StarbaustVoiceChatModel.h>
+#import <StarburstSdk/StarburstFileAsrModel.h>
+#import <StarburstSdk/StarburstOffLineFile.h>
+#import <StarburstSdk/StarburstStreamModel.h>
+#import <StarburstSdk/StarbusrtSpeaker.h>
+
+
+@interface StarburstPhoneSdk : NSObject
+@property (nonatomic, readonly)BOOL didAuth;/// 是否已经鉴权
+@property (nonatomic, strong)void (^websocketStateCallback)(BOOL connected);/// websocket状态回调,true为已连接,false未链接
+
+
+/// 单利
++ (instancetype)shared;
+
+///  注册
+/// - Parameters:
+///   - productKey: 产品key
+///   - productSecret:  产品秘钥,经过aes/cbc/7Padding加密后的data
+///   - deviceName:  设备名称
+///   - random:  加密随机数
+///   - finished: 结果回调
+- (void)registerWithProductKey:(NSString *)productKey productSecret:(NSData *)productSecret deviceName:(NSString *)deviceName random:(NSString *)random finished:(void (^)(NSString *deviceSecret,NSError *error))finished;
+
+///  登录
+/// - Parameters:
+///   - productKey: 产品key
+///   - deviceName:  设备名称
+///   - deviceSecret:  设备密码
+///   - finished: 结果回调
+- (void)connectWithProductKey:(NSString *)productKey deviceName:(NSString *)deviceName deviceSecret:(NSString *)deviceSecret finished:(void (^)(BOOL isSuccess,NSError *error))finished;
+
+///// 【文件摘要】
+///// - Parameters:
+/////   - path: 文件路径
+/////   - recognize: 识别结果回调
+/////   - error: 错误回调
+//- (void)asrByFile:(NSURL *)filePath config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本摘要】
+/// - Parameters:
+///   - text: 识别的文本
+///   - recognize: 识别结果回调
+///   - error: 错误回调
+- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本摘要】--流式
+/// - Parameters:
+///   - text: 摘要的文字
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本摘要】--流式
+-(void)cancelSummaryByTextWithSplit;
+
+/// 【文本翻译】
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 识别结果回调
+///   - error: 错误回调
+- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本翻译】--流式
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本翻译】--流式
+-(void)cancelTranslateByTextWithSplit;
+
+/// 【同声传译】开始手机拾音
+/// - Parameters:
+///   - config: 识别配置
+///   - voiceRecordData: 录音音频流回调
+///   - recognizeText: 识别回调
+///   - stateChange: 状态回调
+- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+
+/// 【同声传译】结束手机拾音
+/// - Parameter fileCallback: 录音文件回调
+- (void)stopRecordAsr:(void(^)(NSString *filePath))fileCallback;
+
+/// 手机拾音对话设置
+/// - Parameters:
+///   - config: 对话配置
+///   - startCallBack: 开始回调
+///   - textCallBack: 文本识别回调
+///   - voiceCallBack: AI语音回复回调
+///   - stateChange: 状态回调
+///   - finished:录音地址回调
+- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack  responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+
+/// 手机拾音,开始对话
+/// - Parameter vadType: 0 vad检测,1不启用vad(手动控制开始/结束讲话)
+- (void)startPhoneChat:(int)vadType;
+
+/// 结束手机拾音对话
+- (void)stopPhoneChat;
+
+/// 获取音色列表
+/// - Parameter callBack: 结果回调
+- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
+
+@end
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdk.h
new file mode 100644 (file)
index 0000000..422071c
--- /dev/null
@@ -0,0 +1,32 @@
+//
+//  Starburst.h
+//  Starburst
+//
+//  Created by cookies on 2023/6/12.
+//
+
+#import <Foundation/Foundation.h>
+
+//! Project version number for Starburst.
+//FOUNDATION_EXPORT double StarburstSdkVersionNumber;
+
+//! Project version string for Starburst.
+//FOUNDATION_EXPORT const unsigned char StarburstSdkVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import <StarburstSdk/PublicHeader.h>
+
+#import <StarburstSdk/StarburstSdkManager.h>
+#import <StarburstSdk/StarburstConfig.h>
+#import <StarburstSdk/StarburstPhoneSdk.h>
+#import <StarburstSdk/StartburstMixSdk.h>
+#import <StarburstSdk/StartburstGlassesSdk.h>
+#import <StarburstSdk/StartburstGlassChat.h>
+#import <StarburstSdk/StarburstAsrConfig.h>
+#import <StarburstSdk/StarburstAsrModel.h>
+#import <StarburstSdk/StarburstFileAsrModel.h>
+#import <StarburstSdk/StarbaustVoiceChatModel.h>
+#import <StarburstSdk/StarbusrtSpeaker.h>
+#import <StarburstSdk/StarburstStreamModel.h>
+#import <StarburstSdk/StarburstOffLineFile.h>
+#import <StarburstSdk/StartburstDecoderConfig.h>
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdkManager.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstSdkManager.h
new file mode 100644 (file)
index 0000000..94af429
--- /dev/null
@@ -0,0 +1,169 @@
+//
+//  StarburstSdk.h
+//  VoiceDemo
+//
+//  Created by incar on 2024/9/12.
+//
+
+#import <Foundation/Foundation.h>
+#import <StarburstSdk/StarburstAsrConfig.h>
+#import <StarburstSdk/StarburstAsrModel.h>
+#import <StarburstSdk/StarbaustVoiceChatModel.h>
+#import <StarburstSdk/StarburstFileAsrModel.h>
+#import <StarburstSdk/StarburstOffLineFile.h>
+#import <StarburstSdk/StarburstStreamModel.h>
+#import <StarburstSdk/StarbusrtSpeaker.h>
+#import <StarburstSdk/StartburstDecoderConfig.h>
+
+typedef NS_OPTIONS(NSInteger,StarburstCode) {
+    StarburstCode_Start_Record = 20001,///开始录音
+    StarburstCode_Stop_Record = 20002,///停止录音
+    StarburstCode_Record_Error = 20003,///录音出错
+    StarburstCode_Ble_Disconected = 20004,///蓝牙断开
+    StarburstCode_Websocket_Connected = 30001,///socket连上
+    StarburstCode_Websocket_Disconnected = 30002,///socket断开连接
+    StarburstCode_Websocket_Connecting = 30003,///socket连接中...
+    StarburstCode_Websocket_pingTimeOut = 30004,///ping超时
+    StarburstCode_Net_Error = 50000,///网络错误
+    StarburstCode_UnAuth = 60000,///未鉴权
+};
+
+
+@interface StarburstSdk : NSObject
+//@property (nonatomic, strong)void (^authSuccessCallback)(void);/// 鉴权成功回调
+@property (nonatomic, strong)void (^authCallback)(int code,NSString *msg);/// 鉴权结果回调,code200代表成功,其他为失败
+@property (nonatomic, readonly)BOOL didAuth;// 是否已经鉴权
+@property (nonatomic, strong)void (^websocketStateCallback)(BOOL connected);/// websocket状态回调,true为已连接,false未链接
+@property (nonatomic, strong)void (^bleRecordStateCallback)(int state);/// 耳机录音状态回调,1录音,2结束录音
+@property (nonatomic, strong)void (^sendToBleCallback)(NSData *data);/// 发送给蓝牙设备
+
+/// 单利
++ (instancetype)shared;
+
+/// 收到蓝牙设备传过来的数据,交给sdk处理
+/// - Parameter data:数据
+- (void)receiveBleData:(NSData *)data;
+
+/// 蓝牙设备已经连上(蓝牙连接和断开都需要通知sdk)
+- (void)bleConnected;
+
+/// 蓝牙断开连接(在监听到蓝牙断开的时候,调用该方法通知sdk结束当前任务)
+- (void)bleDisConnected;
+
+///// 【文本摘要】
+///// - Parameters:
+/////   - text: 识别的文本
+/////   - recognize: 识别结果回调
+/////   - error: 错误回调
+- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本摘要】--流式
+/// - Parameters:
+///   - text: 摘要的文字
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本摘要】--流式
+-(void)cancelSummaryByTextWithSplit;
+
+/// 【文本翻译】
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 识别结果回调
+///   - error: 错误回调
+- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本翻译】--流式
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+
+/// 取消 【文本翻译】--流式
+-(void)cancelTranslateByTextWithSplit;
+
+/// 【同声传译】开始手机拾音
+/// - Parameters:
+///   - config: 识别配置
+///   - voiceRecordData: 录音音频流回调
+///   - recognizeText: 识别回调
+///   - stateChange: 状态回调
+///   - interrupt:打断回调(接听电话等打断)
+- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+
+/// 【同声传译】结束手机拾音
+/// - Parameter fileCallback: 录音文件回调
+- (void)stopRecordAsr:(void(^)(NSString *filePath))callback;
+
+/// 开始耳机拾音
+/// - Parameters:
+///   - config: 识别配置
+- (void)startDeviceRecord:(StarburstBleAsrConfig*)config;
+
+/// 结束耳机拾音
+- (void)stopDeviceRecord;
+
+/// 设置耳机拾音回调
+/// - Parameters:
+///   - recordPath: 录音文件保存的路径。如果文件已经存在,则音频数据会追加到尾部;如果不存在,则创建新文件;传nil则会按之前时间格式创建新文件
+///   - asrConfig: 识别配置
+///   - bleConfig: 耳机录音类型回调
+///   - recognize: 识别回调
+///   - stateChange: 状态回调
+///   - path: 录音结束,录音文件地址回调
+- (void)setupDeviceRecordWith:(NSString *)recordPath asrConfig:(StarburstAsrConfig*)asrConfig bleConfig:(void (^)(StarburstBleAsrConfig*))bleConfig recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+
+
+/// opus输出给app,app解码后将数据通过inputPcmData传回给sdk
+- (void)outputOpusData:(void (^)(StartburstDecoderConfig *copusConfig,NSData*opusData))recordCallBack;
+
+/// opus解码后传给sdk
+- (void)inputPcmData:(NSData *)pcmData;
+
+
+
+
+
+/// 获取音色列表
+/// - Parameter callBack: 结果回调
+- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
+
+///  设置voice chat回调,目前只支持蓝牙设备发起对话
+/// - Parameters:
+///   - config: 对话配置
+///   - startCallBack: 开始回调
+///   - textCallBack: 文本识别回调
+///   - voiceCallBack: AI语音回复回调
+///   - stateChange: 状态回调
+///   - finished:录音地址回调
+- (void)setupVoiceChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack  responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+
+/// 终止voice chat对话
+- (void)stopVoiceChat:(NSInteger)dialogId;
+
+/// 开始播放tts
+- (void)startPlayTtsAudio:(NSInteger)dialogId;
+
+/// 结束播放tts
+- (void)stopPlayTtsAudio:(NSInteger)dialogId;
+
+
+
+
+//不可用
+- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack  responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+//不可用
+- (void)startPhoneChat:(int)vadType;
+//不可用
+- (void)stopPhoneChat;
+//不可用
+- (void)registerWithProductKey:(NSString *)productKey productSecret:(NSString *)productSecret deviceName:(NSString *)deviceName random:(NSString *)random finished:(void (^)(NSString *deviceSecret,NSError *error))finished;
+//不可用
+- (void)connectWithProductKey:(NSString *)productKey  deviceName:(NSString *)deviceName deviceSecret:(NSString *)deviceSecret finished:(void (^)(BOOL isSuccess,NSError *error))finished;
+@end
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstStreamModel.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarburstStreamModel.h
new file mode 100644 (file)
index 0000000..fa0ad1f
--- /dev/null
@@ -0,0 +1,20 @@
+//
+//  StarburstStreamModel.h
+//  StarburstSdk
+//
+//  Created by liangshi on 2024/12/20.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface StarburstStreamModel : NSObject
+@property (nonatomic, assign) NSInteger code;//1: processing, 10: complete -1:fail
+@property (nonatomic, strong) NSString *msg;//提示文字
+@property (nonatomic, strong) NSString *failReason;//失败原因
+@property (nonatomic, strong) NSString *llmResponse;// 增量返回的⽂本内容
+@property (nonatomic, assign) BOOL complete;// ⽂本内容是否完成
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbusrtSpeaker.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StarbusrtSpeaker.h
new file mode 100644 (file)
index 0000000..2b2dae4
--- /dev/null
@@ -0,0 +1,19 @@
+//
+//  StarbusrtSpeaker.h
+//  StarburstSdk
+//
+//  Created by liangshi on 2025/2/18.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface StarbusrtSpeaker : NSObject
+@property (nonatomic, strong) NSString *sid;/// 音色id
+@property (nonatomic, strong) NSString *name;/// 名称
+@property (nonatomic, strong) NSString *type;/// 类型
+@property (nonatomic, strong) NSString *role;/// 角色
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstDecoderConfig.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstDecoderConfig.h
new file mode 100644 (file)
index 0000000..7e47aa2
--- /dev/null
@@ -0,0 +1,18 @@
+////
+////  Startburst.h
+////  StarburstSdk
+////
+////  Created by liangshi on 2025/6/11.
+////
+//
+#import <Foundation/Foundation.h>
+
+@interface StartburstDecoderConfig : NSObject
+@property (nonatomic, assign)NSInteger sampleRate;/// 采样率
+@property (nonatomic, assign)NSInteger numChannels;/// 声道数
+@property (nonatomic, assign)NSInteger encodedFrameLength;/// 编码后每帧字节数
+@property (nonatomic, assign)NSInteger originalSamplesPerFrame;/// 编码前每帧采样点数
+@property (nonatomic, assign)NSInteger bitDepth;/// 采样位深(16/24/32)
+@end
+
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassChat.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassChat.h
new file mode 100644 (file)
index 0000000..3df995d
--- /dev/null
@@ -0,0 +1,49 @@
+//
+//  StartburstGlassChat.h
+//  StarburstSdk
+//
+//  Created by liangshi on 2025/5/6.
+//
+
+#import <Foundation/Foundation.h>
+#import <StarburstSdk/StarburstSdkManager.h>
+#import <StarburstSdk/StarbaustVoiceChatModel.h>
+#import <StarburstSdk/StarbusrtSpeaker.h>
+
+
+@interface StartburstGlassChat : NSObject
+///
+/// 对话设置
+/// - Parameters:
+///   - config: 对话配置
+///   - textCallBack: 文本识别回调
+///   - voiceCallBack: AI语音回复回调
+///   - stateChange: 状态回调
+///   - finished:录音地址回调
+- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack  responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+
+/// 开始对话
+- (void)start;
+
+/// 结束对话
+- (void)stop;
+
+/// 分发数据
+/// - Parameter data:音频流
+- (void)fireAudioData:(NSData *)data;
+
+/// 通知vad状态变化
+/// - Parameter isVadStarted: ture表⽰vad检测到说话开始,false表⽰vad检测到说话结束
+- (void)vadStateChange:(BOOL)isVadStarted;
+
+/// 分发数据
+/// - Parameter data:图片流
+- (void)fireImageData:(NSData *)data;
+
+/// 分发数据
+/// - Parameter text:文本
+- (void)fireText:(NSString *)text;
+
+@end
+
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassesSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstGlassesSdk.h
new file mode 100644 (file)
index 0000000..862a1a2
--- /dev/null
@@ -0,0 +1,110 @@
+//
+//  StartburstGlassesSdk.h
+//  StarburstSdk
+//
+//  Created by liangshi on 2025/4/29.
+//
+
+
+#import <Foundation/Foundation.h>
+#import <StarburstSdk/StarburstSdkManager.h>
+#import <StarburstSdk/StarburstAsrConfig.h>
+#import <StarburstSdk/StarburstAsrModel.h>
+#import <StarburstSdk/StarbaustVoiceChatModel.h>
+#import <StarburstSdk/StarburstFileAsrModel.h>
+#import <StarburstSdk/StarburstOffLineFile.h>
+#import <StarburstSdk/StarburstStreamModel.h>
+#import <StarburstSdk/StarbusrtSpeaker.h>
+#import <StarburstSdk/StartburstGlassChat.h>
+
+@interface StartburstGlassesSdk : NSObject
+@property (nonatomic, strong)void (^sendToBleCallback)(NSData *data);/// 发送给蓝牙设备
+@property (nonatomic, strong)void (^authCallback)(int code,NSString *msg);/// 鉴权结果回调,code200代表成功,其他为失败
+@property (nonatomic, readonly)BOOL didAuth;/// 是否已经鉴权
+@property (nonatomic, strong)StartburstGlassChat *chat;/// 对话对象
+
+/// 单利
++ (instancetype)shared;
+
+/// 收到蓝牙设备传过来的数据,交给sdk处理
+/// - Parameter data:数据
+- (void)receiveBleData:(NSData *)data;
+
+/// 蓝牙设备已经连上
+- (void)bleConnected;
+
+/// 蓝牙断开连接(在监听到蓝牙断开的时候,调用该方法通知sdk结束当前任务)
+- (void)bleDisConnected;
+
+///  注册
+/// - Parameters:
+///   - productKey: 产品key
+///   - productSecret:  产品秘钥,经过aes/cbc/7Padding加密后的data
+///   - deviceName:  设备名称
+///   - random:  加密随机数
+///   - finished: 结果回调
+- (void)registerWithProductKey:(NSString *)productKey productSecret:(NSData *)productSecret deviceName:(NSString *)deviceName random:(NSString *)random finished:(void (^)(NSString *deviceSecret,NSError *error))finished;
+
+///  登录
+/// - Parameters:
+///   - productKey: 产品key
+///   - deviceName:  设备名称
+///   - deviceSecret:  设备密码
+///   - finished: 结果回调
+- (void)connectWithProductKey:(NSString *)productKey deviceName:(NSString *)deviceName deviceSecret:(NSString *)deviceSecret finished:(void (^)(BOOL isSuccess,NSError *error))finished;
+
+/// 【文本摘要】
+/// - Parameters:
+///   - text: 识别的文本
+///   - recognize: 识别结果回调
+///   - error: 错误回调
+- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本摘要】--流式
+/// - Parameters:
+///   - text: 摘要的文字
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本摘要】--流式
+-(void)cancelSummaryByTextWithSplit;
+
+/// 【文本翻译】
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 识别结果回调
+///   - error: 错误回调
+- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本翻译】--流式
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本翻译】--流式
+-(void)cancelTranslateByTextWithSplit;
+
+/// 【同声传译】开始手机拾音
+/// - Parameters:
+///   - config: 识别配置
+///   - voiceRecordData: 录音音频流回调
+///   - recognizeText: 识别回调
+///   - stateChange: 状态回调
+- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+
+/// 【同声传译】结束手机拾音
+/// - Parameter fileCallback: 录音文件回调
+- (void)stopRecordAsr:(void(^)(NSString *filePath))fileCallback;
+
+/// 获取音色列表
+/// - Parameter callBack: 结果回调
+- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
+
+@end
+
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstMixSdk.h b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Headers/StartburstMixSdk.h
new file mode 100644 (file)
index 0000000..aa4ba37
--- /dev/null
@@ -0,0 +1,111 @@
+//
+//  StartburstMixSdk.h
+//  StarburstSdk
+//
+//  Created by liangshi on 2025/4/22.
+//
+
+#import <Foundation/Foundation.h>
+#import <StarburstSdk/StarburstSdkManager.h>
+#import <StarburstSdk/StarburstAsrConfig.h>
+#import <StarburstSdk/StarburstAsrModel.h>
+#import <StarburstSdk/StarbaustVoiceChatModel.h>
+#import <StarburstSdk/StarburstFileAsrModel.h>
+#import <StarburstSdk/StarburstOffLineFile.h>
+#import <StarburstSdk/StarburstStreamModel.h>
+#import <StarburstSdk/StarbusrtSpeaker.h>
+
+@interface StartburstMixSdk : NSObject
+
+@property (nonatomic, strong)void (^authCallback)(int code,NSString *msg);/// 鉴权结果回调,code200代表成功,其他为失败
+@property (nonatomic, readonly)BOOL didAuth;/// 是否已经鉴权
+@property (nonatomic, strong)void (^websocketStateCallback)(BOOL connected);/// websocket状态回调,true为已连接,false未链接
+@property (nonatomic, strong)void (^sendToBleCallback)(NSData *data);/// 发送给蓝牙设备
+
+/// 单利
++ (instancetype)shared;
+
+/// 收到蓝牙设备传过来的数据,交给sdk处理
+/// - Parameter data:数据
+- (void)receiveBleData:(NSData *)data;
+
+/// 蓝牙设备已经连上
+- (void)bleConnected;
+
+/// 蓝牙断开连接(在监听到蓝牙断开的时候,调用该方法通知sdk结束当前任务)
+- (void)bleDisConnected;
+
+
+/// 【文本摘要】
+/// - Parameters:
+///   - text: 识别的文本
+///   - recognize: 识别结果回调
+///   - error: 错误回调
+- (void)summaryByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本摘要】--流式
+/// - Parameters:
+///   - text: 摘要的文字
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)summaryByTextWithSplit:(NSString *)text recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本摘要】--流式
+-(void)cancelSummaryByTextWithSplit;
+
+/// 【文本翻译】
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 识别结果回调
+///   - error: 错误回调
+- (void)translateByText:(NSString *)text config:(StarburstAsrFileConfig*)config recognizeText:(void (^)(StarburstFileAsrModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 【文本翻译】--流式
+/// - Parameters:
+///   - text: 翻译的文字
+///   - config: 翻译配置
+///   - recognize: 结果回调
+///   - error: 错误回调
+- (void)translateByTextWithSplit:(NSString *)text config:(StarburstTslConfig*)config recognizeText:(void (^)(StarburstStreamModel*))recognize error:(void (^)(NSError *err))error;
+
+/// 取消 【文本翻译】--流式
+-(void)cancelTranslateByTextWithSplit;
+
+/// 【同声传译】开始手机拾音
+/// - Parameters:
+///   - config: 识别配置
+///   - voiceRecordData: 录音音频流回调
+///   - recognizeText: 识别回调
+///   - stateChange: 状态回调
+- (void)startRecordAsr:(StarburstAsrConfig*)config voiceRecord:(void (^)(NSData*))voiceData recognizeText:(void (^)(StarburstAsrModel*))recognize stateChange:(void(^)(StarburstCode code))stateChange interruption:(void(^)(void))interrupt;
+
+/// 【同声传译】结束手机拾音
+/// - Parameter fileCallback: 录音文件回调
+- (void)stopRecordAsr:(void(^)(NSString *filePath))fileCallback;
+
+/// 手机拾音对话设置
+/// - Parameters:
+///   - config: 对话配置
+///   - startCallBack: 开始回调
+///   - textCallBack: 文本识别回调
+///   - voiceCallBack: AI语音回复回调
+///   - stateChange: 状态回调
+///   - finished:录音地址回调
+- (void)setupPhoneChatWith:(StarburstVoiceChatConfig*)config start:(void (^)(NSInteger dialogId))startCallback textCallback:(void (^)(StarbaustVoiceChatModel*))textCallBack  responseVoice:(void (^)(NSInteger dialogId,NSData*data,BOOL finish))voiceCallBack stateChange:(void(^)(StarburstCode code))stateChange finished:(void(^)(NSString *filePath))path;
+
+
+/// 手机拾音,开始对话
+/// - Parameter vadType: 0 vad检测,1不启用vad
+- (void)startPhoneChat:(int)vadType;
+
+/// 结束手机拾音对话
+- (void)stopPhoneChat;
+
+/// 获取音色列表
+/// - Parameter callBack: 结果回调
+- (void)getVcSpeekerList:(void (^)(NSArray <StarbusrtSpeaker*> *list,BOOL success))callBack;
+
+@end
+
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist
new file mode 100644 (file)
index 0000000..5d0891e
Binary files /dev/null and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Info.plist differ
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Modules/module.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/Modules/module.modulemap
new file mode 100644 (file)
index 0000000..7426ade
--- /dev/null
@@ -0,0 +1,6 @@
+framework module StarburstSdk {
+  umbrella header "StarburstSdk.h"
+  export *
+
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..c8b6829
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyTracking</key>
+       <false/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array>
+               <dict>
+                       <key>NSPrivacyCollectedDataType</key>
+                       <string>NSPrivacyCollectedDataTypeAudioData</string>
+                       <key>NSPrivacyCollectedDataTypeLinked</key>
+                       <false/>
+                       <key>NSPrivacyCollectedDataTypeTracking</key>
+                       <false/>
+                       <key>NSPrivacyCollectedDataTypePurposes</key>
+                       <array>
+                               <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
+                       </array>
+               </dict>
+       </array>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk
new file mode 100644 (file)
index 0000000..0444933
Binary files /dev/null and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/StarburstSdk differ
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory
new file mode 100644 (file)
index 0000000..ccd2d67
Binary files /dev/null and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeDirectory differ
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements
new file mode 100644 (file)
index 0000000..c528e57
Binary files /dev/null and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements differ
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1 b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1
new file mode 100644 (file)
index 0000000..07e5514
Binary files /dev/null and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeRequirements-1 differ
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeResources b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeResources
new file mode 100644 (file)
index 0000000..040d597
--- /dev/null
@@ -0,0 +1,357 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>files</key>
+       <dict>
+               <key>Headers/StarbaustVoiceChatModel.h</key>
+               <data>
+               I6GwpMWb210AbU3/v9YLrfddoEA=
+               </data>
+               <key>Headers/StarburstAsrConfig.h</key>
+               <data>
+               O5iJsUMPvwiRYlgGCgXp4TmAllQ=
+               </data>
+               <key>Headers/StarburstAsrModel.h</key>
+               <data>
+               iiw2ZgUm4OBP2p0P0RSXd6gOwBY=
+               </data>
+               <key>Headers/StarburstConfig.h</key>
+               <data>
+               /Bp9QOl1Vlv/1q1uwSh5zjn5IPA=
+               </data>
+               <key>Headers/StarburstFileAsrModel.h</key>
+               <data>
+               KCay85nepjWFLxW32vUBaknoYTk=
+               </data>
+               <key>Headers/StarburstOffLineFile.h</key>
+               <data>
+               28IGQ1ND/MHAAnUNKNBxuvS5ROc=
+               </data>
+               <key>Headers/StarburstPhoneSdk.h</key>
+               <data>
+               Qyvk+mUwCA6e59P6MqEGlKXAoV4=
+               </data>
+               <key>Headers/StarburstSdk.h</key>
+               <data>
+               UXMAS15KF45xW0cc4/2dI4vQTCQ=
+               </data>
+               <key>Headers/StarburstSdkManager.h</key>
+               <data>
+               SO4o81CoyyO4XOPAsZo1GUvl1p4=
+               </data>
+               <key>Headers/StarburstStreamModel.h</key>
+               <data>
+               cdW3VKYRIjOHM5xn0Zzt3fioFro=
+               </data>
+               <key>Headers/StarbusrtSpeaker.h</key>
+               <data>
+               SBlLEersGuEueZNxVNc2uyepfts=
+               </data>
+               <key>Headers/StartburstDecoderConfig.h</key>
+               <data>
+               CEyiYJhRwvumcRqNLLoJARHeU24=
+               </data>
+               <key>Headers/StartburstGlassChat.h</key>
+               <data>
+               utqD1cN73IP2Kj6ThbunMmpf3S8=
+               </data>
+               <key>Headers/StartburstGlassesSdk.h</key>
+               <data>
+               PWqGuJ/I4XGFgkETcPBwQWnDEzg=
+               </data>
+               <key>Headers/StartburstMixSdk.h</key>
+               <data>
+               bemNunuDBWDRu5cPpr/qtzb51HE=
+               </data>
+               <key>Info.plist</key>
+               <data>
+               TbwY6qSKiZSNAQ4zKoI1WNFwZSA=
+               </data>
+               <key>Modules/module.modulemap</key>
+               <data>
+               0SW07sgC8aptSEw6560m065YdrY=
+               </data>
+               <key>PrivacyInfo.xcprivacy</key>
+               <data>
+               SRctDO3cqibONLEG7CPcNZVBnXw=
+               </data>
+       </dict>
+       <key>files2</key>
+       <dict>
+               <key>Headers/StarbaustVoiceChatModel.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       I6GwpMWb210AbU3/v9YLrfddoEA=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       1h090jtb3WRV25cr3cYc+NPRWUvlbO3j4QqjmThCV9c=
+                       </data>
+               </dict>
+               <key>Headers/StarburstAsrConfig.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       O5iJsUMPvwiRYlgGCgXp4TmAllQ=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       9ieYYQ/XtFmG0peIjWVyt2juVka68xC3vcJqEwQ8qHM=
+                       </data>
+               </dict>
+               <key>Headers/StarburstAsrModel.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       iiw2ZgUm4OBP2p0P0RSXd6gOwBY=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       4P7mnRJalvX4ISPvk5QKj1CSZ762p7L8HNbs3dIVa9A=
+                       </data>
+               </dict>
+               <key>Headers/StarburstConfig.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       /Bp9QOl1Vlv/1q1uwSh5zjn5IPA=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       JMBJ67zUYPjxdjB6vpgfPtv5P5iPeEVIzIvo6tnFAmo=
+                       </data>
+               </dict>
+               <key>Headers/StarburstFileAsrModel.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       KCay85nepjWFLxW32vUBaknoYTk=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       Y1+wOB3+K0CSFktnWVRMaxl9SsvQMDAZcFup9gudCFg=
+                       </data>
+               </dict>
+               <key>Headers/StarburstOffLineFile.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       28IGQ1ND/MHAAnUNKNBxuvS5ROc=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       JqjH7qjguq8OEs3MklD/pyfD9ULJzpCwIyS37AvPIe8=
+                       </data>
+               </dict>
+               <key>Headers/StarburstPhoneSdk.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       Qyvk+mUwCA6e59P6MqEGlKXAoV4=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       U7UlFVbYvM2vSO810pr82LySA9HeLA4uMBh6PnCY5aE=
+                       </data>
+               </dict>
+               <key>Headers/StarburstSdk.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       UXMAS15KF45xW0cc4/2dI4vQTCQ=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       OT9NyhWFaPzjchBx437Llm8zPGQdOJ1e/F2dRGEQEN8=
+                       </data>
+               </dict>
+               <key>Headers/StarburstSdkManager.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       SO4o81CoyyO4XOPAsZo1GUvl1p4=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       zYNzKgVctWkBxMvEJoFC+QgA9HMqVHL4rZ0ID3ef1/0=
+                       </data>
+               </dict>
+               <key>Headers/StarburstStreamModel.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       cdW3VKYRIjOHM5xn0Zzt3fioFro=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       XC3yJkUL3sL1YkFBUADx+q+Q47YB040DrB7QEhOJa7w=
+                       </data>
+               </dict>
+               <key>Headers/StarbusrtSpeaker.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       SBlLEersGuEueZNxVNc2uyepfts=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       yCNcI1umW3Pgn7rtgMv5kZTDZXr/QxvPNRoNjcIrTJU=
+                       </data>
+               </dict>
+               <key>Headers/StartburstDecoderConfig.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       CEyiYJhRwvumcRqNLLoJARHeU24=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       PlYBO1RRT96qRTFSidHUui8kpiVj0/pQW85jqIjCtzY=
+                       </data>
+               </dict>
+               <key>Headers/StartburstGlassChat.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       utqD1cN73IP2Kj6ThbunMmpf3S8=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       VaH6J5gUMxZ8Whr9yIF3iefTz8SKIWwpyY9dq3mMWYk=
+                       </data>
+               </dict>
+               <key>Headers/StartburstGlassesSdk.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       PWqGuJ/I4XGFgkETcPBwQWnDEzg=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       Kql2VWlouLzv+FTfPR9+WlIFxgJUw4NpHhMzCTfAz8o=
+                       </data>
+               </dict>
+               <key>Headers/StartburstMixSdk.h</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       bemNunuDBWDRu5cPpr/qtzb51HE=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       S6yNxpkYJSgoOVUAyuIhC8ourDLd4Pu6tKFnRkM+Me0=
+                       </data>
+               </dict>
+               <key>Modules/module.modulemap</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       0SW07sgC8aptSEw6560m065YdrY=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       js/u3ymUzjIe0pCJDIjb2G3IBfLvIq7aILJo9tH8J8k=
+                       </data>
+               </dict>
+               <key>PrivacyInfo.xcprivacy</key>
+               <dict>
+                       <key>hash</key>
+                       <data>
+                       SRctDO3cqibONLEG7CPcNZVBnXw=
+                       </data>
+                       <key>hash2</key>
+                       <data>
+                       cuaVRkQIQRl8fLAPRH2XlUdsPxO0W90uL0WcSHvmSnY=
+                       </data>
+               </dict>
+       </dict>
+       <key>rules</key>
+       <dict>
+               <key>^.*</key>
+               <true/>
+               <key>^.*\.lproj/</key>
+               <dict>
+                       <key>optional</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>1000</real>
+               </dict>
+               <key>^.*\.lproj/locversion.plist$</key>
+               <dict>
+                       <key>omit</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>1100</real>
+               </dict>
+               <key>^Base\.lproj/</key>
+               <dict>
+                       <key>weight</key>
+                       <real>1010</real>
+               </dict>
+               <key>^version.plist$</key>
+               <true/>
+       </dict>
+       <key>rules2</key>
+       <dict>
+               <key>.*\.dSYM($|/)</key>
+               <dict>
+                       <key>weight</key>
+                       <real>11</real>
+               </dict>
+               <key>^(.*/)?\.DS_Store$</key>
+               <dict>
+                       <key>omit</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>2000</real>
+               </dict>
+               <key>^.*</key>
+               <true/>
+               <key>^.*\.lproj/</key>
+               <dict>
+                       <key>optional</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>1000</real>
+               </dict>
+               <key>^.*\.lproj/locversion.plist$</key>
+               <dict>
+                       <key>omit</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>1100</real>
+               </dict>
+               <key>^Base\.lproj/</key>
+               <dict>
+                       <key>weight</key>
+                       <real>1010</real>
+               </dict>
+               <key>^Info\.plist$</key>
+               <dict>
+                       <key>omit</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>20</real>
+               </dict>
+               <key>^PkgInfo$</key>
+               <dict>
+                       <key>omit</key>
+                       <true/>
+                       <key>weight</key>
+                       <real>20</real>
+               </dict>
+               <key>^embedded\.provisionprofile$</key>
+               <dict>
+                       <key>weight</key>
+                       <real>20</real>
+               </dict>
+               <key>^version\.plist$</key>
+               <dict>
+                       <key>weight</key>
+                       <real>20</real>
+               </dict>
+       </dict>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature
new file mode 100644 (file)
index 0000000..b0642f2
Binary files /dev/null and b/DeepChordsSdk_iOS/DeepChordsSdk/Example/DeepChordsSdk/StarburstSdk.framework/_CodeSignature/CodeSignature differ
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/project.pbxproj b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/project.pbxproj
new file mode 100644 (file)
index 0000000..5055fcd
--- /dev/null
@@ -0,0 +1,776 @@
+// !$*UTF8*$!
+{
+       archiveVersion = 1;
+       classes = {
+       };
+       objectVersion = 77;
+       objects = {
+
+/* Begin PBXBuildFile section */
+               111E0F1C572CCDE29D292F2C /* Pods_DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A3D9D4F11FC88844BFEAE4C3 /* Pods_DeepChordsSdk.framework */; };
+               3F3F14032ED5A9A50038A1C8 /* DeepChordsSdk.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3F3F13E32ED5A8C10038A1C8 /* DeepChordsSdk.framework */; };
+               6A05823333B2C2EB854DC2D7 /* Pods_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7BA0D452D1F1A03B9DE590FF /* Pods_Example.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+               3F3F14432ED5AC240038A1C8 /* Embed Frameworks */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = "";
+                       dstSubfolderSpec = 10;
+                       files = (
+                       );
+                       name = "Embed Frameworks";
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3F3F14492ED5AC570038A1C8 /* Embed Frameworks */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = "";
+                       dstSubfolderSpec = 10;
+                       files = (
+                       );
+                       name = "Embed Frameworks";
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+               23C20F392C077DCC8875F909 /* Pods-DeepChordsSdk.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DeepChordsSdk.release.xcconfig"; path = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.release.xcconfig"; sourceTree = "<group>"; };
+               3F3F01E32ED451920038A1C8 /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
+               3F3F13E32ED5A8C10038A1C8 /* DeepChordsSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DeepChordsSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               55108288A4959871FAF7AC5F /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
+               6A0C11EDFE570E63DB17064A /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
+               7BA0D452D1F1A03B9DE590FF /* Pods_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               A3D9D4F11FC88844BFEAE4C3 /* Pods_DeepChordsSdk.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DeepChordsSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               C91EC257243FCFD24EEE8863 /* Pods-DeepChordsSdk.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-DeepChordsSdk.debug.xcconfig"; path = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.debug.xcconfig"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
+               3F3F01F52ED451930038A1C8 /* Exceptions for "Example" folder in "Example" target */ = {
+                       isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
+                       membershipExceptions = (
+                               Info.plist,
+                       );
+                       target = 3F3F01E22ED451920038A1C8 /* Example */;
+               };
+               3F3F14462ED5AC420038A1C8 /* Exceptions for "DeepChordsSdk" folder in "Example" target */ = {
+                       isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
+                       membershipExceptions = (
+                               StarburstSdk.framework,
+                       );
+                       target = 3F3F01E22ED451920038A1C8 /* Example */;
+               };
+/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
+
+/* Begin PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */
+               3F3F14442ED5AC240038A1C8 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */ = {
+                       isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
+                       attributesByRelativePath = {
+                               StarburstSdk.framework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
+                       };
+                       buildPhase = 3F3F14432ED5AC240038A1C8 /* Embed Frameworks */;
+                       membershipExceptions = (
+                               StarburstSdk.framework,
+                       );
+               };
+               3F3F144A2ED5AC570038A1C8 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "Example" target */ = {
+                       isa = PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet;
+                       attributesByRelativePath = {
+                               StarburstSdk.framework = (CodeSignOnCopy, RemoveHeadersOnCopy, );
+                       };
+                       buildPhase = 3F3F14492ED5AC570038A1C8 /* Embed Frameworks */;
+                       membershipExceptions = (
+                               StarburstSdk.framework,
+                       );
+               };
+/* End PBXFileSystemSynchronizedGroupBuildPhaseMembershipExceptionSet section */
+
+/* Begin PBXFileSystemSynchronizedRootGroup section */
+               3F3F01E52ED451920038A1C8 /* Example */ = {
+                       isa = PBXFileSystemSynchronizedRootGroup;
+                       exceptions = (
+                               3F3F01F52ED451930038A1C8 /* Exceptions for "Example" folder in "Example" target */,
+                       );
+                       path = Example;
+                       sourceTree = "<group>";
+               };
+               3F3F13E42ED5A8C10038A1C8 /* DeepChordsSdk */ = {
+                       isa = PBXFileSystemSynchronizedRootGroup;
+                       exceptions = (
+                               3F3F14462ED5AC420038A1C8 /* Exceptions for "DeepChordsSdk" folder in "Example" target */,
+                               3F3F144A2ED5AC570038A1C8 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "Example" target */,
+                               3F3F14442ED5AC240038A1C8 /* Exceptions for "DeepChordsSdk" folder in "Embed Frameworks" phase from "DeepChordsSdk" target */,
+                       );
+                       path = DeepChordsSdk;
+                       sourceTree = "<group>";
+               };
+/* End PBXFileSystemSynchronizedRootGroup section */
+
+/* Begin PBXFrameworksBuildPhase section */
+               3F3F01E02ED451920038A1C8 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               3F3F14032ED5A9A50038A1C8 /* DeepChordsSdk.framework in Frameworks */,
+                               6A05823333B2C2EB854DC2D7 /* Pods_Example.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3F3F13E02ED5A8C10038A1C8 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               111E0F1C572CCDE29D292F2C /* Pods_DeepChordsSdk.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+               3F3F01DA2ED451920038A1C8 = {
+                       isa = PBXGroup;
+                       children = (
+                               3F3F01E52ED451920038A1C8 /* Example */,
+                               3F3F13E42ED5A8C10038A1C8 /* DeepChordsSdk */,
+                               3F3F01E42ED451920038A1C8 /* Products */,
+                               CC7A28DFCD6405C009EC973C /* Pods */,
+                               C0F54FE5A9CB8F871597A553 /* Frameworks */,
+                       );
+                       sourceTree = "<group>";
+               };
+               3F3F01E42ED451920038A1C8 /* Products */ = {
+                       isa = PBXGroup;
+                       children = (
+                               3F3F01E32ED451920038A1C8 /* Example.app */,
+                               3F3F13E32ED5A8C10038A1C8 /* DeepChordsSdk.framework */,
+                       );
+                       name = Products;
+                       sourceTree = "<group>";
+               };
+               C0F54FE5A9CB8F871597A553 /* Frameworks */ = {
+                       isa = PBXGroup;
+                       children = (
+                               7BA0D452D1F1A03B9DE590FF /* Pods_Example.framework */,
+                               A3D9D4F11FC88844BFEAE4C3 /* Pods_DeepChordsSdk.framework */,
+                       );
+                       name = Frameworks;
+                       sourceTree = "<group>";
+               };
+               CC7A28DFCD6405C009EC973C /* Pods */ = {
+                       isa = PBXGroup;
+                       children = (
+                               55108288A4959871FAF7AC5F /* Pods-Example.debug.xcconfig */,
+                               6A0C11EDFE570E63DB17064A /* Pods-Example.release.xcconfig */,
+                               C91EC257243FCFD24EEE8863 /* Pods-DeepChordsSdk.debug.xcconfig */,
+                               23C20F392C077DCC8875F909 /* Pods-DeepChordsSdk.release.xcconfig */,
+                       );
+                       name = Pods;
+                       path = ../Pods;
+                       sourceTree = "<group>";
+               };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+               3F3F13DE2ED5A8C10038A1C8 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+               3F3F01E22ED451920038A1C8 /* Example */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 3F3F01F62ED451930038A1C8 /* Build configuration list for PBXNativeTarget "Example" */;
+                       buildPhases = (
+                               920C714DEF2228CDD463DAA2 /* [CP] Check Pods Manifest.lock */,
+                               3F3F01DF2ED451920038A1C8 /* Sources */,
+                               3F3F01E02ED451920038A1C8 /* Frameworks */,
+                               3F3F01E12ED451920038A1C8 /* Resources */,
+                               31C287F34CEEBF9AF3C42349 /* [CP] Embed Pods Frameworks */,
+                               3F3F14492ED5AC570038A1C8 /* Embed Frameworks */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       fileSystemSynchronizedGroups = (
+                               3F3F01E52ED451920038A1C8 /* Example */,
+                       );
+                       name = Example;
+                       productName = Example;
+                       productReference = 3F3F01E32ED451920038A1C8 /* Example.app */;
+                       productType = "com.apple.product-type.application";
+               };
+               3F3F13E22ED5A8C10038A1C8 /* DeepChordsSdk */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 3F3F13EB2ED5A8C10038A1C8 /* Build configuration list for PBXNativeTarget "DeepChordsSdk" */;
+                       buildPhases = (
+                               8D997A91CC5B5810A80A417F /* [CP] Check Pods Manifest.lock */,
+                               3F3F13DE2ED5A8C10038A1C8 /* Headers */,
+                               3F3F13DF2ED5A8C10038A1C8 /* Sources */,
+                               3F3F13E02ED5A8C10038A1C8 /* Frameworks */,
+                               3F3F13E12ED5A8C10038A1C8 /* Resources */,
+                               3F3F14432ED5AC240038A1C8 /* Embed Frameworks */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       fileSystemSynchronizedGroups = (
+                               3F3F13E42ED5A8C10038A1C8 /* DeepChordsSdk */,
+                       );
+                       name = DeepChordsSdk;
+                       productName = DeepChordsSdk;
+                       productReference = 3F3F13E32ED5A8C10038A1C8 /* DeepChordsSdk.framework */;
+                       productType = "com.apple.product-type.framework";
+               };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+               3F3F01DB2ED451920038A1C8 /* Project object */ = {
+                       isa = PBXProject;
+                       attributes = {
+                               BuildIndependentTargetsInParallel = 1;
+                               LastSwiftUpdateCheck = 1640;
+                               LastUpgradeCheck = 1640;
+                               TargetAttributes = {
+                                       3F3F01E22ED451920038A1C8 = {
+                                               CreatedOnToolsVersion = 16.4;
+                                       };
+                                       3F3F13E22ED5A8C10038A1C8 = {
+                                               CreatedOnToolsVersion = 16.4;
+                                       };
+                               };
+                       };
+                       buildConfigurationList = 3F3F01DE2ED451920038A1C8 /* Build configuration list for PBXProject "Example" */;
+                       developmentRegion = en;
+                       hasScannedForEncodings = 0;
+                       knownRegions = (
+                               en,
+                               Base,
+                       );
+                       mainGroup = 3F3F01DA2ED451920038A1C8;
+                       minimizedProjectReferenceProxies = 1;
+                       preferredProjectObjectVersion = 77;
+                       productRefGroup = 3F3F01E42ED451920038A1C8 /* Products */;
+                       projectDirPath = "";
+                       projectRoot = "";
+                       targets = (
+                               3F3F01E22ED451920038A1C8 /* Example */,
+                               3F3F13E22ED5A8C10038A1C8 /* DeepChordsSdk */,
+                       );
+               };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+               3F3F01E12ED451920038A1C8 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3F3F13E12ED5A8C10038A1C8 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+               31C287F34CEEBF9AF3C42349 /* [CP] Embed Pods Frameworks */ = {
+                       isa = PBXShellScriptBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       inputFileListPaths = (
+                               "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+                       );
+                       inputPaths = (
+                       );
+                       name = "[CP] Embed Pods Frameworks";
+                       outputFileListPaths = (
+                               "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+                       );
+                       outputPaths = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+                       shellPath = /bin/sh;
+                       shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh\"\n";
+                       showEnvVarsInLog = 0;
+               };
+               8D997A91CC5B5810A80A417F /* [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-DeepChordsSdk-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;
+               };
+               920C714DEF2228CDD463DAA2 /* [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-Example-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 */
+               3F3F01DF2ED451920038A1C8 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3F3F13DF2ED5A8C10038A1C8 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+               3F3F01F72ED451930038A1C8 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 55108288A4959871FAF7AC5F /* Pods-Example.debug.xcconfig */;
+                       buildSettings = {
+                               ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+                               ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+                               CODE_SIGN_STYLE = Automatic;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DEVELOPMENT_TEAM = G23X75CJ67;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(PROJECT_DIR)/DeepChordsSdk",
+                               );
+                               GENERATE_INFOPLIST_FILE = YES;
+                               INFOPLIST_FILE = Example/Info.plist;
+                               INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "使用蓝牙哦";
+                               INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+                               INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+                               INFOPLIST_KEY_UIMainStoryboardFile = Main;
+                               INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+                               INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+                               IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                               );
+                               MARKETING_VERSION = 1.0;
+                               OTHER_LDFLAGS = (
+                                       "$(inherited)",
+                                       "-l\"icucore\"",
+                                       "-l\"swiftCoreGraphics\"",
+                                       "-framework",
+                                       "\"CFNetwork\"",
+                                       "-framework",
+                                       "\"Combine\"",
+                                       "-framework",
+                                       "\"IQKeyboardCore\"",
+                                       "-framework",
+                                       "\"IQKeyboardManagerSwift\"",
+                                       "-framework",
+                                       "\"IQKeyboardNotification\"",
+                                       "-framework",
+                                       "\"IQKeyboardReturnManager\"",
+                                       "-framework",
+                                       "\"IQKeyboardToolbar\"",
+                                       "-framework",
+                                       "\"IQKeyboardToolbarManager\"",
+                                       "-framework",
+                                       "\"IQTextInputViewNotification\"",
+                                       "-framework",
+                                       "\"IQTextView\"",
+                                       "-framework",
+                                       "\"QuartzCore\"",
+                                       "-framework",
+                                       "\"Security\"",
+                                       "-framework",
+                                       "\"SnapKit\"",
+                                       "-framework",
+                                       "\"SocketRocket\"",
+                                       "-framework",
+                                       "\"Toast_Swift\"",
+                                       "-framework",
+                                       "\"UIKit\"",
+                                       "-ObjC",
+                               );
+                               PRODUCT_BUNDLE_IDENTIFIER = deepchords.guchuandao.Example;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                               SWIFT_EMIT_LOC_STRINGS = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                       };
+                       name = Debug;
+               };
+               3F3F01F82ED451930038A1C8 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 6A0C11EDFE570E63DB17064A /* Pods-Example.release.xcconfig */;
+                       buildSettings = {
+                               ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+                               ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+                               CODE_SIGN_STYLE = Automatic;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DEVELOPMENT_TEAM = G23X75CJ67;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(PROJECT_DIR)/DeepChordsSdk",
+                               );
+                               GENERATE_INFOPLIST_FILE = YES;
+                               INFOPLIST_FILE = Example/Info.plist;
+                               INFOPLIST_KEY_NSBluetoothAlwaysUsageDescription = "使用蓝牙哦";
+                               INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+                               INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+                               INFOPLIST_KEY_UIMainStoryboardFile = Main;
+                               INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+                               INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+                               IPHONEOS_DEPLOYMENT_TARGET = 15.6;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                               );
+                               MARKETING_VERSION = 1.0;
+                               OTHER_LDFLAGS = (
+                                       "$(inherited)",
+                                       "-l\"icucore\"",
+                                       "-l\"swiftCoreGraphics\"",
+                                       "-framework",
+                                       "\"CFNetwork\"",
+                                       "-framework",
+                                       "\"Combine\"",
+                                       "-framework",
+                                       "\"IQKeyboardCore\"",
+                                       "-framework",
+                                       "\"IQKeyboardManagerSwift\"",
+                                       "-framework",
+                                       "\"IQKeyboardNotification\"",
+                                       "-framework",
+                                       "\"IQKeyboardReturnManager\"",
+                                       "-framework",
+                                       "\"IQKeyboardToolbar\"",
+                                       "-framework",
+                                       "\"IQKeyboardToolbarManager\"",
+                                       "-framework",
+                                       "\"IQTextInputViewNotification\"",
+                                       "-framework",
+                                       "\"IQTextView\"",
+                                       "-framework",
+                                       "\"QuartzCore\"",
+                                       "-framework",
+                                       "\"Security\"",
+                                       "-framework",
+                                       "\"SnapKit\"",
+                                       "-framework",
+                                       "\"SocketRocket\"",
+                                       "-framework",
+                                       "\"Toast_Swift\"",
+                                       "-framework",
+                                       "\"UIKit\"",
+                                       "-ObjC",
+                               );
+                               PRODUCT_BUNDLE_IDENTIFIER = deepchords.guchuandao.Example;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                               SWIFT_EMIT_LOC_STRINGS = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                       };
+                       name = Release;
+               };
+               3F3F01F92ED451930038A1C8 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+                               CLANG_ANALYZER_NONNULL = YES;
+                               CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+                               CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+                               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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+                               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;
+                               ENABLE_USER_SCRIPT_SANDBOXING = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu17;
+                               GCC_DYNAMIC_NO_PIC = NO;
+                               GCC_NO_COMMON_BLOCKS = YES;
+                               GCC_OPTIMIZATION_LEVEL = 0;
+                               GCC_PREPROCESSOR_DEFINITIONS = (
+                                       "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 = 18.5;
+                               LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+                               MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+                               MTL_FAST_MATH = YES;
+                               ONLY_ACTIVE_ARCH = YES;
+                               SDKROOT = iphoneos;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+                               SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+                       };
+                       name = Debug;
+               };
+               3F3F01FA2ED451930038A1C8 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+                               CLANG_ANALYZER_NONNULL = YES;
+                               CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+                               CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+                               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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+                               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;
+                               ENABLE_USER_SCRIPT_SANDBOXING = YES;
+                               GCC_C_LANGUAGE_STANDARD = gnu17;
+                               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 = 18.5;
+                               LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+                               MTL_ENABLE_DEBUG_INFO = NO;
+                               MTL_FAST_MATH = YES;
+                               SDKROOT = iphoneos;
+                               SWIFT_COMPILATION_MODE = wholemodule;
+                               VALIDATE_PRODUCT = YES;
+                       };
+                       name = Release;
+               };
+               3F3F13EC2ED5A8C10038A1C8 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = C91EC257243FCFD24EEE8863 /* Pods-DeepChordsSdk.debug.xcconfig */;
+                       buildSettings = {
+                               BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+                               CODE_SIGN_STYLE = Automatic;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DEAD_CODE_STRIPPING = NO;
+                               DEVELOPMENT_TEAM = 5AR46VFCJA;
+                               DYLIB_COMPATIBILITY_VERSION = 1;
+                               DYLIB_CURRENT_VERSION = 1;
+                               DYLIB_INSTALL_NAME_BASE = "@rpath";
+                               ENABLE_MODULE_VERIFIER = YES;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(PROJECT_DIR)/DeepChordsSdk",
+                               );
+                               GENERATE_INFOPLIST_FILE = YES;
+                               INFOPLIST_KEY_NSHumanReadableCopyright = "";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MACH_O_TYPE = staticlib;
+                               MARKETING_VERSION = 1.0;
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+                               OTHER_LDFLAGS = (
+                                       "$(inherited)",
+                                       "-l\"icucore\"",
+                                       "-framework",
+                                       "\"CFNetwork\"",
+                                       "-framework",
+                                       "\"Security\"",
+                                       "-framework",
+                                       "\"SocketRocket\"",
+                                       "-ObjC",
+                               );
+                               PRODUCT_BUNDLE_IDENTIFIER = demo.DeepChordsSdk;
+                               PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+                               SKIP_INSTALL = YES;
+                               SWIFT_EMIT_LOC_STRINGS = YES;
+                               SWIFT_INSTALL_MODULE = YES;
+                               SWIFT_INSTALL_OBJC_HEADER = NO;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               3F3F13ED2ED5A8C10038A1C8 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 23C20F392C077DCC8875F909 /* Pods-DeepChordsSdk.release.xcconfig */;
+                       buildSettings = {
+                               BUILD_LIBRARY_FOR_DISTRIBUTION = YES;
+                               CODE_SIGN_STYLE = Automatic;
+                               CURRENT_PROJECT_VERSION = 1;
+                               DEAD_CODE_STRIPPING = NO;
+                               DEVELOPMENT_TEAM = 5AR46VFCJA;
+                               DYLIB_COMPATIBILITY_VERSION = 1;
+                               DYLIB_CURRENT_VERSION = 1;
+                               DYLIB_INSTALL_NAME_BASE = "@rpath";
+                               ENABLE_MODULE_VERIFIER = YES;
+                               FRAMEWORK_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "$(PROJECT_DIR)/DeepChordsSdk",
+                               );
+                               GENERATE_INFOPLIST_FILE = YES;
+                               INFOPLIST_KEY_NSHumanReadableCopyright = "";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MACH_O_TYPE = staticlib;
+                               MARKETING_VERSION = 1.0;
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
+                               MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
+                               OTHER_LDFLAGS = (
+                                       "$(inherited)",
+                                       "-l\"icucore\"",
+                                       "-framework",
+                                       "\"CFNetwork\"",
+                                       "-framework",
+                                       "\"Security\"",
+                                       "-framework",
+                                       "\"SocketRocket\"",
+                                       "-ObjC",
+                               );
+                               PRODUCT_BUNDLE_IDENTIFIER = demo.DeepChordsSdk;
+                               PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
+                               SKIP_INSTALL = YES;
+                               SWIFT_EMIT_LOC_STRINGS = YES;
+                               SWIFT_INSTALL_MODULE = YES;
+                               SWIFT_INSTALL_OBJC_HEADER = NO;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+               3F3F01DE2ED451920038A1C8 /* Build configuration list for PBXProject "Example" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               3F3F01F92ED451930038A1C8 /* Debug */,
+                               3F3F01FA2ED451930038A1C8 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               3F3F01F62ED451930038A1C8 /* Build configuration list for PBXNativeTarget "Example" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               3F3F01F72ED451930038A1C8 /* Debug */,
+                               3F3F01F82ED451930038A1C8 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               3F3F13EB2ED5A8C10038A1C8 /* Build configuration list for PBXNativeTarget "DeepChordsSdk" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               3F3F13EC2ED5A8C10038A1C8 /* Debug */,
+                               3F3F13ED2ED5A8C10038A1C8 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+/* End XCConfigurationList section */
+       };
+       rootObject = 3F3F01DB2ED451920038A1C8 /* Project object */;
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644 (file)
index 0000000..919434a
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/xcshareddata/xcschemes/DeepChordsSdk.xcscheme b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example.xcodeproj/xcshareddata/xcschemes/DeepChordsSdk.xcscheme
new file mode 100644 (file)
index 0000000..75f652e
--- /dev/null
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Scheme
+   LastUpgradeVersion = "1640"
+   version = "1.7">
+   <BuildAction
+      parallelizeBuildables = "YES"
+      buildImplicitDependencies = "YES"
+      buildArchitectures = "Automatic">
+      <BuildActionEntries>
+         <BuildActionEntry
+            buildForTesting = "YES"
+            buildForRunning = "YES"
+            buildForProfiling = "YES"
+            buildForArchiving = "YES"
+            buildForAnalyzing = "YES">
+            <BuildableReference
+               BuildableIdentifier = "primary"
+               BlueprintIdentifier = "3F3F13E22ED5A8C10038A1C8"
+               BuildableName = "DeepChordsSdk.framework"
+               BlueprintName = "DeepChordsSdk"
+               ReferencedContainer = "container:Example.xcodeproj">
+            </BuildableReference>
+         </BuildActionEntry>
+      </BuildActionEntries>
+   </BuildAction>
+   <TestAction
+      buildConfiguration = "Debug"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      shouldAutocreateTestPlan = "YES">
+   </TestAction>
+   <LaunchAction
+      buildConfiguration = "Release"
+      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
+      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
+      launchStyle = "0"
+      useCustomWorkingDirectory = "NO"
+      ignoresPersistentStateOnLaunch = "NO"
+      debugDocumentVersioning = "YES"
+      debugServiceExtension = "internal"
+      allowLocationSimulation = "YES">
+   </LaunchAction>
+   <ProfileAction
+      buildConfiguration = "Release"
+      shouldUseLaunchSchemeArgsEnv = "YES"
+      savedToolIdentifier = ""
+      useCustomWorkingDirectory = "NO"
+      debugDocumentVersioning = "YES">
+      <MacroExpansion>
+         <BuildableReference
+            BuildableIdentifier = "primary"
+            BlueprintIdentifier = "3F3F13E22ED5A8C10038A1C8"
+            BuildableName = "DeepChordsSdk.framework"
+            BlueprintName = "DeepChordsSdk"
+            ReferencedContainer = "container:Example.xcodeproj">
+         </BuildableReference>
+      </MacroExpansion>
+   </ProfileAction>
+   <AnalyzeAction
+      buildConfiguration = "Debug">
+   </AnalyzeAction>
+   <ArchiveAction
+      buildConfiguration = "Release"
+      revealArchiveInOrganizer = "YES">
+   </ArchiveAction>
+</Scheme>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644 (file)
index 0000000..eb87897
--- /dev/null
@@ -0,0 +1,11 @@
+{
+  "colors" : [
+    {
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644 (file)
index 0000000..2305880
--- /dev/null
@@ -0,0 +1,35 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "dark"
+        }
+      ],
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    },
+    {
+      "appearances" : [
+        {
+          "appearance" : "luminosity",
+          "value" : "tinted"
+        }
+      ],
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/Contents.json b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Assets.xcassets/Contents.json
new file mode 100644 (file)
index 0000000..73c0059
--- /dev/null
@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Base.lproj/LaunchScreen.storyboard b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Base.lproj/LaunchScreen.storyboard
new file mode 100644 (file)
index 0000000..865e932
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+</document>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Base.lproj/Main.storyboard b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Base.lproj/Main.storyboard
new file mode 100644 (file)
index 0000000..25a7638
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="tne-QT-ifu">
+            <objects>
+                <viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="target" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
+            </objects>
+        </scene>
+    </scenes>
+</document>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/Info.plist
new file mode 100644 (file)
index 0000000..87b8afa
--- /dev/null
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>UIApplicationSceneManifest</key>
+       <dict>
+               <key>UIApplicationSupportsMultipleScenes</key>
+               <false/>
+               <key>UISceneConfigurations</key>
+               <dict>
+                       <key>UIWindowSceneSessionRoleApplication</key>
+                       <array>
+                               <dict>
+                                       <key>UISceneConfigurationName</key>
+                                       <string>Default Configuration</string>
+                                       <key>UISceneDelegateClassName</key>
+                                       <string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
+                                       <key>UISceneStoryboardFile</key>
+                                       <string>Main</string>
+                               </dict>
+                       </array>
+               </dict>
+       </dict>
+       <key>NSAppTransportSecurity</key>
+       <dict>
+               <key>NSAllowsArbitraryLoads</key>
+               <true/>
+       </dict>
+       <key>CFBundleDisplayName</key>
+       <string>骨传导sdk</string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/App.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/App.swift
new file mode 100644 (file)
index 0000000..9657628
--- /dev/null
@@ -0,0 +1,50 @@
+//
+//  App.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/25.
+//
+import UIKit
+class App{
+    static let shared = App()
+    var window:UIWindow?
+    
+    func topVC()->UIViewController!{
+        guard let vc = window?.rootViewController else{
+            return UIViewController()
+        }
+        return getTopViewController(from: vc)
+    }
+   
+    func popToViewController(_ vc:UIViewController){
+        let vcs = topVC().navigationController?.viewControllers ?? []
+        for item in vcs {
+            if vc == item {
+                topVC().navigationController?.popToViewController(item, animated: true)
+            }
+        }
+    }
+    func popToPage(num:Int){
+        guard let vcs = topVC().navigationController?.viewControllers else{
+            return
+        }
+        let index = vcs.count - num - 1
+        if vcs.count > index {
+            topVC().navigationController?.popToViewController(vcs[index], animated: true)
+        }
+    }
+
+}
+extension App{
+    private func getTopViewController(from vc: UIViewController) -> UIViewController {
+        if let navVC = vc as? UINavigationController {
+            return getTopViewController(from: navVC.visibleViewController ?? navVC)
+        } else if let tabVC = vc as? UITabBarController {
+            return getTopViewController(from: tabVC.selectedViewController ?? tabVC)
+        } else if let presentedVC = vc.presentedViewController {
+            return getTopViewController(from: presentedVC)
+        } else {
+            return vc
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/AppDelegate.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/AppDelegate.swift
new file mode 100644 (file)
index 0000000..6c46981
--- /dev/null
@@ -0,0 +1,36 @@
+//
+//  AppDelegate.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import UIKit
+
+@main
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+
+
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+        // Override point for customization after application launch.
+        return true
+    }
+
+    // MARK: UISceneSession Lifecycle
+
+    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
+        // Called when a new scene session is being created.
+        // Use this method to select a configuration to create the new scene with.
+        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
+    }
+
+    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
+        // Called when the user discards a scene session.
+        // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+        // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+    }
+
+
+}
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/BaseVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/BaseVC.swift
new file mode 100644 (file)
index 0000000..ec48eee
--- /dev/null
@@ -0,0 +1,54 @@
+//
+//  BaseVC.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import UIKit
+class BaseVC: UIViewController {
+    let logBtn = UIButton(type: .custom)
+    let sdklogBtn = UIButton(type: .custom)
+    deinit {
+        print("\(Self.self) 销毁")
+    }
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        self.view.backgroundColor = .white
+        
+        
+        logBtn.frame = CGRect(x:  UIScreen.main.bounds.size.width - 80, y: 200, width:60, height: 60)
+        logBtn.backgroundColor = .blue
+        logBtn.layer.cornerRadius = 30
+        logBtn.layer.masksToBounds = true
+        logBtn.setTitle("log1", for: .normal)
+        logBtn.addTarget(self, action: #selector(logAction), for: .touchUpInside)
+        self.view.addSubview(logBtn)
+        
+        sdklogBtn.frame = CGRect(x:  UIScreen.main.bounds.size.width - 80, y: 300, width:60, height: 60)
+        sdklogBtn.backgroundColor = .blue
+        sdklogBtn.layer.cornerRadius = 30
+        sdklogBtn.layer.masksToBounds = true
+        sdklogBtn.setTitle("log sdk", for: .normal)
+        sdklogBtn.addTarget(self, action: #selector(sdkAction), for: .touchUpInside)
+        self.view.addSubview(sdklogBtn)
+    }
+
+    
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+        self.view.bringSubviewToFront(logBtn)
+        self.view.bringSubviewToFront(sdklogBtn)
+    }
+    
+    @objc func logAction(){
+        //        OpusDemo.shared.start()
+        //        return
+        let vc = LogVC()
+        navigationController?.pushViewController(vc, animated: true)
+    }
+    @objc func sdkAction(){
+        let vc = SdkLogVC()
+        navigationController?.pushViewController(vc, animated: true)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/DeviceListVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/DeviceListVC.swift
new file mode 100644 (file)
index 0000000..8cc78b1
--- /dev/null
@@ -0,0 +1,63 @@
+//
+//  DeviceListVC.swift
+//  IOT
+//
+//  Created by liangshi on 2025/4/9.
+//
+
+import UIKit
+import SnapKit
+import CoreBluetooth
+class DeviceListVC: BaseVC{
+    let tableView = UITableView(frame: .zero, style: .plain)
+    var list:[CBPeripheral] = [ ]
+    var didSelectedCallback: ((CBPeripheral) -> Void)?
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        // Do any additional setup after loading the view.
+        
+        setupViews()
+        setupBle()
+    }
+    
+    func setupViews(){
+        self.title = "扫描"
+        
+        tableView.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)
+        tableView.delegate = self
+        tableView.dataSource = self
+        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
+        view.addSubview(tableView)
+    }
+    func setupBle(){
+        BleManager.shared.startScanDevice()
+        BleManager.shared.discoverDeviceCallback = {[weak self] devices in
+            self?.list = devices
+            self?.tableView.reloadData()
+        }
+        BleManager.shared.didConnectDeviceCallback = { [weak self] de in
+            self?.navigationController?.popViewController(animated: true)
+        }
+    }
+}
+
+extension DeviceListVC:UITableViewDelegate,UITableViewDataSource {
+    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
+        return 60
+    }
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return list.count
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
+        cell.textLabel?.text = list[indexPath.row].name
+        
+        return cell
+    }
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        let data = list[indexPath.row]
+        didSelectedCallback?(data)
+        BleManager.shared.stopScanDevice()
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/HomeVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/HomeVC.swift
new file mode 100644 (file)
index 0000000..6daa043
--- /dev/null
@@ -0,0 +1,122 @@
+//
+//  Untitled.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+
+import UIKit
+import SnapKit
+import DeepChordsSdk
+import Toast_Swift
+class HomeVC: BaseVC{
+    let list:[(name:String,action:String)] = [
+        ("获取电量","batteryAction"),
+        ("获取软件版本","softVersionAction"),
+        ("获取硬件版本","hardVersionAction"),
+    ]
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        // Do any additional setup after loading the view.
+        
+        setupViews()
+        setupSdk()
+        setupBle()
+    }
+    
+    func setupViews(){
+        self.title = "设备鉴权+设备采集音频"
+        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "扫描", style: .done, target: self, action: #selector(scanAction))
+        
+        let tableView = UITableView(frame: CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height), style: .plain)
+        tableView.delegate = self
+        tableView.dataSource = self
+        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
+        view.addSubview(tableView)
+    }
+}
+
+extension HomeVC:UITableViewDelegate,UITableViewDataSource {
+    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
+        return 60
+    }
+    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
+        return list.count
+    }
+    
+    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
+        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
+        cell.textLabel?.text = list[indexPath.row].name
+        
+        return cell
+    }
+    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
+        let data = list[indexPath.row]
+        let action = Selector(data.action)
+        self.perform(action)
+    }
+}
+
+extension HomeVC{
+    @objc func batteryAction(){
+        view.makeToastActivity(.center)
+        DCDevice.shared.getBatery {[weak self] result in
+            self?.view.hideToastActivity()
+           if let (left,right) = result{
+            }
+        }
+    }
+    @objc func softVersionAction(){
+        view.makeToastActivity(.center)
+        DCDevice.shared.getSoftVersion {[weak self] result in
+            self?.view.hideToastActivity()
+            if let version = result{
+            }
+        }
+    }
+    @objc func hardVersionAction(){
+        view.makeToastActivity(.center)
+        DCDevice.shared.getHardVersion {[weak self] result in
+            self?.view.hideToastActivity()
+            if let version = result{
+            }
+        }
+    }
+}
+
+extension HomeVC{
+    func setupSdk(){
+        DeepChordsAiSdk.shared.authCallback = { [weak self] (code,string) in
+            DCLogger.debug("鉴权结果",code,string)
+            if code == 200{
+               
+                App.shared.window?.makeToast("鉴权成功")
+            }
+            else{
+                App.shared.window?.makeToast(string)
+            }
+        }
+    }
+    func setupBle(){
+        let shared = BleManager.shared
+        shared.autoConnect()
+        shared.didConnectDeviceCallback = { p in
+            //蓝牙已经连接
+//            StarburstSdk.shared().bleConnected()
+        }
+        shared.disConnectDeviceCallback = { p in
+            //蓝牙已经断开
+        }
+    }
+    
+    @objc func scanAction(){
+        let scanVC = DeviceListVC()
+        navigationController?.pushViewController(scanVC, animated: true)
+        scanVC.list = BleManager.shared.devices
+        scanVC.didSelectedCallback = { device in
+            BleManager.shared.connectPeripheral(device)
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/LogVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/LogVC.swift
new file mode 100644 (file)
index 0000000..ede1643
--- /dev/null
@@ -0,0 +1,71 @@
+//
+//  LogVC.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import UIKit
+import DeepChordsSdk
+class LogVC: UIViewController {
+    
+    var textView =  UITextView()
+    
+    override func viewDidLoad() {
+        title = "log"
+        view.backgroundColor = .white
+        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "save", style: .done, target: self, action: #selector(shareAction))
+        textView.isEditable = false
+        view.addSubview(textView)
+        textView.frame = CGRectMake(0, 100, view.bounds.size.width, view.bounds.size.height - 100)
+    }
+    
+    override func viewDidAppear(_ animated: Bool) {
+        super.viewDidAppear(animated)
+        
+        textView.text = DCLogger.logs.joined()
+        let range = NSMakeRange(textView.text.count - 1, 1)
+        textView.scrollRangeToVisible(range)
+    }
+    
+    @objc func shareAction() {
+        let formatter = DateFormatter()
+        formatter.dateFormat = "yyyyMMddHHmmss"
+        let name = formatter.string(from: Date())
+        
+        guard let cacheDirectory = FileManager.default.urls(for:.cachesDirectory, in:.userDomainMask).first else {
+            print("无法获取缓存目录")
+            return
+        }
+        // 构建压缩文件路径
+        let filePath = cacheDirectory.appendingPathComponent("DeepChordsSdk_\(name).txt").path
+        
+        let url = URL(fileURLWithPath: filePath)
+        let data = self.textView.text.data(using:.utf8)
+        do {
+            try data?.write(to: url, options:.atomic)
+            print(filePath)
+            self.saveFile(withFilePath: filePath)
+        } catch {
+            print(error)
+        }
+    }
+    
+    func saveFile(withFilePath filePath: String) {
+//        let fUrl = URL(fileURLWithPath: filePath)
+//        let vc = UIDocumentPickerViewController(url: fUrl, in:.exportToService)
+//        vc.delegate = self
+//        vc.modalPresentationStyle = .overFullScreen
+//        self.present(vc, animated: true, completion: nil)
+        
+        let vc = UIActivityViewController(activityItems: [URL(fileURLWithPath: filePath)], applicationActivities: nil)
+        vc.modalPresentationStyle = .overFullScreen
+        App.shared.topVC().present(vc, animated: true)
+    }
+}
+
+extension LogVC:UIDocumentPickerDelegate{
+    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
+        controller.dismiss(animated: true, completion: nil)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SceneDelegate.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SceneDelegate.swift
new file mode 100644 (file)
index 0000000..321585c
--- /dev/null
@@ -0,0 +1,55 @@
+//
+//  SceneDelegate.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import UIKit
+import DeepChordsSdk
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+    var window: UIWindow?
+
+
+    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+        guard let _ = (scene as? UIWindowScene) else { return }
+        App.shared.window = window
+        window?.rootViewController = UINavigationController(rootViewController: HomeVC())
+        DeepChordsAiSdk.shared.initSDK()
+    }
+
+    func sceneDidDisconnect(_ scene: UIScene) {
+        // Called as the scene is being released by the system.
+        // This occurs shortly after the scene enters the background, or when its session is discarded.
+        // Release any resources associated with this scene that can be re-created the next time the scene connects.
+        // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
+    }
+
+    func sceneDidBecomeActive(_ scene: UIScene) {
+        // Called when the scene has moved from an inactive state to an active state.
+        // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
+    }
+
+    func sceneWillResignActive(_ scene: UIScene) {
+        // Called when the scene will move from an active state to an inactive state.
+        // This may occur due to temporary interruptions (ex. an incoming phone call).
+    }
+
+    func sceneWillEnterForeground(_ scene: UIScene) {
+        // Called as the scene transitions from the background to the foreground.
+        // Use this method to undo the changes made on entering the background.
+    }
+
+    func sceneDidEnterBackground(_ scene: UIScene) {
+        // Called as the scene transitions from the foreground to the background.
+        // Use this method to save data, release shared resources, and store enough scene-specific state information
+        // to restore the scene back to its current state.
+    }
+
+
+}
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SdkLogVC.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/SdkLogVC.swift
new file mode 100644 (file)
index 0000000..da29f19
--- /dev/null
@@ -0,0 +1,65 @@
+//
+//  SdkLogVC.swift
+//  Example
+//
+//  Created by lianzi on 2025/11/28.
+//
+
+import UIKit
+import DeepChordsSdk
+class SdkLogVC: UIViewController {
+    
+    var textView =  UITextView()
+    
+    override func viewDidLoad() {
+        title = "log"
+        view.backgroundColor = .white
+        self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "save", style: .done, target: self, action: #selector(shareAction))
+        textView.isEditable = false
+        view.addSubview(textView)
+        textView.frame = CGRectMake(0, 100, view.bounds.size.width, view.bounds.size.height - 100)
+    }
+    
+    override func viewDidAppear(_ animated: Bool) {
+        super.viewDidAppear(animated)
+        
+        textView.text = try! String(contentsOfFile: DeepChordsAiSdk.shared.sdkLog, encoding: .utf8)
+        let range = NSMakeRange(textView.text.count - 1, 1)
+        textView.scrollRangeToVisible(range)
+    }
+    
+    @objc func shareAction() {
+        let formatter = DateFormatter()
+        formatter.dateFormat = "yyyyMMddHHmmss"
+        let name = formatter.string(from: Date())
+        
+        let filePath = "\(NSHomeDirectory())/Documents/DeepChordsSdk_\(name).txt"
+        let url = URL(fileURLWithPath: filePath)
+        let data = self.textView.text.data(using:.utf8)
+        do {
+            try data?.write(to: url, options:.atomic)
+            print(filePath)
+            self.saveFile(withFilePath: filePath)
+        } catch {
+            print(error)
+        }
+    }
+    
+    func saveFile(withFilePath filePath: String) {
+        let fUrl = URL(fileURLWithPath: filePath)
+        let vc = UIDocumentPickerViewController(url: fUrl, in:.exportToService)
+        vc.delegate = self
+        vc.modalPresentationStyle = .overFullScreen
+        self.present(vc, animated: true, completion: nil)
+        
+//        let vc = UIActivityViewController(activityItems: [URL(fileURLWithPath: filePath)], applicationActivities: nil)
+//        vc.modalPresentationStyle = .overFullScreen
+//        App.shared.topVC().present(vc, animated: true)
+    }
+}
+
+extension SdkLogVC:UIDocumentPickerDelegate{
+    func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
+        controller.dismiss(animated: true, completion: nil)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/ViewController.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/VC/ViewController.swift
new file mode 100644 (file)
index 0000000..6e8ba17
--- /dev/null
@@ -0,0 +1,21 @@
+//
+//  ViewController.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+import UIKit
+import DeepChordsSdk
+
+class ViewController: UIViewController {
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+        // Do any additional setup after loading the view.
+        
+    }
+
+
+}
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Example/Example/tools/BleManager.swift
new file mode 100644 (file)
index 0000000..508e6c7
--- /dev/null
@@ -0,0 +1,139 @@
+//
+//  BleManager.swift
+//  Example
+//
+//  Created by liangshi on 2025/11/24.
+//
+
+//
+//  Untitled.swift
+//  ShenYin
+//
+//  Created by liangshi on 2025/8/28.
+//
+
+import UIKit
+import CoreBluetooth
+import DeepChordsSdk
+
+class BleManager: NSObject {
+    var discoverDeviceCallback: (([CBPeripheral]) -> Void)?
+    var didConnectDeviceCallback: ((CBPeripheral) -> Void)?
+    var disConnectDeviceCallback: ((CBPeripheral) -> Void)?
+    var conetedFailureCallback: ((CBPeripheral) -> Void)?
+    
+    private var centralManager: CBCentralManager!
+    var devices: [CBPeripheral] = []
+    
+    private override init() {
+        super.init()
+        centralManager = CBCentralManager(delegate: self, queue: nil)
+    }
+    
+    static let shared = BleManager()
+
+    func stopScanDevice() {
+        centralManager.stopScan()
+    }
+    func startScanDevice() {
+        //        centralManager.stopScan()
+        DCLogger.debug("扫描中...")
+        devices = []
+        
+        if let connectedPeripheral = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: "AE30")]).first{
+            devices = [connectedPeripheral]
+        }
+        discoverDeviceCallback?(devices)
+        centralManager.scanForPeripherals(withServices: nil,options: [CBCentralManagerScanOptionAllowDuplicatesKey : false])
+        
+    }
+    func connectPeripheral(_ peripheral: CBPeripheral) {
+        DCLogger.debug("正在连接...",peripheral)
+        centralManager.connect(peripheral, options: [CBConnectPeripheralOptionNotifyOnConnectionKey: true])
+    }
+    func autoConnect(){
+        if let peripheral = centralManager.retrieveConnectedPeripherals(withServices: [CBUUID(string: "AE30")]).first{
+            connectPeripheral(peripheral)
+        }
+    }
+}
+extension BleManager:CBCentralManagerDelegate{
+    func centralManagerDidUpdateState(_ central: CBCentralManager) {
+        DCLogger.debug("蓝牙状态",central.state.rawValue)
+        switch central.state {
+        case.unknown:
+            break
+        case.resetting:
+            break
+        case.unsupported:
+            break
+        case.unauthorized:
+            break
+        case.poweredOff:
+
+            break
+        case.poweredOn:
+            startScanDevice()
+            break
+        @unknown default:
+            break
+        }
+    }
+    
+    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
+        if devices.contains(peripheral) {
+            return
+        }
+        if let name = peripheral.name,name.hasPrefix("AI") {
+            devices.append(peripheral)
+            DCLogger.debug(peripheral)
+            discoverDeviceCallback?(devices)
+        }
+    }
+    
+    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
+        stopScanDevice()
+        DCLogger.debug("蓝牙已连接 \(peripheral)")
+        
+        peripheral.delegate = self
+        peripheral.discoverServices(nil);
+        DCBleManager.shared.centralManager(central, didConnect: peripheral)
+        self.didConnectDeviceCallback?(peripheral)
+        App.shared.window?.makeToast("蓝牙已连接")
+    }
+    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
+        DCBleManager.shared.centralManager(central, didFailToConnect: peripheral, error: error)
+    }
+    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
+        disConnectDeviceCallback?(peripheral)
+        DCBleManager.shared.centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
+        App.shared.window?.makeToast("蓝牙已断开连接")
+    }
+}
+
+extension BleManager: CBPeripheralDelegate {
+    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
+        DCBleManager.shared.peripheral(peripheral, didDiscoverServices: error)
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
+        DCBleManager.shared.peripheral(peripheral, didDiscoverCharacteristicsFor: service, error: error)
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristic: CBCharacteristic, error: (any Error)?) {
+        DCLogger.debug("状态改变 == UUId ",characteristic.uuid)
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
+        DCBleManager.shared.peripheral(peripheral, didUpdateValueFor: characteristic, error: error)
+
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didModifyServices invalidatedServices: [CBService]) {
+        // Accessory's GATT database has updated. Refresh your local cache (if any)
+    }
+    
+    func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: (any Error)?) {
+        
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Podfile.lock b/DeepChordsSdk_iOS/DeepChordsSdk/Podfile.lock
new file mode 100644 (file)
index 0000000..4d306eb
--- /dev/null
@@ -0,0 +1,81 @@
+PODS:
+  - IQKeyboardCore (1.0.5)
+  - IQKeyboardManagerSwift (8.0.1):
+    - IQKeyboardManagerSwift/Appearance (= 8.0.1)
+    - IQKeyboardManagerSwift/Core (= 8.0.1)
+    - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.1)
+    - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.1)
+    - IQKeyboardManagerSwift/IQTextView (= 8.0.1)
+    - IQKeyboardManagerSwift/Resign (= 8.0.1)
+  - IQKeyboardManagerSwift/Appearance (8.0.1):
+    - IQKeyboardManagerSwift/Core
+  - IQKeyboardManagerSwift/Core (8.0.1):
+    - IQKeyboardNotification
+    - IQTextInputViewNotification
+  - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.1):
+    - IQKeyboardReturnManager
+  - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.1):
+    - IQKeyboardManagerSwift/Core
+    - IQKeyboardToolbarManager
+  - IQKeyboardManagerSwift/IQTextView (8.0.1):
+    - IQTextView
+  - IQKeyboardManagerSwift/Resign (8.0.1):
+    - IQKeyboardManagerSwift/Core
+  - IQKeyboardNotification (1.0.3)
+  - IQKeyboardReturnManager (1.0.4):
+    - IQKeyboardCore (= 1.0.5)
+  - IQKeyboardToolbar (1.1.1):
+    - IQKeyboardCore
+    - IQKeyboardToolbar/Core (= 1.1.1)
+  - IQKeyboardToolbar/Core (1.1.1):
+    - IQKeyboardCore
+    - IQKeyboardToolbar/Placeholderable
+  - IQKeyboardToolbar/Placeholderable (1.1.1):
+    - IQKeyboardCore
+  - IQKeyboardToolbarManager (1.1.3):
+    - IQKeyboardToolbar
+    - IQTextInputViewNotification
+  - IQTextInputViewNotification (1.0.8):
+    - IQKeyboardCore
+  - IQTextView (1.0.5):
+    - IQKeyboardToolbar/Placeholderable
+  - SnapKit (5.7.1)
+  - SocketRocket (0.7.1)
+  - Toast-Swift (5.1.1)
+
+DEPENDENCIES:
+  - IQKeyboardManagerSwift
+  - SnapKit (~> 5.7.0)
+  - SocketRocket
+  - Toast-Swift
+
+SPEC REPOS:
+  https://gitee.com/mirrors/CocoaPods-Specs.git:
+    - IQKeyboardCore
+    - IQKeyboardManagerSwift
+    - IQKeyboardNotification
+    - IQKeyboardReturnManager
+    - IQKeyboardToolbar
+    - IQKeyboardToolbarManager
+    - IQTextInputViewNotification
+    - IQTextView
+    - SnapKit
+    - SocketRocket
+    - Toast-Swift
+
+SPEC CHECKSUMS:
+  IQKeyboardCore: 28c8bf3bcd8ba5aa1570b318cbc4da94b861711e
+  IQKeyboardManagerSwift: 835fc9c6e4732398113406d84900ad2e8f141218
+  IQKeyboardNotification: d7382c4466c5a5adef92c7452ebf861b36050088
+  IQKeyboardReturnManager: 972be48528ce9e7508ab3ab15ac7efac803f17f5
+  IQKeyboardToolbar: d4bdccfb78324aec2f3920659c77bb89acd33312
+  IQKeyboardToolbarManager: 6c693c8478d6327a7ef2107528d29698b3514dbb
+  IQTextInputViewNotification: f5e954d8881fd9808b744e49e024cc0d4bcfe572
+  IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
+  SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
+  SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
+  Toast-Swift: 7a03a532afe3a560d4044bc7c237e2864d295173
+
+PODFILE CHECKSUM: 3b64f91d7c4f6c0036af83b3b1ff330c07d705a8
+
+COCOAPODS: 1.16.2
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Assets/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift
new file mode 100644 (file)
index 0000000..a4e8fe6
--- /dev/null
@@ -0,0 +1,41 @@
+//
+//  IQKeyboardConstants.swift
+//  https://github.com/hackiftekhar/IQKeyboardCore
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 Foundation
+
+/**
+ `IQEnableModeDefault`
+ Pick default settings.
+ 
+ `IQEnableModeEnabled`
+ setting is enabled.
+ 
+ `IQEnableModeDisabled`
+ setting is disabled.
+ */
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQEnableMode: Int {
+    case `default`
+    case enabled
+    case disabled
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQKeyboardExtended.swift
new file mode 100644 (file)
index 0000000..24b15d7
--- /dev/null
@@ -0,0 +1,65 @@
+//
+//  IQKeyboardExtended.swift
+//  https://github.com/hackiftekhar/IQKeyboardCore
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+/// Wrapper for IQKeyboardManager compatible types. This type provides an extension point for
+/// convenience methods in IQKeyboardManager.
+@available(iOSApplicationExtension, unavailable)
+public struct IQKeyboardExtension<Base: AnyObject> {
+    public private(set) weak var base: Base?
+    fileprivate init(_ base: Base) {
+        self.base = base
+    }
+}
+
+// swiftlint:disable identifier_name
+/// Represents an object type that is compatible with IQKeyboardManager. You can use `iq` property to get a
+/// value in the namespace of IQKeyboardManager.
+@available(iOSApplicationExtension, unavailable)
+public protocol IQKeyboardExtended {
+    /// Type being extended.
+    associatedtype Base: AnyObject
+
+    /// Instance IQKeyboardManager extension point.
+    @MainActor
+    var iq: IQKeyboardExtension<Base> { get set }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+public extension IQKeyboardExtended where Self: UIView {
+
+    /// Instance IQKeyboardManager extension point.
+    @MainActor
+    var iq: IQKeyboardExtension<Self> {
+        get { IQKeyboardExtension(self) }
+        set {}
+    }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension UIView: IQKeyboardExtended {}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/IQTextInputView.swift
new file mode 100644 (file)
index 0000000..5c1612a
--- /dev/null
@@ -0,0 +1,86 @@
+//
+//  IQTextInputView.swift
+//  https://github.com/hackiftekhar/IQKeyboardCore
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public protocol IQTextInputView where Self: UIView, Self: UITextInputTraits {
+
+    @available(iOS 16.0, *)
+    @objc var iqIsFindInteractionEnabled: Bool { get }
+
+    @available(iOS 16.0, *)
+    @objc var iqFindInteraction: UIFindInteraction? { get }
+
+    @objc var returnKeyType: UIReturnKeyType { get set }
+    @objc var keyboardAppearance: UIKeyboardAppearance { get set }
+
+    @objc var iqIsEnabled: Bool { get }
+
+    @objc var inputAccessoryView: UIView? { get set }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextField: IQTextInputView {
+
+    @available(iOS 16.0, *)
+    public var iqIsFindInteractionEnabled: Bool { false }
+
+    @available(iOS 16.0, *)
+    public var iqFindInteraction: UIFindInteraction? { nil }
+
+    public var iqIsEnabled: Bool { isEnabled }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextView: IQTextInputView {
+    @available(iOS 16.0, *)
+    public var iqIsFindInteractionEnabled: Bool { isFindInteractionEnabled }
+
+    @available(iOS 16.0, *)
+    public var iqFindInteraction: UIFindInteraction? { findInteraction }
+
+    public var iqIsEnabled: Bool { isEditable }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UISearchBar: IQTextInputView {
+
+    @available(iOS 16.0, *)
+    public var iqIsFindInteractionEnabled: Bool { false }
+
+    @available(iOS 16.0, *)
+    public var iqFindInteraction: UIFindInteraction? { nil }
+
+    public var iqIsEnabled: Bool {
+        if #available(iOS 16.4, *) {
+            return isEnabled
+        } else {
+            return searchTextField.isEnabled
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift
new file mode 100644 (file)
index 0000000..f97a484
--- /dev/null
@@ -0,0 +1,168 @@
+//
+//  UIView+Hierarchy.swift
+//  https://github.com/hackiftekhar/IQKeyboardCore
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+/**
+ UIView hierarchy category.
+ */
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+    // MARK: viewControllers
+
+    /**
+     Returns the UIViewController object that manages the receiver.
+     */
+    func viewContainingController() -> UIViewController? {
+
+        var nextResponder: UIResponder? = base
+
+        repeat {
+            nextResponder = nextResponder?.next
+
+            if let viewController: UIViewController = nextResponder as? UIViewController {
+                return viewController
+            }
+
+        } while nextResponder != nil
+
+        return nil
+    }
+
+    @available(*, unavailable, message: "This has been removed because it no longer needed")
+    func topMostController() -> UIViewController? { nil }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+    // MARK: Superviews
+    /**
+     Returns the superView of provided class type.
+
+     @param classType class type of the object which is to be search in above hierarchy and return
+
+     @param belowView view object in upper hierarchy where method should stop searching and return nil
+     */
+    func superviewOf<T: UIView>(type classType: T.Type, belowView: UIView? = nil) -> T? {
+
+        var superView: UIView? = base?.superview
+
+        while let aSuperview: UIView = superView {
+
+            if aSuperview.isKind(of: classType) {
+
+                // If it's UIScrollView, then validating for special cases
+                if aSuperview is UIScrollView {
+
+                    let classNameString: String = "\(type(of: aSuperview.self))"
+
+                    // If it's not UITableViewWrapperView class,
+                    // this is internal class which is actually manage in UITableview.
+                    // The speciality of this class is that it's superview is UITableView.
+                    // If it's not UITableViewCellScrollView class,
+                    // this is internal class which is actually manage in UITableviewCell.
+                    // The speciality of this class is that it's superview is UITableViewCell.
+                    // If it's not _UIQueuingScrollView class,
+                    // actually we validate for _ prefix which usually used by Apple internal classes
+                    if !(aSuperview.superview is UITableView),
+                       !(aSuperview.superview is UITableViewCell),
+                       !classNameString.hasPrefix("_") {
+                        return superView as? T
+                    }
+                } else {
+                    return superView as? T
+                }
+            } else if aSuperview == belowView {
+                return nil
+            }
+
+            superView = aSuperview.superview
+        }
+
+        return nil
+    }
+
+    // MARK: Special TextFields
+
+    /**
+     Returns searchBar if receiver object is UISearchBarTextField, otherwise return nil.
+     */
+    func textFieldSearchBar() -> UISearchBar? {
+
+        var responder: UIResponder? = base?.next
+
+        while let bar: UIResponder = responder {
+
+            if let searchBar: UISearchBar = bar as? UISearchBar {
+                return searchBar
+            } else if bar is UIViewController {
+                break
+            }
+
+            responder = bar.next
+        }
+
+        return nil
+    }
+
+    /**
+     Returns YES if the receiver object is UIAlertSheetTextField, otherwise return NO.
+     */
+    func isAlertViewTextField() -> Bool {
+
+        var alertViewController: UIResponder? = viewContainingController()
+
+        var isAlertViewTextField: Bool = false
+
+        while let controller: UIResponder = alertViewController, !isAlertViewTextField {
+
+            if controller is UIAlertController {
+                isAlertViewTextField = true
+                break
+            }
+
+            alertViewController = controller.next
+        }
+
+        return isAlertViewTextField
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+    @available(*, unavailable, renamed: "iq.viewContainingController()")
+    func viewContainingController() -> UIViewController? { nil }
+
+    @available(*, unavailable, message: "This has been removed because it no longer needed")
+    func topMostController() -> UIViewController? { nil }
+
+    @available(*, unavailable, renamed: "iq.superviewOf(type:belowView:)")
+    func superviewOfClassType(_ classType: UIView.Type, belowView: UIView? = nil) -> UIView? { nil }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/LICENSE
new file mode 100644 (file)
index 0000000..5d8eb96
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardCore/README.md
new file mode 100644 (file)
index 0000000..620ea83
--- /dev/null
@@ -0,0 +1,29 @@
+# IQKeyboardCore
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardCore.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardCore)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardCore.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardCore)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardCore is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardCore'
+```
+
+## Author
+
+hackiftekhar, ideviftekhar@gmail.com
+
+## License
+
+IQKeyboardCore is available under the MIT license. See the LICENSE file for more info.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift
new file mode 100644 (file)
index 0000000..49de03b
--- /dev/null
@@ -0,0 +1,43 @@
+//
+//  IQKeyboardAppearanceConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardAppearanceConfiguration: NSObject {
+
+    /**
+    Override the keyboardAppearance for all textInputView. Default is NO.
+    */
+    public var overrideAppearance: Bool = false
+
+    /**
+    If overrideKeyboardAppearance is YES, then all the textInputView keyboardAppearance is set using this property.
+    */
+    public var appearance: UIKeyboardAppearance = .default
+}
+
+@available(*, unavailable, renamed: "IQKeyboardAppearanceConfiguration")
+@MainActor
+@objcMembers public final class IQKeyboardConfiguration: NSObject {}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift
new file mode 100644 (file)
index 0000000..fd475c0
--- /dev/null
@@ -0,0 +1,50 @@
+//
+//  IQKeyboardAppearanceManager+Internal.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardAppearanceManager {
+
+    func removeTextInputViewObserver() {
+        textInputViewObserver.unsubscribe(identifier: "IQKeyboardAppearanceManager")
+    }
+
+    func addTextInputViewObserver() {
+        textInputViewObserver.subscribe(identifier: "IQKeyboardAppearanceManager",
+                                        changeHandler: { [weak self] event, textInputView in
+            guard let self = self else { return }
+            switch event {
+            case .beginEditing:
+                guard self.keyboardConfiguration.overrideAppearance,
+                      textInputView.keyboardAppearance != self.keyboardConfiguration.appearance else { return }
+
+                textInputView.keyboardAppearance = self.keyboardConfiguration.appearance
+                textInputView.reloadInputViews()
+            case .endEditing:
+                break
+            }
+        })
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift
new file mode 100644 (file)
index 0000000..4a6fdaa
--- /dev/null
@@ -0,0 +1,44 @@
+//
+//  IQKeyboardAppearanceManager.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQTextInputViewNotification
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers internal final class IQKeyboardAppearanceManager: NSObject {
+
+    let textInputViewObserver: IQTextInputViewNotification = .init()
+
+    /**
+    Configuration related to keyboard appearance
+    */
+    var keyboardConfiguration: IQKeyboardAppearanceConfiguration = .init()
+
+    public override init() {
+        super.init()
+
+        // Registering one time only
+        addTextInputViewObserver()
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift
new file mode 100644 (file)
index 0000000..cea51c2
--- /dev/null
@@ -0,0 +1,55 @@
+//
+//  IQKeyboardManager+Appearance.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @MainActor
+    private struct AssociatedKeys {
+        static var appearanceManager: Int = 0
+    }
+
+    internal var appearanceManager: IQKeyboardAppearanceManager {
+        if let object = objc_getAssociatedObject(self, &AssociatedKeys.appearanceManager)
+            as? IQKeyboardAppearanceManager {
+            return object
+        }
+
+        let object: IQKeyboardAppearanceManager = .init()
+        objc_setAssociatedObject(self, &AssociatedKeys.appearanceManager,
+                                 object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+
+        return object
+    }
+
+    /**
+     Configuration related to keyboard appearance
+     */
+    var keyboardConfiguration: IQKeyboardAppearanceConfiguration {
+        get { appearanceManager.keyboardConfiguration }
+        set { appearanceManager.keyboardConfiguration = newValue }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift
new file mode 100644 (file)
index 0000000..8e9cfb5
--- /dev/null
@@ -0,0 +1,43 @@
+//
+//  IQKeyboardManager+Appearance_Deprecated.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @available(*, unavailable, renamed: "keyboardConfiguration.overrideAppearance")
+    var overrideKeyboardAppearance: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "keyboardConfiguration.appearance")
+    var keyboardAppearance: UIKeyboardAppearance {
+        get { .default }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift
new file mode 100644 (file)
index 0000000..502f714
--- /dev/null
@@ -0,0 +1,274 @@
+//
+//  IQActiveConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+import IQKeyboardNotification
+import IQTextInputViewNotification
+import Combine
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal final class IQActiveConfiguration: NSObject {
+
+    private let keyboardObserver: IQKeyboardNotification = .init()
+    private let textInputViewObserver: IQTextInputViewNotification = .init()
+
+    private var changeObservers: [AnyHashable: ConfigurationCompletion] = [:]
+    var cancellable: Set<AnyCancellable> = []
+
+    enum Event: Int {
+        case hide
+        case show
+        case change
+
+        var name: String {
+            switch self {
+            case .hide:
+                return "hide"
+            case .show:
+                return "show"
+            case .change:
+                return "change"
+            }
+        }
+    }
+
+    private var lastEvent: Event = .hide
+
+    var rootConfiguration: IQRootControllerConfiguration?
+
+    var isReady: Bool {
+        if textInputViewInfo != nil,
+           let rootConfiguration = rootConfiguration {
+            return rootConfiguration.isReady
+        }
+        return false
+    }
+
+    override init() {
+        super.init()
+        addKeyboardObserver()
+        addTextInputViewObserver()
+    }
+
+    private func sendEvent() {
+
+        guard let rootConfiguration = rootConfiguration,
+              rootConfiguration.isReady else { return }
+
+        if keyboardInfo.isVisible {
+            if lastEvent == .hide {
+                self.notify(event: .show, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+            } else {
+                self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+            }
+
+        } else if lastEvent != .hide {
+            if rootConfiguration.beginOrientation == rootConfiguration.currentOrientation {
+
+                // If interactive pop gesture is active then it manipulate viewController.view's frame
+                // To overcome with this, we have to do this workaround.
+                if rootConfiguration.isInteractiveGestureActive,
+                   let rootController: UIViewController = rootConfiguration.rootController {
+
+                    self.cancellable.forEach { $0.cancel() }
+                    self.cancellable.removeAll()
+
+                    // Saving current keyboard info and textInputView
+                    let keyboardInfo = keyboardObserver.keyboardInfo
+                    let textInputViewInfo = textInputViewObserver.textInputViewInfo
+
+                    // Start observing frame changes.
+                    // If pop successful, then we'll not get callbacks here again
+                    // If user cancels the pop, then we'll get frame as .zero at some time
+                    // Also the interactiveGesture becomes inactive (genuinely it's state is .possible)
+                    // At this moment.
+                    rootController.view.publisher(for: \.frame)
+                        .sink(receiveValue: { [weak self] frame in
+                            guard let self = self else { return }
+                            print(frame)
+                            guard frame.origin == .zero,
+                                  !rootConfiguration.isInteractiveGestureActive else { return }
+
+                            self.cancellable.forEach { $0.cancel() }
+                            self.cancellable.removeAll()
+
+                            // Restore keyboard info and textInputViewInfo
+                            self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+                        }).store(in: &cancellable)
+
+                } else {
+                    self.notify(event: .hide, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
+                    self.rootConfiguration = nil
+                }
+
+            } else if rootConfiguration.hasChanged {
+                animate(alongsideTransition: {
+                    rootConfiguration.restore()
+                }, completion: nil)
+            }
+        }
+    }
+
+    private func updateRootController(textInputView: IQTextInputView?) {
+
+        guard let textInputView: UIView = textInputView,
+              let controller: UIViewController = textInputView.iq.parentContainerViewController() else {
+            if let rootConfiguration = rootConfiguration,
+               rootConfiguration.hasChanged {
+                animate(alongsideTransition: {
+                    rootConfiguration.restore()
+                }, completion: nil)
+            }
+            rootConfiguration = nil
+            return
+        }
+
+        let newConfiguration = IQRootControllerConfiguration(rootController: controller)
+
+        guard newConfiguration.rootController?.view.window != rootConfiguration?.rootController?.view.window ||
+                newConfiguration.beginOrientation != rootConfiguration?.beginOrientation else { return }
+
+        if rootConfiguration?.rootController != newConfiguration.rootController {
+
+            // If there was an old configuration but things are changed
+            if let rootConfiguration = rootConfiguration,
+               rootConfiguration.hasChanged {
+                animate(alongsideTransition: {
+                    rootConfiguration.restore()
+                }, completion: nil)
+            }
+        }
+
+        rootConfiguration = newConfiguration
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+    var keyboardInfo: IQKeyboardInfo {
+        return keyboardObserver.keyboardInfo
+    }
+
+    private func addKeyboardObserver() {
+        keyboardObserver.subscribe(identifier: "IQActiveConfiguration", changeHandler: { [weak self] _, endFrame in
+
+            guard let self = self else { return }
+
+            guard self.keyboardObserver.oldKeyboardInfo.endFrame.height != endFrame.height else { return }
+
+            if let info = self.textInputViewInfo, self.keyboardInfo.isVisible {
+                if let rootConfiguration = self.rootConfiguration {
+                    let beginIsPortrait: Bool = rootConfiguration.beginOrientation.isPortrait
+                    let currentIsPortrait: Bool = rootConfiguration.currentOrientation.isPortrait
+                    if beginIsPortrait != currentIsPortrait {
+                        self.updateRootController(textInputView: info.textInputView)
+                    }
+                } else {
+                    self.updateRootController(textInputView: info.textInputView)
+                }
+            }
+
+            self.sendEvent()
+
+            // If interactive pop gesture is active then we don't want to remove this textField
+            if endFrame.height == 0,
+               !(self.rootConfiguration?.isInteractiveGestureActive ?? false) {
+                self.updateRootController(textInputView: nil)
+            }
+        })
+    }
+
+    public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+        keyboardObserver.animate(alongsideTransition: transition, completion: completion)
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+    var textInputView: (any IQTextInputView)? {
+        guard let textInputView: UIView = textInputViewObserver.textInputView,
+              textInputView.iq.isAlertViewTextField() == false else {
+            return nil
+        }
+
+        return textInputViewObserver.textInputView
+    }
+
+    var textInputViewInfo: IQTextInputViewInfo? {
+        guard let textInputView: UIView = textInputView,
+              textInputView.iq.isAlertViewTextField() == false else {
+            return nil
+        }
+
+        return textInputViewObserver.textInputViewInfo
+    }
+
+    private func addTextInputViewObserver() {
+        textInputViewObserver.subscribe(identifier: "IQActiveConfiguration",
+                                        changeHandler: { [weak self] event, textInputView in
+
+            guard let self = self else { return }
+
+//            print(info.event.name)
+            guard (textInputView as UIView).iq.isAlertViewTextField() == false else {
+                return
+            }
+
+            if event == .beginEditing {
+                self.updateRootController(textInputView: textInputView)
+                self.sendEvent()
+            }
+        })
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQActiveConfiguration {
+
+    typealias ConfigurationCompletion = (_ event: Event,
+                                         _ keyboardInfo: IQKeyboardInfo,
+                                         _ textInputViewInfo: IQTextInputViewInfo?) -> Void
+
+    func subscribe(identifier: AnyHashable, changeHandler: @escaping ConfigurationCompletion) {
+        changeObservers[identifier] = changeHandler
+    }
+
+    func unsubscribe(identifier: AnyHashable) {
+        changeObservers[identifier] = nil
+    }
+
+    private func notify(event: Event, keyboardInfo: IQKeyboardInfo, textInputViewInfo: IQTextInputViewInfo?) {
+        lastEvent = event
+
+        for block in changeObservers.values {
+            block(event, keyboardInfo, textInputViewInfo)
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift
new file mode 100644 (file)
index 0000000..4980b73
--- /dev/null
@@ -0,0 +1,95 @@
+//
+//  IQRootControllerConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal struct IQRootControllerConfiguration {
+
+    weak var rootController: UIViewController?
+    let beginOrigin: CGPoint
+    let beginSafeAreaInsets: UIEdgeInsets
+    let beginOrientation: UIInterfaceOrientation
+
+    init(rootController: UIViewController) {
+        self.rootController = rootController
+        beginOrigin = rootController.view.frame.origin
+        beginSafeAreaInsets = rootController.view.safeAreaInsets
+
+        let interfaceOrientation: UIInterfaceOrientation
+        if let scene = rootController.view.window?.windowScene {
+            interfaceOrientation = scene.interfaceOrientation
+        } else {
+            interfaceOrientation = .unknown
+        }
+
+        beginOrientation = interfaceOrientation
+    }
+
+    var currentOrientation: UIInterfaceOrientation {
+        let interfaceOrientation: UIInterfaceOrientation
+        if let scene = rootController?.view.window?.windowScene {
+            interfaceOrientation = scene.interfaceOrientation
+        } else {
+            interfaceOrientation = .unknown
+        }
+        return interfaceOrientation
+    }
+
+    var isReady: Bool {
+        return rootController?.view.window != nil
+    }
+
+    var hasChanged: Bool {
+        let origin: CGPoint = rootController?.view.frame.origin ?? .zero
+        return !origin.equalTo(beginOrigin)
+    }
+
+    var isInteractiveGestureActive: Bool {
+        guard let rootController: UIViewController = rootController,
+              let navigationController: UINavigationController = rootController.navigationController,
+              let interactiveGestureRecognizer = navigationController.interactivePopGestureRecognizer else {
+            return false
+        }
+        switch interactiveGestureRecognizer.state {
+        case .began, .changed:
+            return true
+        case .possible, .ended, .cancelled, .failed, .recognized:
+            // swiftlint:disable:next no_fallthrough_only
+            fallthrough
+        default:
+            return false
+        }
+    }
+    @discardableResult
+    func restore() -> Bool {
+        guard let rootController: UIViewController = rootController,
+              !rootController.view.frame.origin.equalTo(beginOrigin) else { return false }
+        // Setting it's new frame
+        var rect: CGRect = rootController.view.frame
+        rect.origin = beginOrigin
+        rootController.view.frame = rect
+        return true
+     }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift
new file mode 100644 (file)
index 0000000..8ced7b5
--- /dev/null
@@ -0,0 +1,100 @@
+//
+//  IQScrollViewConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal struct IQScrollViewConfiguration {
+    let scrollView: UIScrollView
+    let startingContentOffset: CGPoint
+    let startingScrollIndicatorInsets: UIEdgeInsets
+    let startingContentInset: UIEdgeInsets
+
+    private let canRestoreContentOffset: Bool
+
+    init(scrollView: UIScrollView, canRestoreContentOffset: Bool) {
+        self.scrollView = scrollView
+        self.canRestoreContentOffset = canRestoreContentOffset
+
+        startingContentOffset = scrollView.contentOffset
+        startingContentInset = scrollView.contentInset
+        startingScrollIndicatorInsets = scrollView.verticalScrollIndicatorInsets
+    }
+
+    var hasChanged: Bool {
+        if scrollView.contentInset != self.startingContentInset {
+            return true
+        }
+
+        if canRestoreContentOffset,
+           scrollView.iq.restoreContentOffset,
+           !scrollView.contentOffset.equalTo(startingContentOffset) {
+            return true
+        }
+        return false
+    }
+
+    @discardableResult
+    func restore(for textInputView: (some IQTextInputView)?) -> Bool {
+        var success: Bool = false
+
+        if scrollView.contentInset != self.startingContentInset {
+            scrollView.contentInset = self.startingContentInset
+            scrollView.layoutIfNeeded() // (Bug ID: #1996)
+            success = true
+        }
+
+        if scrollView.verticalScrollIndicatorInsets != self.startingScrollIndicatorInsets {
+            scrollView.verticalScrollIndicatorInsets = self.startingScrollIndicatorInsets
+        }
+
+        if canRestoreContentOffset,
+           scrollView.iq.restoreContentOffset,
+           !scrollView.contentOffset.equalTo(startingContentOffset) {
+
+            //  (Bug ID: #1365, #1508, #1541)
+            let stackView: UIStackView?
+            if let textInputView: UIView = textInputView {
+                stackView = textInputView.iq.superviewOf(type: UIStackView.self,
+                                                         belowView: scrollView)
+            } else {
+                stackView = nil
+            }
+            // (Bug ID: #1901, #1996)
+            let animatedContentOffset: Bool = stackView != nil ||
+            scrollView is UICollectionView ||
+            scrollView is UITableView
+
+            if animatedContentOffset {
+                scrollView.setContentOffset(startingContentOffset, animated: UIView.areAnimationsEnabled)
+            } else {
+                scrollView.contentOffset = startingContentOffset
+            }
+            success = true
+        }
+
+        return success
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift
new file mode 100644 (file)
index 0000000..ccea38b
--- /dev/null
@@ -0,0 +1,78 @@
+//
+//  IQKeyboardManager+Debug.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// MARK: Debugging & Developer options
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @MainActor
+    private struct AssociatedKeys {
+        static var isDebuggingEnabled: Int = 0
+        static var logIndentation: Int = 0
+    }
+
+    var isDebuggingEnabled: Bool {
+        get {
+            return objc_getAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled) as? Bool ?? false
+        }
+        set(newValue) {
+            objc_setAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled,
+                                     newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        }
+    }
+
+    private var logIndentation: Int {
+        get {
+            return objc_getAssociatedObject(self, &AssociatedKeys.logIndentation) as? Int ?? 0
+        }
+        set(newValue) {
+            objc_setAssociatedObject(self, &AssociatedKeys.logIndentation,
+                                     newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        }
+    }
+
+    internal func showLog(_ logString: String, indentation: Int = 0) {
+
+        guard isDebuggingEnabled else {
+            return
+        }
+
+        if indentation < 0 {
+            logIndentation = max(0, logIndentation + indentation)
+        }
+
+        var preLog: String = "IQKeyboardManager"
+        for _ in 0 ... logIndentation {
+            preLog += "|\t"
+        }
+
+        print(preLog + logString)
+
+        if indentation > 0 {
+            logIndentation += indentation
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift
new file mode 100644 (file)
index 0000000..87bb3f9
--- /dev/null
@@ -0,0 +1,169 @@
+//
+//  IQKeyboardManager+Deprecated.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable line_length
+// swiftlint:disable type_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @available(*, unavailable, renamed: "keyboardDistance")
+    var keyboardDistanceFromTextField: CGFloat {
+        get { fatalError() }
+        set { }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
+    func registerTextFieldViewClass(_ aClass: UIView.Type,
+                                    didBeginEditingNotificationName: String,
+                                    didEndEditingNotificationName: String) {
+    }
+
+    @available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
+    func unregisterTextFieldViewClass(_ aClass: UIView.Type,
+                                      didBeginEditingNotificationName: String,
+                                      didEndEditingNotificationName: String) {
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    typealias SizeBlock = (_ size: CGSize) -> Void
+
+    @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+    func registerKeyboardSizeChange(identifier: AnyHashable, sizeHandler: @escaping SizeBlock) {}
+
+    @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+    func unregisterKeyboardSizeChange(identifier: AnyHashable) {}
+
+    @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+    var keyboardShowing: Bool { false }
+
+    @available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+    var keyboardFrame: CGRect { .zero }
+}
+
+@available(*, unavailable, renamed: "IQKeyboardReturnManager", message: "Please use `IQKeyboardReturnManager` independently from https://github.com/hackiftekhar/IQKeyboardReturnManager")
+@MainActor
+@objcMembers public final class IQKeyboardReturnKeyHandler: NSObject {}
+
+@available(*, unavailable, renamed: "IQKeyboardNotification", message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
+@MainActor
+@objcMembers public final class IQKeyboardListener: NSObject {}
+
+@available(*, unavailable, renamed: "IQTextInputViewNotification", message: "Please use `IQTextInputViewNotification` independently from https://github.com/hackiftekhar/IQTextInputViewNotification")
+@MainActor
+@objcMembers public final class IQTextFieldViewListener: NSObject {}
+
+@available(*, unavailable, renamed: "IQDeepResponderContainerView", message: "Please use `IQDeepResponderContainerView` class which is now part of `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager.")
+@MainActor
+@objcMembers open class IQPreviousNextView: UIView {}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQToolbarPlaceholderConfigurationDeprecated: NSObject {
+    public var showPlaceholder: Bool = true
+    public var font: UIFont?
+    public var color: UIColor?
+    public var buttonColor: UIColor?
+    public override var accessibilityLabel: String? { didSet { } }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQBarButtonItemConfigurationDeprecated: NSObject {
+
+    public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) {
+        self.systemItem = systemItem
+        self.image = nil
+        self.title = nil
+        self.action = action
+        super.init()
+    }
+
+    public init(image: UIImage, action: Selector? = nil) {
+        self.systemItem = nil
+        self.image = image
+        self.title = nil
+        self.action = action
+        super.init()
+    }
+
+    public init(title: String, action: Selector? = nil) {
+        self.systemItem = nil
+        self.image = nil
+        self.title = title
+        self.action = action
+        super.init()
+    }
+
+    public let systemItem: UIBarButtonItem.SystemItem?
+    public let image: UIImage?
+    public let title: String?
+    public var action: Selector?
+    public override var accessibilityLabel: String? { didSet { } }
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@objc public enum IQAutoToolbarManageBehaviorDeprecated: Int {
+    case bySubviews
+    case byTag
+    case byPosition
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@objc public enum IQPreviousNextDisplayModeDeprecated: Int {
+    case `default`
+    case alwaysHide
+    case alwaysShow
+}
+
+@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+@MainActor
+@objcMembers public final class IQToolbarConfiguration: NSObject {
+
+    public var useTextInputViewTintColor: Bool = false
+    public var tintColor: UIColor?
+    public var barTintColor: UIColor?
+    public var previousNextDisplayMode: IQPreviousNextDisplayModeDeprecated = .default
+    public var manageBehavior: IQAutoToolbarManageBehaviorDeprecated = .bySubviews
+    public var previousBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+    public var nextBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+    public var doneBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
+    public let placeholderConfiguration: IQToolbarPlaceholderConfigurationDeprecated = .init()
+}
+
+// swiftlint:enable line_length
+// swiftlint:enable unused_setter_value
+// swiftlint:enable type_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift
new file mode 100644 (file)
index 0000000..a09bae8
--- /dev/null
@@ -0,0 +1,126 @@
+//
+//  IQKeyboardManager+ActiveConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+import Combine
+
+// MARK: UIKeyboard Notifications
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+    func addActiveConfigurationObserver() {
+        activeConfiguration.subscribe(identifier: "IQKeyboardManager", changeHandler: { [weak self] event, _, _ in
+            guard let self = self else { return }
+
+            switch event {
+            case .show:
+                self.handleKeyboardTextInputViewVisible()
+            case .change:
+                self.handleKeyboardTextInputViewChanged()
+            case .hide:
+                self.handleKeyboardTextInputViewHide()
+            }
+        })
+    }
+
+    private func handleKeyboardTextInputViewVisible() {
+
+        setupTextInputView()
+
+        if privateIsEnabled() {
+            adjustPosition()
+        } else {
+            restorePosition()
+        }
+    }
+
+    private func handleKeyboardTextInputViewChanged() {
+
+        setupTextInputView()
+
+        if privateIsEnabled() {
+            adjustPosition()
+        } else {
+            restorePosition()
+        }
+    }
+
+    private func handleKeyboardTextInputViewHide() {
+
+        self.restorePosition()
+        self.banishTextInputViewSetup()
+
+        self.lastScrollViewConfiguration = nil
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+    func setupTextInputView() {
+
+        guard let textInputView = activeConfiguration.textInputView else {
+            return
+        }
+
+        if let startingConfiguration = startingTextViewConfiguration,
+           startingConfiguration.hasChanged {
+
+            if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
+                showLog("""
+                Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
+                """)
+            }
+
+            activeConfiguration.animate(alongsideTransition: {
+                startingConfiguration.restore(for: textInputView)
+            })
+        }
+        startingTextViewConfiguration = nil
+    }
+
+    func banishTextInputViewSetup() {
+
+        guard let textInputView = activeConfiguration.textInputView else {
+            return
+        }
+
+        if let startingConfiguration = startingTextViewConfiguration,
+           startingConfiguration.hasChanged {
+
+            if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
+                showLog("""
+                Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
+                """)
+            }
+
+            activeConfiguration.animate(alongsideTransition: {
+                startingConfiguration.restore(for: textInputView)
+            })
+        }
+        startingTextViewConfiguration = nil
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift
new file mode 100644 (file)
index 0000000..5989671
--- /dev/null
@@ -0,0 +1,88 @@
+//
+//  IQKeyboardManager+Internal.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardManager {
+
+    func privateIsEnabled() -> Bool {
+
+        guard let textInputView: any IQTextInputView = activeConfiguration.textInputView else {
+            return isEnabled
+        }
+
+        switch textInputView.internalEnableMode {
+        case .default:
+            guard var controller = (textInputView as UIView).iq.viewContainingController() else {
+                return isEnabled
+            }
+
+            // If it is searchBar textField embedded in Navigation Bar
+            if (textInputView as UIView).iq.textFieldSearchBar() != nil,
+               let navController: UINavigationController = controller as? UINavigationController,
+               let topController: UIViewController = navController.topViewController {
+                controller = topController
+            }
+
+            // If viewController is in enabledDistanceHandlingClasses, then assuming it's enabled.
+            let isWithEnabledClass: Bool = enabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) })
+            var isEnabled: Bool = isEnabled || isWithEnabledClass
+
+            if isEnabled {
+                // If viewController is in disabledDistanceHandlingClasses,
+                // then assuming it's disabled.
+                if disabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) }) {
+                    isEnabled = false
+                } else {
+                    // Special Controllers
+                    let classNameString: String = "\(type(of: controller.self))"
+
+                    // _UIAlertControllerTextFieldViewController
+                    if classNameString.contains("UIAlertController"),
+                       classNameString.hasSuffix("TextFieldViewController") {
+                        isEnabled = false
+                    }
+                }
+            }
+
+            return isEnabled
+        case .enabled:
+            return true
+        case .disabled:
+            return false
+        @unknown default:
+            return false
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+    var internalEnableMode: IQEnableMode {
+        return iq.enableMode
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift
new file mode 100644 (file)
index 0000000..478aa43
--- /dev/null
@@ -0,0 +1,795 @@
+//
+//  IQKeyboardManager+Position.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+// swiftlint:disable file_length
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    private typealias IQLayoutGuide = (top: CGFloat, bottom: CGFloat)
+
+    @MainActor
+    private struct AssociatedKeys {
+        static var movedDistance: Int = 0
+        static var movedDistanceChanged: Int = 0
+        static var lastScrollViewConfiguration: Int = 0
+        static var startingTextViewConfiguration: Int = 0
+        static var activeConfiguration: Int = 0
+    }
+
+    /**
+     moved distance to the top used to maintain distance between keyboard and textInputView.
+     Most of the time this will be a positive value.
+     */
+    private(set) var movedDistance: CGFloat {
+        get {
+            return objc_getAssociatedObject(self, &AssociatedKeys.movedDistance) as? CGFloat ?? 0.0
+        }
+        set(newValue) {
+            objc_setAssociatedObject(self, &AssociatedKeys.movedDistance, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            movedDistanceChanged?(movedDistance)
+        }
+    }
+
+    /**
+    Will be called then movedDistance will be changed
+     */
+    var movedDistanceChanged: ((CGFloat) -> Void)? {
+        get {
+            return objc_getAssociatedObject(self, &AssociatedKeys.movedDistanceChanged) as? ((CGFloat) -> Void)
+        }
+        set(newValue) {
+            objc_setAssociatedObject(self, &AssociatedKeys.movedDistanceChanged,
+                                     newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            movedDistanceChanged?(movedDistance)
+        }
+    }
+
+    /** Variable to save lastScrollView that was scrolled. */
+    @nonobjc
+    internal var lastScrollViewConfiguration: IQScrollViewConfiguration? {
+        get {
+            return objc_getAssociatedObject(self,
+                                            &AssociatedKeys.lastScrollViewConfiguration) as? IQScrollViewConfiguration
+        }
+        set(newValue) {
+            objc_setAssociatedObject(self, &AssociatedKeys.lastScrollViewConfiguration,
+                                     newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        }
+    }
+
+    /** used to adjust contentInset of UITextView. */
+    @nonobjc
+    internal var startingTextViewConfiguration: IQScrollViewConfiguration? {
+        get {
+            return objc_getAssociatedObject(self,
+                                            &AssociatedKeys.startingTextViewConfiguration) as? IQScrollViewConfiguration
+        }
+        set(newValue) {
+            objc_setAssociatedObject(self, &AssociatedKeys.startingTextViewConfiguration,
+                                     newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        }
+    }
+
+    internal func applicationDidBecomeActive(_ notification: Notification) {
+
+        guard privateIsEnabled(),
+              activeConfiguration.keyboardInfo.isVisible,
+              activeConfiguration.isReady else {
+            return
+        }
+        adjustPosition()
+    }
+
+    /* Adjusting RootViewController's frame according to interface orientation. */
+    // swiftlint:disable function_body_length
+    internal func adjustPosition() {
+
+        guard UIApplication.shared.applicationState == .active,
+              let textInputView: any IQTextInputView = activeConfiguration.textInputView,
+              let superview: UIView = textInputView.superview,
+              let rootConfiguration = activeConfiguration.rootConfiguration,
+              let rootController: UIViewController = rootConfiguration.rootController,
+              let window: UIWindow = rootController.view.window else {
+            return
+        }
+
+        showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+        defer {
+            showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+        }
+
+        let textInputViewRectInWindow: CGRect = superview.convert(textInputView.frame, to: window)
+        let textInputViewRectInRootSuperview: CGRect = superview.convert(textInputView.frame,
+                                                                         to: rootController.view.superview)
+
+        //  Getting RootViewOrigin.
+        let rootViewOrigin: CGPoint = rootController.view.frame.origin
+
+        let keyboardDistance: CGFloat = getSpecialTextInputViewDistance(textInputView: textInputView)
+
+        let kbSize: CGSize = Self.getKeyboardSize(keyboardDistance: keyboardDistance,
+                                                  keyboardFrame: activeConfiguration.keyboardInfo.endFrame,
+                                                  safeAreaInsets: rootConfiguration.beginSafeAreaInsets,
+                                                  windowFrame: window.frame)
+        let originalKbSize: CGSize = activeConfiguration.keyboardInfo.endFrame.size
+
+        let isScrollableTextInputView: Bool
+
+        if let textInputView: UIScrollView = textInputView as? UITextView {
+            isScrollableTextInputView = textInputView.isScrollEnabled
+        } else {
+            isScrollableTextInputView = false
+        }
+
+        let layoutGuide: IQLayoutGuide = Self.getLayoutGuides(rootController: rootController, window: window,
+                                                              isScrollableTextInputView: isScrollableTextInputView)
+
+        //  Move positive = textInputView is hidden.
+        //  Move negative = textInputView is showing.
+        //  Calculating move position.
+        var moveUp: CGFloat = Self.getMoveUpDistance(keyboardSize: kbSize,
+                                                     layoutGuide: layoutGuide,
+                                                     textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
+                                                     textInputViewRectInWindow: textInputViewRectInWindow,
+                                                     windowFrame: window.frame)
+
+        showLog("Need to move: \(moveUp), will be moving \(moveUp < 0 ? "down" : "up")")
+
+        var superScrollView: UIScrollView?
+        var superView: UIScrollView? = (textInputView as UIView).iq.superviewOf(type: UIScrollView.self)
+
+        // Getting UIScrollView whose scrolling is enabled.    //  (Bug ID: #285)
+        while let view: UIScrollView = superView {
+
+            if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
+                superScrollView = view
+                break
+            } else {
+                //  Getting it's superScrollView.   //  (Enhancement ID: #21, #24)
+                superView = view.iq.superviewOf(type: UIScrollView.self)
+            }
+        }
+
+        setupActiveScrollViewConfiguration(superScrollView: superScrollView, textInputView: textInputView)
+
+        //  Special case for ScrollView.
+        //  If we found lastScrollView then setting it's contentOffset to show textInputView.
+        if let lastScrollViewConfiguration: IQScrollViewConfiguration  = lastScrollViewConfiguration {
+            adjustScrollViewContentOffsets(moveUp: &moveUp, textInputView: textInputView,
+                                           lastScrollViewConfiguration: lastScrollViewConfiguration,
+                                           rootSuperview: rootController.view.superview, layoutGuide: layoutGuide,
+                                           textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
+                                           isScrollableTextInputView: isScrollableTextInputView, window: window,
+                                           kbSize: kbSize, keyboardDistance: keyboardDistance,
+                                           rootBeginSafeAreaInsets: rootConfiguration.beginSafeAreaInsets)
+        }
+
+        // Special case for UITextView
+        // (Readjusting textInputView.contentInset when textInputView hight is too big to fit on screen)
+        // _lastScrollView If not having inside any scrollView, now contentInset manages the full screen textInputView.
+        // If is a UITextView type
+        if isScrollableTextInputView, let textInputView = textInputView as? UITextView {
+
+            adjustTextInputViewContentInset(window: window, originalKbSize: originalKbSize,
+                                            rootSuperview: rootController.view.superview,
+                                            layoutGuide: layoutGuide,
+                                            textInputView: textInputView)
+        }
+
+        adjustRootController(moveUp: moveUp, rootViewOrigin: rootViewOrigin, originalKbSize: originalKbSize,
+                             rootController: rootController, rootBeginOrigin: rootConfiguration.beginOrigin)
+    }
+    // swiftlint:enable function_body_length
+
+    internal func restorePosition() {
+
+        //  Setting rootViewController frame to it's original position. //  (Bug ID: #18)
+        guard let configuration: IQRootControllerConfiguration = activeConfiguration.rootConfiguration else {
+            return
+        }
+        showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+        defer {
+            showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+        }
+
+        activeConfiguration.animate(alongsideTransition: {
+            if configuration.hasChanged {
+                let classNameString: String = "\(type(of: configuration.rootController.self))"
+                self.showLog("Restoring \(classNameString) origin to: \(configuration.beginOrigin)")
+            }
+            configuration.restore()
+
+            // Animating content if needed (Bug ID: #204)
+            if self.layoutIfNeededOnUpdate {
+                // Animating content (Bug ID: #160)
+                configuration.rootController?.view.setNeedsLayout()
+                configuration.rootController?.view.layoutIfNeeded()
+            }
+        })
+        // Restoring the contentOffset of the lastScrollView
+        if let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration {
+            let textInputView: (any IQTextInputView)? = activeConfiguration.textInputView
+
+            restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration, textInputView: textInputView)
+
+            activeConfiguration.animate(alongsideTransition: {
+                // This is temporary solution. Have to implement the save and restore scrollView state
+                self.restoreScrollViewContentOffset(superScrollView: lastConfiguration.scrollView,
+                                                    textInputView: textInputView)
+            })
+        }
+
+        self.movedDistance = 0
+    }
+}
+
+// swiftlint:disable function_parameter_count
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardManager {
+
+    func getSpecialTextInputViewDistance(textInputView: some IQTextInputView) -> CGFloat {
+        // Maintain keyboardDistance
+        let specialKeyboardDistance: CGFloat
+
+        if let searchBar: UISearchBar = textInputView.iq.textFieldSearchBar() {
+            specialKeyboardDistance = searchBar.iq.distanceFromKeyboard
+        } else {
+            specialKeyboardDistance = textInputView.iq.distanceFromKeyboard
+        }
+
+        if specialKeyboardDistance == UIView.defaultKeyboardDistance {
+            return keyboardDistance
+        } else {
+            return specialKeyboardDistance
+        }
+    }
+
+    static func getKeyboardSize(keyboardDistance: CGFloat, keyboardFrame: CGRect,
+                                safeAreaInsets: UIEdgeInsets, windowFrame: CGRect) -> CGSize {
+        let kbSize: CGSize
+        var kbFrame: CGRect = keyboardFrame
+
+        kbFrame.origin.y -= keyboardDistance
+        kbFrame.size.height += keyboardDistance
+
+        kbFrame.origin.y -= safeAreaInsets.bottom
+        kbFrame.size.height += safeAreaInsets.bottom
+
+        // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
+        // Calculating actual keyboard covered size respect to window,
+        // keyboard frame may be different when hardware keyboard is attached
+        let intersectRect: CGRect = kbFrame.intersection(windowFrame)
+
+        if intersectRect.isNull {
+            kbSize = CGSize(width: kbFrame.size.width, height: 0)
+        } else {
+            kbSize = intersectRect.size
+        }
+        return kbSize
+    }
+
+    static private func getLayoutGuides(rootController: UIViewController, window: UIWindow,
+                                        isScrollableTextInputView: Bool) -> IQLayoutGuide {
+        let navigationBarAreaHeight: CGFloat
+        if let navigationController: UINavigationController = rootController.navigationController {
+            navigationBarAreaHeight = navigationController.navigationBar.frame.maxY
+        } else {
+            let statusBarHeight: CGFloat = window.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
+            navigationBarAreaHeight = statusBarHeight
+        }
+
+        let directionalLayoutMargin: NSDirectionalEdgeInsets = rootController.view.directionalLayoutMargins
+        let topLayoutGuide: CGFloat = CGFloat.maximum(navigationBarAreaHeight, directionalLayoutMargin.top)
+
+        // Validation of textInputView for case where there is a tab bar
+        // at the bottom or running on iPhone X and textInputView is at the bottom.
+        let bottomLayoutGuide: CGFloat = isScrollableTextInputView ? 0 : directionalLayoutMargin.bottom
+        return (topLayoutGuide, bottomLayoutGuide)
+    }
+
+    static private func getMoveUpDistance(keyboardSize: CGSize,
+                                          layoutGuide: IQLayoutGuide,
+                                          textInputViewRectInRootSuperview: CGRect,
+                                          textInputViewRectInWindow: CGRect,
+                                          windowFrame: CGRect) -> CGFloat {
+
+        //  Move positive = textInputView is hidden.
+        //  Move negative = textInputView is showing.
+        //  Calculating move position.
+        let visibleHeight: CGFloat = windowFrame.height-keyboardSize.height
+
+        let topMovement: CGFloat = textInputViewRectInRootSuperview.minY-layoutGuide.top
+        let bottomMovement: CGFloat = textInputViewRectInWindow.maxY - visibleHeight + layoutGuide.bottom
+        var moveUp: CGFloat = CGFloat.minimum(topMovement, bottomMovement)
+        moveUp = CGFloat(Int(moveUp))
+        return moveUp
+    }
+
+    func setupActiveScrollViewConfiguration(superScrollView: UIScrollView?, textInputView: some IQTextInputView) {
+        // If there was a lastScrollView.    //  (Bug ID: #34)
+        guard let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration else {
+            if let superScrollView: UIScrollView = superScrollView {
+                // If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView.
+                let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
+                                                              canRestoreContentOffset: true)
+                self.lastScrollViewConfiguration = configuration
+                showLog("""
+                        Saving ScrollView New contentInset: \(configuration.startingContentInset)
+                        and contentOffset: \(configuration.startingContentOffset)
+                        """)
+            }
+            return
+        }
+
+        // If we can't find current superScrollView, then setting lastScrollView to it's original form.
+        if superScrollView == nil {
+            restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
+                                                    textInputView: textInputView)
+            self.lastScrollViewConfiguration = nil
+        } else if superScrollView != lastConfiguration.scrollView {
+            // If both scrollView's are different,
+            // then reset lastScrollView to it's original frame and setting current scrollView as last scrollView.
+            restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
+                                                    textInputView: textInputView)
+
+            if let superScrollView = superScrollView {
+                let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
+                                                              canRestoreContentOffset: true)
+                self.lastScrollViewConfiguration = configuration
+                showLog("""
+                            Saving ScrollView New contentInset: \(configuration.startingContentInset)
+                            and contentOffset: \(configuration.startingContentOffset)
+                            """)
+            } else {
+                self.lastScrollViewConfiguration = nil
+            }
+        }
+        // Else the case where superScrollView == lastScrollView means we are on same scrollView
+        // after switching to different textInputView. So doing nothing, going ahead
+    }
+
+    func restoreScrollViewConfigurationIfChanged(configuration: IQScrollViewConfiguration,
+                                                 textInputView: (some IQTextInputView)?) {
+        guard configuration.hasChanged else { return }
+        if configuration.scrollView.contentInset != configuration.startingContentInset {
+            showLog("Restoring contentInset to: \(configuration.startingContentInset)")
+        }
+
+        if configuration.scrollView.iq.restoreContentOffset,
+           !configuration.scrollView.contentOffset.equalTo(configuration.startingContentOffset) {
+            showLog("Restoring contentOffset to: \(configuration.startingContentOffset)")
+        }
+
+        activeConfiguration.animate(alongsideTransition: {
+            configuration.restore(for: textInputView)
+        })
+    }
+
+    // swiftlint:disable function_body_length
+    private func adjustScrollViewContentOffsets(moveUp: inout CGFloat, textInputView: some IQTextInputView,
+                                                lastScrollViewConfiguration: IQScrollViewConfiguration,
+                                                rootSuperview: UIView?,
+                                                layoutGuide: IQLayoutGuide,
+                                                textInputViewRectInRootSuperview: CGRect,
+                                                isScrollableTextInputView: Bool, window: UIWindow,
+                                                kbSize: CGSize, keyboardDistance: CGFloat,
+                                                rootBeginSafeAreaInsets: UIEdgeInsets) {
+        // Saving
+        var lastView: UIView = textInputView
+        var superScrollView: UIScrollView? = lastScrollViewConfiguration.scrollView
+
+        while let scrollView: UIScrollView = superScrollView {
+
+            var isContinue: Bool = false
+
+            if moveUp > 0 {
+                isContinue = moveUp > (-scrollView.contentOffset.y - scrollView.contentInset.top)
+
+            } else if let tableView: UITableView = scrollView.iq.superviewOf(type: UITableView.self) {
+                // Special treatment for UITableView due to their cell reusing logic
+
+                isContinue = scrollView.contentOffset.y > 0
+
+                Self.handleTableViewCase(moveUp: &moveUp, isContinue: isContinue, textInputView: textInputView,
+                                         tableView: tableView, rootSuperview: rootSuperview, layoutGuide: layoutGuide)
+            } else if let collectionView = scrollView.iq.superviewOf(type: UICollectionView.self) {
+                // Special treatment for UICollectionView due to their cell reusing logic
+
+                isContinue = scrollView.contentOffset.y > 0
+
+                Self.handleCollectionViewCase(moveUp: &moveUp, isContinue: isContinue,
+                                              textInputView: textInputView, collectionView: collectionView,
+                                              rootSuperview: rootSuperview, layoutGuide: layoutGuide)
+            } else {
+                isContinue = textInputViewRectInRootSuperview.minY < layoutGuide.top
+
+                if isContinue {
+                    moveUp = CGFloat.minimum(0, textInputViewRectInRootSuperview.minY - layoutGuide.top)
+                }
+            }
+
+            // Looping in upper hierarchy until we don't found any scrollView
+            // in it's upper hierarchy till UIWindow object.
+            if isContinue {
+
+                var tempScrollView: UIScrollView? = scrollView.iq.superviewOf(type: UIScrollView.self)
+                var nextScrollView: UIScrollView?
+                while let view: UIScrollView = tempScrollView {
+
+                    if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
+                        nextScrollView = view
+                        break
+                    } else {
+                        tempScrollView = view.iq.superviewOf(type: UIScrollView.self)
+                    }
+                }
+
+                // Getting lastViewRect.
+                if let lastViewRect: CGRect = lastView.superview?.convert(lastView.frame, to: scrollView) {
+
+                    // Calculating the expected Y offset from move and scrollView's contentOffset.
+                    let minimumMovement: CGFloat = CGFloat.minimum(scrollView.contentOffset.y, -moveUp)
+                    var suggestedOffsetY: CGFloat = scrollView.contentOffset.y - minimumMovement
+
+                    // Rearranging the expected Y offset according to the view.
+                    suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, lastViewRect.minY)
+
+                    updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: &suggestedOffsetY, moveUp: &moveUp,
+                                                    isScrollableTextInputView: isScrollableTextInputView,
+                                                    nextScrollView: nextScrollView, textInputView: textInputView,
+                                                    window: window, layoutGuide: layoutGuide,
+                                                    scrollViewContentOffset: scrollView.contentOffset)
+
+                    let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: suggestedOffsetY)
+
+                    if !scrollView.contentOffset.equalTo(newContentOffset) {
+
+                        updateScrollViewContentOffset(scrollView: scrollView, newContentOffset: newContentOffset,
+                                                      moveUp: moveUp, textInputView: textInputView)
+                    }
+                }
+
+                // Getting next lastView & superScrollView.
+                lastView = scrollView
+                superScrollView = nextScrollView
+            } else {
+                moveUp = 0
+                break
+            }
+        }
+
+        adjustScrollViewContentInset(lastScrollViewConfiguration: lastScrollViewConfiguration, window: window,
+                                     kbSize: kbSize, keyboardDistance: keyboardDistance,
+                                     rootBeginSafeAreaInsets: rootBeginSafeAreaInsets)
+    }
+    // swiftlint:enable function_body_length
+
+    private static func handleTableViewCase(moveUp: inout CGFloat, isContinue: Bool,
+                                            textInputView: some IQTextInputView, tableView: UITableView,
+                                            rootSuperview: UIView?, layoutGuide: IQLayoutGuide) {
+        guard isContinue,
+              let tableCell: UITableViewCell = textInputView.iq.superviewOf(type: UITableViewCell.self),
+              let indexPath: IndexPath = tableView.indexPath(for: tableCell),
+              let previousIndexPath: IndexPath = tableView.previousIndexPath(of: indexPath) else { return }
+
+        let previousCellRect: CGRect = tableView.rectForRow(at: previousIndexPath)
+        guard !previousCellRect.isEmpty else { return }
+
+        let previousCellRectInRootSuperview: CGRect = tableView.convert(previousCellRect,
+                                                                        to: rootSuperview)
+
+        moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
+    }
+
+    private static func handleCollectionViewCase(moveUp: inout CGFloat, isContinue: Bool,
+                                                 textInputView: some IQTextInputView, collectionView: UICollectionView,
+                                                 rootSuperview: UIView?,
+                                                 layoutGuide: IQLayoutGuide) {
+        guard isContinue,
+              let collectionCell = textInputView.iq.superviewOf(type: UICollectionViewCell.self),
+              let indexPath: IndexPath = collectionView.indexPath(for: collectionCell),
+              let previousIndexPath: IndexPath = collectionView.previousIndexPath(of: indexPath),
+              let attributes = collectionView.layoutAttributesForItem(at: previousIndexPath) else { return }
+
+        let previousCellRect: CGRect = attributes.frame
+        guard !previousCellRect.isEmpty else { return }
+        let previousCellRectInRootSuperview: CGRect = collectionView.convert(previousCellRect,
+                                                                             to: rootSuperview)
+
+        moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
+    }
+
+    private func updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: inout CGFloat, moveUp: inout CGFloat,
+                                                 isScrollableTextInputView: Bool, nextScrollView: UIScrollView?,
+                                                 textInputView: some IQTextInputView, window: UIWindow,
+                                                 layoutGuide: IQLayoutGuide,
+                                                 scrollViewContentOffset: CGPoint) {
+        // If is a UITextView type
+        // nextScrollView == nil
+        // If processing scrollView is last scrollView in upper hierarchy
+        // (there is no other scrollView in upper hierarchy.)
+        //
+        // suggestedOffsetY >= 0
+        // suggestedOffsetY must be >= 0 in order to keep distance from navigationBar (Bug ID: #92)
+        guard isScrollableTextInputView,
+              nextScrollView == nil,
+              suggestedOffsetY >= 0,
+              let superview: UIView = textInputView.superview else {
+            // Subtracting the Y offset from the move variable,
+            // because we are going to change scrollView's contentOffset.y to suggestedOffsetY.
+            moveUp -= (suggestedOffsetY-scrollViewContentOffset.y)
+            return
+        }
+
+        let currentTextInputViewRect: CGRect = superview.convert(textInputView.frame,
+                                                                 to: window)
+
+        // Calculating expected fix distance which needs to be managed from navigation bar
+        let expectedFixDistance: CGFloat = currentTextInputViewRect.minY - layoutGuide.top
+
+        // Now if expectedOffsetY (scrollView.contentOffset.y + expectedFixDistance)
+        // is lower than current suggestedOffsetY, which means we're in a position where
+        // navigationBar up and hide, then reducing suggestedOffsetY with expectedOffsetY
+        // (scrollView.contentOffset.y + expectedFixDistance)
+        let expectedOffsetY: CGFloat = scrollViewContentOffset.y + expectedFixDistance
+        suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, expectedOffsetY)
+
+        // Setting move to 0 because now we don't want to move any view anymore
+        // (All will be managed by our contentInset logic.
+        moveUp = 0
+    }
+
+    func updateScrollViewContentOffset(scrollView: UIScrollView, newContentOffset: CGPoint,
+                                       moveUp: CGFloat, textInputView: some IQTextInputView) {
+        showLog("""
+                                    old contentOffset: \(scrollView.contentOffset)
+                                    new contentOffset: \(newContentOffset)
+                                    """)
+        showLog("Remaining Move: \(moveUp)")
+
+        // Getting problem while using `setContentOffset:animated:`, So I used animation API.
+        activeConfiguration.animate(alongsideTransition: {
+
+            //  (Bug ID: #1365, #1508, #1541)
+            let stackView: UIStackView? = textInputView.iq.superviewOf(type: UIStackView.self,
+                                                                       belowView: scrollView)
+            // (Bug ID: #1901, #1996)
+            let animatedContentOffset: Bool = stackView != nil ||
+            scrollView is UICollectionView ||
+            scrollView is UITableView
+
+            if animatedContentOffset {
+                scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
+            } else {
+                scrollView.contentOffset = newContentOffset
+            }
+        }, completion: {
+
+            if scrollView is UITableView || scrollView is UICollectionView {
+                // This will update the next/previous states
+                textInputView.reloadInputViews()
+            }
+        })
+    }
+
+    func adjustScrollViewContentInset(lastScrollViewConfiguration: IQScrollViewConfiguration,
+                                      window: UIWindow, kbSize: CGSize, keyboardDistance: CGFloat,
+                                      rootBeginSafeAreaInsets: UIEdgeInsets) {
+
+        let lastScrollView = lastScrollViewConfiguration.scrollView
+
+        guard let lastScrollViewRect: CGRect = lastScrollView.superview?.convert(lastScrollView.frame, to: window),
+              !lastScrollView.iq.ignoreContentInsetAdjustment else { return }
+
+        // Updating contentInset
+        var bottomInset: CGFloat = (kbSize.height)-(window.frame.height-lastScrollViewRect.maxY)
+        let keyboardAndSafeArea: CGFloat = keyboardDistance + rootBeginSafeAreaInsets.bottom
+        var bottomScrollIndicatorInset: CGFloat = bottomInset - keyboardAndSafeArea
+
+        // Update the insets so that the scrollView doesn't shift incorrectly
+        // when the offset is near the bottom of the scroll view.
+        bottomInset = CGFloat.maximum(lastScrollViewConfiguration.startingContentInset.bottom, bottomInset)
+        let startingScrollInset: UIEdgeInsets = lastScrollViewConfiguration.startingScrollIndicatorInsets
+        bottomScrollIndicatorInset = CGFloat.maximum(startingScrollInset.bottom,
+                                                     bottomScrollIndicatorInset)
+
+        bottomInset -= lastScrollView.safeAreaInsets.bottom
+        bottomScrollIndicatorInset -= lastScrollView.safeAreaInsets.bottom
+
+        var movedInsets: UIEdgeInsets = lastScrollView.contentInset
+        movedInsets.bottom = bottomInset
+
+        guard lastScrollView.contentInset != movedInsets else { return }
+        showLog("""
+                old ContentInset: \(lastScrollView.contentInset) new ContentInset: \(movedInsets)
+                """)
+
+        activeConfiguration.animate(alongsideTransition: {
+            lastScrollView.contentInset = movedInsets
+            lastScrollView.layoutIfNeeded() // (Bug ID: #1996)
+
+            var newScrollIndicatorInset: UIEdgeInsets = lastScrollView.verticalScrollIndicatorInsets
+
+            newScrollIndicatorInset.bottom = bottomScrollIndicatorInset
+            lastScrollView.scrollIndicatorInsets = newScrollIndicatorInset
+        })
+    }
+
+    private func adjustTextInputViewContentInset(window: UIWindow, originalKbSize: CGSize,
+                                                 rootSuperview: UIView?,
+                                                 layoutGuide: IQLayoutGuide,
+                                                 textInputView: UIScrollView) {
+        let keyboardYPosition: CGFloat = window.frame.height - originalKbSize.height
+        var rootSuperViewFrameInWindow: CGRect = window.frame
+        if let rootSuperview: UIView = rootSuperview {
+            rootSuperViewFrameInWindow = rootSuperview.convert(rootSuperview.bounds, to: window)
+        }
+
+        let keyboardOverlapping: CGFloat = rootSuperViewFrameInWindow.maxY - keyboardYPosition
+
+        let availableHeight: CGFloat = rootSuperViewFrameInWindow.height-layoutGuide.top-keyboardOverlapping
+        let textInputViewHeight: CGFloat = CGFloat.minimum(textInputView.frame.height, availableHeight)
+
+        guard textInputView.frame.size.height-textInputView.contentInset.bottom>textInputViewHeight else { return }
+        // If frame is not change by library in past, then saving user textInputView properties  (Bug ID: #92)
+        if startingTextViewConfiguration == nil {
+            startingTextViewConfiguration = IQScrollViewConfiguration(scrollView: textInputView,
+                                                                      canRestoreContentOffset: false)
+        }
+
+        var newContentInset: UIEdgeInsets = textInputView.contentInset
+        newContentInset.bottom = textInputView.frame.size.height-textInputViewHeight
+        newContentInset.bottom -= textInputView.safeAreaInsets.bottom
+
+        guard textInputView.contentInset != newContentInset else { return }
+        showLog("""
+                                \(textInputView) Old textInputView.contentInset: \(textInputView.contentInset)
+                                 New textInputView.contentInset: \(newContentInset)
+                                """)
+
+        activeConfiguration.animate(alongsideTransition: {
+
+            textInputView.contentInset = newContentInset
+            textInputView.layoutIfNeeded() // (Bug ID: #1996)
+            textInputView.scrollIndicatorInsets = newContentInset
+        })
+    }
+
+    func adjustRootController(moveUp: CGFloat, rootViewOrigin: CGPoint, originalKbSize: CGSize,
+                              rootController: UIViewController, rootBeginOrigin: CGPoint) {
+        // +Positive or zero.
+        var rootViewOrigin: CGPoint = rootViewOrigin
+        if moveUp >= 0 {
+
+            rootViewOrigin.y = CGFloat.maximum(rootViewOrigin.y - moveUp, CGFloat.minimum(0, -originalKbSize.height))
+
+            if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
+                showLog("Moving Upward")
+
+                activeConfiguration.animate(alongsideTransition: {
+
+                    var rect: CGRect = rootController.view.frame
+                    rect.origin = rootViewOrigin
+                    rootController.view.frame = rect
+
+                    // Animating content if needed (Bug ID: #204)
+                    if self.layoutIfNeededOnUpdate {
+                        // Animating content (Bug ID: #160)
+                        rootController.view.setNeedsLayout()
+                        rootController.view.layoutIfNeeded()
+                    }
+
+                    let classNameString: String = "\(type(of: rootController.self))"
+                    self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
+                })
+            }
+
+            movedDistance = rootBeginOrigin.y-rootViewOrigin.y
+        } else {  //  -Negative
+            let disturbDistance: CGFloat = rootViewOrigin.y-rootBeginOrigin.y
+
+            //  disturbDistance Negative = frame disturbed.
+            //  disturbDistance positive = frame not disturbed.
+            if disturbDistance <= 0 {
+
+                rootViewOrigin.y -= CGFloat.maximum(moveUp, disturbDistance)
+
+                if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
+                    showLog("Moving Downward")
+                    //  Setting adjusted rootViewRect
+                    //  Setting adjusted rootViewRect
+
+                    activeConfiguration.animate(alongsideTransition: {
+
+                        var rect: CGRect = rootController.view.frame
+                        rect.origin = rootViewOrigin
+                        rootController.view.frame = rect
+
+                        // Animating content if needed (Bug ID: #204)
+                        if self.layoutIfNeededOnUpdate {
+                            // Animating content (Bug ID: #160)
+                            rootController.view.setNeedsLayout()
+                            rootController.view.layoutIfNeeded()
+                        }
+
+                        let classNameString: String = "\(type(of: rootController.self))"
+                        self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
+                    })
+                }
+
+                movedDistance = rootBeginOrigin.y-rootViewOrigin.y
+            }
+        }
+    }
+
+    func restoreScrollViewContentOffset(superScrollView: UIScrollView, textInputView: (some IQTextInputView)?) {
+        var superScrollView: UIScrollView? = superScrollView
+        while let scrollView: UIScrollView = superScrollView {
+
+            let width: CGFloat = CGFloat.maximum(scrollView.contentSize.width, scrollView.frame.width)
+            let height: CGFloat = CGFloat.maximum(scrollView.contentSize.height, scrollView.frame.height)
+            let contentSize: CGSize = CGSize(width: width, height: height)
+
+            let minimumY: CGFloat = contentSize.height - scrollView.frame.height
+
+            if minimumY < scrollView.contentOffset.y {
+
+                let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: minimumY)
+                if !scrollView.contentOffset.equalTo(newContentOffset) {
+
+                    //  (Bug ID: #1365, #1508, #1541)
+                    let stackView: UIStackView?
+                    if let textInputView: UIView = textInputView {
+                        stackView = textInputView.iq.superviewOf(type: UIStackView.self,
+                                                                 belowView: scrollView)
+                    } else {
+                        stackView = nil
+                    }
+
+                    // (Bug ID: #1901, #1996)
+                    let animatedContentOffset: Bool = stackView != nil ||
+                    scrollView is UICollectionView ||
+                    scrollView is UITableView
+
+                    if animatedContentOffset {
+                        scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
+                    } else {
+                        scrollView.contentOffset = newContentOffset
+                    }
+
+                    showLog("Restoring contentOffset to: \(newContentOffset)")
+                }
+            }
+
+            superScrollView = scrollView.iq.superviewOf(type: UIScrollView.self)
+        }
+    }
+}
+// swiftlint:enable function_parameter_count
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift
new file mode 100644 (file)
index 0000000..b6f232f
--- /dev/null
@@ -0,0 +1,133 @@
+//
+//  IQKeyboardManager.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+/**
+Code-less drop-in universal library allows to prevent issues of keyboard sliding up and cover TextInputView.
+ Neither need to write any code nor any setup required and much more.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardManager: NSObject {
+
+    /**
+    Returns the default singleton instance.
+    */
+    @MainActor
+    public static let shared: IQKeyboardManager = .init()
+
+    internal var activeConfiguration: IQActiveConfiguration = .init()
+
+    // MARK: UIKeyboard handling
+
+    /**
+    Enable/disable managing distance between keyboard and textInputView.
+     Default is YES(Enabled when class loads in `+(void)load` method).
+    */
+    public var isEnabled: Bool = false {
+        didSet {
+            guard isEnabled != oldValue else { return }
+            // If not enable, enable it.
+            if isEnabled {
+                // If keyboard is currently showing.
+                if activeConfiguration.keyboardInfo.isVisible {
+                    adjustPosition()
+                } else {
+                    restorePosition()
+                }
+                showLog("Enabled")
+            } else {   // If not disable, disable it.
+                restorePosition()
+                showLog("Disabled")
+            }
+        }
+    }
+
+    /**
+    To set keyboard distance from textInputView. can't be less than zero. Default is 10.0.
+    */
+    public var keyboardDistance: CGFloat = 10.0
+
+    /*******************************************/
+
+    // MARK: UIAnimation handling
+
+    /**
+    If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view.
+    */
+    public var layoutIfNeededOnUpdate: Bool = false
+
+    // MARK: Class Level disabling methods
+
+    /**
+     Disable distance handling within the scope of disabled distance handling viewControllers classes.
+     Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.
+     */
+    public var disabledDistanceHandlingClasses: [UIViewController.Type] = [
+        UITableViewController.self,
+        UIInputViewController.self,
+        UIAlertController.self
+    ]
+
+    /**
+     Enable distance handling within the scope of enabled distance handling viewControllers classes.
+     Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.
+     If same Class is added in disabledDistanceHandlingClasses list,
+     then enabledDistanceHandlingClasses will be ignored.
+     */
+    public var enabledDistanceHandlingClasses: [UIViewController.Type] = []
+
+    /**************************************************************************************/
+
+    // MARK: Initialization/De-initialization
+
+    /*  Singleton Object Initialization. */
+    private override init() {
+
+        super.init()
+
+        self.addActiveConfigurationObserver()
+
+        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)),
+                                               name: UIApplication.didBecomeActiveNotification, object: nil)
+    }
+
+    deinit {
+        //  Disable the keyboard manager.
+        isEnabled = false
+    }
+
+    // MARK: Public Methods
+
+    /*  Refreshes textInputView position if any external changes is explicitly made by user.   */
+    public func reloadLayoutIfNeeded() {
+
+        guard privateIsEnabled(),
+              activeConfiguration.keyboardInfo.isVisible,
+              activeConfiguration.isReady else {
+                return
+        }
+        adjustPosition()
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift
new file mode 100644 (file)
index 0000000..91c2534
--- /dev/null
@@ -0,0 +1,118 @@
+//
+//  UIScrollView+IQKeyboardManagerExtension.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+    static var ignoreScrollingAdjustment: Int = 0
+    static var ignoreContentInsetAdjustment: Int = 0
+    static var restoreContentOffset: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIScrollView {
+
+    /**
+     If YES, then scrollview will ignore scrolling (simply not scroll it) for adjusting textInputView position.
+     Default is NO.
+     */
+    var ignoreScrollingAdjustment: Bool {
+        get {
+            if let base = base {
+                return objc_getAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment) as? Bool ?? false
+            }
+            return false
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment,
+                                         newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+
+    /**
+     If YES, then scrollview will ignore content inset adjustment (simply not updating it) when keyboard is shown.
+     Default is NO.
+     */
+    var ignoreContentInsetAdjustment: Bool {
+        get {
+            if let base = base {
+                return objc_getAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment) as? Bool ?? false
+            }
+            return false
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment,
+                                         newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+
+    /**
+     If we should restore scrollView contentOffset to it's initial position
+     */
+    var restoreContentOffset: Bool {
+        get {
+            if let base = base {
+                return objc_getAssociatedObject(base, &AssociatedKeys.restoreContentOffset) as? Bool ?? false
+            }
+            return false
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.restoreContentOffset,
+                                         newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIScrollView {
+    @available(*, unavailable, renamed: "iq.ignoreScrollingAdjustment")
+    var shouldIgnoreScrollingAdjustment: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "iq.ignoreContentInsetAdjustment")
+    var shouldIgnoreContentInsetAdjustment: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "iq.restoreContentOffset")
+    var shouldRestoreScrollViewContentOffset: Bool {
+        get { false }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift
new file mode 100644 (file)
index 0000000..7a7c4b4
--- /dev/null
@@ -0,0 +1,46 @@
+//
+//  UIScrollView+IQKeyboardManagerExtensionObjc.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UIScrollView {
+
+    var iq_ignoreScrollingAdjustment: Bool {
+        get { iq.ignoreScrollingAdjustment }
+        set { iq.ignoreScrollingAdjustment = newValue }
+    }
+
+    var iq_ignoreContentInsetAdjustment: Bool {
+        get { iq.ignoreContentInsetAdjustment }
+        set { iq.ignoreContentInsetAdjustment = newValue }
+    }
+
+    var iq_restoreContentOffset: Bool {
+        get { iq.restoreContentOffset }
+        set { iq.restoreContentOffset = newValue }
+    }
+}
+// swiftlint:enable identifier_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift
new file mode 100644 (file)
index 0000000..57fb2c8
--- /dev/null
@@ -0,0 +1,106 @@
+//
+//  UIView+IQKeyboardManagerExtension.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+    static var distanceFromKeyboard: Int = 0
+    static var enableMode: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+    nonisolated static let defaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
+}
+
+@available(iOSApplicationExtension, unavailable)
+@available(*, unavailable, renamed: "UIView.defaultKeyboardDistance")
+nonisolated public let kIQUseDefaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
+
+/**
+ TextInputView category for managing distance handling
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+    /**
+     To set customized distance from keyboard for textInputView. Can't be less than zero
+     */
+    var distanceFromKeyboard: CGFloat {
+        get {
+            if let base = base {
+                if let value = objc_getAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard) as? CGFloat {
+                    return value
+                }
+            }
+            return UIView.defaultKeyboardDistance
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard,
+                                         newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+
+    /**
+     Override Enable/disable managing distance between
+     keyboard and textInputView behavior for this particular textInputView.
+     */
+    var enableMode: IQEnableMode {
+        get {
+            if let base = base {
+                return objc_getAssociatedObject(base, &AssociatedKeys.enableMode) as? IQEnableMode ?? .default
+            }
+            return .default
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.enableMode, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+    @available(*, unavailable, renamed: "iq.distanceFromKeyboard")
+    var keyboardDistanceFromTextField: CGFloat {
+        get { 0 }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "iq.enableMode")
+    var enableMode: IQEnableMode {
+        get { .default }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift
new file mode 100644 (file)
index 0000000..84b52c8
--- /dev/null
@@ -0,0 +1,55 @@
+//
+//  UIView+IQKeyboardManagerExtensionObjc.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+    var iq_distanceFromKeyboard: CGFloat {
+        get { iq.distanceFromKeyboard }
+        set { iq.distanceFromKeyboard = newValue }
+    }
+
+    var iq_enableMode: IQEnableMode {
+        get { iq.enableMode }
+        set { iq.enableMode = newValue }
+    }
+}
+
+@objc public extension UITextView {
+
+    var iq_distanceFromKeyboard: CGFloat {
+        get { iq.distanceFromKeyboard }
+        set { iq.distanceFromKeyboard = newValue }
+    }
+
+    var iq_enableMode: IQEnableMode {
+        get { iq.enableMode }
+        set { iq.enableMode = newValue }
+    }
+}
+// swiftlint:enable identifier_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift
new file mode 100644 (file)
index 0000000..99238ad
--- /dev/null
@@ -0,0 +1,45 @@
+//
+//  UICollectionView+IndexPaths.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension UICollectionView {
+
+    func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
+        var previousRow: Int = indexPath.row - 1
+        var previousSection: Int = indexPath.section
+
+        // Fixing indexPath
+        if previousRow < 0 {
+            previousSection -= 1
+            if previousSection >= 0 {
+                previousRow = self.numberOfItems(inSection: previousSection) - 1
+            }
+        }
+
+        guard previousRow >= 0, previousSection >= 0 else { return nil }
+        return IndexPath(item: previousRow, section: previousSection)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift
new file mode 100644 (file)
index 0000000..5b61fa8
--- /dev/null
@@ -0,0 +1,45 @@
+//
+//  UITableView+IndexPaths.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension UITableView {
+
+    func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
+        var previousRow: Int = indexPath.row - 1
+        var previousSection: Int = indexPath.section
+
+        // Fixing indexPath
+        if previousRow < 0 {
+            previousSection -= 1
+            if previousSection >= 0 {
+                previousRow = self.numberOfRows(inSection: previousSection) - 1
+            }
+        }
+
+        guard previousRow >= 0, previousSection >= 0 else { return nil }
+        return IndexPath(row: previousRow, section: previousSection)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift
new file mode 100644 (file)
index 0000000..cf2e63c
--- /dev/null
@@ -0,0 +1,99 @@
+//
+//  UIView+Parent.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+/**
+UIView hierarchy category.
+*/
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: UIView {
+
+    /**
+     Returns the UIViewController object that is actually the parent of this object.
+     Most of the time it's the viewController object which actually contains it,
+     but result may be different if it's viewController is added as childViewController of another viewController.
+     */
+    func parentContainerViewController() -> UIViewController? {
+
+        var matchController: UIViewController? = viewContainingController()
+        var parentContainerViewController: UIViewController?
+
+        if var navController: UINavigationController = matchController?.navigationController {
+
+            while let parentNav: UINavigationController = navController.navigationController {
+                navController = parentNav
+            }
+
+            var parentController: UIViewController = navController
+
+            while let parent: UIViewController = parentController.parent,
+                  !(parent is UINavigationController) &&
+                   !(parent is UITabBarController) &&
+                   !(parent is UISplitViewController) {
+
+                        parentController = parent
+            }
+
+            if navController == parentController {
+                parentContainerViewController = navController.topViewController
+            } else {
+                parentContainerViewController = parentController
+            }
+        } else if let tabController: UITabBarController = matchController?.tabBarController {
+            let selectedController = tabController.selectedViewController
+            if let navController: UINavigationController = selectedController as? UINavigationController {
+                parentContainerViewController = navController.topViewController
+            } else {
+                parentContainerViewController = tabController.selectedViewController
+            }
+        } else {
+            while let parent: UIViewController = matchController?.parent,
+                  !(parent is UINavigationController) &&
+                   !(parent is UITabBarController) &&
+                   !(parent is UISplitViewController) {
+
+                        matchController = parent
+            }
+
+            parentContainerViewController = matchController
+        }
+
+        if let controller: UIViewController = parentContainerViewController?.iq_parentContainerViewController() {
+            return controller
+        } else {
+            return parentContainerViewController
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+    @available(*, unavailable, renamed: "iq.parentContainerViewController()")
+    func parentContainerViewController() -> UIViewController? { nil }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift
new file mode 100644 (file)
index 0000000..9c0730e
--- /dev/null
@@ -0,0 +1,31 @@
+//
+//  UIView+ParentObjc.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@objc public extension UIView {
+
+    func iq_parentContainerViewController() -> UIViewController? {
+        iq.parentContainerViewController()
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift
new file mode 100644 (file)
index 0000000..7fc96a9
--- /dev/null
@@ -0,0 +1,49 @@
+//
+//  UIViewController+ParentContainer.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UIViewController {
+
+    /**
+     This method is provided to override by viewController's
+     if the library lifts a viewController which you doesn't want to lift.
+     This may happen if you have implemented side menu feature
+     in your app and the library try to lift the side menu controller.
+     Overriding this method in side menu class to return correct controller should fix the problem.
+    */
+    open func iq_parentContainerViewController() -> UIViewController? {
+        return self
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UIViewController {
+    @available(*, unavailable, renamed: "iq_parentContainerViewController()")
+    open func parentIQContainerViewController() -> UIViewController? {
+        return self
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift
new file mode 100644 (file)
index 0000000..4cf109c
--- /dev/null
@@ -0,0 +1,137 @@
+//
+//  IQKeyboardManager+ToolbarManager.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardToolbarManager
+
+@available(iOSApplicationExtension, unavailable)
+// swiftlint:disable line_length
+@available(*, deprecated,
+            message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
+// swiftlint:enable line_length
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @MainActor
+    private struct AssociatedKeys {
+        static var toolbarManager: Int = 0
+    }
+
+    internal var toolbarManager: IQKeyboardToolbarManager {
+        IQKeyboardToolbarManager.shared
+    }
+
+    var enableToolbarDebugging: Bool {
+        get { toolbarManager.isDebuggingEnabled }
+        set { toolbarManager.isDebuggingEnabled = newValue }
+    }
+
+    /**
+     Automatic add the toolbar functionality. Default is YES.
+     */
+    var enableAutoToolbar: Bool {
+        get { toolbarManager.isEnabled }
+        set { toolbarManager.isEnabled = newValue }
+    }
+
+    /**
+     Configurations related to the toolbar display over the keyboard.
+     */
+    var toolbarConfiguration: IQKeyboardToolbarConfiguration {
+        toolbarManager.toolbarConfiguration
+    }
+
+    // MARK: UISound handling
+
+    /**
+     If YES, then it plays inputClick sound on next/previous/done click.
+     */
+    var playInputClicks: Bool {
+        get { toolbarManager.playInputClicks }
+        set { toolbarManager.playInputClicks = newValue }
+    }
+
+    /**
+     Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes.
+     Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
+     */
+    var disabledToolbarClasses: [UIViewController.Type] {
+        get { toolbarManager.disabledToolbarClasses }
+        set { toolbarManager.disabledToolbarClasses = newValue }
+    }
+
+    /**
+     Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes.
+     Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
+     If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
+     */
+    var enabledToolbarClasses: [UIViewController.Type] {
+        get { toolbarManager.enabledToolbarClasses }
+        set { toolbarManager.enabledToolbarClasses = newValue }
+    }
+
+    /**
+     Allowed subclasses of UIView to add all inner textField,
+     this will allow to navigate between textField contains in different superview.
+     Class should be kind of UIView.
+     */
+    var deepResponderAllowedContainerClasses: [UIView.Type] {
+        get { toolbarManager.deepResponderAllowedContainerClasses }
+        set { toolbarManager.deepResponderAllowedContainerClasses = newValue }
+    }
+
+    /**    reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
+    func reloadInputViews() {
+        toolbarManager.reloadInputViews()
+    }
+
+    /**
+     Returns YES if can navigate to previous responder textInputView, otherwise NO.
+     */
+    var canGoPrevious: Bool {
+        toolbarManager.canGoPrevious
+    }
+
+    /**
+     Returns YES if can navigate to next responder textInputViews, otherwise NO.
+     */
+    var canGoNext: Bool {
+        toolbarManager.canGoNext
+    }
+
+    /**
+     Navigate to previous responder textInputViews
+    */
+    @discardableResult
+    func goPrevious() -> Bool {
+        toolbarManager.goPrevious()
+    }
+
+    /**
+     Navigate to next responder textInputView.
+    */
+    @discardableResult
+    func goNext() -> Bool {
+        toolbarManager.goNext()
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift
new file mode 100644 (file)
index 0000000..e6b7321
--- /dev/null
@@ -0,0 +1,177 @@
+//
+//  IQKeyboardManager+ToolbarManagerDeprecated.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardToolbarManager
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable identifier_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @available(*, unavailable, renamed: "playInputClicks")
+    var shouldPlayInputClicks: Bool {
+        get { false }
+        set { }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior")
+    var toolbarManageBehaviour: IQKeyboardToolbarManageBehavior {
+        get { .bySubviews }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor")
+    var shouldToolbarUsesTextFieldTintColor: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.tintColor")
+    var toolbarTintColor: UIColor? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor")
+    var toolbarBarTintColor: UIColor? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode")
+    var previousNextDisplayMode: IQPreviousNextDisplayMode {
+        get { .default }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses")
+    var toolbarPreviousNextAllowedClasses: [UIView.Type] {
+        get { [] }
+        set { }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image",
+                message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+    var toolbarPreviousBarButtonItemImage: UIImage? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title",
+                message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+    var toolbarPreviousBarButtonItemText: String? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel",
+                message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+    var toolbarPreviousBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image",
+                message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+    var toolbarNextBarButtonItemImage: UIImage? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title",
+                message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+    var toolbarNextBarButtonItemText: String? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel",
+                message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+    var toolbarNextBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image",
+                message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+    var toolbarDoneBarButtonItemImage: UIImage? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title",
+                message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+    var toolbarDoneBarButtonItemText: String? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel",
+                message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+    var toolbarDoneBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel")
+    var toolbarTitleBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder")
+    var shouldShowToolbarPlaceholder: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font")
+    var placeholderFont: UIFont? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color")
+    var placeholderColor: UIColor? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor")
+    var placeholderButtonColor: UIColor? {
+        get { nil }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift
new file mode 100644 (file)
index 0000000..5fc408d
--- /dev/null
@@ -0,0 +1,100 @@
+//
+//  IQKeyboardManager+Resign.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @MainActor
+    private struct AssociatedKeys {
+        static var resignHandler: Int = 0
+    }
+
+    internal var resignHandler: IQKeyboardResignHandler {
+        if let object = objc_getAssociatedObject(self, &AssociatedKeys.resignHandler)
+            as? IQKeyboardResignHandler {
+            return object
+        }
+
+        let object: IQKeyboardResignHandler = .init()
+        objc_setAssociatedObject(self, &AssociatedKeys.resignHandler,
+                                 object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+
+        return object
+    }
+
+    /**
+     Resigns Keyboard on touching outside TextInputView. Default is NO.
+     */
+    var resignOnTouchOutside: Bool {
+        get { resignHandler.resignOnTouchOutside }
+        set { resignHandler.resignOnTouchOutside = newValue }
+    }
+
+    /** TapGesture to resign keyboard on view's touch.
+     It's a readonly property and exposed only for adding/removing dependencies
+     if your added gesture does have collision with this one
+     */
+    var resignGesture: UITapGestureRecognizer {
+        get { resignHandler.resignGesture }
+        set { resignHandler.resignGesture = newValue }
+    }
+
+    /**
+     Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
+     */
+    var disabledTouchResignedClasses: [UIViewController.Type] {
+        get { resignHandler.disabledTouchResignedClasses }
+        set { resignHandler.disabledTouchResignedClasses = newValue }
+    }
+
+    /**
+     Enabled classes to forcefully enable 'resignOnTouchOutside' property.
+     Class should be kind of UIViewController
+     . If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
+     */
+    var enabledTouchResignedClasses: [UIViewController.Type] {
+        get { resignHandler.enabledTouchResignedClasses }
+        set { resignHandler.enabledTouchResignedClasses = newValue }
+    }
+
+    /**
+     if resignOnTouchOutside is enabled then you can customize the behavior
+     to not recognize gesture touches on some specific view subclasses.
+     Class should be kind of UIView. Default is [UIControl, UINavigationBar]
+     */
+    var touchResignedGestureIgnoreClasses: [UIView.Type] {
+        get { resignHandler.touchResignedGestureIgnoreClasses }
+        set { resignHandler.touchResignedGestureIgnoreClasses = newValue }
+    }
+
+    /**
+     Resigns currently first responder field.
+     */
+    @discardableResult
+    func resignFirstResponder() -> Bool {
+        resignHandler.resignFirstResponder()
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift
new file mode 100644 (file)
index 0000000..b304c72
--- /dev/null
@@ -0,0 +1,37 @@
+//
+//  IQKeyboardManager+Resign_Deprecated.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardManager {
+
+    @available(*, unavailable, renamed: "resignOnTouchOutside")
+    var shouldResignOnTouchOutside: Bool {
+        get { false }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift
new file mode 100644 (file)
index 0000000..3c59049
--- /dev/null
@@ -0,0 +1,103 @@
+//
+//  IQKeyboardResignHandler+Internal.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardResignHandler {
+
+    func removeTextInputViewObserver() {
+        textInputViewObserver.unsubscribe(identifier: "IQKeyboardResignHandler")
+    }
+
+    func addTextInputViewObserver() {
+        textInputViewObserver.subscribe(identifier: "IQKeyboardResignHandler",
+                                        changeHandler: { [weak self] event, textInputView in
+            guard let self = self else { return }
+            switch event {
+            case .beginEditing:
+                self.resignGesture.isEnabled = self.privateResignOnTouchOutside()
+                textInputView.window?.addGestureRecognizer(self.resignGesture)
+            case .endEditing:
+                textInputView.window?.removeGestureRecognizer(self.resignGesture)
+            }
+        })
+    }
+
+    func privateResignOnTouchOutside() -> Bool {
+
+        guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
+            return resignOnTouchOutside
+        }
+
+        switch textInputView.internalResignOnTouchOutsideMode {
+        case .default:
+            guard var controller = (textInputView as UIView).iq.viewContainingController() else {
+                return resignOnTouchOutside
+            }
+
+            // If it is searchBar textField embedded in Navigation Bar
+            if (textInputView as UIView).iq.textFieldSearchBar() != nil,
+               let navController: UINavigationController = controller as? UINavigationController,
+               let topController: UIViewController = navController.topViewController {
+                controller = topController
+            }
+
+            // If viewController is in enabledTouchResignedClasses, then assuming resignOnTouchOutside is enabled.
+            let isWithEnabledClass: Bool = enabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) })
+            var isEnabled: Bool = resignOnTouchOutside || isWithEnabledClass
+
+            if isEnabled {
+
+                // If viewController is in disabledTouchResignedClasses,
+                // then assuming resignOnTouchOutside is disable.
+                if disabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) }) {
+                    isEnabled = false
+                } else {
+                    let classNameString: String = "\(type(of: controller.self))"
+
+                    // _UIAlertControllerTextFieldViewController
+                    if classNameString.contains("UIAlertController"),
+                       classNameString.hasSuffix("TextFieldViewController") {
+                        isEnabled = false
+                    }
+                }
+            }
+            return isEnabled
+        case .enabled:
+            return true
+        case .disabled:
+            return false
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+    var internalResignOnTouchOutsideMode: IQEnableMode {
+        iq.resignOnTouchOutsideMode
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift
new file mode 100644 (file)
index 0000000..2ce0667
--- /dev/null
@@ -0,0 +1,149 @@
+//
+//  IQKeyboardResignHandler.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+import IQTextInputViewNotification
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers internal final class IQKeyboardResignHandler: NSObject {
+
+    let textInputViewObserver: IQTextInputViewNotification = .init()
+
+    /**
+     Resigns Keyboard on touching outside of TextInputView. Default is NO.
+    */
+    public var resignOnTouchOutside: Bool = false {
+
+        didSet {
+            resignGesture.isEnabled = privateResignOnTouchOutside()
+
+            IQKeyboardManager.shared.showLog("resignOnTouchOutside: \(resignOnTouchOutside ? "Yes" : "No")")
+        }
+    }
+
+    /** TapGesture to resign keyboard on view's touch.
+     It's a readonly property and exposed only for adding/removing dependencies
+     if your added gesture does have collision with this one
+     */
+    public var resignGesture: UITapGestureRecognizer = .init()
+
+    /**
+     Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
+     */
+    public var disabledTouchResignedClasses: [UIViewController.Type] = [
+        UIAlertController.self,
+        UIInputViewController.self
+    ]
+
+    /**
+     Enabled classes to forcefully enable 'resignOnTouchOutside' property.
+     Class should be kind of UIViewController
+     . If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
+     */
+    public var enabledTouchResignedClasses: [UIViewController.Type] = []
+
+    /**
+     if resignOnTouchOutside is enabled then you can customize the behavior
+     to not recognize gesture touches on some specific view subclasses.
+     Class should be kind of UIView. Default is [UIControl, UINavigationBar]
+     */
+    public var touchResignedGestureIgnoreClasses: [UIView.Type] = [
+        UIControl.self,
+        UINavigationBar.self
+    ]
+
+    /**
+    Resigns currently first responder field.
+    */
+    @discardableResult
+    public func resignFirstResponder() -> Bool {
+
+        guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
+            return false
+        }
+
+        // Resigning first responder
+        guard textInputView.resignFirstResponder() else {
+//            showLog("Refuses to resign first responder: \(textInputView)")
+            //  If it refuses then becoming it as first responder again.    (Bug ID: #96)
+            // If it refuses to resign then becoming it first responder again for getting notifications callback.
+            textInputView.becomeFirstResponder()
+            return false
+        }
+        return true
+    }
+
+    public override init() {
+        super.init()
+
+        resignGesture.addTarget(self, action: #selector(self.tapRecognized(_:)))
+        resignGesture.cancelsTouchesInView = false
+        resignGesture.delegate = self
+        resignGesture.isEnabled = false
+
+        addTextInputViewObserver()
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardResignHandler: UIGestureRecognizerDelegate {
+
+    /** Resigning on tap gesture.   (Enhancement ID: #14)*/
+    private func tapRecognized(_ gesture: UITapGestureRecognizer) {
+
+        if gesture.state == .ended {
+
+            // Resigning currently responder textInputView.
+            resignFirstResponder()
+        }
+    }
+
+    /** Note: returning YES is guaranteed to allow simultaneous recognition.
+     returning NO is not guaranteed to prevent simultaneous recognition,
+     as the other gesture's delegate may return YES.
+     */
+    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
+                                  shouldRecognizeSimultaneouslyWith
+                                  otherGestureRecognizer: UIGestureRecognizer) -> Bool {
+        return false
+    }
+
+    /**
+     To not detect touch events in a subclass of UIControl,
+     these may have added their own selector for specific work
+     */
+    public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
+                                  shouldReceive touch: UITouch) -> Bool {
+        // (Bug ID: #145)
+        // Should not recognize gesture if the clicked view is either UIControl or UINavigationBar(<Back button etc...)
+
+        for ignoreClass in touchResignedGestureIgnoreClasses where touch.view?.isKind(of: ignoreClass) ?? false {
+            return false
+        }
+
+        return true
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift
new file mode 100644 (file)
index 0000000..006090f
--- /dev/null
@@ -0,0 +1,69 @@
+//
+//  UIView+Resign.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+    static var resignOnTouchOutsideMode: Int = 0
+}
+
+/**
+ TextInputView category for managing touch resign
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+    /**
+     Override resigns Keyboard on touching outside of TextInputView behavior for this particular textInputView.
+     */
+    var resignOnTouchOutsideMode: IQEnableMode {
+        get {
+            guard let base = base else {
+                return .default
+            }
+            return objc_getAssociatedObject(base, &AssociatedKeys.resignOnTouchOutsideMode) as? IQEnableMode ?? .default
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.resignOnTouchOutsideMode,
+                                         newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+    @available(*, unavailable, renamed: "iq.resignOnTouchOutsideMode")
+    var shouldResignOnTouchOutsideMode: IQEnableMode {
+        get { .default }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+ResignObjc.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+ResignObjc.swift
new file mode 100644 (file)
index 0000000..7616ba8
--- /dev/null
@@ -0,0 +1,45 @@
+//
+//  UIView+ResignObjc.swift
+//  https://github.com/hackiftekhar/IQKeyboardManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+    var iq_resignOnTouchOutsideMode: IQEnableMode {
+        get { iq.resignOnTouchOutsideMode }
+        set { iq.resignOnTouchOutsideMode = newValue }
+    }
+}
+
+@objc public extension UITextView {
+
+    var iq_resignOnTouchOutsideMode: IQEnableMode {
+        get { iq.resignOnTouchOutsideMode }
+        set { iq.resignOnTouchOutsideMode = newValue }
+    }
+}
+// swiftlint:enable identifier_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/LICENSE.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/LICENSE.md
new file mode 100644 (file)
index 0000000..0c652ed
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2013-2023 Iftekhar Qurashi
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardManagerSwift/README.md
new file mode 100644 (file)
index 0000000..6d3a695
--- /dev/null
@@ -0,0 +1,236 @@
+<p align="center">
+  <img src="https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/Social.png" alt="Icon"/>
+</p>
+
+[![LICENSE.md](https://img.shields.io/github/license/hackiftekhar/IQKeyboardManager.svg)]([https://travis-ci.org/hackiftekhar/IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/LICENSE.md))
+[![Build Status](https://travis-ci.org/hackiftekhar/IQKeyboardManager.svg)](https://travis-ci.org/hackiftekhar/IQKeyboardManager)
+![Platform iOS](https://img.shields.io/badge/Platform-iOS-blue.svg?style=fla)
+[![CocoaPods](https://img.shields.io/cocoapods/v/IQKeyboardManagerSwift.svg)](http://cocoadocs.org/docsets/IQKeyboardManagerSwift)
+[![Github tag](https://img.shields.io/github/tag/hackiftekhar/iqkeyboardmanager.svg)](https://github.com/hackiftekhar/IQKeyboardManager/tags)
+
+## Major updates have arrived!
+
+#### First of all, Thank You for using IQKeyboardManager!
+It's been 12 years since it's first release in 2013. The library has grown a lot and we have added many new features since then.
+
+#### Motivation
+Recently while working on bug fixes, I realized that in 2013 there were only 2 files IQKeyboardManager.{h,m} in Objective-C version, while now in Swift version there were 50+ files (version 7.x.x) which makes the debugging a lot difficult than before. Also, some of the features are rarely used in apps.
+
+#### New Idea
+I realized that some of the features are not tightly linked to each other and can be moved out of the library easily. For Example:-
+- `IQTextView` class
+- `IQKeyboardListener` class
+- `IQTextFieldViewListener` class
+- `IQReturnKeyHandler` class
+- Toolbar related features like `IQToolbar` and `IQBarButtonItem` and their support classes.
+- ...
+
+Moving above things out will make the library more lightweight and user can plug in/out features as per their needs.
+
+#### Action Plan Execution
+I had decided to move loosely linked features out, and publish them to their separate github repo, and use them as dependencies as per requirements.
+
+- [x] Published [IQKeyboardCore](https://github.com/hackiftekhar/IQKeyboardCore)
+ - This contains necessary classes and functions to be used by `IQKeyboardManager` related libraries. Please note that you shouldn't directly install this as dependency
+- [x] Published [IQTextView](https://github.com/hackiftekhar/IQTextView)
+ - This is purely separated a separate library now.
+ - This is usually used for showing placeholder in `UITextView`.
+- [x] Published [IQKeyboardReturnManager](https://github.com/hackiftekhar/IQKeyboardReturnManager)
+ - This is a renamed of `IQReturnKeyHandler`. This is also separated from the library and can be used independently.
+ - This depends on `IQKeyboardCore` for `TextInputView` type confirmation.
+- [x] Published [IQTextInputViewNotification](https://github.com/hackiftekhar/IQTextInputViewNotification)
+ - This is a renamed of `IQTextFieldViewListener`. This can be used independently to subscribe/unsubscribe for `UITextView`/`UITextField` beginEditing/endEditing events.
+ - This depends on the `IQKeyboardCore` to add some additional customized features for `UITextView`/`UITextField`.
+- [x] Published [IQKeyboardToolbar](https://github.com/hackiftekhar/IQKeyboardToolbar)
+ - This contains toolbar related classes like `IQKeyboardToolbar`, `IQBarButtonItem`, `IQTitleBarButtonItems`, their configuration classes and other useful functions to add toolbar in keyboard. This can be used independently to add toolbar in keyboard.
+ - This depends on the `IQKeyboardCore` to add some additional customized features for `UITextView`/`UITextField`.
+- [x] Published [IQKeyboardToolbarManager](https://github.com/hackiftekhar/IQKeyboardToolbarManager)
+ - This is something similar to `IQKeyboardManager`. This has been moved out of the library as a huge update. 
+ - This depends on the `IQTextInputViewNotification` to know which textField is currently in focus.
+ - This depends on the `IQKeyboardToolbar` to add/remove toolbars over keyboard.
+- [x] Published [IQKeyboardNotification](https://github.com/hackiftekhar/IQKeyboardNotification)
+ - This is a renamed of `IQKeyboardListener`. This can be used independently to subscribe/unsubscribe for keyboard events.
+- [x] Published [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager) 7.2.0 for all the current support without any compilation error but by deprecating most of the things which are moved out of the library.
+ - This now only contains functions for handling distance between `UITextView`/`UITextField` and their useful functions.
+ - This depends on the `IQKeyboardNotification` to get keyboard notification callbacks.
+ - This depends on the `IQTextInputViewNotification` to know which textField is currently in focus.
+ - Now there are subspecs support since 7.2.0.
+  - `IQKeyboardManagerSwift/Appearance`
+  - `IQKeyboardManagerSwift/IQKeyboardReturnManager`
+  - `IQKeyboardManagerSwift/IQKeyboardToolbarManager`
+  - `IQKeyboardManagerSwift/IQTextView`
+  - `IQKeyboardManagerSwift/Resign`
+- [x] Published [IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager) 8.0.0 by marking deprecated classes as unavailable.
+ - In this release, we removed deprecated classes and marking some of them as unavailable for easier migration.
+- [ ] Bug fixes which may have arrived due to the library segregation.
+ - We need your support on this one.
+
+## Introduction
+While developing iOS apps, we often run into issues where the iPhone keyboard slides up and covers the `UITextField/UITextView`. `IQKeyboardManager` allows you to prevent this issue of keyboard sliding up and covering `UITextField/UITextView` without needing you to write any code or make any additional setup. To use `IQKeyboardManager` you simply need to add source files to your project.
+
+
+## Key Features
+
+1) `One Lines of Code`
+
+2) `Works Automatically`
+
+3) `No More UIScrollView`
+
+4) `No More Subclasses`
+
+5) `No More Manual Work`
+
+6) `No More #imports`
+
+`IQKeyboardManager` works on all orientations, and with the toolbar. It also has nice optional features allowing you to customize the distance from the text field, behavior of previous, next and done buttons in the keyboard toolbar, play sound when the user navigates through the form and more.
+
+
+## Screenshot
+[![Screenshot 1](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot1.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 2](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot2.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 3](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot3.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 4](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot4.png)](http://youtu.be/6nhLw6hju2A)
+[![Screenshot 5](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot5.png)](http://youtu.be/6nhLw6hju2A)
+
+## GIF animation
+[![IQKeyboardManager](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManager.gif)](http://youtu.be/6nhLw6hju2A)
+
+## Video
+
+<a href="http://youtu.be/WAYc2Qj-OQg" target="_blank"><img src="http://img.youtube.com/vi/WAYc2Qj-OQg/0.jpg"
+alt="IQKeyboardManager Demo Video" width="480" height="360" border="10" /></a>
+
+## Tutorial video by @rebeloper ([#1135](https://github.com/hackiftekhar/IQKeyboardManager/issues/1135))
+
+@rebeloper demonstrated two videos on how to implement **IQKeyboardManager** at it's core:
+
+<a href="https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v" target="_blank"><img src="https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/ThirdPartyYoutubeTutorial.jpg"
+alt="Youtube Tutorial Playlist"/></a>
+
+https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v
+
+## Warning
+
+- **If you're planning to build SDK/library/framework and want to handle UITextField/UITextView with IQKeyboardManager then you're totally going the wrong way.** I would never suggest to add **IQKeyboardManager** as **dependency/adding/shipping** with any third-party library. Instead of adding **IQKeyboardManager** you should implement your own solution to achieve same kind of results. **IQKeyboardManager** is totally designed for projects to help developers for their convenience, it's not designed for **adding/dependency/shipping** with any **third-party library**, because **doing this could block adoption by other developers for their projects as well (who are not using IQKeyboardManager and have implemented their custom solution to handle UITextField/UITextView in the project).**
+- If **IQKeyboardManager** conflicts with other **third-party library**, then it's **developer responsibility** to **enable/disable IQKeyboardManager** when **presenting/dismissing** third-party library UI. Third-party libraries are not responsible to handle IQKeyboardManager.
+
+## Requirements
+
+|                        | Language | Minimum iOS Target | Minimum Xcode Version |
+|------------------------|----------|--------------------|-----------------------|
+| IQKeyboardManager      | Obj-C    | iOS 13.0            | Xcode 13             |
+| IQKeyboardManagerSwift | Swift    | iOS 13.0            | Xcode 13             |
+| Demo Project           |          |                     | Xcode 15             |
+
+#### Swift versions support
+
+| Swift             | Xcode | IQKeyboardManagerSwift |
+|-------------------|-------|------------------------|
+| 5.9, 5.8, 5.7     | 16    | >= 7.0.0       |
+| 5.9, 5.8, 5.7, 5.6| 15    | >= 7.0.0       |
+| 5.5, 5.4, 5.3, 5.2, 5.1, 5.0, 4.2| 11  | >= 6.5.7       |
+| 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11  | >= 6.5.0       |
+| 5.0,4.2, 4.0, 3.2, 3.0| 10.2  | >= 6.2.1           |
+| 4.2, 4.0, 3.2, 3.0| 10.0  | >= 6.0.4               |
+| 4.0, 3.2, 3.0     | 9.0   | 5.0.0                  |
+
+
+Installation
+==========================
+
+#### CocoaPods
+
+***IQKeyboardManager (Objective-C):*** To install it, simply add the following line to your Podfile: ([#9](https://github.com/hackiftekhar/IQKeyboardManager/issues/9))
+
+```ruby
+pod 'IQKeyboardManager' #iOS13 and later
+```
+
+***IQKeyboardManager (Swift):*** To install it, simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236))
+
+```ruby
+pod 'IQKeyboardManagerSwift'
+```
+
+*Or you can choose the version you need based on Swift support table from [Requirements](README.md#requirements)*
+
+```ruby
+pod 'IQKeyboardManagerSwift', '8.0.0'
+```
+
+#### Carthage
+
+To integrate `IQKeyboardManger` or `IQKeyboardManagerSwift` into your Xcode project using Carthage, add the following line to your `Cartfile`:
+
+```ogdl
+github "hackiftekhar/IQKeyboardManager"
+```
+
+Run `carthage update --use-xcframeworks` to build the frameworks and drag the appropriate framework (`IQKeyboardManager.xcframework` or `IQKeyboardManagerSwift.xcframework`) into your Xcode project based on your need. Make sure to add only one framework, not both.
+
+#### Swift Package Manager (SPM)
+
+To install `IQKeyboardManagerSwift` package via Xcode
+
+ * Go to File -> Swift Packages -> Add Package Dependency...
+ * Then search for https://github.com/hackiftekhar/IQKeyboardManager.git
+ * And choose the version you want
+
+#### Source Code
+
+***IQKeyboardManager (Objective-C):*** Just ***drag and drop*** `IQKeyboardManager` directory from demo project to your project. That's it.
+
+***IQKeyboardManager (Swift):*** Source code installation is not supported (since 7.2.0) because now the library depends on some other independent libraries. Due to this you may face compilation issues.
+
+#### Basic Usage
+
+In `AppDelegate.swift`, just `import IQKeyboardManagerSwift` framework and enable IQKeyboardManager.
+
+```swift
+import IQKeyboardManagerSwift
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+    var window: UIWindow?
+
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+
+      IQKeyboardManager.shared.isEnabled = true
+
+      return true
+    }
+}
+```
+
+
+
+Migration Guide
+==========================
+- [IQKeyboardManager 8.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%207.0%20TO%208.0.md)
+
+Other Links
+==========================
+
+- [Known Issues](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Known-Issues)
+- [Manual Management Tweaks](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Manual-Management)
+- [Properties and functions usage](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Properties-&-Functions)
+
+## Flow Diagram
+[![IQKeyboardManager CFD](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerFlowDiagram.jpg)](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerFlowDiagram.jpg)
+
+If you would like to see detailed Flow diagram then check [Detailed Flow Diagram](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerCFD.jpg).
+
+
+LICENSE
+---
+Distributed under the MIT License.
+
+Contributions
+---
+Any contribution is more than welcome! You can contribute through pull requests and issues on GitHub.
+
+Author
+---
+If you wish to contact me, email at: hack.iftekhar@gmail.com
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardInfo.swift
new file mode 100644 (file)
index 0000000..0f6243d
--- /dev/null
@@ -0,0 +1,227 @@
+//
+//  IQKeyboardInfo.swift
+//  https://github.com/hackiftekhar/IQKeyboardNotification
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+public struct IQKeyboardInfo: Equatable {
+    nonisolated public static func == (lhs: Self, rhs: Self) -> Bool {
+        lhs.event == rhs.event &&
+        lhs.endFrame.equalTo(rhs.endFrame)
+    }
+
+    @objc public enum Event: Int, CaseIterable {
+        case willShow
+        case didShow
+        case willChangeFrame
+        case didChangeFrame
+        case willHide
+        case didHide
+
+        @MainActor
+        public var notification: Notification.Name {
+            switch self {
+            case .willShow:
+                return UIResponder.keyboardWillShowNotification
+            case .didShow:
+                return UIResponder.keyboardDidShowNotification
+            case .willChangeFrame:
+                return UIResponder.keyboardWillChangeFrameNotification
+            case .didChangeFrame:
+                return UIResponder.keyboardDidChangeFrameNotification
+            case .willHide:
+                return UIResponder.keyboardWillHideNotification
+            case .didHide:
+                return UIResponder.keyboardDidHideNotification
+            }
+        }
+    }
+
+    public let event: Event
+
+    /// `keyboardIsLocalUserInfoKey`.
+    public let isLocal: Bool
+
+    /// `UIKeyboardFrameBeginUserInfoKey`.
+    public let beginFrame: CGRect
+
+    /// `UIKeyboardFrameEndUserInfoKey`.
+    public let endFrame: CGRect
+
+    /// `UIKeyboardAnimationDurationUserInfoKey`.
+    public let animationDuration: TimeInterval
+
+    /// `UIKeyboardAnimationCurveUserInfoKey`.
+    public let animationCurve: UIView.AnimationCurve
+
+    public var animationOptions: UIView.AnimationOptions {
+        return UIView.AnimationOptions(rawValue: UInt(animationCurve.rawValue << 16))
+    }
+
+    public var isVisible: Bool {
+        endFrame.height > 0
+    }
+
+    internal init(notification: Notification?, event: Event) {
+        self.event = event
+
+        let screenBounds: CGRect
+        if let screen: UIScreen = notification?.object as? UIScreen {
+            screenBounds = screen.bounds
+        } else {
+            screenBounds = UIScreen.main.bounds
+        }
+
+        if let info: [AnyHashable: Any] = notification?.userInfo {
+
+            if let value = info[UIResponder.keyboardIsLocalUserInfoKey] as? Bool {
+                isLocal = value
+            } else {
+                isLocal = true
+            }
+
+            //  Getting keyboard animation.
+            if let curveValue: Int = info[UIResponder.keyboardAnimationCurveUserInfoKey] as? Int,
+               let curve: UIView.AnimationCurve = UIView.AnimationCurve(rawValue: curveValue) {
+                animationCurve = curve
+            } else {
+                animationCurve = .easeOut
+            }
+
+            //  Getting keyboard animation duration
+            if let duration: TimeInterval = info[UIResponder.keyboardAnimationDurationUserInfoKey] as? TimeInterval,
+               duration != 0.0 {
+                animationDuration = duration
+            } else {
+                animationDuration = 0.25
+            }
+
+            if let beginKeyboardFrame: CGRect = info[UIResponder.keyboardFrameBeginUserInfoKey] as? CGRect {
+                beginFrame = Self.getKeyboardFrame(of: beginKeyboardFrame, inScreenBounds: screenBounds)
+            } else {
+                beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+            }
+
+            if let endKeyboardFrame: CGRect = info[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect {
+                endFrame = Self.getKeyboardFrame(of: endKeyboardFrame, inScreenBounds: screenBounds)
+            } else {
+                endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+            }
+        } else {
+            isLocal = true
+            animationCurve = .easeOut
+            animationDuration = 0.25
+            beginFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+            endFrame = CGRect(x: 0, y: screenBounds.height, width: screenBounds.width, height: 0)
+        }
+    }
+
+    @MainActor
+    public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+
+        /* ******* */
+//        UIView.beginAnimations(nil, context: nil)
+//        UIView.setAnimationDuration(duration)
+//        UIView.setAnimationCurve(curve)
+//        UIView.setAnimationBeginsFromCurrentState(true)
+//        UIView.setAnimationDelegate(self)
+//        UIView.setAnimationDidStop(#selector(UIViewController.keyboardAnimationDidStop(_:finished:context:)))
+//
+//        keyboardStateDelegate?.keyboardTransitionAnimation(state)
+//
+//        UIView.commitAnimations()
+
+        /* ******* */
+//        if let timing = UIView.AnimationCurve.RawValue(exactly: animationCurve.rawValue),
+//           let curve = UIView.AnimationCurve(rawValue: timing) {
+//            let animator = UIViewPropertyAnimator(duration: animationDuration, curve: curve) {
+//                transition()
+//            }
+//            animator.addCompletion { _ in
+//                completion?()
+//            }
+//            animator.isUserInteractionEnabled = true
+//            animator.startAnimation()
+//        } else {
+        var animationOptions: UIView.AnimationOptions = self.animationOptions
+        animationOptions.formUnion(.allowUserInteraction)
+        animationOptions.formUnion(.beginFromCurrentState)
+        UIView.animate(withDuration: animationDuration, delay: 0,
+                       options: animationOptions,
+                       animations: transition,
+                       completion: { _ in
+            completion?()
+        })
+//        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+private extension IQKeyboardInfo {
+    static func getKeyboardFrame(of rect: CGRect, inScreenBounds screenBounds: CGRect) -> CGRect {
+        var finalFrame: CGRect = rect
+        // If this is floating keyboard
+        if finalFrame.width < screenBounds.width,
+           finalFrame.maxY < screenBounds.height {
+            finalFrame.size = CGSize(width: finalFrame.size.width, height: 0)
+        } else {
+            // (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
+            // Calculating actual keyboard covered size respect to window,
+            // keyboard frame may be different when hardware keyboard is attached
+            let keyboardHeight = CGFloat.maximum(screenBounds.height - finalFrame.minY, 0)
+            finalFrame.size = CGSize(width: finalFrame.size.width, height: keyboardHeight)
+        }
+
+        return finalFrame
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@objcMembers public class IQKeyboardInfoObjC: NSObject {
+    private let wrappedValue: IQKeyboardInfo
+
+    public var event: IQKeyboardInfo.Event { wrappedValue.event }
+
+    public var isLocal: Bool { wrappedValue.isLocal }
+
+    public var beginFrame: CGRect { wrappedValue.beginFrame }
+
+    public var endFrame: CGRect { wrappedValue.endFrame }
+
+    public var animationDuration: TimeInterval { wrappedValue.animationDuration }
+
+    public var animationCurve: UIView.AnimationCurve { wrappedValue.animationCurve }
+
+    public var animationOptions: UIView.AnimationOptions { wrappedValue.animationOptions }
+
+    public var isVisible: Bool { wrappedValue.isVisible }
+
+    init(wrappedValue: IQKeyboardInfo){
+        self.wrappedValue = wrappedValue
+    }
+
+    @MainActor
+    public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+        wrappedValue.animate(alongsideTransition: transition, completion: completion)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/IQKeyboardNotification/Classes/IQKeyboardNotification.swift
new file mode 100644 (file)
index 0000000..ba4edb6
--- /dev/null
@@ -0,0 +1,149 @@
+//
+//  IQKeyboardNotification.swift
+//  https://github.com/hackiftekhar/IQKeyboardNotification
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import Combine
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardNotification: NSObject {
+
+    private var storage: Set<AnyCancellable> = []
+
+    private var eventObservers: [IQKeyboardInfo.Event: [AnyHashable: SizeCompletion]] = [:]
+
+    public private(set) var oldKeyboardInfo: IQKeyboardInfo
+
+    public private(set) var keyboardInfo: IQKeyboardInfo {
+        didSet {
+            guard keyboardInfo != oldValue else { return }
+            oldKeyboardInfo = oldValue
+            sendKeyboardInfo(info: keyboardInfo)
+        }
+    }
+
+    public var isVisible: Bool {
+        keyboardInfo.isVisible
+    }
+
+    public var frame: CGRect {
+        keyboardInfo.endFrame
+    }
+
+    public override init() {
+        keyboardInfo = IQKeyboardInfo(notification: nil, event: .didHide)
+        oldKeyboardInfo = keyboardInfo
+        super.init()
+
+        //  Registering for keyboard notification.
+        for event in IQKeyboardInfo.Event.allCases {
+            NotificationCenter.default.publisher(for: event.notification)
+                .map({ IQKeyboardInfo(notification: $0, event: event) })
+                .assign(to: \.keyboardInfo, on: self)
+                .store(in: &storage)
+        }
+    }
+
+    public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
+        keyboardInfo.animate(alongsideTransition: transition, completion: completion)
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardNotification {
+
+    typealias SizeCompletion = (_ event: IQKeyboardInfo.Event, _ endFrame: CGRect) -> Void
+
+    func subscribe(for events: [IQKeyboardInfo.Event],
+                   identifier: AnyHashable, changeHandler: @escaping SizeCompletion) {
+
+        for event in events {
+            var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:]
+            existingObservers[identifier] = changeHandler
+            eventObservers[event] = existingObservers
+        }
+
+        // If current event is the one user is subscribed to, then call changeHandler immediately for the first time.
+        if events.contains(keyboardInfo.event) {
+            changeHandler(keyboardInfo.event, keyboardInfo.endFrame)
+        }
+    }
+
+    func unsubscribe(for events: [IQKeyboardInfo.Event], identifier: AnyHashable) {
+
+        for event in events {
+            var existingObservers: [AnyHashable: SizeCompletion] = eventObservers[event] ?? [:]
+            existingObservers[identifier] = nil
+            eventObservers[event] = existingObservers
+        }
+    }
+
+    func isSubscribed(for event: IQKeyboardInfo.Event? = nil, identifier: AnyHashable) -> Bool {
+        if let event = event {
+            guard let observers = eventObservers[event], !observers.isEmpty else { return false }
+            return observers[identifier] != nil
+        } else {
+
+            for event in IQKeyboardInfo.Event.allCases {
+                let observers = eventObservers[event] ?? [:]
+                if observers[identifier] != nil {
+                    return true
+                }
+            }
+            return false
+        }
+    }
+
+    private func sendKeyboardInfo(info: IQKeyboardInfo) {
+
+        guard let observers = eventObservers[info.event], !observers.isEmpty else { return }
+
+        let endFrame: CGRect = info.endFrame
+
+        for block in observers.values {
+            block(info.event, endFrame)
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardNotification {
+
+    var oldKeyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: oldKeyboardInfo) }
+
+    var keyboardInfoObjc: IQKeyboardInfoObjC { IQKeyboardInfoObjC(wrappedValue: keyboardInfo) }
+
+    func subscribe(identifier: AnyHashable, changeHandler: @escaping SizeCompletion) {
+        subscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier, changeHandler: changeHandler)
+    }
+
+    func unsubscribe(identifier: AnyHashable) {
+        unsubscribe(for: IQKeyboardInfo.Event.allCases, identifier: identifier)
+    }
+
+    func isSubscribed(identifier: AnyHashable) -> Bool {
+        isSubscribed(for: nil, identifier: identifier)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/LICENSE
new file mode 100644 (file)
index 0000000..5d8eb96
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardNotification/README.md
new file mode 100644 (file)
index 0000000..243db80
--- /dev/null
@@ -0,0 +1,36 @@
+# IQKeyboardNotification
+Lightweight library to observe keyboard events with ease.
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardNotification.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardNotification)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardNotification.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardNotification)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardNotification/master/Screenshot/IQKeyboardNotificationScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardNotification is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardNotification'
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## Flow
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardNotification/master/Screenshot/FlowDiagram.jpg)
+
+## License
+
+IQKeyboardNotification is available under the MIT license. See the LICENSE file for more info.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift
new file mode 100644 (file)
index 0000000..c3894a8
--- /dev/null
@@ -0,0 +1,154 @@
+//
+//  IQKeyboardReturnManager+UITextFieldDelegate.swift
+//  https://github.com/hackiftekhar/IQKeyboardReturnManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// MARK: UITextFieldDelegate
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager: UITextFieldDelegate {
+
+    public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
+
+        var returnValue: Bool = true
+
+        if delegate == nil,
+           let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+            if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldBeginEditing(_:))) {
+                returnValue = textFieldDelegate.textFieldShouldBeginEditing?(textField) ?? false
+            }
+        }
+
+        if returnValue {
+            updateReturnKey(textInputView: textField)
+        }
+
+        return returnValue
+    }
+
+    public func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+            if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldEndEditing(_:))) {
+                return textFieldDelegate.textFieldShouldEndEditing?(textField) ?? false
+            }
+        }
+
+        return true
+    }
+
+    public func textFieldDidBeginEditing(_ textField: UITextField) {
+
+        var aDelegate: (any UITextFieldDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+                aDelegate = model.textFieldDelegate
+            }
+        }
+
+        aDelegate?.textFieldDidBeginEditing?(textField)
+    }
+
+    public func textFieldDidEndEditing(_ textField: UITextField) {
+
+        var aDelegate: (any UITextFieldDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+                aDelegate = model.textFieldDelegate
+            }
+        }
+
+        aDelegate?.textFieldDidEndEditing?(textField)
+    }
+
+    public func textFieldDidEndEditing(_ textField: UITextField, reason: UITextField.DidEndEditingReason) {
+
+        var aDelegate: (any UITextFieldDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textField) {
+                aDelegate = model.textFieldDelegate
+            }
+        }
+
+        aDelegate?.textFieldDidEndEditing?(textField, reason: reason)
+    }
+
+    public func textField(_ textField: UITextField,
+                                shouldChangeCharactersIn range: NSRange,
+                                replacementString string: String) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+            let selector: Selector = #selector((any UITextFieldDelegate).textField(_:shouldChangeCharactersIn:
+                                                                                    replacementString:))
+            if textFieldDelegate.responds(to: selector) {
+                return textFieldDelegate.textField?(textField,
+                                                    shouldChangeCharactersIn: range,
+                                                    replacementString: string) ?? false
+            }
+        }
+        return true
+    }
+
+    public func textFieldShouldClear(_ textField: UITextField) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+            if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldClear(_:))) {
+                return textFieldDelegate.textFieldShouldClear?(textField) ?? false
+            }
+        }
+
+        return true
+    }
+
+    public func textFieldShouldReturn(_ textField: UITextField) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        var isReturn: Bool = true
+
+        if let textFieldDelegate: any UITextFieldDelegate = textInputViewCachedInfo(textField)?.textFieldDelegate {
+            if textFieldDelegate.responds(to: #selector((any UITextFieldDelegate).textFieldShouldReturn(_:))) {
+                isReturn = textFieldDelegate.textFieldShouldReturn?(textField) ?? false
+            }
+        }
+
+        if isReturn {
+            goToNextResponderOrResign(from: textField)
+            return true
+        } else {
+            return goToNextResponderOrResign(from: textField)
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift
new file mode 100644 (file)
index 0000000..888ebbe
--- /dev/null
@@ -0,0 +1,398 @@
+//
+//  IQKeyboardReturnManager+UITextViewDelegate.swift
+//  https://github.com/hackiftekhar/IQKeyboardReturnManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// MARK: UITextViewDelegate
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager: UITextViewDelegate {
+
+    public func textViewShouldBeginEditing(_ textView: UITextView) -> Bool {
+
+        var returnValue: Bool = true
+
+        if delegate == nil,
+           let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+            if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldBeginEditing(_:))) {
+                returnValue = textViewDelegate.textViewShouldBeginEditing?(textView) ?? false
+            }
+        }
+
+        if returnValue {
+            updateReturnKey(textInputView: textView)
+        }
+
+        return returnValue
+    }
+
+    public func textViewShouldEndEditing(_ textView: UITextView) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+            if textViewDelegate.responds(to: #selector((any UITextViewDelegate).textViewShouldEndEditing(_:))) {
+                return textViewDelegate.textViewShouldEndEditing?(textView) ?? false
+            }
+        }
+
+        return true
+    }
+
+    public func textViewDidBeginEditing(_ textView: UITextView) {
+
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textViewDidBeginEditing?(textView)
+    }
+
+    public func textViewDidEndEditing(_ textView: UITextView) {
+
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textViewDidEndEditing?(textView)
+    }
+
+    public func textView(_ textView: UITextView,
+                               shouldChangeTextIn range: NSRange,
+                               replacementText text: String) -> Bool {
+
+        var shouldChange = true
+
+        if delegate == nil {
+
+            if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(textView)?.textViewDelegate {
+                let selector = #selector((any UITextViewDelegate).textView(_:shouldChangeTextIn:replacementText:))
+                if textViewDelegate.responds(to: selector) {
+                    shouldChange = (textViewDelegate.textView?(textView,
+                                                               shouldChangeTextIn: range,
+                                                               replacementText: text)) ?? true
+                }
+            }
+        }
+
+        if self.dismissTextViewOnReturn, text == "\n" {
+            goToNextResponderOrResign(from: textView)
+            return false
+        }
+
+        return shouldChange
+    }
+
+    public func textViewDidChange(_ textView: UITextView) {
+
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textViewDidChange?(textView)
+    }
+
+    public func textViewDidChangeSelection(_ textView: UITextView) {
+
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textViewDidChangeSelection?(textView)
+    }
+
+    @available(iOS, deprecated: 17.0)
+    public func textView(_ aTextView: UITextView,
+                               shouldInteractWith URL: URL,
+                               in characterRange: NSRange,
+                               interaction: UITextItemInteraction) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+            let selector: Selector = #selector(textView as
+                                               (UITextView, URL, NSRange, UITextItemInteraction) -> Bool)
+            if textViewDelegate.responds(to: selector) {
+                return textViewDelegate.textView?(aTextView,
+                                                  shouldInteractWith: URL,
+                                                  in: characterRange,
+                                                  interaction: interaction) ?? false
+            }
+        }
+
+        return true
+    }
+
+    @available(iOS, deprecated: 17.0)
+    public func textView(_ aTextView: UITextView,
+                               shouldInteractWith textAttachment: NSTextAttachment,
+                               in characterRange: NSRange,
+                               interaction: UITextItemInteraction) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+            let selector: Selector = #selector(textView as
+                                               (UITextView, NSTextAttachment, NSRange, UITextItemInteraction)
+                                               -> Bool)
+            if textViewDelegate.responds(to: selector) {
+                return textViewDelegate.textView?(aTextView,
+                                                  shouldInteractWith: textAttachment,
+                                                  in: characterRange,
+                                                  interaction: interaction) ?? false
+            }
+        }
+
+        return true
+    }
+
+    @available(iOS, deprecated: 10.0)
+    public func textView(_ aTextView: UITextView,
+                               shouldInteractWith URL: URL,
+                               in characterRange: NSRange) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+            if textViewDelegate.responds(to: #selector(textView as (UITextView, URL, NSRange) -> Bool)) {
+                return textViewDelegate.textView?(aTextView,
+                                                  shouldInteractWith: URL,
+                                                  in: characterRange) ?? false
+            }
+        }
+
+        return true
+    }
+
+    @available(iOS, deprecated: 10.0)
+    public func textView(_ aTextView: UITextView,
+                               shouldInteractWith textAttachment: NSTextAttachment,
+                               in characterRange: NSRange) -> Bool {
+
+        guard delegate == nil else { return true }
+
+        if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+            if textViewDelegate.responds(to: #selector(textView as (UITextView, NSTextAttachment, NSRange) -> Bool)) {
+                return textViewDelegate.textView?(aTextView,
+                                                  shouldInteractWith: textAttachment,
+                                                  in: characterRange) ?? false
+            }
+        }
+
+        return true
+    }
+}
+
+@available(iOS 16.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardReturnManager {
+    public func textView(_ aTextView: UITextView,
+                               editMenuForTextIn range: NSRange,
+                               suggestedActions: [UIMenuElement]) -> UIMenu? {
+
+        guard delegate == nil else { return nil }
+
+        if let textViewDelegate: any UITextViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+
+            let selector: Selector = #selector(textView as
+                                               (UITextView, NSRange, [UIMenuElement]) -> UIMenu?)
+            if textViewDelegate.responds(to: selector) {
+                return textViewDelegate.textView?(aTextView,
+                                                  editMenuForTextIn: range,
+                                                  suggestedActions: suggestedActions)
+            }
+        }
+
+        return nil
+    }
+
+    public func textView(_ aTextView: UITextView,
+                               willPresentEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textView?(aTextView, willPresentEditMenuWith: animator)
+    }
+
+    public func textView(_ aTextView: UITextView,
+                               willDismissEditMenuWith animator: any UIEditMenuInteractionAnimating) {
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(aTextView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textView?(aTextView, willDismissEditMenuWith: animator)
+    }
+}
+
+#if swift(>=5.9)    // Xcode 15
+@available(iOS 17.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+    func textView(_ aTextView: UITextView,
+                        primaryActionFor textItem: UITextItem,
+                        defaultAction: UIAction) -> UIAction? {
+        guard delegate == nil else { return nil }
+
+        if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+            if textViewDelegate.responds(to: #selector(textView as (UITextView, UITextItem, UIAction) -> UIAction?)) {
+                return textViewDelegate.textView?(aTextView,
+                                                  primaryActionFor: textItem,
+                                                  defaultAction: defaultAction)
+            }
+        }
+
+        return nil
+    }
+
+    func textView(_ aTextView: UITextView,
+                        menuConfigurationFor textItem: UITextItem,
+                        defaultMenu: UIMenu) -> UITextItem.MenuConfiguration? {
+        guard delegate == nil else { return nil }
+
+        if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+            let selector: Selector = #selector(textView as (UITextView, UITextItem, UIMenu)
+                                               -> UITextItem.MenuConfiguration?)
+            if textViewDelegate.responds(to: selector) {
+                return textViewDelegate.textView?(aTextView,
+                                                  menuConfigurationFor: textItem,
+                                                  defaultMenu: defaultMenu)
+            }
+        }
+
+        return nil
+    }
+
+    func textView(_ textView: UITextView,
+                        textItemMenuWillDisplayFor textItem: UITextItem,
+                        animator: any UIContextMenuInteractionAnimating) {
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textView?(textView, textItemMenuWillDisplayFor: textItem, animator: animator)
+    }
+
+    func textView(_ textView: UITextView,
+                        textItemMenuWillEndFor textItem: UITextItem,
+                        animator: any UIContextMenuInteractionAnimating) {
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textView?(textView, textItemMenuWillEndFor: textItem, animator: animator)
+    }
+}
+#endif
+
+#if swift(>=6.0)    // Xcode 16
+@available(iOS 18.0, *)
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+    func textViewWritingToolsWillBegin(_ textView: UITextView) {
+
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textViewWritingToolsWillBegin?(textView)
+    }
+
+    func textViewWritingToolsDidEnd(_ textView: UITextView) {
+
+        var aDelegate: (any UITextViewDelegate)? = delegate
+
+        if aDelegate == nil {
+
+            if let model: IQTextInputViewInfoModel = textInputViewCachedInfo(textView) {
+                aDelegate = model.textViewDelegate
+            }
+        }
+
+        aDelegate?.textViewWritingToolsDidEnd?(textView)
+    }
+
+    func textView(_ textView: UITextView,
+                               writingToolsIgnoredRangesInEnclosingRange enclosingRange: NSRange) -> [NSValue] {
+        guard delegate == nil else { return [] }
+
+        if let textViewDelegate = textInputViewCachedInfo(aTextView)?.textViewDelegate {
+            if textViewDelegate.responds(to: #selector(textView as (UITextView, NSRange) -> [NSValue])) {
+                return textViewDelegate.textView?(aTextView,
+                                                  writingToolsIgnoredRangesInEnclosingRange: enclosingRange)
+            }
+        }
+        return []
+    }
+}
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift
new file mode 100644 (file)
index 0000000..f8b7f29
--- /dev/null
@@ -0,0 +1,277 @@
+//
+//  IQKeyboardReturnManager.swift
+//  https://github.com/hackiftekhar/IQKeyboardReturnManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+/**
+Manages the return key to work like next/done in a view hierarchy.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardReturnManager: NSObject {
+
+    // MARK: Private variables
+    private var textInputViewInfoCache: [IQTextInputViewInfoModel] = []
+
+    // MARK: Settings
+
+    /**
+     Delegate of textInputView
+     */
+    public weak var delegate: (any UITextFieldDelegate & UITextViewDelegate)?
+
+    /**
+     Set the last textInputView return key type. Default is UIReturnKeyDefault.
+     */
+    public var lastTextInputViewReturnKeyType: UIReturnKeyType = .default {
+
+        didSet {
+            if let activeModel = textInputViewInfoCache.first(where: {
+                guard let textInputView = $0.textInputView else {
+                    return false
+                }
+                return textInputView.isFirstResponder
+            }), let view: any IQTextInputView = activeModel.textInputView {
+                updateReturnKey(textInputView: view)
+            }
+        }
+    }
+
+    public var dismissTextViewOnReturn: Bool = false
+
+    // MARK: Initialization/De-initialization
+
+    public override init() {
+        super.init()
+    }
+
+    @available(*, unavailable, message: "Please use addResponderSubviews(of:recursive:)")
+    public init(controller: UIViewController) {
+        super.init()
+        addResponderSubviews(of: controller.view, recursive: true)
+    }
+
+    deinit {
+
+        //        for model in textInputViewInfoCache {
+        //            model.restore()
+        //        }
+
+        textInputViewInfoCache.removeAll()
+    }
+}
+
+// MARK: Registering/Unregistering textInputView
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardReturnManager {
+
+    /**
+     Should pass TextInputView instance. Assign textInputView delegate to self, change it's returnKeyType.
+
+     @param view TextInputView object to register.
+     */
+    func add(textInputView: any IQTextInputView) {
+
+        let model = IQTextInputViewInfoModel(textInputView: textInputView)
+        textInputViewInfoCache.append(model)
+
+        if let view: UITextField = textInputView as? UITextField {
+            view.delegate = self
+        } else if let view: UITextView = textInputView as? UITextView {
+            view.delegate = self
+        }
+    }
+
+    /**
+     Should pass TextInputView instance. Restore it's textInputView delegate and it's returnKeyType.
+
+     @param view TextInputView object to unregister.
+     */
+    func remove(textInputView: any IQTextInputView) {
+
+        guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return }
+
+        let model = textInputViewInfoCache.remove(at: index)
+        model.restore()
+    }
+
+    /**
+     Add all the TextInputView responderView's.
+
+     @param view object to register all it's responder subviews.
+     */
+    func addResponderSubviews(of view: UIView, recursive: Bool) {
+
+        let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive)
+
+        for view in textInputViews {
+            add(textInputView: view)
+        }
+    }
+
+    /**
+     Remove all the TextInputView responderView's.
+
+     @param view object to unregister all it's responder subviews.
+     */
+    func removeResponderSubviews(of view: UIView, recursive: Bool) {
+
+        let textInputViews: [any IQTextInputView] = view.responderSubviews(recursive: recursive)
+
+        for view in textInputViews {
+            remove(textInputView: view)
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+    @discardableResult
+    func goToNextResponderOrResign(from textInputView: any IQTextInputView) -> Bool {
+
+        guard let textInfoCache: IQTextInputViewInfoModel = nextResponderFromTextInputView(textInputView),
+              let textInputView = textInfoCache.textInputView else {
+            textInputView.resignFirstResponder()
+            return true
+        }
+
+        textInputView.becomeFirstResponder()
+        return false
+    }
+}
+
+// MARK: Internal Functions
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardReturnManager {
+
+    func nextResponderFromTextInputView(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? {
+        guard let currentIndex: Int = textInputViewCachedInfoIndex(textInputView),
+                currentIndex < textInputViewInfoCache.count - 1 else { return nil }
+
+        let candidates = Array(textInputViewInfoCache[currentIndex+1..<textInputViewInfoCache.count])
+
+        return candidates.first {
+            guard let inputView = $0.textInputView,
+                  inputView.isUserInteractionEnabled,
+                  !inputView.isHidden, inputView.alpha != 0.0
+            else { return false }
+
+            return inputView.iqIsEnabled
+        }
+    }
+
+    func textInputViewCachedInfoIndex(_ textInputView: some IQTextInputView) -> Int? {
+        return textInputViewInfoCache.firstIndex {
+            guard let inputView = $0.textInputView else { return false }
+            return inputView == textInputView
+        }
+    }
+
+    func textInputViewCachedInfo(_ textInputView: some IQTextInputView) -> IQTextInputViewInfoModel? {
+        guard let index: Int = textInputViewCachedInfoIndex(textInputView) else { return nil }
+        return textInputViewInfoCache[index]
+    }
+
+    func updateReturnKey(textInputView: some IQTextInputView) {
+
+        let returnKey: UIReturnKeyType
+        if nextResponderFromTextInputView(textInputView) != nil {
+            returnKey = .next
+        } else {
+            returnKey = lastTextInputViewReturnKeyType
+        }
+
+        if textInputView.returnKeyType != returnKey {
+            // If it's the last textInputView in responder view, else next
+            textInputView.returnKeyType = returnKey
+            textInputView.reloadInputViews()
+        }
+    }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardReturnManager {
+
+    @available(*, unavailable, renamed: "lastTextInputViewReturnKeyType")
+    var lastTextFieldReturnKeyType: UIReturnKeyType {
+        get { .default }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "add(textInputView:)")
+    func addTextFieldView(_ textInputView: any IQTextInputView) { }
+
+    @available(*, unavailable, renamed: "remove(textInputView:)")
+    func removeTextFieldView(_ textInputView: any IQTextInputView) { }
+
+    @available(*, unavailable, renamed: "addResponderSubviews(of:recursive:)")
+    func addResponderFromView(_ view: UIView, recursive: Bool) { }
+
+    @available(*, unavailable, renamed: "removeResponderSubviews(of:recursive:)")
+    func removeResponderFromView(_ view: UIView, recursive: Bool = true) { }
+}
+// swiftlint:enable unused_setter_value
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension UIView {
+
+    func responderSubviews(recursive: Bool) -> [any IQTextInputView] {
+
+        // Array of TextInputViews.
+        var textInputViews: [any IQTextInputView] = []
+        for view in subviews {
+
+            if let view = view as? IQTextInputView {
+                textInputViews.append(view)
+            }
+            // Sometimes there are hidden or disabled views and textInputView inside them still recorded,
+            // so we added some more validations here (Bug ID: #458)
+            // Uncommented else (Bug ID: #625)
+            else if recursive, !view.subviews.isEmpty {
+                let deepResponders = view.responderSubviews(recursive: recursive)
+                textInputViews.append(contentsOf: deepResponders)
+            }
+        }
+
+        // subviews are returning in opposite order. Sorting according the frames 'y'.
+        return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in
+
+            let frame1: CGRect = view1.convert(view1.bounds, to: self)
+            let frame2: CGRect = view2.convert(view2.bounds, to: self)
+
+            if frame1.minY != frame2.minY {
+                return frame1.minY < frame2.minY
+            } else {
+                return frame1.minX < frame2.minX
+            }
+        })
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift
new file mode 100644 (file)
index 0000000..c7b9099
--- /dev/null
@@ -0,0 +1,56 @@
+//
+//  IQTextInputViewInfoModel.swift
+//  https://github.com/hackiftekhar/IQKeyboardReturnManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal final class IQTextInputViewInfoModel: NSObject {
+
+    weak var textFieldDelegate: (any UITextFieldDelegate)?
+    weak var textViewDelegate: (any UITextViewDelegate)?
+    weak var textInputView: (any IQTextInputView)?
+    let originalReturnKeyType: UIReturnKeyType
+
+    init(textInputView: any IQTextInputView) {
+        self.textInputView = textInputView
+        self.originalReturnKeyType = textInputView.returnKeyType
+        if let textInputView = textInputView as? UITextField {
+            self.textFieldDelegate = textInputView.delegate
+        } else if let textInputView = textInputView as? UITextView {
+            self.textViewDelegate = textInputView.delegate
+        }
+
+        super.init()
+    }
+
+    func restore() {
+        textInputView?.returnKeyType = originalReturnKeyType
+        if let textInputView = textInputView as? UITextField {
+            textInputView.delegate = textFieldDelegate
+        } else if let textInputView = textInputView as? UITextView {
+            textInputView.delegate = textViewDelegate
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/LICENSE
new file mode 100644 (file)
index 0000000..5d8eb96
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardReturnManager/README.md
new file mode 100644 (file)
index 0000000..5524787
--- /dev/null
@@ -0,0 +1,68 @@
+# IQKeyboardReturnManager
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardReturnManager.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardReturnManager)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardReturnManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardReturnManager)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardReturnManager/master/Screenshot/IQKeyboardReturnManagerScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardReturnManager is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardReturnManager'
+```
+
+## Usage
+
+To handle keyboard return key automatically:-
+
+```swift
+import IQKeyboardReturnManager
+
+class ViewController: UIViewController {
+
+    let returnManager: IQKeyboardReturnManager = .init()
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        // This will add all textInputView of the controller and start observing for textFieldShouldReturn events
+        returnManager.addResponderSubviews(of: self.view, recursive: true)
+
+        // If you would like to dismiss the UITextView on tapping on return then add this
+        returnManager.dismissTextViewOnReturn = true
+
+        // If you would like to change last textInputView return key type to done or something else, then add this
+        returnManager.lastTextInputViewReturnKeyType = .done
+
+        // If you would like to customize the navigation between textField by your own order then add them manually
+        returnManager.add(textInputView: textField1)
+        returnManager.add(textInputView: textField2)
+        returnManager.add(textInputView: textField3)
+        returnManager.add(textInputView: textField4)
+    }
+}
+
+// IQKeyboardReturnManager will forward all delegate callbacks to you, so you can customize the decisions 
+extension ViewController: UITextFieldDelegate {
+    @objc public func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {...}
+}
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardReturnManager is available under the MIT license. See the LICENSE file for more info.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift
new file mode 100644 (file)
index 0000000..b289c30
--- /dev/null
@@ -0,0 +1,120 @@
+//
+//  IQBarButtonItem.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQBarButtonItem: UIBarButtonItem {
+
+    internal static let flexibleBarButtonItem: IQBarButtonItem = IQBarButtonItem(barButtonSystemItem: .flexibleSpace,
+                                                                                 target: nil, action: nil)
+
+    public override init() {
+        super.init()
+        initialize()
+    }
+
+    public required init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+        initialize()
+    }
+
+    private func initialize() {
+
+        let states: [UIControl.State] = [.normal, .highlighted, .disabled, .focused]
+
+        for state in states {
+
+            setBackgroundImage(UIImage(), for: state, barMetrics: .default)
+            setBackgroundImage(UIImage(), for: state, style: .plain, barMetrics: .default)
+            setBackButtonBackgroundImage(UIImage(), for: state, barMetrics: .default)
+        }
+
+        setTitlePositionAdjustment(UIOffset(), for: .default)
+        setBackgroundVerticalPositionAdjustment(0, for: .default)
+        setBackButtonBackgroundVerticalPositionAdjustment(0, for: .default)
+    }
+
+    override open var tintColor: UIColor? {
+        didSet {
+
+            var textAttributes: [NSAttributedString.Key: Any] = [:]
+            textAttributes[.foregroundColor] = tintColor
+
+            if let attributes: [NSAttributedString.Key: Any] = titleTextAttributes(for: .normal) {
+                for (key, value) in attributes {
+                    textAttributes[key] = value
+                }
+            }
+
+            setTitleTextAttributes(textAttributes, for: .normal)
+        }
+    }
+
+    /**
+     Boolean to know if it's a system item or custom item,
+     we are having a limitation that we cannot override a designated initializer,
+     so we are manually setting this property once in initialization
+     */
+    internal var isSystemItem: Bool = false
+
+    /**
+     Additional target & action to do get callback action.
+     Note that setting custom target & selector doesn't affect native functionality,
+     this is just an additional target to get a callback.
+
+     @param target Target object.
+     @param action Target Selector.
+     */
+    open func setTarget(_ target: AnyObject?, action: Selector?) {
+        if let target: AnyObject = target, let action: Selector = action {
+            invocation = IQInvocation(target: target, action: action)
+        } else {
+            invocation = nil
+        }
+    }
+
+    /**
+     Customized Invocation to be called when button is pressed.
+     invocation is internally created using setTarget:action: method.
+     */
+    open var invocation: IQInvocation? {
+        didSet {
+            // We have to put this condition here because if we override this function then
+            // We were getting "Cannot override '_' which has been marked unavailable" in Xcode 15
+            if let titleBarButton = self as? IQTitleBarButtonItem {
+
+                if let target = invocation?.target, let action = invocation?.action {
+                    titleBarButton.isEnabled = true
+                    titleBarButton.titleButton?.isEnabled = true
+                    titleBarButton.titleButton?.addTarget(target, action: action, for: .touchUpInside)
+                } else {
+                    titleBarButton.isEnabled = false
+                    titleBarButton.titleButton?.isEnabled = false
+                    titleBarButton.titleButton?.removeTarget(nil, action: nil, for: .touchUpInside)
+                }
+            }
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift
new file mode 100644 (file)
index 0000000..b12e8b1
--- /dev/null
@@ -0,0 +1,96 @@
+//
+//  IQBarButtonItemConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+/**
+ IQBarButtonItemConfiguration for creating toolbar with bar button items
+ */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQBarButtonItemConfiguration: NSObject {
+
+    public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) {
+        self.systemItem = systemItem
+        self.image = nil
+        self.title = nil
+        self.action = action
+        super.init()
+    }
+
+    public init(image: UIImage, action: Selector? = nil) {
+        self.systemItem = nil
+        self.image = image
+        self.title = nil
+        self.action = action
+        super.init()
+    }
+
+    public init(title: String, action: Selector? = nil) {
+        self.systemItem = nil
+        self.image = nil
+        self.title = title
+        self.action = action
+        super.init()
+    }
+
+    public let systemItem: UIBarButtonItem.SystemItem?    // System Item to be used to instantiate bar button.
+
+    public let image: UIImage?    // Image to show on bar button item if it's not a system item.
+
+    public let title: String?     // Title to show on bar button item if it's not a system item.
+
+    public var action: Selector?  // action for bar button item. Usually 'doneAction:(IQBarButtonItem*)item'.
+
+    public override var accessibilityLabel: String? { didSet { } } // Accessibility related labels
+
+    public func apply(on oldBarButtonItem: IQBarButtonItem, target: AnyObject?) -> IQBarButtonItem {
+
+        var newBarButtonItem: IQBarButtonItem = oldBarButtonItem
+
+        if systemItem == nil, !oldBarButtonItem.isSystemItem {
+            newBarButtonItem.title = title
+            newBarButtonItem.accessibilityLabel = accessibilityLabel
+            newBarButtonItem.accessibilityIdentifier = newBarButtonItem.accessibilityLabel
+            newBarButtonItem.image = image
+            newBarButtonItem.target = target
+            newBarButtonItem.action = action
+        } else {
+            if let systemItem: UIBarButtonItem.SystemItem = systemItem {
+                newBarButtonItem = IQBarButtonItem(barButtonSystemItem: systemItem, target: target, action: action)
+                newBarButtonItem.isSystemItem = true
+            } else if let image: UIImage = image {
+                newBarButtonItem = IQBarButtonItem(image: image, style: .plain, target: target, action: action)
+            } else {
+                newBarButtonItem = IQBarButtonItem(title: title, style: .plain, target: target, action: action)
+            }
+
+            newBarButtonItem.invocation = oldBarButtonItem.invocation
+            newBarButtonItem.accessibilityLabel = accessibilityLabel
+            newBarButtonItem.accessibilityIdentifier = oldBarButtonItem.accessibilityLabel
+            newBarButtonItem.isEnabled = oldBarButtonItem.isEnabled
+            newBarButtonItem.tag = oldBarButtonItem.tag
+        }
+        return newBarButtonItem
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift
new file mode 100644 (file)
index 0000000..95afb9f
--- /dev/null
@@ -0,0 +1,42 @@
+//
+//  IQInvocation.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQInvocation: NSObject {
+    public weak var target: AnyObject?
+    public let action: Selector
+
+    public init(target: AnyObject, action: Selector) {
+        self.target = target
+        self.action = action
+    }
+
+    public func invoke(from: Any) {
+
+        guard let target: AnyObject = target else { return }
+        UIApplication.shared.sendAction(action, to: target, from: from, for: UIEvent())
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift
new file mode 100644 (file)
index 0000000..0ec2ef1
--- /dev/null
@@ -0,0 +1,168 @@
+//
+//  IQTitleBarButtonItem.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQTitleBarButtonItem: IQBarButtonItem {
+
+    open var titleFont: UIFont? {
+
+        didSet {
+            if let titleFont: UIFont = titleFont {
+                titleButton?.titleLabel?.font = titleFont
+            } else {
+                titleButton?.titleLabel?.font = UIFont.systemFont(ofSize: 13)
+            }
+        }
+    }
+
+    override open var title: String? {
+        didSet {
+            titleButton?.setTitle(title, for: .normal)
+            updateAccessibility()
+        }
+    }
+
+    /**
+     titleColor to be used for displaying button text when displaying title (disabled state).
+     */
+    open var titleColor: UIColor? {
+
+        didSet {
+
+            if let titleColor: UIColor = titleColor {
+                titleButton?.setTitleColor(titleColor, for: .disabled)
+            } else {
+                titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
+            }
+        }
+    }
+
+    /**
+     selectableTitleColor to be used for displaying button text when button is enabled.
+     */
+    open var selectableTitleColor: UIColor? {
+
+        didSet {
+
+            if let selectableTitleColor: UIColor = selectableTitleColor {
+                titleButton?.setTitleColor(selectableTitleColor, for: .normal)
+            } else {
+                titleButton?.setTitleColor(UIColor.systemBlue, for: .normal)
+            }
+        }
+    }
+
+    internal var titleButton: UIButton?
+    private var _titleView: UIView?
+
+    override init() {
+        super.init()
+    }
+
+    public convenience init(title: String?) {
+
+        self.init(title: nil, style: .plain, target: nil, action: nil)
+
+        _titleView = UIView()
+        _titleView?.backgroundColor = UIColor.clear
+
+        titleButton = UIButton(type: .system)
+        titleButton?.isAccessibilityElement = false
+        titleButton?.isEnabled = false
+        titleButton?.titleLabel?.numberOfLines = 3
+        titleButton?.setTitleColor(UIColor.lightGray, for: .disabled)
+        titleButton?.setTitleColor(UIColor.systemBlue, for: .normal)
+        titleButton?.backgroundColor = UIColor.clear
+        titleButton?.titleLabel?.textAlignment = .center
+        titleButton?.setTitle(title, for: .normal)
+        titleFont = UIFont.systemFont(ofSize: 13.0)
+        titleButton?.titleLabel?.font = self.titleFont
+        _titleView?.addSubview(titleButton!)
+
+        let lowPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultLow.rawValue-1)
+        let highPriority: UILayoutPriority = UILayoutPriority(rawValue: UILayoutPriority.defaultHigh.rawValue-1)
+
+        _titleView?.translatesAutoresizingMaskIntoConstraints = false
+        _titleView?.setContentHuggingPriority(lowPriority, for: .vertical)
+        _titleView?.setContentHuggingPriority(lowPriority, for: .horizontal)
+        _titleView?.setContentCompressionResistancePriority(highPriority, for: .vertical)
+        _titleView?.setContentCompressionResistancePriority(highPriority, for: .horizontal)
+
+        titleButton?.translatesAutoresizingMaskIntoConstraints = false
+        titleButton?.setContentHuggingPriority(lowPriority, for: .vertical)
+        titleButton?.setContentHuggingPriority(lowPriority, for: .horizontal)
+        titleButton?.setContentCompressionResistancePriority(highPriority, for: .vertical)
+        titleButton?.setContentCompressionResistancePriority(highPriority, for: .horizontal)
+
+        let top: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .top,
+                                                         relatedBy: .equal,
+                                                         toItem: _titleView, attribute: .top,
+                                                         multiplier: 1, constant: 0)
+        let bottom: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .bottom,
+                                                            relatedBy: .equal,
+                                                            toItem: _titleView, attribute: .bottom,
+                                                            multiplier: 1, constant: 0)
+        let leading: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .leading,
+                                                             relatedBy: .equal,
+                                                             toItem: _titleView, attribute: .leading,
+                                                             multiplier: 1, constant: 0)
+        let trailing: NSLayoutConstraint = NSLayoutConstraint(item: titleButton!, attribute: .trailing,
+                                                              relatedBy: .equal,
+                                                              toItem: _titleView, attribute: .trailing,
+                                                              multiplier: 1, constant: 0)
+
+        _titleView?.addConstraints([top, bottom, leading, trailing])
+
+        customView = _titleView
+    }
+
+    required public init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+    }
+
+    private func updateAccessibility() {
+        if title == nil || title?.isEmpty == true {
+            isAccessibilityElement = false
+            // Swift 6: Reference to static property 'none'
+            // is not concurrency-safe because it involves shared mutable state
+//            accessibilityTraits = .none
+            accessibilityTraits = .init(rawValue: 0)
+        } else if titleButton?.isEnabled == true {
+            isAccessibilityElement = true
+            // Swift 6: Reference to static property 'button'
+            // is not concurrency-safe because it involves shared mutable state
+//            accessibilityTraits = .button
+            accessibilityTraits = .init(rawValue: 1)
+        } else {
+            isAccessibilityElement = true
+
+            // Swift 6: Reference to static property 'staticText'
+            // is not concurrency-safe because it involves shared mutable state
+//            accessibilityTraits = .staticText
+            accessibilityTraits = .init(rawValue: 64)
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift
new file mode 100644 (file)
index 0000000..119a958
--- /dev/null
@@ -0,0 +1,344 @@
+//
+//  UIView+IQKeyboardExtension.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+    static var toolbar: Int = 0
+    static var hidePlaceholder: Int = 0
+    static var placeholder: Int = 0
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+    // MARK: Toolbar
+
+    /**
+     Toolbar references for better customization control.
+     */
+    var toolbar: IQKeyboardToolbar {
+        var toolbar: IQKeyboardToolbar? = base?.inputAccessoryView as? IQKeyboardToolbar
+
+        if toolbar == nil, let base = base {
+            toolbar = objc_getAssociatedObject(base, &AssociatedKeys.toolbar) as? IQKeyboardToolbar
+        }
+
+        if let toolbar: IQKeyboardToolbar = toolbar {
+            return toolbar
+        } else {
+
+            let width: CGFloat = base?.window?.windowScene?.screen.bounds.width ?? 0
+
+            let frame = CGRect(origin: .zero, size: .init(width: width, height: 44))
+            let newToolbar = IQKeyboardToolbar(frame: frame)
+
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.toolbar, newToolbar, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+
+            return newToolbar
+        }
+    }
+
+    // MARK: Toolbar title
+
+    /**
+     If `hideToolbarPlaceholder` is YES, then title will not be added to the toolbar. Default to NO.
+     */
+    var hidePlaceholder: Bool {
+        get {
+            if let base = base {
+                return objc_getAssociatedObject(base, &AssociatedKeys.hidePlaceholder) as? Bool ?? false
+            }
+            return false
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.hidePlaceholder,
+                                         newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+                toolbar.titleBarButton.title = drawingPlaceholder
+            }
+        }
+    }
+
+    /**
+     `toolbarPlaceholder` to override default `placeholder` text when drawing text on toolbar.
+     */
+    var placeholder: String? {
+        get {
+            if let base = base {
+                return objc_getAssociatedObject(base, &AssociatedKeys.placeholder) as? String
+            }
+            return nil
+        }
+        set(newValue) {
+            if let base = base {
+                // swiftlint:disable line_length
+                objc_setAssociatedObject(base, &AssociatedKeys.placeholder, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+                toolbar.titleBarButton.title = drawingPlaceholder
+                // swiftlint:enable line_length
+            }
+        }
+    }
+
+    /**
+     `drawingToolbarPlaceholder` will be actual text used to draw on toolbar.
+     This would either `placeholder` or `toolbarPlaceholder`.
+     */
+    var drawingPlaceholder: String? {
+
+        guard !hidePlaceholder else { return nil }
+
+        if let placeholder = placeholder,
+              !placeholder.isEmpty {
+            return placeholder
+        }
+
+        guard let placeholderable: any IQPlaceholderable = base as? (any IQPlaceholderable) else { return nil }
+
+        if let placeholder = placeholderable.attributedPlaceholder?.string,
+           !placeholder.isEmpty {
+            return placeholder
+        } else if let placeholder = placeholderable.placeholder {
+            return placeholder
+        } else {
+            return nil
+        }
+    }
+
+    // MARK: Common
+
+    func addToolbar(target: AnyObject?,
+                    previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                    nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                    rightConfiguration: IQBarButtonItemConfiguration? = nil,
+                    title: String?,
+                    titleAccessibilityLabel: String? = nil) {
+        guard let base = base else { return }
+        //  Creating a toolBar for phoneNumber keyboard
+        let toolbar: IQKeyboardToolbar = toolbar
+
+        let items: [UIBarButtonItem] = Self.constructBarButtonItems(target: target, toolbar: toolbar,
+                                                                    previousConfiguration: previousConfiguration,
+                                                                    nextConfiguration: nextConfiguration,
+                                                                    rightConfiguration: rightConfiguration,
+                                                                    title: title,
+                                                                    titleAccessibilityLabel: titleAccessibilityLabel)
+
+        //  Adding button to toolBar.
+        toolbar.items = items
+
+        switch base.keyboardAppearance {
+        case .dark:
+            toolbar.barStyle = .black
+        default:
+            toolbar.barStyle = .default
+        }
+
+        //  Setting toolbar to keyboard.
+        let reloadInputViews: Bool = base.inputAccessoryView != toolbar
+        guard reloadInputViews else { return }
+
+        base.inputAccessoryView = toolbar
+
+        base.reloadInputViews()
+    }
+
+    // MARK: Right
+    func addDone(target: AnyObject?,
+                 action: Selector,
+                 showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+
+        let title: String? = showPlaceholder ? drawingPlaceholder : nil
+
+        addDone(target: target, action: action,
+                   title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func addDone(target: AnyObject?,
+                 action: Selector,
+                 title: String?, titleAccessibilityLabel: String? = nil) {
+
+        let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: action)
+
+        addToolbar(target: target, rightConfiguration: rightConfiguration,
+                   title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func addRightButton(target: AnyObject?,
+                        configuration: IQBarButtonItemConfiguration,
+                        showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        let title: String? = showPlaceholder ? drawingPlaceholder : nil
+        addRightButton(target: target, configuration: configuration, title: title,
+                       titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func addRightButton(target: AnyObject?,
+                        configuration: IQBarButtonItemConfiguration,
+                        title: String?, titleAccessibilityLabel: String? = nil) {
+        addToolbar(target: target, rightConfiguration: configuration, title: title,
+                   titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    // MARK: Right/Left
+    func addRightLeft(target: AnyObject?,
+                      rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
+                      showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        let title: String? = showPlaceholder ? drawingPlaceholder : nil
+        addRightLeft(target: target,
+                     rightConfiguration: rightConfiguration, leftConfiguration: leftConfiguration,
+                     title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func addRightLeft(target: AnyObject?,
+                      rightConfiguration: IQBarButtonItemConfiguration, leftConfiguration: IQBarButtonItemConfiguration,
+                      title: String?, titleAccessibilityLabel: String? = nil) {
+        addToolbar(target: target,
+                   previousConfiguration: leftConfiguration, rightConfiguration: rightConfiguration,
+                   title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    // MARK: Previous/Next/Right
+
+    func addPreviousNextRight(target: AnyObject?,
+                              previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                              nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                              rightConfiguration: IQBarButtonItemConfiguration?,
+                              showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+
+        let title: String? = showPlaceholder ? drawingPlaceholder : nil
+        addPreviousNextRight(target: target,
+                             previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
+                             rightConfiguration: rightConfiguration,
+                             title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func addPreviousNextRight(target: AnyObject?,
+                              previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                              nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                              rightConfiguration: IQBarButtonItemConfiguration?,
+                              title: String?, titleAccessibilityLabel: String? = nil) {
+
+        addToolbar(target: target,
+                   previousConfiguration: previousConfiguration, nextConfiguration: nextConfiguration,
+                   rightConfiguration: rightConfiguration,
+                   title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector, doneAction: Selector,
+                             showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        let title: String? = showPlaceholder ? drawingPlaceholder : nil
+        addPreviousNextDone(target: target, previousAction: previousAction, nextAction: nextAction,
+                            doneAction: doneAction,
+                            title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func addPreviousNextDone(target: AnyObject?,
+                             previousAction: Selector, nextAction: Selector, doneAction: Selector,
+                             title: String?, titleAccessibilityLabel: String? = nil) {
+
+        let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage()
+        let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage()
+
+        let previousConfiguration = IQBarButtonItemConfiguration(image: chevronUp,
+                                                                 action: previousAction)
+        let nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown,
+                                                             action: nextAction)
+        let rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done,
+                                                              action: doneAction)
+
+        addToolbar(target: target, previousConfiguration: previousConfiguration,
+                   nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+                   title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardExtension where Base: IQTextInputView {
+
+    private static func constructBarButtonItems(target: AnyObject?,
+                                                toolbar: IQKeyboardToolbar,
+                                                previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                                                nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                                                rightConfiguration: IQBarButtonItemConfiguration? = nil,
+                                                title: String?,
+                                                titleAccessibilityLabel: String? = nil) -> [UIBarButtonItem] {
+        var items: [UIBarButtonItem] = []
+
+        if let previousConfiguration: IQBarButtonItemConfiguration = previousConfiguration {
+            let prev: IQBarButtonItem = previousConfiguration.apply(on: toolbar.previousBarButton, target: target)
+            toolbar.previousBarButton = prev
+            items.append(prev)
+        }
+
+        if previousConfiguration != nil, nextConfiguration != nil {
+            items.append(toolbar.fixedSpaceBarButton)
+        }
+
+        if let nextConfiguration: IQBarButtonItemConfiguration = nextConfiguration {
+            let next: IQBarButtonItem = nextConfiguration.apply(on: toolbar.nextBarButton, target: target)
+            toolbar.nextBarButton = next
+            items.append(next)
+        }
+
+        if !toolbar.additionalLeadingItems.isEmpty {
+            items.append(contentsOf: toolbar.additionalLeadingItems)
+        }
+
+        // Title bar button item
+        do {
+            // Flexible space
+            items.append(IQBarButtonItem.flexibleBarButtonItem)
+
+            // Title button
+            toolbar.titleBarButton.title = title
+            toolbar.titleBarButton.accessibilityLabel = titleAccessibilityLabel
+            toolbar.titleBarButton.accessibilityIdentifier = titleAccessibilityLabel
+
+            toolbar.titleBarButton.customView?.frame = .zero
+
+            items.append(toolbar.titleBarButton)
+
+            // Flexible space
+            items.append(IQBarButtonItem.flexibleBarButtonItem)
+        }
+
+        if !toolbar.additionalTrailingItems.isEmpty {
+            items.append(contentsOf: toolbar.additionalTrailingItems)
+        }
+
+        if let rightConfiguration: IQBarButtonItemConfiguration = rightConfiguration {
+
+            let done: IQBarButtonItem = rightConfiguration.apply(on: toolbar.doneBarButton, target: target)
+            toolbar.doneBarButton = done
+            items.append(done)
+        }
+        return items
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift
new file mode 100644 (file)
index 0000000..c3be1a4
--- /dev/null
@@ -0,0 +1,228 @@
+//
+//  UIView+IQKeyboardExtensionDeprecated.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable line_length
+// swiftlint:disable function_parameter_count
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+
+    @available(*, unavailable, renamed: "iq.toolbar")
+    var keyboardToolbar: IQKeyboardToolbar {
+        get { fatalError() }
+        set {}
+    }
+
+    @available(*, unavailable, renamed: "iq.hidePlaceholder")
+    var shouldHideToolbarPlaceholder: Bool {
+        get { false }
+        set {}
+    }
+
+    @available(*, unavailable, renamed: "iq.placeholder")
+    var toolbarPlaceholder: String? {
+        get { nil }
+        set {}
+    }
+
+    @available(*, unavailable, renamed: "iq.drawingPlaceholder")
+    var drawingToolbarPlaceholder: String? {
+        get { nil }
+        set {}
+    }
+
+    @available(*, unavailable, renamed: "iq.addToolbar(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+    func addKeyboardToolbarWithTarget(target: AnyObject?,
+                                      titleText: String?,
+                                      titleAccessibilityLabel: String? = nil,
+                                      rightBarButtonConfiguration: IQBarButtonItemConfiguration?,
+                                      previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil,
+                                      nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addDone(target:action:showPlaceholder:titleAccessibilityLabel:)")
+    func addDoneOnKeyboardWithTarget(_ target: AnyObject?,
+                                     action: Selector,
+                                     shouldShowPlaceholder: Bool = false,
+                                     titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addDone(target:action:title:titleAccessibilityLabel:)")
+    func addDoneOnKeyboardWithTarget(_ target: AnyObject?,
+                                     action: Selector,
+                                     titleText: String?,
+                                     titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)")
+    func addRightButtonOnKeyboardWithImage(_ image: UIImage,
+                                           target: AnyObject?,
+                                           action: Selector,
+                                           shouldShowPlaceholder: Bool = false,
+                                           titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)")
+    func addRightButtonOnKeyboardWithImage(_ image: UIImage,
+                                           target: AnyObject?,
+                                           action: Selector,
+                                           titleText: String?,
+                                           titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:showPlaceholder:titleAccessibilityLabel:)")
+    func addRightButtonOnKeyboardWithText(_ text: String,
+                                          target: AnyObject?,
+                                          action: Selector,
+                                          shouldShowPlaceholder: Bool = false,
+                                          titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightButton(target:configuration:title:titleAccessibilityLabel:)")
+    func addRightButtonOnKeyboardWithText(_ text: String,
+                                          target: AnyObject?,
+                                          action: Selector,
+                                          titleText: String?,
+                                          titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+    func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?,
+                                           cancelAction: Selector,
+                                           doneAction: Selector,
+                                           shouldShowPlaceholder: Bool = false,
+                                           titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+    func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+                                          leftButtonTitle: String,
+                                          rightButtonTitle: String,
+                                          leftButtonAction: Selector,
+                                          rightButtonAction: Selector,
+                                          shouldShowPlaceholder: Bool = false,
+                                          titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+    func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+                                          leftButtonImage: UIImage,
+                                          rightButtonImage: UIImage,
+                                          leftButtonAction: Selector,
+                                          rightButtonAction: Selector,
+                                          shouldShowPlaceholder: Bool = false,
+                                          titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+    func addCancelDoneOnKeyboardWithTarget(_ target: AnyObject?,
+                                           cancelAction: Selector,
+                                           doneAction: Selector,
+                                           titleText: String?,
+                                           titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+    func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+                                          leftButtonTitle: String,
+                                          rightButtonTitle: String,
+                                          leftButtonAction: Selector,
+                                          rightButtonAction: Selector,
+                                          titleText: String?,
+                                          titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addRightLeft(target:rightConfiguration:leftConfiguration:title:titleAccessibilityLabel:)")
+    func addRightLeftOnKeyboardWithTarget(_ target: AnyObject?,
+                                          leftButtonImage: UIImage,
+                                          rightButtonImage: UIImage,
+                                          leftButtonAction: Selector,
+                                          rightButtonAction: Selector,
+                                          titleText: String?,
+                                          titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:showPlaceholder:titleAccessibilityLabel:)")
+    func addPreviousNextDone(_ target: AnyObject?,
+                             previousAction: Selector,
+                             nextAction: Selector,
+                             doneAction: Selector,
+                             shouldShowPlaceholder: Bool = false,
+                             titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addPreviousNextDone(target:previousAction:nextAction:doneAction:title:titleAccessibilityLabel:)")
+    func addPreviousNextDoneOnKeyboardWithTarget(_ target: AnyObject?,
+                                                 previousAction: Selector,
+                                                 nextAction: Selector,
+                                                 doneAction: Selector,
+                                                 titleText: String?,
+                                                 titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+    func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+                                                  rightButtonImage: UIImage,
+                                                  previousAction: Selector,
+                                                  nextAction: Selector,
+                                                  rightButtonAction: Selector,
+                                                  shouldShowPlaceholder: Bool = false,
+                                                  titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:showPlaceholder:titleAccessibilityLabel:)")
+    func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+                                                  rightButtonTitle: String,
+                                                  previousAction: Selector,
+                                                  nextAction: Selector,
+                                                  rightButtonAction: Selector,
+                                                  shouldShowPlaceholder: Bool = false,
+                                                  titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+    func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+                                                  rightButtonImage: UIImage,
+                                                  previousAction: Selector,
+                                                  nextAction: Selector,
+                                                  rightButtonAction: Selector,
+                                                  titleText: String?,
+                                                  titleAccessibilityLabel: String? = nil) {
+    }
+
+    @available(*, unavailable, renamed: "iq.addPreviousNextRight(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)")
+    func addPreviousNextRightOnKeyboardWithTarget(_ target: AnyObject?,
+                                                  rightButtonTitle: String,
+                                                  previousAction: Selector,
+                                                  nextAction: Selector,
+                                                  rightButtonAction: Selector,
+                                                  titleText: String?,
+                                                  titleAccessibilityLabel: String? = nil) {
+    }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable line_length
+// swiftlint:enable function_parameter_count
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift
new file mode 100644 (file)
index 0000000..2dbcdbe
--- /dev/null
@@ -0,0 +1,254 @@
+//
+//  UIView+IQKeyboardExtensionObjc.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// MARK: For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+    var iq_toolbar: IQKeyboardToolbar { iq.toolbar }
+
+    var iq_hidePlaceholder: Bool {
+        get { iq.hidePlaceholder }
+        set(newValue) { iq.hidePlaceholder = newValue }
+    }
+
+    var iq_placeholder: String? {
+        get { iq.placeholder }
+        set(newValue) { iq.placeholder = newValue }
+    }
+
+    var iq_drawingPlaceholder: String? { iq.drawingPlaceholder }
+
+    func iq_addToolbar(target: AnyObject?,
+                       previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                       nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                       rightConfiguration: IQBarButtonItemConfiguration? = nil,
+                       title: String?,
+                       titleAccessibilityLabel: String? = nil) {
+        iq.addToolbar(target: target, previousConfiguration: previousConfiguration,
+                      nextConfiguration: nextConfiguration,
+                      rightConfiguration: rightConfiguration,
+                      title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addDone(target: AnyObject?,
+                    action: Selector,
+                    showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder,
+                   titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addDone(target: AnyObject?,
+                    action: Selector,
+                    title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addDone(target: target, action: action, title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightButton(target: AnyObject?,
+                           configuration: IQBarButtonItemConfiguration,
+                           showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addRightButton(target: target, configuration: configuration, showPlaceholder: showPlaceholder,
+                          titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightButton(target: AnyObject?,
+                           configuration: IQBarButtonItemConfiguration,
+                           title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addRightButton(target: target, configuration: configuration, title: title,
+                          titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightLeft(target: AnyObject?,
+                         rightConfiguration: IQBarButtonItemConfiguration,
+                         leftConfiguration: IQBarButtonItemConfiguration,
+                         showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+                        leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder,
+                        titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightLeft(target: AnyObject?,
+                         rightConfiguration: IQBarButtonItemConfiguration,
+                         leftConfiguration: IQBarButtonItemConfiguration,
+                         title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+                        leftConfiguration: leftConfiguration, title: title,
+                        titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextRight(target: AnyObject?,
+                                 previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 rightConfiguration: IQBarButtonItemConfiguration?,
+                                 showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+                                nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+                                showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextRight(target: AnyObject?,
+                                 previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 rightConfiguration: IQBarButtonItemConfiguration?,
+                                 title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+                                nextConfiguration: nextConfiguration,
+                                rightConfiguration: rightConfiguration,
+                                title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector,
+                                nextAction: Selector, doneAction: Selector,
+                                showPlaceholder: Bool = false,
+                                titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextDone(target: target, previousAction: previousAction,
+                               nextAction: nextAction, doneAction: doneAction,
+                               showPlaceholder: showPlaceholder,
+                               titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextDone(target: AnyObject?,
+                                previousAction: Selector, nextAction: Selector, doneAction: Selector,
+                                title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextDone(target: target, previousAction: previousAction,
+                               nextAction: nextAction, doneAction: doneAction,
+                               title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+}
+
+@objc public extension UITextView {
+
+    var iq_toolbar: IQKeyboardToolbar { iq.toolbar }
+
+    var iq_hidePlaceholder: Bool {
+        get { iq.hidePlaceholder }
+        set(newValue) { iq.hidePlaceholder = newValue }
+    }
+
+    var iq_placeholder: String? {
+        get { iq.placeholder }
+        set(newValue) { iq.placeholder = newValue }
+    }
+
+    var iq_drawingPlaceholder: String? { iq.drawingPlaceholder }
+
+    func iq_addToolbar(target: AnyObject?,
+                       previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                       nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                       rightConfiguration: IQBarButtonItemConfiguration? = nil,
+                       title: String?,
+                       titleAccessibilityLabel: String? = nil) {
+        iq.addToolbar(target: target, previousConfiguration: previousConfiguration,
+                      nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+                      title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addDone(target: AnyObject?,
+                    action: Selector,
+                    showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addDone(target: target, action: action, showPlaceholder: showPlaceholder,
+                   titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addDone(target: AnyObject?,
+                    action: Selector,
+                    title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addDone(target: target, action: action, title: title,
+                   titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightButton(target: AnyObject?,
+                           configuration: IQBarButtonItemConfiguration,
+                           showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addRightButton(target: target, configuration: configuration,
+                          showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightButton(target: AnyObject?,
+                           configuration: IQBarButtonItemConfiguration,
+                           title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addRightButton(target: target, configuration: configuration,
+                          title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightLeft(target: AnyObject?,
+                         rightConfiguration: IQBarButtonItemConfiguration,
+                         leftConfiguration: IQBarButtonItemConfiguration,
+                         showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+                        leftConfiguration: leftConfiguration, showPlaceholder: showPlaceholder,
+                        titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addRightLeft(target: AnyObject?,
+                         rightConfiguration: IQBarButtonItemConfiguration,
+                         leftConfiguration: IQBarButtonItemConfiguration,
+                         title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addRightLeft(target: target, rightConfiguration: rightConfiguration,
+                        leftConfiguration: leftConfiguration, title: title,
+                        titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextRight(target: AnyObject?,
+                                 previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 rightConfiguration: IQBarButtonItemConfiguration?,
+                                 showPlaceholder: Bool = false, titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+                                nextConfiguration: nextConfiguration, rightConfiguration: rightConfiguration,
+                                showPlaceholder: showPlaceholder, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextRight(target: AnyObject?,
+                                 previousConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 nextConfiguration: IQBarButtonItemConfiguration? = nil,
+                                 rightConfiguration: IQBarButtonItemConfiguration?,
+                                 title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextRight(target: target, previousConfiguration: previousConfiguration,
+                                nextConfiguration: nextConfiguration,
+                                rightConfiguration: rightConfiguration,
+                                title: title, titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextDone(target: AnyObject?, previousAction: Selector, nextAction: Selector,
+                                doneAction: Selector, showPlaceholder: Bool = false,
+                                titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextDone(target: target, previousAction: previousAction,
+                               nextAction: nextAction,
+                               doneAction: doneAction, showPlaceholder: showPlaceholder,
+                               titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+
+    func iq_addPreviousNextDone(target: AnyObject?,
+                                previousAction: Selector, nextAction: Selector, doneAction: Selector,
+                                title: String?, titleAccessibilityLabel: String? = nil) {
+        iq.addPreviousNextDone(target: target, previousAction: previousAction,
+                               nextAction: nextAction,
+                               doneAction: doneAction, title: title,
+                               titleAccessibilityLabel: titleAccessibilityLabel)
+    }
+}
+// swiftlint:enable identifier_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift
new file mode 100644 (file)
index 0000000..f2d78b7
--- /dev/null
@@ -0,0 +1,185 @@
+//
+//  IQKeyboardToolbar.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+/** @abstract IQKeyboardToolbar.    */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQKeyboardToolbar: UIToolbar {
+
+    override public init(frame: CGRect) {
+        super.init(frame: frame)
+
+        initialize()
+    }
+
+    required public init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+
+        initialize()
+    }
+
+    private func initialize() {
+
+        sizeToFit()
+
+        autoresizingMask = .flexibleWidth
+        self.isTranslucent = true
+        self.barTintColor = nil
+
+        let positions: [UIBarPosition] = [.any, .bottom, .top, .topAttached]
+
+        for position in positions {
+
+            self.setBackgroundImage(nil, forToolbarPosition: position, barMetrics: .default)
+            self.setShadowImage(nil, forToolbarPosition: .any)
+        }
+
+        // Background color
+        self.backgroundColor = nil
+    }
+
+    /**
+     Additional bar buttons to show at the leading side.
+     */
+    open var additionalLeadingItems: [UIBarButtonItem] = []
+
+    /**
+     Additional bar buttons to show at the trailing side.
+     */
+    open var additionalTrailingItems: [UIBarButtonItem] = []
+
+    /**
+     Previous bar button of toolbar.
+     */
+    private var privatePreviousBarButton: IQBarButtonItem?
+    open var previousBarButton: IQBarButtonItem {
+        get {
+            if privatePreviousBarButton == nil {
+                privatePreviousBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)
+            }
+            return privatePreviousBarButton!
+        }
+
+        set (newValue) {
+            privatePreviousBarButton = newValue
+        }
+    }
+
+    /**
+     Next bar button of toolbar.
+     */
+    private var privateNextBarButton: IQBarButtonItem?
+    open var nextBarButton: IQBarButtonItem {
+        get {
+            if privateNextBarButton == nil {
+                privateNextBarButton = IQBarButtonItem(image: nil, style: .plain, target: nil, action: nil)
+            }
+            return privateNextBarButton!
+        }
+
+        set (newValue) {
+            privateNextBarButton = newValue
+        }
+    }
+
+    /**
+     Title bar button of toolbar.
+     */
+    private var privateTitleBarButton: IQTitleBarButtonItem?
+    open var titleBarButton: IQTitleBarButtonItem {
+        get {
+            if privateTitleBarButton == nil {
+                privateTitleBarButton = IQTitleBarButtonItem(title: nil)
+            }
+            return privateTitleBarButton!
+        }
+
+        set (newValue) {
+            privateTitleBarButton = newValue
+        }
+    }
+
+    /**
+     Done bar button of toolbar.
+     */
+    private var privateDoneBarButton: IQBarButtonItem?
+    open var doneBarButton: IQBarButtonItem {
+        get {
+            if privateDoneBarButton == nil {
+                privateDoneBarButton = IQBarButtonItem(title: nil, style: .done, target: nil, action: nil)
+            }
+            return privateDoneBarButton!
+        }
+
+        set (newValue) {
+            privateDoneBarButton = newValue
+        }
+    }
+
+    /**
+     Fixed space bar button of toolbar.
+     */
+    private var privateFixedSpaceBarButton: IQBarButtonItem?
+    open var fixedSpaceBarButton: IQBarButtonItem {
+        get {
+            if privateFixedSpaceBarButton == nil {
+                privateFixedSpaceBarButton = IQBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil)
+            }
+            privateFixedSpaceBarButton?.isSystemItem = true
+            privateFixedSpaceBarButton?.width = 6
+
+            return privateFixedSpaceBarButton!
+        }
+
+        set (newValue) {
+            privateFixedSpaceBarButton = newValue
+        }
+    }
+
+    override open func sizeThatFits(_ size: CGSize) -> CGSize {
+        var sizeThatFit: CGSize = super.sizeThatFits(size)
+        sizeThatFit.height = 44
+        return sizeThatFit
+    }
+
+    override open var tintColor: UIColor! {
+
+        didSet {
+            guard let items: [UIBarButtonItem] = items else { return }
+            for item in items {
+                item.tintColor = tintColor
+            }
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQKeyboardToolbar: UIInputViewAudioFeedback {
+
+    open var enableInputClicksWhenVisible: Bool {
+        return true
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift
new file mode 100644 (file)
index 0000000..9f543e5
--- /dev/null
@@ -0,0 +1,60 @@
+//
+//  IQKeyboardToolbarPlaceholderConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// swiftlint:disable type_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarPlaceholderConfiguration: NSObject {
+
+    /**
+     If YES, then it add the textInputView's placeholder text on toolbar. Default is YES.
+    */
+    public var showPlaceholder: Bool = true
+
+    /**
+    Placeholder Font. Default is nil.
+    */
+    public var font: UIFont?
+
+    /**
+     Placeholder Color. Default is nil. Which means lightGray
+     */
+    public var color: UIColor?
+
+    /**
+     Placeholder Button Color when it's treated as button. Default is nil.
+     */
+    public var buttonColor: UIColor?
+
+    /**
+     Placeholder accessibility Label
+     */
+    public override var accessibilityLabel: String? { didSet { } }
+}
+// swiftlint:enable type_name
+
+@available(*, unavailable, renamed: "IQKeyboardToolbarPlaceholderConfiguration")
+@MainActor
+@objcMembers public final class IQToolbarPlaceholderConfiguration: NSObject {}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift
new file mode 100644 (file)
index 0000000..f0ceea2
--- /dev/null
@@ -0,0 +1,37 @@
+//
+//  IQPlaceholderable.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 Foundation
+import UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public protocol IQPlaceholderable: AnyObject {
+
+    var placeholder: String? { get set }
+    var attributedPlaceholder: NSAttributedString? { get set }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension UITextField: IQPlaceholderable { }
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/LICENSE
new file mode 100644 (file)
index 0000000..5d8eb96
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbar/README.md
new file mode 100644 (file)
index 0000000..3b60eb8
--- /dev/null
@@ -0,0 +1,85 @@
+# IQKeyboardToolbar
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardToolbar.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardToolbar)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardToolbar.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbar)
+
+![Screenshot1](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot.png)
+![Screenshot2](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot2.png)
+![Screenshot3](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot3.png)
+![Screenshot4](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbar/master/Screenshot/IQKeyboardToolbarScreenshot4.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardToolbar is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardToolbar'
+```
+
+## Usage
+
+This library can be used to add toolbar to the keyboard
+
+Previous Next and Done button
+```swift
+        textField.iq.addPreviousNextDone(target: self,
+                                         previousAction: #selector(textField1PreviousAction),
+                                         nextAction: #selector(textField1NextAction),
+                                         doneAction: #selector(doneAction), showPlaceholder: true)
+```
+
+Previous Next and Right button with customized titles or images
+```swift
+        textField.iq.addPreviousNextRight(target: self,
+                                          previousConfiguration: .init(title: "Prev", action: #selector(textView1PreviousAction)),
+                                          nextConfiguration: .init(title: "Next", action: #selector(textView1NextAction)),
+                                          rightConfiguration: .init(image: UIImage(systemName: "chevron.down")!, action: #selector(doneAction)),
+                                          title: "Text View 1")
+```
+
+Action button
+```swift
+        textField.iq.addDone(target: self,
+                             action: #selector(doneAction),
+                             title: "Select Account")
+        textField.iq.toolbar.titleBarButton.setTarget(self,
+                                                      action: #selector(selectAccount))
+```
+
+Additional leading and trailing buttons
+```swift
+        textField.iq.toolbar.additionalLeadingItems = [.init(barButtonSystemItem: .add, target: self, action: #selector(addAction))]
+        textField.iq.toolbar.additionalTrailingItems = [.init(barButtonSystemItem: .camera, target: self, action: #selector(cameraAction))]
+        textField.iq.addToolbar(target: self,
+                                previousConfiguration: nil,
+                                nextConfiguration: .init(title: "Next", action: #selector(doneAction)),
+                                rightConfiguration: .init(title: "Finish", action: #selector(doneAction)),
+                                title: "TextView 2")
+```
+
+Hide Placeholder
+```swift
+        textField1.iq.hidePlaceholder = true
+```
+
+Customized Placeholder
+```swift
+        textField1.iq.placeholder = "My Own Placeholder"
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardToolbar is available under the MIT license. See the LICENSE file for more info.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift
new file mode 100644 (file)
index 0000000..efebfb9
--- /dev/null
@@ -0,0 +1,90 @@
+//
+//  IQKeyboardToolbarConfiguration.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarConfiguration: NSObject {
+
+    /**
+     If YES, then uses textInputView's tintColor property,
+     otherwise tint color is default. Default is NO.
+     */
+    public var useTextInputViewTintColor: Bool = false
+
+    /**
+     This is used for toolbar.tintColor when textInputView.keyboardAppearance is UIKeyboardAppearanceDefault.
+     If useTextInputViewTintColor is YES then this property is ignored. Default is nil and uses black color.
+     */
+    public var tintColor: UIColor?
+
+    /**
+     This is used for toolbar.barTintColor. Default is nil.
+     */
+    public var barTintColor: UIColor?
+
+    /**
+     IQPreviousNextDisplayModeDefault:      Show NextPrevious when there are more than 1 textInputView otherwise hide.
+     IQPreviousNextDisplayModeAlwaysHide:   Do not show NextPrevious buttons in any case.
+     IQPreviousNextDisplayModeAlwaysShow:   Always show nextPrevious buttons,
+     if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled.
+     */
+    public var previousNextDisplayMode: IQPreviousNextDisplayMode = .default
+
+    /**
+     /**
+      IQAutoToolbarBySubviews:   Creates Toolbar according to subview's hierarchy of TextInputView's in view.
+      IQAutoToolbarByTag:        Creates Toolbar according to tag property of TextInputView's.
+      IQAutoToolbarByPosition:   Creates Toolbar according to the y,x position
+      of textInputView in it's superview coordinate.
+
+      Default is IQAutoToolbarBySubviews.
+      */
+     AutoToolbar managing behavior. Default is IQAutoToolbarBySubviews.
+     */
+    public var manageBehavior: IQKeyboardToolbarManageBehavior = .bySubviews
+
+    /**
+    Buttons configuration displayed on the toolbar, the selector parameter is ignored in below configuration
+    */
+    public var previousBarButtonConfiguration: IQBarButtonItemConfiguration?
+    public var nextBarButtonConfiguration: IQBarButtonItemConfiguration?
+    public var doneBarButtonConfiguration: IQBarButtonItemConfiguration?
+
+    public let placeholderConfiguration: IQKeyboardToolbarPlaceholderConfiguration = .init()
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarConfiguration {
+
+    @available(*, unavailable, renamed: "useTextInputViewTintColor")
+    var useTextFieldTintColor: Bool {
+        get { fatalError() }
+        set {}
+    }
+}
+// swiftlint:enable unused_setter_value
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift
new file mode 100644 (file)
index 0000000..ee76ea3
--- /dev/null
@@ -0,0 +1,68 @@
+//
+//  IQKeyboardToolbarConstants.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 Foundation
+
+// MARK: IQKeyboardToolbarManageBehavior
+
+/**
+`IQAutoToolbarBySubviews`
+Creates Toolbar according to subview's hierarchy of textInputView's in view.
+
+`IQAutoToolbarByTag`
+Creates Toolbar according to tag property of textInputView's.
+
+`IQAutoToolbarByPosition`
+Creates Toolbar according to the y,x position of textInputView in it's superview coordinate.
+*/
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQKeyboardToolbarManageBehavior: Int {
+    case bySubviews
+    case byTag
+    case byPosition
+}
+
+@available(*, unavailable, renamed: "IQKeyboardToolbarManageBehavior")
+@objc public enum IQAutoToolbarManageBehavior: Int {
+    case bySubviews
+    case byTag
+    case byPosition
+}
+
+/**
+ `IQPreviousNextDisplayModeDefault`
+ Show NextPrevious when there are more than 1 textInputView otherwise hide.
+
+ `IQPreviousNextDisplayModeAlwaysHide`
+ Do not show NextPrevious buttons in any case.
+ 
+ `IQPreviousNextDisplayModeAlwaysShow`
+ Always show nextPrevious buttons,
+ if there are more than 1 textInputView then both buttons will be visible but will be shown as disabled.
+ */
+@available(iOSApplicationExtension, unavailable)
+@objc public enum IQPreviousNextDisplayMode: Int {
+    case `default`
+    case alwaysHide
+    case alwaysShow
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift
new file mode 100644 (file)
index 0000000..8953423
--- /dev/null
@@ -0,0 +1,52 @@
+//
+//  IQKeyboardToolbarManager+Debug
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 Foundation
+
+// MARK: Debugging & Developer options
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+    func showLog(_ logString: String, indentation: Int = 0) {
+
+        guard isDebuggingEnabled else {
+            return
+        }
+
+        if indentation < 0 {
+            self.logIndentation = max(0, self.logIndentation + indentation)
+        }
+
+        var preLog: String = "IQKeyboardToolbarManager"
+        for _ in 0 ... self.logIndentation {
+            preLog += "|\t"
+        }
+
+        print(preLog + logString)
+
+        if indentation > 0 {
+            self.logIndentation += indentation
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift
new file mode 100644 (file)
index 0000000..abd7566
--- /dev/null
@@ -0,0 +1,29 @@
+//
+//  IQDeepResponderContainerView.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQDeepResponderContainerView: UIView {
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift
new file mode 100644 (file)
index 0000000..fc34aa0
--- /dev/null
@@ -0,0 +1,183 @@
+//
+//  IQKeyboardToolbarManager+Deprecated.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardToolbar
+
+// swiftlint:disable unused_setter_value
+// swiftlint:disable identifier_name
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+    @available(*, unavailable, renamed: "isEnabled")
+    var enableAutoToolbar: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "playInputClicks")
+    var shouldPlayInputClicks: Bool {
+        get { false }
+        set { }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior")
+    var toolbarManageBehaviour: IQAutoToolbarManageBehavior {
+        get { .bySubviews }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor")
+    var shouldToolbarUsesTextFieldTintColor: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.tintColor")
+    var toolbarTintColor: UIColor? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.barTintColor")
+    var toolbarBarTintColor: UIColor? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode")
+    var previousNextDisplayMode: IQPreviousNextDisplayMode {
+        get { .default }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "deepResponderAllowedContainerClasses")
+    var toolbarPreviousNextAllowedClasses: [UIView.Type] {
+        get { [] }
+        set { }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image",
+                message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+    var toolbarPreviousBarButtonItemImage: UIImage? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title",
+                message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+    var toolbarPreviousBarButtonItemText: String? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel",
+                message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
+    var toolbarPreviousBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image",
+                message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+    var toolbarNextBarButtonItemImage: UIImage? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title",
+                message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+    var toolbarNextBarButtonItemText: String? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel",
+                message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
+    var toolbarNextBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image",
+                message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+    var toolbarDoneBarButtonItemImage: UIImage? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title",
+                message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+    var toolbarDoneBarButtonItemText: String? {
+        get { nil }
+        set { }
+    }
+    @available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel",
+                message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
+    var toolbarDoneBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel")
+    var toolbarTitleBarButtonItemAccessibilityLabel: String? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder")
+    var shouldShowToolbarPlaceholder: Bool {
+        get { false }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font")
+    var placeholderFont: UIFont? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color")
+    var placeholderColor: UIColor? {
+        get { nil }
+        set { }
+    }
+
+    @available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor")
+    var placeholderButtonColor: UIColor? {
+        get { nil }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
+// swiftlint:enable identifier_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift
new file mode 100644 (file)
index 0000000..13d4c86
--- /dev/null
@@ -0,0 +1,143 @@
+//
+//  IQKeyboardToolbarManager+Internal.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQTextInputViewNotification
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+    /**    Get all textInputView siblings of textInputView. */
+    func responderViews(of textInputView: some IQTextInputView) -> [any IQTextInputView]? {
+
+        var superConsideredView: UIView?
+
+        // If find any consider responderView in it's upper hierarchy then will get deepResponderView.
+        for allowedClass in deepResponderAllowedContainerClasses {
+            superConsideredView = (textInputView as UIView).iq.superviewOf(type: allowedClass)
+            if superConsideredView != nil {
+                break
+            }
+        }
+
+        let swiftUIHostingView: UIView? = Self.getSwiftUIHostingView(textInputView: textInputView)
+
+        // (Enhancement ID: #22)
+        // If there is a superConsideredView in view's hierarchy,
+        // then fetching all it's subview that responds.
+        // No sorting for superConsideredView, it's by subView position.
+        if let view: UIView = swiftUIHostingView {
+            return view.iq.deepResponderViews()
+        } else if let view: UIView = superConsideredView {
+            return view.iq.deepResponderViews()
+        } else {  // Otherwise fetching all the siblings
+
+            let textInputViews: [any IQTextInputView] = textInputView.iq.responderSiblings()
+
+            // Sorting textInputViews according to behavior
+            switch toolbarConfiguration.manageBehavior {
+            // If autoToolbar behavior is bySubviews, then returning it.
+            case .bySubviews:   return textInputViews
+
+            // If autoToolbar behavior is by tag, then sorting it according to tag property.
+            case .byTag:    return textInputViews.sortedByTag()
+
+            // If autoToolbar behavior is by tag, then sorting it according to tag property.
+            case .byPosition:    return textInputViews.sortedByPosition()
+            }
+        }
+    }
+
+    func privateIsEnableAutoToolbar(of textInputView: some IQTextInputView) -> Bool {
+
+        var isEnabled: Bool = isEnabled
+
+        guard var textInputViewController = (textInputView as UIView).iq.viewContainingController() else {
+            return isEnabled
+        }
+
+        // If it is searchBar textInputView embedded in Navigation Bar
+        if (textInputView as UIView).iq.textFieldSearchBar() != nil,
+           let navController: UINavigationController = textInputViewController as? UINavigationController,
+           let topController: UIViewController = navController.topViewController {
+            textInputViewController = topController
+        }
+
+        if !isEnabled, enabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) {
+            isEnabled = true
+        }
+
+        if isEnabled {
+
+            // If found any toolbar disabled classes then return.
+            if disabledToolbarClasses.contains(where: { textInputViewController.isKind(of: $0) }) {
+                isEnabled = false
+            }
+
+            // Special Controllers
+            if isEnabled {
+
+                let classNameString: String = "\(type(of: textInputViewController.self))"
+
+                // _UIAlertControllerTextFieldViewController
+                if classNameString.contains("UIAlertController"),
+                   classNameString.hasSuffix("TextFieldViewController") {
+                    isEnabled = false
+                }
+            }
+        }
+
+        return isEnabled
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+    private static func getSwiftUIHostingView(textInputView: some IQTextInputView) -> UIView? {
+        var swiftUIHostingView: UIView?
+        let swiftUIHostingViewName: String = "UIHostingView<"
+        var superView: UIView? = textInputView.superview
+        while let aSuperview: UIView = superView {
+
+            let classNameString: String = {
+                var name: String = "\(type(of: aSuperview.self))"
+                if name.hasPrefix("_") {
+                    name.removeFirst()
+                }
+                return name
+            }()
+
+            if classNameString.hasPrefix(swiftUIHostingViewName) {
+                swiftUIHostingView = aSuperview
+                break
+            }
+
+            superView = aSuperview.superview
+        }
+        return swiftUIHostingView
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift
new file mode 100644 (file)
index 0000000..5186e05
--- /dev/null
@@ -0,0 +1,142 @@
+//
+//  IQKeyboardToolbarManager.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQTextInputViewNotification
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQKeyboardToolbarManager: NSObject {
+
+    private let textInputViewObserver: IQTextInputViewNotification = .init()
+
+    internal var textInputView: (some IQTextInputView)? {
+        textInputViewObserver.textInputView
+    }
+
+    /**
+     Returns the default singleton instance.
+     */
+    @MainActor
+    @objc public static let shared: IQKeyboardToolbarManager = .init()
+
+    /**
+     Automatic add the toolbar functionality. Default is false.
+     */
+    public var isEnabled: Bool = false {
+        didSet {
+            reloadInputViews()
+            showLog("isEnabled: \(isEnabled ? "Yes" : "NO")")
+        }
+    }
+
+    public var isDebuggingEnabled: Bool = false
+
+    /**
+     Configurations related to the toolbar display over the keyboard.
+     */
+    public let toolbarConfiguration: IQKeyboardToolbarConfiguration = .init()
+
+    // MARK: UISound handling
+
+    /**
+     If YES, then it plays inputClick sound on next/previous/done click.
+     */
+    public var playInputClicks: Bool = true
+
+    /**
+     Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes.
+     Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController.
+     */
+    public var disabledToolbarClasses: [UIViewController.Type] = [
+        UIAlertController.self,
+        UIInputViewController.self
+    ]
+
+    /**
+     Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes.
+     Within this scope, 'isEnabled' property is ignored. Class should be kind of UIViewController.
+     If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
+     */
+    public var enabledToolbarClasses: [UIViewController.Type] = []
+
+    /**
+     Allowed subclasses of UIView to add all inner textInputView,
+     this will allow to navigate between textInputView contains in different superview.
+     Class should be kind of UIView.
+     */
+    public var deepResponderAllowedContainerClasses: [UIView.Type] = [
+        UITableView.self,
+        UICollectionView.self,
+        IQDeepResponderContainerView.self
+    ]
+
+    internal var logIndentation = 0
+
+    internal override init() {
+        super.init()
+
+        addTextInputViewObserver()
+
+        // (Bug ID: #550)
+        // Loading IQKeyboardToolbar, IQTitleBarButtonItem, IQBarButtonItem to fix first time keyboard appearance delay
+        // If you experience exception breakpoint issue at below line then try these solutions
+        // https://stackoverflow.com/questions/27375640/all-exception-break-point-is-stopping-for-no-reason-on-simulator
+        DispatchQueue.main.async {
+            let textInputView: UITextField = UITextField()
+            textInputView.iq.addDone(target: nil, action: #selector(self.doneAction(_:)))
+            textInputView.iq.addPreviousNextDone(target: nil,
+                                                 previousAction: #selector(self.previousAction(_:)),
+                                                 nextAction: #selector(self.nextAction(_:)),
+                                                 doneAction: #selector(self.doneAction(_:)))
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+    private func removeTextInputViewObserver() {
+        textInputViewObserver.unsubscribe(identifier: "IQKeyboardToolbarManager")
+    }
+
+    private func addTextInputViewObserver() {
+        textInputViewObserver.subscribe(identifier: "IQKeyboardToolbarManager",
+                                        changeHandler: { [weak self] event, textInputView in
+            guard let self = self else { return }
+            guard (textInputView as UIView).iq.isAlertViewTextField() == false else {
+                return
+            }
+
+            switch event {
+            case .beginEditing:
+                reloadInputViews()
+            case .endEditing:
+                removeToolbarIfRequired(of: textInputView)
+            }
+        })
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift
new file mode 100644 (file)
index 0000000..1a79819
--- /dev/null
@@ -0,0 +1,210 @@
+//
+//  IQKeyboardToolbarManager+Action.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+// MARK: Previous next button actions
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+
+    /**
+     Returns YES if can navigate to previous responder textInputView, otherwise NO.
+    */
+    var canGoPrevious: Bool {
+        // If it is not first textInputView. then it's previous object canBecomeFirstResponder.
+        guard let textInputView: any IQTextInputView = self.textInputView,
+              let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+              let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+              index > 0 else {
+            return false
+        }
+        return true
+    }
+
+    /**
+     Returns YES if can navigate to next responder textInputViews, otherwise NO.
+    */
+    var canGoNext: Bool {
+        // If it is not first textInputView. then it's previous object canBecomeFirstResponder.
+        guard let textInputView: any IQTextInputView = self.textInputView,
+              let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+              let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+              index < textInputViews.count-1 else {
+            return false
+        }
+        return true
+    }
+
+    /**
+     Navigate to previous responder textInputViews
+    */
+    @discardableResult
+    func goPrevious() -> Bool {
+
+        // If it is not first textInputView. then it's previous object becomeFirstResponder.
+        guard let textInputView: any IQTextInputView = self.textInputView,
+              let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+              let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+              index > 0 else {
+            return false
+        }
+
+        let nextTextInputView: any IQTextInputView = textInputViews[index-1]
+
+        let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder()
+
+        //  If it refuses then becoming previous textInputView as first responder again.    (Bug ID: #96)
+        if !isAcceptAsFirstResponder {
+            showLog("Refuses to become first responder: \(nextTextInputView)")
+        }
+
+        return isAcceptAsFirstResponder
+    }
+
+    /**
+     Navigate to next responder textInputView.
+    */
+    @discardableResult
+    func goNext() -> Bool {
+
+        // If it is not first textInputView. then it's previous object becomeFirstResponder.
+        guard let textInputView: any IQTextInputView = self.textInputView,
+              let textInputViews: [any IQTextInputView] = responderViews(of: textInputView),
+              let index: Int = textInputViews.firstIndex(where: { $0 == textInputView }),
+              index < textInputViews.count-1 else {
+            return false
+        }
+
+        let nextTextInputView: any IQTextInputView = textInputViews[index+1]
+
+        let isAcceptAsFirstResponder: Bool = nextTextInputView.becomeFirstResponder()
+
+        //  If it refuses then becoming previous textInputView as first responder again.    (Bug ID: #96)
+        if !isAcceptAsFirstResponder {
+            showLog("Refuses to become first responder: \(nextTextInputView)")
+        }
+
+        return isAcceptAsFirstResponder
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+    /**    previousAction. */
+    func previousAction(_ barButton: IQBarButtonItem) {
+
+        // If user wants to play input Click sound.
+        if playInputClicks {
+            // Play Input Click Sound.
+            UIDevice.current.playInputClick()
+        }
+
+        guard canGoPrevious,
+              let textInputView: any IQTextInputView = self.textInputView else {
+            return
+        }
+
+        let isAcceptedAsFirstResponder: Bool = goPrevious()
+
+        if isAcceptedAsFirstResponder {
+            Self.sendInvokeAction(of: barButton, sender: textInputView)
+        }
+    }
+
+    /**    nextAction. */
+    func nextAction(_ barButton: IQBarButtonItem) {
+
+        // If user wants to play input Click sound.
+        if playInputClicks {
+            // Play Input Click Sound.
+            UIDevice.current.playInputClick()
+        }
+
+        guard canGoNext,
+              let textInputView: any IQTextInputView = self.textInputView else {
+            return
+        }
+
+        let isAcceptedAsFirstResponder: Bool = goNext()
+
+        if isAcceptedAsFirstResponder {
+            Self.sendInvokeAction(of: barButton, sender: textInputView)
+        }
+    }
+
+    /**    doneAction. Resigning current textInputView. */
+    func doneAction(_ barButton: IQBarButtonItem) {
+
+        // If user wants to play input Click sound.
+        if playInputClicks {
+            // Play Input Click Sound.
+            UIDevice.current.playInputClick()
+        }
+
+        guard let textInputView: any IQTextInputView = self.textInputView else {
+            return
+        }
+
+        // Resign textInputView.
+        let isResignedFirstResponder: Bool = textInputView.resignFirstResponder()
+
+        if isResignedFirstResponder {
+            Self.sendInvokeAction(of: barButton, sender: textInputView)
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+    private static func sendInvokeAction(of barButton: IQBarButtonItem, sender: some IQTextInputView) {
+        // Handling search bar special case
+        if let searchBar: UISearchBar = sender.iq.textFieldSearchBar() {
+            switch barButton {
+            case sender.internalToolbar.nextBarButton:
+                searchBar.internalToolbar.nextBarButton.invocation?.invoke(from: searchBar)
+            case sender.internalToolbar.previousBarButton:
+                searchBar.internalToolbar.previousBarButton.invocation?.invoke(from: searchBar)
+            case sender.internalToolbar.doneBarButton:
+                searchBar.internalToolbar.doneBarButton.invocation?.invoke(from: searchBar)
+            default:
+                break
+            }
+        } else {
+            barButton.invocation?.invoke(from: sender)
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+    var internalToolbar: IQKeyboardToolbar {
+        return iq.toolbar
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift
new file mode 100644 (file)
index 0000000..52b7895
--- /dev/null
@@ -0,0 +1,273 @@
+//
+//  IQKeyboardToolbarManager+Toolbar.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQKeyboardToolbarManager {
+    /**    reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
+    func reloadInputViews() {
+
+        guard let textInputView = textInputView else { return }
+        // If enabled then adding toolbar.
+        if privateIsEnableAutoToolbar(of: textInputView) {
+            self.addToolbarIfRequired(of: textInputView)
+        } else {
+            self.removeToolbarIfRequired(of: textInputView)
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardToolbarManager {
+
+    /**
+    Default tag for toolbar with Done button   -1001
+    */
+    private static let toolbarTag = -1001
+
+    // swiftlint:disable function_body_length
+    // swiftlint:disable cyclomatic_complexity
+    /**
+     Add toolbar if it is required to add on textInputViews and it's siblings.
+     */
+    func addToolbarIfRequired(of textInputView: some IQTextInputView) {
+
+        // Either there is no inputAccessoryView or
+        // if accessoryView is not appropriate for current situation
+        // (There is Previous/Next/Done toolbar)
+        guard let siblings: [any IQTextInputView] = responderViews(of: textInputView), !siblings.isEmpty,
+              !Self.hasUserDefinedInputAccessoryView(textInputView: textInputView) else {
+            return
+        }
+
+        showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+        defer {
+            showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+        }
+
+        showLog("Found \(siblings.count) responder sibling(s)")
+        let rightConfiguration: IQBarButtonItemConfiguration = getRightConfiguration()
+
+        let isTableCollectionView: Bool
+        if (textInputView as UIView).iq.superviewOf(type: UITableView.self) != nil ||
+            (textInputView as UIView).iq.superviewOf(type: UICollectionView.self) != nil {
+            isTableCollectionView = true
+        } else {
+            isTableCollectionView = false
+        }
+
+        let previousNextDisplayMode: IQPreviousNextDisplayMode = toolbarConfiguration.previousNextDisplayMode
+
+        let havePreviousNext: Bool
+        switch previousNextDisplayMode {
+        case .default:
+            // If the textInputView is part of UITableView/UICollectionView then we should be exposing previous/next too
+            // Because at this time we don't know previous or next cell if it contains another textInputView to move.
+            if isTableCollectionView {
+                havePreviousNext = true
+            } else if siblings.count <= 1 {
+                //    If only one object is found, then adding only Done button.
+                havePreviousNext = false
+            } else {
+                havePreviousNext = true
+            }
+        case .alwaysShow:
+            havePreviousNext = true
+        case .alwaysHide:
+            havePreviousNext = false
+        }
+
+        let placeholderConfig: IQKeyboardToolbarPlaceholderConfiguration = toolbarConfiguration.placeholderConfiguration
+        let titleText: String? = placeholderConfig.showPlaceholder ? textInputView.iq.drawingPlaceholder : nil
+        if havePreviousNext {
+            let prevConfiguration: IQBarButtonItemConfiguration = getPreviousConfiguration()
+            let nextConfiguration: IQBarButtonItemConfiguration = getNextConfiguration()
+
+            textInputView.iq.addToolbar(target: self,
+                                        previousConfiguration: prevConfiguration,
+                                        nextConfiguration: nextConfiguration,
+                                        rightConfiguration: rightConfiguration, title: titleText,
+                                        titleAccessibilityLabel: placeholderConfig.accessibilityLabel)
+            if isTableCollectionView {
+                // (Bug ID: #56)
+                // In case of UITableView, the next/previous buttons should always be enabled.
+                textInputView.iq.toolbar.previousBarButton.isEnabled = true
+                textInputView.iq.toolbar.nextBarButton.isEnabled = true
+            } else {
+                // If first textInputView, then previous should not be enabled.
+                if let first = siblings.first {
+                    textInputView.iq.toolbar.previousBarButton.isEnabled = first != textInputView
+                } else {
+                    textInputView.iq.toolbar.previousBarButton.isEnabled = false
+                }
+                // If last textInputView, then next should not be enabled.
+                if let last = siblings.last {
+                    textInputView.iq.toolbar.nextBarButton.isEnabled = last != textInputView
+                } else {
+                    textInputView.iq.toolbar.nextBarButton.isEnabled = false
+                }
+            }
+        } else {
+            textInputView.iq.addToolbar(target: self, rightConfiguration: rightConfiguration,
+                                        title: titleText,
+                                        titleAccessibilityLabel: placeholderConfig.accessibilityLabel)
+        }
+        // (Bug ID: #78)
+        textInputView.inputAccessoryView?.tag = IQKeyboardToolbarManager.toolbarTag
+
+        Self.applyToolbarConfiguration(textInputView: textInputView, toolbarConfiguration: toolbarConfiguration)
+    }
+    // swiftlint:enable function_body_length
+    // swiftlint:enable cyclomatic_complexity
+
+    /** Remove any toolbar if it is IQKeyboardToolbar. */
+    func removeToolbarIfRequired(of textInputView: some IQTextInputView) {    //  (Bug ID: #18)
+
+        guard let toolbar: IQKeyboardToolbar = textInputView.inputAccessoryView as? IQKeyboardToolbar,
+              toolbar.tag == IQKeyboardToolbarManager.toolbarTag else {
+            return
+        }
+
+        showLog(">>>>> \(#function) started >>>>>", indentation: 1)
+
+        defer {
+            showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
+        }
+
+        textInputView.inputAccessoryView = nil
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardToolbarManager {
+
+    static func hasUserDefinedInputAccessoryView(textInputView: some IQTextInputView) -> Bool {
+        guard let inputAccessoryView: UIView = textInputView.inputAccessoryView,
+              inputAccessoryView.tag != IQKeyboardToolbarManager.toolbarTag else { return false }
+
+        let swiftUIAccessoryNamePrefixes: [String] = [
+            "RootUIView",   // iOS 18
+            "InputAccessoryHost<InputAccessoryBar>" // iOS 17 and below
+        ]
+        let classNameString: String = "\(type(of: inputAccessoryView.classForCoder))"
+
+        // If it's SwiftUI accessory view but doesn't have a height (fake accessory view), then we should
+        // add our own accessoryView otherwise, keep the SwiftUI accessoryView since user has added it from code
+        guard swiftUIAccessoryNamePrefixes.contains(where: { classNameString.hasPrefix($0)}),
+              inputAccessoryView.subviews.isEmpty else {
+            return true
+        }
+        return false
+    }
+
+    func getRightConfiguration() -> IQBarButtonItemConfiguration {
+        let rightConfiguration: IQBarButtonItemConfiguration
+        if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.doneBarButtonConfiguration {
+            rightConfiguration = configuration
+            rightConfiguration.action = #selector(self.doneAction(_:))
+        } else {
+            rightConfiguration = IQBarButtonItemConfiguration(systemItem: .done, action: #selector(self.doneAction(_:)))
+            rightConfiguration.accessibilityLabel = "Done"
+        }
+        return rightConfiguration
+    }
+
+    func getPreviousConfiguration() -> IQBarButtonItemConfiguration {
+        let prevConfiguration: IQBarButtonItemConfiguration
+        if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.previousBarButtonConfiguration {
+            configuration.action = #selector(self.previousAction(_:))
+            prevConfiguration = configuration
+        } else {
+            let chevronUp: UIImage = UIImage(systemName: "chevron.up") ?? UIImage()
+            prevConfiguration = IQBarButtonItemConfiguration(image: chevronUp,
+                                                             action: #selector(self.previousAction(_:)))
+            prevConfiguration.accessibilityLabel = "Previous"
+        }
+        return prevConfiguration
+    }
+
+    func getNextConfiguration() -> IQBarButtonItemConfiguration {
+        let nextConfiguration: IQBarButtonItemConfiguration
+        if let configuration: IQBarButtonItemConfiguration = toolbarConfiguration.nextBarButtonConfiguration {
+            configuration.action = #selector(self.nextAction(_:))
+            nextConfiguration = configuration
+        } else {
+            let chevronDown: UIImage = UIImage(systemName: "chevron.down") ?? UIImage()
+            nextConfiguration = IQBarButtonItemConfiguration(image: chevronDown,
+                                                             action: #selector(self.nextAction(_:)))
+            nextConfiguration.accessibilityLabel = "Next"
+        }
+        return nextConfiguration
+    }
+
+    static func applyToolbarConfiguration(textInputView: some IQTextInputView,
+                                          toolbarConfiguration: IQKeyboardToolbarConfiguration) {
+
+        let toolbar: IQKeyboardToolbar = textInputView.iq.toolbar
+
+        // Setting toolbar tintColor //  (Enhancement ID: #30)
+        if toolbarConfiguration.useTextInputViewTintColor {
+            toolbar.tintColor = textInputView.tintColor
+        } else {
+            toolbar.tintColor = toolbarConfiguration.tintColor
+        }
+
+        // Bar style according to keyboard appearance
+        switch textInputView.keyboardAppearance {
+        case .dark:
+            toolbar.barStyle = .black
+            toolbar.barTintColor = nil
+        default:
+            toolbar.barStyle = .default
+            toolbar.barTintColor = toolbarConfiguration.barTintColor
+        }
+
+        // Setting toolbar title font.   //  (Enhancement ID: #30)
+        guard toolbarConfiguration.placeholderConfiguration.showPlaceholder,
+              !textInputView.iq.hidePlaceholder else {
+            toolbar.titleBarButton.title = nil
+            return
+        }
+
+        // Updating placeholder font to toolbar.     //(Bug ID: #148, #272)
+        if toolbar.titleBarButton.title == nil ||
+            toolbar.titleBarButton.title != textInputView.iq.drawingPlaceholder {
+            toolbar.titleBarButton.title = textInputView.iq.drawingPlaceholder
+        }
+
+        // Setting toolbar title font.   //  (Enhancement ID: #30)
+        toolbar.titleBarButton.titleFont = toolbarConfiguration.placeholderConfiguration.font
+
+        // Setting toolbar title color.   //  (Enhancement ID: #880)
+        toolbar.titleBarButton.titleColor = toolbarConfiguration.placeholderConfiguration.color
+
+        // Setting toolbar button title color.   //  (Enhancement ID: #880)
+        toolbar.titleBarButton.selectableTitleColor = toolbarConfiguration.placeholderConfiguration.buttonColor
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift
new file mode 100644 (file)
index 0000000..83a8b9c
--- /dev/null
@@ -0,0 +1,58 @@
+//
+//  Array+Sort.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+/**
+UIView.subviews sorting category.
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension Array where Element: IQTextInputView {
+
+    /**
+    Returns the array by sorting the UIView's by their tag property.
+    */
+    func sortedByTag() -> [Element] {
+
+        return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
+
+            return (obj1.tag < obj2.tag)
+        })
+    }
+
+    /**
+    Returns the array by sorting the UIView's by their tag property.
+    */
+    func sortedByPosition() -> [Element] {
+
+        return sorted(by: { (obj1: Element, obj2: Element) -> Bool in
+            if obj1.frame.minY != obj2.frame.minY {
+                return obj1.frame.minY < obj2.frame.minY
+            } else {
+                return obj1.frame.minX < obj2.frame.minX
+            }
+        })
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift
new file mode 100644 (file)
index 0000000..592399e
--- /dev/null
@@ -0,0 +1,179 @@
+//
+//  UIView+Responders.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbarManager
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private struct AssociatedKeys {
+    static var ignoreSwitchingByNextPrevious: Int = 0
+}
+
+/**
+UIView category for managing textInputView
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQKeyboardExtension where Base: IQTextInputView {
+
+    /**
+     If ignoreSwitchingByNextPrevious is true then library will ignore this textInputView
+     while moving to other textInputView using keyboard toolbar next previous buttons.
+     Default is false
+     */
+    var ignoreSwitchingByNextPrevious: Bool {
+        get {
+            if let base = base {
+                return objc_getAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious) as? Bool ?? false
+            }
+            return false
+        }
+        set(newValue) {
+            if let base = base {
+                objc_setAssociatedObject(base, &AssociatedKeys.ignoreSwitchingByNextPrevious,
+                                         newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+}
+
+// swiftlint:disable unused_setter_value
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension UIView {
+    @available(*, unavailable, renamed: "iq.ignoreSwitchingByNextPrevious")
+    var ignoreSwitchingByNextPrevious: Bool {
+        get { false }
+        set { }
+    }
+}
+// swiftlint:enable unused_setter_value
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardExtension where Base: IQTextInputView {
+
+    /**
+     Returns all siblings of the receiver which canBecomeFirstResponder.
+     */
+    func responderSiblings() -> [any IQTextInputView] {
+
+        //    Getting all siblings
+        guard let siblings: [UIView] = base?.superview?.subviews else { return [] }
+
+        // Array of textInputView.
+        var textInputViews: [any IQTextInputView] = []
+        for view in siblings {
+            if let view = view as? any IQTextInputView,
+               view == base || !view.internalIgnoreSwitchingByNextPrevious,
+               view.internalCanBecomeFirstResponder() {
+                textInputViews.append(view)
+            }
+        }
+
+        return textInputViews
+    }
+}
+
+/**
+UIView category for managing textInputView
+*/
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+internal extension IQKeyboardExtension where Base: UIView {
+
+    /**
+    Returns all deep subViews of the receiver which canBecomeFirstResponder.
+    */
+    func deepResponderViews() -> [any IQTextInputView] {
+
+        guard let subviews: [UIView] = base?.subviews, !subviews.isEmpty else { return [] }
+
+        // Array of textInputViews.
+        var textInputViews: [any IQTextInputView] = []
+
+        for view in subviews {
+
+            if let view = view as? any IQTextInputView,
+               view == base || !view.internalIgnoreSwitchingByNextPrevious,
+               view.internalCanBecomeFirstResponder() {
+                textInputViews.append(view)
+            }
+            // Sometimes there are hidden or disabled views and textInputView inside them still recorded,
+            // so we added some more validations here (Bug ID: #458)
+            // Uncommented else (Bug ID: #625)
+            else if view.subviews.count != 0,
+                    base?.isUserInteractionEnabled == true,
+                    base?.isHidden == false, base?.alpha != 0.0 {
+                for deepView in view.iq.deepResponderViews() {
+                    textInputViews.append(deepView)
+                }
+            }
+        }
+
+        // subviews are returning in opposite order. Sorting according the frames 'y'.
+        return textInputViews.sorted(by: { (view1: any IQTextInputView, view2: any IQTextInputView) -> Bool in
+
+            let frame1: CGRect = view1.convert(view1.bounds, to: base)
+            let frame2: CGRect = view2.convert(view2.bounds, to: base)
+
+            if frame1.minY != frame2.minY {
+                return frame1.minY < frame2.minY
+            } else {
+                return frame1.minX < frame2.minX
+            }
+        })
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+private extension IQKeyboardExtension where Base: IQTextInputView {
+
+    func canBecomeFirstResponder() -> Bool {
+
+        var canBecomeFirstResponder: Bool = base?.iqIsEnabled == true
+
+        if canBecomeFirstResponder {
+            canBecomeFirstResponder = base?.isUserInteractionEnabled == true &&
+            base?.isHidden == false &&
+            base?.alpha != 0.0 &&
+            !isAlertViewTextField() &&
+            textFieldSearchBar() == nil
+        }
+
+        return canBecomeFirstResponder
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+fileprivate extension IQTextInputView {
+    var internalIgnoreSwitchingByNextPrevious: Bool {
+        return iq.ignoreSwitchingByNextPrevious
+    }
+    func internalCanBecomeFirstResponder() -> Bool {
+        return iq.canBecomeFirstResponder()
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift
new file mode 100644 (file)
index 0000000..f8113e6
--- /dev/null
@@ -0,0 +1,44 @@
+//
+//  UIView+RespondersObjc.swift
+//  https://github.com/hackiftekhar/IQKeyboardToolbar
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+// MARK:  For ObjectiveC Compatibility
+
+// swiftlint:disable identifier_name
+@objc public extension UITextField {
+
+    var iq_ignoreSwitchingByNextPrevious: Bool {
+        get { iq.ignoreSwitchingByNextPrevious }
+        set { iq.ignoreSwitchingByNextPrevious = newValue }
+    }
+}
+
+@objc public extension UITextView {
+
+    var iq_ignoreSwitchingByNextPrevious: Bool {
+        get { iq.ignoreSwitchingByNextPrevious }
+        set { iq.ignoreSwitchingByNextPrevious = newValue }
+    }
+}
+// swiftlint:enable identifier_name
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/LICENSE
new file mode 100644 (file)
index 0000000..5d8eb96
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQKeyboardToolbarManager/README.md
new file mode 100644 (file)
index 0000000..d20fe8a
--- /dev/null
@@ -0,0 +1,93 @@
+# IQKeyboardToolbarManager
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQKeyboardToolbarManager.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQKeyboardToolbarManager)
+[![Version](https://img.shields.io/cocoapods/v/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+[![License](https://img.shields.io/cocoapods/l/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+[![Platform](https://img.shields.io/cocoapods/p/IQKeyboardToolbarManager.svg?style=flat)](https://cocoapods.org/pods/IQKeyboardToolbarManager)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardToolbarManager/master/Screenshot/IQKeyboardToolbarManagerScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQKeyboardToolbarManager is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQKeyboardToolbarManager'
+```
+
+## Usage
+
+Enable toolbar handling in AppDelegate
+
+```swift
+import UIKit
+import IQKeyboardToolbarManager
+
+@UIApplicationMain
+class AppDelegate: UIResponder, UIApplicationDelegate {
+
+    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
+        IQKeyboardToolbarManager.shared.isEnabled = true
+        return true
+    }
+```
+
+Cuistomize Behavior
+```swift
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.useTextInputViewTintColor = true
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = UIColor.systemGreen
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.barTintColor = UIColor.systemYellow
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.previousNextDisplayMode = .alwaysShow
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior = .byPosition
+
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.previousBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.nextBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = ... // BarButton configuration to change title, image or system image etc
+
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.showPlaceholder = false
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.font = UIFont.italicSystemFont(ofSize: 14)
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.color = UIColor.systemPurple
+        IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.buttonColor = UIColor.systemBrown // This is used only if placeholder is an action button
+
+        IQKeyboardToolbarManager.shared.playInputClicks = false
+
+        IQKeyboardToolbarManager.shared.disabledToolbarClasses.append(ChatViewController.self)
+        IQKeyboardToolbarManager.shared.enabledToolbarClasses.append(LoginViewController.self)
+        IQKeyboardToolbarManager.shared.deepResponderAllowedContainerClasses.append(UIStackView.self)
+```
+
+Useful functions and variables
+```swift
+        if IQKeyboardToolbarManager.shared.canGoPrevious {
+          ...
+        }
+
+        if IQKeyboardToolbarManager.shared.canGoNext {
+          ...
+        }
+
+        IQKeyboardToolbarManager.shared.goPrevious()
+        IQKeyboardToolbarManager.shared.goNext()
+
+        IQKeyboardToolbarManager.shared.reloadInputViews() // If some textInputView hierarchy are changed on the fly then use this to reload button states
+```
+
+Useful functions and variables for TextInputView
+```swift
+        textField.iq.ignoreSwitchingByNextPrevious = false
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQKeyboardToolbarManager is available under the MIT license. See the LICENSE file for more info.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift
new file mode 100644 (file)
index 0000000..4b5e4f9
--- /dev/null
@@ -0,0 +1,91 @@
+//
+//  IQTextInputViewInfo.swift
+//  https://github.com/hackiftekhar/IQTextInputViewNotification
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public struct IQTextInputViewInfo: Equatable {
+
+    nonisolated public static func == (lhs: Self, rhs: Self) -> Bool {
+        return lhs.textInputView == rhs.textInputView &&
+        lhs.event == rhs.event
+    }
+
+    @MainActor
+    @objc public enum Event: Int {
+        case beginEditing
+        case endEditing
+
+        public var name: String {
+            switch self {
+            case .beginEditing:
+                return "BeginEditing"
+            case .endEditing:
+                return "EndEditing"
+            }
+        }
+    }
+
+    public let event: Event
+
+    public let textInputView: any IQTextInputView
+
+    internal init?(notification: Notification, event: Event) {
+        guard let view: any IQTextInputView = notification.object as? (any IQTextInputView) else {
+            return nil
+        }
+
+        self.event = event
+        textInputView = view
+    }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+public extension IQTextInputViewInfo {
+
+    @available(*, unavailable, renamed: "event")
+    var name: Event { event }
+
+    @available(*, unavailable, renamed: "textInputView")
+    var textFieldView: any IQTextInputView { textInputView }
+}
+
+@available(*, unavailable, renamed: "IQTextInputViewInfo")
+@MainActor
+public struct IQTextFieldViewInfo: Equatable {}
+
+@available(iOSApplicationExtension, unavailable)
+@objcMembers public class IQTextInputViewInfoObjC: NSObject {
+    private let wrappedValue: IQTextInputViewInfo
+
+    public var event: IQTextInputViewInfo.Event { wrappedValue.event }
+
+    public var textInputView: any IQTextInputView { wrappedValue.textInputView }
+
+    init(wrappedValue: IQTextInputViewInfo){
+        self.wrappedValue = wrappedValue
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift
new file mode 100644 (file)
index 0000000..8822d39
--- /dev/null
@@ -0,0 +1,182 @@
+//
+//  IQTextInputViewNotification.swift
+//  https://github.com/hackiftekhar/IQTextInputViewNotification
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import Combine
+import IQKeyboardCore
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers public final class IQTextInputViewNotification: NSObject {
+
+    private var storage: Set<AnyCancellable> = []
+
+    private var textInputViewObservers: [AnyHashable: TextInputViewCompletion] = [:]
+
+    private var findInteractionTextInputViewInfo: IQTextInputViewInfo?
+
+    public private(set) var textInputViewInfo: IQTextInputViewInfo?
+
+    public var event: IQTextInputViewInfo.Event? {
+        textInputViewInfo?.event
+    }
+
+    public var textInputView: (any IQTextInputView)? {
+        return textInputViewInfo?.textInputView
+    }
+
+    public override init() {
+        super.init()
+
+        //  Registering for TextInputView notification.
+        do {
+            let beginEditingNotificationNames: [Notification.Name] = [
+                UITextField.textDidBeginEditingNotification,
+                UITextView.textDidBeginEditingNotification
+            ]
+
+            for notificationName in beginEditingNotificationNames {
+                NotificationCenter.default.publisher(for: notificationName)
+                    .compactMap({ IQTextInputViewInfo(notification: $0, event: .beginEditing) })
+                    .sink(receiveValue: { [weak self] info in
+                        guard let self = self else { return }
+                        self.didBeginEditing(info: info)
+                    })
+                    .store(in: &storage)
+            }
+        }
+
+        do {
+            let endEditingNotificationNames: [Notification.Name] = [
+                UITextField.textDidEndEditingNotification,
+                UITextView.textDidEndEditingNotification
+            ]
+
+            for notificationName in endEditingNotificationNames {
+                NotificationCenter.default.publisher(for: notificationName)
+                    .compactMap({ IQTextInputViewInfo(notification: $0, event: .endEditing) })
+                    .sink(receiveValue: { [weak self] info in
+                        guard let self = self else { return }
+                        self.didEndEditing(info: info)
+                    })
+                    .store(in: &storage)
+            }
+        }
+    }
+
+    private func didBeginEditing(info: IQTextInputViewInfo) {
+
+        if #available(iOS 16.0, *),
+           let findInteractionTextInputViewInfo = findInteractionTextInputViewInfo,
+           findInteractionTextInputViewInfo.textInputView.iqFindInteraction?.isFindNavigatorVisible == true {
+            // // This means the this didBeginEditing call comes due to find interaction
+            textInputViewInfo = findInteractionTextInputViewInfo
+            sendEvent(info: findInteractionTextInputViewInfo)
+        } else if textInputViewInfo != info {
+            textInputViewInfo = info
+            findInteractionTextInputViewInfo = nil
+            sendEvent(info: info)
+        } else {
+            findInteractionTextInputViewInfo = nil
+        }
+    }
+
+    private func didEndEditing(info: IQTextInputViewInfo) {
+
+        if textInputViewInfo != info {
+            if #available(iOS 16.0, *),
+               info.textInputView.iqIsFindInteractionEnabled {
+                findInteractionTextInputViewInfo = textInputViewInfo
+            } else {
+                findInteractionTextInputViewInfo = nil
+            }
+            textInputViewInfo = info
+            sendEvent(info: info)
+            textInputViewInfo = nil
+        }
+    }
+}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQTextInputViewNotification {
+
+    typealias TextInputViewCompletion = (_ event: IQTextInputViewInfo.Event,
+                                         _ textInputView: any IQTextInputView) -> Void
+
+    func subscribe(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) {
+        textInputViewObservers[identifier] = changeHandler
+
+        if let textInputViewInfo = textInputViewInfo {
+            changeHandler(textInputViewInfo.event, textInputViewInfo.textInputView)
+        }
+    }
+
+    func unsubscribe(identifier: AnyHashable) {
+        textInputViewObservers[identifier] = nil
+    }
+
+    func isSubscribed(identifier: AnyHashable) -> Bool {
+        return textInputViewObservers[identifier] != nil
+    }
+
+    @nonobjc
+    private func sendEvent(info: IQTextInputViewInfo) {
+
+        for block in textInputViewObservers.values {
+            block(info.event, info.textInputView)
+        }
+    }
+}
+
+// MARK: Deprecated
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+public extension IQTextInputViewNotification {
+
+    @available(*, unavailable, renamed: "textInputViewInfo")
+    var textFieldViewInfo: IQTextInputViewInfo? { textInputViewInfo }
+
+    @available(*, unavailable, renamed: "textInputView")
+    var textFieldView: (some IQTextInputView)? { textInputView }
+
+    @available(*, unavailable, renamed: "subscribe(identifier:changeHandler:)")
+    func registerTextFieldViewChange(identifier: AnyHashable, changeHandler: @escaping TextInputViewCompletion) {}
+
+    @available(*, unavailable, renamed: "unsubscribe(identifier:)")
+    func unregisterSizeChange(identifier: AnyHashable) {}
+}
+
+@available(*, unavailable, renamed: "IQTextInputViewNotification")
+@MainActor
+@objcMembers public final class IQTextFieldViewListener: NSObject {}
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc public extension IQTextInputViewNotification {
+
+    var textInputViewInfoObjc: IQTextInputViewInfoObjC? {
+        guard let textInputViewInfo = textInputViewInfo else { return nil }
+        return IQTextInputViewInfoObjC(wrappedValue: textInputViewInfo)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/LICENSE
new file mode 100644 (file)
index 0000000..4440a40
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2024 hackiftekhar <ideviftekhar@gmail.com>
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextInputViewNotification/README.md
new file mode 100644 (file)
index 0000000..3926512
--- /dev/null
@@ -0,0 +1,66 @@
+# IQTextInputViewNotification
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQTextInputViewNotification.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQTextInputViewNotification)
+[![Version](https://img.shields.io/cocoapods/v/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification)
+[![License](https://img.shields.io/cocoapods/l/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification)
+[![Platform](https://img.shields.io/cocoapods/p/IQTextInputViewNotification.svg?style=flat)](https://cocoapods.org/pods/IQTextInputViewNotification)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextInputViewNotification/master/Screenshot/IQTextInputViewNotificationScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQTextInputViewNotification is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQTextInputViewNotification'
+```
+
+## Usage
+
+To observe textInputView becomeFirstResponder and resignFirstResponder changes, subscribe to the textInputView events:-
+
+```swift
+import IQTextInputViewNotification
+
+class ViewController: UIViewController {
+
+    private let textInputViewObserver: IQTextInputViewNotification = .init()
+
+    override func viewWillAppear(_ animated: Bool) {
+        super.viewWillAppear(animated)
+
+        // Subscribe
+        textInputViewObserver.subscribe(identifier: "YOUR_UNIQUE_IDENTIFIER") {info in
+            print(info.event.name) // BeginEditing or EndEditing event
+            print(info.textInputView) // TextInputView which begin editing or end editing
+            // Write your own logic here based on event
+        }
+    }
+
+    override func viewWillDisappear(_ animated: Bool) {
+        super.viewWillDisappear(animated)
+
+        // Unsubscribe
+        textInputViewObserver.unsubscribe(identifier: "YOUR_UNIQUE_IDENTIFIER")
+    }
+}
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## Flow
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextInputViewNotification/master/Screenshot/FlowDiagram.jpg)
+
+## License
+
+IQTextInputViewNotification is available under the MIT license. See the LICENSE file for more info.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Assets/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..9021190
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTracking</key>
+       <false/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Classes/IQTextView+Placeholderable.swift
new file mode 100644 (file)
index 0000000..1cf3954
--- /dev/null
@@ -0,0 +1,29 @@
+//
+//  IQTextView.swift
+//  https://github.com/hackiftekhar/IQTextView
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+import IQKeyboardToolbar
+
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objc extension IQTextView: IQPlaceholderable { }
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Classes/IQTextView.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/IQTextView/Classes/IQTextView.swift
new file mode 100644 (file)
index 0000000..9c49e51
--- /dev/null
@@ -0,0 +1,193 @@
+//
+//  IQTextView.swift
+//  https://github.com/hackiftekhar/IQTextView
+//  Copyright (c) 2013-24 Iftekhar Qurashi.
+//
+//  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 UIKit
+
+/** @abstract UITextView with placeholder support   */
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+@objcMembers open class IQTextView: UITextView {
+
+    required public init?(coder aDecoder: NSCoder) {
+        super.init(coder: aDecoder)
+        setup()
+    }
+
+    override public init(frame: CGRect, textContainer: NSTextContainer?) {
+        super.init(frame: frame, textContainer: textContainer)
+        setup()
+    }
+
+    override open func awakeFromNib() {
+        super.awakeFromNib()
+        setup()
+    }
+
+    private func setup() {
+        NotificationCenter.default.addObserver(self, selector: #selector(self.refreshPlaceholder),
+                                               name: UITextView.textDidChangeNotification, object: self)
+
+        do {
+            placeholderLabel.frame = placeholderExpectedFrame
+            placeholderLabel.autoresizingMask = [.flexibleWidth, .flexibleHeight]
+            placeholderLabel.lineBreakMode = .byWordWrapping
+            placeholderLabel.numberOfLines = 0
+            placeholderLabel.font = self.font
+            placeholderLabel.textAlignment = self.textAlignment
+            placeholderLabel.backgroundColor = UIColor.clear
+            placeholderLabel.isAccessibilityElement = false
+            placeholderLabel.textColor = UIColor.placeholderText
+            self.addSubview(placeholderLabel)
+            refreshPlaceholder()
+        }
+    }
+
+    private var placeholderInsets: UIEdgeInsets {
+        let top: CGFloat = self.textContainerInset.top
+        let left: CGFloat = self.textContainerInset.left + self.textContainer.lineFragmentPadding
+        let bottom: CGFloat = self.textContainerInset.bottom
+        let right: CGFloat = self.textContainerInset.right + self.textContainer.lineFragmentPadding
+        return UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
+    }
+
+    private var placeholderExpectedFrame: CGRect {
+        let insets: UIEdgeInsets = self.placeholderInsets
+        let maxWidth: CGFloat = self.frame.width-insets.left-insets.right
+        let size: CGSize = CGSize(width: maxWidth, height: self.frame.height-insets.top-insets.bottom)
+        let expectedSize: CGSize = placeholderLabel.sizeThatFits(size)
+
+        return CGRect(x: insets.left, y: insets.top, width: maxWidth, height: expectedSize.height)
+    }
+
+    public let placeholderLabel: UILabel = .init()
+
+    /** @abstract To set textView's placeholder text color. */
+    @IBInspectable open var placeholderTextColor: UIColor? {
+
+        get {
+            return placeholderLabel.textColor
+        }
+
+        set {
+            placeholderLabel.textColor = newValue
+        }
+    }
+
+    /** @abstract To set textView's placeholder text. Default is nil.    */
+    @IBInspectable open var placeholder: String? {
+
+        get {
+            return placeholderLabel.text
+        }
+
+        set {
+            placeholderLabel.text = newValue
+            refreshPlaceholder()
+        }
+    }
+
+    /** @abstract To set textView's placeholder attributed text. Default is nil.    */
+    open var attributedPlaceholder: NSAttributedString? {
+        get {
+            return placeholderLabel.attributedText
+        }
+
+        set {
+            placeholderLabel.attributedText = newValue
+            refreshPlaceholder()
+        }
+    }
+
+    open override func layoutSubviews() {
+        super.layoutSubviews()
+
+        placeholderLabel.frame = placeholderExpectedFrame
+    }
+
+    @objc private func refreshPlaceholder() {
+
+        let text: String = text ?? attributedText?.string ?? ""
+        placeholderLabel.alpha = text.isEmpty ? 1 : 0
+    }
+
+    open override var text: String! {
+
+        didSet {
+            refreshPlaceholder()
+        }
+    }
+
+    open override var attributedText: NSAttributedString! {
+
+        didSet {
+            refreshPlaceholder()
+        }
+    }
+
+    open override var font: UIFont? {
+
+        didSet {
+
+            if let font: UIFont = font {
+                placeholderLabel.font = font
+            } else {
+                placeholderLabel.font = UIFont.systemFont(ofSize: 12)
+            }
+        }
+    }
+
+    open override var textAlignment: NSTextAlignment {
+        didSet {
+            placeholderLabel.textAlignment = textAlignment
+        }
+    }
+
+    open override var intrinsicContentSize: CGSize {
+        guard !hasText else {
+            return super.intrinsicContentSize
+        }
+
+        var newSize: CGSize = super.intrinsicContentSize
+        let placeholderInsets: UIEdgeInsets = self.placeholderInsets
+        newSize.height = placeholderExpectedFrame.height + placeholderInsets.top + placeholderInsets.bottom
+
+        return newSize
+    }
+
+    open override func caretRect(for position: UITextPosition) -> CGRect {
+        var originalRect = super.caretRect(for: position)
+
+        // When placeholder is visible and text alignment is centered
+        guard placeholderLabel.alpha == 1 && self.textAlignment == .center else { return originalRect }
+
+        // Calculate the width of the placeholder text
+        let font = placeholderLabel.font ?? UIFont.systemFont(ofSize: UIFont.systemFontSize)
+        let textSize = placeholderLabel.text?.size(withAttributes: [.font: font]) ?? .zero
+        // Calculate the starting x position of the centered placeholder text
+        let centeredTextX = (self.bounds.size.width - textSize.width) / 2
+        // Update the caret position to match the starting x position of the centered text
+        originalRect.origin.x = centeredTextX
+
+        return originalRect
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/LICENSE
new file mode 100644 (file)
index 0000000..5d8eb96
--- /dev/null
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/IQTextView/README.md
new file mode 100644 (file)
index 0000000..417325e
--- /dev/null
@@ -0,0 +1,48 @@
+# IQTextView
+
+[![CI Status](https://img.shields.io/travis/hackiftekhar/IQTextView.svg?style=flat)](https://travis-ci.org/hackiftekhar/IQTextView)
+[![Version](https://img.shields.io/cocoapods/v/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView)
+[![License](https://img.shields.io/cocoapods/l/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView)
+[![Platform](https://img.shields.io/cocoapods/p/IQTextView.svg?style=flat)](https://cocoapods.org/pods/IQTextView)
+
+![Screenshot](https://raw.githubusercontent.com/hackiftekhar/IQTextView/master/Screenshot/IQTextViewScreenshot.png)
+
+## Example
+
+To run the example project, clone the repo, and run `pod install` from the Example directory first.
+
+## Requirements
+
+## Installation
+
+IQTextView is available through [CocoaPods](https://cocoapods.org). To install
+it, simply add the following line to your Podfile:
+
+```ruby
+pod 'IQTextView'
+```
+
+## Usage
+
+You can set any UITextView class to IQTextView and then you can change the placeholder and placeholderTextColor from the storyboard
+
+To change them via code, you may have to set them programmatically
+```swift
+textView.placeholderTextColor = UIColor.lightGray
+textView.placeholder = "Enter your message here..."
+```
+
+To work this with IQKeyboardToolbarManager to show placeholder in toolbar, you may have to confirm IQPlaceholderable manually in your code
+```swift
+@available(iOSApplicationExtension, unavailable)
+@MainActor
+extension IQTextView: IQPlaceholderable { }
+```
+
+## Author
+
+Iftekhar Qurashi hack.iftekhar@gmail.com
+
+## License
+
+IQTextView is available under the MIT license. See the LICENSE file for more info.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Manifest.lock b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Manifest.lock
new file mode 100644 (file)
index 0000000..4d306eb
--- /dev/null
@@ -0,0 +1,81 @@
+PODS:
+  - IQKeyboardCore (1.0.5)
+  - IQKeyboardManagerSwift (8.0.1):
+    - IQKeyboardManagerSwift/Appearance (= 8.0.1)
+    - IQKeyboardManagerSwift/Core (= 8.0.1)
+    - IQKeyboardManagerSwift/IQKeyboardReturnManager (= 8.0.1)
+    - IQKeyboardManagerSwift/IQKeyboardToolbarManager (= 8.0.1)
+    - IQKeyboardManagerSwift/IQTextView (= 8.0.1)
+    - IQKeyboardManagerSwift/Resign (= 8.0.1)
+  - IQKeyboardManagerSwift/Appearance (8.0.1):
+    - IQKeyboardManagerSwift/Core
+  - IQKeyboardManagerSwift/Core (8.0.1):
+    - IQKeyboardNotification
+    - IQTextInputViewNotification
+  - IQKeyboardManagerSwift/IQKeyboardReturnManager (8.0.1):
+    - IQKeyboardReturnManager
+  - IQKeyboardManagerSwift/IQKeyboardToolbarManager (8.0.1):
+    - IQKeyboardManagerSwift/Core
+    - IQKeyboardToolbarManager
+  - IQKeyboardManagerSwift/IQTextView (8.0.1):
+    - IQTextView
+  - IQKeyboardManagerSwift/Resign (8.0.1):
+    - IQKeyboardManagerSwift/Core
+  - IQKeyboardNotification (1.0.3)
+  - IQKeyboardReturnManager (1.0.4):
+    - IQKeyboardCore (= 1.0.5)
+  - IQKeyboardToolbar (1.1.1):
+    - IQKeyboardCore
+    - IQKeyboardToolbar/Core (= 1.1.1)
+  - IQKeyboardToolbar/Core (1.1.1):
+    - IQKeyboardCore
+    - IQKeyboardToolbar/Placeholderable
+  - IQKeyboardToolbar/Placeholderable (1.1.1):
+    - IQKeyboardCore
+  - IQKeyboardToolbarManager (1.1.3):
+    - IQKeyboardToolbar
+    - IQTextInputViewNotification
+  - IQTextInputViewNotification (1.0.8):
+    - IQKeyboardCore
+  - IQTextView (1.0.5):
+    - IQKeyboardToolbar/Placeholderable
+  - SnapKit (5.7.1)
+  - SocketRocket (0.7.1)
+  - Toast-Swift (5.1.1)
+
+DEPENDENCIES:
+  - IQKeyboardManagerSwift
+  - SnapKit (~> 5.7.0)
+  - SocketRocket
+  - Toast-Swift
+
+SPEC REPOS:
+  https://gitee.com/mirrors/CocoaPods-Specs.git:
+    - IQKeyboardCore
+    - IQKeyboardManagerSwift
+    - IQKeyboardNotification
+    - IQKeyboardReturnManager
+    - IQKeyboardToolbar
+    - IQKeyboardToolbarManager
+    - IQTextInputViewNotification
+    - IQTextView
+    - SnapKit
+    - SocketRocket
+    - Toast-Swift
+
+SPEC CHECKSUMS:
+  IQKeyboardCore: 28c8bf3bcd8ba5aa1570b318cbc4da94b861711e
+  IQKeyboardManagerSwift: 835fc9c6e4732398113406d84900ad2e8f141218
+  IQKeyboardNotification: d7382c4466c5a5adef92c7452ebf861b36050088
+  IQKeyboardReturnManager: 972be48528ce9e7508ab3ab15ac7efac803f17f5
+  IQKeyboardToolbar: d4bdccfb78324aec2f3920659c77bb89acd33312
+  IQKeyboardToolbarManager: 6c693c8478d6327a7ef2107528d29698b3514dbb
+  IQTextInputViewNotification: f5e954d8881fd9808b744e49e024cc0d4bcfe572
+  IQTextView: ae13b4922f22e6f027f62c557d9f4f236b19d5c7
+  SnapKit: d612e99e678a2d3b95bf60b0705ed0a35c03484a
+  SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748
+  Toast-Swift: 7a03a532afe3a560d4044bc7c237e2864d295173
+
+PODFILE CHECKSUM: 3b64f91d7c4f6c0036af83b3b1ff330c07d705a8
+
+COCOAPODS: 1.16.2
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Pods.xcodeproj/project.pbxproj b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Pods.xcodeproj/project.pbxproj
new file mode 100644 (file)
index 0000000..e0e2481
--- /dev/null
@@ -0,0 +1,4644 @@
+// !$*UTF8*$!
+{
+       archiveVersion = 1;
+       classes = {
+       };
+       objectVersion = 77;
+       objects = {
+
+/* Begin PBXBuildFile section */
+               01216C042B056FFF0FC7EE32A002C38A /* IQKeyboardCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BFB6F598FCE7D6294584E7334E04ECF2 /* IQKeyboardCore-dummy.m */; };
+               020799C53BF7A383514499A2B455C635 /* IQKeyboardReturnManager-IQKeyboardReturnManager in Resources */ = {isa = PBXBuildFile; fileRef = 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */; };
+               0362BB03F32EC9FB6013DEE29E8E33EF /* SRHTTPConnectMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = ED22317A1312CBBA0134A8E449ABD201 /* SRHTTPConnectMessage.m */; };
+               04986EEC139DC7C45DAB58056315FDC8 /* SRPinningSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = B278701FAF564A3D25B8F87CCDB798D6 /* SRPinningSecurityPolicy.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               05F4664FC4EF89925161A064AA6481BB /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = 936A804D23E5F53A2A38402D624D6EA2 /* IQKeyboardManager+Position.swift */; };
+               064D909CD827405E8DCC309DB1B7775A /* ConstraintLayoutSupportDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = A55BC45618B737DBC6885D98DC8C9C0C /* ConstraintLayoutSupportDSL.swift */; };
+               06B16BF7C2EA99B47539C34FF4150ABF /* Array+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7594A52F0B7E0AD0D9F26BE8026E1E4C /* Array+Sort.swift */; };
+               070601D9903BE1D11DD6DD1367C3F012 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               07543B1010D44AA155CAFADBF03E66DB /* IQKeyboardToolbarManager+Action.swift in Sources */ = {isa = PBXBuildFile; fileRef = 782D18DB9D0B7B74F8613026BAD77E86 /* IQKeyboardToolbarManager+Action.swift */; };
+               075FBDF5D186F8BF4537BC34E526F9DB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               07632D281C5DED61CC7866B079BC9D2C /* SocketRocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 5EF0C08E9D339F2CB75ED0C9E7FA2C0B /* SocketRocket.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               09D303C994021652DF841C463DBD1DC5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               09E1F569A93FAD4B9149E30B9301F44A /* ConstraintPriority.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6058A4E7C2EAB9B01A8DBB5AAD7E72A2 /* ConstraintPriority.swift */; };
+               0B380F6921261E661C9EF26B02E5D634 /* IQKeyboardNotification-IQKeyboardNotification in Resources */ = {isa = PBXBuildFile; fileRef = 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */; };
+               0C7E48CC6391092D8F5B4341E1EE7485 /* Toast-Swift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3D0CA09E0900EA77648A05D608CBA29F /* Toast-Swift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               0CA7A132ABE7018DE9295456732F38BB /* ConstraintAttributes.swift in Sources */ = {isa = PBXBuildFile; fileRef = E293311AF50DC30E5B7F7D2D91BEB28A /* ConstraintAttributes.swift */; };
+               0DE5DB9C6227B3416778D8417DD95EA9 /* ConstraintView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1C674397D453B6D18F9DE46BC55B6FF /* ConstraintView+Extensions.swift */; };
+               0EB83A2AC8AAECEE26C8739477B3A431 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 3649D66694159EF7F40B5A7377AC04D1 /* PrivacyInfo.xcprivacy */; };
+               1194E62AA3F6F506799B1A43B16942B5 /* ConstraintDirectionalInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EE50CC6D98E37DA330EADC9F9C949F0 /* ConstraintDirectionalInsets.swift */; };
+               11A3EB5BE3623EC013AA37B49813E56C /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               1213C5A29D13B6F2E3AE2356CB9F5807 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               154230695B4E3D61B8D2BD02DAA2CE91 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD0C3C29384D3EEBCB4BE346B1CA890 /* IQKeyboardManager+Appearance_Deprecated.swift */; };
+               164062B86FCAFF355EE04D7A23A6EA1C /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 6C4219D35CB16DFEC9A662797E27F4D8 /* PrivacyInfo.xcprivacy */; };
+               172B6B4E5550420B8131FBD62C975821 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D134ED7EB13A9F9FADC82CC86BC10FA /* Toast.swift */; };
+               1A117EC847E321871E40EB39F3576D11 /* SRDelegateController.m in Sources */ = {isa = PBXBuildFile; fileRef = B4BBB6B50C15DFF1221CD8E66DC2D354 /* SRDelegateController.m */; };
+               1A67B4D6FA3F8FB9A1083EF74C966F64 /* UIView+IQKeyboardExtensionDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F565A673CEEF3B818D7A75F2A2EE8B0 /* UIView+IQKeyboardExtensionDeprecated.swift */; };
+               1B5995FCE11B496E4102AC5AD357249A /* IQTextInputViewInfoModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10288C630688257B185941E1EA55E346 /* IQTextInputViewInfoModel.swift */; };
+               1CCB9F1FA415F93E8F4AD0E4692E4BC6 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = C97A233DEE5D1279877CD8292A10AD84 /* PrivacyInfo.xcprivacy */; };
+               205EB01AED14BB574DD54EAFE26E4786 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               20B8C7C05E3AF3032935F30500EF5550 /* SRIOConsumerPool.m in Sources */ = {isa = PBXBuildFile; fileRef = A6C0BF00B3D547B50DBE54D99A1307F4 /* SRIOConsumerPool.m */; };
+               2409EDE57DC13E13E7C7A81E9E2DDD9E /* IQTextView-IQTextView in Resources */ = {isa = PBXBuildFile; fileRef = 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */; };
+               24637C51989929A62E5E75585544A14D /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4B0C5FFB36CB099605387F3B9F34032 /* IQKeyboardManager+Debug.swift */; };
+               24A7645685912B02F96A1291D607DBAA /* UIView+IQKeyboardExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A599D5DDFD46F7296A5F93623AB6C3A /* UIView+IQKeyboardExtensionObjc.swift */; };
+               2A1DE175A760E9F7CF7AF711BF549BC9 /* IQKeyboardReturnManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = DA9BF97689FA8F63852FC5D7EE814D2D /* IQKeyboardReturnManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               2B067825708D13E7E455426389397D1A /* UIView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BDFB64A96CC2B18E25FF662E37821253 /* UIView+IQKeyboardManagerExtension.swift */; };
+               2B2EB369550CE92CEEFCBFD3D32B8A3F /* ConstraintInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92C5C459A1F7BF6872A58A16B7092803 /* ConstraintInsetTarget.swift */; };
+               2B518589AC1F3F54CE14633027E81734 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = BC590BB41230B885D405920A55DAD210 /* PrivacyInfo.xcprivacy */; };
+               2B7184BD487141C385B3CC3F3984AA55 /* SRSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = C33C375328643D5A9A1D1EA02C88D419 /* SRSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               30D6F928FC08B13B5BFEEB154A2089C1 /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 895778DCA58AE753D96DD48F3E036F4F /* IQKeyboardManager.swift */; };
+               310A311043229B0F1C21B72E9FD37271 /* IQKeyboardToolbarManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F992A0DC4578F2D62CB095A497114CC /* IQKeyboardToolbarManager+Debug.swift */; };
+               332EB3263B1002A5A0A146CCE70501AD /* IQRootControllerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 10C547231342B150BEC39F40295D087E /* IQRootControllerConfiguration.swift */; };
+               355A2A3962A82AE25D219DB774CB6AEE /* UIView+ResignObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 12415404E6E70407610188D7ADDC1D02 /* UIView+ResignObjc.swift */; };
+               3577F172FA68CBAE47CFEE6FE25C5404 /* ConstraintOffsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B77F72F31D132841951EF8E4FA67360A /* ConstraintOffsetTarget.swift */; };
+               378BD5280F6C07B11CF30B253D824972 /* IQKeyboardExtended.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0F99DC81F369C1B739E19DE3923C65A /* IQKeyboardExtended.swift */; };
+               37E0B956B90DE65985C993A4DF4D6CA3 /* UIView+Responders.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D19ACC9A79A3CF24DA377E12303E12 /* UIView+Responders.swift */; };
+               380EA4E3E2A772560E3A0670B6406450 /* IQTextInputViewInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9ECC82996747BDD9C0FF35EC1ECF0751 /* IQTextInputViewInfo.swift */; };
+               39B33D7873CD89C6A7E96ACD36A1EDFB /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4EF1258267E4FF8FA1F298C5303B0E86 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */; };
+               3A6B20BEE4F7A5B5835DE5D1E509754E /* IQActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = D63292C39BAA9B9EB776AAA03EABD932 /* IQActiveConfiguration.swift */; };
+               3BB0B5D924BE769E95E64A5E6FC1675D /* NSRunLoop+SRWebSocketPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AE37E30F693ED15CA31B520ED420454 /* NSRunLoop+SRWebSocketPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               3D1D0BFA512309AE63825C811A1BFC81 /* IQInvocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9939F486FEF106F98BDD0806CA8E0624 /* IQInvocation.swift */; };
+               3D3B646B4988314275B40E97BEB16C7F /* ConstraintLayoutGuideDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84BBB0405889161CCDDCD4F166723CBF /* ConstraintLayoutGuideDSL.swift */; };
+               3E715D5BADDEACEEF30D6A4CA82CDA9B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               3F89C7F7F091BA0DFD648E0286E5665D /* IQKeyboardToolbarPlaceholderConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF60B19D2E8B68520E5121EFFF5A7D4B /* IQKeyboardToolbarPlaceholderConfiguration.swift */; };
+               40BB4A23AD4A18E81678F58EAA90EB85 /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F70480B31A6883BEDFC6C623FC76A32 /* UIScrollView+IQKeyboardManagerExtension.swift */; };
+               444E95921E2BDCE7512867EAA1A6B381 /* SRWebSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = D389D10DEC7EB9B503CD45CE58851CA6 /* SRWebSocket.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               44EFA9A76932F81582D03076A8346A4B /* SRIOConsumerPool.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C4CE911087AC8260002E6859821FAF0 /* SRIOConsumerPool.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               47C9A000C20E04EC69BFEEF3C6AC6256 /* IQKeyboardAppearanceManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6381011924A059A30C85325FB30E74A7 /* IQKeyboardAppearanceManager+Internal.swift */; };
+               49D83EC94BF242A406B6553F44E52024 /* IQKeyboardToolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 63CAFAB9111F6F5AAEFD9E00CD0AF892 /* IQKeyboardToolbar.swift */; };
+               49F88DA1CED23ACF70ED0D51D2BCCE4F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = C688B508E11EFC4D24CB920CAF96B948 /* PrivacyInfo.xcprivacy */; };
+               4B2FB381B6E14F9E0F442557ADDAA2F8 /* IQTextInputViewNotification-IQTextInputViewNotification in Resources */ = {isa = PBXBuildFile; fileRef = F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */; };
+               4C1E30BD1A58C10DE84E572ECD5DB54D /* IQKeyboardToolbarManager-IQKeyboardToolbarManager in Resources */ = {isa = PBXBuildFile; fileRef = 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */; };
+               4C26DF4F8D6AC77894F18EC89896258B /* IQKeyboardInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B11EBC98CF5A275C2F8077CDEA1F18 /* IQKeyboardInfo.swift */; };
+               4DC15DC2DF3C4BBA344C86B112C9C68B /* SRWebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 95BCD7B08FF0A2A4F9B0A36B92688E27 /* SRWebSocket.m */; };
+               4E7BB3FBF4B3680AF358C0A0A0F34011 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               4F4DEB687C0E4834A5B291DEE0651D6A /* ConstraintMaker.swift in Sources */ = {isa = PBXBuildFile; fileRef = D4C8C6089794ACE3010224A9FB1D90EA /* ConstraintMaker.swift */; };
+               50ECD138DA8BC1FBBEBFBF3CE5CEB5FF /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 643F1AECE038E1886712C3619E367201 /* PrivacyInfo.xcprivacy */; };
+               548F940AC071FBFD9D8DF209775771E5 /* UIView+IQKeyboardExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9976447B92E50DDDCA64DBDE5A47FD7F /* UIView+IQKeyboardExtension.swift */; };
+               56851E11140A140A15088A41DC4C33BD /* NSURLRequest+SRWebSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 3187DDFEE4C490953B2AEF7B0D19EB1B /* NSURLRequest+SRWebSocket.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               56E30C414ED43846B453D6FDE75DF3B5 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 25BADE0B95009E3B02C9E6EBB47417A3 /* PrivacyInfo.xcprivacy */; };
+               57A34E19799F03EB53206496FD362449 /* SRURLUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 27DA2684B87B3639C3D3D439F177E219 /* SRURLUtilities.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               57C4F6EFB30DDD14E960AC2D6B34F904 /* SnapKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AFBCEC8A83AB63E7D141D4EA274517BA /* SnapKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               5922A6A0AE7152CF436356B3556F1835 /* ConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 080D923BC81BB12EE5B738187A72A0D4 /* ConstraintItem.swift */; };
+               59F34874DA4ABB2F5C4E09EA6865936B /* ConstraintLayoutGuide.swift in Sources */ = {isa = PBXBuildFile; fileRef = D2793937CF93115D3117A82FB873124B /* ConstraintLayoutGuide.swift */; };
+               5B67445AE2F3934BDA08D407BBA3028B /* SocketRocket-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7E46C7EF1F6BD003E0DEC56B05B15DDF /* SocketRocket-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               5BB666D0986483D015712429F9FF2674 /* IQKeyboardReturnManager+UITextViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66E229F790E827392A80B7F4C7A6110F /* IQKeyboardReturnManager+UITextViewDelegate.swift */; };
+               5DFD87881941225F0A5EAE64EB247708 /* SRSIMDHelpers.h in Headers */ = {isa = PBXBuildFile; fileRef = 21E9444EE5839429C60E9A16651BAD78 /* SRSIMDHelpers.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               5E7E257AE5D618E46EF57A5818010F85 /* NSRunLoop+SRWebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FB6A208FD72153F040D4E1354F225B4 /* NSRunLoop+SRWebSocket.m */; };
+               6135798CCD656C1B3A6EA5738A23190A /* SRSIMDHelpers.m in Sources */ = {isa = PBXBuildFile; fileRef = 50A2B3566A43C15186D3A1D9F91DB662 /* SRSIMDHelpers.m */; };
+               61ED64340371AB30B936A019C22C376D /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D8DC22EC08F3E72E7E53ADA12E80CC0 /* UIView+IQKeyboardManagerExtensionObjc.swift */; };
+               62B90C6FC83F91F91A4BF12022C7B050 /* UIView+Parent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F8F3D9A02DBFA1FF9899DD8933A95DA /* UIView+Parent.swift */; };
+               64365C2671D733D3AAE1E25684E73255 /* Pods-Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B05AAE9D91B32B46928A2293611FF4 /* Pods-Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               6464C345447C71904DA3706AACA3F55D /* SRProxyConnect.h in Headers */ = {isa = PBXBuildFile; fileRef = 32080BC56EEB26340C6292BA94F068B6 /* SRProxyConnect.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               64684CAF22CAC1002958805187019FD7 /* IQDeepResponderContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 484ECEC55CB9E98BAF0AE020F8FFF767 /* IQDeepResponderContainerView.swift */; };
+               65ABC841033E6707C3419B304C1DDD50 /* IQKeyboardNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = DA85287A9C3D760A6324EF926C0C44CE /* IQKeyboardNotification-dummy.m */; };
+               65E5693A457A8AEE3E5758075D1E2792 /* SRError.h in Headers */ = {isa = PBXBuildFile; fileRef = E7EE2526E40B99B0F243808A2396A01C /* SRError.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               6645E9FB4265C5712E38055C931E1630 /* NSURLRequest+SRWebSocket.m in Sources */ = {isa = PBXBuildFile; fileRef = ED7286BA89901CA1D622A1FCF81E718C /* NSURLRequest+SRWebSocket.m */; };
+               6735CEF5CEDBE284902139B3ED3F2E73 /* UIView+RespondersObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEAD5B92B7CF2B0746297208D610D3CD /* UIView+RespondersObjc.swift */; };
+               6DE9FD143CBC24075601F8FE2ADC4115 /* IQKeyboardCore-IQKeyboardCore in Resources */ = {isa = PBXBuildFile; fileRef = 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */; };
+               6E39129FC8643A70C276801FEF4C280D /* Constraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47BC329529726FFACA942239310E3841 /* Constraint.swift */; };
+               71311BC21C92A7DE376CAD928E325979 /* IQKeyboardToolbarManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF4BC9A0614A1C63539C14C08655781F /* IQKeyboardToolbarManager+Deprecated.swift */; };
+               7174D48AADABCBE6FC53185C5442B952 /* NSURLRequest+SRWebSocketPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = FA41F5D42C8280BA202FDE26BDBDFFA3 /* NSURLRequest+SRWebSocketPrivate.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               721D0AFDE15FCC46F4579069672719B9 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               737CE5F34A1D2B09DEF3038425A40877 /* IQTextView+Placeholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1F86119EB8AFCE72C0BA2356BBA4C46 /* IQTextView+Placeholderable.swift */; };
+               769B4905AD35AD554AA9DE98DA8E4E11 /* IQKeyboardManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0689F5C192D1672448116583D233922 /* IQKeyboardManager+Deprecated.swift */; };
+               77F1B40C21EFF28350EDA6A12263B098 /* IQKeyboardManager+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = A44F945B3203BCA4B178E49ED53E5391 /* IQKeyboardManager+Appearance.swift */; };
+               782981022BF319DFD85AE89A392639A2 /* SRMutex.h in Headers */ = {isa = PBXBuildFile; fileRef = CEA0C9AAC08B9E0D20DE8BC894AE3FDE /* SRMutex.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               7AF516B98D45391B909D507D0244104C /* ConstraintDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = FF4B96374C0DB9D56AB95C3D5A31B152 /* ConstraintDescription.swift */; };
+               7B0BC17748C9775A8299A96D501CE5A8 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 133A600484839BF74BDD51C8B0BB6EBE /* QuartzCore.framework */; };
+               7BA968278DAB1050E34D0B65E56E5846 /* IQKeyboardToolbar-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 994130CE96E0F8ED28DCF165B03CB200 /* IQKeyboardToolbar-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               7BBD64ADF2DD2B427F258E87F3EDA284 /* IQTitleBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2E8E02D90547D6DBD75A856D8A4E1275 /* IQTitleBarButtonItem.swift */; };
+               7BEAD7E859FB5BFCACD23CE492484CC4 /* IQPlaceholderable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE1B2703C190723870111C925A464468 /* IQPlaceholderable.swift */; };
+               7CBA95E07A492F7311C7DD8EDF0B4172 /* IQScrollViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F6CB0808BEA63D36E484B5D53B6436 /* IQScrollViewConfiguration.swift */; };
+               7D42390CDB4FA147504B03DA2A174A0C /* ConstraintViewDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = C53921D76AE7ECC63293C2263C9325A0 /* ConstraintViewDSL.swift */; };
+               7F30D73D46CAD9D21A25738B11A6DDDA /* SRURLUtilities.m in Sources */ = {isa = PBXBuildFile; fileRef = 390BB9902E7A26E5A753B9CF32673BE9 /* SRURLUtilities.m */; };
+               7FCA9A032C39444BD74F08A5F3927839 /* Pods-Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A6BD2261427B29C50F84843B6BAB7DEA /* Pods-Example-dummy.m */; };
+               809199B64088AA02A6B900316396A83D /* IQKeyboardToolbarManager+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = BA718E8C5B46720F8012D7471BC6BF37 /* IQKeyboardToolbarManager+Toolbar.swift */; };
+               860017D588B23C12B08A3C4390BAEA56 /* IQKeyboardNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 822DD0DAF7E4428BCCDFE28EAD683ADD /* IQKeyboardNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               8667EBBAD4365F7E2DECFE792D488128 /* IQTextView-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 64607CC28651258E6DAB2D1358080FB5 /* IQTextView-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               868A9F524A7985BDA1EA124D9BF4CA63 /* ConstraintDSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFCB22B3ED6C05251CBD3059AAE51013 /* ConstraintDSL.swift */; };
+               86CAB01D950C8BC35EDE0BDC01A2500B /* ConstraintView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A8BBDD1BF37BF58D4C467C1D1F21D462 /* ConstraintView.swift */; };
+               870DC4F98094456228D282F5F6200609 /* IQTextView-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B560A38E28D510B4A50AFF9595D57670 /* IQTextView-dummy.m */; };
+               8762AC084551DBB2E00C3091CAF011ED /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               87E921A1D8B0C683DA2133709C867859 /* Toast-Swift-Toast-Swift in Resources */ = {isa = PBXBuildFile; fileRef = 13FD39576595D8A884BF5166065C5236 /* Toast-Swift-Toast-Swift */; };
+               883EDEE1C699497CF2A77C3B8A32A790 /* ConstraintMultiplierTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 750817E69AAE97D1AF5F958FC5904BF2 /* ConstraintMultiplierTarget.swift */; };
+               89CAC1E5DC5833EE630A652957D253A7 /* SRLog.h in Headers */ = {isa = PBXBuildFile; fileRef = AF5E93556B3B98CA5218F3B9E49304F6 /* SRLog.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               8ACE9296AA479804EFD2D3CC417DE801 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               8BA78192EBB4433C386A932BE198C2AD /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = CF362111EEE4CBA3A09DDC5814422B70 /* PrivacyInfo.xcprivacy */; };
+               8BA91314914C4486DACA16122819AF1C /* IQTextInputViewNotification-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C2878B4F3D509987EC767604F46AD0E1 /* IQTextInputViewNotification-dummy.m */; };
+               8BABA32F7B94A25D8E9208C0A8D90B2E /* ConstraintMakerRelatable+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 529559A67714BC64192FD9BF92B33312 /* ConstraintMakerRelatable+Extensions.swift */; };
+               8C41EA954997897C3E30C5754010C05F /* UIViewController+ParentContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 995B281C84F1083BE4DB31B75BCC029C /* UIViewController+ParentContainer.swift */; };
+               8CBC72065F0261B373B958696985AF99 /* IQKeyboardResignHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 261E9C437FF6FFF72C01BBB73341409D /* IQKeyboardResignHandler.swift */; };
+               8D0D15CE4E92BA4433AE7EA578FE3E15 /* SRSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6839FC9EB46E8CB05E17C35E5A5B579F /* SRSecurityPolicy.m */; };
+               8DC89975CCCA53253DE9DB5646E468FB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               91CA63A8C62222E89FBB8FA2B7FE9CDE /* IQKeyboardManager+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 236C98A9FAEF3200D70937E889092818 /* IQKeyboardManager+Resign.swift */; };
+               92571FFBEF3A7B2F4F633624013010EE /* SRRunLoopThread.m in Sources */ = {isa = PBXBuildFile; fileRef = 8609C41722C0D97335DBF43B1CE7AB03 /* SRRunLoopThread.m */; };
+               9298CB7C2E4AC4E751E535DA15BEEFA8 /* IQKeyboardManagerSwift-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C8BDF6ED7A0F1533FC84E97705B2878 /* IQKeyboardManagerSwift-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               939EE0216FC02064B2F5894E87628182 /* SRRunLoopThread.h in Headers */ = {isa = PBXBuildFile; fileRef = 43CBF3C99F0BF342AEE8D7C7BE945B62 /* SRRunLoopThread.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               95A620A5272057BA126D00CC498F9B8A /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3ED18FF4963E7B4F60DBBA903E25C67B /* Combine.framework */; };
+               975E6903FBA7CF724108613000500E7E /* IQKeyboardNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A14C9A838BD693FFDCAF82F4D5604A /* IQKeyboardNotification.swift */; };
+               992815E207201EE57916809E07ADBD74 /* IQKeyboardToolbarConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC713814A822ABA18A07C72E6B97AE04 /* IQKeyboardToolbarConstants.swift */; };
+               9A3761D8CEFB0E2131D2EFA2DEBB3A99 /* SRRandom.m in Sources */ = {isa = PBXBuildFile; fileRef = 68443C8F28AD901E531D6BFA7559C683 /* SRRandom.m */; };
+               9A3B9C740BC8FE0500132251551E5BE7 /* SRIOConsumer.h in Headers */ = {isa = PBXBuildFile; fileRef = 26FE696F5243F520CB872AC051139FE5 /* SRIOConsumer.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               9CFA943AABBDB657A85AAAF2FB4DED67 /* IQKeyboardToolbarManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C2460EF332DB152D7A7B9869C8F4032 /* IQKeyboardToolbarManager-dummy.m */; };
+               9D22F88B7F1AF054C2BF025DFB767154 /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C61F58870F6E8F6EEF25FA9A6A0E7F60 /* IQKeyboardManager+ToolbarManagerDeprecated.swift */; };
+               9D71239428D38EB9B5E7F5AA51E3E1BB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               9E0045B41BFE697DB4ADE151228024D2 /* SnapKit-SnapKit_Privacy in Resources */ = {isa = PBXBuildFile; fileRef = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */; };
+               A3585531EE4D8466B74A5A6F7958EC79 /* SocketRocket-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B1F45CBD7E407DB108D6FAD8FF0A1415 /* SocketRocket-dummy.m */; };
+               A39FE5F72261B202CC63722A7B357206 /* IQTextInputView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502964DCE1567348B5B03211445AEA35 /* IQTextInputView.swift */; };
+               A564D0B0EE8AED950D943A75C2B3092E /* SRMutex.m in Sources */ = {isa = PBXBuildFile; fileRef = D7EF3525F706753F05EA05BD1819EC4E /* SRMutex.m */; };
+               A6F1EFC3CDA009A4BE6CCBB01248DA21 /* UICollectionView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 115E19C96EB6123FE27F3A530B3BE30D /* UICollectionView+IndexPaths.swift */; };
+               A802B52FE5903601486CB77E2FDCF18B /* IQKeyboardToolbarManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 158193B636D7824993DB68D81AE2C233 /* IQKeyboardToolbarManager+Internal.swift */; };
+               A92367989121B0877023A09BF2F96F15 /* IQKeyboardToolbarManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D8DCDE8A3DFBFEA690BD5A6081C5762 /* IQKeyboardToolbarManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               A983CCA5F6596F030EFCC1E27C1E766E /* UITableView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15B541658FAC5E8233C91001D7888EC /* UITableView+IndexPaths.swift */; };
+               A98E7BF0F63124A6CB7FC2BB19B1DCBE /* IQKeyboardReturnManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 224FAFA7B0169BBAAFD0FA422D7D11A6 /* IQKeyboardReturnManager.swift */; };
+               A9B5C45C3C4D517B581E536DE846A078 /* Toast-Swift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B98BCBD470DE1E0FC19C5E1F3AF37195 /* Toast-Swift-dummy.m */; };
+               AA3E0F99979D1B54EE9DCD8FE01816CF /* IQKeyboardReturnManager+UITextFieldDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB23C93E47AFBF1FA651D132F7AC06E2 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */; };
+               AABEF13464BA7F4621BD94736C1D057C /* ConstraintMakerPrioritizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9101BAF3027E387E34B0301BE000FA50 /* ConstraintMakerPrioritizable.swift */; };
+               AB12501C57FFF722131F674ACB425944 /* SRError.m in Sources */ = {isa = PBXBuildFile; fileRef = 77195404B1F7ADCD8B3008B1B89F5C03 /* SRError.m */; };
+               AC22AD1E1EF9CD9D6E242F3630A9A012 /* IQKeyboardManager+ToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A737607DB763EBB681D8D0F6E6AB5FB /* IQKeyboardManager+ToolbarManager.swift */; };
+               AC68F7636D1D7832E4B5B18DD2BF2941 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               AD9EF3D3778212D1147044DC3A971C80 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               AE224EDB6D044C0FE86B086E950FC2F9 /* Debugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = B8A90925F3434F73BD6A036480A5A473 /* Debugging.swift */; };
+               AEA1A05086EA1256D504393FAED3CF4B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               AF760C78F1C7E11BF7CB9E9B29903530 /* ConstraintInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6DFE571CD6A634198545BB1149A5399C /* ConstraintInsets.swift */; };
+               B0875E3AB8718E7DFE5C53497C02A15E /* ConstraintLayoutSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8D8726D60E6EF3E455768E64432DA57 /* ConstraintLayoutSupport.swift */; };
+               B1990109AA9AF8F57180C17D4A04EF6B /* IQKeyboardToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB176716E9339D1CA456C696313236FE /* IQKeyboardToolbarManager.swift */; };
+               B4C82668A78939FE910FEA0D314F06C1 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 91B24E7C9EB4215BEA2C0A23D3960815 /* Security.framework */; };
+               B543A1E1882CAEA19589891FCE2D17EA /* NSRunLoop+SRWebSocket.h in Headers */ = {isa = PBXBuildFile; fileRef = 306B6BBB2D0B4D417ADD4B82D7D51E82 /* NSRunLoop+SRWebSocket.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               B5C5EBCC5EC278EA704D27FB2D333B22 /* Combine.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3ED18FF4963E7B4F60DBBA903E25C67B /* Combine.framework */; };
+               B7D5043A8EC4C7C38F6C1688ACA93185 /* IQKeyboardReturnManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A8FACB5BCF825223E394FFECCE4AA031 /* IQKeyboardReturnManager-dummy.m */; };
+               B893C0DD5BE32FAE1D6895E1ED392B7A /* SRConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = A284951838ACA1015F31DBE6C5A8D45F /* SRConstants.m */; };
+               B903049E7C1BED7918DAB208754107C7 /* ConstraintMakerFinalizable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24926E8158D8FAD9BE42C760B3154B55 /* ConstraintMakerFinalizable.swift */; };
+               BA2FB695DEB0D179253EEB8DFCE3578B /* SnapKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 02EDA2792EBD3343A7DBC6B427F1F041 /* SnapKit-dummy.m */; };
+               BDA5C7CC91E86448237CF40954FAC5AF /* ConstraintMakerRelatable.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8BFDD7C500F5D6D58D212CB15B52E08 /* ConstraintMakerRelatable.swift */; };
+               BF1AE4D97E813B95C43EA4A298B973D1 /* LayoutConstraint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C0366C8DAD8762352B37EDB4DD62E2E /* LayoutConstraint.swift */; };
+               C07CB3E9A4D1BF00F841E4285629A2B2 /* ConstraintRelatableTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFB853532F59E8A63D1C93202280CEE9 /* ConstraintRelatableTarget.swift */; };
+               C0AD493AE4A8DC8FF960D753D6D971E3 /* IQKeyboardManagerSwift-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 01E23D7305E51271DEFF79A9CADBF926 /* IQKeyboardManagerSwift-dummy.m */; };
+               C14F10B663FE2898EACAB90C202B3F50 /* ConstraintMakerEditable.swift in Sources */ = {isa = PBXBuildFile; fileRef = FB474AD377D72ECDF638D46A73B7D687 /* ConstraintMakerEditable.swift */; };
+               C20ECE96A97688090D5FE186DCF7B5D9 /* IQKeyboardManager+Resign_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC73E02165E26ABFCACC677AF94DD8B /* IQKeyboardManager+Resign_Deprecated.swift */; };
+               C36214D8311B615CDA115276934926DC /* SRRandom.h in Headers */ = {isa = PBXBuildFile; fileRef = D1B2801FD44E489C5B7F202C13D651F2 /* SRRandom.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               C433EA40A4C18AC4714CF6C9BC1172CA /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 0F6A2BF98BD227110E60762E29808CEC /* PrivacyInfo.xcprivacy */; };
+               C4CC8FC7015DCE5912B7607AFB238EFE /* Pods-DeepChordsSdk-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 284AC2E81CAAA90FEA12A250A16B11AB /* Pods-DeepChordsSdk-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               C6A4302ACE006C4E2CDD481287E2916B /* Typealiases.swift in Sources */ = {isa = PBXBuildFile; fileRef = AEF5BBB7C4ACF7C06BBD262B6C1145CE /* Typealiases.swift */; };
+               C6F45595676957ADBEC18EB3F23EAEC4 /* LayoutConstraintItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = DD6C692550BC0661BA84378E58F6BA8A /* LayoutConstraintItem.swift */; };
+               C749F0EFAF3D6CAE7C3C0B198665DFA5 /* IQTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1E2BADF249E4A558D7EE5BB1077C1DE1 /* IQTextView.swift */; };
+               C7C6F1AD0C44C79C4A3416FCB32B0233 /* IQKeyboardResignHandler+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = E39AF10B1F50FF70721677FFF69BED27 /* IQKeyboardResignHandler+Internal.swift */; };
+               C92D93F48E74B79C08A2C5B81B68FD7D /* SRConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A3DB74B2C40BCD9F3AFA585DA322FF5 /* SRConstants.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               C945CB4EC42271D435BF23E7749BE6BF /* IQKeyboardConstants.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBC1F980FADF5CA26AF9C77CF3D9B1A2 /* IQKeyboardConstants.swift */; };
+               CA547E1928ADED547C368A3AB7CE9267 /* IQBarButtonItemConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A61C146CFCDB5CEC8508DC60360819 /* IQBarButtonItemConfiguration.swift */; };
+               CE593943A9E7CF83822CF60304BCAD43 /* ConstraintConstantTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = C23ABFD4CEF6F11C0094E61729745DE3 /* ConstraintConstantTarget.swift */; };
+               CF6554D8A9380CAC0F51D5043769D930 /* SRLog.m in Sources */ = {isa = PBXBuildFile; fileRef = F930ACB6AC5D06295D698ED0249EB0AB /* SRLog.m */; };
+               D25185C12789EA624C8BAC6A6432E77B /* SRPinningSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AF7DA075D6BD7E141707379E62BFA63 /* SRPinningSecurityPolicy.m */; };
+               D2E460754683003AE9ECF32A831D401F /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C917A6291C02472ECB91FD7B8B2CFC1 /* CFNetwork.framework */; };
+               D4218DA55B2BA45937589200CC0DF1FB /* ConstraintMakerExtendable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37445197B6E56B3F3CA861A7F21F1C41 /* ConstraintMakerExtendable.swift */; };
+               D623A6CB33709C4D87766C66A756A0F7 /* SRProxyConnect.m in Sources */ = {isa = PBXBuildFile; fileRef = C3F49C31FFD05F4734B464D5C31979FB /* SRProxyConnect.m */; };
+               D6B15F2F110BC58F7635A9FD7A985C79 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 792548D571F70D8E7FA3B52FA58D9591 /* IQKeyboardManager+ActiveConfiguration.swift */; };
+               D6EFA9EAA562143F338EB164836B7837 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               DBA4803F4765E1650B8C6841157F5D73 /* ConstraintPriorityTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = B932A928D72C73FB59FC964A82AC2723 /* ConstraintPriorityTarget.swift */; };
+               DD4291CF0D9971BFED1BD55FB65ACA32 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = E3B1CECC33970571F4F9AF61CB1D3DCD /* PrivacyInfo.xcprivacy */; };
+               DEEC14319D7619F96C4E93415A6D577D /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               DF011D18EBB28ECE459B6D96D3E460D8 /* SRHTTPConnectMessage.h in Headers */ = {isa = PBXBuildFile; fileRef = FB26ACEBA0181227271430FB01A76848 /* SRHTTPConnectMessage.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               E1734E56DB48E6F238408C9A232C7051 /* UIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = A368339039F84E09260E0C59DD294DF3 /* UIView+Hierarchy.swift */; };
+               E3535804CAC5D872E37CD8639C930771 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               E37671A03B4C17A1CF3766A6125833BB /* ConstraintDirectionalInsetTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E0237741E33CAFB3DB96DAA7559910 /* ConstraintDirectionalInsetTarget.swift */; };
+               E3D779DEE753C0B0D33BA8E73A980265 /* ConstraintLayoutGuide+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45E554E7AE314B29D9C07A10667261BE /* ConstraintLayoutGuide+Extensions.swift */; };
+               E4A0C00A361F30B7848B8AE7653C9C60 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3A92BC97913B825589680C917211C138 /* UIKit.framework */; };
+               E4A29F8C3ED424A7BC912DB796D03AFB /* UIView+ParentObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8BD0BDF557D8D8D7CFB04CB9C9482634 /* UIView+ParentObjc.swift */; };
+               E51720E5CBEEB2151A69D4FDF36B7E2D /* IQKeyboardToolbar-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 48CA3ADFB16E0C4E235D89C552572332 /* IQKeyboardToolbar-dummy.m */; };
+               E6FE2596512201193E95FC356C6E3351 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift in Resources */ = {isa = PBXBuildFile; fileRef = 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */; };
+               E84C30FA4A382D9C330E87FB32C009AE /* IQKeyboardAppearanceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = E25ABD3C4935A40132346F656CA1AA7C /* IQKeyboardAppearanceManager.swift */; };
+               EB3BCE9B36BF814DA3069FA077168301 /* SRHash.m in Sources */ = {isa = PBXBuildFile; fileRef = 109E37988FF06586D32321CEA99162B0 /* SRHash.m */; };
+               EBDF215E376C3DF934F05D201833DDDC /* IQTextInputViewNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0578E47B5AE5713CF21EA86848CA87DD /* IQTextInputViewNotification.swift */; };
+               EBF34312A1F64FE81987440230E5BC49 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92A13F8C77041A7711D1764A76C37A3 /* IQKeyboardManager+Internal.swift */; };
+               EC8DB2CC9791B7DC686DCC78EFBB56C5 /* SRDelegateController.h in Headers */ = {isa = PBXBuildFile; fileRef = 2582EC469D9940C7AAE3F903A495E86A /* SRDelegateController.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               ECC5C2ADC2682F9171FEA22AF10DCE53 /* ConstraintRelation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 363F0A017C453E3DC084A7B5BDB87911 /* ConstraintRelation.swift */; };
+               F020DBD67EA8E12A860BE211F6BE04D5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */; };
+               F1E1B1AC67AA1B21E1AF8D3AB5C9849C /* IQTextInputViewNotification-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = EA467055B207002F9B70E96F08A0FF86 /* IQTextInputViewNotification-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               F312D740135121FC4C7D0EB4A5F76F90 /* IQKeyboardToolbarConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44AFC022F6D6DD0DF30E10F9B7C4615A /* IQKeyboardToolbarConfiguration.swift */; };
+               F3D41915714BC875B1DC32F49293A8B6 /* Pods-DeepChordsSdk-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D5278EBCB01A333274C163B9281DE38B /* Pods-DeepChordsSdk-dummy.m */; };
+               F4B260EE81F1B5801FC6DA3097F2E433 /* IQBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4D6EF89B651DCBED1F5A7FA5D36D1FA6 /* IQBarButtonItem.swift */; };
+               F5F31138D70F9AEBD476D8AE418F37F9 /* IQKeyboardToolbar-IQKeyboardToolbar in Resources */ = {isa = PBXBuildFile; fileRef = A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */; };
+               F6E948E2688CC08D3843DAA74F6328E8 /* SRHash.h in Headers */ = {isa = PBXBuildFile; fileRef = F2183FF2315FBF68B5F334EC6EB19A9B /* SRHash.h */; settings = {ATTRIBUTES = (Project, ); }; };
+               F6F33E8B268F3D41075374D95B8088DC /* UILayoutSupport+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E54219744D41CC6C6674908699602DD9 /* UILayoutSupport+Extensions.swift */; };
+               F9EBA65892D78A31C068D727D84BCB88 /* ConstraintConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 972CC8A48122693582F02385A70853A0 /* ConstraintConfig.swift */; };
+               FCFC8D5B48F3DC4BC8942320631D8C1B /* SRIOConsumer.m in Sources */ = {isa = PBXBuildFile; fileRef = B5D1545C4C0C2474FD103EFECB90E9C5 /* SRIOConsumer.m */; };
+               FD552610731EB624F8A47C3ACA927A15 /* UIView+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = B704D82F61A7F3E0FF10EBDE953E7E49 /* UIView+Resign.swift */; };
+               FE0D3260BF27D388B0200F1AC8151619 /* IQKeyboardCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9F657D2C1582A8BFEADD06E527D796B2 /* IQKeyboardCore-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; };
+               FF020D50D3B0742EFED9C172269D9D83 /* IQKeyboardAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = EF4B79F3BC3201907DE2B7A2671776C1 /* IQKeyboardAppearanceConfiguration.swift */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+               186EFCD32F2BEEE1514385E97F48B014 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5;
+                       remoteInfo = IQKeyboardToolbarManager;
+               };
+               1CC338AE066CE11E9D4C832A727D9C61 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = EEE261386011CDF271BE289F73FF5959;
+                       remoteInfo = "IQKeyboardCore-IQKeyboardCore";
+               };
+               1E3FD4E83C3BACBC0EE2DD7F457AA6E9 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69;
+                       remoteInfo = IQTextView;
+               };
+               2DE1780C07830F70EB974DDA0E002280 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = B490E7485944099E16C9CBD79119D1D4;
+                       remoteInfo = IQKeyboardManagerSwift;
+               };
+               32B49C1963D38D5E1E60E037311DCDEF /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054;
+                       remoteInfo = IQKeyboardReturnManager;
+               };
+               4294839685D9EA7EF6090113DB9528A3 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 8A8DB685241263AFDF5E6B20FE67B93A;
+                       remoteInfo = "SnapKit-SnapKit_Privacy";
+               };
+               43A509886BF66DE03AA2357743AC5769 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 12890DE3ABBC2CA295E108358D85EE69;
+                       remoteInfo = IQTextView;
+               };
+               4BEE988A3465649375AC57D797ABF617 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+                       remoteInfo = IQTextInputViewNotification;
+               };
+               548AF3FE70CC81B2ABBAEF65818BA3A6 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = B990BD87169C76A3ED3FE8A9258D91A3;
+                       remoteInfo = "Toast-Swift";
+               };
+               57A1C5DB51B6CD350C79C7B055A7F66B /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = C344E85893FCDEE5B70436E0A4A3472B;
+                       remoteInfo = "Toast-Swift-Toast-Swift";
+               };
+               6130D9140D152F57AA543D42CA625298 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+                       remoteInfo = IQKeyboardToolbar;
+               };
+               64F6091A60F53F5A90BEE2C59126E133 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 2B8FF445A5162845FAB9EC00FC92B694;
+                       remoteInfo = "IQKeyboardNotification-IQKeyboardNotification";
+               };
+               6795B29B74A0DFB983C8C121DAC73B8F /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990;
+                       remoteInfo = IQKeyboardNotification;
+               };
+               6C9C732B28DF0513A21CE6E248F89072 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+                       remoteInfo = IQTextInputViewNotification;
+               };
+               7C1DC3C44CB9ED8404023CBE11C3A841 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 1948D0B63D2CF6A48E18B0B292BC6091;
+                       remoteInfo = SocketRocket;
+               };
+               7D69ABF84486EAFB55FB87BC9B44D3F6 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+                       remoteInfo = IQKeyboardToolbar;
+               };
+               8031384E87ED727FE68F4242803FF742 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 0981F89DB5DA3FFCFFEBDE1F56287054;
+                       remoteInfo = IQKeyboardReturnManager;
+               };
+               8581EB306F93FE5BF5504824295F3722 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = B247F77A0CD5E19C8187A9BA1EB58C09;
+                       remoteInfo = "IQKeyboardToolbar-IQKeyboardToolbar";
+               };
+               925132ADAAA2012B51EAE2C13D1BD31F /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+                       remoteInfo = IQKeyboardCore;
+               };
+               92C92FF2930D007DABF544DC7AC08060 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 19622742EBA51E823D6DAE3F8CDBFAD4;
+                       remoteInfo = SnapKit;
+               };
+               94872272C37CF76A4C27D08B5EC60D6D /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+                       remoteInfo = IQKeyboardCore;
+               };
+               9A200DA2E207287B114783961A389F97 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E;
+                       remoteInfo = "IQKeyboardManagerSwift-IQKeyboardManagerSwift";
+               };
+               9D53E47458385470A91D7295E48E0FD6 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = F4FE17428FD0E607723A44F17231B7A1;
+                       remoteInfo = IQKeyboardToolbar;
+               };
+               A24EA8C0FD67224523A2A8049A529730 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = A26E6FD851C20D652B2755C1464A9990;
+                       remoteInfo = IQKeyboardNotification;
+               };
+               BACED4BB4D08C0B382C214709ABE6A91 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 1948D0B63D2CF6A48E18B0B292BC6091;
+                       remoteInfo = SocketRocket;
+               };
+               C7AFFBB48EEA1AF602657886DA4FE905 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 88810798DA63A2F6611B0970EA276DEC;
+                       remoteInfo = "IQKeyboardReturnManager-IQKeyboardReturnManager";
+               };
+               C96EFF1386F982C542C2B03977A6FFD6 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+                       remoteInfo = IQKeyboardCore;
+               };
+               D0E89F4255608F3B229AA3E8DFD93CF9 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 4502C7427440BEB17A50C0BF6E638A85;
+                       remoteInfo = "IQTextInputViewNotification-IQTextInputViewNotification";
+               };
+               D3993F1F1D303ACFD97829D6D9115BA0 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 020993F16DA5986DACE118349EBCE9E5;
+                       remoteInfo = IQKeyboardToolbarManager;
+               };
+               D3C8D19228BDBCB03280ABF945D775BA /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = F9A1BF709B7BA4C24A83664EB1E1C7D4;
+                       remoteInfo = IQKeyboardCore;
+               };
+               D7076AE16282F5B2F87DAD903E05C6C4 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 283C1F2EA88CD4413165801A6748A48E;
+                       remoteInfo = IQTextInputViewNotification;
+               };
+               D72B40330912494BEDC722CCB167FF77 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 7C5613175BBC4BF67E36DB4FBEBC01D0;
+                       remoteInfo = "IQKeyboardToolbarManager-IQKeyboardToolbarManager";
+               };
+               F68560EF2AF1432CDC4EDEE224F0B10F /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = A6602BCAA6F4F932A586C41D0B7E019C;
+                       remoteInfo = "IQTextView-IQTextView";
+               };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+               01E23D7305E51271DEFF79A9CADBF926 /* IQKeyboardManagerSwift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManagerSwift-dummy.m"; sourceTree = "<group>"; };
+               02E139B151EDFA1F4F63EA119D2269C7 /* Toast-Swift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Toast-Swift.debug.xcconfig"; sourceTree = "<group>"; };
+               02EDA2792EBD3343A7DBC6B427F1F041 /* SnapKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapKit-dummy.m"; sourceTree = "<group>"; };
+               0578E47B5AE5713CF21EA86848CA87DD /* IQTextInputViewNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewNotification.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewNotification.swift; sourceTree = "<group>"; };
+               06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextInputViewNotification; path = IQTextInputViewNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               06FEEB0FA2AA89DF42A1C6525F644FBF /* Pods-DeepChordsSdk */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-DeepChordsSdk"; path = Pods_DeepChordsSdk.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               07FD04B2D25C4767E2AACE039E3E77A8 /* IQTextInputViewNotification.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQTextInputViewNotification.modulemap; sourceTree = "<group>"; };
+               080D923BC81BB12EE5B738187A72A0D4 /* ConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintItem.swift; path = Sources/ConstraintItem.swift; sourceTree = "<group>"; };
+               0A8C10276B315358D1F985B8F641683A /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist"; sourceTree = "<group>"; };
+               0AE37E30F693ED15CA31B520ED420454 /* NSRunLoop+SRWebSocketPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSRunLoop+SRWebSocketPrivate.h"; path = "SocketRocket/Internal/NSRunLoop+SRWebSocketPrivate.h"; sourceTree = "<group>"; };
+               0AF7DA075D6BD7E141707379E62BFA63 /* SRPinningSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRPinningSecurityPolicy.m; path = SocketRocket/Internal/Security/SRPinningSecurityPolicy.m; sourceTree = "<group>"; };
+               0C917A6291C02472ECB91FD7B8B2CFC1 /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/CFNetwork.framework; sourceTree = DEVELOPER_DIR; };
+               0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQTextView; path = IQTextView.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               0EE50CC6D98E37DA330EADC9F9C949F0 /* ConstraintDirectionalInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsets.swift; path = Sources/ConstraintDirectionalInsets.swift; sourceTree = "<group>"; };
+               0F6A2BF98BD227110E60762E29808CEC /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQTextView/Assets/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               10288C630688257B185941E1EA55E346 /* IQTextInputViewInfoModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewInfoModel.swift; path = IQKeyboardReturnManager/Classes/IQTextInputViewInfoModel.swift; sourceTree = "<group>"; };
+               109E37988FF06586D32321CEA99162B0 /* SRHash.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRHash.m; path = SocketRocket/Internal/Utilities/SRHash.m; sourceTree = "<group>"; };
+               10C547231342B150BEC39F40295D087E /* IQRootControllerConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQRootControllerConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift; sourceTree = "<group>"; };
+               10CAAD795A45AB49A0EE4D6805AB7A1F /* SocketRocket.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SocketRocket.release.xcconfig; sourceTree = "<group>"; };
+               110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardReturnManager-IQKeyboardReturnManager"; path = IQKeyboardReturnManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               115E19C96EB6123FE27F3A530B3BE30D /* UICollectionView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UICollectionView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift"; sourceTree = "<group>"; };
+               120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardNotification-IQKeyboardNotification"; path = IQKeyboardNotification.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               12415404E6E70407610188D7ADDC1D02 /* UIView+ResignObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+ResignObjc.swift"; path = "IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+ResignObjc.swift"; sourceTree = "<group>"; };
+               133A600484839BF74BDD51C8B0BB6EBE /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
+               13FD39576595D8A884BF5166065C5236 /* Toast-Swift-Toast-Swift */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "Toast-Swift-Toast-Swift"; path = "Toast-Swift.bundle"; sourceTree = BUILT_PRODUCTS_DIR; };
+               14A61C146CFCDB5CEC8508DC60360819 /* IQBarButtonItemConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItemConfiguration.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItemConfiguration.swift; sourceTree = "<group>"; };
+               1515EB933E55F8DF1275984150311F6F /* IQTextInputViewNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextInputViewNotification.release.xcconfig; sourceTree = "<group>"; };
+               158193B636D7824993DB68D81AE2C233 /* IQKeyboardToolbarManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Internal.swift"; path = "IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Internal.swift"; sourceTree = "<group>"; };
+               15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardReturnManager; path = IQKeyboardReturnManager.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               159C74980AC55D136945F073F6CEDC14 /* IQKeyboardToolbar.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbar.debug.xcconfig; sourceTree = "<group>"; };
+               15FF3E312676449AB12DADDDB8D5C352 /* IQKeyboardNotification.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardNotification.modulemap; sourceTree = "<group>"; };
+               170AE4D919026EA3D1FB264423443921 /* IQTextView-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextView-prefix.pch"; sourceTree = "<group>"; };
+               1917E3D591E530CFE1940C6F4E878690 /* Pods-DeepChordsSdk-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-DeepChordsSdk-Info.plist"; sourceTree = "<group>"; };
+               1AB8D5FD6175CD8FCC7153B71E6DD77A /* IQKeyboardNotification.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardNotification.release.xcconfig; sourceTree = "<group>"; };
+               1D8DCDE8A3DFBFEA690BD5A6081C5762 /* IQKeyboardToolbarManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-umbrella.h"; sourceTree = "<group>"; };
+               1E2BADF249E4A558D7EE5BB1077C1DE1 /* IQTextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextView.swift; path = IQTextView/Classes/IQTextView.swift; sourceTree = "<group>"; };
+               1EEC9E9674D2F2735A1237FEC96C44CB /* IQKeyboardReturnManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardReturnManager.modulemap; sourceTree = "<group>"; };
+               1F667CC0E19EAF34E5A4119E2121F585 /* Pods-Example */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-Example"; path = Pods_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               21E9444EE5839429C60E9A16651BAD78 /* SRSIMDHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRSIMDHelpers.h; path = SocketRocket/Internal/Utilities/SRSIMDHelpers.h; sourceTree = "<group>"; };
+               224FAFA7B0169BBAAFD0FA422D7D11A6 /* IQKeyboardReturnManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardReturnManager.swift; path = IQKeyboardReturnManager/Classes/IQKeyboardReturnManager.swift; sourceTree = "<group>"; };
+               236C98A9FAEF3200D70937E889092818 /* IQKeyboardManager+Resign.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Resign.swift"; path = "IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift"; sourceTree = "<group>"; };
+               24926E8158D8FAD9BE42C760B3154B55 /* ConstraintMakerFinalizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerFinalizable.swift; path = Sources/ConstraintMakerFinalizable.swift; sourceTree = "<group>"; };
+               2582EC469D9940C7AAE3F903A495E86A /* SRDelegateController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRDelegateController.h; path = SocketRocket/Internal/Delegate/SRDelegateController.h; sourceTree = "<group>"; };
+               25BADE0B95009E3B02C9E6EBB47417A3 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardNotification/Assets/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               261E9C437FF6FFF72C01BBB73341409D /* IQKeyboardResignHandler.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardResignHandler.swift; path = IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift; sourceTree = "<group>"; };
+               26FE696F5243F520CB872AC051139FE5 /* SRIOConsumer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRIOConsumer.h; path = SocketRocket/Internal/IOConsumer/SRIOConsumer.h; sourceTree = "<group>"; };
+               27296D8B66561FF21E0EB354428156C7 /* IQKeyboardNotification-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardNotification-prefix.pch"; sourceTree = "<group>"; };
+               27DA2684B87B3639C3D3D439F177E219 /* SRURLUtilities.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRURLUtilities.h; path = SocketRocket/Internal/Utilities/SRURLUtilities.h; sourceTree = "<group>"; };
+               284AC2E81CAAA90FEA12A250A16B11AB /* Pods-DeepChordsSdk-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-DeepChordsSdk-umbrella.h"; sourceTree = "<group>"; };
+               2C45BE81EF6A9A12E115F2EDB69FC7D7 /* Pods-Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Example-acknowledgements.markdown"; sourceTree = "<group>"; };
+               2E8E02D90547D6DBD75A856D8A4E1275 /* IQTitleBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTitleBarButtonItem.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQTitleBarButtonItem.swift; sourceTree = "<group>"; };
+               2EFB802792096CDDF8FD170084E303BC /* ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist"; sourceTree = "<group>"; };
+               306B6BBB2D0B4D417ADD4B82D7D51E82 /* NSRunLoop+SRWebSocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSRunLoop+SRWebSocket.h"; path = "SocketRocket/NSRunLoop+SRWebSocket.h"; sourceTree = "<group>"; };
+               3187DDFEE4C490953B2AEF7B0D19EB1B /* NSURLRequest+SRWebSocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURLRequest+SRWebSocket.h"; path = "SocketRocket/NSURLRequest+SRWebSocket.h"; sourceTree = "<group>"; };
+               319AC1D7C71149C2DD5EF02DECE3F511 /* SnapKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.debug.xcconfig; sourceTree = "<group>"; };
+               32080BC56EEB26340C6292BA94F068B6 /* SRProxyConnect.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRProxyConnect.h; path = SocketRocket/Internal/Proxy/SRProxyConnect.h; sourceTree = "<group>"; };
+               32B4B8845C7824A1AB6C42EB0B32845E /* ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist"; sourceTree = "<group>"; };
+               363F0A017C453E3DC084A7B5BDB87911 /* ConstraintRelation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelation.swift; path = Sources/ConstraintRelation.swift; sourceTree = "<group>"; };
+               3649D66694159EF7F40B5A7377AC04D1 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardToolbarManager/Assets/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               3725B14D6A408FA007F106F8CA983CE3 /* Pods-DeepChordsSdk-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-DeepChordsSdk-acknowledgements.markdown"; sourceTree = "<group>"; };
+               37445197B6E56B3F3CA861A7F21F1C41 /* ConstraintMakerExtendable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerExtendable.swift; path = Sources/ConstraintMakerExtendable.swift; sourceTree = "<group>"; };
+               390BB9902E7A26E5A753B9CF32673BE9 /* SRURLUtilities.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRURLUtilities.m; path = SocketRocket/Internal/Utilities/SRURLUtilities.m; sourceTree = "<group>"; };
+               39B4B067040847EC4A5CE870C4E0C5A1 /* IQKeyboardToolbarManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardToolbarManager-Info.plist"; sourceTree = "<group>"; };
+               3A92BC97913B825589680C917211C138 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
+               3D0CA09E0900EA77648A05D608CBA29F /* Toast-Swift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-umbrella.h"; sourceTree = "<group>"; };
+               3D8DC22EC08F3E72E7E53ADA12E80CC0 /* UIView+IQKeyboardManagerExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardManagerExtensionObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift"; sourceTree = "<group>"; };
+               3ECA1919991B8674C3FD3253CD02BE4B /* IQTextInputViewNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQTextInputViewNotification-Info.plist"; sourceTree = "<group>"; };
+               3ED18FF4963E7B4F60DBBA903E25C67B /* Combine.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Combine.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Combine.framework; sourceTree = DEVELOPER_DIR; };
+               3F70480B31A6883BEDFC6C623FC76A32 /* UIScrollView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+IQKeyboardManagerExtension.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift"; sourceTree = "<group>"; };
+               3F8F3D9A02DBFA1FF9899DD8933A95DA /* UIView+Parent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Parent.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift"; sourceTree = "<group>"; };
+               3F992A0DC4578F2D62CB095A497114CC /* IQKeyboardToolbarManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Debug.swift"; path = "IQKeyboardToolbarManager/Classes/Debug/IQKeyboardToolbarManager+Debug.swift"; sourceTree = "<group>"; };
+               42E3FC1A9F2FBB9AE28FDE3285B70F2C /* IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardCore-Info.plist"; sourceTree = "<group>"; };
+               43CBF3C99F0BF342AEE8D7C7BE945B62 /* SRRunLoopThread.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRRunLoopThread.h; path = SocketRocket/Internal/RunLoop/SRRunLoopThread.h; sourceTree = "<group>"; };
+               44AFC022F6D6DD0DF30E10F9B7C4615A /* IQKeyboardToolbarConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarConfiguration.swift; path = IQKeyboardToolbarManager/Classes/Configuration/IQKeyboardToolbarConfiguration.swift; sourceTree = "<group>"; };
+               455A2446E1A8F92123FBE90A1D4B8D0B /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.debug.xcconfig"; sourceTree = "<group>"; };
+               45E554E7AE314B29D9C07A10667261BE /* ConstraintLayoutGuide+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintLayoutGuide+Extensions.swift"; path = "Sources/ConstraintLayoutGuide+Extensions.swift"; sourceTree = "<group>"; };
+               47BC329529726FFACA942239310E3841 /* Constraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Constraint.swift; path = Sources/Constraint.swift; sourceTree = "<group>"; };
+               47F6CB0808BEA63D36E484B5D53B6436 /* IQScrollViewConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQScrollViewConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift; sourceTree = "<group>"; };
+               484ECEC55CB9E98BAF0AE020F8FFF767 /* IQDeepResponderContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQDeepResponderContainerView.swift; path = IQKeyboardToolbarManager/Classes/IQDeepResponderContainerView.swift; sourceTree = "<group>"; };
+               48CA3ADFB16E0C4E235D89C552572332 /* IQKeyboardToolbar-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardToolbar-dummy.m"; sourceTree = "<group>"; };
+               4AB6723E60A4A0D494C4DCA4686CD3F0 /* IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManagerSwift-Info.plist"; sourceTree = "<group>"; };
+               4B6ABE8E0C199299C26E4B5977886B71 /* SnapKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapKit.release.xcconfig; sourceTree = "<group>"; };
+               4BF6C697C2EB03CCBCE9CA841EA31F47 /* Pods-DeepChordsSdk.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DeepChordsSdk.debug.xcconfig"; sourceTree = "<group>"; };
+               4D6EF89B651DCBED1F5A7FA5D36D1FA6 /* IQBarButtonItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQBarButtonItem.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQBarButtonItem.swift; sourceTree = "<group>"; };
+               4EF1258267E4FF8FA1F298C5303B0E86 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIScrollView+IQKeyboardManagerExtensionObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift"; sourceTree = "<group>"; };
+               4F8CA916A31362AD762A33A32B0D936C /* ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist"; sourceTree = "<group>"; };
+               4FB988C66900BB1BEEF5C5CA21B14AC9 /* IQTextView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQTextView-Info.plist"; sourceTree = "<group>"; };
+               502964DCE1567348B5B03211445AEA35 /* IQTextInputView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputView.swift; path = IQKeyboardCore/Classes/IQTextInputView.swift; sourceTree = "<group>"; };
+               5084335EF29A15EB6C31DFB1ACA15349 /* IQKeyboardManagerSwift.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.debug.xcconfig; sourceTree = "<group>"; };
+               50A2B3566A43C15186D3A1D9F91DB662 /* SRSIMDHelpers.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRSIMDHelpers.m; path = SocketRocket/Internal/Utilities/SRSIMDHelpers.m; sourceTree = "<group>"; };
+               529559A67714BC64192FD9BF92B33312 /* ConstraintMakerRelatable+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintMakerRelatable+Extensions.swift"; path = "Sources/ConstraintMakerRelatable+Extensions.swift"; sourceTree = "<group>"; };
+               58E0237741E33CAFB3DB96DAA7559910 /* ConstraintDirectionalInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDirectionalInsetTarget.swift; path = Sources/ConstraintDirectionalInsetTarget.swift; sourceTree = "<group>"; };
+               5AF0EBE9A79115D36EF40E456919D63B /* IQKeyboardManagerSwift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManagerSwift.release.xcconfig; sourceTree = "<group>"; };
+               5C0366C8DAD8762352B37EDB4DD62E2E /* LayoutConstraint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraint.swift; path = Sources/LayoutConstraint.swift; sourceTree = "<group>"; };
+               5C8BDF6ED7A0F1533FC84E97705B2878 /* IQKeyboardManagerSwift-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-umbrella.h"; sourceTree = "<group>"; };
+               5EF0C08E9D339F2CB75ED0C9E7FA2C0B /* SocketRocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SocketRocket.h; path = SocketRocket/SocketRocket.h; sourceTree = "<group>"; };
+               5FB6A208FD72153F040D4E1354F225B4 /* NSRunLoop+SRWebSocket.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSRunLoop+SRWebSocket.m"; path = "SocketRocket/NSRunLoop+SRWebSocket.m"; sourceTree = "<group>"; };
+               6058A4E7C2EAB9B01A8DBB5AAD7E72A2 /* ConstraintPriority.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriority.swift; path = Sources/ConstraintPriority.swift; sourceTree = "<group>"; };
+               61AD3899C2D649897E11DA65A33ABCEE /* Toast-Swift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Toast-Swift-prefix.pch"; sourceTree = "<group>"; };
+               6381011924A059A30C85325FB30E74A7 /* IQKeyboardAppearanceManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardAppearanceManager+Internal.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift"; sourceTree = "<group>"; };
+               63CAFAB9111F6F5AAEFD9E00CD0AF892 /* IQKeyboardToolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbar.swift; path = IQKeyboardToolbar/Classes/IQKeyboardToolbar.swift; sourceTree = "<group>"; };
+               643F1AECE038E1886712C3619E367201 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardManagerSwift/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               64607CC28651258E6DAB2D1358080FB5 /* IQTextView-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextView-umbrella.h"; sourceTree = "<group>"; };
+               66E229F790E827392A80B7F4C7A6110F /* IQKeyboardReturnManager+UITextViewDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnManager+UITextViewDelegate.swift"; path = "IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextViewDelegate.swift"; sourceTree = "<group>"; };
+               67B06A63B2F6FDD332A5D14963BFC3E3 /* IQKeyboardReturnManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardReturnManager-Info.plist"; sourceTree = "<group>"; };
+               6839FC9EB46E8CB05E17C35E5A5B579F /* SRSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRSecurityPolicy.m; path = SocketRocket/SRSecurityPolicy.m; sourceTree = "<group>"; };
+               68443C8F28AD901E531D6BFA7559C683 /* SRRandom.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRRandom.m; path = SocketRocket/Internal/Utilities/SRRandom.m; sourceTree = "<group>"; };
+               6937B145AC462041831CC9D76D3CF28A /* SnapKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-prefix.pch"; sourceTree = "<group>"; };
+               6A3DB74B2C40BCD9F3AFA585DA322FF5 /* SRConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRConstants.h; path = SocketRocket/Internal/SRConstants.h; sourceTree = "<group>"; };
+               6A599D5DDFD46F7296A5F93623AB6C3A /* UIView+IQKeyboardExtensionObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtensionObjc.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionObjc.swift"; sourceTree = "<group>"; };
+               6A737607DB763EBB681D8D0F6E6AB5FB /* IQKeyboardManager+ToolbarManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarManager.swift"; path = "IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift"; sourceTree = "<group>"; };
+               6C4219D35CB16DFEC9A662797E27F4D8 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardCore/Assets/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               6D134ED7EB13A9F9FADC82CC86BC10FA /* Toast.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Toast.swift; path = Toast/Toast.swift; sourceTree = "<group>"; };
+               6DFE571CD6A634198545BB1149A5399C /* ConstraintInsets.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsets.swift; path = Sources/ConstraintInsets.swift; sourceTree = "<group>"; };
+               6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardCore-IQKeyboardCore"; path = IQKeyboardCore.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               6EC73E02165E26ABFCACC677AF94DD8B /* IQKeyboardManager+Resign_Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Resign_Deprecated.swift"; path = "IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift"; sourceTree = "<group>"; };
+               6F879A10A3809420736A229A9720D75A /* IQKeyboardReturnManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardReturnManager-prefix.pch"; sourceTree = "<group>"; };
+               73D26C4F196C661EA1DB04BCC2471A24 /* Pods-Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Example-frameworks.sh"; sourceTree = "<group>"; };
+               750817E69AAE97D1AF5F958FC5904BF2 /* ConstraintMultiplierTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMultiplierTarget.swift; path = Sources/ConstraintMultiplierTarget.swift; sourceTree = "<group>"; };
+               7594A52F0B7E0AD0D9F26BE8026E1E4C /* Array+Sort.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Array+Sort.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/Array+Sort.swift"; sourceTree = "<group>"; };
+               761B4D8A688672EC9D13AB178F184A16 /* IQKeyboardToolbar.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardToolbar.modulemap; sourceTree = "<group>"; };
+               77195404B1F7ADCD8B3008B1B89F5C03 /* SRError.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRError.m; path = SocketRocket/Internal/Utilities/SRError.m; sourceTree = "<group>"; };
+               77B67B7AD3900B61154BC9C1973DD611 /* SocketRocket.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SocketRocket.modulemap; sourceTree = "<group>"; };
+               782D18DB9D0B7B74F8613026BAD77E86 /* IQKeyboardToolbarManager+Action.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Action.swift"; path = "IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Action.swift"; sourceTree = "<group>"; };
+               78882EBBF9DB9EAA48F3FFBF14D1E0B5 /* IQKeyboardToolbar.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbar.release.xcconfig; sourceTree = "<group>"; };
+               78F95F4E86380B049117A093BFC1CD7B /* IQTextInputViewNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextInputViewNotification.debug.xcconfig; sourceTree = "<group>"; };
+               792548D571F70D8E7FA3B52FA58D9591 /* IQKeyboardManager+ActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ActiveConfiguration.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift"; sourceTree = "<group>"; };
+               79E6154EEE25D08664ACFE66C69DDFA0 /* Toast-Swift.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Toast-Swift.release.xcconfig"; sourceTree = "<group>"; };
+               7E07F795F5513269A6EA62DE5EE8C187 /* IQKeyboardCore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardCore-prefix.pch"; sourceTree = "<group>"; };
+               7E46C7EF1F6BD003E0DEC56B05B15DDF /* SocketRocket-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SocketRocket-umbrella.h"; sourceTree = "<group>"; };
+               7E6C82BDAFC8E25852BD0F53480C2FE2 /* IQKeyboardToolbarManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbarManager-prefix.pch"; sourceTree = "<group>"; };
+               7F565A673CEEF3B818D7A75F2A2EE8B0 /* UIView+IQKeyboardExtensionDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtensionDeprecated.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtensionDeprecated.swift"; sourceTree = "<group>"; };
+               80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager"; path = IQKeyboardToolbarManager.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               822DD0DAF7E4428BCCDFE28EAD683ADD /* IQKeyboardNotification-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardNotification-umbrella.h"; sourceTree = "<group>"; };
+               847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQTextView-IQTextView"; path = IQTextView.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               84BBB0405889161CCDDCD4F166723CBF /* ConstraintLayoutGuideDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuideDSL.swift; path = Sources/ConstraintLayoutGuideDSL.swift; sourceTree = "<group>"; };
+               85A01882ED06DFEA2E0CE78BCDB204A7 /* SocketRocket */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SocketRocket; path = SocketRocket.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               8609C41722C0D97335DBF43B1CE7AB03 /* SRRunLoopThread.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRRunLoopThread.m; path = SocketRocket/Internal/RunLoop/SRRunLoopThread.m; sourceTree = "<group>"; };
+               87F05B4E0307C30EB4FC212724C8F157 /* IQKeyboardNotification.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardNotification.debug.xcconfig; sourceTree = "<group>"; };
+               888ACD87ACA8BCCE5527AAC76E41A5A3 /* ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist"; sourceTree = "<group>"; };
+               895778DCA58AE753D96DD48F3E036F4F /* IQKeyboardManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardManager.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift; sourceTree = "<group>"; };
+               8981CA762CD2FDB68D15FEEA091439B5 /* IQKeyboardToolbarManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbarManager.release.xcconfig; sourceTree = "<group>"; };
+               8B5BF34764325604D366CC5C6F31A43A /* IQKeyboardToolbarManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardToolbarManager.modulemap; sourceTree = "<group>"; };
+               8BD0BDF557D8D8D7CFB04CB9C9482634 /* UIView+ParentObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+ParentObjc.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift"; sourceTree = "<group>"; };
+               8C2460EF332DB152D7A7B9869C8F4032 /* IQKeyboardToolbarManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardToolbarManager-dummy.m"; sourceTree = "<group>"; };
+               8C4CE911087AC8260002E6859821FAF0 /* SRIOConsumerPool.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRIOConsumerPool.h; path = SocketRocket/Internal/IOConsumer/SRIOConsumerPool.h; sourceTree = "<group>"; };
+               8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift"; path = IQKeyboardManagerSwift.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               8EE7DE8BEE69315B9018594B62622247 /* SocketRocket-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SocketRocket-Info.plist"; sourceTree = "<group>"; };
+               8F74E325EE2B99C0C5504B461E558136 /* ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist"; sourceTree = "<group>"; };
+               90A0A417BB33C9C0B15A1946762E0142 /* Pods-Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-Info.plist"; sourceTree = "<group>"; };
+               9101BAF3027E387E34B0301BE000FA50 /* ConstraintMakerPrioritizable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerPrioritizable.swift; path = Sources/ConstraintMakerPrioritizable.swift; sourceTree = "<group>"; };
+               914B3416C83998074DDAB130CB468706 /* IQKeyboardReturnManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardReturnManager.release.xcconfig; sourceTree = "<group>"; };
+               91511868D1335C41FD84563EF906555C /* Pods-DeepChordsSdk.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-DeepChordsSdk.release.xcconfig"; sourceTree = "<group>"; };
+               91B24E7C9EB4215BEA2C0A23D3960815 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; };
+               92C5C459A1F7BF6872A58A16B7092803 /* ConstraintInsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintInsetTarget.swift; path = Sources/ConstraintInsetTarget.swift; sourceTree = "<group>"; };
+               936A804D23E5F53A2A38402D624D6EA2 /* IQKeyboardManager+Position.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Position.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift"; sourceTree = "<group>"; };
+               9374F8A0206251FC7979A888F803B656 /* IQKeyboardCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardCore.debug.xcconfig; sourceTree = "<group>"; };
+               93B05AAE9D91B32B46928A2293611FF4 /* Pods-Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Example-umbrella.h"; sourceTree = "<group>"; };
+               95BCD7B08FF0A2A4F9B0A36B92688E27 /* SRWebSocket.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRWebSocket.m; path = SocketRocket/SRWebSocket.m; sourceTree = "<group>"; };
+               972CC8A48122693582F02385A70853A0 /* ConstraintConfig.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConfig.swift; path = Sources/ConstraintConfig.swift; sourceTree = "<group>"; };
+               979486118B3E90C08386079D57962701 /* SnapKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SnapKit; path = SnapKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               97D19ACC9A79A3CF24DA377E12303E12 /* UIView+Responders.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Responders.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+Responders.swift"; sourceTree = "<group>"; };
+               9939F486FEF106F98BDD0806CA8E0624 /* IQInvocation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQInvocation.swift; path = IQKeyboardToolbar/Classes/IQBarButtonItem/IQInvocation.swift; sourceTree = "<group>"; };
+               994130CE96E0F8ED28DCF165B03CB200 /* IQKeyboardToolbar-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbar-umbrella.h"; sourceTree = "<group>"; };
+               995B281C84F1083BE4DB31B75BCC029C /* UIViewController+ParentContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIViewController+ParentContainer.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift"; sourceTree = "<group>"; };
+               9976447B92E50DDDCA64DBDE5A47FD7F /* UIView+IQKeyboardExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardExtension.swift"; path = "IQKeyboardToolbar/Classes/IQKeyboardExtension/UIView+IQKeyboardExtension.swift"; sourceTree = "<group>"; };
+               99B82533878EEF9F0E2FB3560695FF8A /* IQTextView.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.debug.xcconfig; sourceTree = "<group>"; };
+               9D3FF860EEACD6D1A4A582CB31FC31C1 /* Pods-DeepChordsSdk-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-DeepChordsSdk-acknowledgements.plist"; sourceTree = "<group>"; };
+               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; };
+               9ECC82996747BDD9C0FF35EC1ECF0751 /* IQTextInputViewInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQTextInputViewInfo.swift; path = IQTextInputViewNotification/Classes/IQTextInputViewInfo.swift; sourceTree = "<group>"; };
+               9F272A689E05B2AA0C0ED18AD4383DDE /* SocketRocket.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SocketRocket.debug.xcconfig; sourceTree = "<group>"; };
+               9F657D2C1582A8BFEADD06E527D796B2 /* IQKeyboardCore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardCore-umbrella.h"; sourceTree = "<group>"; };
+               A0F99DC81F369C1B739E19DE3923C65A /* IQKeyboardExtended.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardExtended.swift; path = IQKeyboardCore/Classes/IQKeyboardExtended.swift; sourceTree = "<group>"; };
+               A15B541658FAC5E8233C91001D7888EC /* UITableView+IndexPaths.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UITableView+IndexPaths.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift"; sourceTree = "<group>"; };
+               A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQKeyboardToolbar-IQKeyboardToolbar"; path = IQKeyboardToolbar.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               A1B189AA95276D5EC85F6B80EED66624 /* Pods-DeepChordsSdk.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-DeepChordsSdk.modulemap"; sourceTree = "<group>"; };
+               A284951838ACA1015F31DBE6C5A8D45F /* SRConstants.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRConstants.m; path = SocketRocket/Internal/SRConstants.m; sourceTree = "<group>"; };
+               A368339039F84E09260E0C59DD294DF3 /* UIView+Hierarchy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Hierarchy.swift"; path = "IQKeyboardCore/Classes/UIKitExtensions/UIView+Hierarchy.swift"; sourceTree = "<group>"; };
+               A44F945B3203BCA4B178E49ED53E5391 /* IQKeyboardManager+Appearance.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Appearance.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift"; sourceTree = "<group>"; };
+               A55BC45618B737DBC6885D98DC8C9C0C /* ConstraintLayoutSupportDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupportDSL.swift; path = Sources/ConstraintLayoutSupportDSL.swift; sourceTree = "<group>"; };
+               A6BD2261427B29C50F84843B6BAB7DEA /* Pods-Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Example-dummy.m"; sourceTree = "<group>"; };
+               A6C0BF00B3D547B50DBE54D99A1307F4 /* SRIOConsumerPool.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRIOConsumerPool.m; path = SocketRocket/Internal/IOConsumer/SRIOConsumerPool.m; sourceTree = "<group>"; };
+               A8BBDD1BF37BF58D4C467C1D1F21D462 /* ConstraintView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintView.swift; path = Sources/ConstraintView.swift; sourceTree = "<group>"; };
+               A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardManagerSwift; path = IQKeyboardManagerSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               A8FACB5BCF825223E394FFECCE4AA031 /* IQKeyboardReturnManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardReturnManager-dummy.m"; sourceTree = "<group>"; };
+               A925E59D0B05DC5A56E631BD47C64317 /* IQTextView.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQTextView.modulemap; sourceTree = "<group>"; };
+               AA485EB92636FB68E91AF3FCC1CE9C5E /* IQKeyboardCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardCore.release.xcconfig; sourceTree = "<group>"; };
+               AB0D6BE05753DE859156BD2E8FCD55AD /* IQTextInputViewNotification-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextInputViewNotification-prefix.pch"; sourceTree = "<group>"; };
+               AEF5BBB7C4ACF7C06BBD262B6C1145CE /* Typealiases.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Typealiases.swift; path = Sources/Typealiases.swift; sourceTree = "<group>"; };
+               AF5E93556B3B98CA5218F3B9E49304F6 /* SRLog.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRLog.h; path = SocketRocket/Internal/Utilities/SRLog.h; sourceTree = "<group>"; };
+               AFBCEC8A83AB63E7D141D4EA274517BA /* SnapKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapKit-umbrella.h"; sourceTree = "<group>"; };
+               B1F45CBD7E407DB108D6FAD8FF0A1415 /* SocketRocket-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SocketRocket-dummy.m"; sourceTree = "<group>"; };
+               B1F86119EB8AFCE72C0BA2356BBA4C46 /* IQTextView+Placeholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQTextView+Placeholderable.swift"; path = "IQTextView/Classes/IQTextView+Placeholderable.swift"; sourceTree = "<group>"; };
+               B278701FAF564A3D25B8F87CCDB798D6 /* SRPinningSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRPinningSecurityPolicy.h; path = SocketRocket/Internal/Security/SRPinningSecurityPolicy.h; sourceTree = "<group>"; };
+               B3AA4CA7BB409A5191DBD08356FE703A /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Example.release.xcconfig"; sourceTree = "<group>"; };
+               B4B1A58096F15199A14069C5D6AA1C99 /* IQKeyboardToolbar */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardToolbar; path = IQKeyboardToolbar.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               B4BBB6B50C15DFF1221CD8E66DC2D354 /* SRDelegateController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRDelegateController.m; path = SocketRocket/Internal/Delegate/SRDelegateController.m; sourceTree = "<group>"; };
+               B560A38E28D510B4A50AFF9595D57670 /* IQTextView-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQTextView-dummy.m"; sourceTree = "<group>"; };
+               B5D1545C4C0C2474FD103EFECB90E9C5 /* SRIOConsumer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRIOConsumer.m; path = SocketRocket/Internal/IOConsumer/SRIOConsumer.m; sourceTree = "<group>"; };
+               B704D82F61A7F3E0FF10EBDE953E7E49 /* UIView+Resign.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Resign.swift"; path = "IQKeyboardManagerSwift/Resign/UIKItExtensions/UIView+Resign.swift"; sourceTree = "<group>"; };
+               B77F72F31D132841951EF8E4FA67360A /* ConstraintOffsetTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintOffsetTarget.swift; path = Sources/ConstraintOffsetTarget.swift; sourceTree = "<group>"; };
+               B7AEC5DC6E5D0A8EAE327461A3FAFE6B /* ResourceBundle-IQTextView-IQTextView-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQTextView-IQTextView-Info.plist"; sourceTree = "<group>"; };
+               B7EC4834CE090AEAE5858B4D8B4513C7 /* ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist"; sourceTree = "<group>"; };
+               B8A90925F3434F73BD6A036480A5A473 /* Debugging.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Debugging.swift; path = Sources/Debugging.swift; sourceTree = "<group>"; };
+               B932A928D72C73FB59FC964A82AC2723 /* ConstraintPriorityTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintPriorityTarget.swift; path = Sources/ConstraintPriorityTarget.swift; sourceTree = "<group>"; };
+               B98BCBD470DE1E0FC19C5E1F3AF37195 /* Toast-Swift-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Toast-Swift-dummy.m"; sourceTree = "<group>"; };
+               B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "SnapKit-SnapKit_Privacy"; path = SnapKit_Privacy.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               BA718E8C5B46720F8012D7471BC6BF37 /* IQKeyboardToolbarManager+Toolbar.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Toolbar.swift"; path = "IQKeyboardToolbarManager/Classes/Toolbar/IQKeyboardToolbarManager+Toolbar.swift"; sourceTree = "<group>"; };
+               BB176716E9339D1CA456C696313236FE /* IQKeyboardToolbarManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarManager.swift; path = IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager.swift; sourceTree = "<group>"; };
+               BC06E9DFB77603B36FDA218B323243F1 /* Toast-Swift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Toast-Swift.modulemap"; sourceTree = "<group>"; };
+               BC590BB41230B885D405920A55DAD210 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardToolbar/Assets/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               BC713814A822ABA18A07C72E6B97AE04 /* IQKeyboardToolbarConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarConstants.swift; path = IQKeyboardToolbarManager/Classes/Constants/IQKeyboardToolbarConstants.swift; sourceTree = "<group>"; };
+               BDFB64A96CC2B18E25FF662E37821253 /* UIView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+IQKeyboardManagerExtension.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift"; sourceTree = "<group>"; };
+               BF4BC9A0614A1C63539C14C08655781F /* IQKeyboardToolbarManager+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardToolbarManager+Deprecated.swift"; path = "IQKeyboardToolbarManager/Classes/IQKeyboardToolbarManager+Deprecated.swift"; sourceTree = "<group>"; };
+               BF60B19D2E8B68520E5121EFFF5A7D4B /* IQKeyboardToolbarPlaceholderConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardToolbarPlaceholderConfiguration.swift; path = IQKeyboardToolbar/Classes/Placeholder/IQKeyboardToolbarPlaceholderConfiguration.swift; sourceTree = "<group>"; };
+               BFB6F598FCE7D6294584E7334E04ECF2 /* IQKeyboardCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardCore-dummy.m"; sourceTree = "<group>"; };
+               C0B11EBC98CF5A275C2F8077CDEA1F18 /* IQKeyboardInfo.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardInfo.swift; path = IQKeyboardNotification/Classes/IQKeyboardInfo.swift; sourceTree = "<group>"; };
+               C1C674397D453B6D18F9DE46BC55B6FF /* ConstraintView+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "ConstraintView+Extensions.swift"; path = "Sources/ConstraintView+Extensions.swift"; sourceTree = "<group>"; };
+               C23ABFD4CEF6F11C0094E61729745DE3 /* ConstraintConstantTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintConstantTarget.swift; path = Sources/ConstraintConstantTarget.swift; sourceTree = "<group>"; };
+               C2878B4F3D509987EC767604F46AD0E1 /* IQTextInputViewNotification-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQTextInputViewNotification-dummy.m"; sourceTree = "<group>"; };
+               C2E377B4F7062BE5BC6007798C6619AD /* IQKeyboardNotification-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardNotification-Info.plist"; sourceTree = "<group>"; };
+               C33C375328643D5A9A1D1EA02C88D419 /* SRSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRSecurityPolicy.h; path = SocketRocket/SRSecurityPolicy.h; sourceTree = "<group>"; };
+               C3F49C31FFD05F4734B464D5C31979FB /* SRProxyConnect.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRProxyConnect.m; path = SocketRocket/Internal/Proxy/SRProxyConnect.m; sourceTree = "<group>"; };
+               C4B0C5FFB36CB099605387F3B9F34032 /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Debug.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift"; sourceTree = "<group>"; };
+               C53921D76AE7ECC63293C2263C9325A0 /* ConstraintViewDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintViewDSL.swift; path = Sources/ConstraintViewDSL.swift; sourceTree = "<group>"; };
+               C61F58870F6E8F6EEF25FA9A6A0E7F60 /* IQKeyboardManager+ToolbarManagerDeprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+ToolbarManagerDeprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift"; sourceTree = "<group>"; };
+               C688B508E11EFC4D24CB920CAF96B948 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Sources/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               C8BFDD7C500F5D6D58D212CB15B52E08 /* ConstraintMakerRelatable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerRelatable.swift; path = Sources/ConstraintMakerRelatable.swift; sourceTree = "<group>"; };
+               C97A233DEE5D1279877CD8292A10AD84 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQTextInputViewNotification/Assets/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               CC93FCE609BBB131B2F1C23EEA6B9997 /* IQKeyboardCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardCore.modulemap; sourceTree = "<group>"; };
+               CCC7F61220FD5938841683501167A10F /* SnapKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapKit.modulemap; sourceTree = "<group>"; };
+               CDD93D5045280AD0FFBB587ADD1D3B83 /* IQKeyboardManagerSwift.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManagerSwift.modulemap; sourceTree = "<group>"; };
+               CEA0C9AAC08B9E0D20DE8BC894AE3FDE /* SRMutex.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRMutex.h; path = SocketRocket/Internal/Utilities/SRMutex.h; sourceTree = "<group>"; };
+               CEAD5B92B7CF2B0746297208D610D3CD /* UIView+RespondersObjc.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+RespondersObjc.swift"; path = "IQKeyboardToolbarManager/Classes/UIKitExtensions/UIView+RespondersObjc.swift"; sourceTree = "<group>"; };
+               CF362111EEE4CBA3A09DDC5814422B70 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = Toast/Resources/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               CFB853532F59E8A63D1C93202280CEE9 /* ConstraintRelatableTarget.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintRelatableTarget.swift; path = Sources/ConstraintRelatableTarget.swift; sourceTree = "<group>"; };
+               CFCB22B3ED6C05251CBD3059AAE51013 /* ConstraintDSL.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDSL.swift; path = Sources/ConstraintDSL.swift; sourceTree = "<group>"; };
+               D0689F5C192D1672448116583D233922 /* IQKeyboardManager+Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Deprecated.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift"; sourceTree = "<group>"; };
+               D1B2801FD44E489C5B7F202C13D651F2 /* SRRandom.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRRandom.h; path = SocketRocket/Internal/Utilities/SRRandom.h; sourceTree = "<group>"; };
+               D2793937CF93115D3117A82FB873124B /* ConstraintLayoutGuide.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutGuide.swift; path = Sources/ConstraintLayoutGuide.swift; sourceTree = "<group>"; };
+               D389D10DEC7EB9B503CD45CE58851CA6 /* SRWebSocket.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRWebSocket.h; path = SocketRocket/SRWebSocket.h; sourceTree = "<group>"; };
+               D4C8C6089794ACE3010224A9FB1D90EA /* ConstraintMaker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMaker.swift; path = Sources/ConstraintMaker.swift; sourceTree = "<group>"; };
+               D5278EBCB01A333274C163B9281DE38B /* Pods-DeepChordsSdk-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-DeepChordsSdk-dummy.m"; sourceTree = "<group>"; };
+               D5434748DD18D8B60013ABF3FFC5B95F /* IQTextView.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQTextView.release.xcconfig; sourceTree = "<group>"; };
+               D5BD8A09B0B0972162CDD072ACB69843 /* IQKeyboardToolbar-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardToolbar-Info.plist"; sourceTree = "<group>"; };
+               D5EC7B9244C6E5B0C7776ADA35992A5D /* Pods-Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Example-acknowledgements.plist"; sourceTree = "<group>"; };
+               D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast-Swift */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Toast-Swift"; path = Toast_Swift.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               D63292C39BAA9B9EB776AAA03EABD932 /* IQActiveConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQActiveConfiguration.swift; path = IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift; sourceTree = "<group>"; };
+               D7EF3525F706753F05EA05BD1819EC4E /* SRMutex.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRMutex.m; path = SocketRocket/Internal/Utilities/SRMutex.m; sourceTree = "<group>"; };
+               D8D8726D60E6EF3E455768E64432DA57 /* ConstraintLayoutSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintLayoutSupport.swift; path = Sources/ConstraintLayoutSupport.swift; sourceTree = "<group>"; };
+               DA85287A9C3D760A6324EF926C0C44CE /* IQKeyboardNotification-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardNotification-dummy.m"; sourceTree = "<group>"; };
+               DA9BF97689FA8F63852FC5D7EE814D2D /* IQKeyboardReturnManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardReturnManager-umbrella.h"; sourceTree = "<group>"; };
+               DCDF74B5DEAC5E25CFC4D9F9B16EFBEB /* IQKeyboardToolbarManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardToolbarManager.debug.xcconfig; sourceTree = "<group>"; };
+               DD6C692550BC0661BA84378E58F6BA8A /* LayoutConstraintItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = LayoutConstraintItem.swift; path = Sources/LayoutConstraintItem.swift; sourceTree = "<group>"; };
+               DD7D32B2F1F5F83790A39F4CDEBBFF96 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist"; sourceTree = "<group>"; };
+               E1CAF7BAA0421C27EFE212A343F56870 /* ResourceBundle-Toast-Swift-Toast-Swift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-Toast-Swift-Toast-Swift-Info.plist"; sourceTree = "<group>"; };
+               E25ABD3C4935A40132346F656CA1AA7C /* IQKeyboardAppearanceManager.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardAppearanceManager.swift; path = IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift; sourceTree = "<group>"; };
+               E293311AF50DC30E5B7F7D2D91BEB28A /* ConstraintAttributes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintAttributes.swift; path = Sources/ConstraintAttributes.swift; sourceTree = "<group>"; };
+               E39AF10B1F50FF70721677FFF69BED27 /* IQKeyboardResignHandler+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardResignHandler+Internal.swift"; path = "IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift"; sourceTree = "<group>"; };
+               E3B1CECC33970571F4F9AF61CB1D3DCD /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = IQKeyboardReturnManager/Assets/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
+               E54219744D41CC6C6674908699602DD9 /* UILayoutSupport+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UILayoutSupport+Extensions.swift"; path = "Sources/UILayoutSupport+Extensions.swift"; sourceTree = "<group>"; };
+               E6A14C9A838BD693FFDCAF82F4D5604A /* IQKeyboardNotification.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardNotification.swift; path = IQKeyboardNotification/Classes/IQKeyboardNotification.swift; sourceTree = "<group>"; };
+               E7EE2526E40B99B0F243808A2396A01C /* SRError.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRError.h; path = SocketRocket/Internal/Utilities/SRError.h; sourceTree = "<group>"; };
+               E8366BB09BA070DB9FB5CB54F726B2C0 /* IQKeyboardToolbar-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardToolbar-prefix.pch"; sourceTree = "<group>"; };
+               E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS18.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
+               E9BAAEAF59FEC4ED102911D4A47849CB /* SnapKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapKit-Info.plist"; sourceTree = "<group>"; };
+               EA467055B207002F9B70E96F08A0FF86 /* IQTextInputViewNotification-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQTextInputViewNotification-umbrella.h"; sourceTree = "<group>"; };
+               EAED633C414062FCB78BD8A5896433FC /* Toast-Swift-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Toast-Swift-Info.plist"; sourceTree = "<group>"; };
+               ED22317A1312CBBA0134A8E449ABD201 /* SRHTTPConnectMessage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRHTTPConnectMessage.m; path = SocketRocket/Internal/Utilities/SRHTTPConnectMessage.m; sourceTree = "<group>"; };
+               ED7286BA89901CA1D622A1FCF81E718C /* NSURLRequest+SRWebSocket.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSURLRequest+SRWebSocket.m"; path = "SocketRocket/NSURLRequest+SRWebSocket.m"; sourceTree = "<group>"; };
+               EE1B2703C190723870111C925A464468 /* IQPlaceholderable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQPlaceholderable.swift; path = IQKeyboardToolbar/Placeholderable/IQPlaceholderable.swift; sourceTree = "<group>"; };
+               EF4B79F3BC3201907DE2B7A2671776C1 /* IQKeyboardAppearanceConfiguration.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardAppearanceConfiguration.swift; path = IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift; sourceTree = "<group>"; };
+               F2183FF2315FBF68B5F334EC6EB19A9B /* SRHash.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRHash.h; path = SocketRocket/Internal/Utilities/SRHash.h; sourceTree = "<group>"; };
+               F528CE7CB37911E316CD1F5622E5B931 /* IQKeyboardReturnManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardReturnManager.debug.xcconfig; sourceTree = "<group>"; };
+               F5522D8F6ABFFF15E2334E694691DD5E /* SocketRocket-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SocketRocket-prefix.pch"; sourceTree = "<group>"; };
+               F92A13F8C77041A7711D1764A76C37A3 /* IQKeyboardManager+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Internal.swift"; path = "IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift"; sourceTree = "<group>"; };
+               F930ACB6AC5D06295D698ED0249EB0AB /* SRLog.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SRLog.m; path = SocketRocket/Internal/Utilities/SRLog.m; sourceTree = "<group>"; };
+               F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "IQTextInputViewNotification-IQTextInputViewNotification"; path = IQTextInputViewNotification.bundle; sourceTree = BUILT_PRODUCTS_DIR; };
+               FA41F5D42C8280BA202FDE26BDBDFFA3 /* NSURLRequest+SRWebSocketPrivate.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSURLRequest+SRWebSocketPrivate.h"; path = "SocketRocket/Internal/NSURLRequest+SRWebSocketPrivate.h"; sourceTree = "<group>"; };
+               FA727BF5D9541C98C22C9ECC911576E2 /* IQKeyboardToolbarManager */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardToolbarManager; path = IQKeyboardToolbarManager.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               FB23C93E47AFBF1FA651D132F7AC06E2 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardReturnManager+UITextFieldDelegate.swift"; path = "IQKeyboardReturnManager/Classes/Delegates/IQKeyboardReturnManager+UITextFieldDelegate.swift"; sourceTree = "<group>"; };
+               FB26ACEBA0181227271430FB01A76848 /* SRHTTPConnectMessage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SRHTTPConnectMessage.h; path = SocketRocket/Internal/Utilities/SRHTTPConnectMessage.h; sourceTree = "<group>"; };
+               FB474AD377D72ECDF638D46A73B7D687 /* ConstraintMakerEditable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintMakerEditable.swift; path = Sources/ConstraintMakerEditable.swift; sourceTree = "<group>"; };
+               FBC1F980FADF5CA26AF9C77CF3D9B1A2 /* IQKeyboardConstants.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IQKeyboardConstants.swift; path = IQKeyboardCore/Classes/Constants/IQKeyboardConstants.swift; sourceTree = "<group>"; };
+               FC7F0CF2EA5DF59C59D9995890DA5C47 /* IQKeyboardCore */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardCore; path = IQKeyboardCore.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               FD07CC20E3828AFE18630B7C25BCCA92 /* IQKeyboardManagerSwift-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManagerSwift-prefix.pch"; sourceTree = "<group>"; };
+               FDD0C3C29384D3EEBCB4BE346B1CA890 /* IQKeyboardManager+Appearance_Deprecated.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "IQKeyboardManager+Appearance_Deprecated.swift"; path = "IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift"; sourceTree = "<group>"; };
+               FEF9AC89E9C4BD37AC0AB78B535D1CFC /* IQKeyboardNotification */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardNotification; path = IQKeyboardNotification.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+               FF3B6C922ADF7DB53066B95C9359B445 /* Pods-Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Example.modulemap"; sourceTree = "<group>"; };
+               FF4B96374C0DB9D56AB95C3D5A31B152 /* ConstraintDescription.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ConstraintDescription.swift; path = Sources/ConstraintDescription.swift; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+               2BE4574EA7A2208A3273A02C5D2F1D1B /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               33428AC36668E3ED52DB70316F843FB8 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               205EB01AED14BB574DD54EAFE26E4786 /* Foundation.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3683C5D0C8F465D221926E5B41E0B565 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4E7BB3FBF4B3680AF358C0A0A0F34011 /* Foundation.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4F320E16D10A7BE9185BA7C5A5CCDA43 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               51FB4B943D35F3E908360703B96C7E25 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               95A620A5272057BA126D00CC498F9B8A /* Combine.framework in Frameworks */,
+                               8762AC084551DBB2E00C3091CAF011ED /* Foundation.framework in Frameworks */,
+                               AC68F7636D1D7832E4B5B18DD2BF2941 /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               524D81F2C5CE61FB9EB4A47C9DEE4C1E /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               5B8C51C6BFA979E81A28179CCC2C0936 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               09D303C994021652DF841C463DBD1DC5 /* Foundation.framework in Frameworks */,
+                               8ACE9296AA479804EFD2D3CC417DE801 /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               5C50EB2041FA8E3A1BB9E243091C260E /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               5FCE427163262BB0862B486F5E093C1C /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               743D51EAD768EDE4D4AB7D3C665C7D2E /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               7802B8C3260B2A1D85C8EFC0C6929B18 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               796567F81D938DA74DF71A2AFF3F8F3D /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               D2E460754683003AE9ECF32A831D401F /* CFNetwork.framework in Frameworks */,
+                               DEEC14319D7619F96C4E93415A6D577D /* Foundation.framework in Frameworks */,
+                               B4C82668A78939FE910FEA0D314F06C1 /* Security.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               9688A049F13521CC698EF57654CF2443 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               E3535804CAC5D872E37CD8639C930771 /* Foundation.framework in Frameworks */,
+                               8DC89975CCCA53253DE9DB5646E468FB /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               B0A1DA8C8E42CD15049F6F2D79726D7D /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               1213C5A29D13B6F2E3AE2356CB9F5807 /* Foundation.framework in Frameworks */,
+                               11A3EB5BE3623EC013AA37B49813E56C /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               B4BF16B463F2EC49D7CBC102A2936235 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               075FBDF5D186F8BF4537BC34E526F9DB /* Foundation.framework in Frameworks */,
+                               721D0AFDE15FCC46F4579069672719B9 /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               D07B79E83A18E3018EFA8CE654EF97CB /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               3E715D5BADDEACEEF30D6A4CA82CDA9B /* Foundation.framework in Frameworks */,
+                               D6EFA9EAA562143F338EB164836B7837 /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               D5899CD7924A4C13CEA79F5428436874 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AEA1A05086EA1256D504393FAED3CF4B /* Foundation.framework in Frameworks */,
+                               E4A0C00A361F30B7848B8AE7653C9C60 /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               D603B521417D6EFBEB7EAECC9C431345 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               AD9EF3D3778212D1147044DC3A971C80 /* Foundation.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               D7208CA103D7DAE87F900A6B91736DCC /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               D9611FA61C59D2592877A687EEBEEFE4 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               F151972567B4508E965D5BFCCF7174A1 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               070601D9903BE1D11DD6DD1367C3F012 /* Foundation.framework in Frameworks */,
+                               7B0BC17748C9775A8299A96D501CE5A8 /* QuartzCore.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               F94D8D7F47FD316BA431BF216418ADF4 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               FBA90047961BDAD70FDA139EC0C30DD0 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               B5C5EBCC5EC278EA704D27FB2D333B22 /* Combine.framework in Frameworks */,
+                               F020DBD67EA8E12A860BE211F6BE04D5 /* Foundation.framework in Frameworks */,
+                               9D71239428D38EB9B5E7F5AA51E3E1BB /* UIKit.framework in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+               13E2B5C1BC359C44AB73F5D24BAFDDD5 /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               BC590BB41230B885D405920A55DAD210 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               1BF8BA79F8DEAC3F899EE1DFFF731A01 /* IQKeyboardCore */ = {
+                       isa = PBXGroup;
+                       children = (
+                               FBC1F980FADF5CA26AF9C77CF3D9B1A2 /* IQKeyboardConstants.swift */,
+                               A0F99DC81F369C1B739E19DE3923C65A /* IQKeyboardExtended.swift */,
+                               502964DCE1567348B5B03211445AEA35 /* IQTextInputView.swift */,
+                               A368339039F84E09260E0C59DD294DF3 /* UIView+Hierarchy.swift */,
+                               50CDA1F6060CF0BC3D55DA36A001EA9D /* Resources */,
+                               A4931A6EF436A36B49F767979C6DFC2C /* Support Files */,
+                       );
+                       name = IQKeyboardCore;
+                       path = IQKeyboardCore;
+                       sourceTree = "<group>";
+               };
+               1D63BF5EA7169C494BFD74466E0A946E /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               1EEC9E9674D2F2735A1237FEC96C44CB /* IQKeyboardReturnManager.modulemap */,
+                               A8FACB5BCF825223E394FFECCE4AA031 /* IQKeyboardReturnManager-dummy.m */,
+                               67B06A63B2F6FDD332A5D14963BFC3E3 /* IQKeyboardReturnManager-Info.plist */,
+                               6F879A10A3809420736A229A9720D75A /* IQKeyboardReturnManager-prefix.pch */,
+                               DA9BF97689FA8F63852FC5D7EE814D2D /* IQKeyboardReturnManager-umbrella.h */,
+                               F528CE7CB37911E316CD1F5622E5B931 /* IQKeyboardReturnManager.debug.xcconfig */,
+                               914B3416C83998074DDAB130CB468706 /* IQKeyboardReturnManager.release.xcconfig */,
+                               2EFB802792096CDDF8FD170084E303BC /* ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQKeyboardReturnManager";
+                       sourceTree = "<group>";
+               };
+               1D7583ECA74F66EE34F3E9D627C627BA /* Targets Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               23FD8BC105B5E0EE727A6A6F33FC884D /* Pods-DeepChordsSdk */,
+                               B3257EA856A4DD50C7E8688B28071AAA /* Pods-Example */,
+                       );
+                       name = "Targets Support Files";
+                       sourceTree = "<group>";
+               };
+               1FCA4E5DDAB2C58C6C3DA814626EF4AF /* iOS */ = {
+                       isa = PBXGroup;
+                       children = (
+                               0C917A6291C02472ECB91FD7B8B2CFC1 /* CFNetwork.framework */,
+                               3ED18FF4963E7B4F60DBBA903E25C67B /* Combine.framework */,
+                               E88E50F432B6DEA7E36A35EA934B002C /* Foundation.framework */,
+                               133A600484839BF74BDD51C8B0BB6EBE /* QuartzCore.framework */,
+                               91B24E7C9EB4215BEA2C0A23D3960815 /* Security.framework */,
+                               3A92BC97913B825589680C917211C138 /* UIKit.framework */,
+                       );
+                       name = iOS;
+                       sourceTree = "<group>";
+               };
+               23FD8BC105B5E0EE727A6A6F33FC884D /* Pods-DeepChordsSdk */ = {
+                       isa = PBXGroup;
+                       children = (
+                               A1B189AA95276D5EC85F6B80EED66624 /* Pods-DeepChordsSdk.modulemap */,
+                               3725B14D6A408FA007F106F8CA983CE3 /* Pods-DeepChordsSdk-acknowledgements.markdown */,
+                               9D3FF860EEACD6D1A4A582CB31FC31C1 /* Pods-DeepChordsSdk-acknowledgements.plist */,
+                               D5278EBCB01A333274C163B9281DE38B /* Pods-DeepChordsSdk-dummy.m */,
+                               1917E3D591E530CFE1940C6F4E878690 /* Pods-DeepChordsSdk-Info.plist */,
+                               284AC2E81CAAA90FEA12A250A16B11AB /* Pods-DeepChordsSdk-umbrella.h */,
+                               4BF6C697C2EB03CCBCE9CA841EA31F47 /* Pods-DeepChordsSdk.debug.xcconfig */,
+                               91511868D1335C41FD84563EF906555C /* Pods-DeepChordsSdk.release.xcconfig */,
+                       );
+                       name = "Pods-DeepChordsSdk";
+                       path = "Target Support Files/Pods-DeepChordsSdk";
+                       sourceTree = "<group>";
+               };
+               27556D70EE23F0F08BF16229FD0E531E /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               CF362111EEE4CBA3A09DDC5814422B70 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               28309F6F20D52ED4CD8FF99A9C1660E7 /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               0F6A2BF98BD227110E60762E29808CEC /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               2C2FAE5EF6DD9554D932D5EFD9116CAF /* Toast-Swift */ = {
+                       isa = PBXGroup;
+                       children = (
+                               6D134ED7EB13A9F9FADC82CC86BC10FA /* Toast.swift */,
+                               27556D70EE23F0F08BF16229FD0E531E /* Resources */,
+                               D9C1D5F2F67176B3E300A9D87ACBD68C /* Support Files */,
+                       );
+                       name = "Toast-Swift";
+                       path = "Toast-Swift";
+                       sourceTree = "<group>";
+               };
+               346904CC6058F4E1176842D4FBB1C297 /* IQKeyboardManagerSwift */ = {
+                       isa = PBXGroup;
+                       children = (
+                               CDD0B85A0330B1E5B6A1922E992D6D74 /* Appearance */,
+                               609A1498D37F4C29C58C45EFCB47A49F /* Core */,
+                               D1DA56D0B201AACDCF6837C820268F5C /* IQKeyboardToolbarManager */,
+                               988D9336740C0F448BAA393FDDF28A0C /* Resign */,
+                               A76710793188CE18938A1F3AE19BCA99 /* Resources */,
+                               A8F67839F6044F4381759B3BB49258DA /* Support Files */,
+                       );
+                       name = IQKeyboardManagerSwift;
+                       path = IQKeyboardManagerSwift;
+                       sourceTree = "<group>";
+               };
+               386ACAC75067BB6189F2C50B03C8280B /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               77B67B7AD3900B61154BC9C1973DD611 /* SocketRocket.modulemap */,
+                               B1F45CBD7E407DB108D6FAD8FF0A1415 /* SocketRocket-dummy.m */,
+                               8EE7DE8BEE69315B9018594B62622247 /* SocketRocket-Info.plist */,
+                               F5522D8F6ABFFF15E2334E694691DD5E /* SocketRocket-prefix.pch */,
+                               7E46C7EF1F6BD003E0DEC56B05B15DDF /* SocketRocket-umbrella.h */,
+                               9F272A689E05B2AA0C0ED18AD4383DDE /* SocketRocket.debug.xcconfig */,
+                               10CAAD795A45AB49A0EE4D6805AB7A1F /* SocketRocket.release.xcconfig */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/SocketRocket";
+                       sourceTree = "<group>";
+               };
+               472C5FB976462E83207651E16BEEAA5D /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               3649D66694159EF7F40B5A7377AC04D1 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               4C6F9E06DF0DA1DF8AC4B116BBF4C9C0 /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               A925E59D0B05DC5A56E631BD47C64317 /* IQTextView.modulemap */,
+                               B560A38E28D510B4A50AFF9595D57670 /* IQTextView-dummy.m */,
+                               4FB988C66900BB1BEEF5C5CA21B14AC9 /* IQTextView-Info.plist */,
+                               170AE4D919026EA3D1FB264423443921 /* IQTextView-prefix.pch */,
+                               64607CC28651258E6DAB2D1358080FB5 /* IQTextView-umbrella.h */,
+                               99B82533878EEF9F0E2FB3560695FF8A /* IQTextView.debug.xcconfig */,
+                               D5434748DD18D8B60013ABF3FFC5B95F /* IQTextView.release.xcconfig */,
+                               B7AEC5DC6E5D0A8EAE327461A3FAFE6B /* ResourceBundle-IQTextView-IQTextView-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQTextView";
+                       sourceTree = "<group>";
+               };
+               4E55C56B4EBD419565958D777C1D742F /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               25BADE0B95009E3B02C9E6EBB47417A3 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               50CDA1F6060CF0BC3D55DA36A001EA9D /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               6C4219D35CB16DFEC9A662797E27F4D8 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               5173CCD3EAD3FD7627B918D1D542D872 /* Placeholderable */ = {
+                       isa = PBXGroup;
+                       children = (
+                               EE1B2703C190723870111C925A464468 /* IQPlaceholderable.swift */,
+                       );
+                       name = Placeholderable;
+                       sourceTree = "<group>";
+               };
+               52A8D4FE846B6E04B566DBAF11B33A13 /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               761B4D8A688672EC9D13AB178F184A16 /* IQKeyboardToolbar.modulemap */,
+                               48CA3ADFB16E0C4E235D89C552572332 /* IQKeyboardToolbar-dummy.m */,
+                               D5BD8A09B0B0972162CDD072ACB69843 /* IQKeyboardToolbar-Info.plist */,
+                               E8366BB09BA070DB9FB5CB54F726B2C0 /* IQKeyboardToolbar-prefix.pch */,
+                               994130CE96E0F8ED28DCF165B03CB200 /* IQKeyboardToolbar-umbrella.h */,
+                               159C74980AC55D136945F073F6CEDC14 /* IQKeyboardToolbar.debug.xcconfig */,
+                               78882EBBF9DB9EAA48F3FFBF14D1E0B5 /* IQKeyboardToolbar.release.xcconfig */,
+                               888ACD87ACA8BCCE5527AAC76E41A5A3 /* ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQKeyboardToolbar";
+                       sourceTree = "<group>";
+               };
+               5A6A32F0330DE1F0FF6179C5C3799FF3 /* IQTextInputViewNotification */ = {
+                       isa = PBXGroup;
+                       children = (
+                               9ECC82996747BDD9C0FF35EC1ECF0751 /* IQTextInputViewInfo.swift */,
+                               0578E47B5AE5713CF21EA86848CA87DD /* IQTextInputViewNotification.swift */,
+                               7043FF2BB90FA65D64CD5D4BB3449DE9 /* Resources */,
+                               6E70A82102C02142D2369D9D1C31773C /* Support Files */,
+                       );
+                       name = IQTextInputViewNotification;
+                       path = IQTextInputViewNotification;
+                       sourceTree = "<group>";
+               };
+               609A1498D37F4C29C58C45EFCB47A49F /* Core */ = {
+                       isa = PBXGroup;
+                       children = (
+                               D63292C39BAA9B9EB776AAA03EABD932 /* IQActiveConfiguration.swift */,
+                               895778DCA58AE753D96DD48F3E036F4F /* IQKeyboardManager.swift */,
+                               792548D571F70D8E7FA3B52FA58D9591 /* IQKeyboardManager+ActiveConfiguration.swift */,
+                               C4B0C5FFB36CB099605387F3B9F34032 /* IQKeyboardManager+Debug.swift */,
+                               D0689F5C192D1672448116583D233922 /* IQKeyboardManager+Deprecated.swift */,
+                               F92A13F8C77041A7711D1764A76C37A3 /* IQKeyboardManager+Internal.swift */,
+                               936A804D23E5F53A2A38402D624D6EA2 /* IQKeyboardManager+Position.swift */,
+                               10C547231342B150BEC39F40295D087E /* IQRootControllerConfiguration.swift */,
+                               47F6CB0808BEA63D36E484B5D53B6436 /* IQScrollViewConfiguration.swift */,
+                               115E19C96EB6123FE27F3A530B3BE30D /* UICollectionView+IndexPaths.swift */,
+                               3F70480B31A6883BEDFC6C623FC76A32 /* UIScrollView+IQKeyboardManagerExtension.swift */,
+                               4EF1258267E4FF8FA1F298C5303B0E86 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */,
+                               A15B541658FAC5E8233C91001D7888EC /* UITableView+IndexPaths.swift */,
+                               BDFB64A96CC2B18E25FF662E37821253 /* UIView+IQKeyboardManagerExtension.swift */,
+                               3D8DC22EC08F3E72E7E53ADA12E80CC0 /* UIView+IQKeyboardManagerExtensionObjc.swift */,
+                               3F8F3D9A02DBFA1FF9899DD8933A95DA /* UIView+Parent.swift */,
+                               8BD0BDF557D8D8D7CFB04CB9C9482634 /* UIView+ParentObjc.swift */,
+                               995B281C84F1083BE4DB31B75BCC029C /* UIViewController+ParentContainer.swift */,
+                       );
+                       name = Core;
+                       sourceTree = "<group>";
+               };
+               659362BF40FCF9635ED3C52F96CC6133 /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               8B5BF34764325604D366CC5C6F31A43A /* IQKeyboardToolbarManager.modulemap */,
+                               8C2460EF332DB152D7A7B9869C8F4032 /* IQKeyboardToolbarManager-dummy.m */,
+                               39B4B067040847EC4A5CE870C4E0C5A1 /* IQKeyboardToolbarManager-Info.plist */,
+                               7E6C82BDAFC8E25852BD0F53480C2FE2 /* IQKeyboardToolbarManager-prefix.pch */,
+                               1D8DCDE8A3DFBFEA690BD5A6081C5762 /* IQKeyboardToolbarManager-umbrella.h */,
+                               DCDF74B5DEAC5E25CFC4D9F9B16EFBEB /* IQKeyboardToolbarManager.debug.xcconfig */,
+                               8981CA762CD2FDB68D15FEEA091439B5 /* IQKeyboardToolbarManager.release.xcconfig */,
+                               32B4B8845C7824A1AB6C42EB0B32845E /* ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQKeyboardToolbarManager";
+                       sourceTree = "<group>";
+               };
+               6A6ACDADD484E61C0C86AAAC23AA5774 /* Products */ = {
+                       isa = PBXGroup;
+                       children = (
+                               FC7F0CF2EA5DF59C59D9995890DA5C47 /* IQKeyboardCore */,
+                               6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */,
+                               A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift */,
+                               8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */,
+                               FEF9AC89E9C4BD37AC0AB78B535D1CFC /* IQKeyboardNotification */,
+                               120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */,
+                               15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */,
+                               110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */,
+                               B4B1A58096F15199A14069C5D6AA1C99 /* IQKeyboardToolbar */,
+                               A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */,
+                               FA727BF5D9541C98C22C9ECC911576E2 /* IQKeyboardToolbarManager */,
+                               80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */,
+                               06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */,
+                               F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */,
+                               0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */,
+                               847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */,
+                               06FEEB0FA2AA89DF42A1C6525F644FBF /* Pods-DeepChordsSdk */,
+                               1F667CC0E19EAF34E5A4119E2121F585 /* Pods-Example */,
+                               979486118B3E90C08386079D57962701 /* SnapKit */,
+                               B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */,
+                               85A01882ED06DFEA2E0CE78BCDB204A7 /* SocketRocket */,
+                               D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast-Swift */,
+                               13FD39576595D8A884BF5166065C5236 /* Toast-Swift-Toast-Swift */,
+                       );
+                       name = Products;
+                       sourceTree = "<group>";
+               };
+               6E70A82102C02142D2369D9D1C31773C /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               07FD04B2D25C4767E2AACE039E3E77A8 /* IQTextInputViewNotification.modulemap */,
+                               C2878B4F3D509987EC767604F46AD0E1 /* IQTextInputViewNotification-dummy.m */,
+                               3ECA1919991B8674C3FD3253CD02BE4B /* IQTextInputViewNotification-Info.plist */,
+                               AB0D6BE05753DE859156BD2E8FCD55AD /* IQTextInputViewNotification-prefix.pch */,
+                               EA467055B207002F9B70E96F08A0FF86 /* IQTextInputViewNotification-umbrella.h */,
+                               78F95F4E86380B049117A093BFC1CD7B /* IQTextInputViewNotification.debug.xcconfig */,
+                               1515EB933E55F8DF1275984150311F6F /* IQTextInputViewNotification.release.xcconfig */,
+                               4F8CA916A31362AD762A33A32B0D936C /* ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQTextInputViewNotification";
+                       sourceTree = "<group>";
+               };
+               7043FF2BB90FA65D64CD5D4BB3449DE9 /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               C97A233DEE5D1279877CD8292A10AD84 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               75159EE7B37E3F28B11793B290D99D4D /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               0A8C10276B315358D1F985B8F641683A /* ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist */,
+                               CCC7F61220FD5938841683501167A10F /* SnapKit.modulemap */,
+                               02EDA2792EBD3343A7DBC6B427F1F041 /* SnapKit-dummy.m */,
+                               E9BAAEAF59FEC4ED102911D4A47849CB /* SnapKit-Info.plist */,
+                               6937B145AC462041831CC9D76D3CF28A /* SnapKit-prefix.pch */,
+                               AFBCEC8A83AB63E7D141D4EA274517BA /* SnapKit-umbrella.h */,
+                               319AC1D7C71149C2DD5EF02DECE3F511 /* SnapKit.debug.xcconfig */,
+                               4B6ABE8E0C199299C26E4B5977886B71 /* SnapKit.release.xcconfig */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/SnapKit";
+                       sourceTree = "<group>";
+               };
+               8EA7A9F63431873BFF102A07E64CF035 /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               E3B1CECC33970571F4F9AF61CB1D3DCD /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               955D2D4B70444278CFDCF5CF250E2A20 /* Pods */ = {
+                       isa = PBXGroup;
+                       children = (
+                               1BF8BA79F8DEAC3F899EE1DFFF731A01 /* IQKeyboardCore */,
+                               346904CC6058F4E1176842D4FBB1C297 /* IQKeyboardManagerSwift */,
+                               D47F0896C3D08DD5FCAAE3AD09D78D07 /* IQKeyboardNotification */,
+                               FE2569B518EBA4ED83E9AD75F910D0D7 /* IQKeyboardReturnManager */,
+                               B05518A8E4E4C4D4DFF1474C45D525EE /* IQKeyboardToolbar */,
+                               C93D11812BB5D25D8ACDA16CA17BF6A4 /* IQKeyboardToolbarManager */,
+                               5A6A32F0330DE1F0FF6179C5C3799FF3 /* IQTextInputViewNotification */,
+                               DFD394DDF6732B23692437B4AD9ECF1E /* IQTextView */,
+                               FEBA5030F43677046B3656649FBE15ED /* SnapKit */,
+                               BA1DFB9047177FD01B3C29EBE37C8457 /* SocketRocket */,
+                               2C2FAE5EF6DD9554D932D5EFD9116CAF /* Toast-Swift */,
+                       );
+                       name = Pods;
+                       sourceTree = "<group>";
+               };
+               988D9336740C0F448BAA393FDDF28A0C /* Resign */ = {
+                       isa = PBXGroup;
+                       children = (
+                               236C98A9FAEF3200D70937E889092818 /* IQKeyboardManager+Resign.swift */,
+                               6EC73E02165E26ABFCACC677AF94DD8B /* IQKeyboardManager+Resign_Deprecated.swift */,
+                               261E9C437FF6FFF72C01BBB73341409D /* IQKeyboardResignHandler.swift */,
+                               E39AF10B1F50FF70721677FFF69BED27 /* IQKeyboardResignHandler+Internal.swift */,
+                               B704D82F61A7F3E0FF10EBDE953E7E49 /* UIView+Resign.swift */,
+                               12415404E6E70407610188D7ADDC1D02 /* UIView+ResignObjc.swift */,
+                       );
+                       name = Resign;
+                       sourceTree = "<group>";
+               };
+               9A941C126B5B7C383F87BEF24EFD16F1 /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               C688B508E11EFC4D24CB920CAF96B948 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               A4931A6EF436A36B49F767979C6DFC2C /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               CC93FCE609BBB131B2F1C23EEA6B9997 /* IQKeyboardCore.modulemap */,
+                               BFB6F598FCE7D6294584E7334E04ECF2 /* IQKeyboardCore-dummy.m */,
+                               42E3FC1A9F2FBB9AE28FDE3285B70F2C /* IQKeyboardCore-Info.plist */,
+                               7E07F795F5513269A6EA62DE5EE8C187 /* IQKeyboardCore-prefix.pch */,
+                               9F657D2C1582A8BFEADD06E527D796B2 /* IQKeyboardCore-umbrella.h */,
+                               9374F8A0206251FC7979A888F803B656 /* IQKeyboardCore.debug.xcconfig */,
+                               AA485EB92636FB68E91AF3FCC1CE9C5E /* IQKeyboardCore.release.xcconfig */,
+                               8F74E325EE2B99C0C5504B461E558136 /* ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQKeyboardCore";
+                       sourceTree = "<group>";
+               };
+               A76710793188CE18938A1F3AE19BCA99 /* Resources */ = {
+                       isa = PBXGroup;
+                       children = (
+                               643F1AECE038E1886712C3619E367201 /* PrivacyInfo.xcprivacy */,
+                       );
+                       name = Resources;
+                       sourceTree = "<group>";
+               };
+               A8F67839F6044F4381759B3BB49258DA /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               CDD93D5045280AD0FFBB587ADD1D3B83 /* IQKeyboardManagerSwift.modulemap */,
+                               01E23D7305E51271DEFF79A9CADBF926 /* IQKeyboardManagerSwift-dummy.m */,
+                               4AB6723E60A4A0D494C4DCA4686CD3F0 /* IQKeyboardManagerSwift-Info.plist */,
+                               FD07CC20E3828AFE18630B7C25BCCA92 /* IQKeyboardManagerSwift-prefix.pch */,
+                               5C8BDF6ED7A0F1533FC84E97705B2878 /* IQKeyboardManagerSwift-umbrella.h */,
+                               5084335EF29A15EB6C31DFB1ACA15349 /* IQKeyboardManagerSwift.debug.xcconfig */,
+                               5AF0EBE9A79115D36EF40E456919D63B /* IQKeyboardManagerSwift.release.xcconfig */,
+                               DD7D32B2F1F5F83790A39F4CDEBBFF96 /* ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQKeyboardManagerSwift";
+                       sourceTree = "<group>";
+               };
+               B05518A8E4E4C4D4DFF1474C45D525EE /* IQKeyboardToolbar */ = {
+                       isa = PBXGroup;
+                       children = (
+                               C73796DD46B1AEC273D7C44D7E60CDF4 /* Core */,
+                               5173CCD3EAD3FD7627B918D1D542D872 /* Placeholderable */,
+                               13E2B5C1BC359C44AB73F5D24BAFDDD5 /* Resources */,
+                               52A8D4FE846B6E04B566DBAF11B33A13 /* Support Files */,
+                       );
+                       name = IQKeyboardToolbar;
+                       path = IQKeyboardToolbar;
+                       sourceTree = "<group>";
+               };
+               B22E10DCB2F25088E198204D0681E4C7 /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               15FF3E312676449AB12DADDDB8D5C352 /* IQKeyboardNotification.modulemap */,
+                               DA85287A9C3D760A6324EF926C0C44CE /* IQKeyboardNotification-dummy.m */,
+                               C2E377B4F7062BE5BC6007798C6619AD /* IQKeyboardNotification-Info.plist */,
+                               27296D8B66561FF21E0EB354428156C7 /* IQKeyboardNotification-prefix.pch */,
+                               822DD0DAF7E4428BCCDFE28EAD683ADD /* IQKeyboardNotification-umbrella.h */,
+                               87F05B4E0307C30EB4FC212724C8F157 /* IQKeyboardNotification.debug.xcconfig */,
+                               1AB8D5FD6175CD8FCC7153B71E6DD77A /* IQKeyboardNotification.release.xcconfig */,
+                               B7EC4834CE090AEAE5858B4D8B4513C7 /* ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/IQKeyboardNotification";
+                       sourceTree = "<group>";
+               };
+               B3257EA856A4DD50C7E8688B28071AAA /* Pods-Example */ = {
+                       isa = PBXGroup;
+                       children = (
+                               FF3B6C922ADF7DB53066B95C9359B445 /* Pods-Example.modulemap */,
+                               2C45BE81EF6A9A12E115F2EDB69FC7D7 /* Pods-Example-acknowledgements.markdown */,
+                               D5EC7B9244C6E5B0C7776ADA35992A5D /* Pods-Example-acknowledgements.plist */,
+                               A6BD2261427B29C50F84843B6BAB7DEA /* Pods-Example-dummy.m */,
+                               73D26C4F196C661EA1DB04BCC2471A24 /* Pods-Example-frameworks.sh */,
+                               90A0A417BB33C9C0B15A1946762E0142 /* Pods-Example-Info.plist */,
+                               93B05AAE9D91B32B46928A2293611FF4 /* Pods-Example-umbrella.h */,
+                               455A2446E1A8F92123FBE90A1D4B8D0B /* Pods-Example.debug.xcconfig */,
+                               B3AA4CA7BB409A5191DBD08356FE703A /* Pods-Example.release.xcconfig */,
+                       );
+                       name = "Pods-Example";
+                       path = "Target Support Files/Pods-Example";
+                       sourceTree = "<group>";
+               };
+               BA1DFB9047177FD01B3C29EBE37C8457 /* SocketRocket */ = {
+                       isa = PBXGroup;
+                       children = (
+                               306B6BBB2D0B4D417ADD4B82D7D51E82 /* NSRunLoop+SRWebSocket.h */,
+                               5FB6A208FD72153F040D4E1354F225B4 /* NSRunLoop+SRWebSocket.m */,
+                               0AE37E30F693ED15CA31B520ED420454 /* NSRunLoop+SRWebSocketPrivate.h */,
+                               3187DDFEE4C490953B2AEF7B0D19EB1B /* NSURLRequest+SRWebSocket.h */,
+                               ED7286BA89901CA1D622A1FCF81E718C /* NSURLRequest+SRWebSocket.m */,
+                               FA41F5D42C8280BA202FDE26BDBDFFA3 /* NSURLRequest+SRWebSocketPrivate.h */,
+                               5EF0C08E9D339F2CB75ED0C9E7FA2C0B /* SocketRocket.h */,
+                               6A3DB74B2C40BCD9F3AFA585DA322FF5 /* SRConstants.h */,
+                               A284951838ACA1015F31DBE6C5A8D45F /* SRConstants.m */,
+                               2582EC469D9940C7AAE3F903A495E86A /* SRDelegateController.h */,
+                               B4BBB6B50C15DFF1221CD8E66DC2D354 /* SRDelegateController.m */,
+                               E7EE2526E40B99B0F243808A2396A01C /* SRError.h */,
+                               77195404B1F7ADCD8B3008B1B89F5C03 /* SRError.m */,
+                               F2183FF2315FBF68B5F334EC6EB19A9B /* SRHash.h */,
+                               109E37988FF06586D32321CEA99162B0 /* SRHash.m */,
+                               FB26ACEBA0181227271430FB01A76848 /* SRHTTPConnectMessage.h */,
+                               ED22317A1312CBBA0134A8E449ABD201 /* SRHTTPConnectMessage.m */,
+                               26FE696F5243F520CB872AC051139FE5 /* SRIOConsumer.h */,
+                               B5D1545C4C0C2474FD103EFECB90E9C5 /* SRIOConsumer.m */,
+                               8C4CE911087AC8260002E6859821FAF0 /* SRIOConsumerPool.h */,
+                               A6C0BF00B3D547B50DBE54D99A1307F4 /* SRIOConsumerPool.m */,
+                               AF5E93556B3B98CA5218F3B9E49304F6 /* SRLog.h */,
+                               F930ACB6AC5D06295D698ED0249EB0AB /* SRLog.m */,
+                               CEA0C9AAC08B9E0D20DE8BC894AE3FDE /* SRMutex.h */,
+                               D7EF3525F706753F05EA05BD1819EC4E /* SRMutex.m */,
+                               B278701FAF564A3D25B8F87CCDB798D6 /* SRPinningSecurityPolicy.h */,
+                               0AF7DA075D6BD7E141707379E62BFA63 /* SRPinningSecurityPolicy.m */,
+                               32080BC56EEB26340C6292BA94F068B6 /* SRProxyConnect.h */,
+                               C3F49C31FFD05F4734B464D5C31979FB /* SRProxyConnect.m */,
+                               D1B2801FD44E489C5B7F202C13D651F2 /* SRRandom.h */,
+                               68443C8F28AD901E531D6BFA7559C683 /* SRRandom.m */,
+                               43CBF3C99F0BF342AEE8D7C7BE945B62 /* SRRunLoopThread.h */,
+                               8609C41722C0D97335DBF43B1CE7AB03 /* SRRunLoopThread.m */,
+                               C33C375328643D5A9A1D1EA02C88D419 /* SRSecurityPolicy.h */,
+                               6839FC9EB46E8CB05E17C35E5A5B579F /* SRSecurityPolicy.m */,
+                               21E9444EE5839429C60E9A16651BAD78 /* SRSIMDHelpers.h */,
+                               50A2B3566A43C15186D3A1D9F91DB662 /* SRSIMDHelpers.m */,
+                               27DA2684B87B3639C3D3D439F177E219 /* SRURLUtilities.h */,
+                               390BB9902E7A26E5A753B9CF32673BE9 /* SRURLUtilities.m */,
+                               D389D10DEC7EB9B503CD45CE58851CA6 /* SRWebSocket.h */,
+                               95BCD7B08FF0A2A4F9B0A36B92688E27 /* SRWebSocket.m */,
+                               386ACAC75067BB6189F2C50B03C8280B /* Support Files */,
+                       );
+                       name = SocketRocket;
+                       path = SocketRocket;
+                       sourceTree = "<group>";
+               };
+               C73796DD46B1AEC273D7C44D7E60CDF4 /* Core */ = {
+                       isa = PBXGroup;
+                       children = (
+                               4D6EF89B651DCBED1F5A7FA5D36D1FA6 /* IQBarButtonItem.swift */,
+                               14A61C146CFCDB5CEC8508DC60360819 /* IQBarButtonItemConfiguration.swift */,
+                               9939F486FEF106F98BDD0806CA8E0624 /* IQInvocation.swift */,
+                               63CAFAB9111F6F5AAEFD9E00CD0AF892 /* IQKeyboardToolbar.swift */,
+                               BF60B19D2E8B68520E5121EFFF5A7D4B /* IQKeyboardToolbarPlaceholderConfiguration.swift */,
+                               2E8E02D90547D6DBD75A856D8A4E1275 /* IQTitleBarButtonItem.swift */,
+                               9976447B92E50DDDCA64DBDE5A47FD7F /* UIView+IQKeyboardExtension.swift */,
+                               7F565A673CEEF3B818D7A75F2A2EE8B0 /* UIView+IQKeyboardExtensionDeprecated.swift */,
+                               6A599D5DDFD46F7296A5F93623AB6C3A /* UIView+IQKeyboardExtensionObjc.swift */,
+                       );
+                       name = Core;
+                       sourceTree = "<group>";
+               };
+               C93D11812BB5D25D8ACDA16CA17BF6A4 /* IQKeyboardToolbarManager */ = {
+                       isa = PBXGroup;
+                       children = (
+                               7594A52F0B7E0AD0D9F26BE8026E1E4C /* Array+Sort.swift */,
+                               484ECEC55CB9E98BAF0AE020F8FFF767 /* IQDeepResponderContainerView.swift */,
+                               44AFC022F6D6DD0DF30E10F9B7C4615A /* IQKeyboardToolbarConfiguration.swift */,
+                               BC713814A822ABA18A07C72E6B97AE04 /* IQKeyboardToolbarConstants.swift */,
+                               BB176716E9339D1CA456C696313236FE /* IQKeyboardToolbarManager.swift */,
+                               782D18DB9D0B7B74F8613026BAD77E86 /* IQKeyboardToolbarManager+Action.swift */,
+                               3F992A0DC4578F2D62CB095A497114CC /* IQKeyboardToolbarManager+Debug.swift */,
+                               BF4BC9A0614A1C63539C14C08655781F /* IQKeyboardToolbarManager+Deprecated.swift */,
+                               158193B636D7824993DB68D81AE2C233 /* IQKeyboardToolbarManager+Internal.swift */,
+                               BA718E8C5B46720F8012D7471BC6BF37 /* IQKeyboardToolbarManager+Toolbar.swift */,
+                               97D19ACC9A79A3CF24DA377E12303E12 /* UIView+Responders.swift */,
+                               CEAD5B92B7CF2B0746297208D610D3CD /* UIView+RespondersObjc.swift */,
+                               472C5FB976462E83207651E16BEEAA5D /* Resources */,
+                               659362BF40FCF9635ED3C52F96CC6133 /* Support Files */,
+                       );
+                       name = IQKeyboardToolbarManager;
+                       path = IQKeyboardToolbarManager;
+                       sourceTree = "<group>";
+               };
+               CDD0B85A0330B1E5B6A1922E992D6D74 /* Appearance */ = {
+                       isa = PBXGroup;
+                       children = (
+                               EF4B79F3BC3201907DE2B7A2671776C1 /* IQKeyboardAppearanceConfiguration.swift */,
+                               E25ABD3C4935A40132346F656CA1AA7C /* IQKeyboardAppearanceManager.swift */,
+                               6381011924A059A30C85325FB30E74A7 /* IQKeyboardAppearanceManager+Internal.swift */,
+                               A44F945B3203BCA4B178E49ED53E5391 /* IQKeyboardManager+Appearance.swift */,
+                               FDD0C3C29384D3EEBCB4BE346B1CA890 /* IQKeyboardManager+Appearance_Deprecated.swift */,
+                       );
+                       name = Appearance;
+                       sourceTree = "<group>";
+               };
+               CF1408CF629C7361332E53B88F7BD30C = {
+                       isa = PBXGroup;
+                       children = (
+                               9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
+                               D68CA58901FBF589D75F5E40F1EAF5BA /* Frameworks */,
+                               955D2D4B70444278CFDCF5CF250E2A20 /* Pods */,
+                               6A6ACDADD484E61C0C86AAAC23AA5774 /* Products */,
+                               1D7583ECA74F66EE34F3E9D627C627BA /* Targets Support Files */,
+                       );
+                       sourceTree = "<group>";
+               };
+               D1DA56D0B201AACDCF6837C820268F5C /* IQKeyboardToolbarManager */ = {
+                       isa = PBXGroup;
+                       children = (
+                               6A737607DB763EBB681D8D0F6E6AB5FB /* IQKeyboardManager+ToolbarManager.swift */,
+                               C61F58870F6E8F6EEF25FA9A6A0E7F60 /* IQKeyboardManager+ToolbarManagerDeprecated.swift */,
+                       );
+                       name = IQKeyboardToolbarManager;
+                       sourceTree = "<group>";
+               };
+               D47F0896C3D08DD5FCAAE3AD09D78D07 /* IQKeyboardNotification */ = {
+                       isa = PBXGroup;
+                       children = (
+                               C0B11EBC98CF5A275C2F8077CDEA1F18 /* IQKeyboardInfo.swift */,
+                               E6A14C9A838BD693FFDCAF82F4D5604A /* IQKeyboardNotification.swift */,
+                               4E55C56B4EBD419565958D777C1D742F /* Resources */,
+                               B22E10DCB2F25088E198204D0681E4C7 /* Support Files */,
+                       );
+                       name = IQKeyboardNotification;
+                       path = IQKeyboardNotification;
+                       sourceTree = "<group>";
+               };
+               D68CA58901FBF589D75F5E40F1EAF5BA /* Frameworks */ = {
+                       isa = PBXGroup;
+                       children = (
+                               1FCA4E5DDAB2C58C6C3DA814626EF4AF /* iOS */,
+                       );
+                       name = Frameworks;
+                       sourceTree = "<group>";
+               };
+               D9C1D5F2F67176B3E300A9D87ACBD68C /* Support Files */ = {
+                       isa = PBXGroup;
+                       children = (
+                               E1CAF7BAA0421C27EFE212A343F56870 /* ResourceBundle-Toast-Swift-Toast-Swift-Info.plist */,
+                               BC06E9DFB77603B36FDA218B323243F1 /* Toast-Swift.modulemap */,
+                               B98BCBD470DE1E0FC19C5E1F3AF37195 /* Toast-Swift-dummy.m */,
+                               EAED633C414062FCB78BD8A5896433FC /* Toast-Swift-Info.plist */,
+                               61AD3899C2D649897E11DA65A33ABCEE /* Toast-Swift-prefix.pch */,
+                               3D0CA09E0900EA77648A05D608CBA29F /* Toast-Swift-umbrella.h */,
+                               02E139B151EDFA1F4F63EA119D2269C7 /* Toast-Swift.debug.xcconfig */,
+                               79E6154EEE25D08664ACFE66C69DDFA0 /* Toast-Swift.release.xcconfig */,
+                       );
+                       name = "Support Files";
+                       path = "../Target Support Files/Toast-Swift";
+                       sourceTree = "<group>";
+               };
+               DFD394DDF6732B23692437B4AD9ECF1E /* IQTextView */ = {
+                       isa = PBXGroup;
+                       children = (
+                               1E2BADF249E4A558D7EE5BB1077C1DE1 /* IQTextView.swift */,
+                               B1F86119EB8AFCE72C0BA2356BBA4C46 /* IQTextView+Placeholderable.swift */,
+                               28309F6F20D52ED4CD8FF99A9C1660E7 /* Resources */,
+                               4C6F9E06DF0DA1DF8AC4B116BBF4C9C0 /* Support Files */,
+                       );
+                       name = IQTextView;
+                       path = IQTextView;
+                       sourceTree = "<group>";
+               };
+               FE2569B518EBA4ED83E9AD75F910D0D7 /* IQKeyboardReturnManager */ = {
+                       isa = PBXGroup;
+                       children = (
+                               224FAFA7B0169BBAAFD0FA422D7D11A6 /* IQKeyboardReturnManager.swift */,
+                               FB23C93E47AFBF1FA651D132F7AC06E2 /* IQKeyboardReturnManager+UITextFieldDelegate.swift */,
+                               66E229F790E827392A80B7F4C7A6110F /* IQKeyboardReturnManager+UITextViewDelegate.swift */,
+                               10288C630688257B185941E1EA55E346 /* IQTextInputViewInfoModel.swift */,
+                               8EA7A9F63431873BFF102A07E64CF035 /* Resources */,
+                               1D63BF5EA7169C494BFD74466E0A946E /* Support Files */,
+                       );
+                       name = IQKeyboardReturnManager;
+                       path = IQKeyboardReturnManager;
+                       sourceTree = "<group>";
+               };
+               FEBA5030F43677046B3656649FBE15ED /* SnapKit */ = {
+                       isa = PBXGroup;
+                       children = (
+                               47BC329529726FFACA942239310E3841 /* Constraint.swift */,
+                               E293311AF50DC30E5B7F7D2D91BEB28A /* ConstraintAttributes.swift */,
+                               972CC8A48122693582F02385A70853A0 /* ConstraintConfig.swift */,
+                               C23ABFD4CEF6F11C0094E61729745DE3 /* ConstraintConstantTarget.swift */,
+                               FF4B96374C0DB9D56AB95C3D5A31B152 /* ConstraintDescription.swift */,
+                               0EE50CC6D98E37DA330EADC9F9C949F0 /* ConstraintDirectionalInsets.swift */,
+                               58E0237741E33CAFB3DB96DAA7559910 /* ConstraintDirectionalInsetTarget.swift */,
+                               CFCB22B3ED6C05251CBD3059AAE51013 /* ConstraintDSL.swift */,
+                               6DFE571CD6A634198545BB1149A5399C /* ConstraintInsets.swift */,
+                               92C5C459A1F7BF6872A58A16B7092803 /* ConstraintInsetTarget.swift */,
+                               080D923BC81BB12EE5B738187A72A0D4 /* ConstraintItem.swift */,
+                               D2793937CF93115D3117A82FB873124B /* ConstraintLayoutGuide.swift */,
+                               45E554E7AE314B29D9C07A10667261BE /* ConstraintLayoutGuide+Extensions.swift */,
+                               84BBB0405889161CCDDCD4F166723CBF /* ConstraintLayoutGuideDSL.swift */,
+                               D8D8726D60E6EF3E455768E64432DA57 /* ConstraintLayoutSupport.swift */,
+                               A55BC45618B737DBC6885D98DC8C9C0C /* ConstraintLayoutSupportDSL.swift */,
+                               D4C8C6089794ACE3010224A9FB1D90EA /* ConstraintMaker.swift */,
+                               FB474AD377D72ECDF638D46A73B7D687 /* ConstraintMakerEditable.swift */,
+                               37445197B6E56B3F3CA861A7F21F1C41 /* ConstraintMakerExtendable.swift */,
+                               24926E8158D8FAD9BE42C760B3154B55 /* ConstraintMakerFinalizable.swift */,
+                               9101BAF3027E387E34B0301BE000FA50 /* ConstraintMakerPrioritizable.swift */,
+                               C8BFDD7C500F5D6D58D212CB15B52E08 /* ConstraintMakerRelatable.swift */,
+                               529559A67714BC64192FD9BF92B33312 /* ConstraintMakerRelatable+Extensions.swift */,
+                               750817E69AAE97D1AF5F958FC5904BF2 /* ConstraintMultiplierTarget.swift */,
+                               B77F72F31D132841951EF8E4FA67360A /* ConstraintOffsetTarget.swift */,
+                               6058A4E7C2EAB9B01A8DBB5AAD7E72A2 /* ConstraintPriority.swift */,
+                               B932A928D72C73FB59FC964A82AC2723 /* ConstraintPriorityTarget.swift */,
+                               CFB853532F59E8A63D1C93202280CEE9 /* ConstraintRelatableTarget.swift */,
+                               363F0A017C453E3DC084A7B5BDB87911 /* ConstraintRelation.swift */,
+                               A8BBDD1BF37BF58D4C467C1D1F21D462 /* ConstraintView.swift */,
+                               C1C674397D453B6D18F9DE46BC55B6FF /* ConstraintView+Extensions.swift */,
+                               C53921D76AE7ECC63293C2263C9325A0 /* ConstraintViewDSL.swift */,
+                               B8A90925F3434F73BD6A036480A5A473 /* Debugging.swift */,
+                               5C0366C8DAD8762352B37EDB4DD62E2E /* LayoutConstraint.swift */,
+                               DD6C692550BC0661BA84378E58F6BA8A /* LayoutConstraintItem.swift */,
+                               AEF5BBB7C4ACF7C06BBD262B6C1145CE /* Typealiases.swift */,
+                               E54219744D41CC6C6674908699602DD9 /* UILayoutSupport+Extensions.swift */,
+                               9A941C126B5B7C383F87BEF24EFD16F1 /* Resources */,
+                               75159EE7B37E3F28B11793B290D99D4D /* Support Files */,
+                       );
+                       name = SnapKit;
+                       path = SnapKit;
+                       sourceTree = "<group>";
+               };
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+               060405D4024056E8E8E0AAAA43BAE414 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               860017D588B23C12B08A3C4390BAEA56 /* IQKeyboardNotification-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               122D78F42E79267651C92A08FF3CBF82 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               64365C2671D733D3AAE1E25684E73255 /* Pods-Example-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3B1AF30CF9C8E42E24DA5BEA63D1D465 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               FE0D3260BF27D388B0200F1AC8151619 /* IQKeyboardCore-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               448E74EF9D17B3DCC5432BB6215BCAB0 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               0C7E48CC6391092D8F5B4341E1EE7485 /* Toast-Swift-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               5800FFAC29D42F17B23D62063D737B73 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               2A1DE175A760E9F7CF7AF711BF549BC9 /* IQKeyboardReturnManager-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               5B1500FE995B9224E0AF0B42CE93C03B /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               57C4F6EFB30DDD14E960AC2D6B34F904 /* SnapKit-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               82711643BCFA0EA6AA2167CCA71932C5 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               F1E1B1AC67AA1B21E1AF8D3AB5C9849C /* IQTextInputViewNotification-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               A440384545772625048C36C84242D128 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               B543A1E1882CAEA19589891FCE2D17EA /* NSRunLoop+SRWebSocket.h in Headers */,
+                               3BB0B5D924BE769E95E64A5E6FC1675D /* NSRunLoop+SRWebSocketPrivate.h in Headers */,
+                               56851E11140A140A15088A41DC4C33BD /* NSURLRequest+SRWebSocket.h in Headers */,
+                               7174D48AADABCBE6FC53185C5442B952 /* NSURLRequest+SRWebSocketPrivate.h in Headers */,
+                               07632D281C5DED61CC7866B079BC9D2C /* SocketRocket.h in Headers */,
+                               5B67445AE2F3934BDA08D407BBA3028B /* SocketRocket-umbrella.h in Headers */,
+                               C92D93F48E74B79C08A2C5B81B68FD7D /* SRConstants.h in Headers */,
+                               EC8DB2CC9791B7DC686DCC78EFBB56C5 /* SRDelegateController.h in Headers */,
+                               65E5693A457A8AEE3E5758075D1E2792 /* SRError.h in Headers */,
+                               F6E948E2688CC08D3843DAA74F6328E8 /* SRHash.h in Headers */,
+                               DF011D18EBB28ECE459B6D96D3E460D8 /* SRHTTPConnectMessage.h in Headers */,
+                               9A3B9C740BC8FE0500132251551E5BE7 /* SRIOConsumer.h in Headers */,
+                               44EFA9A76932F81582D03076A8346A4B /* SRIOConsumerPool.h in Headers */,
+                               89CAC1E5DC5833EE630A652957D253A7 /* SRLog.h in Headers */,
+                               782981022BF319DFD85AE89A392639A2 /* SRMutex.h in Headers */,
+                               04986EEC139DC7C45DAB58056315FDC8 /* SRPinningSecurityPolicy.h in Headers */,
+                               6464C345447C71904DA3706AACA3F55D /* SRProxyConnect.h in Headers */,
+                               C36214D8311B615CDA115276934926DC /* SRRandom.h in Headers */,
+                               939EE0216FC02064B2F5894E87628182 /* SRRunLoopThread.h in Headers */,
+                               2B7184BD487141C385B3CC3F3984AA55 /* SRSecurityPolicy.h in Headers */,
+                               5DFD87881941225F0A5EAE64EB247708 /* SRSIMDHelpers.h in Headers */,
+                               57A34E19799F03EB53206496FD362449 /* SRURLUtilities.h in Headers */,
+                               444E95921E2BDCE7512867EAA1A6B381 /* SRWebSocket.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               C08BBEDF18AE8DF38ABA50C42B1D2E2C /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               9298CB7C2E4AC4E751E535DA15BEEFA8 /* IQKeyboardManagerSwift-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               C88A56468418AB0D810EF16B5B8E485D /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               7BA968278DAB1050E34D0B65E56E5846 /* IQKeyboardToolbar-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               E0881C44D4CBAF3C805B0C76FC20E95E /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               C4CC8FC7015DCE5912B7607AFB238EFE /* Pods-DeepChordsSdk-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               ECC96828C08E355DF2C5A52C3625D7B2 /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               A92367989121B0877023A09BF2F96F15 /* IQKeyboardToolbarManager-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               F3A1579A28F2237B19E04D5A1428811C /* Headers */ = {
+                       isa = PBXHeadersBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               8667EBBAD4365F7E2DECFE792D488128 /* IQTextView-umbrella.h in Headers */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+               020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = D7FB8C3DDF4703D4590435540A2233A9 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager" */;
+                       buildPhases = (
+                               ECC96828C08E355DF2C5A52C3625D7B2 /* Headers */,
+                               1A398E6B367B205FAAAE4088C36F8875 /* Sources */,
+                               B0A1DA8C8E42CD15049F6F2D79726D7D /* Frameworks */,
+                               D10E28E3B3D225E4049054F6C994854A /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               806811E474B5E127D48FE9CA32DCFB26 /* PBXTargetDependency */,
+                               FDF0C9122AFE5F4537D84EB5B5EA2535 /* PBXTargetDependency */,
+                               F7852222FD7DD0B21BC78B245F2045A0 /* PBXTargetDependency */,
+                       );
+                       name = IQKeyboardToolbarManager;
+                       productName = IQKeyboardToolbarManager;
+                       productReference = FA727BF5D9541C98C22C9ECC911576E2 /* IQKeyboardToolbarManager */;
+                       productType = "com.apple.product-type.framework";
+               };
+               0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = AC758F51A954F3478B41C0B2B845766B /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager" */;
+                       buildPhases = (
+                               5800FFAC29D42F17B23D62063D737B73 /* Headers */,
+                               7D875C37EC81C736C5CCCE65FA1343A6 /* Sources */,
+                               9688A049F13521CC698EF57654CF2443 /* Frameworks */,
+                               E733192D0FA619FCCD70BD62F5A6A0F4 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               1F9AF4725D5847BEA5D8B724D1A3B414 /* PBXTargetDependency */,
+                               9BE1A2A7D5E6D44833CB0C78085D940D /* PBXTargetDependency */,
+                       );
+                       name = IQKeyboardReturnManager;
+                       productName = IQKeyboardReturnManager;
+                       productReference = 15848DEC7727A809830E7F6FC1B6CE0F /* IQKeyboardReturnManager */;
+                       productType = "com.apple.product-type.framework";
+               };
+               0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 95C096ADDB6F7FCAFFA3FBB358C75EF3 /* Build configuration list for PBXNativeTarget "Pods-Example" */;
+                       buildPhases = (
+                               122D78F42E79267651C92A08FF3CBF82 /* Headers */,
+                               85B610DD95380C789F1D31249548827B /* Sources */,
+                               3683C5D0C8F465D221926E5B41E0B565 /* Frameworks */,
+                               2E3D44000BD1509E439B9C80D2F2E273 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               AEFFF3B21972CDA23989650CB0D06DC1 /* PBXTargetDependency */,
+                               F2792ADD73FF2795D46955194D6DB5FA /* PBXTargetDependency */,
+                               0A6F859D7948477715DBD4333CD962F5 /* PBXTargetDependency */,
+                               1EE6EF0BEC589B1038459A693177F2FE /* PBXTargetDependency */,
+                               6A012670364ED3DE97C5B8D570417F17 /* PBXTargetDependency */,
+                               54C3CEF0CE5F2ADC19CF09FA97EA2FCD /* PBXTargetDependency */,
+                               77F02D151BFA0BF2A8184E8F7040E02E /* PBXTargetDependency */,
+                               7C197C0E14E357C0482C5CECC1F7DAE7 /* PBXTargetDependency */,
+                               FC49926069485756B05C5F53750496AD /* PBXTargetDependency */,
+                               9143EFF5B329D660A0398F7391E5D055 /* PBXTargetDependency */,
+                               3E3639BC049B1894293B33F5B52D836A /* PBXTargetDependency */,
+                       );
+                       name = "Pods-Example";
+                       productName = Pods_Example;
+                       productReference = 1F667CC0E19EAF34E5A4119E2121F585 /* Pods-Example */;
+                       productType = "com.apple.product-type.framework";
+               };
+               12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = D8BBE9E3900D941FF67F5A73A1AECA11 /* Build configuration list for PBXNativeTarget "IQTextView" */;
+                       buildPhases = (
+                               F3A1579A28F2237B19E04D5A1428811C /* Headers */,
+                               EDF3D1BC9513EF41FD61EEC958BC7E9C /* Sources */,
+                               B4BF16B463F2EC49D7CBC102A2936235 /* Frameworks */,
+                               9E7C5C7D75FB952C9859F404E09D0DBE /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               9AB32C8C254D84A755461731E5E31837 /* PBXTargetDependency */,
+                               486058C9A622B4968F720109A1CB425D /* PBXTargetDependency */,
+                       );
+                       name = IQTextView;
+                       productName = IQTextView;
+                       productReference = 0DFD4541FF9DAA31A2FC2A7F6D03ED22 /* IQTextView */;
+                       productType = "com.apple.product-type.framework";
+               };
+               1948D0B63D2CF6A48E18B0B292BC6091 /* SocketRocket */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 698D46877F77FCD24D7D79E95A4A06D5 /* Build configuration list for PBXNativeTarget "SocketRocket" */;
+                       buildPhases = (
+                               A440384545772625048C36C84242D128 /* Headers */,
+                               5B14979992C9DB89400DDFB2EB8B8ECB /* Sources */,
+                               796567F81D938DA74DF71A2AFF3F8F3D /* Frameworks */,
+                               A540247F97F33E3F24D6C4B41FFA27DB /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = SocketRocket;
+                       productName = SocketRocket;
+                       productReference = 85A01882ED06DFEA2E0CE78BCDB204A7 /* SocketRocket */;
+                       productType = "com.apple.product-type.framework";
+               };
+               19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 80CE967CAA1D35721519F892BAF7A19B /* Build configuration list for PBXNativeTarget "SnapKit" */;
+                       buildPhases = (
+                               5B1500FE995B9224E0AF0B42CE93C03B /* Headers */,
+                               F7AC6792C89443C7B212A06E810BAB97 /* Sources */,
+                               33428AC36668E3ED52DB70316F843FB8 /* Frameworks */,
+                               1DEDF411E550D85A1218E1655456A9CD /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               032EC8AE715F3D13AD519BE9CA03294E /* PBXTargetDependency */,
+                       );
+                       name = SnapKit;
+                       productName = SnapKit;
+                       productReference = 979486118B3E90C08386079D57962701 /* SnapKit */;
+                       productType = "com.apple.product-type.framework";
+               };
+               283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 0DA28833D7A042B27FBAEDF85A1C1D74 /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification" */;
+                       buildPhases = (
+                               82711643BCFA0EA6AA2167CCA71932C5 /* Headers */,
+                               64CD60E8B295A57BEBDD5D87A91B92C2 /* Sources */,
+                               51FB4B943D35F3E908360703B96C7E25 /* Frameworks */,
+                               B13E49C52D1F4CA576AECF646E227048 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               0BA497932D68F052CFDA60CB4325E823 /* PBXTargetDependency */,
+                               C2F5904EDA280BF704E19BEC7E450D7C /* PBXTargetDependency */,
+                       );
+                       name = IQTextInputViewNotification;
+                       productName = IQTextInputViewNotification;
+                       productReference = 06E5B413FEA5A600D76636DA132F8FB9 /* IQTextInputViewNotification */;
+                       productType = "com.apple.product-type.framework";
+               };
+               2B8FF445A5162845FAB9EC00FC92B694 /* IQKeyboardNotification-IQKeyboardNotification */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 2FC9855C948A66726D61C1BF2072066A /* Build configuration list for PBXNativeTarget "IQKeyboardNotification-IQKeyboardNotification" */;
+                       buildPhases = (
+                               3C441F0A74335E026B3A49DF02ECF4CE /* Sources */,
+                               524D81F2C5CE61FB9EB4A47C9DEE4C1E /* Frameworks */,
+                               6FB0C9C708A89616971C79B2B1BB4FD5 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQKeyboardNotification-IQKeyboardNotification";
+                       productName = IQKeyboardNotification;
+                       productReference = 120BD4C670EF00F4D5A40AA4B863A7AE /* IQKeyboardNotification-IQKeyboardNotification */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               4502C7427440BEB17A50C0BF6E638A85 /* IQTextInputViewNotification-IQTextInputViewNotification */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = BA50FBEF420279D7BDB90421B1103569 /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification-IQTextInputViewNotification" */;
+                       buildPhases = (
+                               3C68A4C08DF19233949A87717EEB487B /* Sources */,
+                               D9611FA61C59D2592877A687EEBEEFE4 /* Frameworks */,
+                               53F78ACD922DFE5F07BB53AF35B10C1B /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQTextInputViewNotification-IQTextInputViewNotification";
+                       productName = IQTextInputViewNotification;
+                       productReference = F956E149F5B195BB7833F97FC6211AE8 /* IQTextInputViewNotification-IQTextInputViewNotification */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               57C07B65DFE17EDE1FBA00A59C380215 /* Pods-DeepChordsSdk */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 49D80946082E3E53F4077E15D8887408 /* Build configuration list for PBXNativeTarget "Pods-DeepChordsSdk" */;
+                       buildPhases = (
+                               E0881C44D4CBAF3C805B0C76FC20E95E /* Headers */,
+                               B559610B7522BD1394961D290D7F9F24 /* Sources */,
+                               D603B521417D6EFBEB7EAECC9C431345 /* Frameworks */,
+                               51DCE991AF37B3EEABE23F0A727B58A0 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               DDA643E4BF2CFF13D6B0D25A5C59AB5F /* PBXTargetDependency */,
+                       );
+                       name = "Pods-DeepChordsSdk";
+                       productName = Pods_DeepChordsSdk;
+                       productReference = 06FEEB0FA2AA89DF42A1C6525F644FBF /* Pods-DeepChordsSdk */;
+                       productType = "com.apple.product-type.framework";
+               };
+               7C5613175BBC4BF67E36DB4FBEBC01D0 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 9E4E9D837E21217746DEB582B898D487 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager-IQKeyboardToolbarManager" */;
+                       buildPhases = (
+                               93B28B68B9253146A5A3760F7F07BAB5 /* Sources */,
+                               2BE4574EA7A2208A3273A02C5D2F1D1B /* Frameworks */,
+                               C8DC5880AFA70136503A77EF1FA12E8B /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager";
+                       productName = IQKeyboardToolbarManager;
+                       productReference = 80A40EDA3AF0499BDBCFF09467BB49AD /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               88810798DA63A2F6611B0970EA276DEC /* IQKeyboardReturnManager-IQKeyboardReturnManager */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 08CCC0BB4F7D4BA07752DF404F6EDD9A /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager-IQKeyboardReturnManager" */;
+                       buildPhases = (
+                               4E2755E9D46C6DFDCFEB8FB5461370B2 /* Sources */,
+                               5C50EB2041FA8E3A1BB9E243091C260E /* Frameworks */,
+                               648156F3F654BAD048DC31929DADADD3 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQKeyboardReturnManager-IQKeyboardReturnManager";
+                       productName = IQKeyboardReturnManager;
+                       productReference = 110BD425B6CAD6801539E2C6AB6E0662 /* IQKeyboardReturnManager-IQKeyboardReturnManager */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 2D29A227B6A83F5A542054A8A8043BAA /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */;
+                       buildPhases = (
+                               8BEB91B4B898532A40DB8A8E4B9A7792 /* Sources */,
+                               4F320E16D10A7BE9185BA7C5A5CCDA43 /* Frameworks */,
+                               174BF058335E0D9E0D5AE8280994DE37 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "SnapKit-SnapKit_Privacy";
+                       productName = SnapKit_Privacy;
+                       productReference = B9DCB5EC0B1CDADD221717CADDF62359 /* SnapKit-SnapKit_Privacy */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = FD573F16CD31603388EC2DE46509F450 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */;
+                       buildPhases = (
+                               5760F041F8E34852DB231732150718DE /* Sources */,
+                               D7208CA103D7DAE87F900A6B91736DCC /* Frameworks */,
+                               47EBE3AE692A6D5A8D76F3E9294A02F6 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift";
+                       productName = IQKeyboardManagerSwift;
+                       productReference = 8D8069D3964814114ACEC3084C010B59 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 7B6A2B3DDE303A370FD2A5C8DB9C6E2D /* Build configuration list for PBXNativeTarget "IQKeyboardNotification" */;
+                       buildPhases = (
+                               060405D4024056E8E8E0AAAA43BAE414 /* Headers */,
+                               536076B1DBBF070DAA25A21BCE546B3C /* Sources */,
+                               FBA90047961BDAD70FDA139EC0C30DD0 /* Frameworks */,
+                               3F90A77AEBBD3ABB426A427B522E1CA7 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               BAE9291352BA3C02DCD824BD9455EEFB /* PBXTargetDependency */,
+                       );
+                       name = IQKeyboardNotification;
+                       productName = IQKeyboardNotification;
+                       productReference = FEF9AC89E9C4BD37AC0AB78B535D1CFC /* IQKeyboardNotification */;
+                       productType = "com.apple.product-type.framework";
+               };
+               A6602BCAA6F4F932A586C41D0B7E019C /* IQTextView-IQTextView */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = D2E3CA4A5A5255636741A362E4F6BCF7 /* Build configuration list for PBXNativeTarget "IQTextView-IQTextView" */;
+                       buildPhases = (
+                               6BA8B3ED1069309303992AA48F45596A /* Sources */,
+                               F94D8D7F47FD316BA431BF216418ADF4 /* Frameworks */,
+                               2F55A6F40CBE52B1DAF28461F9E6E647 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQTextView-IQTextView";
+                       productName = IQTextView;
+                       productReference = 847044E56CBBCE1235A6F3CEF3F9F607 /* IQTextView-IQTextView */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               B247F77A0CD5E19C8187A9BA1EB58C09 /* IQKeyboardToolbar-IQKeyboardToolbar */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 7468FF21977574A694627CBF4D7DEC53 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar-IQKeyboardToolbar" */;
+                       buildPhases = (
+                               AD7CA0B1355EA84E4891403413E3DFF0 /* Sources */,
+                               743D51EAD768EDE4D4AB7D3C665C7D2E /* Frameworks */,
+                               058186BCF638406CD478B0C025C67642 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQKeyboardToolbar-IQKeyboardToolbar";
+                       productName = IQKeyboardToolbar;
+                       productReference = A16FD016E18EACCF6B23F219F2E236FE /* IQKeyboardToolbar-IQKeyboardToolbar */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 3208C0F97FCB948C4F12E81E25FFEAF9 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift" */;
+                       buildPhases = (
+                               C08BBEDF18AE8DF38ABA50C42B1D2E2C /* Headers */,
+                               27DAA7793549B5BA83223EF9A017BFC2 /* Sources */,
+                               5B8C51C6BFA979E81A28179CCC2C0936 /* Frameworks */,
+                               636F2BA8305CAE418272BBDC04936516 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               0ED2A9B38A71F6850A959089852BDB0A /* PBXTargetDependency */,
+                               CACDD982D78D0FBB2772B70DB888F8B4 /* PBXTargetDependency */,
+                               E4562E3C97AF6073F7BD53F0DA943866 /* PBXTargetDependency */,
+                               443ECCCC8495E109D669FC24E39EE5E7 /* PBXTargetDependency */,
+                               3920F2A30AF54503207FB9C2E5ECC456 /* PBXTargetDependency */,
+                               3BDAAC90F533878935276DA626D3CE8F /* PBXTargetDependency */,
+                       );
+                       name = IQKeyboardManagerSwift;
+                       productName = IQKeyboardManagerSwift;
+                       productReference = A8E950A16D00F649C54FFB30F81D7842 /* IQKeyboardManagerSwift */;
+                       productType = "com.apple.product-type.framework";
+               };
+               B990BD87169C76A3ED3FE8A9258D91A3 /* Toast-Swift */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 9C146D0EDFB76FE1156D655A897B6E94 /* Build configuration list for PBXNativeTarget "Toast-Swift" */;
+                       buildPhases = (
+                               448E74EF9D17B3DCC5432BB6215BCAB0 /* Headers */,
+                               B4A020AF82EF829322C86201C5C31A20 /* Sources */,
+                               F151972567B4508E965D5BFCCF7174A1 /* Frameworks */,
+                               A694D13AD95802E0936531BC8DAEBB89 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               24C84A614B93271254E3B59008326861 /* PBXTargetDependency */,
+                       );
+                       name = "Toast-Swift";
+                       productName = Toast_Swift;
+                       productReference = D6043471C96F93DC41F7DD1E0D7D8B35 /* Toast-Swift */;
+                       productType = "com.apple.product-type.framework";
+               };
+               C344E85893FCDEE5B70436E0A4A3472B /* Toast-Swift-Toast-Swift */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 2DEB3984BC37C7B27AE0091EC7509142 /* Build configuration list for PBXNativeTarget "Toast-Swift-Toast-Swift" */;
+                       buildPhases = (
+                               401AB3CA229BFB5D1BD2B86A0F771029 /* Sources */,
+                               7802B8C3260B2A1D85C8EFC0C6929B18 /* Frameworks */,
+                               9ACC5CFB969DD7CBAFA4FD3471F250AB /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "Toast-Swift-Toast-Swift";
+                       productName = "Toast-Swift";
+                       productReference = 13FD39576595D8A884BF5166065C5236 /* Toast-Swift-Toast-Swift */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               EEE261386011CDF271BE289F73FF5959 /* IQKeyboardCore-IQKeyboardCore */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = D452E33AB7D1DEFA04A6E2B89E1B70BD /* Build configuration list for PBXNativeTarget "IQKeyboardCore-IQKeyboardCore" */;
+                       buildPhases = (
+                               0E2B16FF344B7465603C1647248CC9B3 /* Sources */,
+                               5FCE427163262BB0862B486F5E093C1C /* Frameworks */,
+                               2BA5C599D1605C3C6BB5CD4D9997593F /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                       );
+                       name = "IQKeyboardCore-IQKeyboardCore";
+                       productName = IQKeyboardCore;
+                       productReference = 6E897F35E5E27028AC58B14B552FBC8D /* IQKeyboardCore-IQKeyboardCore */;
+                       productType = "com.apple.product-type.bundle";
+               };
+               F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 6545B5D9E1142254EECDDEFC1408EA74 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar" */;
+                       buildPhases = (
+                               C88A56468418AB0D810EF16B5B8E485D /* Headers */,
+                               3363E27ECA850B6F97ED682F53C6A346 /* Sources */,
+                               D5899CD7924A4C13CEA79F5428436874 /* Frameworks */,
+                               D2C990C2F192D6D365F0DA3D5288AE39 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               5A538984C0CD4E2FF0B2AAA2EF368D0F /* PBXTargetDependency */,
+                               36DB0F3DA574BD5B7448F2F28DFAA125 /* PBXTargetDependency */,
+                       );
+                       name = IQKeyboardToolbar;
+                       productName = IQKeyboardToolbar;
+                       productReference = B4B1A58096F15199A14069C5D6AA1C99 /* IQKeyboardToolbar */;
+                       productType = "com.apple.product-type.framework";
+               };
+               F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = B2130418C2FAD0A1E2FD872758AD609B /* Build configuration list for PBXNativeTarget "IQKeyboardCore" */;
+                       buildPhases = (
+                               3B1AF30CF9C8E42E24DA5BEA63D1D465 /* Headers */,
+                               BF6F1816B0325207E7310ABC9FD05174 /* Sources */,
+                               D07B79E83A18E3018EFA8CE654EF97CB /* Frameworks */,
+                               30325A914D6527C8259F46363D6D7531 /* Resources */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               9CF7EA505D7A9CAA62AFDC4457D80AEF /* PBXTargetDependency */,
+                       );
+                       name = IQKeyboardCore;
+                       productName = IQKeyboardCore;
+                       productReference = FC7F0CF2EA5DF59C59D9995890DA5C47 /* IQKeyboardCore */;
+                       productType = "com.apple.product-type.framework";
+               };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+               BFDFE7DC352907FC980B868725387E98 /* Project object */ = {
+                       isa = PBXProject;
+                       attributes = {
+                               LastSwiftUpdateCheck = 1600;
+                               LastUpgradeCheck = 1600;
+                       };
+                       buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */;
+                       compatibilityVersion = "Xcode 16.0";
+                       developmentRegion = en;
+                       hasScannedForEncodings = 0;
+                       knownRegions = (
+                               Base,
+                               en,
+                       );
+                       mainGroup = CF1408CF629C7361332E53B88F7BD30C;
+                       minimizedProjectReferenceProxies = 0;
+                       preferredProjectObjectVersion = 77;
+                       productRefGroup = 6A6ACDADD484E61C0C86AAAC23AA5774 /* Products */;
+                       projectDirPath = "";
+                       projectRoot = "";
+                       targets = (
+                               F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */,
+                               EEE261386011CDF271BE289F73FF5959 /* IQKeyboardCore-IQKeyboardCore */,
+                               B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */,
+                               982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */,
+                               A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */,
+                               2B8FF445A5162845FAB9EC00FC92B694 /* IQKeyboardNotification-IQKeyboardNotification */,
+                               0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */,
+                               88810798DA63A2F6611B0970EA276DEC /* IQKeyboardReturnManager-IQKeyboardReturnManager */,
+                               F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */,
+                               B247F77A0CD5E19C8187A9BA1EB58C09 /* IQKeyboardToolbar-IQKeyboardToolbar */,
+                               020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */,
+                               7C5613175BBC4BF67E36DB4FBEBC01D0 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */,
+                               283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */,
+                               4502C7427440BEB17A50C0BF6E638A85 /* IQTextInputViewNotification-IQTextInputViewNotification */,
+                               12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */,
+                               A6602BCAA6F4F932A586C41D0B7E019C /* IQTextView-IQTextView */,
+                               57C07B65DFE17EDE1FBA00A59C380215 /* Pods-DeepChordsSdk */,
+                               0AEE99A309977BD12A049FF48AF9BA4B /* Pods-Example */,
+                               19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */,
+                               8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */,
+                               1948D0B63D2CF6A48E18B0B292BC6091 /* SocketRocket */,
+                               B990BD87169C76A3ED3FE8A9258D91A3 /* Toast-Swift */,
+                               C344E85893FCDEE5B70436E0A4A3472B /* Toast-Swift-Toast-Swift */,
+                       );
+               };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+               058186BCF638406CD478B0C025C67642 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               2B518589AC1F3F54CE14633027E81734 /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               174BF058335E0D9E0D5AE8280994DE37 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               49F88DA1CED23ACF70ED0D51D2BCCE4F /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               1DEDF411E550D85A1218E1655456A9CD /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               9E0045B41BFE697DB4ADE151228024D2 /* SnapKit-SnapKit_Privacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               2BA5C599D1605C3C6BB5CD4D9997593F /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               164062B86FCAFF355EE04D7A23A6EA1C /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               2E3D44000BD1509E439B9C80D2F2E273 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               2F55A6F40CBE52B1DAF28461F9E6E647 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               C433EA40A4C18AC4714CF6C9BC1172CA /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               30325A914D6527C8259F46363D6D7531 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               6DE9FD143CBC24075601F8FE2ADC4115 /* IQKeyboardCore-IQKeyboardCore in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3F90A77AEBBD3ABB426A427B522E1CA7 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               0B380F6921261E661C9EF26B02E5D634 /* IQKeyboardNotification-IQKeyboardNotification in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               47EBE3AE692A6D5A8D76F3E9294A02F6 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               50ECD138DA8BC1FBBEBFBF3CE5CEB5FF /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               51DCE991AF37B3EEABE23F0A727B58A0 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               53F78ACD922DFE5F07BB53AF35B10C1B /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               1CCB9F1FA415F93E8F4AD0E4692E4BC6 /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               636F2BA8305CAE418272BBDC04936516 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               E6FE2596512201193E95FC356C6E3351 /* IQKeyboardManagerSwift-IQKeyboardManagerSwift in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               648156F3F654BAD048DC31929DADADD3 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               DD4291CF0D9971BFED1BD55FB65ACA32 /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               6FB0C9C708A89616971C79B2B1BB4FD5 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               56E30C414ED43846B453D6FDE75DF3B5 /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               9ACC5CFB969DD7CBAFA4FD3471F250AB /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               8BA78192EBB4433C386A932BE198C2AD /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               9E7C5C7D75FB952C9859F404E09D0DBE /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               2409EDE57DC13E13E7C7A81E9E2DDD9E /* IQTextView-IQTextView in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               A540247F97F33E3F24D6C4B41FFA27DB /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               A694D13AD95802E0936531BC8DAEBB89 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               87E921A1D8B0C683DA2133709C867859 /* Toast-Swift-Toast-Swift in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               B13E49C52D1F4CA576AECF646E227048 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4B2FB381B6E14F9E0F442557ADDAA2F8 /* IQTextInputViewNotification-IQTextInputViewNotification in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               C8DC5880AFA70136503A77EF1FA12E8B /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               0EB83A2AC8AAECEE26C8739477B3A431 /* PrivacyInfo.xcprivacy in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               D10E28E3B3D225E4049054F6C994854A /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4C1E30BD1A58C10DE84E572ECD5DB54D /* IQKeyboardToolbarManager-IQKeyboardToolbarManager in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               D2C990C2F192D6D365F0DA3D5288AE39 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               F5F31138D70F9AEBD476D8AE418F37F9 /* IQKeyboardToolbar-IQKeyboardToolbar in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               E733192D0FA619FCCD70BD62F5A6A0F4 /* Resources */ = {
+                       isa = PBXResourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               020799C53BF7A383514499A2B455C635 /* IQKeyboardReturnManager-IQKeyboardReturnManager in Resources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+               0E2B16FF344B7465603C1647248CC9B3 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               1A398E6B367B205FAAAE4088C36F8875 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               06B16BF7C2EA99B47539C34FF4150ABF /* Array+Sort.swift in Sources */,
+                               64684CAF22CAC1002958805187019FD7 /* IQDeepResponderContainerView.swift in Sources */,
+                               F312D740135121FC4C7D0EB4A5F76F90 /* IQKeyboardToolbarConfiguration.swift in Sources */,
+                               992815E207201EE57916809E07ADBD74 /* IQKeyboardToolbarConstants.swift in Sources */,
+                               B1990109AA9AF8F57180C17D4A04EF6B /* IQKeyboardToolbarManager.swift in Sources */,
+                               07543B1010D44AA155CAFADBF03E66DB /* IQKeyboardToolbarManager+Action.swift in Sources */,
+                               310A311043229B0F1C21B72E9FD37271 /* IQKeyboardToolbarManager+Debug.swift in Sources */,
+                               71311BC21C92A7DE376CAD928E325979 /* IQKeyboardToolbarManager+Deprecated.swift in Sources */,
+                               A802B52FE5903601486CB77E2FDCF18B /* IQKeyboardToolbarManager+Internal.swift in Sources */,
+                               809199B64088AA02A6B900316396A83D /* IQKeyboardToolbarManager+Toolbar.swift in Sources */,
+                               9CFA943AABBDB657A85AAAF2FB4DED67 /* IQKeyboardToolbarManager-dummy.m in Sources */,
+                               37E0B956B90DE65985C993A4DF4D6CA3 /* UIView+Responders.swift in Sources */,
+                               6735CEF5CEDBE284902139B3ED3F2E73 /* UIView+RespondersObjc.swift in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               27DAA7793549B5BA83223EF9A017BFC2 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               3A6B20BEE4F7A5B5835DE5D1E509754E /* IQActiveConfiguration.swift in Sources */,
+                               FF020D50D3B0742EFED9C172269D9D83 /* IQKeyboardAppearanceConfiguration.swift in Sources */,
+                               E84C30FA4A382D9C330E87FB32C009AE /* IQKeyboardAppearanceManager.swift in Sources */,
+                               47C9A000C20E04EC69BFEEF3C6AC6256 /* IQKeyboardAppearanceManager+Internal.swift in Sources */,
+                               30D6F928FC08B13B5BFEEB154A2089C1 /* IQKeyboardManager.swift in Sources */,
+                               D6B15F2F110BC58F7635A9FD7A985C79 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */,
+                               77F1B40C21EFF28350EDA6A12263B098 /* IQKeyboardManager+Appearance.swift in Sources */,
+                               154230695B4E3D61B8D2BD02DAA2CE91 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */,
+                               24637C51989929A62E5E75585544A14D /* IQKeyboardManager+Debug.swift in Sources */,
+                               769B4905AD35AD554AA9DE98DA8E4E11 /* IQKeyboardManager+Deprecated.swift in Sources */,
+                               EBF34312A1F64FE81987440230E5BC49 /* IQKeyboardManager+Internal.swift in Sources */,
+                               05F4664FC4EF89925161A064AA6481BB /* IQKeyboardManager+Position.swift in Sources */,
+                               91CA63A8C62222E89FBB8FA2B7FE9CDE /* IQKeyboardManager+Resign.swift in Sources */,
+                               C20ECE96A97688090D5FE186DCF7B5D9 /* IQKeyboardManager+Resign_Deprecated.swift in Sources */,
+                               AC22AD1E1EF9CD9D6E242F3630A9A012 /* IQKeyboardManager+ToolbarManager.swift in Sources */,
+                               9D22F88B7F1AF054C2BF025DFB767154 /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */,
+                               C0AD493AE4A8DC8FF960D753D6D971E3 /* IQKeyboardManagerSwift-dummy.m in Sources */,
+                               8CBC72065F0261B373B958696985AF99 /* IQKeyboardResignHandler.swift in Sources */,
+                               C7C6F1AD0C44C79C4A3416FCB32B0233 /* IQKeyboardResignHandler+Internal.swift in Sources */,
+                               332EB3263B1002A5A0A146CCE70501AD /* IQRootControllerConfiguration.swift in Sources */,
+                               7CBA95E07A492F7311C7DD8EDF0B4172 /* IQScrollViewConfiguration.swift in Sources */,
+                               A6F1EFC3CDA009A4BE6CCBB01248DA21 /* UICollectionView+IndexPaths.swift in Sources */,
+                               40BB4A23AD4A18E81678F58EAA90EB85 /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */,
+                               39B33D7873CD89C6A7E96ACD36A1EDFB /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */,
+                               A983CCA5F6596F030EFCC1E27C1E766E /* UITableView+IndexPaths.swift in Sources */,
+                               2B067825708D13E7E455426389397D1A /* UIView+IQKeyboardManagerExtension.swift in Sources */,
+                               61ED64340371AB30B936A019C22C376D /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */,
+                               62B90C6FC83F91F91A4BF12022C7B050 /* UIView+Parent.swift in Sources */,
+                               E4A29F8C3ED424A7BC912DB796D03AFB /* UIView+ParentObjc.swift in Sources */,
+                               FD552610731EB624F8A47C3ACA927A15 /* UIView+Resign.swift in Sources */,
+                               355A2A3962A82AE25D219DB774CB6AEE /* UIView+ResignObjc.swift in Sources */,
+                               8C41EA954997897C3E30C5754010C05F /* UIViewController+ParentContainer.swift in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3363E27ECA850B6F97ED682F53C6A346 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               F4B260EE81F1B5801FC6DA3097F2E433 /* IQBarButtonItem.swift in Sources */,
+                               CA547E1928ADED547C368A3AB7CE9267 /* IQBarButtonItemConfiguration.swift in Sources */,
+                               3D1D0BFA512309AE63825C811A1BFC81 /* IQInvocation.swift in Sources */,
+                               49D83EC94BF242A406B6553F44E52024 /* IQKeyboardToolbar.swift in Sources */,
+                               E51720E5CBEEB2151A69D4FDF36B7E2D /* IQKeyboardToolbar-dummy.m in Sources */,
+                               3F89C7F7F091BA0DFD648E0286E5665D /* IQKeyboardToolbarPlaceholderConfiguration.swift in Sources */,
+                               7BEAD7E859FB5BFCACD23CE492484CC4 /* IQPlaceholderable.swift in Sources */,
+                               7BBD64ADF2DD2B427F258E87F3EDA284 /* IQTitleBarButtonItem.swift in Sources */,
+                               548F940AC071FBFD9D8DF209775771E5 /* UIView+IQKeyboardExtension.swift in Sources */,
+                               1A67B4D6FA3F8FB9A1083EF74C966F64 /* UIView+IQKeyboardExtensionDeprecated.swift in Sources */,
+                               24A7645685912B02F96A1291D607DBAA /* UIView+IQKeyboardExtensionObjc.swift in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3C441F0A74335E026B3A49DF02ECF4CE /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               3C68A4C08DF19233949A87717EEB487B /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               401AB3CA229BFB5D1BD2B86A0F771029 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               4E2755E9D46C6DFDCFEB8FB5461370B2 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               536076B1DBBF070DAA25A21BCE546B3C /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               4C26DF4F8D6AC77894F18EC89896258B /* IQKeyboardInfo.swift in Sources */,
+                               975E6903FBA7CF724108613000500E7E /* IQKeyboardNotification.swift in Sources */,
+                               65ABC841033E6707C3419B304C1DDD50 /* IQKeyboardNotification-dummy.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               5760F041F8E34852DB231732150718DE /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               5B14979992C9DB89400DDFB2EB8B8ECB /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               5E7E257AE5D618E46EF57A5818010F85 /* NSRunLoop+SRWebSocket.m in Sources */,
+                               6645E9FB4265C5712E38055C931E1630 /* NSURLRequest+SRWebSocket.m in Sources */,
+                               A3585531EE4D8466B74A5A6F7958EC79 /* SocketRocket-dummy.m in Sources */,
+                               B893C0DD5BE32FAE1D6895E1ED392B7A /* SRConstants.m in Sources */,
+                               1A117EC847E321871E40EB39F3576D11 /* SRDelegateController.m in Sources */,
+                               AB12501C57FFF722131F674ACB425944 /* SRError.m in Sources */,
+                               EB3BCE9B36BF814DA3069FA077168301 /* SRHash.m in Sources */,
+                               0362BB03F32EC9FB6013DEE29E8E33EF /* SRHTTPConnectMessage.m in Sources */,
+                               FCFC8D5B48F3DC4BC8942320631D8C1B /* SRIOConsumer.m in Sources */,
+                               20B8C7C05E3AF3032935F30500EF5550 /* SRIOConsumerPool.m in Sources */,
+                               CF6554D8A9380CAC0F51D5043769D930 /* SRLog.m in Sources */,
+                               A564D0B0EE8AED950D943A75C2B3092E /* SRMutex.m in Sources */,
+                               D25185C12789EA624C8BAC6A6432E77B /* SRPinningSecurityPolicy.m in Sources */,
+                               D623A6CB33709C4D87766C66A756A0F7 /* SRProxyConnect.m in Sources */,
+                               9A3761D8CEFB0E2131D2EFA2DEBB3A99 /* SRRandom.m in Sources */,
+                               92571FFBEF3A7B2F4F633624013010EE /* SRRunLoopThread.m in Sources */,
+                               8D0D15CE4E92BA4433AE7EA578FE3E15 /* SRSecurityPolicy.m in Sources */,
+                               6135798CCD656C1B3A6EA5738A23190A /* SRSIMDHelpers.m in Sources */,
+                               7F30D73D46CAD9D21A25738B11A6DDDA /* SRURLUtilities.m in Sources */,
+                               4DC15DC2DF3C4BBA344C86B112C9C68B /* SRWebSocket.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               64CD60E8B295A57BEBDD5D87A91B92C2 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               380EA4E3E2A772560E3A0670B6406450 /* IQTextInputViewInfo.swift in Sources */,
+                               EBDF215E376C3DF934F05D201833DDDC /* IQTextInputViewNotification.swift in Sources */,
+                               8BA91314914C4486DACA16122819AF1C /* IQTextInputViewNotification-dummy.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               6BA8B3ED1069309303992AA48F45596A /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               7D875C37EC81C736C5CCCE65FA1343A6 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               A98E7BF0F63124A6CB7FC2BB19B1DCBE /* IQKeyboardReturnManager.swift in Sources */,
+                               AA3E0F99979D1B54EE9DCD8FE01816CF /* IQKeyboardReturnManager+UITextFieldDelegate.swift in Sources */,
+                               5BB666D0986483D015712429F9FF2674 /* IQKeyboardReturnManager+UITextViewDelegate.swift in Sources */,
+                               B7D5043A8EC4C7C38F6C1688ACA93185 /* IQKeyboardReturnManager-dummy.m in Sources */,
+                               1B5995FCE11B496E4102AC5AD357249A /* IQTextInputViewInfoModel.swift in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               85B610DD95380C789F1D31249548827B /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               7FCA9A032C39444BD74F08A5F3927839 /* Pods-Example-dummy.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               8BEB91B4B898532A40DB8A8E4B9A7792 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               93B28B68B9253146A5A3760F7F07BAB5 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               AD7CA0B1355EA84E4891403413E3DFF0 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               B4A020AF82EF829322C86201C5C31A20 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               172B6B4E5550420B8131FBD62C975821 /* Toast.swift in Sources */,
+                               A9B5C45C3C4D517B581E536DE846A078 /* Toast-Swift-dummy.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               B559610B7522BD1394961D290D7F9F24 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               F3D41915714BC875B1DC32F49293A8B6 /* Pods-DeepChordsSdk-dummy.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               BF6F1816B0325207E7310ABC9FD05174 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               C945CB4EC42271D435BF23E7749BE6BF /* IQKeyboardConstants.swift in Sources */,
+                               01216C042B056FFF0FC7EE32A002C38A /* IQKeyboardCore-dummy.m in Sources */,
+                               378BD5280F6C07B11CF30B253D824972 /* IQKeyboardExtended.swift in Sources */,
+                               A39FE5F72261B202CC63722A7B357206 /* IQTextInputView.swift in Sources */,
+                               E1734E56DB48E6F238408C9A232C7051 /* UIView+Hierarchy.swift in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               EDF3D1BC9513EF41FD61EEC958BC7E9C /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               C749F0EFAF3D6CAE7C3C0B198665DFA5 /* IQTextView.swift in Sources */,
+                               737CE5F34A1D2B09DEF3038425A40877 /* IQTextView+Placeholderable.swift in Sources */,
+                               870DC4F98094456228D282F5F6200609 /* IQTextView-dummy.m in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+               F7AC6792C89443C7B212A06E810BAB97 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               6E39129FC8643A70C276801FEF4C280D /* Constraint.swift in Sources */,
+                               0CA7A132ABE7018DE9295456732F38BB /* ConstraintAttributes.swift in Sources */,
+                               F9EBA65892D78A31C068D727D84BCB88 /* ConstraintConfig.swift in Sources */,
+                               CE593943A9E7CF83822CF60304BCAD43 /* ConstraintConstantTarget.swift in Sources */,
+                               7AF516B98D45391B909D507D0244104C /* ConstraintDescription.swift in Sources */,
+                               1194E62AA3F6F506799B1A43B16942B5 /* ConstraintDirectionalInsets.swift in Sources */,
+                               E37671A03B4C17A1CF3766A6125833BB /* ConstraintDirectionalInsetTarget.swift in Sources */,
+                               868A9F524A7985BDA1EA124D9BF4CA63 /* ConstraintDSL.swift in Sources */,
+                               AF760C78F1C7E11BF7CB9E9B29903530 /* ConstraintInsets.swift in Sources */,
+                               2B2EB369550CE92CEEFCBFD3D32B8A3F /* ConstraintInsetTarget.swift in Sources */,
+                               5922A6A0AE7152CF436356B3556F1835 /* ConstraintItem.swift in Sources */,
+                               59F34874DA4ABB2F5C4E09EA6865936B /* ConstraintLayoutGuide.swift in Sources */,
+                               E3D779DEE753C0B0D33BA8E73A980265 /* ConstraintLayoutGuide+Extensions.swift in Sources */,
+                               3D3B646B4988314275B40E97BEB16C7F /* ConstraintLayoutGuideDSL.swift in Sources */,
+                               B0875E3AB8718E7DFE5C53497C02A15E /* ConstraintLayoutSupport.swift in Sources */,
+                               064D909CD827405E8DCC309DB1B7775A /* ConstraintLayoutSupportDSL.swift in Sources */,
+                               4F4DEB687C0E4834A5B291DEE0651D6A /* ConstraintMaker.swift in Sources */,
+                               C14F10B663FE2898EACAB90C202B3F50 /* ConstraintMakerEditable.swift in Sources */,
+                               D4218DA55B2BA45937589200CC0DF1FB /* ConstraintMakerExtendable.swift in Sources */,
+                               B903049E7C1BED7918DAB208754107C7 /* ConstraintMakerFinalizable.swift in Sources */,
+                               AABEF13464BA7F4621BD94736C1D057C /* ConstraintMakerPrioritizable.swift in Sources */,
+                               BDA5C7CC91E86448237CF40954FAC5AF /* ConstraintMakerRelatable.swift in Sources */,
+                               8BABA32F7B94A25D8E9208C0A8D90B2E /* ConstraintMakerRelatable+Extensions.swift in Sources */,
+                               883EDEE1C699497CF2A77C3B8A32A790 /* ConstraintMultiplierTarget.swift in Sources */,
+                               3577F172FA68CBAE47CFEE6FE25C5404 /* ConstraintOffsetTarget.swift in Sources */,
+                               09E1F569A93FAD4B9149E30B9301F44A /* ConstraintPriority.swift in Sources */,
+                               DBA4803F4765E1650B8C6841157F5D73 /* ConstraintPriorityTarget.swift in Sources */,
+                               C07CB3E9A4D1BF00F841E4285629A2B2 /* ConstraintRelatableTarget.swift in Sources */,
+                               ECC5C2ADC2682F9171FEA22AF10DCE53 /* ConstraintRelation.swift in Sources */,
+                               86CAB01D950C8BC35EDE0BDC01A2500B /* ConstraintView.swift in Sources */,
+                               0DE5DB9C6227B3416778D8417DD95EA9 /* ConstraintView+Extensions.swift in Sources */,
+                               7D42390CDB4FA147504B03DA2A174A0C /* ConstraintViewDSL.swift in Sources */,
+                               AE224EDB6D044C0FE86B086E950FC2F9 /* Debugging.swift in Sources */,
+                               BF1AE4D97E813B95C43EA4A298B973D1 /* LayoutConstraint.swift in Sources */,
+                               C6F45595676957ADBEC18EB3F23EAEC4 /* LayoutConstraintItem.swift in Sources */,
+                               BA2FB695DEB0D179253EEB8DFCE3578B /* SnapKit-dummy.m in Sources */,
+                               C6A4302ACE006C4E2CDD481287E2916B /* Typealiases.swift in Sources */,
+                               F6F33E8B268F3D41075374D95B8088DC /* UILayoutSupport+Extensions.swift in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+               032EC8AE715F3D13AD519BE9CA03294E /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "SnapKit-SnapKit_Privacy";
+                       target = 8A8DB685241263AFDF5E6B20FE67B93A /* SnapKit-SnapKit_Privacy */;
+                       targetProxy = 4294839685D9EA7EF6090113DB9528A3 /* PBXContainerItemProxy */;
+               };
+               0A6F859D7948477715DBD4333CD962F5 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardNotification;
+                       target = A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */;
+                       targetProxy = A24EA8C0FD67224523A2A8049A529730 /* PBXContainerItemProxy */;
+               };
+               0BA497932D68F052CFDA60CB4325E823 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardCore;
+                       target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */;
+                       targetProxy = C96EFF1386F982C542C2B03977A6FFD6 /* PBXContainerItemProxy */;
+               };
+               0ED2A9B38A71F6850A959089852BDB0A /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQKeyboardManagerSwift-IQKeyboardManagerSwift";
+                       target = 982A68D37F5DCBC1FC1FDC0BB2F0EB8E /* IQKeyboardManagerSwift-IQKeyboardManagerSwift */;
+                       targetProxy = 9A200DA2E207287B114783961A389F97 /* PBXContainerItemProxy */;
+               };
+               1EE6EF0BEC589B1038459A693177F2FE /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardReturnManager;
+                       target = 0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */;
+                       targetProxy = 8031384E87ED727FE68F4242803FF742 /* PBXContainerItemProxy */;
+               };
+               1F9AF4725D5847BEA5D8B724D1A3B414 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardCore;
+                       target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */;
+                       targetProxy = 94872272C37CF76A4C27D08B5EC60D6D /* PBXContainerItemProxy */;
+               };
+               24C84A614B93271254E3B59008326861 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "Toast-Swift-Toast-Swift";
+                       target = C344E85893FCDEE5B70436E0A4A3472B /* Toast-Swift-Toast-Swift */;
+                       targetProxy = 57A1C5DB51B6CD350C79C7B055A7F66B /* PBXContainerItemProxy */;
+               };
+               36DB0F3DA574BD5B7448F2F28DFAA125 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQKeyboardToolbar-IQKeyboardToolbar";
+                       target = B247F77A0CD5E19C8187A9BA1EB58C09 /* IQKeyboardToolbar-IQKeyboardToolbar */;
+                       targetProxy = 8581EB306F93FE5BF5504824295F3722 /* PBXContainerItemProxy */;
+               };
+               3920F2A30AF54503207FB9C2E5ECC456 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQTextInputViewNotification;
+                       target = 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */;
+                       targetProxy = 4BEE988A3465649375AC57D797ABF617 /* PBXContainerItemProxy */;
+               };
+               3BDAAC90F533878935276DA626D3CE8F /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQTextView;
+                       target = 12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */;
+                       targetProxy = 43A509886BF66DE03AA2357743AC5769 /* PBXContainerItemProxy */;
+               };
+               3E3639BC049B1894293B33F5B52D836A /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "Toast-Swift";
+                       target = B990BD87169C76A3ED3FE8A9258D91A3 /* Toast-Swift */;
+                       targetProxy = 548AF3FE70CC81B2ABBAEF65818BA3A6 /* PBXContainerItemProxy */;
+               };
+               443ECCCC8495E109D669FC24E39EE5E7 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardToolbarManager;
+                       target = 020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */;
+                       targetProxy = 186EFCD32F2BEEE1514385E97F48B014 /* PBXContainerItemProxy */;
+               };
+               486058C9A622B4968F720109A1CB425D /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQTextView-IQTextView";
+                       target = A6602BCAA6F4F932A586C41D0B7E019C /* IQTextView-IQTextView */;
+                       targetProxy = F68560EF2AF1432CDC4EDEE224F0B10F /* PBXContainerItemProxy */;
+               };
+               54C3CEF0CE5F2ADC19CF09FA97EA2FCD /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardToolbarManager;
+                       target = 020993F16DA5986DACE118349EBCE9E5 /* IQKeyboardToolbarManager */;
+                       targetProxy = D3993F1F1D303ACFD97829D6D9115BA0 /* PBXContainerItemProxy */;
+               };
+               5A538984C0CD4E2FF0B2AAA2EF368D0F /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardCore;
+                       target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */;
+                       targetProxy = 925132ADAAA2012B51EAE2C13D1BD31F /* PBXContainerItemProxy */;
+               };
+               6A012670364ED3DE97C5B8D570417F17 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardToolbar;
+                       target = F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */;
+                       targetProxy = 6130D9140D152F57AA543D42CA625298 /* PBXContainerItemProxy */;
+               };
+               77F02D151BFA0BF2A8184E8F7040E02E /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQTextInputViewNotification;
+                       target = 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */;
+                       targetProxy = D7076AE16282F5B2F87DAD903E05C6C4 /* PBXContainerItemProxy */;
+               };
+               7C197C0E14E357C0482C5CECC1F7DAE7 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQTextView;
+                       target = 12890DE3ABBC2CA295E108358D85EE69 /* IQTextView */;
+                       targetProxy = 1E3FD4E83C3BACBC0EE2DD7F457AA6E9 /* PBXContainerItemProxy */;
+               };
+               806811E474B5E127D48FE9CA32DCFB26 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardToolbar;
+                       target = F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */;
+                       targetProxy = 9D53E47458385470A91D7295E48E0FD6 /* PBXContainerItemProxy */;
+               };
+               9143EFF5B329D660A0398F7391E5D055 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = SocketRocket;
+                       target = 1948D0B63D2CF6A48E18B0B292BC6091 /* SocketRocket */;
+                       targetProxy = BACED4BB4D08C0B382C214709ABE6A91 /* PBXContainerItemProxy */;
+               };
+               9AB32C8C254D84A755461731E5E31837 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardToolbar;
+                       target = F4FE17428FD0E607723A44F17231B7A1 /* IQKeyboardToolbar */;
+                       targetProxy = 7D69ABF84486EAFB55FB87BC9B44D3F6 /* PBXContainerItemProxy */;
+               };
+               9BE1A2A7D5E6D44833CB0C78085D940D /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQKeyboardReturnManager-IQKeyboardReturnManager";
+                       target = 88810798DA63A2F6611B0970EA276DEC /* IQKeyboardReturnManager-IQKeyboardReturnManager */;
+                       targetProxy = C7AFFBB48EEA1AF602657886DA4FE905 /* PBXContainerItemProxy */;
+               };
+               9CF7EA505D7A9CAA62AFDC4457D80AEF /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQKeyboardCore-IQKeyboardCore";
+                       target = EEE261386011CDF271BE289F73FF5959 /* IQKeyboardCore-IQKeyboardCore */;
+                       targetProxy = 1CC338AE066CE11E9D4C832A727D9C61 /* PBXContainerItemProxy */;
+               };
+               AEFFF3B21972CDA23989650CB0D06DC1 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardCore;
+                       target = F9A1BF709B7BA4C24A83664EB1E1C7D4 /* IQKeyboardCore */;
+                       targetProxy = D3C8D19228BDBCB03280ABF945D775BA /* PBXContainerItemProxy */;
+               };
+               BAE9291352BA3C02DCD824BD9455EEFB /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQKeyboardNotification-IQKeyboardNotification";
+                       target = 2B8FF445A5162845FAB9EC00FC92B694 /* IQKeyboardNotification-IQKeyboardNotification */;
+                       targetProxy = 64F6091A60F53F5A90BEE2C59126E133 /* PBXContainerItemProxy */;
+               };
+               C2F5904EDA280BF704E19BEC7E450D7C /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQTextInputViewNotification-IQTextInputViewNotification";
+                       target = 4502C7427440BEB17A50C0BF6E638A85 /* IQTextInputViewNotification-IQTextInputViewNotification */;
+                       targetProxy = D0E89F4255608F3B229AA3E8DFD93CF9 /* PBXContainerItemProxy */;
+               };
+               CACDD982D78D0FBB2772B70DB888F8B4 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardNotification;
+                       target = A26E6FD851C20D652B2755C1464A9990 /* IQKeyboardNotification */;
+                       targetProxy = 6795B29B74A0DFB983C8C121DAC73B8F /* PBXContainerItemProxy */;
+               };
+               DDA643E4BF2CFF13D6B0D25A5C59AB5F /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = SocketRocket;
+                       target = 1948D0B63D2CF6A48E18B0B292BC6091 /* SocketRocket */;
+                       targetProxy = 7C1DC3C44CB9ED8404023CBE11C3A841 /* PBXContainerItemProxy */;
+               };
+               E4562E3C97AF6073F7BD53F0DA943866 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardReturnManager;
+                       target = 0981F89DB5DA3FFCFFEBDE1F56287054 /* IQKeyboardReturnManager */;
+                       targetProxy = 32B49C1963D38D5E1E60E037311DCDEF /* PBXContainerItemProxy */;
+               };
+               F2792ADD73FF2795D46955194D6DB5FA /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQKeyboardManagerSwift;
+                       target = B490E7485944099E16C9CBD79119D1D4 /* IQKeyboardManagerSwift */;
+                       targetProxy = 2DE1780C07830F70EB974DDA0E002280 /* PBXContainerItemProxy */;
+               };
+               F7852222FD7DD0B21BC78B245F2045A0 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = IQTextInputViewNotification;
+                       target = 283C1F2EA88CD4413165801A6748A48E /* IQTextInputViewNotification */;
+                       targetProxy = 6C9C732B28DF0513A21CE6E248F89072 /* PBXContainerItemProxy */;
+               };
+               FC49926069485756B05C5F53750496AD /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = SnapKit;
+                       target = 19622742EBA51E823D6DAE3F8CDBFAD4 /* SnapKit */;
+                       targetProxy = 92C92FF2930D007DABF544DC7AC08060 /* PBXContainerItemProxy */;
+               };
+               FDF0C9122AFE5F4537D84EB5B5EA2535 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       name = "IQKeyboardToolbarManager-IQKeyboardToolbarManager";
+                       target = 7C5613175BBC4BF67E36DB4FBEBC01D0 /* IQKeyboardToolbarManager-IQKeyboardToolbarManager */;
+                       targetProxy = D72B40330912494BEDC722CCB167FF77 /* PBXContainerItemProxy */;
+               };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+               1B2F38B82BEBA44EF2EE45BF7A44037A /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 5AF0EBE9A79115D36EF40E456919D63B /* IQKeyboardManagerSwift.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardManagerSwift";
+                               IBSC_MODULE = IQKeyboardManagerSwift;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardManagerSwift;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               1D0FBA28D44BDD4502A8E31DAEABF97D /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 78882EBBF9DB9EAA48F3FFBF14D1E0B5 /* IQKeyboardToolbar.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardToolbar;
+                               PRODUCT_NAME = IQKeyboardToolbar;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               1F029A7E58A02CC7BF83B726ECB24B27 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 455A2446E1A8F92123FBE90A1D4B8D0B /* Pods-Example.debug.xcconfig */;
+                       buildSettings = {
+                               ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MACH_O_TYPE = staticlib;
+                               MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.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;
+               };
+               298BF47A1ADB1CEC5A9281F125EF0788 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 1515EB933E55F8DF1275984150311F6F /* IQTextInputViewNotification.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextInputViewNotification";
+                               IBSC_MODULE = IQTextInputViewNotification;
+                               INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQTextInputViewNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               2C4EBC8097D4D07427A18EC0F79738BE /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 5AF0EBE9A79115D36EF40E456919D63B /* IQKeyboardManagerSwift.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardManagerSwift;
+                               PRODUCT_NAME = IQKeyboardManagerSwift;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               3016B50127E54871902147B82FABA968 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 8981CA762CD2FDB68D15FEEA091439B5 /* IQKeyboardToolbarManager.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardToolbarManager;
+                               PRODUCT_NAME = IQKeyboardToolbarManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               34DA1E3BEA25E012EF708AE69C0C9193 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 02E139B151EDFA1F4F63EA119D2269C7 /* Toast-Swift.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Toast-Swift";
+                               IBSC_MODULE = Toast_Swift;
+                               INFOPLIST_FILE = "Target Support Files/Toast-Swift/ResourceBundle-Toast-Swift-Toast-Swift-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               PRODUCT_NAME = "Toast-Swift";
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               37AF8DF61716FB1975DE10B4998E2A87 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 79E6154EEE25D08664ACFE66C69DDFA0 /* Toast-Swift.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Toast-Swift";
+                               IBSC_MODULE = Toast_Swift;
+                               INFOPLIST_FILE = "Target Support Files/Toast-Swift/ResourceBundle-Toast-Swift-Toast-Swift-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               PRODUCT_NAME = "Toast-Swift";
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               397EF464FF32EAD44C05D7CE58A2C382 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = D5434748DD18D8B60013ABF3FFC5B95F /* IQTextView.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextView";
+                               IBSC_MODULE = IQTextView;
+                               INFOPLIST_FILE = "Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQTextView;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               47C2D0929EA82A67E33FEB42776A6CAC /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 99B82533878EEF9F0E2FB3560695FF8A /* IQTextView.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextView";
+                               IBSC_MODULE = IQTextView;
+                               INFOPLIST_FILE = "Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQTextView;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               4E28A2258944850B8D0D598586B5E92B /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 1AB8D5FD6175CD8FCC7153B71E6DD77A /* IQKeyboardNotification.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardNotification;
+                               PRODUCT_NAME = IQKeyboardNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               5392BBBB9A595846BCE334B1D7D1D3B7 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = F528CE7CB37911E316CD1F5622E5B931 /* IQKeyboardReturnManager.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardReturnManager";
+                               IBSC_MODULE = IQKeyboardReturnManager;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardReturnManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               544532B6E87F836C1A3288A60D36F726 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = D5434748DD18D8B60013ABF3FFC5B95F /* IQTextView.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQTextView/IQTextView-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQTextView/IQTextView-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQTextView/IQTextView.modulemap";
+                               PRODUCT_MODULE_NAME = IQTextView;
+                               PRODUCT_NAME = IQTextView;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               5F0B975EFB983C4E1131BDA3D8ED0683 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 78F95F4E86380B049117A093BFC1CD7B /* IQTextInputViewNotification.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap";
+                               PRODUCT_MODULE_NAME = IQTextInputViewNotification;
+                               PRODUCT_NAME = IQTextInputViewNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               60B198379BE0F80DDD5483A405A8AC5F /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 159C74980AC55D136945F073F6CEDC14 /* IQKeyboardToolbar.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardToolbar;
+                               PRODUCT_NAME = IQKeyboardToolbar;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               60BF7D5EEEA720FA876075D448A3EEFF /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 9F272A689E05B2AA0C0ED18AD4383DDE /* SocketRocket.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/SocketRocket/SocketRocket-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/SocketRocket/SocketRocket-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/SocketRocket/SocketRocket.modulemap";
+                               PRODUCT_MODULE_NAME = SocketRocket;
+                               PRODUCT_NAME = SocketRocket;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               63E9BC6B186B49FDCAB4170225DF66FE /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 914B3416C83998074DDAB130CB468706 /* IQKeyboardReturnManager.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardReturnManager";
+                               IBSC_MODULE = IQKeyboardReturnManager;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardReturnManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               6458EACFEBDCB49A35654564C62A5CDB /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 87F05B4E0307C30EB4FC212724C8F157 /* IQKeyboardNotification.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardNotification";
+                               IBSC_MODULE = IQKeyboardNotification;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               64801BD417925AB9BA656A8FA9DC5CB6 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = DCDF74B5DEAC5E25CFC4D9F9B16EFBEB /* IQKeyboardToolbarManager.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardToolbarManager;
+                               PRODUCT_NAME = IQKeyboardToolbarManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               74ED47C1AB733A447D6619EAD98BAD82 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = AA485EB92636FB68E91AF3FCC1CE9C5E /* IQKeyboardCore.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardCore";
+                               IBSC_MODULE = IQKeyboardCore;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardCore;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               7AA36B6CE3B0C3B48B651A2702CCFC98 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 4B6ABE8E0C199299C26E4B5977886B71 /* SnapKit.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit";
+                               IBSC_MODULE = SnapKit;
+                               INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               PRODUCT_NAME = SnapKit_Privacy;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               7D3C700E017BEA5E61F542AD4EBE06C7 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = B3AA4CA7BB409A5191DBD08356FE703A /* Pods-Example.release.xcconfig */;
+                       buildSettings = {
+                               ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               INFOPLIST_FILE = "Target Support Files/Pods-Example/Pods-Example-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MACH_O_TYPE = staticlib;
+                               MODULEMAP_FILE = "Target Support Files/Pods-Example/Pods-Example.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;
+               };
+               7E48D17D0469F73801BBDAF1F20755F2 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 79E6154EEE25D08664ACFE66C69DDFA0 /* Toast-Swift.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/Toast-Swift/Toast-Swift-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/Toast-Swift/Toast-Swift-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/Toast-Swift/Toast-Swift.modulemap";
+                               PRODUCT_MODULE_NAME = Toast_Swift;
+                               PRODUCT_NAME = Toast_Swift;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               8DE5143C03248BB6CD542DE3963D6F3A /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+                               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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+                               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 = 13.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;
+               };
+               8E2D63C2146204D6E9066CFE984F976A /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 91511868D1335C41FD84563EF906555C /* Pods-DeepChordsSdk.release.xcconfig */;
+                       buildSettings = {
+                               ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               INFOPLIST_FILE = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MACH_O_TYPE = staticlib;
+                               MODULEMAP_FILE = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.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;
+               };
+               8F408C586919D67ACCB4002B798BF1CE /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 319AC1D7C71149C2DD5EF02DECE3F511 /* SnapKit.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/SnapKit";
+                               IBSC_MODULE = SnapKit;
+                               INFOPLIST_FILE = "Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               PRODUCT_NAME = SnapKit_Privacy;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               9D0D7572FEDA4CC9E75E7387846AFE57 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 319AC1D7C71149C2DD5EF02DECE3F511 /* SnapKit.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap";
+                               PRODUCT_MODULE_NAME = SnapKit;
+                               PRODUCT_NAME = SnapKit;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               9E406C6AAF85E580207CD97B0044DEAB /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
+                               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_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+                               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 = 13.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;
+               };
+               9E6F8A334BBF6110E0F8360AA5245522 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 87F05B4E0307C30EB4FC212724C8F157 /* IQKeyboardNotification.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardNotification;
+                               PRODUCT_NAME = IQKeyboardNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               A0F0EEB28C54A3D861769B31AB6A09BC /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 9374F8A0206251FC7979A888F803B656 /* IQKeyboardCore.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardCore;
+                               PRODUCT_NAME = IQKeyboardCore;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               B5986331465FE771133F16D76C24C707 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 9374F8A0206251FC7979A888F803B656 /* IQKeyboardCore.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardCore";
+                               IBSC_MODULE = IQKeyboardCore;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardCore;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               BA84D2E7DDC5F76ACF1327798B6F924C /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 78F95F4E86380B049117A093BFC1CD7B /* IQTextInputViewNotification.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQTextInputViewNotification";
+                               IBSC_MODULE = IQTextInputViewNotification;
+                               INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQTextInputViewNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               BAD20131EC29650C6737E66854A3A9FD /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 4B6ABE8E0C199299C26E4B5977886B71 /* SnapKit.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/SnapKit/SnapKit-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/SnapKit/SnapKit-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/SnapKit/SnapKit.modulemap";
+                               PRODUCT_MODULE_NAME = SnapKit;
+                               PRODUCT_NAME = SnapKit;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               BFE9B004B8D63FFCD9138A8CD9D03F13 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 1AB8D5FD6175CD8FCC7153B71E6DD77A /* IQKeyboardNotification.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardNotification";
+                               IBSC_MODULE = IQKeyboardNotification;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               CC57776530A62F3C6BCEE299CDB87503 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 99B82533878EEF9F0E2FB3560695FF8A /* IQTextView.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQTextView/IQTextView-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQTextView/IQTextView-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQTextView/IQTextView.modulemap";
+                               PRODUCT_MODULE_NAME = IQTextView;
+                               PRODUCT_NAME = IQTextView;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               D0C03895DE80B8549E8C1D167D22E44D /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 5084335EF29A15EB6C31DFB1ACA15349 /* IQKeyboardManagerSwift.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardManagerSwift;
+                               PRODUCT_NAME = IQKeyboardManagerSwift;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               D0D91380BCB9BC9A0529D56C8ED5FFE9 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 159C74980AC55D136945F073F6CEDC14 /* IQKeyboardToolbar.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbar";
+                               IBSC_MODULE = IQKeyboardToolbar;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardToolbar;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               D138F4694413B3332A4486830C10613A /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = DCDF74B5DEAC5E25CFC4D9F9B16EFBEB /* IQKeyboardToolbarManager.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbarManager";
+                               IBSC_MODULE = IQKeyboardToolbarManager;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardToolbarManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               D29AEDD40B3E8B1E6FC8C1D23E9FE854 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 1515EB933E55F8DF1275984150311F6F /* IQTextInputViewNotification.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap";
+                               PRODUCT_MODULE_NAME = IQTextInputViewNotification;
+                               PRODUCT_NAME = IQTextInputViewNotification;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               DDBEDC2B6C48735DEA3B7E0F66D166CA /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 4BF6C697C2EB03CCBCE9CA841EA31F47 /* Pods-DeepChordsSdk.debug.xcconfig */;
+                       buildSettings = {
+                               ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               INFOPLIST_FILE = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MACH_O_TYPE = staticlib;
+                               MODULEMAP_FILE = "Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.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;
+               };
+               E06F70F13B606F0979741BCAFE1F1003 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 02E139B151EDFA1F4F63EA119D2269C7 /* Toast-Swift.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/Toast-Swift/Toast-Swift-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/Toast-Swift/Toast-Swift-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 12.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/Toast-Swift/Toast-Swift.modulemap";
+                               PRODUCT_MODULE_NAME = Toast_Swift;
+                               PRODUCT_NAME = Toast_Swift;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               E0AD5D7D6A14E0A5CE237F7AA2103EDA /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 10CAAD795A45AB49A0EE4D6805AB7A1F /* SocketRocket.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/SocketRocket/SocketRocket-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/SocketRocket/SocketRocket-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 11.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/SocketRocket/SocketRocket.modulemap";
+                               PRODUCT_MODULE_NAME = SocketRocket;
+                               PRODUCT_NAME = SocketRocket;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.0;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               E5E79CB0A013D41033C3D1F195F2D511 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = F528CE7CB37911E316CD1F5622E5B931 /* IQKeyboardReturnManager.debug.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardReturnManager;
+                               PRODUCT_NAME = IQKeyboardReturnManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Debug;
+               };
+               EA45E75E18A3088D3BECAB8A13C8E1FA /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 5084335EF29A15EB6C31DFB1ACA15349 /* IQKeyboardManagerSwift.debug.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardManagerSwift";
+                               IBSC_MODULE = IQKeyboardManagerSwift;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardManagerSwift;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Debug;
+               };
+               ED5F5D7028C0D13C5D338346ADB64D2D /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 78882EBBF9DB9EAA48F3FFBF14D1E0B5 /* IQKeyboardToolbar.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbar";
+                               IBSC_MODULE = IQKeyboardToolbar;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardToolbar;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               EFB4FCFDA1169E42C1B49870156BCDDD /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 914B3416C83998074DDAB130CB468706 /* IQKeyboardReturnManager.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardReturnManager;
+                               PRODUCT_NAME = IQKeyboardReturnManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+               F08D20936BD3635F1144C8ABE3CED471 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = 8981CA762CD2FDB68D15FEEA091439B5 /* IQKeyboardToolbarManager.release.xcconfig */;
+                       buildSettings = {
+                               CODE_SIGNING_ALLOWED = NO;
+                               CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/IQKeyboardToolbarManager";
+                               IBSC_MODULE = IQKeyboardToolbarManager;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               PRODUCT_NAME = IQKeyboardToolbarManager;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               WRAPPER_EXTENSION = bundle;
+                       };
+                       name = Release;
+               };
+               FC91939289B6972DE0D1E8C4EDF5A399 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       baseConfigurationReference = AA485EB92636FB68E91AF3FCC1CE9C5E /* IQKeyboardCore.release.xcconfig */;
+                       buildSettings = {
+                               CLANG_ENABLE_OBJC_WEAK = NO;
+                               "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";
+                               ENABLE_MODULE_VERIFIER = NO;
+                               ENABLE_USER_SCRIPT_SANDBOXING = NO;
+                               GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch";
+                               GENERATE_INFOPLIST_FILE = NO;
+                               INFOPLIST_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist";
+                               INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
+                               IPHONEOS_DEPLOYMENT_TARGET = 13.0;
+                               LD_RUNPATH_SEARCH_PATHS = (
+                                       "$(inherited)",
+                                       "@executable_path/Frameworks",
+                                       "@loader_path/Frameworks",
+                               );
+                               MODULEMAP_FILE = "Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap";
+                               PRODUCT_MODULE_NAME = IQKeyboardCore;
+                               PRODUCT_NAME = IQKeyboardCore;
+                               SDKROOT = iphoneos;
+                               SKIP_INSTALL = YES;
+                               SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
+                               SWIFT_INSTALL_OBJC_HEADER = YES;
+                               SWIFT_VERSION = 5.9;
+                               TARGETED_DEVICE_FAMILY = "1,2";
+                               VALIDATE_PRODUCT = YES;
+                               VERSIONING_SYSTEM = "apple-generic";
+                               VERSION_INFO_PREFIX = "";
+                       };
+                       name = Release;
+               };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+               08CCC0BB4F7D4BA07752DF404F6EDD9A /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager-IQKeyboardReturnManager" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               5392BBBB9A595846BCE334B1D7D1D3B7 /* Debug */,
+                               63E9BC6B186B49FDCAB4170225DF66FE /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               0DA28833D7A042B27FBAEDF85A1C1D74 /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               5F0B975EFB983C4E1131BDA3D8ED0683 /* Debug */,
+                               D29AEDD40B3E8B1E6FC8C1D23E9FE854 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               2D29A227B6A83F5A542054A8A8043BAA /* Build configuration list for PBXNativeTarget "SnapKit-SnapKit_Privacy" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               8F408C586919D67ACCB4002B798BF1CE /* Debug */,
+                               7AA36B6CE3B0C3B48B651A2702CCFC98 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               2DEB3984BC37C7B27AE0091EC7509142 /* Build configuration list for PBXNativeTarget "Toast-Swift-Toast-Swift" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               34DA1E3BEA25E012EF708AE69C0C9193 /* Debug */,
+                               37AF8DF61716FB1975DE10B4998E2A87 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               2FC9855C948A66726D61C1BF2072066A /* Build configuration list for PBXNativeTarget "IQKeyboardNotification-IQKeyboardNotification" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               6458EACFEBDCB49A35654564C62A5CDB /* Debug */,
+                               BFE9B004B8D63FFCD9138A8CD9D03F13 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               3208C0F97FCB948C4F12E81E25FFEAF9 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               D0C03895DE80B8549E8C1D167D22E44D /* Debug */,
+                               2C4EBC8097D4D07427A18EC0F79738BE /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               8DE5143C03248BB6CD542DE3963D6F3A /* Debug */,
+                               9E406C6AAF85E580207CD97B0044DEAB /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               49D80946082E3E53F4077E15D8887408 /* Build configuration list for PBXNativeTarget "Pods-DeepChordsSdk" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               DDBEDC2B6C48735DEA3B7E0F66D166CA /* Debug */,
+                               8E2D63C2146204D6E9066CFE984F976A /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               6545B5D9E1142254EECDDEFC1408EA74 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               60B198379BE0F80DDD5483A405A8AC5F /* Debug */,
+                               1D0FBA28D44BDD4502A8E31DAEABF97D /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               698D46877F77FCD24D7D79E95A4A06D5 /* Build configuration list for PBXNativeTarget "SocketRocket" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               60BF7D5EEEA720FA876075D448A3EEFF /* Debug */,
+                               E0AD5D7D6A14E0A5CE237F7AA2103EDA /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               7468FF21977574A694627CBF4D7DEC53 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbar-IQKeyboardToolbar" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               D0D91380BCB9BC9A0529D56C8ED5FFE9 /* Debug */,
+                               ED5F5D7028C0D13C5D338346ADB64D2D /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               7B6A2B3DDE303A370FD2A5C8DB9C6E2D /* Build configuration list for PBXNativeTarget "IQKeyboardNotification" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               9E6F8A334BBF6110E0F8360AA5245522 /* Debug */,
+                               4E28A2258944850B8D0D598586B5E92B /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               80CE967CAA1D35721519F892BAF7A19B /* Build configuration list for PBXNativeTarget "SnapKit" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               9D0D7572FEDA4CC9E75E7387846AFE57 /* Debug */,
+                               BAD20131EC29650C6737E66854A3A9FD /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               95C096ADDB6F7FCAFFA3FBB358C75EF3 /* Build configuration list for PBXNativeTarget "Pods-Example" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               1F029A7E58A02CC7BF83B726ECB24B27 /* Debug */,
+                               7D3C700E017BEA5E61F542AD4EBE06C7 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               9C146D0EDFB76FE1156D655A897B6E94 /* Build configuration list for PBXNativeTarget "Toast-Swift" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               E06F70F13B606F0979741BCAFE1F1003 /* Debug */,
+                               7E48D17D0469F73801BBDAF1F20755F2 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               9E4E9D837E21217746DEB582B898D487 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager-IQKeyboardToolbarManager" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               D138F4694413B3332A4486830C10613A /* Debug */,
+                               F08D20936BD3635F1144C8ABE3CED471 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               AC758F51A954F3478B41C0B2B845766B /* Build configuration list for PBXNativeTarget "IQKeyboardReturnManager" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               E5E79CB0A013D41033C3D1F195F2D511 /* Debug */,
+                               EFB4FCFDA1169E42C1B49870156BCDDD /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               B2130418C2FAD0A1E2FD872758AD609B /* Build configuration list for PBXNativeTarget "IQKeyboardCore" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               A0F0EEB28C54A3D861769B31AB6A09BC /* Debug */,
+                               FC91939289B6972DE0D1E8C4EDF5A399 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               BA50FBEF420279D7BDB90421B1103569 /* Build configuration list for PBXNativeTarget "IQTextInputViewNotification-IQTextInputViewNotification" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               BA84D2E7DDC5F76ACF1327798B6F924C /* Debug */,
+                               298BF47A1ADB1CEC5A9281F125EF0788 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               D2E3CA4A5A5255636741A362E4F6BCF7 /* Build configuration list for PBXNativeTarget "IQTextView-IQTextView" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               47C2D0929EA82A67E33FEB42776A6CAC /* Debug */,
+                               397EF464FF32EAD44C05D7CE58A2C382 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               D452E33AB7D1DEFA04A6E2B89E1B70BD /* Build configuration list for PBXNativeTarget "IQKeyboardCore-IQKeyboardCore" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               B5986331465FE771133F16D76C24C707 /* Debug */,
+                               74ED47C1AB733A447D6619EAD98BAD82 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               D7FB8C3DDF4703D4590435540A2233A9 /* Build configuration list for PBXNativeTarget "IQKeyboardToolbarManager" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               64801BD417925AB9BA656A8FA9DC5CB6 /* Debug */,
+                               3016B50127E54871902147B82FABA968 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               D8BBE9E3900D941FF67F5A73A1AECA11 /* Build configuration list for PBXNativeTarget "IQTextView" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               CC57776530A62F3C6BCEE299CDB87503 /* Debug */,
+                               544532B6E87F836C1A3288A60D36F726 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+               FD573F16CD31603388EC2DE46509F450 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-IQKeyboardManagerSwift" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               EA45E75E18A3088D3BECAB8A13C8E1FA /* Debug */,
+                               1B2F38B82BEBA44EF2EE45BF7A44037A /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+                       defaultConfigurationName = Release;
+               };
+/* End XCConfigurationList section */
+       };
+       rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */;
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/LICENSE
new file mode 100644 (file)
index 0000000..a18ccfb
--- /dev/null
@@ -0,0 +1,19 @@
+Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/README.md
new file mode 100644 (file)
index 0000000..e1be307
--- /dev/null
@@ -0,0 +1,155 @@
+<img src="https://snapkit.github.io/SnapKit/images/banner.jpg" alt="" />
+
+SnapKit is a DSL to make Auto Layout easy on both iOS and OS X.
+
+[![Build Status](https://travis-ci.org/SnapKit/SnapKit.svg)](https://travis-ci.org/SnapKit/SnapKit)
+[![Platform](https://img.shields.io/cocoapods/p/SnapKit.svg?style=flat)](https://github.com/SnapKit/SnapKit)
+[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/SnapKit.svg)](https://cocoapods.org/pods/SnapKit)
+[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
+
+#### ⚠️ **To use with Swift 4.x please ensure you are using >= 4.0.0** ⚠️
+#### ⚠️ **To use with Swift 5.x please ensure you are using >= 5.0.0** ⚠️
+
+## Contents
+
+- [Requirements](#requirements)
+- [Migration Guides](#migration-guides)
+- [Communication](#communication)
+- [Installation](#installation)
+- [Usage](#usage)
+- [Credits](#credits)
+- [License](#license)
+
+## Requirements
+
+- iOS 12.0+ / Mac OS X 10.13+ / tvOS 10.0+
+- Xcode 10.0+
+- Swift 4.0+
+
+## Migration Guides
+
+- [SnapKit 3.0 Migration Guide](Documentation/SnapKit%203.0%20Migration%20Guide.md)
+
+## Communication
+
+- If you **need help**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/snapkit). (Tag 'snapkit')
+- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/snapkit).
+- If you **found a bug**, open an issue.
+- If you **have a feature request**, open an issue.
+- If you **want to contribute**, submit a pull request.
+
+
+## Installation
+
+### CocoaPods
+
+[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects. You can install it with the following command:
+
+```bash
+$ gem install cocoapods
+```
+
+> CocoaPods 1.1.0+ is required to build SnapKit 4.0.0+.
+
+To integrate SnapKit into your Xcode project using CocoaPods, specify it in your `Podfile`:
+
+```ruby
+source 'https://github.com/CocoaPods/Specs.git'
+platform :ios, '10.0'
+use_frameworks!
+
+target '<Your Target Name>' do
+    pod 'SnapKit', '~> 5.7.0'
+end
+```
+
+Then, run the following command:
+
+```bash
+$ pod install
+```
+
+### Carthage
+
+[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.
+
+You can install Carthage with [Homebrew](http://brew.sh/) using the following command:
+
+```bash
+$ brew update
+$ brew install carthage
+```
+
+To integrate SnapKit into your Xcode project using Carthage, specify it in your `Cartfile`:
+
+```ogdl
+github "SnapKit/SnapKit" ~> 5.0.0
+```
+
+Run `carthage update` to build the framework and drag the built `SnapKit.framework` into your Xcode project.
+
+### Swift Package Manager
+
+[Swift Package Manager](https://swift.org/package-manager/) is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies.
+
+> Xcode 11+ is required to build SnapKit using Swift Package Manager.
+
+To integrate SnapKit into your Xcode project using Swift Package Manager, add it to the dependencies value of your `Package.swift`:
+
+```swift
+dependencies: [
+    .package(url: "https://github.com/SnapKit/SnapKit.git", .upToNextMajor(from: "5.0.1"))
+]
+```
+
+### Manually
+
+If you prefer not to use either of the aforementioned dependency managers, you can integrate SnapKit into your project manually.
+
+---
+
+## Usage
+
+### Quick Start
+
+```swift
+import SnapKit
+
+class MyViewController: UIViewController {
+
+    lazy var box = UIView()
+
+    override func viewDidLoad() {
+        super.viewDidLoad()
+
+        self.view.addSubview(box)
+        box.backgroundColor = .green
+        box.snp.makeConstraints { (make) -> Void in
+           make.width.height.equalTo(50)
+           make.center.equalTo(self.view)
+        }
+    }
+
+}
+```
+
+### Playground
+You can try SnapKit in Playground.
+
+**Note:**
+
+> To try SnapKit in playground, open `SnapKit.xcworkspace` and build SnapKit.framework for any simulator first.
+
+### Resources
+
+- [Documentation](https://snapkit.github.io/SnapKit/docs/)
+- [F.A.Q.](https://snapkit.github.io/SnapKit/faq/)
+
+## Credits
+
+- Robert Payne ([@robertjpayne](https://twitter.com/robertjpayne))
+- Many other contributors
+
+## License
+
+SnapKit is released under the MIT license. See LICENSE for details.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Constraint.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Constraint.swift
new file mode 100644 (file)
index 0000000..b890152
--- /dev/null
@@ -0,0 +1,341 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+public final class Constraint {
+
+    internal let sourceLocation: (String, UInt)
+    internal let label: String?
+
+    private let from: ConstraintItem
+    private let to: ConstraintItem
+    private let relation: ConstraintRelation
+    private let multiplier: ConstraintMultiplierTarget
+    private var constant: ConstraintConstantTarget {
+        didSet {
+            self.updateConstantAndPriorityIfNeeded()
+        }
+    }
+    private var priority: ConstraintPriorityTarget {
+        didSet {
+          self.updateConstantAndPriorityIfNeeded()
+        }
+    }
+    public var layoutConstraints: [LayoutConstraint]
+    
+    public var isActive: Bool {
+        set {
+            if newValue {
+                activate()
+            }
+            else {
+                deactivate()
+            }
+        }
+        
+        get {
+            for layoutConstraint in self.layoutConstraints {
+                if layoutConstraint.isActive {
+                    return true
+                }
+            }
+            return false
+        }
+    }
+    
+    // MARK: Initialization
+
+    internal init(from: ConstraintItem,
+                  to: ConstraintItem,
+                  relation: ConstraintRelation,
+                  sourceLocation: (String, UInt),
+                  label: String?,
+                  multiplier: ConstraintMultiplierTarget,
+                  constant: ConstraintConstantTarget,
+                  priority: ConstraintPriorityTarget) {
+        self.from = from
+        self.to = to
+        self.relation = relation
+        self.sourceLocation = sourceLocation
+        self.label = label
+        self.multiplier = multiplier
+        self.constant = constant
+        self.priority = priority
+        self.layoutConstraints = []
+
+        // get attributes
+        let layoutFromAttributes = self.from.attributes.layoutAttributes
+        let layoutToAttributes = self.to.attributes.layoutAttributes
+
+        // get layout from
+        let layoutFrom = self.from.layoutConstraintItem!
+
+        // get relation
+        let layoutRelation = self.relation.layoutRelation
+
+        for layoutFromAttribute in layoutFromAttributes {
+            // get layout to attribute
+            let layoutToAttribute: LayoutAttribute
+            #if canImport(UIKit)
+                if layoutToAttributes.count > 0 {
+                    if self.from.attributes == .edges && self.to.attributes == .margins {
+                        switch layoutFromAttribute {
+                        case .left:
+                            layoutToAttribute = .leftMargin
+                        case .right:
+                            layoutToAttribute = .rightMargin
+                        case .top:
+                            layoutToAttribute = .topMargin
+                        case .bottom:
+                            layoutToAttribute = .bottomMargin
+                        default:
+                            fatalError()
+                        }
+                    } else if self.from.attributes == .margins && self.to.attributes == .edges {
+                        switch layoutFromAttribute {
+                        case .leftMargin:
+                            layoutToAttribute = .left
+                        case .rightMargin:
+                            layoutToAttribute = .right
+                        case .topMargin:
+                            layoutToAttribute = .top
+                        case .bottomMargin:
+                            layoutToAttribute = .bottom
+                        default:
+                            fatalError()
+                        }
+                    } else if self.from.attributes == .directionalEdges && self.to.attributes == .directionalMargins {
+                      switch layoutFromAttribute {
+                      case .leading:
+                        layoutToAttribute = .leadingMargin
+                      case .trailing:
+                        layoutToAttribute = .trailingMargin
+                      case .top:
+                        layoutToAttribute = .topMargin
+                      case .bottom:
+                        layoutToAttribute = .bottomMargin
+                      default:
+                        fatalError()
+                      }
+                    } else if self.from.attributes == .directionalMargins && self.to.attributes == .directionalEdges {
+                      switch layoutFromAttribute {
+                      case .leadingMargin:
+                        layoutToAttribute = .leading
+                      case .trailingMargin:
+                        layoutToAttribute = .trailing
+                      case .topMargin:
+                        layoutToAttribute = .top
+                      case .bottomMargin:
+                        layoutToAttribute = .bottom
+                      default:
+                        fatalError()
+                      }
+                    } else if self.from.attributes == self.to.attributes {
+                        layoutToAttribute = layoutFromAttribute
+                    } else {
+                        layoutToAttribute = layoutToAttributes[0]
+                    }
+                } else {
+                    if self.to.target == nil && (layoutFromAttribute == .centerX || layoutFromAttribute == .centerY) {
+                        layoutToAttribute = layoutFromAttribute == .centerX ? .left : .top
+                    } else {
+                        layoutToAttribute = layoutFromAttribute
+                    }
+                }
+            #else
+                if self.from.attributes == self.to.attributes {
+                    layoutToAttribute = layoutFromAttribute
+                } else if layoutToAttributes.count > 0 {
+                    layoutToAttribute = layoutToAttributes[0]
+                } else {
+                    layoutToAttribute = layoutFromAttribute
+                }
+            #endif
+
+            // get layout constant
+            let layoutConstant: CGFloat = self.constant.constraintConstantTargetValueFor(layoutAttribute: layoutToAttribute)
+
+            // get layout to
+            var layoutTo: AnyObject? = self.to.target
+
+            // use superview if possible
+            if layoutTo == nil && layoutToAttribute != .width && layoutToAttribute != .height {
+                layoutTo = layoutFrom.superview
+            }
+
+            // create layout constraint
+            let layoutConstraint = LayoutConstraint(
+                item: layoutFrom,
+                attribute: layoutFromAttribute,
+                relatedBy: layoutRelation,
+                toItem: layoutTo,
+                attribute: layoutToAttribute,
+                multiplier: self.multiplier.constraintMultiplierTargetValue,
+                constant: layoutConstant
+            )
+
+            // set label
+            layoutConstraint.label = self.label
+
+            // set priority
+            layoutConstraint.priority = LayoutPriority(rawValue: self.priority.constraintPriorityTargetValue)
+
+            // set constraint
+            layoutConstraint.constraint = self
+
+            // append
+            self.layoutConstraints.append(layoutConstraint)
+        }
+    }
+
+    // MARK: Public
+
+    @available(*, deprecated, renamed:"activate()")
+    public func install() {
+        self.activate()
+    }
+
+    @available(*, deprecated, renamed:"deactivate()")
+    public func uninstall() {
+        self.deactivate()
+    }
+
+    public func activate() {
+        self.activateIfNeeded()
+    }
+
+    public func deactivate() {
+        self.deactivateIfNeeded()
+    }
+
+    @discardableResult
+    public func update(offset: ConstraintOffsetTarget) -> Constraint {
+        self.constant = offset.constraintOffsetTargetValue
+        return self
+    }
+
+    @discardableResult
+    public func update(inset: ConstraintInsetTarget) -> Constraint {
+        self.constant = inset.constraintInsetTargetValue
+        return self
+    }
+
+    #if canImport(UIKit)
+    @discardableResult
+    @available(iOS 11.0, tvOS 11.0, *)
+    public func update(inset: ConstraintDirectionalInsetTarget) -> Constraint {
+      self.constant = inset.constraintDirectionalInsetTargetValue
+      return self
+    }
+    #endif
+
+    @discardableResult
+    public func update(priority: ConstraintPriorityTarget) -> Constraint {
+        self.priority = priority.constraintPriorityTargetValue
+        return self
+    }
+
+    @discardableResult
+    public func update(priority: ConstraintPriority) -> Constraint {
+        self.priority = priority.value
+        return self
+    }
+
+    @available(*, deprecated, renamed:"update(offset:)")
+    public func updateOffset(amount: ConstraintOffsetTarget) -> Void { self.update(offset: amount) }
+
+    @available(*, deprecated, renamed:"update(inset:)")
+    public func updateInsets(amount: ConstraintInsetTarget) -> Void { self.update(inset: amount) }
+
+    @available(*, deprecated, renamed:"update(priority:)")
+    public func updatePriority(amount: ConstraintPriorityTarget) -> Void { self.update(priority: amount) }
+
+    @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.")
+    public func updatePriorityRequired() -> Void {}
+
+    @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.")
+    public func updatePriorityHigh() -> Void { fatalError("Must be implemented by Concrete subclass.") }
+
+    @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.")
+    public func updatePriorityMedium() -> Void { fatalError("Must be implemented by Concrete subclass.") }
+
+    @available(*, deprecated, message:"Use update(priority: ConstraintPriorityTarget) instead.")
+    public func updatePriorityLow() -> Void { fatalError("Must be implemented by Concrete subclass.") }
+
+    // MARK: Internal
+
+    internal func updateConstantAndPriorityIfNeeded() {
+        for layoutConstraint in self.layoutConstraints {
+            let attribute = (layoutConstraint.secondAttribute == .notAnAttribute) ? layoutConstraint.firstAttribute : layoutConstraint.secondAttribute
+            layoutConstraint.constant = self.constant.constraintConstantTargetValueFor(layoutAttribute: attribute)
+
+            let requiredPriority = ConstraintPriority.required.value
+            if (layoutConstraint.priority.rawValue < requiredPriority), (self.priority.constraintPriorityTargetValue != requiredPriority) {
+                layoutConstraint.priority = LayoutPriority(rawValue: self.priority.constraintPriorityTargetValue)
+            }
+        }
+    }
+
+    internal func activateIfNeeded(updatingExisting: Bool = false) {
+        guard let item = self.from.layoutConstraintItem else {
+            print("WARNING: SnapKit failed to get from item from constraint. Activate will be a no-op.")
+            return
+        }
+        let layoutConstraints = self.layoutConstraints
+
+        if updatingExisting {
+            var existingLayoutConstraints: [LayoutConstraint] = []
+            for constraint in item.constraints {
+                existingLayoutConstraints += constraint.layoutConstraints
+            }
+
+            for layoutConstraint in layoutConstraints {
+                let existingLayoutConstraint = existingLayoutConstraints.first { $0 == layoutConstraint }
+                guard let updateLayoutConstraint = existingLayoutConstraint else {
+                    fatalError("Updated constraint could not find existing matching constraint to update: \(layoutConstraint)")
+                }
+
+                let updateLayoutAttribute = (updateLayoutConstraint.secondAttribute == .notAnAttribute) ? updateLayoutConstraint.firstAttribute : updateLayoutConstraint.secondAttribute
+                updateLayoutConstraint.constant = self.constant.constraintConstantTargetValueFor(layoutAttribute: updateLayoutAttribute)
+            }
+        } else {
+            NSLayoutConstraint.activate(layoutConstraints)
+            item.add(constraints: [self])
+        }
+    }
+
+    internal func deactivateIfNeeded() {
+        guard let item = self.from.layoutConstraintItem else {
+            print("WARNING: SnapKit failed to get from item from constraint. Deactivate will be a no-op.")
+            return
+        }
+        let layoutConstraints = self.layoutConstraints
+        NSLayoutConstraint.deactivate(layoutConstraints)
+        item.remove(constraints: [self])
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintAttributes.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintAttributes.swift
new file mode 100644 (file)
index 0000000..c1a79c2
--- /dev/null
@@ -0,0 +1,203 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+internal struct ConstraintAttributes : OptionSet, ExpressibleByIntegerLiteral {
+    
+    typealias IntegerLiteralType = UInt
+    
+    internal init(rawValue: UInt) {
+        self.rawValue = rawValue
+    }
+    internal init(_ rawValue: UInt) {
+        self.init(rawValue: rawValue)
+    }
+    internal init(nilLiteral: ()) {
+        self.rawValue = 0
+    }
+    internal init(integerLiteral rawValue: IntegerLiteralType) {
+        self.init(rawValue: rawValue)
+    }
+    
+    internal private(set) var rawValue: UInt
+    internal static var allZeros: ConstraintAttributes { return 0 }
+    internal static func convertFromNilLiteral() -> ConstraintAttributes { return 0 }
+    internal var boolValue: Bool { return self.rawValue != 0 }
+    
+    internal func toRaw() -> UInt { return self.rawValue }
+    internal static func fromRaw(_ raw: UInt) -> ConstraintAttributes? { return self.init(raw) }
+    internal static func fromMask(_ raw: UInt) -> ConstraintAttributes { return self.init(raw) }
+    
+    // normal
+    
+    internal static let none: ConstraintAttributes = 0
+    internal static let left: ConstraintAttributes = ConstraintAttributes(UInt(1) << 0)
+    internal static let top: ConstraintAttributes = ConstraintAttributes(UInt(1) << 1)
+    internal static let right: ConstraintAttributes = ConstraintAttributes(UInt(1) << 2)
+    internal static let bottom: ConstraintAttributes = ConstraintAttributes(UInt(1) << 3)
+    internal static let leading: ConstraintAttributes = ConstraintAttributes(UInt(1) << 4)
+    internal static let trailing: ConstraintAttributes = ConstraintAttributes(UInt(1) << 5)
+    internal static let width: ConstraintAttributes = ConstraintAttributes(UInt(1) << 6)
+    internal static let height: ConstraintAttributes = ConstraintAttributes(UInt(1) << 7)
+    internal static let centerX: ConstraintAttributes = ConstraintAttributes(UInt(1) << 8)
+    internal static let centerY: ConstraintAttributes = ConstraintAttributes(UInt(1) << 9)
+    internal static let lastBaseline: ConstraintAttributes = ConstraintAttributes(UInt(1) << 10)
+    
+    @available(iOS 8.0, OSX 10.11, *)
+    internal static let firstBaseline: ConstraintAttributes = ConstraintAttributes(UInt(1) << 11)
+
+    @available(iOS 8.0, *)
+    internal static let leftMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 12)
+
+    @available(iOS 8.0, *)
+    internal static let rightMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 13)
+
+    @available(iOS 8.0, *)
+    internal static let topMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 14)
+
+    @available(iOS 8.0, *)
+    internal static let bottomMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 15)
+
+    @available(iOS 8.0, *)
+    internal static let leadingMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 16)
+
+    @available(iOS 8.0, *)
+    internal static let trailingMargin: ConstraintAttributes = ConstraintAttributes(UInt(1) << 17)
+
+    @available(iOS 8.0, *)
+    internal static let centerXWithinMargins: ConstraintAttributes = ConstraintAttributes(UInt(1) << 18)
+
+    @available(iOS 8.0, *)
+    internal static let centerYWithinMargins: ConstraintAttributes = ConstraintAttributes(UInt(1) << 19)
+    
+    // aggregates
+    
+    internal static let edges: ConstraintAttributes = [.horizontalEdges, .verticalEdges]
+    internal static let horizontalEdges: ConstraintAttributes = [.left, .right]
+    internal static let verticalEdges: ConstraintAttributes = [.top, .bottom]
+    internal static let directionalEdges: ConstraintAttributes = [.directionalHorizontalEdges, .directionalVerticalEdges]
+    internal static let directionalHorizontalEdges: ConstraintAttributes = [.leading, .trailing]
+    internal static let directionalVerticalEdges: ConstraintAttributes = [.top, .bottom]
+    internal static let size: ConstraintAttributes = [.width, .height]
+    internal static let center: ConstraintAttributes = [.centerX, .centerY]
+
+    @available(iOS 8.0, *)
+    internal static let margins: ConstraintAttributes = [.leftMargin, .topMargin, .rightMargin, .bottomMargin]
+
+    @available(iOS 8.0, *)
+    internal static let directionalMargins: ConstraintAttributes = [.leadingMargin, .topMargin, .trailingMargin, .bottomMargin]
+
+    @available(iOS 8.0, *)
+    internal static let centerWithinMargins: ConstraintAttributes = [.centerXWithinMargins, .centerYWithinMargins]
+    
+    internal var layoutAttributes:[LayoutAttribute] {
+        var attrs = [LayoutAttribute]()
+        if (self.contains(ConstraintAttributes.left)) {
+            attrs.append(.left)
+        }
+        if (self.contains(ConstraintAttributes.top)) {
+            attrs.append(.top)
+        }
+        if (self.contains(ConstraintAttributes.right)) {
+            attrs.append(.right)
+        }
+        if (self.contains(ConstraintAttributes.bottom)) {
+            attrs.append(.bottom)
+        }
+        if (self.contains(ConstraintAttributes.leading)) {
+            attrs.append(.leading)
+        }
+        if (self.contains(ConstraintAttributes.trailing)) {
+            attrs.append(.trailing)
+        }
+        if (self.contains(ConstraintAttributes.width)) {
+            attrs.append(.width)
+        }
+        if (self.contains(ConstraintAttributes.height)) {
+            attrs.append(.height)
+        }
+        if (self.contains(ConstraintAttributes.centerX)) {
+            attrs.append(.centerX)
+        }
+        if (self.contains(ConstraintAttributes.centerY)) {
+            attrs.append(.centerY)
+        }
+        if (self.contains(ConstraintAttributes.lastBaseline)) {
+            attrs.append(.lastBaseline)
+        }
+        
+        #if canImport(UIKit)
+            if (self.contains(ConstraintAttributes.firstBaseline)) {
+                attrs.append(.firstBaseline)
+            }
+            if (self.contains(ConstraintAttributes.leftMargin)) {
+                attrs.append(.leftMargin)
+            }
+            if (self.contains(ConstraintAttributes.rightMargin)) {
+                attrs.append(.rightMargin)
+            }
+            if (self.contains(ConstraintAttributes.topMargin)) {
+                attrs.append(.topMargin)
+            }
+            if (self.contains(ConstraintAttributes.bottomMargin)) {
+                attrs.append(.bottomMargin)
+            }
+            if (self.contains(ConstraintAttributes.leadingMargin)) {
+                attrs.append(.leadingMargin)
+            }
+            if (self.contains(ConstraintAttributes.trailingMargin)) {
+                attrs.append(.trailingMargin)
+            }
+            if (self.contains(ConstraintAttributes.centerXWithinMargins)) {
+                attrs.append(.centerXWithinMargins)
+            }
+            if (self.contains(ConstraintAttributes.centerYWithinMargins)) {
+                attrs.append(.centerYWithinMargins)
+            }
+        #endif
+        
+        return attrs
+    }
+}
+
+internal func + (left: ConstraintAttributes, right: ConstraintAttributes) -> ConstraintAttributes {
+    return left.union(right)
+}
+
+internal func +=(left: inout ConstraintAttributes, right: ConstraintAttributes) {
+    left.formUnion(right)
+}
+
+internal func -=(left: inout ConstraintAttributes, right: ConstraintAttributes) {
+    left.subtract(right)
+}
+
+internal func ==(left: ConstraintAttributes, right: ConstraintAttributes) -> Bool {
+    return left.rawValue == right.rawValue
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintConfig.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintConfig.swift
new file mode 100644 (file)
index 0000000..9bd0f23
--- /dev/null
@@ -0,0 +1,37 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+    public typealias ConstraintInterfaceLayoutDirection = UIUserInterfaceLayoutDirection
+#else
+    import AppKit
+    public typealias ConstraintInterfaceLayoutDirection = NSUserInterfaceLayoutDirection
+#endif
+
+
+public struct ConstraintConfig {
+    
+    public static var interfaceLayoutDirection: ConstraintInterfaceLayoutDirection = .leftToRight
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintConstantTarget.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintConstantTarget.swift
new file mode 100644 (file)
index 0000000..e16f503
--- /dev/null
@@ -0,0 +1,213 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol ConstraintConstantTarget {
+}
+
+extension CGPoint: ConstraintConstantTarget {
+}
+
+extension CGSize: ConstraintConstantTarget {    
+}
+
+extension ConstraintInsets: ConstraintConstantTarget {
+}
+
+#if canImport(UIKit)
+@available(iOS 11.0, tvOS 11.0, *)
+extension ConstraintDirectionalInsets: ConstraintConstantTarget {
+}
+#endif
+
+extension ConstraintConstantTarget {
+    
+    internal func constraintConstantTargetValueFor(layoutAttribute: LayoutAttribute) -> CGFloat {
+        if let value = self as? CGFloat {
+            return value
+        }
+        
+        if let value = self as? Float {
+            return CGFloat(value)
+        }
+        
+        if let value = self as? Double {
+            return CGFloat(value)
+        }
+        
+        if let value = self as? Int {
+            return CGFloat(value)
+        }
+        
+        if let value = self as? UInt {
+            return CGFloat(value)
+        }
+        
+        if let value = self as? CGSize {
+            if layoutAttribute == .width {
+                return value.width
+            } else if layoutAttribute == .height {
+                return value.height
+            } else {
+                return 0.0
+            }
+        }
+        
+        if let value = self as? CGPoint {
+            #if canImport(UIKit)
+                switch layoutAttribute {
+                case .left, .right, .leading, .trailing, .centerX, .leftMargin, .rightMargin, .leadingMargin, .trailingMargin, .centerXWithinMargins:
+                    return value.x
+                case .top, .bottom, .centerY, .topMargin, .bottomMargin, .centerYWithinMargins, .lastBaseline, .firstBaseline:
+                    return value.y
+                case .width, .height, .notAnAttribute:
+                    return 0.0
+                #if swift(>=5.0)
+                @unknown default:
+                    return 0.0
+                #endif
+            }
+            #else
+                switch layoutAttribute {
+                case .left, .right, .leading, .trailing, .centerX:
+                    return value.x
+                case .top, .bottom, .centerY, .lastBaseline, .firstBaseline:
+                    return value.y
+                case .width, .height, .notAnAttribute:
+                    return 0.0
+                #if swift(>=5.0)
+                @unknown default:
+                    return 0.0
+                #endif
+            }
+            #endif
+        }
+        
+        if let value = self as? ConstraintInsets {
+            #if canImport(UIKit)
+                switch layoutAttribute {
+                case .left, .leftMargin:
+                    return value.left
+                case .top, .topMargin, .firstBaseline:
+                    return value.top
+                case .right, .rightMargin:
+                    return -value.right
+                case .bottom, .bottomMargin, .lastBaseline:
+                    return -value.bottom
+                case .leading, .leadingMargin:
+                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.left : value.right
+                case .trailing, .trailingMargin:
+                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.right : -value.left
+                case .centerX, .centerXWithinMargins:
+                    return (value.left - value.right) / 2
+                case .centerY, .centerYWithinMargins:
+                    return (value.top - value.bottom) / 2
+                case .width:
+                    return -(value.left + value.right)
+                case .height:
+                    return -(value.top + value.bottom)
+                case .notAnAttribute:
+                    return 0.0
+                #if swift(>=5.0)
+                @unknown default:
+                    return 0.0
+                #endif
+            }
+            #else
+                switch layoutAttribute {
+                case .left:
+                    return value.left
+                case .top, .firstBaseline:
+                    return value.top
+                case .right:
+                    return -value.right
+                case .bottom, .lastBaseline:
+                    return -value.bottom
+                case .leading:
+                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.left : value.right
+                case .trailing:
+                    return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.right : -value.left
+                case .centerX:
+                    return (value.left - value.right) / 2
+                case .centerY:
+                    return (value.top - value.bottom) / 2
+                case .width:
+                    return -(value.left + value.right)
+                case .height:
+                    return -(value.top + value.bottom)
+                case .notAnAttribute:
+                    return 0.0
+                #if swift(>=5.0)
+                @unknown default:
+                    return 0.0
+                #endif
+            }
+            #endif
+        }
+        
+        #if canImport(UIKit)
+            if #available(iOS 11.0, tvOS 11.0, *), let value = self as? ConstraintDirectionalInsets {
+                switch layoutAttribute {
+                case .left, .leftMargin:
+                  return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? value.leading : value.trailing
+                case .top, .topMargin, .firstBaseline:
+                    return value.top
+                case .right, .rightMargin:
+                  return (ConstraintConfig.interfaceLayoutDirection == .leftToRight) ? -value.trailing : -value.leading
+                case .bottom, .bottomMargin, .lastBaseline:
+                    return -value.bottom
+                case .leading, .leadingMargin:
+                    return value.leading
+                case .trailing, .trailingMargin:
+                    return -value.trailing
+                case .centerX, .centerXWithinMargins:
+                    return (value.leading - value.trailing) / 2
+                case .centerY, .centerYWithinMargins:
+                    return (value.top - value.bottom) / 2
+                case .width:
+                    return -(value.leading + value.trailing)
+                case .height:
+                    return -(value.top + value.bottom)
+                case .notAnAttribute:
+                    return 0.0
+                #if swift(>=5.0)
+                @unknown default:
+                    return 0.0
+                #else
+                default:
+                    return 0.0
+                #endif
+                }
+            }
+        #endif
+
+        return 0.0
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDSL.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDSL.swift
new file mode 100644 (file)
index 0000000..5683b7f
--- /dev/null
@@ -0,0 +1,209 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol ConstraintDSL {
+    
+    var target: AnyObject? { get }
+    
+    func setLabel(_ value: String?)
+    func label() -> String?
+    
+}
+extension ConstraintDSL {
+    
+    public func setLabel(_ value: String?) {
+        objc_setAssociatedObject(self.target as Any, &labelKey, value, .OBJC_ASSOCIATION_COPY_NONATOMIC)
+    }
+    public func label() -> String? {
+        return objc_getAssociatedObject(self.target as Any, &labelKey) as? String
+    }
+    
+}
+private var labelKey: UInt8 = 0
+
+
+public protocol ConstraintBasicAttributesDSL : ConstraintDSL {
+}
+extension ConstraintBasicAttributesDSL {
+    
+    // MARK: Basics
+    
+    public var left: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.left)
+    }
+    
+    public var top: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.top)
+    }
+    
+    public var right: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.right)
+    }
+    
+    public var bottom: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottom)
+    }
+    
+    public var leading: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leading)
+    }
+    
+    public var trailing: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.trailing)
+    }
+    
+    public var width: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.width)
+    }
+    
+    public var height: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.height)
+    }
+    
+    public var centerX: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerX)
+    }
+    
+    public var centerY: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerY)
+    }
+    
+    public var edges: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.edges)
+    }
+    
+    public var directionalEdges: ConstraintItem {
+      return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalEdges)
+    }
+
+    public var horizontalEdges: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.horizontalEdges)
+    }
+
+    public var verticalEdges: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.verticalEdges)
+    }
+
+    public var directionalHorizontalEdges: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalHorizontalEdges)
+    }
+
+    public var directionalVerticalEdges: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalVerticalEdges)
+    }
+
+    public var size: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.size)
+    }
+    
+    public var center: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.center)
+    }
+    
+}
+
+public protocol ConstraintAttributesDSL : ConstraintBasicAttributesDSL {
+}
+extension ConstraintAttributesDSL {
+    
+    // MARK: Baselines
+    @available(*, deprecated, renamed:"lastBaseline")
+    public var baseline: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.lastBaseline)
+    }
+    
+    @available(iOS 8.0, OSX 10.11, *)
+    public var lastBaseline: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.lastBaseline)
+    }
+    
+    @available(iOS 8.0, OSX 10.11, *)
+    public var firstBaseline: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.firstBaseline)
+    }
+    
+    // MARK: Margins
+    
+    @available(iOS 8.0, *)
+    public var leftMargin: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leftMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var topMargin: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.topMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var rightMargin: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.rightMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var bottomMargin: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottomMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var leadingMargin: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.leadingMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var trailingMargin: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.trailingMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var centerXWithinMargins: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerXWithinMargins)
+    }
+    
+    @available(iOS 8.0, *)
+    public var centerYWithinMargins: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerYWithinMargins)
+    }
+    
+    @available(iOS 8.0, *)
+    public var margins: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.margins)
+    }
+    
+    @available(iOS 8.0, *)
+    public var directionalMargins: ConstraintItem {
+      return ConstraintItem(target: self.target, attributes: ConstraintAttributes.directionalMargins)
+    }
+
+    @available(iOS 8.0, *)
+    public var centerWithinMargins: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.centerWithinMargins)
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDescription.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDescription.swift
new file mode 100644 (file)
index 0000000..b9d476c
--- /dev/null
@@ -0,0 +1,69 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public class ConstraintDescription {
+    
+    internal let item: LayoutConstraintItem
+    internal var attributes: ConstraintAttributes
+    internal var relation: ConstraintRelation? = nil
+    internal var sourceLocation: (String, UInt)? = nil
+    internal var label: String? = nil
+    internal var related: ConstraintItem? = nil
+    internal var multiplier: ConstraintMultiplierTarget = 1.0
+    internal var constant: ConstraintConstantTarget = 0.0
+    internal var priority: ConstraintPriorityTarget = 1000.0
+    internal lazy var constraint: Constraint? = {
+        guard let relation = self.relation,
+              let related = self.related,
+              let sourceLocation = self.sourceLocation else {
+            return nil
+        }
+        let from = ConstraintItem(target: self.item, attributes: self.attributes)
+        
+        return Constraint(
+            from: from,
+            to: related,
+            relation: relation,
+            sourceLocation: sourceLocation,
+            label: self.label,
+            multiplier: self.multiplier,
+            constant: self.constant,
+            priority: self.priority
+        )
+    }()
+    
+    // MARK: Initialization
+    
+    internal init(item: LayoutConstraintItem, attributes: ConstraintAttributes) {
+        self.item = item
+        self.attributes = attributes
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDirectionalInsetTarget.swift
new file mode 100644 (file)
index 0000000..4c3c418
--- /dev/null
@@ -0,0 +1,49 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+import UIKit
+#else
+import AppKit
+#endif
+
+#if canImport(UIKit)
+public protocol ConstraintDirectionalInsetTarget: ConstraintConstantTarget {
+}
+
+@available(iOS 11.0, tvOS 11.0, *)
+extension ConstraintDirectionalInsets: ConstraintDirectionalInsetTarget {
+}
+
+extension ConstraintDirectionalInsetTarget {
+
+  @available(iOS 11.0, tvOS 11.0, *)
+  internal var constraintDirectionalInsetTargetValue: ConstraintDirectionalInsets {
+    if let amount = self as? ConstraintDirectionalInsets {
+      return amount
+    } else {
+      return ConstraintDirectionalInsets(top: 0, leading: 0, bottom: 0, trailing: 0)
+    }
+  }
+}
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintDirectionalInsets.swift
new file mode 100644 (file)
index 0000000..056b5c8
--- /dev/null
@@ -0,0 +1,34 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+#if canImport(UIKit)
+    @available(iOS 11.0, tvOS 11.0, *)
+    public typealias ConstraintDirectionalInsets = NSDirectionalEdgeInsets
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintInsetTarget.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintInsetTarget.swift
new file mode 100644 (file)
index 0000000..43c0220
--- /dev/null
@@ -0,0 +1,72 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol ConstraintInsetTarget: ConstraintConstantTarget {
+}
+
+extension Int: ConstraintInsetTarget {
+}
+
+extension UInt: ConstraintInsetTarget {
+}
+
+extension Float: ConstraintInsetTarget {
+}
+
+extension Double: ConstraintInsetTarget {
+}
+
+extension CGFloat: ConstraintInsetTarget {
+}
+
+extension ConstraintInsets: ConstraintInsetTarget {
+}
+
+extension ConstraintInsetTarget {
+
+    internal var constraintInsetTargetValue: ConstraintInsets {
+        if let amount = self as? ConstraintInsets {
+            return amount
+        } else if let amount = self as? Float {
+            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))
+        } else if let amount = self as? Double {
+            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))
+        } else if let amount = self as? CGFloat {
+            return ConstraintInsets(top: amount, left: amount, bottom: amount, right: amount)
+        } else if let amount = self as? Int {
+            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))
+        } else if let amount = self as? UInt {
+            return ConstraintInsets(top: CGFloat(amount), left: CGFloat(amount), bottom: CGFloat(amount), right: CGFloat(amount))
+        } else {
+            return ConstraintInsets(top: 0, left: 0, bottom: 0, right: 0)
+        }
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintInsets.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintInsets.swift
new file mode 100644 (file)
index 0000000..64d781d
--- /dev/null
@@ -0,0 +1,35 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+#if canImport(UIKit)
+    public typealias ConstraintInsets = UIEdgeInsets
+#else
+    public typealias ConstraintInsets = NSEdgeInsets
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintItem.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintItem.swift
new file mode 100644 (file)
index 0000000..2f92221
--- /dev/null
@@ -0,0 +1,61 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public final class ConstraintItem {
+    
+    internal weak var target: AnyObject?
+    internal let attributes: ConstraintAttributes
+    
+    internal init(target: AnyObject?, attributes: ConstraintAttributes) {
+        self.target = target
+        self.attributes = attributes
+    }
+    
+    internal var layoutConstraintItem: LayoutConstraintItem? {
+        return self.target as? LayoutConstraintItem
+    }
+    
+}
+
+public func ==(lhs: ConstraintItem, rhs: ConstraintItem) -> Bool {
+    // pointer equality
+    guard lhs !== rhs else {
+        return true
+    }
+    
+    // must both have valid targets and identical attributes
+    guard let target1 = lhs.target,
+          let target2 = rhs.target,
+          target1 === target2 && lhs.attributes == rhs.attributes else {
+            return false
+    }
+    
+    return true
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuide+Extensions.swift
new file mode 100644 (file)
index 0000000..e9fd9b3
--- /dev/null
@@ -0,0 +1,36 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#endif
+    
+    
+@available(iOS 9.0, OSX 10.11, *)
+public extension ConstraintLayoutGuide {
+    
+    var snp: ConstraintLayoutGuideDSL {
+        return ConstraintLayoutGuideDSL(guide: self)
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuide.swift
new file mode 100644 (file)
index 0000000..fd89556
--- /dev/null
@@ -0,0 +1,37 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+#if canImport(UIKit)
+    @available(iOS 9.0, *)
+    public typealias ConstraintLayoutGuide = UILayoutGuide
+#else
+    @available(OSX 10.11, *)
+    public typealias ConstraintLayoutGuide = NSLayoutGuide
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutGuideDSL.swift
new file mode 100644 (file)
index 0000000..7e78261
--- /dev/null
@@ -0,0 +1,66 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+@available(iOS 9.0, OSX 10.11, *)
+public struct ConstraintLayoutGuideDSL: ConstraintAttributesDSL {
+    
+    @discardableResult
+    public func prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {
+        return ConstraintMaker.prepareConstraints(item: self.guide, closure: closure)
+    }
+    
+    public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        ConstraintMaker.makeConstraints(item: self.guide, closure: closure)
+    }
+    
+    public func remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        ConstraintMaker.remakeConstraints(item: self.guide, closure: closure)
+    }
+    
+    public func updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        ConstraintMaker.updateConstraints(item: self.guide, closure: closure)
+    }
+    
+    public func removeConstraints() {
+        ConstraintMaker.removeConstraints(item: self.guide)
+    }
+    
+    public var target: AnyObject? {
+        return self.guide
+    }
+    
+    internal let guide: ConstraintLayoutGuide
+    
+    internal init(guide: ConstraintLayoutGuide) {
+        self.guide = guide
+        
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutSupport.swift
new file mode 100644 (file)
index 0000000..085f5cd
--- /dev/null
@@ -0,0 +1,36 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+#if canImport(UIKit)
+    @available(iOS 8.0, *)
+    public typealias ConstraintLayoutSupport = UILayoutSupport
+#else
+    public class ConstraintLayoutSupport {}
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintLayoutSupportDSL.swift
new file mode 100644 (file)
index 0000000..71e1158
--- /dev/null
@@ -0,0 +1,56 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+@available(iOS 8.0, *)
+public struct ConstraintLayoutSupportDSL: ConstraintDSL {
+    
+    public var target: AnyObject? {
+        return self.support
+    }
+    
+    internal let support: ConstraintLayoutSupport
+    
+    internal init(support: ConstraintLayoutSupport) {
+        self.support = support
+        
+    }
+    
+    public var top: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.top)
+    }
+    
+    public var bottom: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.bottom)
+    }
+    
+    public var height: ConstraintItem {
+        return ConstraintItem(target: self.target, attributes: ConstraintAttributes.height)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMaker.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMaker.swift
new file mode 100644 (file)
index 0000000..7c352f6
--- /dev/null
@@ -0,0 +1,224 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+public class ConstraintMaker {
+    
+    public var left: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.left)
+    }
+    
+    public var top: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.top)
+    }
+    
+    public var bottom: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.bottom)
+    }
+    
+    public var right: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.right)
+    }
+    
+    public var leading: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.leading)
+    }
+    
+    public var trailing: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.trailing)
+    }
+    
+    public var width: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.width)
+    }
+    
+    public var height: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.height)
+    }
+    
+    public var centerX: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.centerX)
+    }
+    
+    public var centerY: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.centerY)
+    }
+    
+    @available(*, deprecated, renamed:"lastBaseline")
+    public var baseline: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.lastBaseline)
+    }
+    
+    public var lastBaseline: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.lastBaseline)
+    }
+    
+    @available(iOS 8.0, OSX 10.11, *)
+    public var firstBaseline: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.firstBaseline)
+    }
+    
+    @available(iOS 8.0, *)
+    public var leftMargin: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.leftMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var rightMargin: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.rightMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var topMargin: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.topMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var bottomMargin: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.bottomMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var leadingMargin: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.leadingMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var trailingMargin: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.trailingMargin)
+    }
+    
+    @available(iOS 8.0, *)
+    public var centerXWithinMargins: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.centerXWithinMargins)
+    }
+    
+    @available(iOS 8.0, *)
+    public var centerYWithinMargins: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.centerYWithinMargins)
+    }
+    
+    public var edges: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.edges)
+    }
+    public var horizontalEdges: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.horizontalEdges)
+    }
+    public var verticalEdges: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.verticalEdges)
+    }
+    public var directionalEdges: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.directionalEdges)
+    }
+    public var directionalHorizontalEdges: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.directionalHorizontalEdges)
+    }
+    public var directionalVerticalEdges: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.directionalVerticalEdges)
+    }
+    public var size: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.size)
+    }
+    public var center: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.center)
+    }
+    
+    @available(iOS 8.0, *)
+    public var margins: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.margins)
+    }
+    
+    @available(iOS 8.0, *)
+    public var directionalMargins: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.directionalMargins)
+    }
+
+    @available(iOS 8.0, *)
+    public var centerWithinMargins: ConstraintMakerExtendable {
+        return self.makeExtendableWithAttributes(.centerWithinMargins)
+    }
+    
+    public let item: LayoutConstraintItem
+    private var descriptions = [ConstraintDescription]()
+    
+    internal init(item: LayoutConstraintItem) {
+        self.item = item
+        self.item.prepare()
+    }
+    
+    internal func makeExtendableWithAttributes(_ attributes: ConstraintAttributes) -> ConstraintMakerExtendable {
+        let description = ConstraintDescription(item: self.item, attributes: attributes)
+        self.descriptions.append(description)
+        return ConstraintMakerExtendable(description)
+    }
+    
+    internal static func prepareConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {
+        let maker = ConstraintMaker(item: item)
+        closure(maker)
+        var constraints: [Constraint] = []
+        for description in maker.descriptions {
+            guard let constraint = description.constraint else {
+                continue
+            }
+            constraints.append(constraint)
+        }
+        return constraints
+    }
+    
+    internal static func makeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {
+        let constraints = prepareConstraints(item: item, closure: closure)
+        for constraint in constraints {
+            constraint.activateIfNeeded(updatingExisting: false)
+        }
+    }
+    
+    internal static func remakeConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {
+        self.removeConstraints(item: item)
+        self.makeConstraints(item: item, closure: closure)
+    }
+    
+    internal static func updateConstraints(item: LayoutConstraintItem, closure: (_ make: ConstraintMaker) -> Void) {
+        guard item.constraints.count > 0 else {
+            self.makeConstraints(item: item, closure: closure)
+            return
+        }
+        
+        let constraints = prepareConstraints(item: item, closure: closure)
+        for constraint in constraints {
+            constraint.activateIfNeeded(updatingExisting: true)
+        }
+    }
+    
+    internal static func removeConstraints(item: LayoutConstraintItem) {
+        let constraints = item.constraints
+        for constraint in constraints {
+            constraint.deactivateIfNeeded()
+        }
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerEditable.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerEditable.swift
new file mode 100644 (file)
index 0000000..0e08e38
--- /dev/null
@@ -0,0 +1,64 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public class ConstraintMakerEditable: ConstraintMakerPrioritizable {
+
+    @discardableResult
+    public func multipliedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable {
+        self.description.multiplier = amount
+        return self
+    }
+    
+    @discardableResult
+    public func dividedBy(_ amount: ConstraintMultiplierTarget) -> ConstraintMakerEditable {
+        return self.multipliedBy(1.0 / amount.constraintMultiplierTargetValue)
+    }
+    
+    @discardableResult
+    public func offset(_ amount: ConstraintOffsetTarget) -> ConstraintMakerEditable {
+        self.description.constant = amount.constraintOffsetTargetValue
+        return self
+    }
+    
+    @discardableResult
+    public func inset(_ amount: ConstraintInsetTarget) -> ConstraintMakerEditable {
+        self.description.constant = amount.constraintInsetTargetValue
+        return self
+    }
+    
+    #if canImport(UIKit)
+    @discardableResult
+    @available(iOS 11.0, tvOS 11.0, *)
+    public func inset(_ amount: ConstraintDirectionalInsetTarget) -> ConstraintMakerEditable {
+        self.description.constant = amount.constraintDirectionalInsetTargetValue
+        return self
+    }
+    #endif
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerExtendable.swift
new file mode 100644 (file)
index 0000000..b30688e
--- /dev/null
@@ -0,0 +1,195 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public class ConstraintMakerExtendable: ConstraintMakerRelatable {
+    
+    public var left: ConstraintMakerExtendable {
+        self.description.attributes += .left
+        return self
+    }
+    
+    public var top: ConstraintMakerExtendable {
+        self.description.attributes += .top
+        return self
+    }
+    
+    public var bottom: ConstraintMakerExtendable {
+        self.description.attributes += .bottom
+        return self
+    }
+    
+    public var right: ConstraintMakerExtendable {
+        self.description.attributes += .right
+        return self
+    }
+    
+    public var leading: ConstraintMakerExtendable {
+        self.description.attributes += .leading
+        return self
+    }
+    
+    public var trailing: ConstraintMakerExtendable {
+        self.description.attributes += .trailing
+        return self
+    }
+    
+    public var width: ConstraintMakerExtendable {
+        self.description.attributes += .width
+        return self
+    }
+    
+    public var height: ConstraintMakerExtendable {
+        self.description.attributes += .height
+        return self
+    }
+    
+    public var centerX: ConstraintMakerExtendable {
+        self.description.attributes += .centerX
+        return self
+    }
+    
+    public var centerY: ConstraintMakerExtendable {
+        self.description.attributes += .centerY
+        return self
+    }
+    
+    @available(*, deprecated, renamed:"lastBaseline")
+    public var baseline: ConstraintMakerExtendable {
+        self.description.attributes += .lastBaseline
+        return self
+    }
+    
+    public var lastBaseline: ConstraintMakerExtendable {
+        self.description.attributes += .lastBaseline
+        return self
+    }
+    
+    @available(iOS 8.0, OSX 10.11, *)
+    public var firstBaseline: ConstraintMakerExtendable {
+        self.description.attributes += .firstBaseline
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var leftMargin: ConstraintMakerExtendable {
+        self.description.attributes += .leftMargin
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var rightMargin: ConstraintMakerExtendable {
+        self.description.attributes += .rightMargin
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var topMargin: ConstraintMakerExtendable {
+        self.description.attributes += .topMargin
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var bottomMargin: ConstraintMakerExtendable {
+        self.description.attributes += .bottomMargin
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var leadingMargin: ConstraintMakerExtendable {
+        self.description.attributes += .leadingMargin
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var trailingMargin: ConstraintMakerExtendable {
+        self.description.attributes += .trailingMargin
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var centerXWithinMargins: ConstraintMakerExtendable {
+        self.description.attributes += .centerXWithinMargins
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var centerYWithinMargins: ConstraintMakerExtendable {
+        self.description.attributes += .centerYWithinMargins
+        return self
+    }
+    
+    public var edges: ConstraintMakerExtendable {
+        self.description.attributes += .edges
+        return self
+    }
+    public var horizontalEdges: ConstraintMakerExtendable {
+        self.description.attributes += .horizontalEdges
+        return self
+    }
+    public var verticalEdges: ConstraintMakerExtendable {
+        self.description.attributes += .verticalEdges
+        return self
+    }
+    public var directionalEdges: ConstraintMakerExtendable {
+        self.description.attributes += .directionalEdges
+        return self
+    }
+    public var directionalHorizontalEdges: ConstraintMakerExtendable {
+        self.description.attributes += .directionalHorizontalEdges
+        return self
+    }
+    public var directionalVerticalEdges: ConstraintMakerExtendable {
+        self.description.attributes += .directionalVerticalEdges
+        return self
+    }
+    public var size: ConstraintMakerExtendable {
+        self.description.attributes += .size
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var margins: ConstraintMakerExtendable {
+        self.description.attributes += .margins
+        return self
+    }
+    
+    @available(iOS 8.0, *)
+    public var directionalMargins: ConstraintMakerExtendable {
+      self.description.attributes += .directionalMargins
+      return self
+    }
+
+    @available(iOS 8.0, *)
+    public var centerWithinMargins: ConstraintMakerExtendable {
+        self.description.attributes += .centerWithinMargins
+        return self
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerFinalizable.swift
new file mode 100644 (file)
index 0000000..8342476
--- /dev/null
@@ -0,0 +1,49 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public class ConstraintMakerFinalizable {
+    
+    internal let description: ConstraintDescription
+    
+    internal init(_ description: ConstraintDescription) {
+        self.description = description
+    }
+    
+    @discardableResult
+    public func labeled(_ label: String) -> ConstraintMakerFinalizable {
+        self.description.label = label
+        return self
+    }
+    
+    public var constraint: Constraint {
+        return self.description.constraint!
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerPrioritizable.swift
new file mode 100644 (file)
index 0000000..05451e6
--- /dev/null
@@ -0,0 +1,70 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+@available(*, deprecated, message:"Use ConstraintMakerPrioritizable instead.")
+public typealias ConstraintMakerPriortizable = ConstraintMakerPrioritizable
+
+public class ConstraintMakerPrioritizable: ConstraintMakerFinalizable {
+    
+    @discardableResult
+    public func priority(_ amount: ConstraintPriority) -> ConstraintMakerFinalizable {
+        self.description.priority = amount.value
+        return self
+    }
+    
+    @discardableResult
+    public func priority(_ amount: ConstraintPriorityTarget) -> ConstraintMakerFinalizable {
+        self.description.priority = amount
+        return self
+    }
+    
+    @available(*, deprecated, message:"Use priority(.required) instead.")
+    @discardableResult
+    public func priorityRequired() -> ConstraintMakerFinalizable {
+        return self.priority(.required)
+    }
+    
+    @available(*, deprecated, message:"Use priority(.high) instead.")
+    @discardableResult
+    public func priorityHigh() -> ConstraintMakerFinalizable {
+        return self.priority(.high)
+    }
+    
+    @available(*, deprecated, message:"Use priority(.medium) instead.")
+    @discardableResult
+    public func priorityMedium() -> ConstraintMakerFinalizable {
+        return self.priority(.medium)
+    }
+    
+    @available(*, deprecated, message:"Use priority(.low) instead.")
+    @discardableResult
+    public func priorityLow() -> ConstraintMakerFinalizable {
+        return self.priority(.low)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerRelatable+Extensions.swift
new file mode 100644 (file)
index 0000000..bfde272
--- /dev/null
@@ -0,0 +1,57 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+extension ConstraintMakerRelatable {
+  
+    @discardableResult
+    public func equalToSuperview<T: ConstraintRelatableTarget>(_ closure: (ConstraintView) -> T, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable {
+        guard let other = self.description.item.superview else {
+            fatalError("Expected superview but found nil when attempting make constraint `equalToSuperview`.")
+        }
+        return self.relatedTo(closure(other), relation: .equal, file: file, line: line)
+    }
+  
+    @discardableResult
+    public func lessThanOrEqualToSuperview<T: ConstraintRelatableTarget>(_ closure: (ConstraintView) -> T, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable {
+        guard let other = self.description.item.superview else {
+            fatalError("Expected superview but found nil when attempting make constraint `lessThanOrEqualToSuperview`.")
+        }
+        return self.relatedTo(closure(other), relation: .lessThanOrEqual, file: file, line: line)
+    }
+  
+    @discardableResult
+    public func greaterThanOrEqualToSuperview<T: ConstraintRelatableTarget>(_ closure: (ConstraintView) -> T, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable {
+        guard let other = self.description.item.superview else {
+            fatalError("Expected superview but found nil when attempting make constraint `greaterThanOrEqualToSuperview`.")
+        }
+        return self.relatedTo(closure(other), relation: .greaterThanOrEqual, file: file, line: line)
+    }
+  
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMakerRelatable.swift
new file mode 100644 (file)
index 0000000..0a3d5ee
--- /dev/null
@@ -0,0 +1,115 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public class ConstraintMakerRelatable {
+    
+    internal let description: ConstraintDescription
+    
+    internal init(_ description: ConstraintDescription) {
+        self.description = description
+    }
+    
+    internal func relatedTo(_ other: ConstraintRelatableTarget, relation: ConstraintRelation, file: String, line: UInt) -> ConstraintMakerEditable {
+        let related: ConstraintItem
+        let constant: ConstraintConstantTarget
+        
+        if let other = other as? ConstraintItem {
+            guard other.attributes == ConstraintAttributes.none ||
+                  other.attributes.layoutAttributes.count <= 1 ||
+                  other.attributes.layoutAttributes == self.description.attributes.layoutAttributes ||
+                  other.attributes == .edges && self.description.attributes == .margins ||
+                  other.attributes == .margins && self.description.attributes == .edges ||
+                  other.attributes == .directionalEdges && self.description.attributes == .directionalMargins ||
+                  other.attributes == .directionalMargins && self.description.attributes == .directionalEdges else {
+                fatalError("Cannot constraint to multiple non identical attributes. (\(file), \(line))");
+            }
+            
+            related = other
+            constant = 0.0
+        } else if let other = other as? ConstraintView {
+            related = ConstraintItem(target: other, attributes: ConstraintAttributes.none)
+            constant = 0.0
+        } else if let other = other as? ConstraintConstantTarget {
+            related = ConstraintItem(target: nil, attributes: ConstraintAttributes.none)
+            constant = other
+        } else if #available(iOS 9.0, OSX 10.11, *), let other = other as? ConstraintLayoutGuide {
+            related = ConstraintItem(target: other, attributes: ConstraintAttributes.none)
+            constant = 0.0
+        } else {
+            fatalError("Invalid constraint. (\(file), \(line))")
+        }
+        
+        let editable = ConstraintMakerEditable(self.description)
+        editable.description.sourceLocation = (file, line)
+        editable.description.relation = relation
+        editable.description.related = related
+        editable.description.constant = constant
+        return editable
+    }
+    
+    @discardableResult
+    public func equalTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {
+        return self.relatedTo(other, relation: .equal, file: file, line: line)
+    }
+    
+    @discardableResult
+    public func equalToSuperview(_ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {
+        guard let other = self.description.item.superview else {
+            fatalError("Expected superview but found nil when attempting make constraint `equalToSuperview`.")
+        }
+        return self.relatedTo(other, relation: .equal, file: file, line: line)
+    }
+    
+    @discardableResult
+    public func lessThanOrEqualTo(_ other: ConstraintRelatableTarget, _ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {
+        return self.relatedTo(other, relation: .lessThanOrEqual, file: file, line: line)
+    }
+    
+    @discardableResult
+    public func lessThanOrEqualToSuperview(_ file: String = #file, _ line: UInt = #line) -> ConstraintMakerEditable {
+        guard let other = self.description.item.superview else {
+            fatalError("Expected superview but found nil when attempting make constraint `lessThanOrEqualToSuperview`.")
+        }
+        return self.relatedTo(other, relation: .lessThanOrEqual, file: file, line: line)
+    }
+    
+    @discardableResult
+    public func greaterThanOrEqualTo(_ other: ConstraintRelatableTarget, _ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable {
+        return self.relatedTo(other, relation: .greaterThanOrEqual, file: file, line: line)
+    }
+    
+    @discardableResult
+    public func greaterThanOrEqualToSuperview(_ file: String = #file, line: UInt = #line) -> ConstraintMakerEditable {
+        guard let other = self.description.item.superview else {
+            fatalError("Expected superview but found nil when attempting make constraint `greaterThanOrEqualToSuperview`.")
+        }
+        return self.relatedTo(other, relation: .greaterThanOrEqual, file: file, line: line)
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintMultiplierTarget.swift
new file mode 100644 (file)
index 0000000..ac537ba
--- /dev/null
@@ -0,0 +1,75 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol ConstraintMultiplierTarget {
+    
+    var constraintMultiplierTargetValue: CGFloat { get }
+    
+}
+
+extension Int: ConstraintMultiplierTarget {
+    
+    public var constraintMultiplierTargetValue: CGFloat {
+        return CGFloat(self)
+    }
+    
+}
+
+extension UInt: ConstraintMultiplierTarget {
+    
+    public var constraintMultiplierTargetValue: CGFloat {
+        return CGFloat(self)
+    }
+    
+}
+
+extension Float: ConstraintMultiplierTarget {
+    
+    public var constraintMultiplierTargetValue: CGFloat {
+        return CGFloat(self)
+    }
+    
+}
+
+extension Double: ConstraintMultiplierTarget {
+    
+    public var constraintMultiplierTargetValue: CGFloat {
+        return CGFloat(self)
+    }
+    
+}
+
+extension CGFloat: ConstraintMultiplierTarget {
+    
+    public var constraintMultiplierTargetValue: CGFloat {
+        return self
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintOffsetTarget.swift
new file mode 100644 (file)
index 0000000..6ec1107
--- /dev/null
@@ -0,0 +1,69 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol ConstraintOffsetTarget: ConstraintConstantTarget {
+}
+
+extension Int: ConstraintOffsetTarget {
+}
+
+extension UInt: ConstraintOffsetTarget {
+}
+
+extension Float: ConstraintOffsetTarget {
+}
+
+extension Double: ConstraintOffsetTarget {
+}
+
+extension CGFloat: ConstraintOffsetTarget {
+}
+
+extension ConstraintOffsetTarget {
+    
+    internal var constraintOffsetTargetValue: CGFloat {
+        let offset: CGFloat
+        if let amount = self as? Float {
+            offset = CGFloat(amount)
+        } else if let amount = self as? Double {
+            offset = CGFloat(amount)
+        } else if let amount = self as? CGFloat {
+            offset = CGFloat(amount)
+        } else if let amount = self as? Int {
+            offset = CGFloat(amount)
+        } else if let amount = self as? UInt {
+            offset = CGFloat(amount)
+        } else {
+            offset = 0.0
+        }
+        return offset
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintPriority.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintPriority.swift
new file mode 100644 (file)
index 0000000..bf90693
--- /dev/null
@@ -0,0 +1,77 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+public struct ConstraintPriority : ExpressibleByFloatLiteral, Equatable, Strideable {
+    public typealias FloatLiteralType = Float
+    
+    public let value: Float
+    
+    public init(floatLiteral value: Float) {
+        self.value = value
+    }
+    
+    public init(_ value: Float) {
+        self.value = value
+    }
+    
+    public static var required: ConstraintPriority {
+        return 1000.0
+    }
+    
+    public static var high: ConstraintPriority {
+        return 750.0
+    }
+    
+    public static var medium: ConstraintPriority {
+        #if os(OSX)
+            return 501.0
+        #else
+            return 500.0
+        #endif
+        
+    }
+    
+    public static var low: ConstraintPriority {
+        return 250.0
+    }
+    
+    public static func ==(lhs: ConstraintPriority, rhs: ConstraintPriority) -> Bool {
+        return lhs.value == rhs.value
+    }
+
+    // MARK: Strideable
+
+    public func advanced(by n: FloatLiteralType) -> ConstraintPriority {
+        return ConstraintPriority(floatLiteral: value + n)
+    }
+
+    public func distance(to other: ConstraintPriority) -> FloatLiteralType {
+        return other.value - value
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintPriorityTarget.swift
new file mode 100644 (file)
index 0000000..1aa701e
--- /dev/null
@@ -0,0 +1,85 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol ConstraintPriorityTarget {
+    
+    var constraintPriorityTargetValue: Float { get }
+    
+}
+
+extension Int: ConstraintPriorityTarget {
+    
+    public var constraintPriorityTargetValue: Float {
+        return Float(self)
+    }
+    
+}
+
+extension UInt: ConstraintPriorityTarget {
+    
+    public var constraintPriorityTargetValue: Float {
+        return Float(self)
+    }
+    
+}
+
+extension Float: ConstraintPriorityTarget {
+    
+    public var constraintPriorityTargetValue: Float {
+        return self
+    }
+    
+}
+
+extension Double: ConstraintPriorityTarget {
+    
+    public var constraintPriorityTargetValue: Float {
+        return Float(self)
+    }
+    
+}
+
+extension CGFloat: ConstraintPriorityTarget {
+    
+    public var constraintPriorityTargetValue: Float {
+        return Float(self)
+    }
+    
+}
+
+#if canImport(UIKit)
+extension UILayoutPriority: ConstraintPriorityTarget {
+
+    public var constraintPriorityTargetValue: Float {
+        return self.rawValue
+    }
+
+}
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintRelatableTarget.swift
new file mode 100644 (file)
index 0000000..df04464
--- /dev/null
@@ -0,0 +1,72 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol ConstraintRelatableTarget {
+}
+
+extension Int: ConstraintRelatableTarget {
+}
+
+extension UInt: ConstraintRelatableTarget {
+}
+
+extension Float: ConstraintRelatableTarget {
+}
+
+extension Double: ConstraintRelatableTarget {
+}
+
+extension CGFloat: ConstraintRelatableTarget {
+}
+
+extension CGSize: ConstraintRelatableTarget {
+}
+
+extension CGPoint: ConstraintRelatableTarget {
+}
+
+extension ConstraintInsets: ConstraintRelatableTarget {
+}
+
+#if canImport(UIKit)
+@available(iOS 11.0, tvOS 11.0, *)
+extension ConstraintDirectionalInsets: ConstraintRelatableTarget {
+}
+#endif
+
+extension ConstraintItem: ConstraintRelatableTarget {
+}
+
+extension ConstraintView: ConstraintRelatableTarget {
+}
+
+@available(iOS 9.0, OSX 10.11, *)
+extension ConstraintLayoutGuide: ConstraintRelatableTarget {
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintRelation.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintRelation.swift
new file mode 100644 (file)
index 0000000..643d499
--- /dev/null
@@ -0,0 +1,48 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+internal enum ConstraintRelation : Int {
+    case equal = 1
+    case lessThanOrEqual
+    case greaterThanOrEqual
+    
+    internal var layoutRelation: LayoutRelation {
+        get {
+            switch(self) {
+            case .equal:
+                return .equal
+            case .lessThanOrEqual:
+                return .lessThanOrEqual
+            case .greaterThanOrEqual:
+                return .greaterThanOrEqual
+            }
+        }
+    }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintView+Extensions.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintView+Extensions.swift
new file mode 100644 (file)
index 0000000..1225c04
--- /dev/null
@@ -0,0 +1,152 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public extension ConstraintView {
+    
+    @available(*, deprecated, renamed:"snp.left")
+    var snp_left: ConstraintItem { return self.snp.left }
+    
+    @available(*, deprecated, renamed:"snp.top")
+    var snp_top: ConstraintItem { return self.snp.top }
+    
+    @available(*, deprecated, renamed:"snp.right")
+    var snp_right: ConstraintItem { return self.snp.right }
+    
+    @available(*, deprecated, renamed:"snp.bottom")
+    var snp_bottom: ConstraintItem { return self.snp.bottom }
+    
+    @available(*, deprecated, renamed:"snp.leading")
+    var snp_leading: ConstraintItem { return self.snp.leading }
+    
+    @available(*, deprecated, renamed:"snp.trailing")
+    var snp_trailing: ConstraintItem { return self.snp.trailing }
+    
+    @available(*, deprecated, renamed:"snp.width")
+    var snp_width: ConstraintItem { return self.snp.width }
+    
+    @available(*, deprecated, renamed:"snp.height")
+    var snp_height: ConstraintItem { return self.snp.height }
+    
+    @available(*, deprecated, renamed:"snp.centerX")
+    var snp_centerX: ConstraintItem { return self.snp.centerX }
+    
+    @available(*, deprecated, renamed:"snp.centerY")
+    var snp_centerY: ConstraintItem { return self.snp.centerY }
+    
+    @available(*, deprecated, renamed:"snp.baseline")
+    var snp_baseline: ConstraintItem { return self.snp.baseline }
+    
+    @available(*, deprecated, renamed:"snp.lastBaseline")
+    @available(iOS 8.0, OSX 10.11, *)
+    var snp_lastBaseline: ConstraintItem { return self.snp.lastBaseline }
+    
+    @available(iOS, deprecated, renamed:"snp.firstBaseline")
+    @available(iOS 8.0, OSX 10.11, *)
+    var snp_firstBaseline: ConstraintItem { return self.snp.firstBaseline }
+    
+    @available(iOS, deprecated, renamed:"snp.leftMargin")
+    @available(iOS 8.0, *)
+    var snp_leftMargin: ConstraintItem { return self.snp.leftMargin }
+    
+    @available(iOS, deprecated, renamed:"snp.topMargin")
+    @available(iOS 8.0, *)
+    var snp_topMargin: ConstraintItem { return self.snp.topMargin }
+    
+    @available(iOS, deprecated, renamed:"snp.rightMargin")
+    @available(iOS 8.0, *)
+    var snp_rightMargin: ConstraintItem { return self.snp.rightMargin }
+    
+    @available(iOS, deprecated, renamed:"snp.bottomMargin")
+    @available(iOS 8.0, *)
+    var snp_bottomMargin: ConstraintItem { return self.snp.bottomMargin }
+    
+    @available(iOS, deprecated, renamed:"snp.leadingMargin")
+    @available(iOS 8.0, *)
+    var snp_leadingMargin: ConstraintItem { return self.snp.leadingMargin }
+    
+    @available(iOS, deprecated, renamed:"snp.trailingMargin")
+    @available(iOS 8.0, *)
+    var snp_trailingMargin: ConstraintItem { return self.snp.trailingMargin }
+    
+    @available(iOS, deprecated, renamed:"snp.centerXWithinMargins")
+    @available(iOS 8.0, *)
+    var snp_centerXWithinMargins: ConstraintItem { return self.snp.centerXWithinMargins }
+    
+    @available(iOS, deprecated, renamed:"snp.centerYWithinMargins")
+    @available(iOS 8.0, *)
+    var snp_centerYWithinMargins: ConstraintItem { return self.snp.centerYWithinMargins }
+    
+    @available(*, deprecated, renamed:"snp.edges")
+    var snp_edges: ConstraintItem { return self.snp.edges }
+    
+    @available(*, deprecated, renamed:"snp.size")
+    var snp_size: ConstraintItem { return self.snp.size }
+    
+    @available(*, deprecated, renamed:"snp.center")
+    var snp_center: ConstraintItem { return self.snp.center }
+    
+    @available(iOS, deprecated, renamed:"snp.margins")
+    @available(iOS 8.0, *)
+    var snp_margins: ConstraintItem { return self.snp.margins }
+    
+    @available(iOS, deprecated, renamed:"snp.centerWithinMargins")
+    @available(iOS 8.0, *)
+    var snp_centerWithinMargins: ConstraintItem { return self.snp.centerWithinMargins }
+    
+    @available(*, deprecated, renamed:"snp.prepareConstraints(_:)")
+    func snp_prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {
+        return self.snp.prepareConstraints(closure)
+    }
+    
+    @available(*, deprecated, renamed:"snp.makeConstraints(_:)")
+    func snp_makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        self.snp.makeConstraints(closure)
+    }
+    
+    @available(*, deprecated, renamed:"snp.remakeConstraints(_:)")
+    func snp_remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        self.snp.remakeConstraints(closure)
+    }
+    
+    @available(*, deprecated, renamed:"snp.updateConstraints(_:)")
+    func snp_updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        self.snp.updateConstraints(closure)
+    }
+    
+    @available(*, deprecated, renamed:"snp.removeConstraints()")
+    func snp_removeConstraints() {
+        self.snp.removeConstraints()
+    }
+    
+    var snp: ConstraintViewDSL {
+        return ConstraintViewDSL(view: self)
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintView.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintView.swift
new file mode 100644 (file)
index 0000000..1203300
--- /dev/null
@@ -0,0 +1,35 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+#if canImport(UIKit)
+    public typealias ConstraintView = UIView
+#else
+    public typealias ConstraintView = NSView
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintViewDSL.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/ConstraintViewDSL.swift
new file mode 100644 (file)
index 0000000..8567e54
--- /dev/null
@@ -0,0 +1,101 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public struct ConstraintViewDSL: ConstraintAttributesDSL {
+    
+    @discardableResult
+    public func prepareConstraints(_ closure: (_ make: ConstraintMaker) -> Void) -> [Constraint] {
+        return ConstraintMaker.prepareConstraints(item: self.view, closure: closure)
+    }
+    
+    public func makeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        ConstraintMaker.makeConstraints(item: self.view, closure: closure)
+    }
+    
+    public func remakeConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        ConstraintMaker.remakeConstraints(item: self.view, closure: closure)
+    }
+    
+    public func updateConstraints(_ closure: (_ make: ConstraintMaker) -> Void) {
+        ConstraintMaker.updateConstraints(item: self.view, closure: closure)
+    }
+    
+    public func removeConstraints() {
+        ConstraintMaker.removeConstraints(item: self.view)
+    }
+    
+    public var contentHuggingHorizontalPriority: Float {
+        get {
+            return self.view.contentHuggingPriority(for: .horizontal).rawValue
+        }
+        nonmutating set {
+            self.view.setContentHuggingPriority(LayoutPriority(rawValue: newValue), for: .horizontal)
+        }
+    }
+    
+    public var contentHuggingVerticalPriority: Float {
+        get {
+            return self.view.contentHuggingPriority(for: .vertical).rawValue
+        }
+        nonmutating set {
+            self.view.setContentHuggingPriority(LayoutPriority(rawValue: newValue), for: .vertical)
+        }
+    }
+    
+    public var contentCompressionResistanceHorizontalPriority: Float {
+        get {
+            return self.view.contentCompressionResistancePriority(for: .horizontal).rawValue
+        }
+        nonmutating set {
+            self.view.setContentCompressionResistancePriority(LayoutPriority(rawValue: newValue), for: .horizontal)
+        }
+    }
+    
+    public var contentCompressionResistanceVerticalPriority: Float {
+        get {
+            return self.view.contentCompressionResistancePriority(for: .vertical).rawValue
+        }
+        nonmutating set {
+            self.view.setContentCompressionResistancePriority(LayoutPriority(rawValue: newValue), for: .vertical)
+        }
+    }
+    
+    public var target: AnyObject? {
+        return self.view
+    }
+    
+    internal let view: ConstraintView
+    
+    internal init(view: ConstraintView) {
+        self.view = view
+        
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Debugging.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Debugging.swift
new file mode 100644 (file)
index 0000000..f4120b2
--- /dev/null
@@ -0,0 +1,169 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+public extension LayoutConstraint {
+    
+    override var description: String {
+        var description = "<"
+        
+        description += descriptionForObject(self)
+        
+        if let firstItem = conditionalOptional(from: self.firstItem) {
+            description += " \(descriptionForObject(firstItem))"
+        }
+        
+        if self.firstAttribute != .notAnAttribute {
+            description += ".\(descriptionForAttribute(self.firstAttribute))"
+        }
+        
+        description += " \(descriptionForRelation(self.relation))"
+        
+        if let secondItem = self.secondItem {
+            description += " \(descriptionForObject(secondItem))"
+        }
+        
+        if self.secondAttribute != .notAnAttribute {
+            description += ".\(descriptionForAttribute(self.secondAttribute))"
+        }
+        
+        if self.multiplier != 1.0 {
+            description += " * \(self.multiplier)"
+        }
+        
+        if self.secondAttribute == .notAnAttribute {
+            description += " \(self.constant)"
+        } else {
+            if self.constant > 0.0 {
+                description += " + \(self.constant)"
+            } else if self.constant < 0.0 {
+                description += " - \(abs(self.constant))"
+            }
+        }
+        
+        if self.priority.rawValue != 1000.0 {
+            description += " ^\(self.priority)"
+        }
+        
+        description += ">"
+        
+        return description
+    }
+    
+}
+
+private func descriptionForRelation(_ relation: LayoutRelation) -> String {
+    switch relation {
+    case .equal:                return "=="
+    case .greaterThanOrEqual:   return ">="
+    case .lessThanOrEqual:      return "<="
+    #if swift(>=5.0)
+    @unknown default:           return "unknown"
+    #endif
+    }
+}
+
+private func descriptionForAttribute(_ attribute: LayoutAttribute) -> String {
+    #if canImport(UIKit)
+        switch attribute {
+        case .notAnAttribute:       return "notAnAttribute"
+        case .top:                  return "top"
+        case .left:                 return "left"
+        case .bottom:               return "bottom"
+        case .right:                return "right"
+        case .leading:              return "leading"
+        case .trailing:             return "trailing"
+        case .width:                return "width"
+        case .height:               return "height"
+        case .centerX:              return "centerX"
+        case .centerY:              return "centerY"
+        case .lastBaseline:         return "lastBaseline"
+        case .firstBaseline:        return "firstBaseline"
+        case .topMargin:            return "topMargin"
+        case .leftMargin:           return "leftMargin"
+        case .bottomMargin:         return "bottomMargin"
+        case .rightMargin:          return "rightMargin"
+        case .leadingMargin:        return "leadingMargin"
+        case .trailingMargin:       return "trailingMargin"
+        case .centerXWithinMargins: return "centerXWithinMargins"
+        case .centerYWithinMargins: return "centerYWithinMargins"
+        #if swift(>=5.0)
+        @unknown default:           return "unknown"
+        #endif
+    }
+    #else
+        switch attribute {
+        case .notAnAttribute:       return "notAnAttribute"
+        case .top:                  return "top"
+        case .left:                 return "left"
+        case .bottom:               return "bottom"
+        case .right:                return "right"
+        case .leading:              return "leading"
+        case .trailing:             return "trailing"
+        case .width:                return "width"
+        case .height:               return "height"
+        case .centerX:              return "centerX"
+        case .centerY:              return "centerY"
+        case .lastBaseline:         return "lastBaseline"
+        case .firstBaseline:        return "firstBaseline"
+        #if swift(>=5.0)
+        @unknown default:           return "unknown"
+        #endif
+    }
+    #endif
+}
+
+private func conditionalOptional<T>(from object: Optional<T>) -> Optional<T> {
+    return object
+}
+
+private func conditionalOptional<T>(from object: T) -> Optional<T> {
+    return Optional.some(object)
+}
+
+private func descriptionForObject(_ object: AnyObject) -> String {
+    let pointerDescription = String(format: "%p", UInt(bitPattern: ObjectIdentifier(object)))
+    var desc = ""
+    
+    desc += type(of: object).description()
+    
+    if let object = object as? ConstraintView {
+        desc += ":\(object.snp.label() ?? pointerDescription)"
+    } else if let object = object as? LayoutConstraint {
+        desc += ":\(object.label ?? pointerDescription)"
+    } else {
+        desc += ":\(pointerDescription)"
+    }
+    
+    if let object = object as? LayoutConstraint, let file = object.constraint?.sourceLocation.0, let line = object.constraint?.sourceLocation.1 {
+        desc += "@\((file as NSString).lastPathComponent)#\(line)"
+    }
+    
+    desc += ""
+    return desc
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/LayoutConstraint.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/LayoutConstraint.swift
new file mode 100644 (file)
index 0000000..607616d
--- /dev/null
@@ -0,0 +1,61 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public class LayoutConstraint : NSLayoutConstraint {
+    
+    public var label: String? {
+        get {
+            return self.identifier
+        }
+        set {
+            self.identifier = newValue
+        }
+    }
+    
+    internal weak var constraint: Constraint? = nil
+    
+}
+
+internal func ==(lhs: LayoutConstraint, rhs: LayoutConstraint) -> Bool {
+    // If firstItem or secondItem on either constraint has a dangling pointer
+    // this comparison can cause a crash. The solution for this is to ensure
+    // your layout code hold strong references to things like Views, LayoutGuides
+    // and LayoutAnchors as SnapKit will not keep strong references to any of these.
+    guard lhs.firstAttribute == rhs.firstAttribute &&
+          lhs.secondAttribute == rhs.secondAttribute &&
+          lhs.relation == rhs.relation &&
+          lhs.priority == rhs.priority &&
+          lhs.multiplier == rhs.multiplier &&
+          lhs.secondItem === rhs.secondItem &&
+          lhs.firstItem === rhs.firstItem else {
+        return false
+    }
+    return true
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/LayoutConstraintItem.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/LayoutConstraintItem.swift
new file mode 100644 (file)
index 0000000..4f41b5d
--- /dev/null
@@ -0,0 +1,93 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#else
+    import AppKit
+#endif
+
+
+public protocol LayoutConstraintItem: AnyObject {
+}
+
+@available(iOS 9.0, OSX 10.11, *)
+extension ConstraintLayoutGuide : LayoutConstraintItem {
+}
+
+extension ConstraintView : LayoutConstraintItem {
+}
+
+
+extension LayoutConstraintItem {
+    
+    internal func prepare() {
+        if let view = self as? ConstraintView {
+            view.translatesAutoresizingMaskIntoConstraints = false
+        }
+    }
+    
+    internal var superview: ConstraintView? {
+        if let view = self as? ConstraintView {
+            return view.superview
+        }
+        
+        if #available(iOS 9.0, OSX 10.11, *), let guide = self as? ConstraintLayoutGuide {
+            return guide.owningView
+        }
+        
+        return nil
+    }
+    internal var constraints: [Constraint] {
+        return self.constraintsSet.allObjects as! [Constraint]
+    }
+    
+    internal func add(constraints: [Constraint]) {
+        let constraintsSet = self.constraintsSet
+        for constraint in constraints {
+            constraintsSet.add(constraint)
+        }
+    }
+    
+    internal func remove(constraints: [Constraint]) {
+        let constraintsSet = self.constraintsSet
+        for constraint in constraints {
+            constraintsSet.remove(constraint)
+        }
+    }
+    
+    private var constraintsSet: NSMutableSet {
+        let constraintsSet: NSMutableSet
+        
+        if let existing = objc_getAssociatedObject(self, &constraintsKey) as? NSMutableSet {
+            constraintsSet = existing
+        } else {
+            constraintsSet = NSMutableSet()
+            objc_setAssociatedObject(self, &constraintsKey, constraintsSet, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        }
+        return constraintsSet
+        
+    }
+    
+}
+private var constraintsKey: UInt8 = 0
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..e540750
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyTracking</key>
+       <false/>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Typealiases.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/Typealiases.swift
new file mode 100644 (file)
index 0000000..c0e6982
--- /dev/null
@@ -0,0 +1,42 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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 Foundation
+
+#if canImport(UIKit)
+    import UIKit
+#if swift(>=4.2)
+    typealias LayoutRelation = NSLayoutConstraint.Relation
+    typealias LayoutAttribute = NSLayoutConstraint.Attribute
+#else
+    typealias LayoutRelation = NSLayoutRelation
+    typealias LayoutAttribute = NSLayoutAttribute
+#endif
+    typealias LayoutPriority = UILayoutPriority
+#else
+    import AppKit
+    typealias LayoutRelation = NSLayoutConstraint.Relation
+    typealias LayoutAttribute = NSLayoutConstraint.Attribute
+    typealias LayoutPriority = NSLayoutConstraint.Priority
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SnapKit/Sources/UILayoutSupport+Extensions.swift
new file mode 100644 (file)
index 0000000..801cc3c
--- /dev/null
@@ -0,0 +1,36 @@
+//
+//  SnapKit
+//
+//  Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+//
+//  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.
+
+#if canImport(UIKit)
+    import UIKit
+#endif
+
+    
+@available(iOS 8.0, *)
+public extension ConstraintLayoutSupport {
+    
+    var snp: ConstraintLayoutSupportDSL {
+        return ConstraintLayoutSupportDSL(support: self)
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/LICENSE
new file mode 100644 (file)
index 0000000..032b206
--- /dev/null
@@ -0,0 +1,30 @@
+BSD License
+
+For SocketRocket software
+
+Copyright (c) 2016-present, Facebook, Inc. 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.
+
+ * Neither the name Facebook nor the names of its contributors may be used to
+   endorse or promote products derived from this software without specific
+   prior written permission.
+
+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.
\ No newline at end of file
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/LICENSE-examples b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/LICENSE-examples
new file mode 100644 (file)
index 0000000..1de7813
--- /dev/null
@@ -0,0 +1,11 @@
+Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
+
+The examples provided by Facebook are for non-commercial testing and evaluation
+purposes only. Facebook reserves all rights not expressly granted.
+
+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
+FACEBOOK 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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/README.md
new file mode 100644 (file)
index 0000000..7806a7e
--- /dev/null
@@ -0,0 +1,214 @@
+# SocketRocket
+
+![Platforms][platforms-svg]
+[![License][license-svg]][license-link]
+
+[![Podspec][podspec-svg]][podspec-link]
+[![Carthage Compatible][carthage-svg]](carthage-link)
+
+[![Build Status][build-status-svg]][build-status-link]
+
+A conforming WebSocket ([RFC 6455](https://tools.ietf.org/html/rfc6455>)) client library for iOS, macOS and tvOS.
+
+Test results for SocketRocket [here](http://facebook.github.io/SocketRocket/results/).
+You can compare to what modern browsers look like [here](http://autobahn.ws/testsuite/reports/clients/index.html).
+
+SocketRocket currently conforms to all core ~300 of [Autobahn](http://autobahn.ws/testsuite/>)'s fuzzing tests 
+(aside from two UTF-8 ones where it is merely *non-strict* tests 6.4.2 and 6.4.4).
+
+## Features/Design
+
+- TLS (wss) support, including self-signed certificates.
+- Seems to perform quite well.
+- Supports HTTP Proxies.
+- Supports IPv4/IPv6.
+- Supports SSL certificate pinning.
+- Sends `ping` and can process `pong` events.
+- Asynchronous and non-blocking. Most of the work is done on a background thread.
+- Supports iOS, macOS, tvOS.
+
+## Installing
+
+There are a few options. Choose one, or just figure it out:
+
+- **[CocoaPods](https://cocoapods.org)**
+
+ Add the following line to your Podfile:
+ ```ruby
+ pod 'SocketRocket'
+ ```
+ Run `pod install`, and you are all set.
+  
+- **[Carthage](https://github.com/carthage/carthage)**
+
+ Add the following line to your Cartfile:
+ ```
+ github "facebook/SocketRocket"
+ ```
+ Run `carthage update`, and you should now have the latest version of `SocketRocket` in your `Carthage` folder.
+
+- **Using SocketRocket as a sub-project**
+
+  You can also include `SocketRocket` as a subproject inside of your application if you'd prefer, although we do not recommend this, as it will increase your indexing time significantly. To do so, just drag and drop the `SocketRocket.xcodeproj` file into your workspace.
+
+## API
+
+### `SRWebSocket`
+
+The Web Socket.
+
+#### Note:
+
+`SRWebSocket` will retain itself between `-(void)open` and when it closes, errors, or fails.
+This is similar to how `NSURLConnection` behaves (unlike `NSURLConnection`, `SRWebSocket` won't retain the delegate).
+
+#### Interface
+
+```objective-c
+@interface SRWebSocket : NSObject
+
+// Make it with this
+- (instancetype)initWithURLRequest:(NSURLRequest *)request;
+
+// Set this before opening
+@property (nonatomic, weak) id <SRWebSocketDelegate> delegate;
+
+// Open with this
+- (void)open;
+
+// Close it with this
+- (void)close;
+
+// Send a Data
+- (void)sendData:(nullable NSData *)data error:(NSError **)error;
+
+// Send a UTF8 String
+- (void)sendString:(NSString *)string error:(NSError **)error;
+
+@end
+```
+
+### `SRWebSocketDelegate`
+
+You implement this
+
+```objective-c
+@protocol SRWebSocketDelegate <NSObject>
+
+@optional
+
+- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
+
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithString:(NSString *)string;
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithData:(NSData *)data;
+
+- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
+- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(nullable NSString *)reason wasClean:(BOOL)wasClean;
+
+@end
+```
+
+## Testing
+
+Included are setup scripts for the python testing environment.
+It comes packaged with vitualenv so all the dependencies are installed in userland.
+
+To run the short test from the command line, run:
+```bash
+  make test
+```
+
+To run all the tests, run:
+```bash
+  make test_all
+```
+
+The short tests don't include the performance tests
+(the test harness is actually the bottleneck, not SocketRocket).
+
+The first time this is run, it may take a while to install the dependencies. It will be smooth sailing after that. 
+
+You can also run tests inside Xcode, which runs the same thing, but makes it easier to debug.
+
+- Choose the `SocketRocketTests` target
+- Make sure your running destination is either your Mac or any Simulator
+- Run the test action (`⌘+U`)
+
+### TestChat Demo Application
+
+SocketRocket includes a demo app, TestChat.
+It will "chat" with a listening websocket on port 9900.
+
+#### TestChat Server
+
+The sever takes a message and broadcasts it to all other connected clients.
+
+It requires some dependencies though to run. 
+We also want to reuse the virtualenv we made when we ran the tests. 
+If you haven't run the tests yet, go into the SocketRocket root directory and type:
+
+```bash
+make test
+```
+
+This will set up your [virtualenv](https://pypi.python.org/pypi/virtualenv).
+
+Now, in your terminal:
+
+```bash
+source .env/bin/activate
+pip install git+https://github.com/tornadoweb/tornado.git
+```
+
+In the same terminal session, start the chatroom server:
+
+```bash
+python TestChatServer/py/chatroom.py
+```
+
+There's also a Go implementation (with the latest weekly) where you can:
+
+```bash
+cd TestChatServer/go
+go run chatroom.go
+```
+
+#### Chatting
+
+Now, start TestChat.app (just run the target in the Xcode project).
+If you had it started already you can hit the refresh button to reconnect.
+It should say "Connected!" on top.
+
+To talk with the app, open up your browser to [http://localhost:9000](http://localhost:9000) and start chatting.
+
+
+## WebSocket Server Implementation Recommendations
+
+SocketRocket has been used with the following libraries:
+
+- [Tornado](https://github.com/tornadoweb/tornado)
+- Go's [WebSocket package](https://godoc.org/golang.org/x/net/websocket) or Gorilla's [version](http://www.gorillatoolkit.org/pkg/websocket).
+- [Autobahn](http://autobahn.ws/testsuite/) (using its fuzzing client).
+
+The Tornado one is dirt simple and works like a charm. 
+([IPython notebook](http://ipython.org/ipython-doc/dev/interactive/htmlnotebook.html) uses it too).
+It's much easier to configure handlers and routes than in Autobahn/twisted.
+
+## Contributing
+
+We’re glad you’re interested in SocketRocket, and we’d love to see where you take it. 
+Please read our [contributing guidelines](https://github.com/facebook/SocketRocket/blob/master/CONTRIBUTING.md) prior to submitting a Pull Request.
+
+ [build-status-svg]: https://img.shields.io/travis/facebook/SocketRocket/master.svg
+ [build-status-link]: https://travis-ci.org/facebook/SocketRocket/branches
+
+ [license-svg]: https://img.shields.io/badge/license-BSD-lightgrey.svg
+ [license-link]: https://github.com/facebook/SocketRocket/blob/master/LICENSE
+
+ [podspec-svg]: https://img.shields.io/cocoapods/v/SocketRocket.svg
+ [podspec-link]: https://cocoapods.org/pods/SocketRocket
+ 
+ [carthage-svg]: https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat
+ [carthage-link]: https://github.com/carthage/carthage
+
+ [platforms-svg]: http://img.shields.io/cocoapods/p/SocketRocket.svg?style=flat
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Delegate/SRDelegateController.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Delegate/SRDelegateController.h
new file mode 100644 (file)
index 0000000..43634a1
--- /dev/null
@@ -0,0 +1,67 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+#import <SocketRocket/SRWebSocket.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+#if OBJC_BOOL_IS_BOOL
+
+struct SRDelegateAvailableMethods {
+    BOOL didReceiveMessage : 1;
+    BOOL didReceiveMessageWithString : 1;
+    BOOL didReceiveMessageWithData : 1;
+    BOOL didOpen : 1;
+    BOOL didFailWithError : 1;
+    BOOL didCloseWithCode : 1;
+    BOOL didReceivePing : 1;
+    BOOL didReceivePong : 1;
+    BOOL shouldConvertTextFrameToString : 1;
+};
+
+#else
+
+struct SRDelegateAvailableMethods {
+    BOOL didReceiveMessage;
+    BOOL didReceiveMessageWithString;
+    BOOL didReceiveMessageWithData;
+    BOOL didOpen;
+    BOOL didFailWithError;
+    BOOL didCloseWithCode;
+    BOOL didReceivePing;
+    BOOL didReceivePong;
+    BOOL shouldConvertTextFrameToString;
+};
+
+#endif
+
+typedef struct SRDelegateAvailableMethods SRDelegateAvailableMethods;
+
+typedef void(^SRDelegateBlock)(id<SRWebSocketDelegate> _Nullable delegate, SRDelegateAvailableMethods availableMethods);
+
+@interface SRDelegateController : NSObject
+
+@property (nonatomic, weak) id<SRWebSocketDelegate> delegate;
+@property (atomic, readonly) SRDelegateAvailableMethods availableDelegateMethods;
+
+@property (nullable, nonatomic, strong) dispatch_queue_t dispatchQueue;
+@property (nullable, nonatomic, strong) NSOperationQueue *operationQueue;
+
+///--------------------------------------
+#pragma mark - Perform
+///--------------------------------------
+
+- (void)performDelegateBlock:(SRDelegateBlock)block;
+- (void)performDelegateQueueBlock:(dispatch_block_t)block;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Delegate/SRDelegateController.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Delegate/SRDelegateController.m
new file mode 100644 (file)
index 0000000..f20c9d5
--- /dev/null
@@ -0,0 +1,138 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRDelegateController.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SRDelegateController ()
+
+@property (nonatomic, strong, readonly) dispatch_queue_t accessQueue;
+
+@property (atomic, assign, readwrite) SRDelegateAvailableMethods availableDelegateMethods;
+
+@end
+
+@implementation SRDelegateController
+
+@synthesize delegate = _delegate;
+@synthesize dispatchQueue = _dispatchQueue;
+@synthesize operationQueue = _operationQueue;
+
+///--------------------------------------
+#pragma mark - Init
+///--------------------------------------
+
+- (instancetype)init
+{
+    self = [super init];
+    if (!self) return self;
+
+    _accessQueue = dispatch_queue_create("com.facebook.socketrocket.delegate.access", DISPATCH_QUEUE_CONCURRENT);
+    _dispatchQueue = dispatch_get_main_queue();
+
+    return self;
+}
+
+///--------------------------------------
+#pragma mark - Accessors
+///--------------------------------------
+
+- (void)setDelegate:(id<SRWebSocketDelegate> _Nullable)delegate
+{
+    dispatch_barrier_async(self.accessQueue, ^{
+        self->_delegate = delegate;
+
+        self.availableDelegateMethods = (SRDelegateAvailableMethods){
+            .didReceiveMessage = [delegate respondsToSelector:@selector(webSocket:didReceiveMessage:)],
+            .didReceiveMessageWithString = [delegate respondsToSelector:@selector(webSocket:didReceiveMessageWithString:)],
+            .didReceiveMessageWithData = [delegate respondsToSelector:@selector(webSocket:didReceiveMessageWithData:)],
+            .didOpen = [delegate respondsToSelector:@selector(webSocketDidOpen:)],
+            .didFailWithError = [delegate respondsToSelector:@selector(webSocket:didFailWithError:)],
+            .didCloseWithCode = [delegate respondsToSelector:@selector(webSocket:didCloseWithCode:reason:wasClean:)],
+            .didReceivePing = [delegate respondsToSelector:@selector(webSocket:didReceivePingWithData:)],
+            .didReceivePong = [delegate respondsToSelector:@selector(webSocket:didReceivePong:)],
+            .shouldConvertTextFrameToString = [delegate respondsToSelector:@selector(webSocketShouldConvertTextFrameToString:)]
+        };
+    });
+}
+
+- (id<SRWebSocketDelegate> _Nullable)delegate
+{
+    __block id<SRWebSocketDelegate> delegate = nil;
+    dispatch_sync(self.accessQueue, ^{
+        delegate = self->_delegate;
+    });
+    return delegate;
+}
+
+- (void)setDispatchQueue:(dispatch_queue_t _Nullable)queue
+{
+    dispatch_barrier_async(self.accessQueue, ^{
+        self->_dispatchQueue = queue ?: dispatch_get_main_queue();
+        self->_operationQueue = nil;
+    });
+}
+
+- (dispatch_queue_t _Nullable)dispatchQueue
+{
+    __block dispatch_queue_t queue = nil;
+    dispatch_sync(self.accessQueue, ^{
+        queue = self->_dispatchQueue;
+    });
+    return queue;
+}
+
+- (void)setOperationQueue:(NSOperationQueue *_Nullable)queue
+{
+    dispatch_barrier_async(self.accessQueue, ^{
+        self->_dispatchQueue = queue ? nil : dispatch_get_main_queue();
+        self->_operationQueue = queue;
+    });
+}
+
+- (NSOperationQueue *_Nullable)operationQueue
+{
+    __block NSOperationQueue *queue = nil;
+    dispatch_sync(self.accessQueue, ^{
+        queue = self->_operationQueue;
+    });
+    return queue;
+}
+
+///--------------------------------------
+#pragma mark - Perform
+///--------------------------------------
+
+- (void)performDelegateBlock:(SRDelegateBlock)block
+{
+    __block __strong id<SRWebSocketDelegate> delegate = nil;
+    __block SRDelegateAvailableMethods availableMethods;
+    dispatch_sync(self.accessQueue, ^{
+        delegate = self->_delegate; // Not `OK` to go through `self`, since queue sync.
+        availableMethods = self.availableDelegateMethods; // `OK` to call through `self`, since no queue sync.
+    });
+    [self performDelegateQueueBlock:^{
+        block(delegate, availableMethods);
+    }];
+}
+
+- (void)performDelegateQueueBlock:(dispatch_block_t)block
+{
+    dispatch_queue_t dispatchQueue = self.dispatchQueue;
+    if (dispatchQueue) {
+        dispatch_async(dispatchQueue, block);
+    } else {
+        [self.operationQueue addOperationWithBlock:block];
+    }
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumer.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumer.h
new file mode 100644 (file)
index 0000000..6b02a3b
--- /dev/null
@@ -0,0 +1,40 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+@class SRWebSocket; // TODO: (nlutsenko) Remove dependency on SRWebSocket here.
+
+// Returns number of bytes consumed. Returning 0 means you didn't match.
+// Sends bytes to callback handler;
+typedef size_t (^stream_scanner)(NSData *collected_data);
+typedef void (^data_callback)(SRWebSocket *webSocket,  NSData *data);
+
+@interface SRIOConsumer : NSObject {
+    stream_scanner _scanner;
+    data_callback _handler;
+    size_t _bytesNeeded;
+    BOOL _readToCurrentFrame;
+    BOOL _unmaskBytes;
+}
+@property (nonatomic, copy, readonly) stream_scanner consumer;
+@property (nonatomic, copy, readonly) data_callback handler;
+@property (nonatomic, assign) size_t bytesNeeded;
+@property (nonatomic, assign, readonly) BOOL readToCurrentFrame;
+@property (nonatomic, assign, readonly) BOOL unmaskBytes;
+
+- (void)resetWithScanner:(stream_scanner)scanner
+                 handler:(data_callback)handler
+             bytesNeeded:(size_t)bytesNeeded
+      readToCurrentFrame:(BOOL)readToCurrentFrame
+             unmaskBytes:(BOOL)unmaskBytes;
+
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumer.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumer.m
new file mode 100644 (file)
index 0000000..8b17e3e
--- /dev/null
@@ -0,0 +1,36 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRIOConsumer.h"
+
+@implementation SRIOConsumer
+
+@synthesize bytesNeeded = _bytesNeeded;
+@synthesize consumer = _scanner;
+@synthesize handler = _handler;
+@synthesize readToCurrentFrame = _readToCurrentFrame;
+@synthesize unmaskBytes = _unmaskBytes;
+
+- (void)resetWithScanner:(stream_scanner)scanner
+                 handler:(data_callback)handler
+             bytesNeeded:(size_t)bytesNeeded
+      readToCurrentFrame:(BOOL)readToCurrentFrame
+             unmaskBytes:(BOOL)unmaskBytes
+{
+    _scanner = [scanner copy];
+    _handler = [handler copy];
+    _bytesNeeded = bytesNeeded;
+    _readToCurrentFrame = readToCurrentFrame;
+    _unmaskBytes = unmaskBytes;
+    assert(_scanner || _bytesNeeded);
+}
+
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumerPool.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumerPool.h
new file mode 100644 (file)
index 0000000..1e7ad32
--- /dev/null
@@ -0,0 +1,28 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+#import "SRIOConsumer.h" // TODO: (nlutsenko) Convert to @class and constants file for block types
+
+// This class is not thread-safe, and is expected to always be run on the same queue.
+@interface SRIOConsumerPool : NSObject
+
+- (instancetype)initWithBufferCapacity:(NSUInteger)poolSize;
+
+- (SRIOConsumer *)consumerWithScanner:(stream_scanner)scanner
+                              handler:(data_callback)handler
+                          bytesNeeded:(size_t)bytesNeeded
+                   readToCurrentFrame:(BOOL)readToCurrentFrame
+                          unmaskBytes:(BOOL)unmaskBytes;
+- (void)returnConsumer:(SRIOConsumer *)consumer;
+
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumerPool.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/IOConsumer/SRIOConsumerPool.m
new file mode 100644 (file)
index 0000000..33a4af9
--- /dev/null
@@ -0,0 +1,64 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRIOConsumerPool.h"
+
+@implementation SRIOConsumerPool {
+    NSUInteger _poolSize;
+    NSMutableArray<SRIOConsumer *> *_bufferedConsumers;
+}
+
+- (instancetype)initWithBufferCapacity:(NSUInteger)poolSize
+{
+    self = [super init];
+    if (self) {
+        _poolSize = poolSize;
+        _bufferedConsumers = [NSMutableArray arrayWithCapacity:poolSize];
+    }
+    return self;
+}
+
+- (instancetype)init
+{
+    return [self initWithBufferCapacity:8];
+}
+
+- (SRIOConsumer *)consumerWithScanner:(stream_scanner)scanner
+                              handler:(data_callback)handler
+                          bytesNeeded:(size_t)bytesNeeded
+                   readToCurrentFrame:(BOOL)readToCurrentFrame
+                          unmaskBytes:(BOOL)unmaskBytes
+{
+    SRIOConsumer *consumer = nil;
+    if (_bufferedConsumers.count) {
+        consumer = [_bufferedConsumers lastObject];
+        [_bufferedConsumers removeLastObject];
+    } else {
+        consumer = [[SRIOConsumer alloc] init];
+    }
+
+    [consumer resetWithScanner:scanner
+                       handler:handler
+                   bytesNeeded:bytesNeeded
+            readToCurrentFrame:readToCurrentFrame
+                   unmaskBytes:unmaskBytes];
+
+    return consumer;
+}
+
+- (void)returnConsumer:(SRIOConsumer *)consumer
+{
+    if (_bufferedConsumers.count < _poolSize) {
+        [_bufferedConsumers addObject:consumer];
+    }
+}
+
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/NSRunLoop+SRWebSocketPrivate.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/NSRunLoop+SRWebSocketPrivate.h
new file mode 100644 (file)
index 0000000..098f7a8
--- /dev/null
@@ -0,0 +1,13 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <SocketRocket/NSRunLoop+SRWebSocket.h>
+
+// Empty function that force links the object file for the category.
+extern void import_NSRunLoop_SRWebSocket(void);
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/NSURLRequest+SRWebSocketPrivate.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/NSURLRequest+SRWebSocketPrivate.h
new file mode 100644 (file)
index 0000000..b09dde4
--- /dev/null
@@ -0,0 +1,13 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <SocketRocket/NSURLRequest+SRWebSocket.h>
+
+// Empty function that force links the object file for the category.
+extern void import_NSURLRequest_SRWebSocket(void);
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Proxy/SRProxyConnect.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Proxy/SRProxyConnect.h
new file mode 100644 (file)
index 0000000..e947c48
--- /dev/null
@@ -0,0 +1,26 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void(^SRProxyConnectCompletion)(NSError *_Nullable error,
+                                        NSInputStream *_Nullable readStream,
+                                        NSOutputStream *_Nullable writeStream);
+
+@interface SRProxyConnect : NSObject
+
+- (instancetype)initWithURL:(NSURL *)url;
+
+- (void)openNetworkStreamWithCompletion:(SRProxyConnectCompletion)completion;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Proxy/SRProxyConnect.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Proxy/SRProxyConnect.m
new file mode 100644 (file)
index 0000000..cce5844
--- /dev/null
@@ -0,0 +1,481 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRProxyConnect.h"
+
+#import "NSRunLoop+SRWebSocket.h"
+#import "SRConstants.h"
+#import "SRError.h"
+#import "SRLog.h"
+#import "SRURLUtilities.h"
+
+@interface SRProxyConnect() <NSStreamDelegate>
+
+@property (nonatomic, strong) NSURL *url;
+@property (nonatomic, strong) NSInputStream *inputStream;
+@property (nonatomic, strong) NSOutputStream *outputStream;
+
+@end
+
+@implementation SRProxyConnect
+{
+    SRProxyConnectCompletion _completion;
+
+    NSString *_httpProxyHost;
+    uint32_t _httpProxyPort;
+
+    CFHTTPMessageRef _receivedHTTPHeaders;
+
+    NSString *_socksProxyHost;
+    uint32_t _socksProxyPort;
+    NSString *_socksProxyUsername;
+    NSString *_socksProxyPassword;
+
+    BOOL _connectionRequiresSSL;
+
+    NSMutableArray<NSData *> *_inputQueue;
+    dispatch_queue_t _writeQueue;
+}
+
+///--------------------------------------
+#pragma mark - Init
+///--------------------------------------
+
+-(instancetype)initWithURL:(NSURL *)url
+{
+    self = [super init];
+    if (!self) return self;
+
+    _url = url;
+    _connectionRequiresSSL = SRURLRequiresSSL(url);
+
+    _writeQueue = dispatch_queue_create("com.facebook.socketrocket.proxyconnect.write", DISPATCH_QUEUE_SERIAL);
+    _inputQueue = [NSMutableArray arrayWithCapacity:2];
+
+    return self;
+}
+
+- (void)dealloc
+{
+    // If we get deallocated before the socket open finishes - we need to cleanup everything.
+
+    [self.inputStream removeFromRunLoop:[NSRunLoop SR_networkRunLoop] forMode:NSDefaultRunLoopMode];
+    self.inputStream.delegate = nil;
+    [self.inputStream close];
+    self.inputStream = nil;
+
+    self.outputStream.delegate = nil;
+    [self.outputStream close];
+    self.outputStream = nil;
+}
+
+///--------------------------------------
+#pragma mark - Open
+///--------------------------------------
+
+- (void)openNetworkStreamWithCompletion:(SRProxyConnectCompletion)completion
+{
+    _completion = completion;
+    [self _configureProxy];
+}
+
+///--------------------------------------
+#pragma mark - Flow
+///--------------------------------------
+
+- (void)_didConnect
+{
+    SRDebugLog(@"_didConnect, return streams");
+    if (_connectionRequiresSSL) {
+        if (_httpProxyHost) {
+            // Must set the real peer name before turning on SSL
+            SRDebugLog(@"proxy set peer name to real host %@", self.url.host);
+            [self.outputStream setProperty:self.url.host forKey:@"_kCFStreamPropertySocketPeerName"];
+        }
+    }
+    if (_receivedHTTPHeaders) {
+        CFRelease(_receivedHTTPHeaders);
+        _receivedHTTPHeaders = NULL;
+    }
+
+    NSInputStream *inputStream = self.inputStream;
+    NSOutputStream *outputStream = self.outputStream;
+
+    self.inputStream = nil;
+    self.outputStream = nil;
+
+    [inputStream removeFromRunLoop:[NSRunLoop SR_networkRunLoop] forMode:NSDefaultRunLoopMode];
+    inputStream.delegate = nil;
+    outputStream.delegate = nil;
+
+    _completion(nil, inputStream, outputStream);
+}
+
+- (void)_failWithError:(NSError *)error
+{
+    SRDebugLog(@"_failWithError, return error");
+    if (!error) {
+        error = SRHTTPErrorWithCodeDescription(500, 2132,@"Proxy Error");
+    }
+
+    if (_receivedHTTPHeaders) {
+        CFRelease(_receivedHTTPHeaders);
+        _receivedHTTPHeaders = NULL;
+    }
+
+    self.inputStream.delegate = nil;
+    self.outputStream.delegate = nil;
+
+    [self.inputStream removeFromRunLoop:[NSRunLoop SR_networkRunLoop]
+                                forMode:NSDefaultRunLoopMode];
+    [self.inputStream close];
+    [self.outputStream close];
+    self.inputStream = nil;
+    self.outputStream = nil;
+    _completion(error, nil, nil);
+}
+
+// get proxy setting from device setting
+- (void)_configureProxy
+{
+    SRDebugLog(@"configureProxy");
+    NSDictionary *proxySettings = CFBridgingRelease(CFNetworkCopySystemProxySettings());
+
+    // CFNetworkCopyProxiesForURL doesn't understand ws:// or wss://
+    NSURL *httpURL;
+    if (_connectionRequiresSSL) {
+        httpURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://%@", _url.host]];
+    } else {
+        httpURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", _url.host]];
+    }
+
+    NSArray *proxies = CFBridgingRelease(CFNetworkCopyProxiesForURL((__bridge CFURLRef)httpURL, (__bridge CFDictionaryRef)proxySettings));
+    if (proxies.count == 0) {
+        SRDebugLog(@"configureProxy no proxies");
+        [self _openConnection];
+        return;                 // no proxy
+    }
+    NSDictionary *settings = [proxies objectAtIndex:0];
+    NSString *proxyType = settings[(NSString *)kCFProxyTypeKey];
+    if ([proxyType isEqualToString:(NSString *)kCFProxyTypeAutoConfigurationURL]) {
+        NSURL *pacURL = settings[(NSString *)kCFProxyAutoConfigurationURLKey];
+        if (pacURL) {
+            [self _fetchPAC:pacURL withProxySettings:proxySettings];
+            return;
+        }
+    }
+    if ([proxyType isEqualToString:(__bridge NSString *)kCFProxyTypeAutoConfigurationJavaScript]) {
+        NSString *script = settings[(__bridge NSString *)kCFProxyAutoConfigurationJavaScriptKey];
+        if (script) {
+            [self _runPACScript:script withProxySettings:proxySettings];
+            return;
+        }
+    }
+    [self _readProxySettingWithType:proxyType settings:settings];
+
+    [self _openConnection];
+}
+
+- (void)_readProxySettingWithType:(NSString *)proxyType settings:(NSDictionary *)settings
+{
+    if ([proxyType isEqualToString:(NSString *)kCFProxyTypeHTTP] ||
+        [proxyType isEqualToString:(NSString *)kCFProxyTypeHTTPS]) {
+        _httpProxyHost = settings[(NSString *)kCFProxyHostNameKey];
+        NSNumber *portValue = settings[(NSString *)kCFProxyPortNumberKey];
+        if (portValue) {
+            _httpProxyPort = [portValue intValue];
+        }
+    }
+    if ([proxyType isEqualToString:(NSString *)kCFProxyTypeSOCKS]) {
+        _socksProxyHost = settings[(NSString *)kCFProxyHostNameKey];
+        NSNumber *portValue = settings[(NSString *)kCFProxyPortNumberKey];
+        if (portValue)
+            _socksProxyPort = [portValue intValue];
+        _socksProxyUsername = settings[(NSString *)kCFProxyUsernameKey];
+        _socksProxyPassword = settings[(NSString *)kCFProxyPasswordKey];
+    }
+    if (_httpProxyHost) {
+        SRDebugLog(@"Using http proxy %@:%u", _httpProxyHost, _httpProxyPort);
+    } else if (_socksProxyHost) {
+        SRDebugLog(@"Using socks proxy %@:%u", _socksProxyHost, _socksProxyPort);
+    } else {
+        SRDebugLog(@"configureProxy no proxies");
+    }
+}
+
+- (void)_fetchPAC:(NSURL *)PACurl withProxySettings:(NSDictionary *)proxySettings
+{
+    SRDebugLog(@"SRWebSocket fetchPAC:%@", PACurl);
+
+    if ([PACurl isFileURL]) {
+        NSError *error = nil;
+        NSString *script = [NSString stringWithContentsOfURL:PACurl
+                                                usedEncoding:NULL
+                                                       error:&error];
+
+        if (error) {
+            [self _openConnection];
+        } else {
+            [self _runPACScript:script withProxySettings:proxySettings];
+        }
+        return;
+    }
+
+    NSString *scheme = [PACurl.scheme lowercaseString];
+    if (![scheme isEqualToString:@"http"] && ![scheme isEqualToString:@"https"]) {
+        // Don't know how to read data from this URL, we'll have to give up
+        // We'll simply assume no proxies, and start the request as normal
+        [self _openConnection];
+        return;
+    }
+    __weak typeof(self) wself = self;
+    NSURLRequest *request = [NSURLRequest requestWithURL:PACurl];
+    NSURLSession *session = [NSURLSession sharedSession];
+    [[session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
+        __strong typeof(wself) sself = wself;
+        if (!error) {
+            NSString *script = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+            [sself _runPACScript:script withProxySettings:proxySettings];
+        } else {
+            [sself _openConnection];
+        }
+    }] resume];
+}
+
+- (void)_runPACScript:(NSString *)script withProxySettings:(NSDictionary *)proxySettings
+{
+    if (!script) {
+        [self _openConnection];
+        return;
+    }
+    SRDebugLog(@"runPACScript");
+    // From: http://developer.apple.com/samplecode/CFProxySupportTool/listing1.html
+    // Work around <rdar://problem/5530166>.  This dummy call to
+    // CFNetworkCopyProxiesForURL initialise some state within CFNetwork
+    // that is required by CFNetworkCopyProxiesForAutoConfigurationScript.
+    CFBridgingRelease(CFNetworkCopyProxiesForURL((__bridge CFURLRef)_url, (__bridge CFDictionaryRef)proxySettings));
+
+    // Obtain the list of proxies by running the autoconfiguration script
+    CFErrorRef err = NULL;
+
+    // CFNetworkCopyProxiesForAutoConfigurationScript doesn't understand ws:// or wss://
+    NSURL *httpURL;
+    if (_connectionRequiresSSL)
+        httpURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://%@", _url.host]];
+    else
+        httpURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", _url.host]];
+
+    NSArray *proxies = CFBridgingRelease(CFNetworkCopyProxiesForAutoConfigurationScript((__bridge CFStringRef)script,(__bridge CFURLRef)httpURL, &err));
+    if (!err && [proxies count] > 0) {
+        NSDictionary *settings = [proxies objectAtIndex:0];
+        NSString *proxyType = settings[(NSString *)kCFProxyTypeKey];
+        [self _readProxySettingWithType:proxyType settings:settings];
+    }
+    [self _openConnection];
+}
+
+- (void)_openConnection
+{
+    [self _initializeStreams];
+
+    [self.inputStream scheduleInRunLoop:[NSRunLoop SR_networkRunLoop]
+                                forMode:NSDefaultRunLoopMode];
+    //[self.outputStream scheduleInRunLoop:[NSRunLoop SR_networkRunLoop]
+    //                           forMode:NSDefaultRunLoopMode];
+    [self.outputStream open];
+    [self.inputStream open];
+}
+
+- (void)_initializeStreams
+{
+    assert(_url.port.unsignedIntValue <= UINT32_MAX);
+    uint32_t port = _url.port.unsignedIntValue;
+    if (port == 0) {
+        port = (_connectionRequiresSSL ? 443 : 80);
+    }
+    NSString *host = _url.host;
+
+    if (_httpProxyHost) {
+        host = _httpProxyHost;
+        port = (_httpProxyPort ?: 80);
+    }
+
+    CFReadStreamRef readStream = NULL;
+    CFWriteStreamRef writeStream = NULL;
+
+    SRDebugLog(@"ProxyConnect connect stream to %@:%u", host, port);
+    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)host, port, &readStream, &writeStream);
+
+    self.outputStream = CFBridgingRelease(writeStream);
+    self.inputStream = CFBridgingRelease(readStream);
+
+    if (_socksProxyHost) {
+        SRDebugLog(@"ProxyConnect set sock property stream to %@:%u user %@ password %@", _socksProxyHost, _socksProxyPort, _socksProxyUsername, _socksProxyPassword);
+        NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:4];
+        settings[NSStreamSOCKSProxyHostKey] = _socksProxyHost;
+        if (_socksProxyPort) {
+            settings[NSStreamSOCKSProxyPortKey] = @(_socksProxyPort);
+        }
+        if (_socksProxyUsername) {
+            settings[NSStreamSOCKSProxyUserKey] = _socksProxyUsername;
+        }
+        if (_socksProxyPassword) {
+            settings[NSStreamSOCKSProxyPasswordKey] = _socksProxyPassword;
+        }
+        [self.inputStream setProperty:settings forKey:NSStreamSOCKSProxyConfigurationKey];
+        [self.outputStream setProperty:settings forKey:NSStreamSOCKSProxyConfigurationKey];
+    }
+    self.inputStream.delegate = self;
+    self.outputStream.delegate = self;
+}
+
+- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
+{
+    SRDebugLog(@"stream handleEvent %u", eventCode);
+    switch (eventCode) {
+        case NSStreamEventOpenCompleted: {
+            if (aStream == self.inputStream) {
+                if (_httpProxyHost) {
+                    [self _proxyDidConnect];
+                } else {
+                    [self _didConnect];
+                }
+            }
+        }  break;
+        case NSStreamEventErrorOccurred: {
+            [self _failWithError:aStream.streamError];
+        } break;
+        case NSStreamEventEndEncountered: {
+            [self _failWithError:aStream.streamError];
+        } break;
+        case NSStreamEventHasBytesAvailable: {
+            if (aStream == _inputStream) {
+                [self _processInputStream];
+            }
+        } break;
+        case NSStreamEventHasSpaceAvailable:
+        case NSStreamEventNone:
+            SRDebugLog(@"(default)  %@", aStream);
+            break;
+    }
+}
+
+- (void)_proxyDidConnect
+{
+    SRDebugLog(@"Proxy Connected");
+    uint32_t port = _url.port.unsignedIntValue;
+    if (port == 0) {
+        port = (_connectionRequiresSSL ? 443 : 80);
+    }
+    // Send HTTP CONNECT Request
+    NSString *connectRequestStr = [NSString stringWithFormat:@"CONNECT %@:%u HTTP/1.1\r\nHost: %@\r\nConnection: keep-alive\r\nProxy-Connection: keep-alive\r\n\r\n", _url.host, port, _url.host];
+
+    NSData *message = [connectRequestStr dataUsingEncoding:NSUTF8StringEncoding];
+    SRDebugLog(@"Proxy sending %@", connectRequestStr);
+
+    [self _writeData:message];
+}
+
+///handles the incoming bytes and sending them to the proper processing method
+- (void)_processInputStream
+{
+    NSMutableData *buf = [NSMutableData dataWithCapacity:SRDefaultBufferSize()];
+    uint8_t *buffer = buf.mutableBytes;
+    NSInteger length = [_inputStream read:buffer maxLength:SRDefaultBufferSize()];
+
+    if (length <= 0) {
+        return;
+    }
+
+    BOOL process = (_inputQueue.count == 0);
+    [_inputQueue addObject:[NSData dataWithBytes:buffer length:length]];
+
+    if (process) {
+        [self _dequeueInput];
+    }
+}
+
+// dequeue the incoming input so it is processed in order
+
+- (void)_dequeueInput
+{
+    while (_inputQueue.count > 0) {
+        NSData *data = _inputQueue.firstObject;
+        [_inputQueue removeObjectAtIndex:0];
+
+        // No need to process any data further, we got the full header data.
+        if ([self _proxyProcessHTTPResponseWithData:data]) {
+            break;
+        }
+    }
+}
+//handle checking the proxy  connection status
+- (BOOL)_proxyProcessHTTPResponseWithData:(NSData *)data
+{
+    if (_receivedHTTPHeaders == NULL) {
+        _receivedHTTPHeaders = CFHTTPMessageCreateEmpty(NULL, NO);
+    }
+
+    CFHTTPMessageAppendBytes(_receivedHTTPHeaders, (const UInt8 *)data.bytes, data.length);
+    if (CFHTTPMessageIsHeaderComplete(_receivedHTTPHeaders)) {
+        SRDebugLog(@"Finished reading headers %@", CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(_receivedHTTPHeaders)));
+        [self _proxyHTTPHeadersDidFinish];
+        return YES;
+    }
+
+    return NO;
+}
+
+- (void)_proxyHTTPHeadersDidFinish
+{
+    NSInteger responseCode = CFHTTPMessageGetResponseStatusCode(_receivedHTTPHeaders);
+
+    if (responseCode >= 299) {
+        SRDebugLog(@"Connect to Proxy Request failed with response code %d", responseCode);
+        NSError *error = SRHTTPErrorWithCodeDescription(responseCode, 2132,
+                                                        [NSString stringWithFormat:@"Received bad response code from proxy server: %d.",
+                                                         (int)responseCode]);
+        [self _failWithError:error];
+        return;
+    }
+    SRDebugLog(@"proxy connect return %d, call socket connect", responseCode);
+    [self _didConnect];
+}
+
+static NSTimeInterval const SRProxyConnectWriteTimeout = 5.0;
+
+- (void)_writeData:(NSData *)data
+{
+    const uint8_t * bytes = data.bytes;
+    __block NSInteger timeout = (NSInteger)(SRProxyConnectWriteTimeout * 1000000); // wait timeout before giving up
+    __weak typeof(self) wself = self;
+    dispatch_async(_writeQueue, ^{
+        __strong typeof(wself) sself = self;
+        if (!sself) {
+            return;
+        }
+        NSOutputStream *outStream = sself.outputStream;
+        if (!outStream) {
+            return;
+        }
+        while (![outStream hasSpaceAvailable]) {
+            usleep(100); //wait until the socket is ready
+            timeout -= 100;
+            if (timeout < 0) {
+                NSError *error = SRHTTPErrorWithCodeDescription(408, 2132, @"Proxy timeout");
+                [sself _failWithError:error];
+            } else if (outStream.streamError != nil) {
+                [sself _failWithError:outStream.streamError];
+            }
+        }
+        [outStream write:bytes maxLength:data.length];
+    });
+}
+
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/RunLoop/SRRunLoopThread.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/RunLoop/SRRunLoopThread.h
new file mode 100644 (file)
index 0000000..380cfa0
--- /dev/null
@@ -0,0 +1,24 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SRRunLoopThread : NSThread
+
+@property (nonatomic, strong, readonly) NSRunLoop *runLoop;
+
++ (instancetype)sharedThread;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/RunLoop/SRRunLoopThread.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/RunLoop/SRRunLoopThread.m
new file mode 100644 (file)
index 0000000..c692ae6
--- /dev/null
@@ -0,0 +1,84 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRRunLoopThread.h"
+
+@interface SRRunLoopThread ()
+{
+    dispatch_group_t _waitGroup;
+}
+
+@property (nonatomic, strong, readwrite) NSRunLoop *runLoop;
+
+@end
+
+@implementation SRRunLoopThread
+
++ (instancetype)sharedThread
+{
+    static SRRunLoopThread *thread;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        thread = [[SRRunLoopThread alloc] init];
+        thread.name = @"com.facebook.SocketRocket.NetworkThread";
+        thread.qualityOfService = NSQualityOfServiceUserInitiated;
+        [thread start];
+    });
+    return thread;
+}
+
+- (instancetype)init
+{
+    self = [super init];
+    if (self) {
+        _waitGroup = dispatch_group_create();
+        dispatch_group_enter(_waitGroup);
+    }
+    return self;
+}
+
+- (void)main
+{
+    @autoreleasepool {
+        _runLoop = [NSRunLoop currentRunLoop];
+        dispatch_group_leave(_waitGroup);
+
+        // Add an empty run loop source to prevent runloop from spinning.
+        CFRunLoopSourceContext sourceCtx = {
+            .version = 0,
+            .info = NULL,
+            .retain = NULL,
+            .release = NULL,
+            .copyDescription = NULL,
+            .equal = NULL,
+            .hash = NULL,
+            .schedule = NULL,
+            .cancel = NULL,
+            .perform = NULL
+        };
+        CFRunLoopSourceRef source = CFRunLoopSourceCreate(NULL, 0, &sourceCtx);
+        CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
+        CFRelease(source);
+
+        while ([_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) {
+
+        }
+        assert(NO);
+    }
+}
+
+- (NSRunLoop *)runLoop
+{
+    dispatch_group_wait(_waitGroup, DISPATCH_TIME_FOREVER);
+    return _runLoop;
+}
+
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/SRConstants.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/SRConstants.h
new file mode 100644 (file)
index 0000000..38dd009
--- /dev/null
@@ -0,0 +1,26 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+typedef NS_ENUM(uint8_t, SROpCode)
+{
+    SROpCodeTextFrame = 0x1,
+    SROpCodeBinaryFrame = 0x2,
+    // 3-7 reserved.
+    SROpCodeConnectionClose = 0x8,
+    SROpCodePing = 0x9,
+    SROpCodePong = 0xA,
+    // B-F reserved.
+};
+
+/**
+ Default buffer size that is used for reading/writing to streams.
+ */
+extern size_t SRDefaultBufferSize(void);
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/SRConstants.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/SRConstants.m
new file mode 100644 (file)
index 0000000..1dbd774
--- /dev/null
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRConstants.h"
+
+size_t SRDefaultBufferSize(void) {
+    static size_t size;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        size = getpagesize();
+    });
+    return size;
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Security/SRPinningSecurityPolicy.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Security/SRPinningSecurityPolicy.h
new file mode 100644 (file)
index 0000000..0d498b2
--- /dev/null
@@ -0,0 +1,27 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+#import <SocketRocket/SRSecurityPolicy.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/**
+ * NOTE: While publicly, SocketRocket does not support configuring the security policy with pinned certificates,
+ * it is still possible to manually construct a security policy of this class. If you do this, note that you may
+ * be open to MitM attacks, and we will not support any issues you may have. Dive at your own risk.
+ */
+@interface SRPinningSecurityPolicy : SRSecurityPolicy
+
+- (instancetype)initWithCertificates:(NSArray *)pinnedCertificates;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Security/SRPinningSecurityPolicy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Security/SRPinningSecurityPolicy.m
new file mode 100644 (file)
index 0000000..c12dffa
--- /dev/null
@@ -0,0 +1,71 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRPinningSecurityPolicy.h"
+
+#import <Foundation/Foundation.h>
+
+#import "SRLog.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SRPinningSecurityPolicy ()
+
+@property (nonatomic, copy, readonly) NSArray *pinnedCertificates;
+
+@end
+
+@implementation SRPinningSecurityPolicy
+
+- (instancetype)initWithCertificates:(NSArray *)pinnedCertificates
+{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+    // Do not validate certificate chain since we're pinning to specific certificates.
+    self = [super initWithCertificateChainValidationEnabled:NO];
+#pragma clang diagnostic pop
+
+    if (!self) { return self; }
+
+    if (pinnedCertificates.count == 0) {
+        @throw [NSException exceptionWithName:@"Creating security policy failed."
+                                       reason:@"Must specify at least one certificate when creating a pinning policy."
+                                     userInfo:nil];
+    }
+    _pinnedCertificates = [pinnedCertificates copy];
+
+    return self;
+}
+
+- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain
+{
+    SRDebugLog(@"Pinned cert count: %d", self.pinnedCertificates.count);
+    NSUInteger requiredCertCount = self.pinnedCertificates.count;
+
+    NSUInteger validatedCertCount = 0;
+    CFIndex serverCertCount = SecTrustGetCertificateCount(serverTrust);
+    for (CFIndex i = 0; i < serverCertCount; i++) {
+        SecCertificateRef cert = SecTrustGetCertificateAtIndex(serverTrust, i);
+        NSData *data = CFBridgingRelease(SecCertificateCopyData(cert));
+        for (id ref in self.pinnedCertificates) {
+            SecCertificateRef trustedCert = (__bridge SecCertificateRef)ref;
+            // TODO: (nlutsenko) Add caching, so we don't copy the data for every pinned cert all the time.
+            NSData *trustedCertData = CFBridgingRelease(SecCertificateCopyData(trustedCert));
+            if ([trustedCertData isEqualToData:data]) {
+                validatedCertCount++;
+                break;
+            }
+        }
+    }
+    return (requiredCertCount == validatedCertCount);
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRError.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRError.h
new file mode 100644 (file)
index 0000000..7e13a82
--- /dev/null
@@ -0,0 +1,20 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern NSError *SRErrorWithDomainCodeDescription(NSString *domain, NSInteger code, NSString *description);
+extern NSError *SRErrorWithCodeDescription(NSInteger code, NSString *description);
+extern NSError *SRErrorWithCodeDescriptionUnderlyingError(NSInteger code, NSString *description, NSError *underlyingError);
+
+extern NSError *SRHTTPErrorWithCodeDescription(NSInteger httpCode, NSInteger errorCode, NSString *description);
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRError.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRError.m
new file mode 100644 (file)
index 0000000..eeabe03
--- /dev/null
@@ -0,0 +1,42 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRError.h"
+
+#import "SRWebSocket.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+NSError *SRErrorWithDomainCodeDescription(NSString *domain, NSInteger code, NSString *description)
+{
+    return [NSError errorWithDomain:domain code:code userInfo:@{ NSLocalizedDescriptionKey: description }];
+}
+
+NSError *SRErrorWithCodeDescription(NSInteger code, NSString *description)
+{
+    return SRErrorWithDomainCodeDescription(SRWebSocketErrorDomain, code, description);
+}
+
+NSError *SRErrorWithCodeDescriptionUnderlyingError(NSInteger code, NSString *description, NSError *underlyingError)
+{
+    return [NSError errorWithDomain:SRWebSocketErrorDomain
+                               code:code
+                           userInfo:@{ NSLocalizedDescriptionKey: description,
+                                       NSUnderlyingErrorKey: underlyingError }];
+}
+
+NSError *SRHTTPErrorWithCodeDescription(NSInteger httpCode, NSInteger errorCode, NSString *description)
+{
+    return [NSError errorWithDomain:SRWebSocketErrorDomain
+                               code:errorCode
+                           userInfo:@{ NSLocalizedDescriptionKey: description,
+                                       SRHTTPResponseErrorKey: @(httpCode) }];
+}
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHTTPConnectMessage.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHTTPConnectMessage.h
new file mode 100644 (file)
index 0000000..b67f3d5
--- /dev/null
@@ -0,0 +1,21 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+#import <CFNetwork/CFNetwork.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern CFHTTPMessageRef SRHTTPConnectMessageCreate(NSURLRequest *request,
+                                                   NSString *securityKey,
+                                                   uint8_t webSocketProtocolVersion,
+                                                   NSArray<NSHTTPCookie *> *_Nullable cookies,
+                                                   NSArray<NSString *> *_Nullable requestedProtocols);
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHTTPConnectMessage.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHTTPConnectMessage.m
new file mode 100644 (file)
index 0000000..b2f9760
--- /dev/null
@@ -0,0 +1,73 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRHTTPConnectMessage.h"
+
+#import "SRURLUtilities.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+static NSString *_SRHTTPConnectMessageHost(NSURL *url)
+{
+    NSString *host = url.host;
+    if (url.port) {
+        host = [host stringByAppendingFormat:@":%@", url.port];
+    }
+    return host;
+}
+
+CFHTTPMessageRef SRHTTPConnectMessageCreate(NSURLRequest *request,
+                                            NSString *securityKey,
+                                            uint8_t webSocketProtocolVersion,
+                                            NSArray<NSHTTPCookie *> *_Nullable cookies,
+                                            NSArray<NSString *> *_Nullable requestedProtocols)
+{
+    NSURL *url = request.URL;
+
+    CFHTTPMessageRef message = CFHTTPMessageCreateRequest(NULL, (__bridge CFStringRef)request.HTTPMethod, (__bridge CFURLRef)url, kCFHTTPVersion1_1);
+
+    // Set host first so it defaults
+    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Host"), (__bridge CFStringRef)_SRHTTPConnectMessageHost(url));
+
+    // Apply cookies if any have been provided
+    if (cookies) {
+        NSDictionary<NSString *, NSString *> *messageCookies = [NSHTTPCookie requestHeaderFieldsWithCookies:(NSArray<NSHTTPCookie*> *_Nonnull)cookies];
+        [messageCookies enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) {
+            if (key.length && obj.length) {
+                CFHTTPMessageSetHeaderFieldValue(message, (__bridge CFStringRef)key, (__bridge CFStringRef)obj);
+            }
+        }];
+    }
+
+    // set header for http basic auth
+    NSString *basicAuthorizationString = SRBasicAuthorizationHeaderFromURL(url);
+    if (basicAuthorizationString) {
+        CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Authorization"), (__bridge CFStringRef)basicAuthorizationString);
+    }
+
+    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Upgrade"), CFSTR("websocket"));
+    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Connection"), CFSTR("Upgrade"));
+    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Sec-WebSocket-Key"), (__bridge CFStringRef)securityKey);
+    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Sec-WebSocket-Version"), (__bridge CFStringRef)@(webSocketProtocolVersion).stringValue);
+
+    CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Origin"), (__bridge CFStringRef)SRURLOrigin(url));
+
+    if (requestedProtocols.count) {
+        CFHTTPMessageSetHeaderFieldValue(message, CFSTR("Sec-WebSocket-Protocol"),
+                                         (__bridge CFStringRef)[requestedProtocols componentsJoinedByString:@", "]);
+    }
+
+    [request.allHTTPHeaderFields enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
+        CFHTTPMessageSetHeaderFieldValue(message, (__bridge CFStringRef)key, (__bridge CFStringRef)obj);
+    }];
+
+    return message;
+}
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHash.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHash.h
new file mode 100644 (file)
index 0000000..3db14de
--- /dev/null
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern NSData *SRSHA1HashFromString(NSString *string);
+extern NSData *SRSHA1HashFromBytes(const char *bytes, size_t length);
+
+extern NSString *SRBase64EncodedStringFromData(NSData *data);
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHash.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRHash.m
new file mode 100644 (file)
index 0000000..a150ecc
--- /dev/null
@@ -0,0 +1,47 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRHash.h"
+
+#import <CommonCrypto/CommonDigest.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+NSData *SRSHA1HashFromString(NSString *string)
+{
+    const char *utf8String = string.UTF8String;
+    if (!utf8String) {
+        return [NSData data];
+    }
+    size_t length = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+    return SRSHA1HashFromBytes(utf8String, length);
+}
+
+NSData *SRSHA1HashFromBytes(const char *bytes, size_t length)
+{
+    uint8_t outputLength = CC_SHA1_DIGEST_LENGTH;
+    unsigned char output[outputLength];
+    CC_SHA1(bytes, (CC_LONG)length, output);
+
+    return [NSData dataWithBytes:output length:outputLength];
+}
+
+NSString *SRBase64EncodedStringFromData(NSData *data)
+{
+    if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
+        return [data base64EncodedStringWithOptions:0];
+    }
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated-declarations"
+    return [data base64Encoding];
+#pragma clang diagnostic pop
+}
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRLog.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRLog.h
new file mode 100644 (file)
index 0000000..99689ef
--- /dev/null
@@ -0,0 +1,20 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+// Uncomment this line to enable debug logging
+//#define SR_DEBUG_LOG_ENABLED
+
+extern void SRErrorLog(NSString *format, ...);
+extern void SRDebugLog(NSString *format, ...);
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRLog.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRLog.m
new file mode 100644 (file)
index 0000000..4596017
--- /dev/null
@@ -0,0 +1,33 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRLog.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern void SRErrorLog(NSString *format, ...)
+{
+    __block va_list arg_list;
+    va_start (arg_list, format);
+
+    NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:arg_list];
+
+    va_end(arg_list);
+
+    NSLog(@"[SocketRocket] %@", formattedString);
+}
+
+extern void SRDebugLog(NSString *format, ...)
+{
+#ifdef SR_DEBUG_LOG_ENABLED
+    SRErrorLog(tag, format);
+#endif
+}
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRMutex.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRMutex.h
new file mode 100644 (file)
index 0000000..8226ce6
--- /dev/null
@@ -0,0 +1,22 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef __attribute__((capability("mutex"))) pthread_mutex_t *SRMutex;
+
+extern SRMutex SRMutexInitRecursive(void);
+extern void SRMutexDestroy(SRMutex mutex);
+
+extern void SRMutexLock(SRMutex mutex) __attribute__((acquire_capability(mutex)));
+extern void SRMutexUnlock(SRMutex mutex) __attribute__((release_capability(mutex)));
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRMutex.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRMutex.m
new file mode 100644 (file)
index 0000000..03b5939
--- /dev/null
@@ -0,0 +1,47 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRMutex.h"
+
+#import <pthread/pthread.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+SRMutex SRMutexInitRecursive(void)
+{
+    pthread_mutex_t *mutex = malloc(sizeof(pthread_mutex_t));
+    pthread_mutexattr_t attributes;
+
+    pthread_mutexattr_init(&attributes);
+    pthread_mutexattr_settype(&attributes, PTHREAD_MUTEX_RECURSIVE);
+    pthread_mutex_init(mutex, &attributes);
+    pthread_mutexattr_destroy(&attributes);
+
+    return mutex;
+}
+
+void SRMutexDestroy(SRMutex mutex)
+{
+    pthread_mutex_destroy(mutex);
+    free(mutex);
+}
+
+__attribute__((no_thread_safety_analysis))
+void SRMutexLock(SRMutex mutex)
+{
+    pthread_mutex_lock(mutex);
+}
+
+__attribute__((no_thread_safety_analysis))
+void SRMutexUnlock(SRMutex mutex)
+{
+    pthread_mutex_unlock(mutex);
+}
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRRandom.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRRandom.h
new file mode 100644 (file)
index 0000000..9b116cf
--- /dev/null
@@ -0,0 +1,16 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+extern NSData *SRRandomData(NSUInteger length);
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRRandom.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRRandom.m
new file mode 100644 (file)
index 0000000..acfbfe9
--- /dev/null
@@ -0,0 +1,29 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRRandom.h"
+
+#import <Security/SecRandom.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+NSData *SRRandomData(NSUInteger length)
+{
+    NSMutableData *_Nullable data = [NSMutableData dataWithLength:length];
+    if (data == nil) {
+        [NSException raise:NSInternalInconsistencyException format:@"Failed to allocate random data"];
+    }
+    int result = SecRandomCopyBytes(kSecRandomDefault, data.length, ((NSMutableData *_Nonnull)data).mutableBytes);
+    if (result != errSecSuccess) {
+        [NSException raise:NSInternalInconsistencyException format:@"Failed to generate random bytes with OSStatus: %d", result];
+    }
+    return (NSMutableData *_Nonnull)data;
+}
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRSIMDHelpers.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRSIMDHelpers.h
new file mode 100644 (file)
index 0000000..8291cc7
--- /dev/null
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+/**
+ Unmask bytes using XOR via SIMD.
+
+ @param bytes    The bytes to unmask.
+ @param length   The number of bytes to unmask.
+ @param maskKey The mask to XOR with MUST be of length sizeof(uint32_t).
+ */
+void SRMaskBytesSIMD(uint8_t *bytes, size_t length, uint8_t *maskKey);
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRSIMDHelpers.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRSIMDHelpers.m
new file mode 100644 (file)
index 0000000..97e6fc1
--- /dev/null
@@ -0,0 +1,73 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRSIMDHelpers.h"
+
+typedef uint8_t uint8x32_t __attribute__((vector_size(32)));
+
+static void SRMaskBytesManual(uint8_t *bytes, size_t length, uint8_t *maskKey) {
+    for (size_t i = 0; i < length; i++) {
+        bytes[i] = bytes[i] ^ maskKey[i % sizeof(uint32_t)];
+    }
+}
+
+/**
+ Right-shift the elements of a vector, circularly.
+
+ @param vector The vector to circular shift.
+ @param by     The number of elements to shift by.
+
+ @return A shifted vector.
+ */
+static uint8x32_t SRShiftVector(uint8x32_t vector, size_t by) {
+    uint8x32_t vectorCopy = vector;
+    by = by % _Alignof(uint8x32_t);
+
+    uint8_t *vectorPointer = (uint8_t *)&vector;
+    uint8_t *vectorCopyPointer = (uint8_t *)&vectorCopy;
+
+    memmove(vectorPointer + by, vectorPointer, sizeof(vector) - by);
+    memcpy(vectorPointer, vectorCopyPointer + (sizeof(vector) - by), by);
+
+    return vector;
+}
+
+void SRMaskBytesSIMD(uint8_t *bytes, size_t length, uint8_t *maskKey) {
+    size_t alignmentBytes = _Alignof(uint8x32_t) - ((uintptr_t)bytes % _Alignof(uint8x32_t));
+    if (alignmentBytes == _Alignof(uint8x32_t)) {
+        alignmentBytes = 0;
+    }
+
+    // If the number of bytes that can be processed after aligning is
+    // less than the number of bytes we can put into a vector,
+    // then there's no work to do with SIMD, just call the manual version.
+    if (alignmentBytes > length || (length - alignmentBytes) < sizeof(uint8x32_t)) {
+        SRMaskBytesManual(bytes, length, maskKey);
+        return;
+    }
+
+    size_t vectorLength = (length - alignmentBytes) / sizeof(uint8x32_t);
+    size_t manualStartOffset = alignmentBytes + (vectorLength * sizeof(uint8x32_t));
+    size_t manualLength = length - manualStartOffset;
+
+    uint8x32_t *vector = (uint8x32_t *)(bytes + alignmentBytes);
+    uint8x32_t maskVector;
+
+    memset_pattern4(&maskVector, maskKey, sizeof(uint8x32_t));
+    maskVector = SRShiftVector(maskVector, alignmentBytes);
+
+    SRMaskBytesManual(bytes, alignmentBytes, maskKey);
+
+    for (size_t vectorIndex = 0; vectorIndex < vectorLength; vectorIndex++) {
+        vector[vectorIndex] = vector[vectorIndex] ^ maskVector;
+    }
+
+    // Use the shifted mask for the final manual part.
+    SRMaskBytesManual(bytes + manualStartOffset, manualLength, (uint8_t *) &maskVector);
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRURLUtilities.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRURLUtilities.h
new file mode 100644 (file)
index 0000000..a9ec782
--- /dev/null
@@ -0,0 +1,26 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+// The origin isn't really applicable for a native application.
+// So instead, just map ws -> http and wss -> https.
+extern NSString *SRURLOrigin(NSURL *url);
+
+extern BOOL SRURLRequiresSSL(NSURL *_Nullable url);
+
+// Extracts `user` and `password` from url (if available) into `Basic base64(user:password)`.
+extern NSString *_Nullable SRBasicAuthorizationHeaderFromURL(NSURL *url);
+
+// Returns a valid value for `NSStreamNetworkServiceType` or `nil`.
+extern NSString *_Nullable SRStreamNetworkServiceTypeFromURLRequest(NSURLRequest *request);
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRURLUtilities.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/Internal/Utilities/SRURLUtilities.m
new file mode 100644 (file)
index 0000000..cb1eef6
--- /dev/null
@@ -0,0 +1,86 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRURLUtilities.h"
+
+#import "SRHash.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+NSString *SRURLOrigin(NSURL *url)
+{
+    NSMutableString *origin = [NSMutableString string];
+
+    NSString *scheme = url.scheme.lowercaseString;
+    if ([scheme isEqualToString:@"wss"]) {
+        scheme = @"https";
+    } else if ([scheme isEqualToString:@"ws"]) {
+        scheme = @"http";
+    }
+    [origin appendFormat:@"%@://%@", scheme, url.host];
+
+    NSNumber *port = url.port;
+    BOOL portIsDefault = (!port ||
+                          ([scheme isEqualToString:@"http"] && port.integerValue == 80) ||
+                          ([scheme isEqualToString:@"https"] && port.integerValue == 443));
+    if (!portIsDefault) {
+        [origin appendFormat:@":%@", port.stringValue];
+    }
+    return origin;
+}
+
+extern BOOL SRURLRequiresSSL(NSURL *_Nullable url)
+{
+    NSString *scheme = url.scheme.lowercaseString;
+    return ([scheme isEqualToString:@"wss"] || [scheme isEqualToString:@"https"]);
+}
+
+extern NSString *_Nullable SRBasicAuthorizationHeaderFromURL(NSURL *url)
+{
+    if (!url.user || !url.password) {
+        return nil;
+    }
+
+    NSData *data = [[NSString stringWithFormat:@"%@:%@", url.user, url.password] dataUsingEncoding:NSUTF8StringEncoding];
+    return [NSString stringWithFormat:@"Basic %@", SRBase64EncodedStringFromData(data)];
+}
+
+extern NSString *_Nullable SRStreamNetworkServiceTypeFromURLRequest(NSURLRequest *request)
+{
+    NSString *networkServiceType = nil;
+    switch (request.networkServiceType) {
+        case NSURLNetworkServiceTypeDefault:
+        case NSURLNetworkServiceTypeResponsiveData:
+        case NSURLNetworkServiceTypeAVStreaming:
+        case NSURLNetworkServiceTypeResponsiveAV:
+            break;
+        case NSURLNetworkServiceTypeVoIP:
+            networkServiceType = NSStreamNetworkServiceTypeVoIP;
+            break;
+        case NSURLNetworkServiceTypeVideo:
+            networkServiceType = NSStreamNetworkServiceTypeVideo;
+            break;
+        case NSURLNetworkServiceTypeBackground:
+            networkServiceType = NSStreamNetworkServiceTypeBackground;
+            break;
+        case NSURLNetworkServiceTypeVoice:
+            networkServiceType = NSStreamNetworkServiceTypeVoice;
+            break;
+#if (__MAC_OS_X_VERSION_MAX_ALLOWED >= 101200 || __IPHONE_OS_VERSION_MAX_ALLOWED >= 100000 || __TV_OS_VERSION_MAX_ALLOWED >= 100000 || __WATCH_OS_VERSION_MAX_ALLOWED >= 30000)
+        case NSURLNetworkServiceTypeCallSignaling: {
+            if (@available(iOS 10.0, tvOS 10.0, macOS 10.12, *)) {
+                networkServiceType = NSStreamNetworkServiceTypeCallSignaling;
+            }
+        } break;
+#endif
+    }
+    return networkServiceType;
+}
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSRunLoop+SRWebSocket.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSRunLoop+SRWebSocket.h
new file mode 100644 (file)
index 0000000..8f419e3
--- /dev/null
@@ -0,0 +1,27 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSRunLoop (SRWebSocket)
+
+/**
+ Default run loop that will be used to schedule all instances of `SRWebSocket`.
+
+ @return An instance of `NSRunLoop`.
+ */
++ (NSRunLoop *)SR_networkRunLoop;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSRunLoop+SRWebSocket.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSRunLoop+SRWebSocket.m
new file mode 100644 (file)
index 0000000..30eb608
--- /dev/null
@@ -0,0 +1,27 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "NSRunLoop+SRWebSocket.h"
+#import "NSRunLoop+SRWebSocketPrivate.h"
+
+#import "SRRunLoopThread.h"
+
+// Required for object file to always be linked.
+void import_NSRunLoop_SRWebSocket(void) { }
+
+@implementation NSRunLoop (SRWebSocket)
+
++ (NSRunLoop *)SR_networkRunLoop
+{
+    return [SRRunLoopThread sharedThread].runLoop;
+}
+
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSURLRequest+SRWebSocket.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSURLRequest+SRWebSocket.h
new file mode 100644 (file)
index 0000000..4ccffd5
--- /dev/null
@@ -0,0 +1,38 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface NSURLRequest (SRWebSocket)
+
+/**
+ An array of pinned `SecCertificateRef` SSL certificates that `SRWebSocket` will use for validation.
+ */
+@property (nullable, nonatomic, copy, readonly) NSArray *SR_SSLPinnedCertificates
+    DEPRECATED_MSG_ATTRIBUTE("Using pinned certificates is neither secure nor supported in SocketRocket, "
+                             "and leads to security issues. Please use a proper, trust chain validated certificate.");
+
+@end
+
+@interface NSMutableURLRequest (SRWebSocket)
+
+/**
+ An array of pinned `SecCertificateRef` SSL certificates that `SRWebSocket` will use for validation.
+ */
+@property (nullable, nonatomic, copy) NSArray *SR_SSLPinnedCertificates
+    DEPRECATED_MSG_ATTRIBUTE("Using pinned certificates is neither secure nor supported in SocketRocket, "
+                             "and leads to security issues. Please use a proper, trust chain validated certificate.");
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSURLRequest+SRWebSocket.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/NSURLRequest+SRWebSocket.m
new file mode 100644 (file)
index 0000000..8efb090
--- /dev/null
@@ -0,0 +1,42 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "NSURLRequest+SRWebSocket.h"
+#import "NSURLRequest+SRWebSocketPrivate.h"
+
+// Required for object file to always be linked.
+void import_NSURLRequest_SRWebSocket(void) { }
+
+NS_ASSUME_NONNULL_BEGIN
+
+static NSString *const SRSSLPinnnedCertificatesKey = @"SocketRocket_SSLPinnedCertificates";
+
+@implementation NSURLRequest (SRWebSocket)
+
+- (nullable NSArray *)SR_SSLPinnedCertificates
+{
+    return nil;
+}
+
+@end
+
+@implementation NSMutableURLRequest (SRWebSocket)
+
+- (void)setSR_SSLPinnedCertificates:(nullable NSArray *)SR_SSLPinnedCertificates
+{
+    [NSException raise:NSInvalidArgumentException
+                format:@"Using pinned certificates is neither secure nor supported in SocketRocket, "
+                        "and leads to security issues. Please use a proper, trust chain validated certificate."];
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRSecurityPolicy.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRSecurityPolicy.h
new file mode 100644 (file)
index 0000000..3fbd809
--- /dev/null
@@ -0,0 +1,72 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+#import <Security/Security.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SRSecurityPolicy : NSObject
+
+/**
+ A default `SRSecurityPolicy` implementation specifies socket security and
+ validates the certificate chain.
+
+ Use a subclass of `SRSecurityPolicy` for more fine grained customization.
+ */
++ (instancetype)defaultPolicy;
+
+/**
+ Specifies socket security and provider certificate pinning, disregarding certificate
+ chain validation.
+
+ @param pinnedCertificates Array of `SecCertificateRef` SSL certificates to use for validation.
+ */
++ (instancetype)pinnningPolicyWithCertificates:(NSArray *)pinnedCertificates
+    DEPRECATED_MSG_ATTRIBUTE("Using pinned certificates is neither secure nor supported in SocketRocket, "
+                             "and leads to security issues. Please use a proper, trust chain validated certificate.");
+
+/**
+ Specifies socket security and optional certificate chain validation.
+
+ @param enabled Whether or not to validate the SSL certificate chain. If you
+ are considering using this method because your certificate was not issued by a
+ recognized certificate authority, consider using `pinningPolicyWithCertificates` instead.
+ */
+- (instancetype)initWithCertificateChainValidationEnabled:(BOOL)enabled
+    DEPRECATED_MSG_ATTRIBUTE("Disabling certificate chain validation is unsafe. "
+                             "Please use a proper Certificate Authority to issue your TLS certificates.")
+    NS_DESIGNATED_INITIALIZER;
+
+/**
+ Updates all the security options for input and output streams, for example you
+ can set your socket security level here.
+
+ @param stream Stream to update the options in.
+ */
+- (void)updateSecurityOptionsInStream:(NSStream *)stream;
+
+/**
+ 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. In the default implemenation, no further validation is done here, but
+ you're free to override it in a subclass. See `SRPinningSecurityPolicy.h` for
+ an example.
+
+ @param serverTrust The X.509 certificate trust of the server.
+ @param domain The domain of serverTrust.
+
+ @return Whether or not to trust the server.
+ */
+- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRSecurityPolicy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRSecurityPolicy.m
new file mode 100644 (file)
index 0000000..3759d26
--- /dev/null
@@ -0,0 +1,75 @@
+//
+// Copyright (c) 2016-present, Facebook, Inc.
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRSecurityPolicy.h"
+#import "SRPinningSecurityPolicy.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SRSecurityPolicy ()
+
+@property (nonatomic, assign, readonly) BOOL certificateChainValidationEnabled;
+
+@end
+
+@implementation SRSecurityPolicy
+
++ (instancetype)defaultPolicy
+{
+    return [self new];
+}
+
++ (instancetype)pinnningPolicyWithCertificates:(NSArray *)pinnedCertificates
+{
+    [NSException raise:NSInvalidArgumentException
+                format:@"Using pinned certificates is neither secure nor supported in SocketRocket, "
+                        "and leads to security issues. Please use a proper, trust chain validated certificate."];
+
+    return nil;
+}
+
+- (instancetype)initWithCertificateChainValidationEnabled:(BOOL)enabled
+{
+    self = [super init];
+    if (!self) { return self; }
+
+    _certificateChainValidationEnabled = enabled;
+
+    return self;
+}
+
+- (instancetype)init
+{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+
+    return [self initWithCertificateChainValidationEnabled:YES];
+
+#pragma clang diagnostic pop
+}
+
+- (void)updateSecurityOptionsInStream:(NSStream *)stream
+{
+    // Enforce TLS 1.2
+    [stream setProperty:(__bridge id)CFSTR("kCFStreamSocketSecurityLevelTLSv1_2") forKey:(__bridge id)kCFStreamPropertySocketSecurityLevel];
+
+    // Validate certificate chain for this stream if enabled.
+    NSDictionary<NSString *, id> *sslOptions = @{ (__bridge NSString *)kCFStreamSSLValidatesCertificateChain : @(self.certificateChainValidationEnabled) };
+    [stream setProperty:sslOptions forKey:(__bridge NSString *)kCFStreamPropertySSLSettings];
+}
+
+- (BOOL)evaluateServerTrust:(SecTrustRef)serverTrust forDomain:(NSString *)domain
+{
+    // No further evaluation happens in the default policy.
+    return YES;
+}
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRWebSocket.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRWebSocket.h
new file mode 100644 (file)
index 0000000..a3806f1
--- /dev/null
@@ -0,0 +1,417 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef NS_ENUM(NSInteger, SRReadyState) {
+    SR_CONNECTING   = 0,
+    SR_OPEN         = 1,
+    SR_CLOSING      = 2,
+    SR_CLOSED       = 3,
+};
+
+typedef NS_ENUM(NSInteger, SRStatusCode) {
+    // 0-999: Reserved and not used.
+    SRStatusCodeNormal = 1000,
+    SRStatusCodeGoingAway = 1001,
+    SRStatusCodeProtocolError = 1002,
+    SRStatusCodeUnhandledType = 1003,
+    // 1004 reserved.
+    SRStatusNoStatusReceived = 1005,
+    SRStatusCodeAbnormal = 1006,
+    SRStatusCodeInvalidUTF8 = 1007,
+    SRStatusCodePolicyViolated = 1008,
+    SRStatusCodeMessageTooBig = 1009,
+    SRStatusCodeMissingExtension = 1010,
+    SRStatusCodeInternalError = 1011,
+    SRStatusCodeServiceRestart = 1012,
+    SRStatusCodeTryAgainLater = 1013,
+    // 1014: Reserved for future use by the WebSocket standard.
+    SRStatusCodeTLSHandshake = 1015,
+    // 1016-1999: Reserved for future use by the WebSocket standard.
+    // 2000-2999: Reserved for use by WebSocket extensions.
+    // 3000-3999: Available for use by libraries and frameworks. May not be used by applications. Available for registration at the IANA via first-come, first-serve.
+    // 4000-4999: Available for use by applications.
+};
+
+@class SRWebSocket;
+@class SRSecurityPolicy;
+
+/**
+ Error domain used for errors reported by SRWebSocket.
+ */
+extern NSString *const SRWebSocketErrorDomain;
+
+/**
+ Key used for HTTP status code if bad response was received from the server.
+ */
+extern NSString *const SRHTTPResponseErrorKey;
+
+@protocol SRWebSocketDelegate;
+
+///--------------------------------------
+#pragma mark - SRWebSocket
+///--------------------------------------
+
+/**
+ A `SRWebSocket` object lets you connect, send and receive data to a remote Web Socket.
+ */
+@interface SRWebSocket : NSObject <NSStreamDelegate>
+
+/**
+ The delegate of the web socket.
+
+ The web socket delegate is notified on all state changes that happen to the web socket.
+ */
+@property (nonatomic, weak) id <SRWebSocketDelegate> delegate;
+
+/**
+ A dispatch queue for scheduling the delegate calls. The queue doesn't need be a serial queue.
+
+ If `nil` and `delegateOperationQueue` is `nil`, the socket uses main queue for performing all delegate method calls.
+ */
+@property (nullable, nonatomic, strong) dispatch_queue_t delegateDispatchQueue;
+
+/**
+ An operation queue for scheduling the delegate calls.
+
+ If `nil` and `delegateOperationQueue` is `nil`, the socket uses main queue for performing all delegate method calls.
+ */
+@property (nullable, nonatomic, strong) NSOperationQueue *delegateOperationQueue;
+
+/**
+ Current ready state of the socket. Default: `SR_CONNECTING`.
+
+ This property is Key-Value Observable and fully thread-safe.
+ */
+@property (atomic, assign, readonly) SRReadyState readyState;
+
+/**
+ An instance of `NSURL` that this socket connects to.
+ */
+@property (nullable, nonatomic, strong, readonly) NSURL *url;
+
+/**
+ All HTTP headers that were received by socket or `nil` if none were received so far.
+ */
+@property (nullable, nonatomic, assign, readonly) CFHTTPMessageRef receivedHTTPHeaders;
+
+/**
+ Array of `NSHTTPCookie` cookies to apply to the connection.
+ */
+@property (nullable, nonatomic, copy) NSArray<NSHTTPCookie *> *requestCookies;
+
+/**
+ The negotiated web socket protocol or `nil` if handshake did not yet complete.
+ */
+@property (nullable, nonatomic, copy, readonly) NSString *protocol;
+
+/**
+ A boolean value indicating whether this socket will allow connection without SSL trust chain evaluation.
+ For DEBUG builds this flag is ignored, and SSL connections are allowed regardless of the certificate trust configuration
+ */
+@property (nonatomic, assign, readonly) BOOL allowsUntrustedSSLCertificates;
+
+///--------------------------------------
+#pragma mark - Constructors
+///--------------------------------------
+
+/**
+ Initializes a web socket with a given `NSURLRequest`.
+
+ @param request Request to initialize with.
+ */
+- (instancetype)initWithURLRequest:(NSURLRequest *)request;
+
+/**
+ Initializes a web socket with a given `NSURLRequest`, specifying a transport security policy (e.g. SSL configuration).
+
+ @param request        Request to initialize with.
+ @param securityPolicy Policy object describing transport security behavior.
+ */
+- (instancetype)initWithURLRequest:(NSURLRequest *)request securityPolicy:(SRSecurityPolicy *)securityPolicy;
+
+/**
+ Initializes a web socket with a given `NSURLRequest` and list of sub-protocols.
+
+ @param request   Request to initialize with.
+ @param protocols An array of strings that turn into `Sec-WebSocket-Protocol`. Default: `nil`.
+ */
+- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(nullable NSArray<NSString *> *)protocols;
+
+/**
+ Initializes a web socket with a given `NSURLRequest`, list of sub-protocols and whether untrusted SSL certificates are allowed.
+
+ @param request                        Request to initialize with.
+ @param protocols                      An array of strings that turn into `Sec-WebSocket-Protocol`. Default: `nil`.
+ @param allowsUntrustedSSLCertificates Boolean value indicating whether untrusted SSL certificates are allowed. Default: `false`.
+ */
+- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(nullable NSArray<NSString *> *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates
+    DEPRECATED_MSG_ATTRIBUTE("Disabling certificate chain validation is unsafe. "
+                             "Please use a proper Certificate Authority to issue your TLS certificates.");
+
+/**
+ Initializes a web socket with a given `NSURLRequest`, list of sub-protocols and whether untrusted SSL certificates are allowed.
+
+ @param request        Request to initialize with.
+ @param protocols      An array of strings that turn into `Sec-WebSocket-Protocol`. Default: `nil`.
+ @param securityPolicy Policy object describing transport security behavior.
+ */
+- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(nullable NSArray<NSString *> *)protocols securityPolicy:(SRSecurityPolicy *)securityPolicy NS_DESIGNATED_INITIALIZER;
+
+/**
+ Initializes a web socket with a given `NSURL`.
+
+ @param url URL to initialize with.
+ */
+- (instancetype)initWithURL:(NSURL *)url;
+
+/**
+ Initializes a web socket with a given `NSURL` and list of sub-protocols.
+
+ @param url       URL to initialize with.
+ @param protocols An array of strings that turn into `Sec-WebSocket-Protocol`. Default: `nil`.
+ */
+- (instancetype)initWithURL:(NSURL *)url protocols:(nullable NSArray<NSString *> *)protocols;
+
+/**
+ Initializes a web socket with a given `NSURL`, specifying a transport security policy (e.g. SSL configuration).
+
+ @param url            URL to initialize with.
+ @param securityPolicy Policy object describing transport security behavior.
+ */
+- (instancetype)initWithURL:(NSURL *)url securityPolicy:(SRSecurityPolicy *)securityPolicy;
+
+/**
+ Initializes a web socket with a given `NSURL`, list of sub-protocols and whether untrusted SSL certificates are allowed.
+
+ @param url                            URL to initialize with.
+ @param protocols                      An array of strings that turn into `Sec-WebSocket-Protocol`. Default: `nil`.
+ @param allowsUntrustedSSLCertificates Boolean value indicating whether untrusted SSL certificates are allowed. Default: `false`.
+ */
+- (instancetype)initWithURL:(NSURL *)url protocols:(nullable NSArray<NSString *> *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates
+    DEPRECATED_MSG_ATTRIBUTE("Disabling certificate chain validation is unsafe. "
+                             "Please use a proper Certificate Authority to issue your TLS certificates.");
+
+/**
+ Unavailable initializer. Please use any other initializer.
+ */
+- (instancetype)init NS_UNAVAILABLE;
+
+/**
+ Unavailable constructor. Please use any other initializer.
+ */
++ (instancetype)new NS_UNAVAILABLE;
+
+///--------------------------------------
+#pragma mark - Schedule
+///--------------------------------------
+
+/**
+ Schedules a received on a given run loop in a given mode.
+ By default, a web socket will schedule itself on `+[NSRunLoop SR_networkRunLoop]` using `NSDefaultRunLoopMode`.
+
+ @param runLoop The run loop on which to schedule the receiver.
+ @param mode     The mode for the run loop.
+ */
+- (void)scheduleInRunLoop:(NSRunLoop *)runLoop forMode:(NSString *)mode NS_SWIFT_NAME(schedule(in:forMode:));
+
+/**
+ Removes the receiver from a given run loop running in a given mode.
+
+ @param runLoop The run loop on which the receiver was scheduled.
+ @param mode    The mode for the run loop.
+ */
+- (void)unscheduleFromRunLoop:(NSRunLoop *)runLoop forMode:(NSString *)mode NS_SWIFT_NAME(unschedule(from:forMode:));
+
+///--------------------------------------
+#pragma mark - Open / Close
+///--------------------------------------
+
+/**
+ Opens web socket, which will trigger connection, authentication and start receiving/sending events.
+ An instance of `SRWebSocket` is intended for one-time-use only. This method should be called once and only once.
+ */
+- (void)open;
+
+/**
+ Closes a web socket using `SRStatusCodeNormal` code and no reason.
+ */
+- (void)close;
+
+/**
+ Closes a web socket using a given code and reason.
+
+ @param code   Code to close the socket with.
+ @param reason Reason to send to the server or `nil`.
+ */
+- (void)closeWithCode:(NSInteger)code reason:(nullable NSString *)reason;
+
+///--------------------------------------
+#pragma mark Send
+///--------------------------------------
+
+/**
+ Send a UTF-8 string or binary data to the server.
+
+ @param message UTF-8 String or Data to send.
+
+ @deprecated Please use `sendString:` or `sendData` instead.
+ */
+- (void)send:(nullable id)message __attribute__((deprecated("Please use `sendString:error:` or `sendData:error:` instead.")));
+
+/**
+ Send a UTF-8 String to the server.
+
+ @param string String to send.
+ @param error  On input, a pointer to variable for an `NSError` object.
+ If an error occurs, this pointer is set to an `NSError` object containing information about the error.
+ You may specify `nil` to ignore the error information.
+
+ @return `YES` if the string was scheduled to send, otherwise - `NO`.
+ */
+- (BOOL)sendString:(NSString *)string error:(NSError **)error NS_SWIFT_NAME(send(string:));
+
+/**
+ Send binary data to the server.
+
+ @param data  Data to send.
+ @param error On input, a pointer to variable for an `NSError` object.
+ If an error occurs, this pointer is set to an `NSError` object containing information about the error.
+ You may specify `nil` to ignore the error information.
+
+ @return `YES` if the string was scheduled to send, otherwise - `NO`.
+ */
+- (BOOL)sendData:(nullable NSData *)data error:(NSError **)error NS_SWIFT_NAME(send(data:));
+
+/**
+ Send binary data to the server, without making a defensive copy of it first.
+
+ @param data  Data to send.
+ @param error On input, a pointer to variable for an `NSError` object.
+ If an error occurs, this pointer is set to an `NSError` object containing information about the error.
+ You may specify `nil` to ignore the error information.
+
+ @return `YES` if the string was scheduled to send, otherwise - `NO`.
+ */
+- (BOOL)sendDataNoCopy:(nullable NSData *)data error:(NSError **)error NS_SWIFT_NAME(send(dataNoCopy:));
+
+/**
+ Send Ping message to the server with optional data.
+
+ @param data  Instance of `NSData` or `nil`.
+ @param error On input, a pointer to variable for an `NSError` object.
+ If an error occurs, this pointer is set to an `NSError` object containing information about the error.
+ You may specify `nil` to ignore the error information.
+
+ @return `YES` if the string was scheduled to send, otherwise - `NO`.
+ */
+- (BOOL)sendPing:(nullable NSData *)data error:(NSError **)error NS_SWIFT_NAME(sendPing(_:));
+
+@end
+
+///--------------------------------------
+#pragma mark - SRWebSocketDelegate
+///--------------------------------------
+
+/**
+ The `SRWebSocketDelegate` protocol describes the methods that `SRWebSocket` objects
+ call on their delegates to handle status and messsage events.
+ */
+@protocol SRWebSocketDelegate <NSObject>
+
+@optional
+
+#pragma mark Receive Messages
+
+/**
+ Called when any message was received from a web socket.
+ This method is suboptimal and might be deprecated in a future release.
+
+ @param webSocket An instance of `SRWebSocket` that received a message.
+ @param message   Received message. Either a `String` or `NSData`.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessage:(id)message;
+
+/**
+ Called when a frame was received from a web socket.
+
+ @param webSocket An instance of `SRWebSocket` that received a message.
+ @param string    Received text in a form of UTF-8 `String`.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithString:(NSString *)string;
+
+/**
+ Called when a frame was received from a web socket.
+
+ @param webSocket An instance of `SRWebSocket` that received a message.
+ @param data      Received data in a form of `NSData`.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didReceiveMessageWithData:(NSData *)data;
+
+#pragma mark Status & Connection
+
+/**
+ Called when a given web socket was open and authenticated.
+
+ @param webSocket An instance of `SRWebSocket` that was open.
+ */
+- (void)webSocketDidOpen:(SRWebSocket *)webSocket;
+
+/**
+ Called when a given web socket encountered an error.
+
+ @param webSocket An instance of `SRWebSocket` that failed with an error.
+ @param error     An instance of `NSError`.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didFailWithError:(NSError *)error;
+
+/**
+ Called when a given web socket was closed.
+
+ @param webSocket An instance of `SRWebSocket` that was closed.
+ @param code      Code reported by the server.
+ @param reason    Reason in a form of a String that was reported by the server or `nil`.
+ @param wasClean  Boolean value indicating whether a socket was closed in a clean state.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didCloseWithCode:(NSInteger)code reason:(nullable NSString *)reason wasClean:(BOOL)wasClean;
+
+/**
+ Called on receive of a ping message from the server.
+
+ @param webSocket An instance of `SRWebSocket` that received a ping frame.
+ @param data      Payload that was received or `nil` if there was no payload.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didReceivePingWithData:(nullable NSData *)data;
+
+/**
+ Called when a pong data was received in response to ping.
+
+ @param webSocket An instance of `SRWebSocket` that received a pong frame.
+ @param pongData  Payload that was received or `nil` if there was no payload.
+ */
+- (void)webSocket:(SRWebSocket *)webSocket didReceivePong:(nullable NSData *)pongData;
+
+/**
+ Sent before reporting a text frame to be able to configure if it shuold be convert to a UTF-8 String or passed as `NSData`.
+ If the method is not implemented - it will always convert text frames to String.
+
+ @param webSocket An instance of `SRWebSocket` that received a text frame.
+
+ @return `YES` if text frame should be converted to UTF-8 String, otherwise - `NO`. Default: `YES`.
+ */
+- (BOOL)webSocketShouldConvertTextFrameToString:(SRWebSocket *)webSocket NS_SWIFT_NAME(webSocketShouldConvertTextFrameToString(_:));
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRWebSocket.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SRWebSocket.m
new file mode 100644 (file)
index 0000000..83bf212
--- /dev/null
@@ -0,0 +1,1655 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import "SRWebSocket.h"
+
+#if __has_include(<unicode/utf8.h>)
+#define HAS_ICU
+#endif
+
+#ifdef HAS_ICU
+#import <unicode/utf8.h>
+#endif
+
+#import <os/lock.h>
+
+#import "SRDelegateController.h"
+#import "SRIOConsumer.h"
+#import "SRIOConsumerPool.h"
+#import "SRHash.h"
+#import "SRURLUtilities.h"
+#import "SRError.h"
+#import "NSURLRequest+SRWebSocket.h"
+#import "NSRunLoop+SRWebSocket.h"
+#import "SRProxyConnect.h"
+#import "SRSecurityPolicy.h"
+#import "SRHTTPConnectMessage.h"
+#import "SRRandom.h"
+#import "SRLog.h"
+#import "SRMutex.h"
+#import "SRSIMDHelpers.h"
+#import "NSURLRequest+SRWebSocketPrivate.h"
+#import "NSRunLoop+SRWebSocketPrivate.h"
+#import "SRConstants.h"
+
+#if !__has_feature(objc_arc)
+#error SocketRocket must be compiled with ARC enabled
+#endif
+
+__attribute__((used)) static void importCategories(void)
+{
+    import_NSURLRequest_SRWebSocket();
+    import_NSRunLoop_SRWebSocket();
+}
+
+typedef struct {
+    BOOL fin;
+    //  BOOL rsv1;
+    //  BOOL rsv2;
+    //  BOOL rsv3;
+    uint8_t opcode;
+    BOOL masked;
+    uint64_t payload_length;
+} frame_header;
+
+static NSString *const SRWebSocketAppendToSecKeyString = @"258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
+
+static inline int32_t validate_dispatch_data_partial_string(NSData *data);
+
+static uint8_t const SRWebSocketProtocolVersion = 13;
+
+NSString *const SRWebSocketErrorDomain = @"SRWebSocketErrorDomain";
+NSString *const SRHTTPResponseErrorKey = @"HTTPResponseStatusCode";
+
+@interface SRWebSocket ()  <NSStreamDelegate>
+
+@property (atomic, assign, readwrite) SRReadyState readyState;
+
+// Specifies whether SSL trust chain should NOT be evaluated.
+// By default this flag is set to NO, meaning only secure SSL connections are allowed.
+// For DEBUG builds this flag is ignored, and SSL connections are allowed regardless
+// of the certificate trust configuration
+@property (nonatomic, assign, readwrite) BOOL allowsUntrustedSSLCertificates;
+
+@property (nonatomic, strong, readonly) SRDelegateController *delegateController;
+
+@end
+
+@implementation SRWebSocket {
+    SRMutex _kvoLock;
+    os_unfair_lock _propertyLock;
+
+    dispatch_queue_t _workQueue;
+    NSMutableArray<SRIOConsumer *> *_consumers;
+
+    NSInputStream *_inputStream;
+    NSOutputStream *_outputStream;
+
+    dispatch_data_t _readBuffer;
+    NSUInteger _readBufferOffset;
+
+    dispatch_data_t _outputBuffer;
+    NSUInteger _outputBufferOffset;
+
+    uint8_t _currentFrameOpcode;
+    size_t _currentFrameCount;
+    size_t _readOpCount;
+    uint32_t _currentStringScanPosition;
+    NSMutableData *_currentFrameData;
+
+    NSString *_closeReason;
+
+    NSString *_secKey;
+
+    SRSecurityPolicy *_securityPolicy;
+    BOOL _requestRequiresSSL;
+    BOOL _streamSecurityValidated;
+
+    uint8_t _currentReadMaskKey[4];
+    size_t _currentReadMaskOffset;
+
+    BOOL _closeWhenFinishedWriting;
+    BOOL _failed;
+
+    NSURLRequest *_urlRequest;
+
+    BOOL _sentClose;
+    BOOL _didFail;
+    BOOL _cleanupScheduled;
+    int _closeCode;
+
+    BOOL _isPumping;
+
+    NSMutableSet<NSArray *> *_scheduledRunloops; // Set<[RunLoop, Mode]>. TODO: (nlutsenko) Fix clowntown
+
+    // We use this to retain ourselves.
+    __strong SRWebSocket *_selfRetain;
+
+    NSArray<NSString *> *_requestedProtocols;
+    SRIOConsumerPool *_consumerPool;
+
+    // proxy support
+    SRProxyConnect *_proxyConnect;
+}
+
+@synthesize readyState = _readyState;
+
+///--------------------------------------
+#pragma mark - Init
+///--------------------------------------
+
+- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray<NSString *> *)protocols securityPolicy:(SRSecurityPolicy *)securityPolicy
+{
+    self = [super init];
+    if (!self) return self;
+
+    assert(request.URL);
+    _url = request.URL;
+    _urlRequest = request;
+    _requestedProtocols = [protocols copy];
+    _securityPolicy = securityPolicy;
+    _requestRequiresSSL = SRURLRequiresSSL(_url);
+
+    _readyState = SR_CONNECTING;
+
+    _propertyLock = OS_UNFAIR_LOCK_INIT;
+    _kvoLock = SRMutexInitRecursive();
+    _workQueue = dispatch_queue_create(NULL, DISPATCH_QUEUE_SERIAL);
+
+    // Going to set a specific on the queue so we can validate we're on the work queue
+    dispatch_queue_set_specific(_workQueue, (__bridge void *)self, (__bridge void *)(_workQueue), NULL);
+
+    _delegateController = [[SRDelegateController alloc] init];
+
+    _readBuffer = dispatch_data_empty;
+    _outputBuffer = dispatch_data_empty;
+
+    _currentFrameData = [[NSMutableData alloc] init];
+
+    _consumers = [[NSMutableArray alloc] init];
+
+    _consumerPool = [[SRIOConsumerPool alloc] init];
+
+    _scheduledRunloops = [[NSMutableSet alloc] init];
+
+    return self;
+}
+
+- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray<NSString *> *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates
+{
+    SRSecurityPolicy *securityPolicy;
+    NSArray *pinnedCertificates = request.SR_SSLPinnedCertificates;
+    if (pinnedCertificates) {
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+        securityPolicy = [SRSecurityPolicy pinnningPolicyWithCertificates:pinnedCertificates];
+#pragma clang diagnostic pop
+    } else {
+        BOOL certificateChainValidationEnabled = !allowsUntrustedSSLCertificates;
+    securityPolicy = [[SRSecurityPolicy alloc] initWithCertificateChainValidationEnabled:certificateChainValidationEnabled];
+    }
+
+    return [self initWithURLRequest:request protocols:protocols securityPolicy:securityPolicy];
+}
+
+- (instancetype)initWithURLRequest:(NSURLRequest *)request securityPolicy:(SRSecurityPolicy *)securityPolicy
+{
+    return [self initWithURLRequest:request protocols:nil securityPolicy:securityPolicy];
+}
+
+- (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray<NSString *> *)protocols
+{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+    return [self initWithURLRequest:request protocols:protocols allowsUntrustedSSLCertificates:NO];
+#pragma clang diagnostic pop
+}
+
+- (instancetype)initWithURLRequest:(NSURLRequest *)request
+{
+    return [self initWithURLRequest:request protocols:nil];
+}
+
+- (instancetype)initWithURL:(NSURL *)url
+{
+    return [self initWithURL:url protocols:nil];
+}
+
+- (instancetype)initWithURL:(NSURL *)url protocols:(NSArray<NSString *> *)protocols
+{
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wdeprecated"
+    return [self initWithURL:url protocols:protocols allowsUntrustedSSLCertificates:NO];
+#pragma clang diagnostic pop
+}
+
+- (instancetype)initWithURL:(NSURL *)url securityPolicy:(SRSecurityPolicy *)securityPolicy
+{
+    NSURLRequest *request = [NSURLRequest requestWithURL:url];
+    return [self initWithURLRequest:request protocols:nil securityPolicy:securityPolicy];
+}
+
+- (instancetype)initWithURL:(NSURL *)url protocols:(NSArray<NSString *> *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates
+{
+    NSURLRequest *request = [NSURLRequest requestWithURL:url];
+    return [self initWithURLRequest:request protocols:protocols allowsUntrustedSSLCertificates:allowsUntrustedSSLCertificates];
+}
+
+- (void)assertOnWorkQueue
+{
+    assert(dispatch_get_specific((__bridge void *)self) == (__bridge void *)_workQueue);
+}
+
+///--------------------------------------
+#pragma mark - Dealloc
+///--------------------------------------
+
+- (void)dealloc
+{
+    _inputStream.delegate = nil;
+    _outputStream.delegate = nil;
+
+    [_inputStream close];
+    [_outputStream close];
+
+    if (_receivedHTTPHeaders) {
+        CFRelease(_receivedHTTPHeaders);
+        _receivedHTTPHeaders = NULL;
+    }
+
+    SRMutexDestroy(_kvoLock);
+}
+
+///--------------------------------------
+#pragma mark - Accessors
+///--------------------------------------
+
+#pragma mark readyState
+
+- (void)setReadyState:(SRReadyState)readyState
+{
+    @try {
+        SRMutexLock(_kvoLock);
+        if (_readyState != readyState) {
+            [self willChangeValueForKey:@"readyState"];
+            os_unfair_lock_lock(&_propertyLock);
+            _readyState = readyState;
+            os_unfair_lock_unlock(&_propertyLock);
+            [self didChangeValueForKey:@"readyState"];
+        }
+    }
+    @finally {
+        SRMutexUnlock(_kvoLock);
+    }
+}
+
+- (SRReadyState)readyState
+{
+    SRReadyState state = 0;
+    os_unfair_lock_lock(&_propertyLock);
+    state = _readyState;
+    os_unfair_lock_unlock(&_propertyLock);
+    return state;
+}
+
++ (BOOL)automaticallyNotifiesObserversOfReadyState {
+    return NO;
+}
+
+///--------------------------------------
+#pragma mark - Open / Close
+///--------------------------------------
+
+- (void)open
+{
+    NSURL* const url = _url;
+    if (!url) {
+        NSError *error = SRErrorWithDomainCodeDescription(NSURLErrorDomain, NSURLErrorBadURL, @"Unable to open socket with emtpy URL.");
+        [self _failWithError:error];
+        return;
+    }
+    NSAssert(self.readyState == SR_CONNECTING, @"Cannot call -(void)open on SRWebSocket more than once.");
+
+    _selfRetain = self;
+
+    if (_urlRequest.timeoutInterval > 0) {
+        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_urlRequest.timeoutInterval * NSEC_PER_SEC));
+        __weak typeof(self) wself = self;
+        dispatch_after(popTime, dispatch_get_main_queue(), ^{
+            __strong SRWebSocket *sself = wself;
+            if (!sself) {
+                return;
+            }
+            if (sself.readyState == SR_CONNECTING) {
+                NSError *error = SRErrorWithDomainCodeDescription(NSURLErrorDomain, NSURLErrorTimedOut, @"Timed out connecting to server.");
+                [sself _failWithError:error];
+            }
+        });
+    }
+
+    _proxyConnect = [[SRProxyConnect alloc] initWithURL:url];
+
+    __weak typeof(self) wself = self;
+    [_proxyConnect openNetworkStreamWithCompletion:^(NSError *error, NSInputStream *readStream, NSOutputStream *writeStream) {
+        [wself _connectionDoneWithError:error readStream:readStream writeStream:writeStream];
+    }];
+}
+
+- (void)_connectionDoneWithError:(NSError *)error readStream:(NSInputStream *)readStream writeStream:(NSOutputStream *)writeStream
+{
+    if (error != nil) {
+        [self _failWithError:error];
+    } else {
+        _outputStream = writeStream;
+        _inputStream = readStream;
+
+        _inputStream.delegate = self;
+        _outputStream.delegate = self;
+        [self _updateSecureStreamOptions];
+
+        if (!_scheduledRunloops.count) {
+            [self scheduleInRunLoop:[NSRunLoop SR_networkRunLoop] forMode:NSDefaultRunLoopMode];
+        }
+
+        // If we don't require SSL validation - consider that we connected.
+        // Otherwise `didConnect` is called when SSL validation finishes.
+        if (!_requestRequiresSSL) {
+            dispatch_async(_workQueue, ^{
+                [self didConnect];
+            });
+        }
+    }
+    // Schedule to run on a work queue, to make sure we don't run this inline and deallocate `self` inside `SRProxyConnect`.
+    // TODO: (nlutsenko) Find a better structure for this, maybe Bolts Tasks?
+    dispatch_async(_workQueue, ^{
+        self->_proxyConnect = nil;
+    });
+}
+
+- (BOOL)_checkHandshake:(CFHTTPMessageRef)httpMessage
+{
+    NSString *acceptHeader = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(httpMessage, CFSTR("Sec-WebSocket-Accept")));
+
+    if (acceptHeader == nil) {
+        return NO;
+    }
+
+    NSString *concattedString = [_secKey stringByAppendingString:SRWebSocketAppendToSecKeyString];
+    NSData *hashedString = SRSHA1HashFromString(concattedString);
+    NSString *expectedAccept = SRBase64EncodedStringFromData(hashedString);
+    return [acceptHeader isEqualToString:expectedAccept];
+}
+
+- (void)_HTTPHeadersDidFinish:(CFHTTPMessageRef)httpMessage
+{
+    NSInteger responseCode = CFHTTPMessageGetResponseStatusCode(httpMessage);
+    if (responseCode >= 400) {
+        SRDebugLog(@"Request failed with response code %d", responseCode);
+        NSError *error = SRHTTPErrorWithCodeDescription(responseCode, 2132,
+                                                        [NSString stringWithFormat:@"Received bad response code from server: %d.",
+                                                         (int)responseCode]);
+        [self _failWithError:error];
+        return;
+    }
+
+    if(![self _checkHandshake:httpMessage]) {
+        NSError *error = SRErrorWithCodeDescription(2133, @"Invalid Sec-WebSocket-Accept response.");
+        [self _failWithError:error];
+        return;
+    }
+
+    NSString *negotiatedProtocol = CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(httpMessage, CFSTR("Sec-WebSocket-Protocol")));
+    if (negotiatedProtocol) {
+        // Make sure we requested the protocol
+        if ([_requestedProtocols indexOfObject:negotiatedProtocol] == NSNotFound) {
+            NSError *error = SRErrorWithCodeDescription(2133, @"Server specified Sec-WebSocket-Protocol that wasn't requested.");
+            [self _failWithError:error];
+            return;
+        }
+
+        _protocol = negotiatedProtocol;
+    }
+
+    self.readyState = SR_OPEN;
+
+    if (!_didFail) {
+        [self _readFrameNew];
+    }
+
+    [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+        if (availableMethods.didOpen) {
+            [delegate webSocketDidOpen:self];
+        }
+    }];
+}
+
+
+- (void)_readHTTPHeader
+{
+    if (_receivedHTTPHeaders == NULL) {
+        _receivedHTTPHeaders = CFHTTPMessageCreateEmpty(NULL, NO);
+    }
+
+    [self _readUntilHeaderCompleteWithCallback:^(SRWebSocket *socket,  NSData *data) {
+        if (!socket) {
+            return;
+        }
+        CFHTTPMessageRef receivedHTTPHeaders = socket->_receivedHTTPHeaders;
+
+        CFHTTPMessageAppendBytes(receivedHTTPHeaders, (const UInt8 *)data.bytes, data.length);
+
+        if (CFHTTPMessageIsHeaderComplete(receivedHTTPHeaders)) {
+            SRDebugLog(@"Finished reading headers %@", CFBridgingRelease(CFHTTPMessageCopyAllHeaderFields(receivedHTTPHeaders)));
+            [socket _HTTPHeadersDidFinish:receivedHTTPHeaders];
+        } else {
+            [socket _readHTTPHeader];
+        }
+    }];
+}
+
+- (void)didConnect
+{
+    SRDebugLog(@"Connected");
+
+    _secKey = SRBase64EncodedStringFromData(SRRandomData(16));
+    assert([_secKey length] == 24);
+
+    CFHTTPMessageRef message = SRHTTPConnectMessageCreate(_urlRequest,
+                                                          _secKey,
+                                                          SRWebSocketProtocolVersion,
+                                                          self.requestCookies,
+                                                          _requestedProtocols);
+
+    NSData *messageData = CFBridgingRelease(CFHTTPMessageCopySerializedMessage(message));
+
+    CFRelease(message);
+
+    [self _writeData:messageData];
+    [self _readHTTPHeader];
+}
+
+- (void)_updateSecureStreamOptions
+{
+    if (_requestRequiresSSL) {
+        SRDebugLog(@"Setting up security for streams.");
+        [_securityPolicy updateSecurityOptionsInStream:_inputStream];
+        [_securityPolicy updateSecurityOptionsInStream:_outputStream];
+    }
+
+    NSString *networkServiceType = SRStreamNetworkServiceTypeFromURLRequest(_urlRequest);
+    if (networkServiceType != nil) {
+        [_inputStream setProperty:networkServiceType forKey:NSStreamNetworkServiceType];
+        [_outputStream setProperty:networkServiceType forKey:NSStreamNetworkServiceType];
+    }
+}
+
+- (void)scheduleInRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode
+{
+    [_outputStream scheduleInRunLoop:aRunLoop forMode:mode];
+    [_inputStream scheduleInRunLoop:aRunLoop forMode:mode];
+
+    [_scheduledRunloops addObject:@[aRunLoop, mode]];
+}
+
+- (void)unscheduleFromRunLoop:(NSRunLoop *)aRunLoop forMode:(NSString *)mode
+{
+    [_outputStream removeFromRunLoop:aRunLoop forMode:mode];
+    [_inputStream removeFromRunLoop:aRunLoop forMode:mode];
+
+    [_scheduledRunloops removeObject:@[aRunLoop, mode]];
+}
+
+- (void)close
+{
+    [self closeWithCode:SRStatusCodeNormal reason:nil];
+}
+
+- (void)closeWithCode:(NSInteger)code reason:(NSString *)reason
+{
+    assert(code);
+    __weak typeof(self) wself = self;
+    dispatch_async(_workQueue, ^{
+        __strong SRWebSocket *sself = wself;
+        if (!sself) {
+          return;
+        }
+        if (sself.readyState == SR_CLOSING || sself.readyState == SR_CLOSED) {
+            return;
+        }
+
+        BOOL wasConnecting = sself.readyState == SR_CONNECTING;
+
+        sself.readyState = SR_CLOSING;
+
+        SRDebugLog(@"Closing with code %d reason %@", code, reason);
+
+        if (wasConnecting) {
+            [sself closeConnection];
+            return;
+        }
+
+        size_t maxMsgSize = [reason maximumLengthOfBytesUsingEncoding:NSUTF8StringEncoding];
+        NSMutableData *mutablePayload = [[NSMutableData alloc] initWithLength:sizeof(uint16_t) + maxMsgSize];
+        NSData *payload = mutablePayload;
+
+        ((uint16_t *)mutablePayload.mutableBytes)[0] = CFSwapInt16BigToHost((uint16_t)code);
+
+        if (reason) {
+            NSRange remainingRange = {0};
+
+            NSUInteger usedLength = 0;
+
+            BOOL success = [reason getBytes:(char *)mutablePayload.mutableBytes + sizeof(uint16_t) maxLength:payload.length - sizeof(uint16_t) usedLength:&usedLength encoding:NSUTF8StringEncoding options:NSStringEncodingConversionExternalRepresentation range:NSMakeRange(0, reason.length) remainingRange:&remainingRange];
+#pragma unused (success)
+
+            assert(success);
+            assert(remainingRange.length == 0);
+
+            if (usedLength != maxMsgSize) {
+                payload = [payload subdataWithRange:NSMakeRange(0, usedLength + sizeof(uint16_t))];
+            }
+        }
+
+
+        [sself _sendFrameWithOpcode:SROpCodeConnectionClose data:payload];
+    });
+}
+
+- (void)_closeWithProtocolError:(NSString *)message
+{
+    // Need to shunt this on the _callbackQueue first to see if they received any messages
+    [self.delegateController performDelegateQueueBlock:^{
+        [self closeWithCode:SRStatusCodeProtocolError reason:message];
+        dispatch_async(self->_workQueue, ^{
+            [self closeConnection];
+        });
+    }];
+}
+
+- (void)_failWithError:(NSError *)error
+{
+    dispatch_async(_workQueue, ^{
+        if (self.readyState != SR_CLOSED) {
+            self->_failed = YES;
+            [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+                if (availableMethods.didFailWithError) {
+                    [delegate webSocket:self didFailWithError:error];
+                }
+            }];
+
+            self.readyState = SR_CLOSED;
+
+            SRDebugLog(@"Failing with error %@", error.localizedDescription);
+
+            [self closeConnection];
+            [self _scheduleCleanup];
+        }
+    });
+}
+
+- (void)_writeData:(NSData *)data
+{
+    [self assertOnWorkQueue];
+
+    if (_closeWhenFinishedWriting) {
+        return;
+    }
+
+    __block NSData *strongData = data;
+    dispatch_data_t newData = dispatch_data_create(data.bytes, data.length, nil, ^{
+        strongData = nil;
+    });
+    (void)strongData;
+    _outputBuffer = dispatch_data_create_concat(_outputBuffer, newData);
+    [self _pumpWriting];
+}
+
+- (void)send:(nullable id)message
+{
+    if (!message) {
+        [self sendData:nil error:nil]; // Send Data, but it doesn't matter since we are going to send the same text frame with 0 length.
+    } else if ([message isKindOfClass:[NSString class]]) {
+        [self sendString:(NSString *_Nonnull)message error:nil];
+    } else if ([message isKindOfClass:[NSData class]]) {
+        [self sendData:message error:nil];
+    } else {
+        NSAssert(NO, @"Unrecognized message. Not able to send anything other than a String or NSData.");
+    }
+}
+
+- (BOOL)sendString:(NSString *)string error:(NSError **)error
+{
+    if (self.readyState != SR_OPEN) {
+        NSString *message = @"Invalid State: Cannot call `sendString:error:` until connection is open.";
+        if (error) {
+            *error = SRErrorWithCodeDescription(2134, message);
+        }
+        SRDebugLog(message);
+        return NO;
+    }
+
+    string = [string copy];
+    dispatch_async(_workQueue, ^{
+        [self _sendFrameWithOpcode:SROpCodeTextFrame data:[string dataUsingEncoding:NSUTF8StringEncoding]];
+    });
+    return YES;
+}
+
+- (BOOL)sendData:(nullable NSData *)data error:(NSError **)error
+{
+    data = [data copy];
+    return [self sendDataNoCopy:data error:error];
+}
+
+- (BOOL)sendDataNoCopy:(nullable NSData *)data error:(NSError **)error
+{
+    if (self.readyState != SR_OPEN) {
+        NSString *message = @"Invalid State: Cannot call `sendDataNoCopy:error:` until connection is open.";
+        if (error) {
+            *error = SRErrorWithCodeDescription(2134, message);
+        }
+        SRDebugLog(message);
+        return NO;
+    }
+
+    dispatch_async(_workQueue, ^{
+        if (data) {
+            [self _sendFrameWithOpcode:SROpCodeBinaryFrame data:data];
+        } else {
+            [self _sendFrameWithOpcode:SROpCodeTextFrame data:nil];
+        }
+    });
+    return YES;
+}
+
+- (BOOL)sendPing:(nullable NSData *)data error:(NSError **)error
+{
+    if (self.readyState != SR_OPEN) {
+        NSString *message = @"Invalid State: Cannot call `sendPing:error:` until connection is open.";
+        if (error) {
+            *error = SRErrorWithCodeDescription(2134, message);
+        }
+        SRDebugLog(message);
+        return NO;
+    }
+
+    data = [data copy] ?: [NSData data]; // It's okay for a ping to be empty
+    dispatch_async(_workQueue, ^{
+        [self _sendFrameWithOpcode:SROpCodePing data:data];
+    });
+    return YES;
+}
+
+- (void)_handlePingWithData:(nullable NSData *)data
+{
+    // Need to pingpong this off _callbackQueue first to make sure messages happen in order
+    [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate> _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+        if (availableMethods.didReceivePing) {
+            [delegate webSocket:self didReceivePingWithData:data];
+        }
+        dispatch_async(self->_workQueue, ^{
+            [self _sendFrameWithOpcode:SROpCodePong data:data];
+        });
+    }];
+}
+
+- (void)handlePong:(NSData *)pongData
+{
+    SRDebugLog(@"Received pong");
+    [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+        if (availableMethods.didReceivePong) {
+            [delegate webSocket:self didReceivePong:pongData];
+        }
+    }];
+}
+
+
+static inline BOOL closeCodeIsValid(int closeCode) {
+    if (closeCode < 1000) {
+        return NO;
+    }
+
+    if (closeCode >= 1000 && closeCode <= 1011) {
+        if (closeCode == 1004 ||
+            closeCode == 1005 ||
+            closeCode == 1006) {
+            return NO;
+        }
+        return YES;
+    }
+
+    if (closeCode >= 3000 && closeCode <= 3999) {
+        return YES;
+    }
+
+    if (closeCode >= 4000 && closeCode <= 4999) {
+        return YES;
+    }
+
+    return NO;
+}
+
+//  Note from RFC:
+//
+//  If there is a body, the first two
+//  bytes of the body MUST be a 2-byte unsigned integer (in network byte
+//  order) representing a status code with value /code/ defined in
+//  Section 7.4.  Following the 2-byte integer the body MAY contain UTF-8
+//  encoded data with value /reason/, the interpretation of which is not
+//  defined by this specification.
+
+- (void)handleCloseWithData:(NSData *)data
+{
+    size_t dataSize = data.length;
+    __block uint16_t closeCode = 0;
+
+    SRDebugLog(@"Received close frame");
+
+    if (dataSize == 1) {
+        // TODO handle error
+        [self _closeWithProtocolError:@"Payload for close must be larger than 2 bytes"];
+        return;
+    } else if (dataSize >= 2) {
+        [data getBytes:&closeCode length:sizeof(closeCode)];
+        _closeCode = CFSwapInt16BigToHost(closeCode);
+        if (!closeCodeIsValid(_closeCode)) {
+            [self _closeWithProtocolError:[NSString stringWithFormat:@"Cannot have close code of %d", _closeCode]];
+            return;
+        }
+        if (dataSize > 2) {
+            _closeReason = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(2, dataSize - 2)] encoding:NSUTF8StringEncoding];
+            if (!_closeReason) {
+                [self _closeWithProtocolError:@"Close reason MUST be valid UTF-8"];
+                return;
+            }
+        }
+    } else {
+        _closeCode = SRStatusNoStatusReceived;
+    }
+
+    [self assertOnWorkQueue];
+
+    if (self.readyState == SR_OPEN) {
+        [self closeWithCode:1000 reason:nil];
+    }
+    dispatch_async(_workQueue, ^{
+        [self closeConnection];
+    });
+}
+
+- (void)closeConnection
+{
+    [self assertOnWorkQueue];
+    SRDebugLog(@"Trying to disconnect");
+    _closeWhenFinishedWriting = YES;
+    [self _pumpWriting];
+}
+
+- (void)_handleFrameWithData:(NSData *)frameData opCode:(SROpCode)opcode
+{
+    // Check that the current data is valid UTF8
+
+    BOOL isControlFrame = (opcode == SROpCodePing || opcode == SROpCodePong || opcode == SROpCodeConnectionClose);
+    if (isControlFrame) {
+        //frameData will be copied before passing to handlers
+        //otherwise there can be misbehaviours when value at the pointer is changed
+        frameData = [frameData copy];
+
+        dispatch_async(_workQueue, ^{
+            [self _readFrameContinue];
+        });
+    } else {
+        [self _readFrameNew];
+    }
+
+    switch (opcode) {
+        case SROpCodeTextFrame: {
+            NSString *string = [[NSString alloc] initWithData:frameData encoding:NSUTF8StringEncoding];
+            if (!string && frameData) {
+                [self closeWithCode:SRStatusCodeInvalidUTF8 reason:@"Text frames must be valid UTF-8."];
+                dispatch_async(_workQueue, ^{
+                    [self closeConnection];
+                });
+                return;
+            }
+            SRDebugLog(@"Received text message.");
+            [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+                // Don't convert into string - iff `delegate` tells us not to. Otherwise - create UTF8 string and handle that.
+                if (availableMethods.shouldConvertTextFrameToString && ![delegate webSocketShouldConvertTextFrameToString:self]) {
+                    if (availableMethods.didReceiveMessage) {
+                        [delegate webSocket:self didReceiveMessage:frameData];
+                    }
+                    if (availableMethods.didReceiveMessageWithData) {
+                        [delegate webSocket:self didReceiveMessageWithData:frameData];
+                    }
+                } else {
+                    if (availableMethods.didReceiveMessage) {
+                        [delegate webSocket:self didReceiveMessage:string];
+                    }
+                    if (availableMethods.didReceiveMessageWithString) {
+                        [delegate webSocket:self didReceiveMessageWithString:string];
+                    }
+                }
+            }];
+            break;
+        }
+        case SROpCodeBinaryFrame: {
+            SRDebugLog(@"Received data message.");
+            [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+                if (availableMethods.didReceiveMessage) {
+                    [delegate webSocket:self didReceiveMessage:frameData];
+                }
+                if (availableMethods.didReceiveMessageWithData) {
+                    [delegate webSocket:self didReceiveMessageWithData:frameData];
+                }
+            }];
+        }
+            break;
+        case SROpCodeConnectionClose:
+            [self handleCloseWithData:frameData];
+            break;
+        case SROpCodePing:
+            [self _handlePingWithData:frameData];
+            break;
+        case SROpCodePong:
+            [self handlePong:frameData];
+            break;
+        default:
+            [self _closeWithProtocolError:[NSString stringWithFormat:@"Unknown opcode %ld", (long)opcode]];
+            // TODO: Handle invalid opcode
+            break;
+    }
+}
+
+- (void)_handleFrameHeader:(frame_header)frame_header curData:(NSData *)curData
+{
+    assert(frame_header.opcode != 0);
+
+    if (self.readyState == SR_CLOSED) {
+        return;
+    }
+
+
+    BOOL isControlFrame = (frame_header.opcode == SROpCodePing || frame_header.opcode == SROpCodePong || frame_header.opcode == SROpCodeConnectionClose);
+
+    if (isControlFrame && !frame_header.fin) {
+        [self _closeWithProtocolError:@"Fragmented control frames not allowed"];
+        return;
+    }
+
+    if (isControlFrame && frame_header.payload_length >= 126) {
+        [self _closeWithProtocolError:@"Control frames cannot have payloads larger than 126 bytes"];
+        return;
+    }
+
+    if (!isControlFrame) {
+        _currentFrameOpcode = frame_header.opcode;
+        _currentFrameCount += 1;
+    }
+
+    if (frame_header.payload_length == 0) {
+        if (isControlFrame) {
+            [self _handleFrameWithData:curData opCode:frame_header.opcode];
+        } else {
+            if (frame_header.fin) {
+                [self _handleFrameWithData:_currentFrameData opCode:frame_header.opcode];
+            } else {
+                // TODO add assert that opcode is not a control;
+                [self _readFrameContinue];
+            }
+        }
+    } else {
+        assert(frame_header.payload_length <= SIZE_T_MAX);
+        [self _addConsumerWithDataLength:(size_t)frame_header.payload_length callback:^(SRWebSocket *sself, NSData *newData) {
+            if (isControlFrame) {
+                [sself _handleFrameWithData:newData opCode:frame_header.opcode];
+            } else {
+                if (frame_header.fin) {
+                    [sself _handleFrameWithData:sself->_currentFrameData opCode:frame_header.opcode];
+                } else {
+                    // TODO add assert that opcode is not a control;
+                    [sself _readFrameContinue];
+                }
+            }
+        } readToCurrentFrame:!isControlFrame unmaskBytes:frame_header.masked];
+    }
+}
+
+/* From RFC:
+
+ 0                   1                   2                   3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+ +-+-+-+-+-------+-+-------------+-------------------------------+
+ |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
+ |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
+ |N|V|V|V|       |S|             |   (if payload len==126/127)   |
+ | |1|2|3|       |K|             |                               |
+ +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
+ |     Extended payload length continued, if payload len == 127  |
+ + - - - - - - - - - - - - - - - +-------------------------------+
+ |                               |Masking-key, if MASK set to 1  |
+ +-------------------------------+-------------------------------+
+ | Masking-key (continued)       |          Payload Data         |
+ +-------------------------------- - - - - - - - - - - - - - - - +
+ :                     Payload Data continued ...                :
+ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
+ |                     Payload Data continued ...                |
+ +---------------------------------------------------------------+
+ */
+
+static const uint8_t SRFinMask          = 0x80;
+static const uint8_t SROpCodeMask       = 0x0F;
+static const uint8_t SRRsvMask          = 0x70;
+static const uint8_t SRMaskMask         = 0x80;
+static const uint8_t SRPayloadLenMask   = 0x7F;
+
+
+- (void)_readFrameContinue
+{
+    assert((_currentFrameCount == 0 && _currentFrameOpcode == 0) || (_currentFrameCount > 0 && _currentFrameOpcode > 0));
+
+    [self _addConsumerWithDataLength:2 callback:^(SRWebSocket *sself, NSData *data) {
+        __block frame_header header = {0};
+
+        const uint8_t *headerBuffer = data.bytes;
+        assert(data.length >= 2);
+
+        if (headerBuffer[0] & SRRsvMask) {
+            [sself _closeWithProtocolError:@"Server used RSV bits"];
+            return;
+        }
+
+        uint8_t receivedOpcode = (SROpCodeMask & headerBuffer[0]);
+
+        BOOL isControlFrame = (receivedOpcode == SROpCodePing || receivedOpcode == SROpCodePong || receivedOpcode == SROpCodeConnectionClose);
+
+        if (!isControlFrame && receivedOpcode != 0 && sself->_currentFrameCount > 0) {
+            [sself _closeWithProtocolError:@"all data frames after the initial data frame must have opcode 0"];
+            return;
+        }
+
+        if (receivedOpcode == 0 && sself->_currentFrameCount == 0) {
+            [sself _closeWithProtocolError:@"cannot continue a message"];
+            return;
+        }
+
+        header.opcode = receivedOpcode == 0 ? sself->_currentFrameOpcode : receivedOpcode;
+
+        header.fin = !!(SRFinMask & headerBuffer[0]);
+
+
+        header.masked = !!(SRMaskMask & headerBuffer[1]);
+        header.payload_length = SRPayloadLenMask & headerBuffer[1];
+
+        headerBuffer = NULL;
+
+        if (header.masked) {
+            [sself _closeWithProtocolError:@"Client must receive unmasked data"];
+            return;
+        }
+
+        size_t extra_bytes_needed = header.masked ? sizeof(sself->_currentReadMaskKey) : 0;
+
+        if (header.payload_length == 126) {
+            extra_bytes_needed += sizeof(uint16_t);
+        } else if (header.payload_length == 127) {
+            extra_bytes_needed += sizeof(uint64_t);
+        }
+
+        if (extra_bytes_needed == 0) {
+            [sself _handleFrameHeader:header curData:sself->_currentFrameData];
+        } else {
+            [sself _addConsumerWithDataLength:extra_bytes_needed callback:^(SRWebSocket *eself, NSData *edata) {
+                size_t mapped_size = edata.length;
+#pragma unused (mapped_size)
+                const void *mapped_buffer = edata.bytes;
+                size_t offset = 0;
+
+                if (header.payload_length == 126) {
+                    assert(mapped_size >= sizeof(uint16_t));
+                    uint16_t payloadLength = 0;
+                    memcpy(&payloadLength, mapped_buffer, sizeof(uint16_t));
+                    payloadLength = CFSwapInt16BigToHost(payloadLength);
+
+                    header.payload_length = payloadLength;
+                    offset += sizeof(uint16_t);
+                } else if (header.payload_length == 127) {
+                    assert(mapped_size >= sizeof(uint64_t));
+                    uint64_t payloadLength = 0;
+                    memcpy(&payloadLength, mapped_buffer, sizeof(uint64_t));
+                    payloadLength = CFSwapInt64BigToHost(payloadLength);
+
+                    header.payload_length = payloadLength;
+                    offset += sizeof(uint64_t);
+                } else {
+                    assert(header.payload_length < 126 && header.payload_length >= 0);
+                }
+
+                if (header.masked) {
+                    assert(mapped_size >= sizeof(eself->_currentReadMaskOffset) + offset);
+                    memcpy(eself->_currentReadMaskKey, ((uint8_t *)mapped_buffer) + offset, sizeof(eself->_currentReadMaskKey));
+                }
+
+                [eself _handleFrameHeader:header curData:eself->_currentFrameData];
+            } readToCurrentFrame:NO unmaskBytes:NO];
+        }
+    } readToCurrentFrame:NO unmaskBytes:NO];
+}
+
+- (void)_readFrameNew
+{
+    dispatch_async(_workQueue, ^{
+        // Don't reset the length, since Apple doesn't guarantee that this will free the memory (and in tests on
+        // some platforms, it doesn't seem to, effectively causing a leak the size of the biggest frame so far).
+        self->_currentFrameData = [[NSMutableData alloc] init];
+
+        self->_currentFrameOpcode = 0;
+        self->_currentFrameCount = 0;
+        self->_readOpCount = 0;
+        self->_currentStringScanPosition = 0;
+
+        [self _readFrameContinue];
+    });
+}
+
+- (void)_pumpWriting
+{
+    [self assertOnWorkQueue];
+
+    NSUInteger dataLength = dispatch_data_get_size(_outputBuffer);
+    if (dataLength - _outputBufferOffset > 0 && _outputStream.hasSpaceAvailable) {
+        __block NSInteger bytesWritten = 0;
+        __block BOOL streamFailed = NO;
+
+        dispatch_data_t dataToSend = dispatch_data_create_subrange(_outputBuffer, _outputBufferOffset, dataLength - _outputBufferOffset);
+        dispatch_data_apply(dataToSend, ^bool(dispatch_data_t region, size_t offset, const void *buffer, size_t size) {
+            NSInteger sentLength = [_outputStream write:buffer maxLength:size];
+            if (sentLength == -1) {
+                streamFailed = YES;
+                return false;
+            }
+            bytesWritten += sentLength;
+            return (sentLength >= (NSInteger)size); // If we can't write all the data into the stream - bail-out early.
+        });
+        if (streamFailed) {
+            NSInteger code = 2145;
+            NSString *description = @"Error writing to stream.";
+            NSError *streamError = _outputStream.streamError;
+            NSError *error = streamError ? SRErrorWithCodeDescriptionUnderlyingError(code, description, streamError) : SRErrorWithCodeDescription(code, description);
+            [self _failWithError:error];
+            return;
+        }
+
+        _outputBufferOffset += bytesWritten;
+
+        if (_outputBufferOffset > SRDefaultBufferSize() && _outputBufferOffset > dataLength / 2) {
+            _outputBuffer = dispatch_data_create_subrange(_outputBuffer, _outputBufferOffset, dataLength - _outputBufferOffset);
+            _outputBufferOffset = 0;
+        }
+    }
+
+    if (_closeWhenFinishedWriting &&
+        (dispatch_data_get_size(_outputBuffer) - _outputBufferOffset) == 0 &&
+        (_inputStream.streamStatus != NSStreamStatusNotOpen &&
+         _inputStream.streamStatus != NSStreamStatusClosed) &&
+        !_sentClose) {
+        _sentClose = YES;
+
+        @synchronized(self) {
+            [_outputStream close];
+            [_inputStream close];
+
+
+            for (NSArray *runLoop in [_scheduledRunloops copy]) {
+                [self unscheduleFromRunLoop:[runLoop objectAtIndex:0] forMode:[runLoop objectAtIndex:1]];
+            }
+        }
+
+        if (!_failed) {
+            [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+                if (availableMethods.didCloseWithCode) {
+                    [delegate webSocket:self didCloseWithCode:self->_closeCode reason:self->_closeReason wasClean:YES];
+                }
+            }];
+        }
+
+        [self _scheduleCleanup];
+    }
+}
+
+- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback
+{
+    [self assertOnWorkQueue];
+    [self _addConsumerWithScanner:consumer callback:callback dataLength:0];
+}
+
+- (void)_addConsumerWithDataLength:(size_t)dataLength callback:(data_callback)callback readToCurrentFrame:(BOOL)readToCurrentFrame unmaskBytes:(BOOL)unmaskBytes
+{
+    [self assertOnWorkQueue];
+    assert(dataLength);
+
+    [_consumers addObject:[_consumerPool consumerWithScanner:nil handler:callback bytesNeeded:dataLength readToCurrentFrame:readToCurrentFrame unmaskBytes:unmaskBytes]];
+    [self _pumpScanner];
+}
+
+- (void)_addConsumerWithScanner:(stream_scanner)consumer callback:(data_callback)callback dataLength:(size_t)dataLength
+{
+    [self assertOnWorkQueue];
+    [_consumers addObject:[_consumerPool consumerWithScanner:consumer handler:callback bytesNeeded:dataLength readToCurrentFrame:NO unmaskBytes:NO]];
+    [self _pumpScanner];
+}
+
+
+- (void)_scheduleCleanup
+{
+    @synchronized(self) {
+        if (_cleanupScheduled) {
+            return;
+        }
+
+        _cleanupScheduled = YES;
+
+        // Cleanup NSStream delegate's in the same RunLoop used by the streams themselves:
+        // This way we'll prevent race conditions between handleEvent and SRWebsocket's dealloc
+        NSTimer *timer = [NSTimer timerWithTimeInterval:(0.0f) target:self selector:@selector(_cleanupSelfReference:) userInfo:nil repeats:NO];
+        [[NSRunLoop SR_networkRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
+    }
+}
+
+- (void)_cleanupSelfReference:(NSTimer *)timer
+{
+    @synchronized(self) {
+        // Nuke NSStream delegate's
+        _inputStream.delegate = nil;
+        _outputStream.delegate = nil;
+
+        // Remove the streams, right now, from the networkRunLoop
+        [_inputStream close];
+        [_outputStream close];
+    }
+
+    // Cleanup selfRetain in the same GCD queue as usual
+    dispatch_async(_workQueue, ^{
+        self->_selfRetain = nil;
+    });
+}
+
+
+static const char CRLFCRLFBytes[] = {'\r', '\n', '\r', '\n'};
+
+- (void)_readUntilHeaderCompleteWithCallback:(data_callback)dataHandler
+{
+    [self _readUntilBytes:CRLFCRLFBytes length:sizeof(CRLFCRLFBytes) callback:dataHandler];
+}
+
+- (void)_readUntilBytes:(const void *)bytes length:(size_t)length callback:(data_callback)dataHandler
+{
+    // TODO optimize so this can continue from where we last searched
+    stream_scanner consumer = ^size_t(NSData *data) {
+        __block size_t found_size = 0;
+        __block size_t match_count = 0;
+
+        size_t size = data.length;
+        const unsigned char *buffer = data.bytes;
+        for (size_t i = 0; i < size; i++ ) {
+            if (((const unsigned char *)buffer)[i] == ((const unsigned char *)bytes)[match_count]) {
+                match_count += 1;
+                if (match_count == length) {
+                    found_size = i + 1;
+                    break;
+                }
+            } else {
+                match_count = 0;
+            }
+        }
+        return found_size;
+    };
+    [self _addConsumerWithScanner:consumer callback:dataHandler];
+}
+
+
+// Returns true if did work
+- (BOOL)_innerPumpScanner {
+
+    BOOL didWork = NO;
+
+    if (self.readyState >= SR_CLOSED) {
+        return didWork;
+    }
+
+    size_t readBufferSize = dispatch_data_get_size(_readBuffer);
+
+    if (!_consumers.count) {
+        return didWork;
+    }
+
+    size_t curSize = readBufferSize - _readBufferOffset;
+    if (!curSize) {
+        return didWork;
+    }
+
+    SRIOConsumer *consumer = [_consumers objectAtIndex:0];
+
+    size_t bytesNeeded = consumer.bytesNeeded;
+
+    size_t foundSize = 0;
+    if (consumer.consumer) {
+        NSData *subdata = (NSData *)dispatch_data_create_subrange(_readBuffer, _readBufferOffset, readBufferSize - _readBufferOffset);
+        foundSize = consumer.consumer(subdata);
+    } else {
+        assert(consumer.bytesNeeded);
+        if (curSize >= bytesNeeded) {
+            foundSize = bytesNeeded;
+        } else if (consumer.readToCurrentFrame) {
+            foundSize = curSize;
+        }
+    }
+
+    if (consumer.readToCurrentFrame || foundSize) {
+        dispatch_data_t slice = dispatch_data_create_subrange(_readBuffer, _readBufferOffset, foundSize);
+
+        _readBufferOffset += foundSize;
+
+        if (_readBufferOffset > SRDefaultBufferSize() && _readBufferOffset > readBufferSize / 2) {
+            _readBuffer = dispatch_data_create_subrange(_readBuffer, _readBufferOffset, readBufferSize - _readBufferOffset);
+            _readBufferOffset = 0;
+        }
+
+        if (consumer.unmaskBytes) {
+            __block NSMutableData *mutableSlice = [slice mutableCopy];
+
+            NSUInteger len = mutableSlice.length;
+            uint8_t *bytes = mutableSlice.mutableBytes;
+
+            for (NSUInteger i = 0; i < len; i++) {
+                bytes[i] = bytes[i] ^ _currentReadMaskKey[_currentReadMaskOffset % sizeof(_currentReadMaskKey)];
+                _currentReadMaskOffset += 1;
+            }
+
+            slice = dispatch_data_create(bytes, len, nil, ^{
+                mutableSlice = nil;
+            });
+        }
+
+        if (consumer.readToCurrentFrame) {
+            dispatch_data_apply(slice, ^bool(dispatch_data_t region, size_t offset, const void *buffer, size_t size) {
+                [_currentFrameData appendBytes:buffer length:size];
+                return true;
+            });
+
+            _readOpCount += 1;
+
+            if (_currentFrameOpcode == SROpCodeTextFrame) {
+                // Validate UTF8 stuff.
+                size_t currentDataSize = _currentFrameData.length;
+                if (_currentFrameOpcode == SROpCodeTextFrame && currentDataSize > 0) {
+                    // TODO: Optimize the crap out of this.  Don't really have to copy all the data each time
+
+                    size_t scanSize = currentDataSize - _currentStringScanPosition;
+
+                    NSData *scan_data = [_currentFrameData subdataWithRange:NSMakeRange(_currentStringScanPosition, scanSize)];
+                    int32_t valid_utf8_size = validate_dispatch_data_partial_string(scan_data);
+
+                    if (valid_utf8_size == -1) {
+                        [self closeWithCode:SRStatusCodeInvalidUTF8 reason:@"Text frames must be valid UTF-8"];
+                        dispatch_async(_workQueue, ^{
+                            [self closeConnection];
+                        });
+                        return didWork;
+                    } else {
+                        _currentStringScanPosition += valid_utf8_size;
+                    }
+                }
+
+            }
+
+            consumer.bytesNeeded -= foundSize;
+
+            if (consumer.bytesNeeded == 0) {
+                [_consumers removeObjectAtIndex:0];
+                consumer.handler(self, nil);
+                [_consumerPool returnConsumer:consumer];
+                didWork = YES;
+            }
+        } else if (foundSize) {
+            [_consumers removeObjectAtIndex:0];
+            consumer.handler(self, (NSData *)slice);
+            [_consumerPool returnConsumer:consumer];
+            didWork = YES;
+        }
+    }
+    return didWork;
+}
+
+-(void)_pumpScanner
+{
+    [self assertOnWorkQueue];
+
+    if (!_isPumping) {
+        _isPumping = YES;
+    } else {
+        return;
+    }
+
+    while ([self _innerPumpScanner]) {
+
+    }
+
+    _isPumping = NO;
+}
+
+//#define NOMASK
+
+static const size_t SRFrameHeaderOverhead = 32;
+
+- (void)_sendFrameWithOpcode:(SROpCode)opCode data:(NSData *)data
+{
+    [self assertOnWorkQueue];
+
+    if (!data) {
+        return;
+    }
+
+    size_t payloadLength = data.length;
+
+    NSMutableData *frameData = [[NSMutableData alloc] initWithLength:payloadLength + SRFrameHeaderOverhead];
+    if (!frameData) {
+        [self closeWithCode:SRStatusCodeMessageTooBig reason:@"Message too big"];
+        return;
+    }
+    uint8_t *frameBuffer = (uint8_t *)frameData.mutableBytes;
+
+    // set fin
+    frameBuffer[0] = SRFinMask | opCode;
+
+    // set the mask and header
+    frameBuffer[1] |= SRMaskMask;
+
+    size_t frameBufferSize = 2;
+
+    if (payloadLength < 126) {
+        frameBuffer[1] |= payloadLength;
+    } else {
+        uint64_t declaredPayloadLength = 0;
+        size_t declaredPayloadLengthSize = 0;
+
+        if (payloadLength <= UINT16_MAX) {
+            frameBuffer[1] |= 126;
+
+            declaredPayloadLength = CFSwapInt16BigToHost((uint16_t)payloadLength);
+            declaredPayloadLengthSize = sizeof(uint16_t);
+        } else {
+            frameBuffer[1] |= 127;
+
+            declaredPayloadLength = CFSwapInt64BigToHost((uint64_t)payloadLength);
+            declaredPayloadLengthSize = sizeof(uint64_t);
+        }
+
+        memcpy((frameBuffer + frameBufferSize), &declaredPayloadLength, declaredPayloadLengthSize);
+        frameBufferSize += declaredPayloadLengthSize;
+    }
+
+    const uint8_t *unmaskedPayloadBuffer = (uint8_t *)data.bytes;
+    uint8_t *maskKey = frameBuffer + frameBufferSize;
+
+    size_t randomBytesSize = sizeof(uint32_t);
+    NSData *randomData = SRRandomData(randomBytesSize);
+    [randomData getBytes:maskKey range:NSMakeRange(0, randomBytesSize)];
+    frameBufferSize += randomBytesSize;
+
+    // Copy and unmask the buffer
+    uint8_t *frameBufferPayloadPointer = frameBuffer + frameBufferSize;
+
+    memcpy(frameBufferPayloadPointer, unmaskedPayloadBuffer, payloadLength);
+    SRMaskBytesSIMD(frameBufferPayloadPointer, payloadLength, maskKey);
+    frameBufferSize += payloadLength;
+
+    assert(frameBufferSize <= frameData.length);
+    frameData.length = frameBufferSize;
+
+    [self _writeData:frameData];
+}
+
+- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode
+{
+    __weak typeof(self) wself = self;
+
+    if (_requestRequiresSSL && !_streamSecurityValidated &&
+        (eventCode == NSStreamEventHasBytesAvailable || eventCode == NSStreamEventHasSpaceAvailable)) {
+        SecTrustRef trust = (__bridge SecTrustRef)[aStream propertyForKey:(__bridge id)kCFStreamPropertySSLPeerTrust];
+        if (trust) {
+            NSString *const host = _urlRequest.URL.host;
+            if (!host || host.length == 0) {
+                dispatch_async(_workQueue, ^{
+                    NSError *error = SRErrorWithDomainCodeDescription(NSURLErrorDomain,
+                                                                      NSURLErrorBadURL,
+                                                                      @"Unable to validate certificate for empty host.");
+                    [wself _failWithError:error];
+                });
+                return;
+            }
+            _streamSecurityValidated = [_securityPolicy evaluateServerTrust:trust forDomain:host];
+        }
+        if (!_streamSecurityValidated) {
+            dispatch_async(_workQueue, ^{
+                NSError *error = SRErrorWithDomainCodeDescription(NSURLErrorDomain,
+                                                                  NSURLErrorClientCertificateRejected,
+                                                                  @"Invalid server certificate.");
+                [wself _failWithError:error];
+            });
+            return;
+        }
+        dispatch_async(_workQueue, ^{
+            [self didConnect];
+        });
+    }
+    dispatch_async(_workQueue, ^{
+        [wself safeHandleEvent:eventCode stream:aStream];
+    });
+}
+
+- (void)safeHandleEvent:(NSStreamEvent)eventCode stream:(NSStream *)aStream
+{
+    switch (eventCode) {
+        case NSStreamEventOpenCompleted: {
+            SRDebugLog(@"NSStreamEventOpenCompleted %@", aStream);
+            if (self.readyState >= SR_CLOSING) {
+                return;
+            }
+            assert(_readBuffer);
+
+            if (!_requestRequiresSSL && self.readyState == SR_CONNECTING && aStream == _inputStream) {
+                [self didConnect];
+            }
+
+            [self _pumpWriting];
+            [self _pumpScanner];
+
+            break;
+        }
+
+        case NSStreamEventErrorOccurred: {
+            SRDebugLog(@"NSStreamEventErrorOccurred %@ %@", aStream, [[aStream streamError] copy]);
+            /// TODO specify error better!
+            [self _failWithError:aStream.streamError];
+            _readBufferOffset = 0;
+            _readBuffer = dispatch_data_empty;
+            break;
+
+        }
+
+        case NSStreamEventEndEncountered: {
+            [self _pumpScanner];
+            SRDebugLog(@"NSStreamEventEndEncountered %@", aStream);
+            if (aStream.streamError) {
+                [self _failWithError:aStream.streamError];
+            } else {
+                dispatch_async(_workQueue, ^{
+                    if (self.readyState != SR_CLOSED) {
+                        self.readyState = SR_CLOSED;
+                        [self _scheduleCleanup];
+                    }
+
+                    if (!self->_sentClose && !self->_failed) {
+                        self->_sentClose = YES;
+                        // If we get closed in this state it's probably not clean because we should be sending this when we send messages
+                        [self.delegateController performDelegateBlock:^(id<SRWebSocketDelegate>  _Nullable delegate, SRDelegateAvailableMethods availableMethods) {
+                            if (availableMethods.didCloseWithCode) {
+                                [delegate webSocket:self
+                                   didCloseWithCode:SRStatusCodeGoingAway
+                                             reason:@"Stream end encountered"
+                                           wasClean:NO];
+                            }
+                        }];
+                    }
+                });
+            }
+
+            break;
+        }
+
+        case NSStreamEventHasBytesAvailable: {
+            SRDebugLog(@"NSStreamEventHasBytesAvailable %@", aStream);
+            uint8_t buffer[SRDefaultBufferSize()];
+
+            while (_inputStream.hasBytesAvailable) {
+                NSInteger bytesRead = [_inputStream read:buffer maxLength:SRDefaultBufferSize()];
+                if (bytesRead > 0) {
+                    dispatch_data_t data = dispatch_data_create(buffer, bytesRead, nil, DISPATCH_DATA_DESTRUCTOR_DEFAULT);
+                    if (!data) {
+                        NSError *error = SRErrorWithCodeDescription(SRStatusCodeMessageTooBig,
+                                                                    @"Unable to allocate memory to read from socket.");
+                        [self _failWithError:error];
+                        return;
+                    }
+                    _readBuffer = dispatch_data_create_concat(_readBuffer, data);
+                } else if (bytesRead == -1) {
+                    [self _failWithError:_inputStream.streamError];
+                }
+            }
+            [self _pumpScanner];
+            break;
+        }
+
+        case NSStreamEventHasSpaceAvailable: {
+            SRDebugLog(@"NSStreamEventHasSpaceAvailable %@", aStream);
+            [self _pumpWriting];
+            break;
+        }
+
+        case NSStreamEventNone:
+            SRDebugLog(@"(default)  %@", aStream);
+            break;
+    }
+}
+
+///--------------------------------------
+#pragma mark - Delegate
+///--------------------------------------
+
+- (id<SRWebSocketDelegate> _Nullable)delegate
+{
+    return self.delegateController.delegate;
+}
+
+- (void)setDelegate:(id<SRWebSocketDelegate> _Nullable)delegate
+{
+    self.delegateController.delegate = delegate;
+}
+
+- (void)setDelegateDispatchQueue:(dispatch_queue_t _Nullable)queue
+{
+    self.delegateController.dispatchQueue = queue;
+}
+
+- (dispatch_queue_t _Nullable)delegateDispatchQueue
+{
+    return self.delegateController.dispatchQueue;
+}
+
+- (void)setDelegateOperationQueue:(NSOperationQueue *_Nullable)queue
+{
+    self.delegateController.operationQueue = queue;
+}
+
+- (NSOperationQueue *_Nullable)delegateOperationQueue
+{
+    return self.delegateController.operationQueue;
+}
+
+@end
+
+#ifdef HAS_ICU
+
+static inline int32_t validate_dispatch_data_partial_string(NSData *data) {
+    if ([data length] > INT32_MAX) {
+        // INT32_MAX is the limit so long as this Framework is using 32 bit ints everywhere.
+        return -1;
+    }
+
+    int32_t size = (int32_t)[data length];
+
+    const void * contents = [data bytes];
+    const uint8_t *str = (const uint8_t *)contents;
+
+    UChar32 codepoint = 1;
+    int32_t offset = 0;
+    int32_t lastOffset = 0;
+    while(offset < size && codepoint > 0)  {
+        lastOffset = offset;
+        U8_NEXT(str, offset, size, codepoint);
+    }
+
+    if (codepoint == -1) {
+        // Check to see if the last byte is valid or whether it was just continuing
+        if (!U8_IS_LEAD(str[lastOffset]) || U8_COUNT_TRAIL_BYTES(str[lastOffset]) + lastOffset < (int32_t)size) {
+
+            size = -1;
+        } else {
+            uint8_t leadByte = str[lastOffset];
+            U8_MASK_LEAD_BYTE(leadByte, U8_COUNT_TRAIL_BYTES(leadByte));
+
+            for (int i = lastOffset + 1; i < offset; i++) {
+                if (U8_IS_SINGLE(str[i]) || U8_IS_LEAD(str[i]) || !U8_IS_TRAIL(str[i])) {
+                    size = -1;
+                }
+            }
+
+            if (size != -1) {
+                size = lastOffset;
+            }
+        }
+    }
+
+    if (size != -1 && ![[NSString alloc] initWithBytesNoCopy:(char *)[data bytes] length:size encoding:NSUTF8StringEncoding freeWhenDone:NO]) {
+        size = -1;
+    }
+
+    return size;
+}
+
+#else
+
+// This is a hack, and probably not optimal
+static inline int32_t validate_dispatch_data_partial_string(NSData *data) {
+    static const int maxCodepointSize = 3;
+
+    for (int i = 0; i < maxCodepointSize; i++) {
+        NSString *str = [[NSString alloc] initWithBytesNoCopy:(char *)data.bytes length:data.length - i encoding:NSUTF8StringEncoding freeWhenDone:NO];
+        if (str) {
+            return (int32_t)data.length - i;
+        }
+    }
+
+    return -1;
+}
+
+#endif
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SocketRocket.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/SocketRocket/SocketRocket/SocketRocket.h
new file mode 100644 (file)
index 0000000..c7ab062
--- /dev/null
@@ -0,0 +1,15 @@
+//
+// Copyright 2012 Square Inc.
+// Portions Copyright (c) 2016-present, Facebook, Inc.
+//
+// All rights reserved.
+//
+// This source code is licensed under the BSD-style license found in the
+// LICENSE file in the root directory of this source tree. An additional grant
+// of patent rights can be found in the PATENTS file in the same directory.
+//
+
+#import <SocketRocket/NSRunLoop+SRWebSocket.h>
+#import <SocketRocket/NSURLRequest+SRWebSocket.h>
+#import <SocketRocket/SRSecurityPolicy.h>
+#import <SocketRocket/SRWebSocket.h>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-Info.plist
new file mode 100644 (file)
index 0000000..0b89d70
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.5</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-dummy.m
new file mode 100644 (file)
index 0000000..aee0796
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQKeyboardCore : NSObject
+@end
+@implementation PodsDummy_IQKeyboardCore
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore-umbrella.h
new file mode 100644 (file)
index 0000000..64dd2f1
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQKeyboardCoreVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQKeyboardCoreVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.debug.xcconfig
new file mode 100644 (file)
index 0000000..5c4d54b
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardCore
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.modulemap
new file mode 100644 (file)
index 0000000..cca043f
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQKeyboardCore {
+  umbrella header "IQKeyboardCore-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/IQKeyboardCore.release.xcconfig
new file mode 100644 (file)
index 0000000..5c4d54b
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardCore
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardCore/ResourceBundle-IQKeyboardCore-IQKeyboardCore-Info.plist
new file mode 100644 (file)
index 0000000..3efc7e9
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.5</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-Info.plist
new file mode 100644 (file)
index 0000000..6ecc7d6
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>8.0.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-dummy.m
new file mode 100644 (file)
index 0000000..7937f27
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQKeyboardManagerSwift : NSObject
+@end
+@implementation PodsDummy_IQKeyboardManagerSwift
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift-umbrella.h
new file mode 100644 (file)
index 0000000..e95b398
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQKeyboardManagerSwiftVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQKeyboardManagerSwiftVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.debug.xcconfig
new file mode 100644 (file)
index 0000000..442dd02
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardManagerSwift
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.modulemap
new file mode 100644 (file)
index 0000000..6d9b343
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQKeyboardManagerSwift {
+  umbrella header "IQKeyboardManagerSwift-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/IQKeyboardManagerSwift.release.xcconfig
new file mode 100644 (file)
index 0000000..442dd02
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardManagerSwift
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardManagerSwift/ResourceBundle-IQKeyboardManagerSwift-IQKeyboardManagerSwift-Info.plist
new file mode 100644 (file)
index 0000000..cae5234
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>8.0.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-Info.plist
new file mode 100644 (file)
index 0000000..fa6742c
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.3</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-dummy.m
new file mode 100644 (file)
index 0000000..8a83ede
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQKeyboardNotification : NSObject
+@end
+@implementation PodsDummy_IQKeyboardNotification
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification-umbrella.h
new file mode 100644 (file)
index 0000000..16fb1ef
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQKeyboardNotificationVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQKeyboardNotificationVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.debug.xcconfig
new file mode 100644 (file)
index 0000000..0c7d299
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardNotification
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.modulemap
new file mode 100644 (file)
index 0000000..dc8f8c4
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQKeyboardNotification {
+  umbrella header "IQKeyboardNotification-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/IQKeyboardNotification.release.xcconfig
new file mode 100644 (file)
index 0000000..0c7d299
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardNotification
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardNotification/ResourceBundle-IQKeyboardNotification-IQKeyboardNotification-Info.plist
new file mode 100644 (file)
index 0000000..66c8b45
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.3</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-Info.plist
new file mode 100644 (file)
index 0000000..b49db6d
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.4</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-dummy.m
new file mode 100644 (file)
index 0000000..c4b85c8
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQKeyboardReturnManager : NSObject
+@end
+@implementation PodsDummy_IQKeyboardReturnManager
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager-umbrella.h
new file mode 100644 (file)
index 0000000..5b8c1c9
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQKeyboardReturnManagerVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQKeyboardReturnManagerVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.debug.xcconfig
new file mode 100644 (file)
index 0000000..7301b82
--- /dev/null
@@ -0,0 +1,16 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardReturnManager
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.modulemap
new file mode 100644 (file)
index 0000000..5c7882e
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQKeyboardReturnManager {
+  umbrella header "IQKeyboardReturnManager-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/IQKeyboardReturnManager.release.xcconfig
new file mode 100644 (file)
index 0000000..7301b82
--- /dev/null
@@ -0,0 +1,16 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardReturnManager
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardReturnManager/ResourceBundle-IQKeyboardReturnManager-IQKeyboardReturnManager-Info.plist
new file mode 100644 (file)
index 0000000..82617c3
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.4</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-Info.plist
new file mode 100644 (file)
index 0000000..de6ebe8
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.1.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-dummy.m
new file mode 100644 (file)
index 0000000..509d066
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQKeyboardToolbar : NSObject
+@end
+@implementation PodsDummy_IQKeyboardToolbar
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar-umbrella.h
new file mode 100644 (file)
index 0000000..9697a17
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQKeyboardToolbarVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQKeyboardToolbarVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.debug.xcconfig
new file mode 100644 (file)
index 0000000..ec1a749
--- /dev/null
@@ -0,0 +1,16 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbar
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.modulemap
new file mode 100644 (file)
index 0000000..01b12d5
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQKeyboardToolbar {
+  umbrella header "IQKeyboardToolbar-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/IQKeyboardToolbar.release.xcconfig
new file mode 100644 (file)
index 0000000..ec1a749
--- /dev/null
@@ -0,0 +1,16 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardCore" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbar
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbar/ResourceBundle-IQKeyboardToolbar-IQKeyboardToolbar-Info.plist
new file mode 100644 (file)
index 0000000..b72e7f2
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.1.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-Info.plist
new file mode 100644 (file)
index 0000000..263f9c0
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.1.3</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-dummy.m
new file mode 100644 (file)
index 0000000..16aad41
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQKeyboardToolbarManager : NSObject
+@end
+@implementation PodsDummy_IQKeyboardToolbarManager
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager-umbrella.h
new file mode 100644 (file)
index 0000000..afc8d95
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQKeyboardToolbarManagerVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQKeyboardToolbarManagerVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.debug.xcconfig
new file mode 100644 (file)
index 0000000..4bbb2c8
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardToolbar" -framework "IQTextInputViewNotification" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbarManager
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.modulemap
new file mode 100644 (file)
index 0000000..3c41440
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQKeyboardToolbarManager {
+  umbrella header "IQKeyboardToolbarManager-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/IQKeyboardToolbarManager.release.xcconfig
new file mode 100644 (file)
index 0000000..4bbb2c8
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardToolbar" -framework "IQTextInputViewNotification" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQKeyboardToolbarManager
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQKeyboardToolbarManager/ResourceBundle-IQKeyboardToolbarManager-IQKeyboardToolbarManager-Info.plist
new file mode 100644 (file)
index 0000000..3bb9fa3
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.1.3</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-Info.plist
new file mode 100644 (file)
index 0000000..3fa062a
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.8</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-dummy.m
new file mode 100644 (file)
index 0000000..128bc16
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQTextInputViewNotification : NSObject
+@end
+@implementation PodsDummy_IQTextInputViewNotification
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification-umbrella.h
new file mode 100644 (file)
index 0000000..1752c3d
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQTextInputViewNotificationVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQTextInputViewNotificationVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.debug.xcconfig
new file mode 100644 (file)
index 0000000..903a091
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardCore" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextInputViewNotification
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.modulemap
new file mode 100644 (file)
index 0000000..12b0bca
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQTextInputViewNotification {
+  umbrella header "IQTextInputViewNotification-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/IQTextInputViewNotification.release.xcconfig
new file mode 100644 (file)
index 0000000..903a091
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "Combine" -framework "IQKeyboardCore" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextInputViewNotification
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextInputViewNotification/ResourceBundle-IQTextInputViewNotification-IQTextInputViewNotification-Info.plist
new file mode 100644 (file)
index 0000000..6350d86
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.8</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-Info.plist
new file mode 100644 (file)
index 0000000..0b89d70
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.5</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-dummy.m
new file mode 100644 (file)
index 0000000..3ee207b
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_IQTextView : NSObject
+@end
+@implementation PodsDummy_IQTextView
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView-umbrella.h
new file mode 100644 (file)
index 0000000..6aa14c2
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double IQTextViewVersionNumber;
+FOUNDATION_EXPORT const unsigned char IQTextViewVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.debug.xcconfig
new file mode 100644 (file)
index 0000000..765a884
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextView
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardToolbar" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextView
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.modulemap
new file mode 100644 (file)
index 0000000..1a2cd91
--- /dev/null
@@ -0,0 +1,6 @@
+framework module IQTextView {
+  umbrella header "IQTextView-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/IQTextView.release.xcconfig
new file mode 100644 (file)
index 0000000..765a884
--- /dev/null
@@ -0,0 +1,17 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQTextView
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "IQKeyboardToolbar" -framework "UIKit"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/IQTextView
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/IQTextView/ResourceBundle-IQTextView-IQTextView-Info.plist
new file mode 100644 (file)
index 0000000..3efc7e9
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.5</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-Info.plist
new file mode 100644 (file)
index 0000000..19cf209
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.0</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-acknowledgements.markdown b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-acknowledgements.markdown
new file mode 100644 (file)
index 0000000..3f648a5
--- /dev/null
@@ -0,0 +1,36 @@
+# Acknowledgements
+This application makes use of the following third party libraries:
+
+## SocketRocket
+
+BSD License
+
+For SocketRocket software
+
+Copyright (c) 2016-present, Facebook, Inc. 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.
+
+ * Neither the name Facebook nor the names of its contributors may be used to
+   endorse or promote products derived from this software without specific
+   prior written permission.
+
+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/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-acknowledgements.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-acknowledgements.plist
new file mode 100644 (file)
index 0000000..7a35f4a
--- /dev/null
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>PreferenceSpecifiers</key>
+       <array>
+               <dict>
+                       <key>FooterText</key>
+                       <string>This application makes use of the following third party libraries:</string>
+                       <key>Title</key>
+                       <string>Acknowledgements</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>BSD License
+
+For SocketRocket software
+
+Copyright (c) 2016-present, Facebook, Inc. 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.
+
+ * Neither the name Facebook nor the names of its contributors may be used to
+   endorse or promote products derived from this software without specific
+   prior written permission.
+
+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.</string>
+                       <key>License</key>
+                       <string>BSD</string>
+                       <key>Title</key>
+                       <string>SocketRocket</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>Generated by CocoaPods - https://cocoapods.org</string>
+                       <key>Title</key>
+                       <string></string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+       </array>
+       <key>StringsTable</key>
+       <string>Acknowledgements</string>
+       <key>Title</key>
+       <string>Acknowledgements</string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-dummy.m
new file mode 100644 (file)
index 0000000..49baa2a
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_Pods_DeepChordsSdk : NSObject
+@end
+@implementation PodsDummy_Pods_DeepChordsSdk
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk-umbrella.h
new file mode 100644 (file)
index 0000000..32e1e90
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double Pods_DeepChordsSdkVersionNumber;
+FOUNDATION_EXPORT const unsigned char Pods_DeepChordsSdkVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.debug.xcconfig
new file mode 100644 (file)
index 0000000..14872ce
--- /dev/null
@@ -0,0 +1,13 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers"
+LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks'
+OTHER_LDFLAGS = $(inherited) -l"icucore" -framework "CFNetwork" -framework "Security" -framework "SocketRocket"
+OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket"
+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
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.modulemap
new file mode 100644 (file)
index 0000000..b8f06b0
--- /dev/null
@@ -0,0 +1,6 @@
+framework module Pods_DeepChordsSdk {
+  umbrella header "Pods-DeepChordsSdk-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-DeepChordsSdk/Pods-DeepChordsSdk.release.xcconfig
new file mode 100644 (file)
index 0000000..14872ce
--- /dev/null
@@ -0,0 +1,13 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers"
+LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' '@executable_path/../../Frameworks'
+OTHER_LDFLAGS = $(inherited) -l"icucore" -framework "CFNetwork" -framework "Security" -framework "SocketRocket"
+OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket"
+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
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-Info.plist
new file mode 100644 (file)
index 0000000..19cf209
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>1.0.0</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.markdown
new file mode 100644 (file)
index 0000000..7c475f8
--- /dev/null
@@ -0,0 +1,281 @@
+# Acknowledgements
+This application makes use of the following third party libraries:
+
+## SocketRocket
+
+BSD License
+
+For SocketRocket software
+
+Copyright (c) 2016-present, Facebook, Inc. 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.
+
+ * Neither the name Facebook nor the names of its contributors may be used to
+   endorse or promote products derived from this software without specific
+   prior written permission.
+
+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.
+
+## IQKeyboardCore
+
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+
+
+## IQKeyboardManagerSwift
+
+MIT License
+
+Copyright (c) 2013-2023 Iftekhar Qurashi
+
+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.
+
+
+## IQKeyboardNotification
+
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+
+
+## IQKeyboardReturnManager
+
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+
+
+## IQKeyboardToolbar
+
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+
+
+## IQKeyboardToolbarManager
+
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+
+
+## IQTextInputViewNotification
+
+Copyright (c) 2024 hackiftekhar <ideviftekhar@gmail.com>
+
+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.
+
+
+## IQTextView
+
+MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+
+
+## SnapKit
+
+Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+
+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.
+
+
+## Toast-Swift
+
+Copyright (c) 2015-2024 Charles Scalesse.
+
+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.
+
+Generated by CocoaPods - https://cocoapods.org
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-acknowledgements.plist
new file mode 100644 (file)
index 0000000..f164213
--- /dev/null
@@ -0,0 +1,373 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>PreferenceSpecifiers</key>
+       <array>
+               <dict>
+                       <key>FooterText</key>
+                       <string>This application makes use of the following third party libraries:</string>
+                       <key>Title</key>
+                       <string>Acknowledgements</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>BSD License
+
+For SocketRocket software
+
+Copyright (c) 2016-present, Facebook, Inc. 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.
+
+ * Neither the name Facebook nor the names of its contributors may be used to
+   endorse or promote products derived from this software without specific
+   prior written permission.
+
+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.</string>
+                       <key>License</key>
+                       <string>BSD</string>
+                       <key>Title</key>
+                       <string>SocketRocket</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQKeyboardCore</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>MIT License
+
+Copyright (c) 2013-2023 Iftekhar Qurashi
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQKeyboardManagerSwift</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQKeyboardNotification</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQKeyboardReturnManager</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQKeyboardToolbar</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQKeyboardToolbarManager</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>Copyright (c) 2024 hackiftekhar &lt;ideviftekhar@gmail.com&gt;
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQTextInputViewNotification</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>MIT License
+
+Copyright (c) 2024 Mohd Iftekhar Qurashi
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>IQTextView</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>SnapKit</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>Copyright (c) 2015-2024 Charles Scalesse.
+
+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.
+</string>
+                       <key>License</key>
+                       <string>MIT</string>
+                       <key>Title</key>
+                       <string>Toast-Swift</string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+               <dict>
+                       <key>FooterText</key>
+                       <string>Generated by CocoaPods - https://cocoapods.org</string>
+                       <key>Title</key>
+                       <string></string>
+                       <key>Type</key>
+                       <string>PSGroupSpecifier</string>
+               </dict>
+       </array>
+       <key>StringsTable</key>
+       <string>Acknowledgements</string>
+       <key>Title</key>
+       <string>Acknowledgements</string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-dummy.m
new file mode 100644 (file)
index 0000000..6ee3f90
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_Pods_Example : NSObject
+@end
+@implementation PodsDummy_Pods_Example
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-input-files.xcfilelist
new file mode 100644 (file)
index 0000000..c7c1447
--- /dev/null
@@ -0,0 +1,12 @@
+${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh
+${BUILT_PRODUCTS_DIR}/SocketRocket/SocketRocket.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework
+${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework
+${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework
+${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
+${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework
\ No newline at end of file
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Debug-output-files.xcfilelist
new file mode 100644 (file)
index 0000000..0f3e419
--- /dev/null
@@ -0,0 +1,11 @@
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SocketRocket.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardCore.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardNotification.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardReturnManager.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbar.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbarManager.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextInputViewNotification.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextView.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast_Swift.framework
\ No newline at end of file
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-input-files.xcfilelist
new file mode 100644 (file)
index 0000000..c7c1447
--- /dev/null
@@ -0,0 +1,12 @@
+${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-frameworks.sh
+${BUILT_PRODUCTS_DIR}/SocketRocket/SocketRocket.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework
+${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework
+${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework
+${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework
+${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework
+${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework
\ No newline at end of file
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks-Release-output-files.xcfilelist
new file mode 100644 (file)
index 0000000..0f3e419
--- /dev/null
@@ -0,0 +1,11 @@
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SocketRocket.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardCore.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardNotification.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardReturnManager.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbar.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbarManager.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextInputViewNotification.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextView.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SnapKit.framework
+${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Toast_Swift.framework
\ No newline at end of file
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-frameworks.sh
new file mode 100755 (executable)
index 0000000..d9fc13b
--- /dev/null
@@ -0,0 +1,206 @@
+#!/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="${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
+BCSYMBOLMAP_DIR="BCSymbolMaps"
+
+
+# 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 -f "${source}")"
+  fi
+
+  if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
+    # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied
+    find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do
+      echo "Installing $f"
+      install_bcsymbolmap "$f" "$destination"
+      rm "$f"
+    done
+    rmdir "${source}/${BCSYMBOLMAP_DIR}"
+  fi
+
+  # Use filter instead of exclude so missing patterns don't throw errors.
+  echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
+  rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --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"
+  warn_missing_arch=${2:-true}
+  if [ -r "$source" ]; then
+    # Copy the dSYM into 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 .dSYM "$source")"
+    binary_name="$(ls "$source/Contents/Resources/DWARF")"
+    binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}"
+
+    # Strip invalid architectures from the dSYM.
+    if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
+      strip_invalid_archs "$binary" "$warn_missing_arch"
+    fi
+    if [[ $STRIP_BINARY_RETVAL == 0 ]]; then
+      # Move the stripped file into its final destination.
+      echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --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[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.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.
+      mkdir -p "${DWARF_DSYM_FOLDER_PATH}"
+      touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM"
+    fi
+  fi
+}
+
+# Used as a return value for each invocation of `strip_invalid_archs` function.
+STRIP_BINARY_RETVAL=0
+
+# Strip invalid architectures
+strip_invalid_archs() {
+  binary="$1"
+  warn_missing_arch=${2:-true}
+  # 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
+    if [[ "$warn_missing_arch" == "true" ]]; then
+      echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
+    fi
+    STRIP_BINARY_RETVAL=1
+    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=0
+}
+
+# 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
+}
+
+if [[ "$CONFIGURATION" == "Debug" ]]; then
+  install_framework "${BUILT_PRODUCTS_DIR}/SocketRocket/SocketRocket.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework"
+fi
+if [[ "$CONFIGURATION" == "Release" ]]; then
+  install_framework "${BUILT_PRODUCTS_DIR}/SocketRocket/SocketRocket.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/SnapKit/SnapKit.framework"
+  install_framework "${BUILT_PRODUCTS_DIR}/Toast-Swift/Toast_Swift.framework"
+fi
+if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
+  wait
+fi
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example-umbrella.h
new file mode 100644 (file)
index 0000000..ecf498e
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double Pods_ExampleVersionNumber;
+FOUNDATION_EXPORT const unsigned char Pods_ExampleVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.debug.xcconfig
new file mode 100644 (file)
index 0000000..d623907
--- /dev/null
@@ -0,0 +1,17 @@
+ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift/Toast_Swift.framework/Headers"
+LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -l"icucore" -l"swiftCoreGraphics" -framework "CFNetwork" -framework "Combine" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "QuartzCore" -framework "Security" -framework "SnapKit" -framework "SocketRocket" -framework "Toast_Swift" -framework "UIKit"
+OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+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
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.modulemap
new file mode 100644 (file)
index 0000000..4b5189f
--- /dev/null
@@ -0,0 +1,6 @@
+framework module Pods_Example {
+  umbrella header "Pods-Example-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Pods-Example/Pods-Example.release.xcconfig
new file mode 100644 (file)
index 0000000..d623907
--- /dev/null
@@ -0,0 +1,17 @@
+ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+ENABLE_USER_SCRIPT_SANDBOXING = NO
+FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift"
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore/IQKeyboardCore.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQTextView/IQTextView.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket/SocketRocket.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift/Toast_Swift.framework/Headers"
+LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -l"icucore" -l"swiftCoreGraphics" -framework "CFNetwork" -framework "Combine" -framework "IQKeyboardCore" -framework "IQKeyboardManagerSwift" -framework "IQKeyboardNotification" -framework "IQKeyboardReturnManager" -framework "IQKeyboardToolbar" -framework "IQKeyboardToolbarManager" -framework "IQTextInputViewNotification" -framework "IQTextView" -framework "QuartzCore" -framework "Security" -framework "SnapKit" -framework "SocketRocket" -framework "Toast_Swift" -framework "UIKit"
+OTHER_MODULE_VERIFIER_FLAGS = $(inherited) "-F${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardCore" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManagerSwift" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardReturnManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbar" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardToolbarManager" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextInputViewNotification" "-F${PODS_CONFIGURATION_BUILD_DIR}/IQTextView" "-F${PODS_CONFIGURATION_BUILD_DIR}/SnapKit" "-F${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+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
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/ResourceBundle-SnapKit_Privacy-SnapKit-Info.plist
new file mode 100644 (file)
index 0000000..d6be571
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>5.7.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-Info.plist
new file mode 100644 (file)
index 0000000..af3ef2c
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>5.7.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-dummy.m
new file mode 100644 (file)
index 0000000..b44e8e5
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_SnapKit : NSObject
+@end
+@implementation PodsDummy_SnapKit
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit-umbrella.h
new file mode 100644 (file)
index 0000000..1b1be64
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double SnapKitVersionNumber;
+FOUNDATION_EXPORT const unsigned char SnapKitVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.debug.xcconfig
new file mode 100644 (file)
index 0000000..3e6e223
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapKit
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapKit
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.modulemap
new file mode 100644 (file)
index 0000000..4b3e47b
--- /dev/null
@@ -0,0 +1,6 @@
+framework module SnapKit {
+  umbrella header "SnapKit-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SnapKit/SnapKit.release.xcconfig
new file mode 100644 (file)
index 0000000..3e6e223
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SnapKit
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift $(SDKROOT)/usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -l"swiftCoreGraphics"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/SnapKit
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-Info.plist
new file mode 100644 (file)
index 0000000..b23720f
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>0.7.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-dummy.m
new file mode 100644 (file)
index 0000000..1e9d2c9
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_SocketRocket : NSObject
+@end
+@implementation PodsDummy_SocketRocket
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket-umbrella.h
new file mode 100644 (file)
index 0000000..dd9d9ef
--- /dev/null
@@ -0,0 +1,21 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+#import "NSRunLoop+SRWebSocket.h"
+#import "NSURLRequest+SRWebSocket.h"
+#import "SocketRocket.h"
+#import "SRSecurityPolicy.h"
+#import "SRWebSocket.h"
+
+FOUNDATION_EXPORT double SocketRocketVersionNumber;
+FOUNDATION_EXPORT const unsigned char SocketRocketVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.debug.xcconfig
new file mode 100644 (file)
index 0000000..62cdd4a
--- /dev/null
@@ -0,0 +1,14 @@
+BUILD_LIBRARY_FOR_DISTRIBUTION = YES
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+OTHER_LDFLAGS = $(inherited) -l"icucore" -framework "CFNetwork" -framework "Security"
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/SocketRocket
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.modulemap
new file mode 100644 (file)
index 0000000..52acc5d
--- /dev/null
@@ -0,0 +1,6 @@
+framework module SocketRocket {
+  umbrella header "SocketRocket-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/SocketRocket/SocketRocket.release.xcconfig
new file mode 100644 (file)
index 0000000..62cdd4a
--- /dev/null
@@ -0,0 +1,14 @@
+BUILD_LIBRARY_FOR_DISTRIBUTION = YES
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SocketRocket
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+OTHER_LDFLAGS = $(inherited) -l"icucore" -framework "CFNetwork" -framework "Security"
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/SocketRocket
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/ResourceBundle-Toast-Swift-Toast-Swift-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/ResourceBundle-Toast-Swift-Toast-Swift-Info.plist
new file mode 100644 (file)
index 0000000..5b2072c
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>BNDL</string>
+  <key>CFBundleShortVersionString</key>
+  <string>5.1.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>1</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-Info.plist b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-Info.plist
new file mode 100644 (file)
index 0000000..021370d
--- /dev/null
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+  <key>CFBundleDevelopmentRegion</key>
+  <string>${PODS_DEVELOPMENT_LANGUAGE}</string>
+  <key>CFBundleExecutable</key>
+  <string>${EXECUTABLE_NAME}</string>
+  <key>CFBundleIdentifier</key>
+  <string>${PRODUCT_BUNDLE_IDENTIFIER}</string>
+  <key>CFBundleInfoDictionaryVersion</key>
+  <string>6.0</string>
+  <key>CFBundleName</key>
+  <string>${PRODUCT_NAME}</string>
+  <key>CFBundlePackageType</key>
+  <string>FMWK</string>
+  <key>CFBundleShortVersionString</key>
+  <string>5.1.1</string>
+  <key>CFBundleSignature</key>
+  <string>????</string>
+  <key>CFBundleVersion</key>
+  <string>${CURRENT_PROJECT_VERSION}</string>
+  <key>NSPrincipalClass</key>
+  <string></string>
+</dict>
+</plist>
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-dummy.m b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-dummy.m
new file mode 100644 (file)
index 0000000..2962aa4
--- /dev/null
@@ -0,0 +1,5 @@
+#import <Foundation/Foundation.h>
+@interface PodsDummy_Toast_Swift : NSObject
+@end
+@implementation PodsDummy_Toast_Swift
+@end
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-prefix.pch b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-prefix.pch
new file mode 100644 (file)
index 0000000..beb2a24
--- /dev/null
@@ -0,0 +1,12 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-umbrella.h b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift-umbrella.h
new file mode 100644 (file)
index 0000000..8abdfa0
--- /dev/null
@@ -0,0 +1,16 @@
+#ifdef __OBJC__
+#import <UIKit/UIKit.h>
+#else
+#ifndef FOUNDATION_EXPORT
+#if defined(__cplusplus)
+#define FOUNDATION_EXPORT extern "C"
+#else
+#define FOUNDATION_EXPORT extern
+#endif
+#endif
+#endif
+
+
+FOUNDATION_EXPORT double Toast_SwiftVersionNumber;
+FOUNDATION_EXPORT const unsigned char Toast_SwiftVersionString[];
+
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.debug.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.debug.xcconfig
new file mode 100644 (file)
index 0000000..8c4b186
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "QuartzCore"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/Toast-Swift
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.modulemap b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.modulemap
new file mode 100644 (file)
index 0000000..af3db9f
--- /dev/null
@@ -0,0 +1,6 @@
+framework module Toast_Swift {
+  umbrella header "Toast-Swift-umbrella.h"
+
+  export *
+  module * { export * }
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.release.xcconfig b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Target Support Files/Toast-Swift/Toast-Swift.release.xcconfig
new file mode 100644 (file)
index 0000000..8c4b186
--- /dev/null
@@ -0,0 +1,15 @@
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
+CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Toast-Swift
+GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
+LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
+OTHER_LDFLAGS = $(inherited) -framework "QuartzCore"
+OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
+PODS_BUILD_DIR = ${BUILD_DIR}
+PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
+PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE}
+PODS_ROOT = ${SRCROOT}
+PODS_TARGET_SRCROOT = ${PODS_ROOT}/Toast-Swift
+PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
+PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
+SKIP_INSTALL = YES
+USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/LICENSE b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/LICENSE
new file mode 100644 (file)
index 0000000..6b3b982
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright (c) 2015-2024 Charles Scalesse.
+
+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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/README.md b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/README.md
new file mode 100644 (file)
index 0000000..e7ae831
--- /dev/null
@@ -0,0 +1,143 @@
+Toast-Swift
+=============
+
+[![CocoaPods Version](https://img.shields.io/cocoapods/v/Toast-Swift.svg)](http://cocoadocs.org/docsets/Toast-Swift)
+[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)
+
+Toast-Swift is a Swift extension that adds toast notifications to the `UIView` object class. It is intended to be simple, lightweight, and easy to use. Most toast notifications can be triggered with a single line of code.
+
+**Toast-Swift is a native Swift port of [Toast for iOS](https://github.com/scalessec/Toast "Toast for iOS").**
+
+Screenshots
+---------
+![Toast-Swift Screenshots](toast_swift_screenshot.jpg)
+
+
+Basic Examples
+---------
+```swift
+// basic usage
+self.view.makeToast("This is a piece of toast")
+
+// toast with a specific duration and position
+self.view.makeToast("This is a piece of toast", duration: 3.0, position: .top)
+
+// toast presented with multiple options and with a completion closure
+self.view.makeToast("This is a piece of toast", duration: 2.0, point: CGPoint(x: 110.0, y: 110.0), title: "Toast Title", image: UIImage(named: "toast.png")) { didTap in
+    if didTap {
+        print("completion from tap")
+    } else {
+        print("completion without tap")
+    }
+}
+
+// display toast with an activity spinner
+self.view.makeToastActivity(.center)
+
+// display any view as toast
+self.view.showToast(myView)
+
+// immediately hides all toast views in self.view
+self.view.hideAllToasts()
+```
+
+But wait, there's more!
+---------
+```swift
+// create a new style
+var style = ToastStyle()
+
+// this is just one of many style options
+style.messageColor = .blue
+
+// present the toast with the new style
+self.view.makeToast("This is a piece of toast", duration: 3.0, position: .bottom, style: style)
+
+// or perhaps you want to use this style for all toasts going forward?
+// just set the shared style and there's no need to provide the style again
+ToastManager.shared.style = style
+self.view.makeToast("This is a piece of toast") // now uses the shared style
+
+// toggle "tap to dismiss" functionality
+ToastManager.shared.isTapToDismissEnabled = true
+
+// toggle queueing behavior
+ToastManager.shared.isQueueEnabled = true
+```
+
+See the demo project for more examples.
+
+
+Setup Instructions
+------------------
+
+[CocoaPods](http://cocoapods.org)
+------------------
+
+To integrate Toast-Swift into your Xcode project using CocoaPods, specify it in your `Podfile`:
+
+```ruby
+pod 'Toast-Swift', '~> 5.1.0'
+```
+
+and in your code add `import Toast_Swift`.
+
+[Carthage](https://github.com/Carthage/Carthage)
+------------------
+
+To integrate Toast-Swift into your Xcode project using Carthage, specify it in your `Cartfile`:
+
+```ogdl
+github "scalessec/Toast-Swift" ~> 5.1.0
+```
+
+Run `carthage update` to build the framework and drag the built `ToastSwiftFramework.framework` into your Xcode project.
+
+and in your code add `import ToastSwiftFramework`.
+
+[Swift Package Manager](https://swift.org/package-manager/)
+------------------
+
+When using Xcode 11 or later, you can install `Toast` by going to your Project settings > `Swift Packages` and add the repository by providing the GitHub URL. Alternatively, you can go to `File` > `Swift Packages` > `Add Package Dependencies...`
+
+Manually
+------------------
+
+1. Add `Toast.swift` to your project.
+2. Grab yourself a cold 🍺.
+
+Compatibility
+------------------
+* Version `5.x.x` requires Swift 5 and Xcode 10.2 or later.
+* Version `4.x.x` requires Swift 4.2 and Xcode 10.
+* Version `3.x.x` requires Swift 4 and Xcode 9.
+* Version `2.x.x` requires Swift 3 and Xcode 8.
+* Version `1.4.x` requires Swift 2.2 and Xcode 7.3. 
+* Version `1.0.0` can be used with Swift 2.1 and earlier versions of Xcode.
+
+Privacy
+-----------
+Toast-Swift does not collect any data. A [privacy manifest](Toast/Resources/PrivacyInfo.xcprivacy) is provided with the library. See [Apple's documentation](https://developer.apple.com/documentation/bundleresources/privacy_manifest_files) for related details.
+ 
+MIT License
+-----------
+    Copyright (c) 2015-2024 Charles Scalesse.
+
+    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.
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/Toast/Resources/PrivacyInfo.xcprivacy b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/Toast/Resources/PrivacyInfo.xcprivacy
new file mode 100644 (file)
index 0000000..3421b16
--- /dev/null
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+       <key>NSPrivacyTracking</key>
+       <false/>
+       <key>NSPrivacyCollectedDataTypes</key>
+       <array/>
+       <key>NSPrivacyTrackingDomains</key>
+       <array/>
+       <key>NSPrivacyAccessedAPITypes</key>
+       <array/>
+</dict>
+</plist>
\ No newline at end of file
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/Toast/Toast.swift b/DeepChordsSdk_iOS/DeepChordsSdk/Pods/Toast-Swift/Toast/Toast.swift
new file mode 100644 (file)
index 0000000..5b4dd05
--- /dev/null
@@ -0,0 +1,797 @@
+//
+//  Toast.swift
+//  Toast-Swift
+//
+//  Copyright (c) 2015-2024 Charles Scalesse.
+//
+//  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 UIKit
+import ObjectiveC
+
+/**
+ Toast is a Swift extension that adds toast notifications to the `UIView` object class.
+ It is intended to be simple, lightweight, and easy to use. Most toast notifications 
+ can be triggered with a single line of code.
+ 
+ The `makeToast` methods create a new view and then display it as toast.
+ 
+ The `showToast` methods display any view as toast.
+ 
+ */
+public extension UIView {
+    
+    /**
+     Keys used for associated objects.
+     */
+    private struct ToastKeys {
+        static var timer = malloc(1)
+        static var duration = malloc(1)
+        static var point = malloc(1)
+        static var completion = malloc(1)
+        static var activeToasts = malloc(1)
+        static var activityView = malloc(1)
+        static var queue = malloc(1)
+    }
+    
+    /**
+     Swift closures can't be directly associated with objects via the
+     Objective-C runtime, so the (ugly) solution is to wrap them in a
+     class that can be used with associated objects.
+     */
+    private class ToastCompletionWrapper {
+        let completion: ((Bool) -> Void)?
+        
+        init(_ completion: ((Bool) -> Void)?) {
+            self.completion = completion
+        }
+    }
+    
+    private enum ToastError: Error {
+        case missingParameters
+    }
+    
+    private var activeToasts: NSMutableArray {
+        get {
+            if let activeToasts = objc_getAssociatedObject(self, &ToastKeys.activeToasts) as? NSMutableArray {
+                return activeToasts
+            } else {
+                let activeToasts = NSMutableArray()
+                objc_setAssociatedObject(self, &ToastKeys.activeToasts, activeToasts, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+                return activeToasts
+            }
+        }
+    }
+    
+    private var queue: NSMutableArray {
+        get {
+            if let queue = objc_getAssociatedObject(self, &ToastKeys.queue) as? NSMutableArray {
+                return queue
+            } else {
+                let queue = NSMutableArray()
+                objc_setAssociatedObject(self, &ToastKeys.queue, queue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+                return queue
+            }
+        }
+    }
+    
+    // MARK: - Make Toast Methods
+    
+    /**
+     Creates and presents a new toast view.
+     
+     @param message The message to be displayed
+     @param duration The toast duration
+     @param position The toast's position
+     @param title The title
+     @param image The image
+     @param style The style. The shared style will be used when nil
+     @param completion The completion closure, executed after the toast view disappears.
+            didTap will be `true` if the toast view was dismissed from a tap.
+     */
+    func makeToast(_ message: String?, duration: TimeInterval = ToastManager.shared.duration, position: ToastPosition = ToastManager.shared.position, title: String? = nil, image: UIImage? = nil, style: ToastStyle = ToastManager.shared.style, completion: ((_ didTap: Bool) -> Void)? = nil) {
+        do {
+            let toast = try toastViewForMessage(message, title: title, image: image, style: style)
+            showToast(toast, duration: duration, position: position, completion: completion)
+        } catch ToastError.missingParameters {
+            print("Error: message, title, and image are all nil")
+        } catch {}
+    }
+    
+    /**
+     Creates a new toast view and presents it at a given center point.
+     
+     @param message The message to be displayed
+     @param duration The toast duration
+     @param point The toast's center point
+     @param title The title
+     @param image The image
+     @param style The style. The shared style will be used when nil
+     @param completion The completion closure, executed after the toast view disappears.
+            didTap will be `true` if the toast view was dismissed from a tap.
+     */
+    func makeToast(_ message: String?, duration: TimeInterval = ToastManager.shared.duration, point: CGPoint, title: String?, image: UIImage?, style: ToastStyle = ToastManager.shared.style, completion: ((_ didTap: Bool) -> Void)?) {
+        do {
+            let toast = try toastViewForMessage(message, title: title, image: image, style: style)
+            showToast(toast, duration: duration, point: point, completion: completion)
+        } catch ToastError.missingParameters {
+            print("Error: message, title, and image cannot all be nil")
+        } catch {}
+    }
+    
+    // MARK: - Show Toast Methods
+    
+    /**
+     Displays any view as toast at a provided position and duration. The completion closure
+     executes when the toast view completes. `didTap` will be `true` if the toast view was
+     dismissed from a tap.
+     
+     @param toast The view to be displayed as toast
+     @param duration The notification duration
+     @param position The toast's position
+     @param completion The completion block, executed after the toast view disappears.
+     didTap will be `true` if the toast view was dismissed from a tap.
+     */
+    func showToast(_ toast: UIView, duration: TimeInterval = ToastManager.shared.duration, position: ToastPosition = ToastManager.shared.position, completion: ((_ didTap: Bool) -> Void)? = nil) {
+        let point = position.centerPoint(forToast: toast, inSuperview: self)
+        showToast(toast, duration: duration, point: point, completion: completion)
+    }
+    
+    /**
+     Displays any view as toast at a provided center point and duration. The completion closure
+     executes when the toast view completes. `didTap` will be `true` if the toast view was
+     dismissed from a tap.
+     
+     @param toast The view to be displayed as toast
+     @param duration The notification duration
+     @param point The toast's center point
+     @param completion The completion block, executed after the toast view disappears.
+     didTap will be `true` if the toast view was dismissed from a tap.
+     */
+    func showToast(_ toast: UIView, duration: TimeInterval = ToastManager.shared.duration, point: CGPoint, completion: ((_ didTap: Bool) -> Void)? = nil) {
+        objc_setAssociatedObject(toast, &ToastKeys.completion, ToastCompletionWrapper(completion), .OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+        
+        if ToastManager.shared.isQueueEnabled, activeToasts.count > 0 {
+            objc_setAssociatedObject(toast, &ToastKeys.duration, NSNumber(value: duration), .OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+            objc_setAssociatedObject(toast, &ToastKeys.point, NSValue(cgPoint: point), .OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+            
+            queue.add(toast)
+        } else {
+            showToast(toast, duration: duration, point: point)
+        }
+    }
+    
+    // MARK: - Hide Toast Methods
+    
+    /**
+     Hides the active toast. If there are multiple toasts active in a view, this method
+     hides the oldest toast (the first of the toasts to have been presented).
+     
+     @see `hideAllToasts()` to remove all active toasts from a view.
+     
+     @warning This method has no effect on activity toasts. Use `hideToastActivity` to
+     hide activity toasts.
+     
+    */
+    func hideToast() {
+        guard let activeToast = activeToasts.firstObject as? UIView else { return }
+        hideToast(activeToast)
+    }
+    
+    /**
+     Hides an active toast.
+     
+     @param toast The active toast view to dismiss. Any toast that is currently being displayed
+     on the screen is considered active.
+     
+     @warning this does not clear a toast view that is currently waiting in the queue.
+     */
+    func hideToast(_ toast: UIView) {
+        guard activeToasts.contains(toast) else { return }
+        hideToast(toast, fromTap: false)
+    }
+    
+    /**
+     Hides all toast views.
+     
+     @param includeActivity If `true`, toast activity will also be hidden. Default is `false`.
+     @param clearQueue If `true`, removes all toast views from the queue. Default is `true`.
+    */
+    func hideAllToasts(includeActivity: Bool = false, clearQueue: Bool = true) {
+        if clearQueue {
+            clearToastQueue()
+        }
+        
+        activeToasts.compactMap { $0 as? UIView }
+                    .forEach { hideToast($0) }
+        
+        if includeActivity {
+            hideToastActivity()
+        }
+    }
+    
+    /**
+     Removes all toast views from the queue. This has no effect on toast views that are
+     active. Use `hideAllToasts(clearQueue:)` to hide the active toasts views and clear
+     the queue.
+     */
+    func clearToastQueue() {
+        queue.removeAllObjects()
+    }
+    
+    // MARK: - Activity Methods
+    
+    /**
+     Creates and displays a new toast activity indicator view at a specified position.
+    
+     @warning Only one toast activity indicator view can be presented per superview. Subsequent
+     calls to `makeToastActivity(position:)` will be ignored until `hideToastActivity()` is called.
+    
+     @warning `makeToastActivity(position:)` works independently of the `showToast` methods. Toast
+     activity views can be presented and dismissed while toast views are being displayed.
+     `makeToastActivity(position:)` has no effect on the queueing behavior of the `showToast` methods.
+    
+     @param position The toast's position
+     */
+    func makeToastActivity(_ position: ToastPosition) {
+        // sanity
+        guard objc_getAssociatedObject(self, &ToastKeys.activityView) as? UIView == nil else { return }
+        
+        let toast = createToastActivityView()
+        let point = position.centerPoint(forToast: toast, inSuperview: self)
+        makeToastActivity(toast, point: point)
+    }
+    
+    /**
+     Creates and displays a new toast activity indicator view at a specified position.
+     
+     @warning Only one toast activity indicator view can be presented per superview. Subsequent
+     calls to `makeToastActivity(position:)` will be ignored until `hideToastActivity()` is called.
+     
+     @warning `makeToastActivity(position:)` works independently of the `showToast` methods. Toast
+     activity views can be presented and dismissed while toast views are being displayed.
+     `makeToastActivity(position:)` has no effect on the queueing behavior of the `showToast` methods.
+     
+     @param point The toast's center point
+     */
+    func makeToastActivity(_ point: CGPoint) {
+        // sanity
+        guard objc_getAssociatedObject(self, &ToastKeys.activityView) as? UIView == nil else { return }
+        
+        let toast = createToastActivityView()
+        makeToastActivity(toast, point: point)
+    }
+    
+    /**
+     Dismisses the active toast activity indicator view.
+     */
+    func hideToastActivity() {
+        if let toast = objc_getAssociatedObject(self, &ToastKeys.activityView) as? UIView {
+            UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: [.curveEaseIn, .beginFromCurrentState], animations: {
+                toast.alpha = 0.0
+            }) { _ in
+                toast.removeFromSuperview()
+                objc_setAssociatedObject(self, &ToastKeys.activityView, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+            }
+        }
+    }
+    
+    // MARK: - Helper Methods
+    
+    /**
+     Returns `true` if a toast view or toast activity view is actively being displayed.
+     */
+    func isShowingToast() -> Bool {
+        return activeToasts.count > 0 || objc_getAssociatedObject(self, &ToastKeys.activityView) != nil
+    }
+    
+    // MARK: - Private Activity Methods
+    
+    private func makeToastActivity(_ toast: UIView, point: CGPoint) {
+        toast.alpha = 0.0
+        toast.center = point
+        
+        objc_setAssociatedObject(self, &ToastKeys.activityView, toast, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+        
+        self.addSubview(toast)
+        
+        UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: .curveEaseOut, animations: {
+            toast.alpha = 1.0
+        })
+    }
+    
+    private func createToastActivityView() -> UIView {
+        let style = ToastManager.shared.style
+        
+        let activityView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: style.activitySize.width, height: style.activitySize.height))
+        activityView.backgroundColor = style.activityBackgroundColor
+        activityView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
+        activityView.layer.cornerRadius = style.cornerRadius
+        
+        if style.displayShadow {
+            activityView.layer.shadowColor = style.shadowColor.cgColor
+            activityView.layer.shadowOpacity = style.shadowOpacity
+            activityView.layer.shadowRadius = style.shadowRadius
+            activityView.layer.shadowOffset = style.shadowOffset
+        }
+        
+        let activityIndicatorView = UIActivityIndicatorView(style: .whiteLarge)
+        activityIndicatorView.center = CGPoint(x: activityView.bounds.size.width / 2.0, y: activityView.bounds.size.height / 2.0)
+        activityView.addSubview(activityIndicatorView)
+        activityIndicatorView.color = style.activityIndicatorColor
+        activityIndicatorView.startAnimating()
+        
+        return activityView
+    }
+    
+    // MARK: - Private Show/Hide Methods
+    
+    private func showToast(_ toast: UIView, duration: TimeInterval, point: CGPoint) {
+        toast.center = point
+        toast.alpha = 0.0
+        
+        if ToastManager.shared.isTapToDismissEnabled {
+            let recognizer = UITapGestureRecognizer(target: self, action: #selector(UIView.handleToastTapped(_:)))
+            toast.addGestureRecognizer(recognizer)
+            toast.isUserInteractionEnabled = true
+            toast.isExclusiveTouch = true
+        }
+        
+        activeToasts.add(toast)
+        self.addSubview(toast)
+
+        let timer = Timer(timeInterval: duration, target: self, selector: #selector(UIView.toastTimerDidFinish(_:)), userInfo: toast, repeats: false)
+        objc_setAssociatedObject(toast, &ToastKeys.timer, timer, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
+
+        UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: [.curveEaseOut, .allowUserInteraction], animations: {
+            toast.alpha = 1.0
+        }) { _ in
+            guard let timer = objc_getAssociatedObject(toast, &ToastKeys.timer) as? Timer else { return }
+            RunLoop.main.add(timer, forMode: .common)
+        }
+        
+        UIAccessibility.post(notification: .screenChanged, argument: toast)
+    }
+    
+    private func hideToast(_ toast: UIView, fromTap: Bool) {
+        if let timer = objc_getAssociatedObject(toast, &ToastKeys.timer) as? Timer {
+            timer.invalidate()
+        }
+        
+        UIView.animate(withDuration: ToastManager.shared.style.fadeDuration, delay: 0.0, options: [.curveEaseIn, .beginFromCurrentState], animations: {
+            toast.alpha = 0.0
+        }) { _ in
+            toast.removeFromSuperview()
+            self.activeToasts.remove(toast)
+            
+            if let wrapper = objc_getAssociatedObject(toast, &ToastKeys.completion) as? ToastCompletionWrapper, let completion = wrapper.completion {
+                completion(fromTap)
+            }
+            
+            if let nextToast = self.queue.firstObject as? UIView, let duration = objc_getAssociatedObject(nextToast, &ToastKeys.duration) as? NSNumber, let point = objc_getAssociatedObject(nextToast, &ToastKeys.point) as? NSValue {
+                self.queue.removeObject(at: 0)
+                self.showToast(nextToast, duration: duration.doubleValue, point: point.cgPointValue)
+            }
+        }
+    }
+    
+    // MARK: - Events
+    
+    @objc
+    private func handleToastTapped(_ recognizer: UITapGestureRecognizer) {
+        guard let toast = recognizer.view else { return }
+        hideToast(toast, fromTap: true)
+    }
+    
+    @objc
+    private func toastTimerDidFinish(_ timer: Timer) {
+        guard let toast = timer.userInfo as? UIView else { return }
+        hideToast(toast)
+    }
+    
+    // MARK: - Toast Construction
+    
+    /**
+     Creates a new toast view with any combination of message, title, and image.
+     The look and feel is configured via the style. Unlike the `makeToast` methods,
+     this method does not present the toast view automatically. One of the `showToast`
+     methods must be used to present the resulting view.
+    
+     @warning if message, title, and image are all nil, this method will throw
+     `ToastError.missingParameters`
+    
+     @param message The message to be displayed
+     @param title The title
+     @param image The image
+     @param style The style. The shared style will be used when nil
+     @throws `ToastError.missingParameters` when message, title, and image are all nil
+     @return The newly created toast view
+    */
+    func toastViewForMessage(_ message: String?, title: String?, image: UIImage?, style: ToastStyle) throws -> UIView {
+        // sanity
+        guard message != nil || title != nil || image != nil else {
+            throw ToastError.missingParameters
+        }
+        
+        var messageLabel: UILabel?
+        var titleLabel: UILabel?
+        var imageView: UIImageView?
+        
+        let wrapperView = UIView()
+        wrapperView.backgroundColor = style.backgroundColor
+        wrapperView.autoresizingMask = [.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]
+        wrapperView.layer.cornerRadius = style.cornerRadius
+        
+        if style.displayShadow {
+            wrapperView.layer.shadowColor = style.shadowColor.cgColor
+            wrapperView.layer.shadowOpacity = style.shadowOpacity
+            wrapperView.layer.shadowRadius = style.shadowRadius
+            wrapperView.layer.shadowOffset = style.shadowOffset
+        }
+        
+        if let image = image {
+            imageView = UIImageView(image: image)
+            imageView?.contentMode = .scaleAspectFit
+            imageView?.frame = CGRect(x: style.horizontalPadding, y: style.verticalPadding, width: style.imageSize.width, height: style.imageSize.height)
+        }
+        
+        var imageRect = CGRect.zero
+        
+        if let imageView = imageView {
+            imageRect.origin.x = style.horizontalPadding
+            imageRect.origin.y = style.verticalPadding
+            imageRect.size.width = imageView.bounds.size.width
+            imageRect.size.height = imageView.bounds.size.height
+        }
+
+        if let title = title {
+            titleLabel = UILabel()
+            titleLabel?.numberOfLines = style.titleNumberOfLines
+            titleLabel?.font = style.titleFont
+            titleLabel?.textAlignment = style.titleAlignment
+            titleLabel?.lineBreakMode = .byTruncatingTail
+            titleLabel?.textColor = style.titleColor
+            titleLabel?.backgroundColor = UIColor.clear
+            titleLabel?.text = title;
+            
+            let maxTitleSize = CGSize(width: (self.bounds.size.width * style.maxWidthPercentage) - imageRect.size.width, height: self.bounds.size.height * style.maxHeightPercentage)
+            let titleSize = titleLabel?.sizeThatFits(maxTitleSize)
+            if let titleSize = titleSize {
+                titleLabel?.frame = CGRect(x: 0.0, y: 0.0, width: titleSize.width, height: titleSize.height)
+            }
+        }
+        
+        if let message = message {
+            messageLabel = UILabel()
+            messageLabel?.text = message
+            messageLabel?.numberOfLines = style.messageNumberOfLines
+            messageLabel?.font = style.messageFont
+            messageLabel?.textAlignment = style.messageAlignment
+            messageLabel?.lineBreakMode = .byTruncatingTail;
+            messageLabel?.textColor = style.messageColor
+            messageLabel?.backgroundColor = UIColor.clear
+            
+            let maxMessageSize = CGSize(width: (self.bounds.size.width * style.maxWidthPercentage) - imageRect.size.width, height: self.bounds.size.height * style.maxHeightPercentage)
+            let messageSize = messageLabel?.sizeThatFits(maxMessageSize)
+            if let messageSize = messageSize {
+                let actualWidth = min(messageSize.width, maxMessageSize.width)
+                let actualHeight = min(messageSize.height, maxMessageSize.height)
+                messageLabel?.frame = CGRect(x: 0.0, y: 0.0, width: actualWidth, height: actualHeight)
+            }
+        }
+  
+        var titleRect = CGRect.zero
+        
+        if let titleLabel = titleLabel {
+            titleRect.origin.x = imageRect.origin.x + imageRect.size.width + style.horizontalPadding
+            titleRect.origin.y = style.verticalPadding
+            titleRect.size.width = titleLabel.bounds.size.width
+            titleRect.size.height = titleLabel.bounds.size.height
+        }
+        
+        var messageRect = CGRect.zero
+        
+        if let messageLabel = messageLabel {
+            messageRect.origin.x = imageRect.origin.x + imageRect.size.width + style.horizontalPadding
+            messageRect.origin.y = titleRect.origin.y + titleRect.size.height + style.verticalPadding
+            messageRect.size.width = messageLabel.bounds.size.width
+            messageRect.size.height = messageLabel.bounds.size.height
+        }
+        
+        let longerWidth = max(titleRect.size.width, messageRect.size.width)
+        let longerX = max(titleRect.origin.x, messageRect.origin.x)
+        let wrapperWidth = max((imageRect.size.width + (style.horizontalPadding * 2.0)), (longerX + longerWidth + style.horizontalPadding))
+        
+        let textMaxY = messageRect.size.height <= 0.0 && titleRect.size.height > 0.0 ? titleRect.maxY : messageRect.maxY
+        let wrapperHeight = max((textMaxY + style.verticalPadding), (imageRect.size.height + (style.verticalPadding * 2.0)))
+        
+        wrapperView.frame = CGRect(x: 0.0, y: 0.0, width: wrapperWidth, height: wrapperHeight)
+        
+        if let titleLabel = titleLabel {
+            titleRect.size.width = longerWidth
+            titleLabel.frame = titleRect
+            wrapperView.addSubview(titleLabel)
+        }
+        
+        if let messageLabel = messageLabel {
+            messageRect.size.width = longerWidth
+            messageLabel.frame = messageRect
+            wrapperView.addSubview(messageLabel)
+        }
+        
+        if let imageView = imageView {
+            wrapperView.addSubview(imageView)
+        }
+        
+        return wrapperView
+    }
+    
+}
+
+// MARK: - Toast Style
+
+/**
+ `ToastStyle` instances define the look and feel for toast views created via the
+ `makeToast` methods as well for toast views created directly with
+ `toastViewForMessage(message:title:image:style:)`.
+
+ @warning `ToastStyle` offers relatively simple styling options for the default
+ toast view. If you require a toast view with more complex UI, it probably makes more
+ sense to create your own custom UIView subclass and present it with the `showToast`
+ methods.
+*/
+public struct ToastStyle {
+
+    public init() {}
+    
+    /**
+     The background color. Default is `.black` at 80% opacity.
+    */
+    public var backgroundColor: UIColor = UIColor.black.withAlphaComponent(0.8)
+    
+    /**
+     The title color. Default is `UIColor.whiteColor()`.
+    */
+    public var titleColor: UIColor = .white
+    
+    /**
+     The message color. Default is `.white`.
+    */
+    public var messageColor: UIColor = .white
+    
+    /**
+     A percentage value from 0.0 to 1.0, representing the maximum width of the toast
+     view relative to it's superview. Default is 0.8 (80% of the superview's width).
+    */
+    public var maxWidthPercentage: CGFloat = 0.8 {
+        didSet {
+            maxWidthPercentage = max(min(maxWidthPercentage, 1.0), 0.0)
+        }
+    }
+    
+    /**
+     A percentage value from 0.0 to 1.0, representing the maximum height of the toast
+     view relative to it's superview. Default is 0.8 (80% of the superview's height).
+    */
+    public var maxHeightPercentage: CGFloat = 0.8 {
+        didSet {
+            maxHeightPercentage = max(min(maxHeightPercentage, 1.0), 0.0)
+        }
+    }
+    
+    /**
+     The spacing from the horizontal edge of the toast view to the content. When an image
+     is present, this is also used as the padding between the image and the text.
+     Default is 10.0.
+     
+    */
+    public var horizontalPadding: CGFloat = 10.0
+    
+    /**
+     The spacing from the vertical edge of the toast view to the content. When a title
+     is present, this is also used as the padding between the title and the message.
+     Default is 10.0. On iOS11+, this value is added added to the `safeAreaInset.top`
+     and `safeAreaInsets.bottom`.
+    */
+    public var verticalPadding: CGFloat = 10.0
+    
+    /**
+     The corner radius. Default is 10.0.
+    */
+    public var cornerRadius: CGFloat = 10.0;
+    
+    /**
+     The title font. Default is `.boldSystemFont(16.0)`.
+    */
+    public var titleFont: UIFont = .boldSystemFont(ofSize: 16.0)
+    
+    /**
+     The message font. Default is `.systemFont(ofSize: 16.0)`.
+    */
+    public var messageFont: UIFont = .systemFont(ofSize: 16.0)
+    
+    /**
+     The title text alignment. Default is `NSTextAlignment.Left`.
+    */
+    public var titleAlignment: NSTextAlignment = .left
+    
+    /**
+     The message text alignment. Default is `NSTextAlignment.Left`.
+    */
+    public var messageAlignment: NSTextAlignment = .left
+    
+    /**
+     The maximum number of lines for the title. The default is 0 (no limit).
+    */
+    public var titleNumberOfLines = 0
+    
+    /**
+     The maximum number of lines for the message. The default is 0 (no limit).
+    */
+    public var messageNumberOfLines = 0
+    
+    /**
+     Enable or disable a shadow on the toast view. Default is `false`.
+    */
+    public var displayShadow = false
+    
+    /**
+     The shadow color. Default is `.black`.
+     */
+    public var shadowColor: UIColor = .black
+    
+    /**
+     A value from 0.0 to 1.0, representing the opacity of the shadow.
+     Default is 0.8 (80% opacity).
+    */
+    public var shadowOpacity: Float = 0.8 {
+        didSet {
+            shadowOpacity = max(min(shadowOpacity, 1.0), 0.0)
+        }
+    }
+
+    /**
+     The shadow radius. Default is 6.0.
+    */
+    public var shadowRadius: CGFloat = 6.0
+    
+    /**
+     The shadow offset. The default is 4 x 4.
+    */
+    public var shadowOffset = CGSize(width: 4.0, height: 4.0)
+    
+    /**
+     The image size. The default is 80 x 80.
+    */
+    public var imageSize = CGSize(width: 80.0, height: 80.0)
+    
+    /**
+     The size of the toast activity view when `makeToastActivity(position:)` is called.
+     Default is 100 x 100.
+    */
+    public var activitySize = CGSize(width: 100.0, height: 100.0)
+    
+    /**
+     The fade in/out animation duration. Default is 0.2.
+     */
+    public var fadeDuration: TimeInterval = 0.2
+    
+    /**
+     Activity indicator color. Default is `.white`.
+     */
+    public var activityIndicatorColor: UIColor = .white
+    
+    /**
+     Activity background color. Default is `.black` at 80% opacity.
+     */
+    public var activityBackgroundColor: UIColor = UIColor.black.withAlphaComponent(0.8)
+    
+}
+
+// MARK: - Toast Manager
+
+/**
+ `ToastManager` provides general configuration options for all toast
+ notifications. Backed by a singleton instance.
+*/
+public class ToastManager {
+    
+    /**
+     The `ToastManager` singleton instance.
+     
+     */
+    public static let shared = ToastManager()
+    
+    /**
+     The shared style. Used whenever toastViewForMessage(message:title:image:style:) is called
+     with with a nil style.
+     
+     */
+    public var style = ToastStyle()
+    
+    /**
+     Enables or disables tap to dismiss on toast views. Default is `true`.
+     
+     */
+    public var isTapToDismissEnabled = true
+    
+    /**
+     Enables or disables queueing behavior for toast views. When `true`,
+     toast views will appear one after the other. When `false`, multiple toast
+     views will appear at the same time (potentially overlapping depending
+     on their positions). This has no effect on the toast activity view,
+     which operates independently of normal toast views. Default is `false`.
+     
+     */
+    public var isQueueEnabled = false
+    
+    /**
+     The default duration. Used for the `makeToast` and
+     `showToast` methods that don't require an explicit duration.
+     Default is 3.0.
+     
+     */
+    public var duration: TimeInterval = 3.0
+    
+    /**
+     Sets the default position. Used for the `makeToast` and
+     `showToast` methods that don't require an explicit position.
+     Default is `ToastPosition.Bottom`.
+     
+     */
+    public var position: ToastPosition = .bottom
+    
+}
+
+// MARK: - ToastPosition
+
+public enum ToastPosition {
+    case top
+    case center
+    case bottom
+    
+    fileprivate func centerPoint(forToast toast: UIView, inSuperview superview: UIView) -> CGPoint {
+        let topPadding: CGFloat = ToastManager.shared.style.verticalPadding + superview.csSafeAreaInsets.top
+        let bottomPadding: CGFloat = ToastManager.shared.style.verticalPadding + superview.csSafeAreaInsets.bottom
+        
+        switch self {
+        case .top:
+            return CGPoint(x: superview.bounds.size.width / 2.0, y: (toast.frame.size.height / 2.0) + topPadding)
+        case .center:
+            return CGPoint(x: superview.bounds.size.width / 2.0, y: superview.bounds.size.height / 2.0)
+        case .bottom:
+            return CGPoint(x: superview.bounds.size.width / 2.0, y: (superview.bounds.size.height - (toast.frame.size.height / 2.0)) - bottomPadding)
+        }
+    }
+}
+
+// MARK: - Private UIView Extensions
+
+private extension UIView {
+    
+    var csSafeAreaInsets: UIEdgeInsets {
+        if #available(iOS 11.0, *) {
+            return self.safeAreaInsets
+        } else {
+            return .zero
+        }
+    }
+    
+}
diff --git a/DeepChordsSdk_iOS/DeepChordsSdk/podfile b/DeepChordsSdk_iOS/DeepChordsSdk/podfile
new file mode 100644 (file)
index 0000000..2b7a0d4
--- /dev/null
@@ -0,0 +1,18 @@
+# source 'https://kkgithub.com/CocoaPods/Specs.git'
+source "https://gitee.com/mirrors/CocoaPods-Specs.git"
+platform :ios, '13.0'
+use_frameworks!
+
+target 'DeepChordsSdk' do
+  use_frameworks!
+  pod 'SocketRocket'
+end
+
+workspace 'DeepChordsSdk'
+project 'Example/Example.xcodeproj'
+target 'Example' do
+    pod 'SnapKit', '~> 5.7.0'
+    pod 'IQKeyboardManagerSwift'
+    pod 'Toast-Swift'
+    pod 'SocketRocket'
+end
diff --git a/DeepChordsSdk_iOS/document/豆包APP自定义协议.txt b/DeepChordsSdk_iOS/document/豆包APP自定义协议.txt
new file mode 100644 (file)
index 0000000..c0f0508
--- /dev/null
@@ -0,0 +1,165 @@
+\r
+UUID/AE30     AE03/WRITE_WITHOUT_RESPONSE   AE04/NOTIFY \r
+\r
+\r
+\r
+BYTE0 :0xBA\r
+BYTE1 :CMD\r
+BYTE2 :DATA\r
+BYTE3:DATA_LEN\r
+BYTE4:CRC\r
+\r
+CRC:\r
+static u8 chargestore_crc8(u8 *ptr, u8 len)\r
+{\r
+    u8 i, crc;\r
+    crc = 0;\r
+    while (len--) {\r
+        crc ^= *ptr++;\r
+        for (i = 0; i < 8; i++) {\r
+            if (crc & 0x01) {\r
+                crc = (crc >> 1) ^ 0x8c;\r
+            } else {\r
+                crc >>= 1;\r
+            }\r
+        }\r
+    }\r
+    return crc;\r
+}\r
+\r
+\r
+CMD:\r
+0x01 代表设置多点连接  DATA:0x00表示关闭多点连接 0x01表示打开多点连接\r
+ (例:APP下发 0xBA 0x01 0x01 0x01 CRC  耳机开启空间音频的功能回复 0xBA 0x01 0x01 0x01 CRC)\r
+0x02 代表获取多点连接  DATA:0x00表示关闭多点连接 0x01表示打开多点连接\r
+(例:APP下发 0xBA 0x02 0x00 0x00 CRC  耳机多点连接功能开启的话回复 0xBA 0x02 0x01 0x01 CRC)\r
+0x03 代表设置空间音频  DATA:0x00表示关闭空间音频 0x01表示打开空间音频\r
+ (例:APP下发 0xBA 0x03 0x01 0x01 CRC  耳机开启空间音频的功能回复 0xBA 0x03 0x01 0x01 CRC)\r
+0x04 代表获取空间音频  DATA:0x00表示关闭空间音频 0x01表示打开空间音频\r
+ (例:APP下发 0xBA 0x04 0x00 0x00 CRC  耳机空间音频功能开启的话回复 0xBA 0x04 0x01 0x01 CRC)\r
+\r
+0x05 代表获取设备ID  DATA:0x00 注:TWS有连接记录返回左右耳 TWS未连接过只返回单耳另一个信息都为0XFF\r
+ (例:APP下发 0xBA 0x05 0x00 0x00 CRC  耳机回复设备ID: 0xBA 0x05           \r
+0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF(左耳16字节) 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF(右耳16字节)0x20 CRC)\r
+\r
+0x06 开MIC(OPUS传输)  DATA:0x01(预留定义豆包AI)\r
+ (例:APP下发 0xBA 0x06 0x01 0x01 CRC  耳机回复设备0xBA 0x06       0x01 0x01 CRC)\r
+\r
+\r
+0x07 关MIC(OPUS传输)  DATA:0x01(预留定义豆包AI)\r
+ (例:APP下发 0xBA 0x07 0x01 0x01 CRC  耳机回复设备0xBA 0x07       0x01 0x01 CRC)\r
+0x08  获取设备名称(UTF-8)\r
+       例:APP下发 0xBA 0x08 0x00 0x00 CRC  耳机回复:假设蓝牙名EARPHONE 0xBA 0x08 0x​​45(E) 0x41(A) 0x52(R) 0x50(P) 0x48(H) 0x4F(O) 0x4E(N) 0x45(E)  0x08(数据长度) CRC \r
+\r
+0x09  获取电量(左耳/右耳)\r
+例:APP下发 0xBA 0x09 0x00 0x00 CRC  耳机回复: 0xBA 0x09 0x00(左耳) 0x64(100电量) 0x01(右耳) 0x64(100电量) 0x04(数据长度) CRC\r
+\r
+0x0A  获取软件版本,硬件版本\r
+例:APP下发 0xBA 0x0A 0x00(软件版本) 0x01 CRC  耳机回复:假设软件版本(1.0.1) 0xBA 0x0A 0x49(1) 0x46(.) 0x48(0) 0x46(.) 0x49(1) 0x05(数据长度) CRC\r
+例:APP下发 0xBA 0x0A 0x01(硬件版本) 0x01 CRC  耳机回复:假设硬件版本(1.0.0) 0xBA 0x0A 0x49(1) 0x46(.) 0x48(0) 0x46(.) 0x48(0) 0x05(数据长度) CRC\r
+0x0B  查找耳机(耳机声音播放/停止)\r
+例:APP下发 0xBA 0x0A 0x00(关闭查找音) 0x01 CRC  耳机回复:0xBA 0x0A 0x00(关闭查找音) 0x01 CRC\r
+例:APP下发 0xBA 0x0A 0x01(打开查找音) 0x01 CRC  耳机回复:0xBA 0x0A 0x01(打开查找音) 0x01 CRC \r
+0x0C 设置EQ\r
+\r
+\r
+用户在APP设置耳机按键自定义功能\r
+BYTE0 :0x05\r
+BYTE1:DATA1\r
+BYTE2:DATA2\r
+BYTE3:DATA3\r
+BYTE1 :CMD\r
+BYTE4:CRC\r
+\r
+CRC:\r
+static u8 chargestore_crc8(u8 *ptr, u8 len)\r
+{\r
+    u8 i, crc;\r
+    crc = 0;\r
+    while (len--) {\r
+        crc ^= *ptr++;\r
+        for (i = 0; i < 8; i++) {\r
+            if (crc & 0x01) {\r
+                crc = (crc >> 1) ^ 0x8c;\r
+            } else {\r
+                crc >>= 1;\r
+            }\r
+        }\r
+    }\r
+    return crc;\r
+}\r
+\r
+\r
+DATA1:\r
+   Lift = 0x00\r
+   Right = 0x01\r
+\r
+DATA2:\r
+   butten0 = 0x00\r
+   butten1 = 0x01\r
+   butten2 = 0x02\r
+   butten3 = 0x03\r
+   butten4 = 0x04\r
+   \r
+\r
+DATA3:\r
+按键操作类型定义:\r
+    KEY_ACTION_SINGLE_CLICK = 0x01  // 单击\r
+    KEY_ACTION_LONG_PRESS = 0x02    // 长按\r
+    KEY_ACTION_DOUBLE_CLICK = 0x03  // 双击  \r
+    KEY_ACTION_TRIPLE_CLICK = 0x04  // 三击\r
+\r
+CMD:\r
+按键功能类型定义:\r
+    KEY_TYPE_NONE = 0x00       // 无功能\r
+    KEY_TYPE_PREV = 0x03       // 上一曲\r
+    KEY_TYPE_NEXT = 0x04       // 下一曲  \r
+    TYPE_PP = 0x05         // 播放/暂停\r
+    TYPE_ANSWER_CALL = 0x06 // 接听电话\r
+    KEY_TYPE_HANG_UP = 0x07    // 挂断电话\r
+    KEY_TYPE_CALL_BACK = 0x08  // 回拨\r
+    KEY_TYPE_INC_VOICE = 0x09  // 音量增加\r
+    KEY_TYPE_DESC_VOICE = 0x0A // 音量减少\r
+    KEY_TYPE_TAKE_PHOTO = 0x0B // 拍照\r
+    KEY_TYPE_SIRI = 0x0C       // 语音助手\r
+    KEY_TYPE_ANC_VOICE = 0xFF  // ANC/通透\r
+\r
+(例:设置左耳的按键1为单击是播放功能\r
+           APP下发 0x05 0x00 0x01 0x01 0x05 CRC        耳机设置成功后回复0x05 0x00 0x01 0x01 0x05 CRC)\r
+\r
+\r
+\r
+按键按下后上报通知给到APP\r
+Button Notifications \r
+Notification ID: 0x7B \r
+Payload: \r
+Byte 0: JieLi button ID \r
+0: Earbuds power left or headset button #0 \r
+1: Earbuds power right or headset button #1 \r
+2:headset button #2\r
+3:headset button #3 \r
+4:headset button #4 \r
+5:headset button #5 \r
+Byte 1: JieLi gesture ID \r
+0: Click \r
+1: Hold Up \r
+2: Double click \r
+3: Triple click \r
+Byte 2: JieLi command ID \r
+0: No action \r
+3: Previous \r
+4: Next \r
+5: Play/pause \r
+6: Take call \r
+7: End call \r
+9: Volume up \r
+10: Volume down\r
+11: Remote up \r
+12: Assistant toggle \r
+0xFF: ANC toggle\r
+\r
+\r
+\r
+\r
+\r
+\r