Browse Source

Merge branch 'develop_PDFReaderProNew' of git.kdan.cc:Mac_PDF/PDF_Office into develop_PDFReaderProNew

tangchao 1 year ago
parent
commit
440365cdf6
24 changed files with 1990 additions and 9 deletions
  1. 86 0
      PDF Office/PDF Master.xcodeproj/project.pbxproj
  2. 170 0
      PDF Office/PDF Master.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  3. 3 3
      PDF Office/PDF Master/Class/Purchase/DMG/KMPurchaseLimitWindowController.swift
  4. 6 6
      PDF Office/PDF Master/Class/Purchase/DMG/Verification/VerificationManager/VerificationManager.h
  5. 66 0
      PDF Office/PDF Master/Class/Purchase/IAPProductsManager.h
  6. 829 0
      PDF Office/PDF Master/Class/Purchase/IAPProductsManager.m
  7. 1 0
      PDF Office/PDF Master/PDF_Master DMG-Bridging-Header.h
  8. 1 0
      PDF Office/PDF Master/PDF_Master Pro-Bridging-Header.h
  9. 1 0
      PDF Office/PDF Master/PDF_Master-Bridging-Header.h
  10. BIN
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/FirebaseABTesting
  11. 83 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Headers/FIRExperimentController.h
  12. 66 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Headers/FIRLifecycleEvents.h
  13. 16 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Headers/FirebaseABTesting.h
  14. 20 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Info.plist
  15. 11 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Modules/module.modulemap
  16. BIN
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/FirebaseRemoteConfig
  17. 290 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers/FIRRemoteConfig.h
  18. 17 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers/FirebaseRemoteConfig.h
  19. 20 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Info.plist
  20. 11 0
      PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Modules/module.modulemap
  21. 30 0
      PDF Office/PDF Master/Third Pard Library/RemoteConfig /DMGRemoteConfigDefaults.plist
  22. 195 0
      PDF Office/PDF Master/Third Pard Library/RemoteConfig /KMFirebaseRemoteConfig.swift
  23. 34 0
      PDF Office/PDF Master/Third Pard Library/RemoteConfig /ProRemoteConfigDefaults.plist
  24. 34 0
      PDF Office/PDF Master/Third Pard Library/RemoteConfig /RemoteConfigDefaults.plist

+ 86 - 0
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -2346,6 +2346,24 @@
 		ADFCEB362B4F78220001EBAF /* KMFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB352B4F78220001EBAF /* KMFile.swift */; };
 		ADFCEB372B4F78220001EBAF /* KMFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB352B4F78220001EBAF /* KMFile.swift */; };
 		ADFCEB382B4F78220001EBAF /* KMFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB352B4F78220001EBAF /* KMFile.swift */; };
+		ADFCEB3C2B4FB8C90001EBAF /* FirebaseRemoteConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADFCEB3A2B4FB8C80001EBAF /* FirebaseRemoteConfig.framework */; };
+		ADFCEB3D2B4FB8C90001EBAF /* FirebaseRemoteConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADFCEB3A2B4FB8C80001EBAF /* FirebaseRemoteConfig.framework */; };
+		ADFCEB3E2B4FB8C90001EBAF /* FirebaseRemoteConfig.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADFCEB3A2B4FB8C80001EBAF /* FirebaseRemoteConfig.framework */; };
+		ADFCEB3F2B4FB8C90001EBAF /* FirebaseABTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADFCEB3B2B4FB8C80001EBAF /* FirebaseABTesting.framework */; };
+		ADFCEB402B4FB8C90001EBAF /* FirebaseABTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADFCEB3B2B4FB8C80001EBAF /* FirebaseABTesting.framework */; };
+		ADFCEB412B4FB8C90001EBAF /* FirebaseABTesting.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ADFCEB3B2B4FB8C80001EBAF /* FirebaseABTesting.framework */; };
+		ADFCEB482B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB442B4FBA430001EBAF /* RemoteConfigDefaults.plist */; };
+		ADFCEB492B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB442B4FBA430001EBAF /* RemoteConfigDefaults.plist */; };
+		ADFCEB4A2B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB442B4FBA430001EBAF /* RemoteConfigDefaults.plist */; };
+		ADFCEB4B2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB452B4FBA430001EBAF /* ProRemoteConfigDefaults.plist */; };
+		ADFCEB4C2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB452B4FBA430001EBAF /* ProRemoteConfigDefaults.plist */; };
+		ADFCEB4D2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB452B4FBA430001EBAF /* ProRemoteConfigDefaults.plist */; };
+		ADFCEB512B4FBA440001EBAF /* DMGRemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB472B4FBA430001EBAF /* DMGRemoteConfigDefaults.plist */; };
+		ADFCEB522B4FBA440001EBAF /* DMGRemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB472B4FBA430001EBAF /* DMGRemoteConfigDefaults.plist */; };
+		ADFCEB532B4FBA440001EBAF /* DMGRemoteConfigDefaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = ADFCEB472B4FBA430001EBAF /* DMGRemoteConfigDefaults.plist */; };
+		ADFCEB552B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */; };
+		ADFCEB562B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */; };
+		ADFCEB572B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */; };
 		BB00300F298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */; };
 		BB003010298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */; };
 		BB003011298CA383002DD1A0 /* KMPreferenceSegementControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */; };
@@ -2673,6 +2691,9 @@
 		BB1AEF3529F937A50048D179 /* PDF Master User Guide.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BB1AEF3429F937A50048D179 /* PDF Master User Guide.pdf */; };
 		BB1AEF3629F937A50048D179 /* PDF Master User Guide.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BB1AEF3429F937A50048D179 /* PDF Master User Guide.pdf */; };
 		BB1AEF3729F937A60048D179 /* PDF Master User Guide.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BB1AEF3429F937A50048D179 /* PDF Master User Guide.pdf */; };
+		BB1B0A9D2B4FB88100889528 /* IAPProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BB1B0A9B2B4FB88000889528 /* IAPProductsManager.m */; };
+		BB1B0A9E2B4FB88100889528 /* IAPProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BB1B0A9B2B4FB88000889528 /* IAPProductsManager.m */; };
+		BB1B0A9F2B4FB88100889528 /* IAPProductsManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BB1B0A9B2B4FB88000889528 /* IAPProductsManager.m */; };
 		BB1BFF5D2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1BFF5C2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift */; };
 		BB1BFF5E2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1BFF5C2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift */; };
 		BB1BFF5F2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BB1BFF5C2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift */; };
@@ -5489,6 +5510,12 @@
 		ADF9ED3229A850D200C4A943 /* KMAccountInfoView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMAccountInfoView.xib; sourceTree = "<group>"; };
 		ADFCEB312B4F78150001EBAF /* KMFileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFileManager.swift; sourceTree = "<group>"; };
 		ADFCEB352B4F78220001EBAF /* KMFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFile.swift; sourceTree = "<group>"; };
+		ADFCEB3A2B4FB8C80001EBAF /* FirebaseRemoteConfig.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = FirebaseRemoteConfig.framework; sourceTree = "<group>"; };
+		ADFCEB3B2B4FB8C80001EBAF /* FirebaseABTesting.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = FirebaseABTesting.framework; sourceTree = "<group>"; };
+		ADFCEB442B4FBA430001EBAF /* RemoteConfigDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = RemoteConfigDefaults.plist; sourceTree = "<group>"; };
+		ADFCEB452B4FBA430001EBAF /* ProRemoteConfigDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = ProRemoteConfigDefaults.plist; sourceTree = "<group>"; };
+		ADFCEB472B4FBA430001EBAF /* DMGRemoteConfigDefaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = DMGRemoteConfigDefaults.plist; sourceTree = "<group>"; };
+		ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMFirebaseRemoteConfig.swift; sourceTree = "<group>"; };
 		BB00300E298CA383002DD1A0 /* KMPreferenceSegementControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceSegementControl.swift; sourceTree = "<group>"; };
 		BB003013298CA446002DD1A0 /* KMPreferenceGeneralController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPreferenceGeneralController.swift; sourceTree = "<group>"; };
 		BB003014298CA446002DD1A0 /* KMPreferenceGeneralController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMPreferenceGeneralController.xib; sourceTree = "<group>"; };
@@ -5664,6 +5691,8 @@
 		BB1A916D2AFB7871005E5FD8 /* KMConvertWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMConvertWindowController.xib; sourceTree = "<group>"; };
 		BB1A91722AFB8D95005E5FD8 /* KMBookletMaskView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBookletMaskView.swift; sourceTree = "<group>"; };
 		BB1AEF3429F937A50048D179 /* PDF Master User Guide.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = "PDF Master User Guide.pdf"; sourceTree = "<group>"; };
+		BB1B0A9B2B4FB88000889528 /* IAPProductsManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IAPProductsManager.m; sourceTree = "<group>"; };
+		BB1B0A9C2B4FB88000889528 /* IAPProductsManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IAPProductsManager.h; sourceTree = "<group>"; };
 		BB1BFF5C2AE9F1FF003EB179 /* KMBatchOperateBaseWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMBatchOperateBaseWindowController.swift; sourceTree = "<group>"; };
 		BB1BFF602AE9FA6C003EB179 /* KMBatchOperateBaseWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMBatchOperateBaseWindowController.xib; sourceTree = "<group>"; };
 		BB1BFF642AE9FBA7003EB179 /* KMBatchOperateWindowController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = KMBatchOperateWindowController.xib; sourceTree = "<group>"; };
@@ -6373,6 +6402,7 @@
 				BBB9B339299A5FD1004F3235 /* ObjectiveDropboxOfficial.framework in Frameworks */,
 				BB9DCC9C2A0A104E0024A6F1 /* ComDocumentAIKit.framework in Frameworks */,
 				BBF5D4A52A5FD2A000D09418 /* AppCenterAnalytics.framework in Frameworks */,
+				ADFCEB3F2B4FB8C90001EBAF /* FirebaseABTesting.framework in Frameworks */,
 				89D9896328FD23AE003A3E87 /* PDFKit.framework in Frameworks */,
 				9F00CF672A386D8D00AC462E /* nanopb.framework in Frameworks */,
 				AD8DD2932A972486007CC9D0 /* libDocumentAI.3.2.2.dylib in Frameworks */,
@@ -6388,6 +6418,7 @@
 				9F00CF4D2A38655500AC462E /* FirebaseCore.framework in Frameworks */,
 				9F00CF582A3866E800AC462E /* GoogleUtilities.framework in Frameworks */,
 				9F00CF7A2A386DC400AC462E /* FirebaseCoreDiagnostics.framework in Frameworks */,
+				ADFCEB3C2B4FB8C90001EBAF /* FirebaseRemoteConfig.framework in Frameworks */,
 				9F00CF802A386DC500AC462E /* GoogleDataTransport.framework in Frameworks */,
 				ADA08A8629F14336009B2A7B /* ComPDFKit_Conversion.framework in Frameworks */,
 			);
@@ -6414,8 +6445,10 @@
 				9F00CF682A386D8D00AC462E /* nanopb.framework in Frameworks */,
 				9F00CF512A38655500AC462E /* FirebaseAnalytics.framework in Frameworks */,
 				BB9DCC8A2A09FC770024A6F1 /* libopencv_world.4.2.dylib in Frameworks */,
+				ADFCEB402B4FB8C90001EBAF /* FirebaseABTesting.framework in Frameworks */,
 				AD8DD2942A972486007CC9D0 /* libDocumentAI.3.2.2.dylib in Frameworks */,
 				AD8DD29C2A972492007CC9D0 /* libpaddle2onnx.1.0.7.dylib in Frameworks */,
+				ADFCEB3D2B4FB8C90001EBAF /* FirebaseRemoteConfig.framework in Frameworks */,
 				ADE3C1C929A5A75E00793B13 /* AFNetworking.framework in Frameworks */,
 				9F00CF612A386C7400AC462E /* FirebaseInstallations.framework in Frameworks */,
 				9F00CF7B2A386DC500AC462E /* FirebaseCoreDiagnostics.framework in Frameworks */,
@@ -6462,6 +6495,7 @@
 				9F00CF522A38655500AC462E /* FirebaseAnalytics.framework in Frameworks */,
 				BBD7FDFB2A13210700F96075 /* AFNetworking.framework in Frameworks */,
 				9F00CF5A2A3866E900AC462E /* GoogleUtilities.framework in Frameworks */,
+				ADFCEB412B4FB8C90001EBAF /* FirebaseABTesting.framework in Frameworks */,
 				89D9896528FD23BF003A3E87 /* PDFKit.framework in Frameworks */,
 				89752DA72936ECE4003FF08E /* Masonry.framework in Frameworks */,
 				BBD54ECD2A1C53B20012A230 /* ComDocumentAIKit.framework in Frameworks */,
@@ -6477,6 +6511,7 @@
 				9F00CF622A386C7400AC462E /* FirebaseInstallations.framework in Frameworks */,
 				BB88401E2A132C6B0062446B /* ObjectiveDropboxOfficial.framework in Frameworks */,
 				BBD7FDFD2A13210A00F96075 /* ComPDFKit_Conversion.framework in Frameworks */,
+				ADFCEB3E2B4FB8C90001EBAF /* FirebaseRemoteConfig.framework in Frameworks */,
 				AD8DD29D2A972492007CC9D0 /* libpaddle2onnx.1.0.7.dylib in Frameworks */,
 				9F00CF4F2A38655500AC462E /* FirebaseCore.framework in Frameworks */,
 			);
@@ -6607,6 +6642,7 @@
 		89752DA22936ECD5003FF08E /* Third Pard Library */ = {
 			isa = PBXGroup;
 			children = (
+				ADFCEB422B4FBA430001EBAF /* RemoteConfig  */,
 				ADDDCE1A2B43A32A005B4AB5 /* AppSandboxFileAccess */,
 				9FC444F82AA5F7D600D7187C /* ZipArchive.framework */,
 				AD032CB62A4E6A7E00F1D745 /* Starscream.framework */,
@@ -6889,6 +6925,7 @@
 		9F00CF4A2A38655300AC462E /* FirebaseAnalytics */ = {
 			isa = PBXGroup;
 			children = (
+				ADFCEB392B4FB8C80001EBAF /* FirebaseRemoteConfig */,
 				9F00CF762A386DC400AC462E /* GoogleDataTransport.framework */,
 				9F00CF732A386DC400AC462E /* GoogleAppMeasurement.framework */,
 				9F00CF4B2A38655300AC462E /* FirebaseCore.framework */,
@@ -9263,6 +9300,26 @@
 			path = KMFile;
 			sourceTree = "<group>";
 		};
+		ADFCEB392B4FB8C80001EBAF /* FirebaseRemoteConfig */ = {
+			isa = PBXGroup;
+			children = (
+				ADFCEB3A2B4FB8C80001EBAF /* FirebaseRemoteConfig.framework */,
+				ADFCEB3B2B4FB8C80001EBAF /* FirebaseABTesting.framework */,
+			);
+			path = FirebaseRemoteConfig;
+			sourceTree = "<group>";
+		};
+		ADFCEB422B4FBA430001EBAF /* RemoteConfig  */ = {
+			isa = PBXGroup;
+			children = (
+				ADFCEB542B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift */,
+				ADFCEB442B4FBA430001EBAF /* RemoteConfigDefaults.plist */,
+				ADFCEB452B4FBA430001EBAF /* ProRemoteConfigDefaults.plist */,
+				ADFCEB472B4FBA430001EBAF /* DMGRemoteConfigDefaults.plist */,
+			);
+			path = "RemoteConfig ";
+			sourceTree = "<group>";
+		};
 		BB00300D298CA367002DD1A0 /* View */ = {
 			isa = PBXGroup;
 			children = (
@@ -10948,6 +11005,8 @@
 		BBA9220F2B4E77BA0061057A /* Purchase */ = {
 			isa = PBXGroup;
 			children = (
+				BB1B0A9C2B4FB88000889528 /* IAPProductsManager.h */,
+				BB1B0A9B2B4FB88000889528 /* IAPProductsManager.m */,
 				BBA922112B4E77D10061057A /* Appstore */,
 				BBA922102B4E77CA0061057A /* DMG */,
 				BBA9221B2B4E7AF50061057A /* Category */,
@@ -12117,6 +12176,7 @@
 				ADDF83742B391A5D00A81A4E /* CDSignatureDrawViewController.xib in Resources */,
 				AD3AAD792B0DCEB600DE5FE7 /* KMCompareSaveView.xib in Resources */,
 				ADBC2D15299CCD10006280C8 /* KMTextfieldButton.xib in Resources */,
+				ADFCEB4B2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */,
 				BBD1F77F296F9BE000343885 /* KMPageEditSettingBaseWindowController.xib in Resources */,
 				BBB3769E2B10A7FD009539CC /* a_4a.png in Resources */,
 				BB24D4AA2977BE6700041659 /* KMRedactConfirmWindowController.xib in Resources */,
@@ -12148,6 +12208,7 @@
 				ADE86AB12B03438400414DFA /* KMWatermarkWindowController.xib in Resources */,
 				ADEC7A84299397F8009A8256 /* SF-Pro-Text-Semibold.otf in Resources */,
 				ADDF83682B391A5C00A81A4E /* DSignatureSaveFolderViewController.xib in Resources */,
+				ADFCEB512B4FBA440001EBAF /* DMGRemoteConfigDefaults.plist in Resources */,
 				ADDF834A2B391A5C00A81A4E /* DSignatureDetailsViewController.xib in Resources */,
 				AD1CA4342A0640FC0070541F /* KMAnnotationScreenHeadView.xib in Resources */,
 				AD62606E2A9D968A006C6413 /* KMEditPDFAssets.xcassets in Resources */,
@@ -12385,6 +12446,7 @@
 				BB897231294B08DE0045787C /* KMWatermarkViewController.xib in Resources */,
 				9F56648A2988B16F00020985 /* KMTextfieldVC.xib in Resources */,
 				AD3AAD452B0B7B7B00DE5FE7 /* KMCompareThumbView.xib in Resources */,
+				ADFCEB482B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */,
 				9FDD0FA22952FF4D000C4DAD /* $themes.json in Resources */,
 				BB69C95C299116FD0001A9B1 /* five_line_score.pdf in Resources */,
 				BBFE6E702930D9C600142C01 /* KMMergeSettingWindowController.xib in Resources */,
@@ -12552,6 +12614,7 @@
 				9F0201762A1B488C00C9B673 /* KMAITranslationVC.xib in Resources */,
 				9F72D20C2994BDAF00DCACF1 /* KMNotificationVC.xib in Resources */,
 				9F512CCB2B4640AB00EC0BC3 /* KMPageDisplayCustomThemesCollectionViewItem.xib in Resources */,
+				ADFCEB492B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */,
 				9F3D819729A33A290087B5AD /* KMDesignDropdown.xib in Resources */,
 				BB03D6912B01C7AB008C9976 /* KMPDFEditInsertBlankPageWindow.xib in Resources */,
 				BBFE6E792930E53000142C01 /* KMMergePopoverViewController.xib in Resources */,
@@ -12681,6 +12744,7 @@
 				BBA9223C2B4E97540061057A /* KMPurchaseLimitWindowController.xib in Resources */,
 				ADE8BC3429F9261900570F89 /* KMSearchCellView.xib in Resources */,
 				8931684D296E436B0073EA59 /* KMSignatureWindowController.xib in Resources */,
+				ADFCEB4C2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */,
 				AD58F4062B14954B00299EE0 /* KMCompareTextHeaderView.xib in Resources */,
 				9F8539DB294318D600DF644E /* TabsImage.xcassets in Resources */,
 				BB52372B29C313CA00663BD7 /* KMAnnotationPropertyBaseController.xib in Resources */,
@@ -12871,6 +12935,7 @@
 				BB5F8A1A29BB15AD00365ADB /* pic_mail.pdf in Resources */,
 				BBA922162B4E783F0061057A /* KMPurchaseCompareDMGWindowController.xib in Resources */,
 				ADE787A62AA5A833002EC85A /* KMAccountExceptionWindowController.xib in Resources */,
+				ADFCEB522B4FBA440001EBAF /* DMGRemoteConfigDefaults.plist in Resources */,
 				BB183DD22B4EAD5400F99C7E /* Ubuntu-Medium.ttf in Resources */,
 				9F8539CF29430BF300DF644E /* KMBrowserWindowController.xib in Resources */,
 				ADE86AA12B031FDB00414DFA /* KMCompareWindowController.xib in Resources */,
@@ -13024,6 +13089,7 @@
 				BBFE6E722930D9C600142C01 /* KMMergeSettingWindowController.xib in Resources */,
 				ADDF83762B391A5D00A81A4E /* CDSignatureDrawViewController.xib in Resources */,
 				BBF62C762B0347D1007B7E86 /* SplitWindowController.xib in Resources */,
+				ADFCEB4D2B4FBA440001EBAF /* ProRemoteConfigDefaults.plist in Resources */,
 				ADC63E4D2A49BEDD00854E02 /* KMSubscribeWaterMarkCollectionItem.xib in Resources */,
 				BB5DF1F62959C9F00025CDA1 /* KMHeaderFooterPropertyMainController.xib in Resources */,
 				AD3AAD722B0DCC6800DE5FE7 /* KMCompareSaveWindow.xib in Resources */,
@@ -13055,6 +13121,7 @@
 				9FF94F1629A7476000B1EF69 /* KMDesignPropertySelector.xib in Resources */,
 				ADE8BC3529F9261900570F89 /* KMSearchCellView.xib in Resources */,
 				ADE787A72AA5A833002EC85A /* KMAccountExceptionWindowController.xib in Resources */,
+				ADFCEB532B4FBA440001EBAF /* DMGRemoteConfigDefaults.plist in Resources */,
 				ADDF836A2B391A5C00A81A4E /* DSignatureSaveFolderViewController.xib in Resources */,
 				ADDF834C2B391A5C00A81A4E /* DSignatureDetailsViewController.xib in Resources */,
 				BB3BA9082A13684A00623C08 /* Assets.xcassets in Resources */,
@@ -13292,6 +13359,7 @@
 				ADCFFC0829C04617007D3657 /* BOTA.xcassets in Resources */,
 				8931684E296E436B0073EA59 /* KMSignatureWindowController.xib in Resources */,
 				ADBC2D00299CA6C7006280C8 /* KMPrintDuplexPrintingSetView.xib in Resources */,
+				ADFCEB4A2B4FBA440001EBAF /* RemoteConfigDefaults.plist in Resources */,
 				BB51074429A61B4100978662 /* ProgressSheet.xib in Resources */,
 				89316857296E45CA0073EA59 /* KMImageAccessoryController.xib in Resources */,
 				9FBA0EEB28FFC2FE001117AF /* Image.xcassets in Resources */,
@@ -13845,6 +13913,7 @@
 				BB162E97295062CD0088E9D1 /* KMPageRangeTools.swift in Sources */,
 				BB24FFDD2B28578C00A59054 /* KMTTSWindowController.swift in Sources */,
 				ADD1B6EC2946C04C00C3FFF7 /* KMPrintChoosePageSizePamphletView.swift in Sources */,
+				ADFCEB552B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */,
 				ADBC2D11299CCD05006280C8 /* KMTextfieldButton.swift in Sources */,
 				9FCFEC982AD14EEF00EAD2CB /* KMMailHelper.swift in Sources */,
 				ADAFDA302AE8E45000F084BC /* KMAdvertisementConfig.swift in Sources */,
@@ -13949,6 +14018,7 @@
 				AD0FA4F029A8580D00EDEB50 /* KMComparativeTableView.swift in Sources */,
 				89D2D2DE294C451400BFF5FE /* KMThumbnailViewController.swift in Sources */,
 				ADB2D6ED2947415E0029D2B3 /* KMPrintPaperSetView.swift in Sources */,
+				BB1B0A9D2B4FB88100889528 /* IAPProductsManager.m in Sources */,
 				BB147026299DC0D100784A6A /* OIDTokenRequest.m in Sources */,
 				BB3EAEAD293E3D6000D92407 /* KMConvertBaseWindowController.swift in Sources */,
 				BB2F61582966B69D001CB369 /* KMWatermarkPropertyHomeController.swift in Sources */,
@@ -14606,6 +14676,7 @@
 				BB74DA7C2AC41DE9006EDFE7 /* NSString+KMExtension.swift in Sources */,
 				ADDEEA972AD7A0F300EF675D /* TextFieldFormatter.swift in Sources */,
 				BB3198172AC55E6D00107371 /* CPDFDocument+KMExtension.swift in Sources */,
+				BB1B0A9E2B4FB88100889528 /* IAPProductsManager.m in Sources */,
 				BBA00ACA2B1604D30043D903 /* KMBotaTableRowView.swift in Sources */,
 				BBEC00C8295C319400A26C98 /* KMBatesManager.swift in Sources */,
 				ADA9102B2A272CE2003352F0 /* KMEditPDFTextManager.swift in Sources */,
@@ -14727,6 +14798,7 @@
 				BBF62C692B033B34007B7E86 /* KMPDFEditExtractWindow.swift in Sources */,
 				9FDD0F892952FCC6000C4DAD /* KMCompLightParser.swift in Sources */,
 				BBD1F78C296FACA300343885 /* KMPageEditExtractSettingView.swift in Sources */,
+				ADFCEB562B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */,
 				ADBC375129CAE27900D93208 /* KMComparativeOutlineRowView.swift in Sources */,
 				AD8DD2A42A9C35B2007CC9D0 /* KMThumbnailManager.swift in Sources */,
 				89D2D2E3294C452B00BFF5FE /* KMPDFThumbnailView.swift in Sources */,
@@ -15619,6 +15691,7 @@
 				BB3D97182B3023C5007094C8 /* KMCustomButton.swift in Sources */,
 				BBFEF71D2B3A784200C28AC0 /* KMSystemEditMenu.swift in Sources */,
 				BB6B4C0A292F53CE0071CA06 /* KMMergeFileModel.swift in Sources */,
+				BB1B0A9F2B4FB88100889528 /* IAPProductsManager.m in Sources */,
 				9F0CB4B72977BC1000007028 /* KMPropertiesPanelPreviewSubVC.swift in Sources */,
 				BB3A81B72AC2C0F4006FC66C /* NSObject+KMExtension.swift in Sources */,
 				BB88106F2B4F771D00AFA63E /* KMVerificationInfoViewController.m in Sources */,
@@ -16424,6 +16497,7 @@
 				ADA08A8C29F21A53009B2A7B /* KMPDFViewAnnotationOnceModeStore.swift in Sources */,
 				AD5999442AD8DC2000412F8B /* KMDynamicStampViewController.swift in Sources */,
 				BBC347FF295448DE008D2CD1 /* KMWatermarkTemplateModel.swift in Sources */,
+				ADFCEB572B4FBADB0001EBAF /* KMFirebaseRemoteConfig.swift in Sources */,
 				BBD7FE042A13218F00F96075 /* KMWatermarkAdjectivePropertyBaseController.swift in Sources */,
 				BBC28F482B0F352000D73206 /* KMImageToolTipContext.swift in Sources */,
 				ADDF83702B391A5C00A81A4E /* CDSignatureTextViewController.swift in Sources */,
@@ -16783,6 +16857,8 @@
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
 				);
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_PREPROCESSOR_DEFINITIONS = (
@@ -16876,6 +16952,8 @@
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
 				);
 				GCC_C_LANGUAGE_STANDARD = gnu99;
 				GCC_PREPROCESSOR_DEFINITIONS = "VERSION_FREE=1";
@@ -17055,6 +17133,8 @@
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
 				);
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"DEBUG=1",
@@ -17181,6 +17261,8 @@
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
 				);
 				GCC_PREPROCESSOR_DEFINITIONS = "VERSION_PRO=1";
 				GENERATE_INFOPLIST_FILE = YES;
@@ -17424,6 +17506,8 @@
 					"$(PROJECT_DIR)/PDF\\ Master/Class/PDFWindowController/PDFSDK",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
 				);
 				GCC_PREPROCESSOR_DEFINITIONS = (
 					"DEBUG=1",
@@ -17599,6 +17683,8 @@
 					"$(PROJECT_DIR)/PDF\\ Master/Class/PDFWindowController/PDFSDK",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
 					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
+					"$(PROJECT_DIR)/PDF\\ Master/Third\\ Pard\\ Library/FirebaseAnalytics/FirebaseRemoteConfig",
 				);
 				GCC_PREPROCESSOR_DEFINITIONS = "VERSION_DMG=1";
 				GENERATE_INFOPLIST_FILE = YES;

+ 170 - 0
PDF Office/PDF Master.xcodeproj/xcuserdata/lizhe.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -6722,6 +6722,21 @@
                   endingLineNumber = "1511"
                   offsetFromSymbolStart = "19236">
                </Location>
+               <Location
+                  uuid = "D2E713CE-328E-4EC1-91DC-F6D927095512 - ec397d0f3b52cbb0"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "PDF_Master.KMMainViewController.defaultAnnotationPorpert(sender: __C.NSMenuItem) -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1510"
+                  endingLineNumber = "1510"
+                  offsetFromSymbolStart = "13328">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -15380,6 +15395,21 @@
                   endingLineNumber = "2946"
                   offsetFromSymbolStart = "160">
                </Location>
+               <Location
+                  uuid = "EC868E34-3125-4BF1-917C-B699A0192869 - 7f49856863f0ea9c"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #1 (Swift.Bool, Swift.Bool, Swift.Bool) -&gt; () in closure #1 @Sendable () async -&gt; () in PDF_Master.KMMainViewController.toolbarViewController(_: PDF_Master.KMToolbarViewController, shareFlatten: __C.NSMenuItem) -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "2945"
+                  endingLineNumber = "2945"
+                  offsetFromSymbolStart = "160">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -15693,6 +15723,21 @@
                   endingLineNumber = "3174"
                   offsetFromSymbolStart = "252">
                </Location>
+               <Location
+                  uuid = "EA21967B-634C-4850-8C77-13815B814BFE - 642a8aa40dfa2f38"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "(1) suspend resume partial function for closure #1 @Sendable () async -&gt; () in PDF_Master.KMMainViewController.clickChildTool(type: PDF_Master.KMToolbarType, index: Swift.Int) -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "3178"
+                  endingLineNumber = "3178"
+                  offsetFromSymbolStart = "5172">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -15771,6 +15816,21 @@
                   endingLineNumber = "2534"
                   offsetFromSymbolStart = "5032">
                </Location>
+               <Location
+                  uuid = "6C8D4B68-1D1A-4571-9B71-3FDAD415B289 - 44109b2654b4fb8a"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #1 (PDF_Master.KMPasswordInputWindowResult, Swift.Optional&lt;Swift.String&gt;) -&gt; () in PDF_Master.KMMainViewController.showPrintWindow(pageRange: PDF_Master.KMPrintPageRange) -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "2535"
+                  endingLineNumber = "2535"
+                  offsetFromSymbolStart = "1164">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -15865,6 +15925,21 @@
                   endingLineNumber = "3343"
                   offsetFromSymbolStart = "21944">
                </Location>
+               <Location
+                  uuid = "60D16BC6-1CB2-4C01-A490-001FDFD0443C - 400d753f438a1dd9"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #1 (Swift.Int) -&gt; () in closure #10 (__C.NSModalResponse) -&gt; () in closure #1 @Sendable () async -&gt; () in PDF_Master.KMMainViewController.clickChildTool(type: PDF_Master.KMToolbarType, index: Swift.Int) -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "3343"
+                  endingLineNumber = "3343"
+                  offsetFromSymbolStart = "2196">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -16226,6 +16301,21 @@
                   endingLineNumber = "3393"
                   offsetFromSymbolStart = "26252">
                </Location>
+               <Location
+                  uuid = "225836A8-1672-481E-A55E-CC1EEFE6073E - 642a8aa40dfa0371"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "(1) suspend resume partial function for closure #1 @Sendable () async -&gt; () in PDF_Master.KMMainViewController.clickChildTool(type: PDF_Master.KMToolbarType, index: Swift.Int) -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/PDFWindowController/ViewController/KMMainViewController+Action.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "3393"
+                  endingLineNumber = "3393"
+                  offsetFromSymbolStart = "23780">
+               </Location>
             </Locations>
          </BreakpointContent>
       </BreakpointProxy>
@@ -16803,5 +16893,85 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "1B540E62-5162-49F4-B069-ABE88BC88DD9"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/Home/ViewController/KMHomeViewController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "200"
+            endingLineNumber = "200"
+            landmarkName = "setup()"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "E675B819-D6C5-4011-852F-FBE30AF8CE35"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/Home/ViewController/KMHomeViewController.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "192"
+            endingLineNumber = "192"
+            landmarkName = "setup()"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "E675B819-D6C5-4011-852F-FBE30AF8CE35 - 740bbb176ffdea8"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #3 (PDF_Master.KMHomeContentView, PDF_Master.KMFile) -&gt; () in PDF_Master.KMHomeViewController.setup() -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/Home/ViewController/KMHomeViewController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "192"
+                  endingLineNumber = "192"
+                  offsetFromSymbolStart = "180">
+               </Location>
+               <Location
+                  uuid = "E675B819-D6C5-4011-852F-FBE30AF8CE35 - 740bbb176ffdea8"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "closure #3 (PDF_Master.KMHomeContentView, PDF_Master.KMFile) -&gt; () in PDF_Master.KMHomeViewController.setup() -&gt; ()"
+                  moduleName = "PDF Master"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Volumes/Data/Company/kdan/Projects/PDF%20Office/PDF%20Office/PDF%20Master/Class/Home/ViewController/KMHomeViewController.swift"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "192"
+                  endingLineNumber = "192"
+                  offsetFromSymbolStart = "56">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "A538466B-893A-46C1-89D4-E7209C54CBA8"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "PDF Master/Class/Home/ViewController/KMHomeViewController+Action.swift"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "320"
+            endingLineNumber = "320"
+            landmarkName = "openHistoryFilePath(url:)"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
    </Breakpoints>
 </Bucket>

+ 3 - 3
PDF Office/PDF Master/Class/Purchase/DMG/KMPurchaseLimitWindowController.swift

@@ -172,9 +172,9 @@ class KMPurchaseLimitWindowController: NSWindowController {
             }
             self.removeWaitingView(self.contendView)
             
-//            if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
-//                self.close()
-//            }
+            if IAPProductsManager.default().isAvailableAdvancedPDFToOffice() {
+                self.close()
+            }
         }
         self.addWaingView(self.contendView)
     }

+ 6 - 6
PDF Office/PDF Master/Class/Purchase/DMG/Verification/VerificationManager/VerificationManager.h

@@ -9,12 +9,12 @@
 //
 
 #import <Foundation/Foundation.h>
-#import "PDF_Master-Bridging-Header.h"
-#if VERSION_DMG
-#import <PDF_Master-Swift.h>
-#else
-#import <PDF_Master-Swift.h>
-#endif
+//#import "PDF_Master-Bridging-Header.h"
+//#if VERSION_DMG
+//#import <PDF_Master-Swift.h>
+//#else
+//#import <PDF_Master-Swift.h>
+//#endif
 
 
 #define kTestMode   0

+ 66 - 0
PDF Office/PDF Master/Class/Purchase/IAPProductsManager.h

@@ -0,0 +1,66 @@
+//
+//  IAPProductsManager.h
+//  PDF Reader Pro Edition
+//
+//  Created by 王帅 on 2017/7/10.
+//
+//
+
+#import <Foundation/Foundation.h>
+
+extern NSString * const KMIAPProductLoadedNotification;
+extern NSString * const KMIAPProductFailedNotification;
+extern NSString * const KMIAPProductPurchasedNotification;
+extern NSString * const KMIAPProductRestoreFailedNotification;
+extern NSString * const KMIAPProductRestoreFinishedNotification;
+extern NSString * const KMIAPSubscriptionLoadedNotification;
+
+@class SKProduct;
+
+@interface IAPProduct : NSObject
+
+@property (nonatomic,readonly) BOOL isSubscribed;
+
+@property (nonatomic,readonly) BOOL isOffers;
+@property (nonatomic,readonly) CGFloat offers;
+
+@property (nonatomic,readonly) BOOL originalPurchased;//针对订阅套餐,表示当前ID是否购买过,判断是否过期。
+
+@property (nonatomic, readonly) BOOL isTrialPeriod;//判断当前套餐是否试用过
+
+#if !VERSION_DMG
+@property (nonatomic,retain) SKProduct *product;
+#endif
+
+- (NSString *)price;
+- (NSString *)averagePrice;
+
+- (NSString *)offersPrice;
+- (NSString *)offersAveragePrice;
+
+@end
+
+@interface IAPProductsManager : NSObject
+
+@property (nonatomic,readonly) IAPProduct *monthProduct;
+@property (nonatomic,readonly) IAPProduct *newlyMonthProduct;
+@property (nonatomic,readonly) IAPProduct *allAccessProduct;
+@property (nonatomic,readonly) IAPProduct *PDFToOfficeProduct;
+
+@property (nonatomic,readonly) IAPProduct *DMGAllAccessProduct;
+@property (nonatomic,readonly) IAPProduct *DMGPDFToOfficeProduct;
+
++ (IAPProductsManager *)defaultManager;
+
+- (void)initIAP;
+
+- (void)loadAllProducts;
+
+- (void)loadProducts;
+- (void)makeProduct:(IAPProduct *)iapProduct;
+- (void)restoreSubscriptions;
+
+- (BOOL)isAvailableAllFunction;
+- (BOOL)isAvailableAdvancedPDFToOffice;
+
+@end

+ 829 - 0
PDF Office/PDF Master/Class/Purchase/IAPProductsManager.m

@@ -0,0 +1,829 @@
+//
+//  IAPProductsManager.m
+//  PDF Reader Pro Edition
+//
+//  Created by 王帅 on 2017/7/10.
+//
+//
+
+#import "IAPProductsManager.h"
+#if !VERSION_DMG
+#import <StoreKit/StoreKit.h>
+#endif
+
+#import "VerificationManager.h"
+#import "NSNULL+Filtration.h"
+
+NSString *const KMStoreLiteKitSecret = @"d8286a8909884e64b84d522305f07463";
+NSString *const KMStoreKitSecret = @"b88b5d687d1547c2ad3c4dd882dec9db";
+//NSString *const KMSandboxServer = @"https://sandbox.itunes.apple.com/verifyReceipt";
+//NSString *const KMItunesServer = @"https://buy.itunes.apple.com/verifyReceipt";
+
+NSString *const KMSandboxServer = @"http://test-store.kdan.cn:3019/api/subscriptions/verify_itunes";
+NSString *const KMItunesServer = @"https://store.filmagepro.com:3018/api/subscriptions/verify_itunes";
+NSString *const KMStoreReceipt = @"KMStoreReceiptKey";
+
+NSString * const KMMonthLicenseProductIdentifier = @"com.pdfreaderpro.mac_free.member.all_access_pack_6months.001";
+NSString * const KMNewMonthLicenseProductIdentifier = @"com.pdfreaderpro.mac_free.member.all_access_pack_new_6months.001";
+//NSString * const KMNewMonthLicenseProductIdentifier = @"com.pdftechnologies.pdfreader.mac.yearly.002.Test";
+NSString * const KMAllLicenseProductIdentifier = @"com.pdfreaderpro.mac_free.member.all_access_pack_permanent_license.001";
+NSString * const KMPDFToOfficeLicenseProductIdentifier = @"com.pdfreaderpro.mac.member.pdf_to_office_pack_permanent_license.001";
+
+NSString * const KMIAPProductLoadedNotification = @"KMIAPProductLoadedNotification";
+NSString * const KMIAPProductFailedNotification = @"KMIAPProductFailedNotification";
+NSString * const KMIAPProductPurchasedNotification = @"KMIAPProductPurchasedNotification";
+NSString * const KMIAPProductRestoreFailedNotification = @"KMIAPProductRestoreFailedNotification";
+NSString * const KMIAPProductRestoreFinishedNotification = @"KMIAPProductRestoreFinishedNotification";
+NSString * const KMIAPSubscriptionLoadedNotification = @"KMIAPSubscriptionLoadedNotification";
+
+@interface IAPProduct ()
+
+@property (nonatomic,assign) BOOL isSubscribed;
+
+@property (nonatomic,retain) NSNumber *priceNumber;
+
+@property (nonatomic,assign) BOOL isOffers;
+@property (nonatomic,assign) CGFloat offers;
+@property (nonatomic,retain) NSNumber *offersPriceNumber;
+
+@property (nonatomic,retain) NSString *productIdentifier;
+
+@property (nonatomic,assign) BOOL originalPurchased;//针对订阅套餐,表示当前ID是否购买过,判断是否过期。
+
+@property (nonatomic, assign) BOOL isTrialPeriod;//判断当前套餐是否试用过
+
+@end
+
+@implementation IAPProduct
+
+#pragma mark - Init Methods
+
+- (void)dealloc {
+    
+}
+
+#pragma mark - Public Methods
+
+- (NSString *)price {
+    NSString *price = nil;
+#if !VERSION_DMG
+    if (self.product.price) {
+        price = [self formattedPrice:NO];
+    } else {
+        price = [NSString stringWithFormat:@"USD $%0.2f", [self.priceNumber doubleValue]];
+#ifndef VERSION_DMG
+        // 获取产品价格信息
+        [[IAPProductsManager defaultManager] loadAllProducts];
+#endif
+    }
+#endif
+    price = price ? : @"";
+    return price;
+}
+
+- (NSString *)averagePrice {
+    NSString *price = nil;
+#if !VERSION_DMG
+    if (self.product.price) {
+        price = [self formattedPrice:YES];
+    } else {
+        if (self.priceNumber) {
+            price = [NSString stringWithFormat:@"USD $%0.2f", [self.priceNumber doubleValue]/6.0];
+        }
+#ifndef VERSION_DMG
+        // 获取产品价格信息
+        [[IAPProductsManager defaultManager] loadAllProducts];
+#endif
+    }
+#endif
+    price = price ? : @"";
+    return price;
+}
+
+- (NSString *)offersPrice {
+    NSString *price = nil;
+    if (self.offersPriceNumber) {
+        price = [NSString stringWithFormat:@"USD $%0.2f", [self.offersPriceNumber doubleValue]];
+    }
+    price = price ? : @"";
+    return price;
+}
+
+- (NSString *)offersAveragePrice {
+    NSString *price = nil;
+    if (self.offersPriceNumber) {
+        price = [NSString stringWithFormat:@"USD $%0.2f", [self.offersPriceNumber doubleValue]/6.0];
+    }
+    price = price ? : @"";
+    return price;
+}
+
+- (CGFloat)offers {
+    return [self.offersPriceNumber doubleValue]/[self.priceNumber doubleValue];
+}
+
+#pragma mark - Private Methods
+
+- (NSString *)formattedPrice:(BOOL)isAverage {
+    NSString *formattedString = nil;
+#if !VERSION_DMG
+    SKProduct *product = self.product;
+    if (product && [product.productIdentifier isEqualToString:self.productIdentifier]) {
+        NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
+        [numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
+        [numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
+        [numberFormatter setLocale:product.priceLocale];
+        if (isAverage) {
+            NSNumber *number = [NSNumber numberWithDouble:[product.price doubleValue]/6.0];
+            formattedString = [numberFormatter stringFromNumber:number];
+        } else {
+            formattedString = [numberFormatter stringFromNumber:product.price];
+        }
+    }
+#endif
+    return formattedString;
+}
+
+@end
+
+@interface IAPProductsManager ()
+#if !VERSION_DMG
+<SKProductsRequestDelegate,SKPaymentTransactionObserver>
+#endif
+
+@property (nonatomic,retain) IAPProduct *monthProduct;
+@property (nonatomic,retain) IAPProduct *newlyMonthProduct;
+@property (nonatomic,retain) IAPProduct *allAccessProduct;
+@property (nonatomic,retain) IAPProduct *PDFToOfficeProduct;
+
+@property (nonatomic,retain) IAPProduct *DMGAllAccessProduct;
+@property (nonatomic,retain) IAPProduct *DMGPDFToOfficeProduct;
+
+@property (nonatomic,retain) NSArray *productIdentifiers;
+
+@property (nonatomic,assign) BOOL isPurchasing;
+
+@end
+
+@implementation IAPProductsManager
+
+#pragma mark - Init Methods
+
+- (id)init {
+    if (self = [super init]) {
+        BOOL isOffers = NO;
+        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
+        dateFormatter.dateFormat = @"yyyy-MM-dd";
+        NSDate *offersDate = [dateFormatter dateFromString:@"2019-07-20"];
+        NSDate *date = [NSDate date];
+        if (NSOrderedDescending == [offersDate compare:date]) {
+            isOffers = YES;
+        }
+#if VERSION_DMG
+        // 桌机版
+        self.DMGAllAccessProduct = [[IAPProduct alloc] init];
+        self.DMGAllAccessProduct.priceNumber = @(79.99);
+        self.DMGAllAccessProduct.offersPriceNumber = @(59.99);
+        self.DMGAllAccessProduct.isOffers = isOffers;
+        
+        self.DMGPDFToOfficeProduct = [[IAPProduct alloc] init];
+        self.DMGPDFToOfficeProduct.priceNumber = @(19.99);
+        self.DMGPDFToOfficeProduct.offersPriceNumber = @(9.99);
+        self.DMGPDFToOfficeProduct.isOffers = isOffers;
+#else
+        
+#if VERSION_FREE
+        // 免费版
+        self.monthProduct = [[IAPProduct alloc] init];
+        self.monthProduct.productIdentifier = KMMonthLicenseProductIdentifier;
+        self.monthProduct.priceNumber = @(29.99);
+        
+        self.newlyMonthProduct = [[IAPProduct alloc] init];
+        self.newlyMonthProduct.productIdentifier = KMNewMonthLicenseProductIdentifier;
+        self.newlyMonthProduct.priceNumber = @(39.99);
+        self.newlyMonthProduct.offersPriceNumber = @(29.99);
+        self.newlyMonthProduct.isOffers = isOffers;
+        
+        self.allAccessProduct = [[IAPProduct alloc] init];
+        self.allAccessProduct.productIdentifier = KMAllLicenseProductIdentifier;
+        self.allAccessProduct.priceNumber = @(79.99);
+        self.allAccessProduct.offersPriceNumber = @(59.99);
+        self.allAccessProduct.isOffers = isOffers;
+        
+        if ([[NSUserDefaults standardUserDefaults] objectForKey:@"allAccessProduct.isSubscribed"]) {
+            self.allAccessProduct.isSubscribed = [[[NSUserDefaults standardUserDefaults] objectForKey:@"allAccessProduct.isSubscribed"] boolValue];
+        }
+        
+        self.productIdentifiers = @[KMMonthLicenseProductIdentifier,
+                                    KMNewMonthLicenseProductIdentifier,
+                                    KMAllLicenseProductIdentifier];
+#else
+        // 付费版
+        self.PDFToOfficeProduct = [[IAPProduct alloc] init];
+        self.PDFToOfficeProduct.productIdentifier = KMPDFToOfficeLicenseProductIdentifier;
+        self.PDFToOfficeProduct.priceNumber = @(19.99);
+        self.PDFToOfficeProduct.offersPriceNumber = @(9.99);
+        self.PDFToOfficeProduct.isOffers = isOffers;
+        
+        if ([[NSUserDefaults standardUserDefaults] objectForKey:@"PDFToOfficeProduct.isSubscribed"]) {
+            self.PDFToOfficeProduct.isSubscribed = [[[NSUserDefaults standardUserDefaults] objectForKey:@"PDFToOfficeProduct.isSubscribed"] boolValue];
+        }
+        
+        self.productIdentifiers = @[KMPDFToOfficeLicenseProductIdentifier];
+#endif
+        
+#endif
+    }
+    return self;
+}
+
+- (void)dealloc {
+#if !VERSION_DMG
+    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
+#endif
+
+}
+
+#pragma mark - Public Methods
+
++ (IAPProductsManager *)defaultManager {
+    static IAPProductsManager *singleton = nil;
+    static dispatch_once_t pred;
+    dispatch_once(&pred, ^{
+        singleton = [[IAPProductsManager alloc] init];
+    });
+    return singleton;
+}
+
+- (void)initIAP {
+#if !VERSION_DMG
+    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];
+#endif
+    [self loadAllProducts];
+    [self loadProducts];
+}
+
+- (void)loadProducts {
+#if !VERSION_DMG
+    if ([[NSUserDefaults standardUserDefaults] objectForKey:KMStoreReceipt]) {
+        NSDictionary *jsonResponse = [[NSUserDefaults standardUserDefaults] objectForKey:KMStoreReceipt];
+        [self fetchReceipt:jsonResponse];
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPSubscriptionLoadedNotification
+                                                            object:nil];
+    }
+    [self loadReceipt:^(NSError *error) {
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPSubscriptionLoadedNotification
+                                                            object:nil];
+    }];
+#endif
+}
+
+- (void)makeProduct:(IAPProduct *)iapProduct {
+#if !VERSION_DMG
+    if (![SKPaymentQueue canMakePayments]) {
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductFailedNotification
+                                                            object:iapProduct.productIdentifier];
+        return;
+    } else if (!iapProduct.product) {
+        [self loadAllProducts];
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductFailedNotification
+                                                            object:iapProduct.productIdentifier];
+        return;
+    }
+    SKPayment *payment = [SKPayment paymentWithProduct:iapProduct.product];
+    [[SKPaymentQueue defaultQueue] addPayment:payment];
+#endif
+}
+
+- (void)restoreSubscriptions {
+#if !VERSION_DMG
+    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
+#endif
+}
+
+- (BOOL)isAvailableAllFunction {
+#if VERSION_DMG
+    // 桌机版
+    VerificationManager *tManager = [VerificationManager manager];
+    BOOL tLicenseOK = NO;
+    switch ([tManager status]) {
+        case ActivityStatusTrial:
+        case ActivityStatusVerification:
+        {
+            tLicenseOK = YES;
+        }
+            break;
+        default:
+            break;
+    }
+    return tLicenseOK;
+#else
+    
+#if VERSION_FREE
+    // 免费版
+    if (self.monthProduct.isSubscribed ||
+        self.newlyMonthProduct.isSubscribed ||
+        self.allAccessProduct.isSubscribed) {
+        return YES;
+    }
+    return NO;
+#else
+    // 付费版
+    return YES;
+#endif
+    
+#endif
+}
+
+- (BOOL)isAvailableAdvancedPDFToOffice {
+#if VERSION_DMG
+    // 桌机版
+    VerificationManager *tManager = [VerificationManager manager];
+    BOOL tLicenseOK = NO;
+    switch ([tManager status]) {
+        case ActivityStatusTrial:
+        case ActivityStatusVerification:
+        {
+            NSString *product_code = [VerificationManager manager].detailInfo[@"device"][@"product_code"];
+            if ([product_code isEqualToString:@"com.brother.pdfreaderpro.mac.product_2"] ||
+                [product_code isEqualToString:@"com.brother.pdfreaderpro.mac.product_3"] ||
+                [product_code isEqualToString:@"com.brother.pdfreaderpro.cross.platform.product_3"] ||
+                [product_code isEqualToString:@"com.brother.pdfreaderpro.windows.product_3+com.brother.pdfreaderpro.mac.product_3"])
+            {
+                tLicenseOK = YES;
+            }
+        }
+            break;
+        default:
+            break;
+    }
+    return tLicenseOK;
+#else
+    
+#if VERSION_FREE
+    // 免费版
+    if (self.monthProduct.isSubscribed ||
+        self.newlyMonthProduct.isSubscribed ||
+        self.allAccessProduct.isSubscribed) {
+        return YES;
+    }
+    return NO;
+#else
+    // 付费版
+    if (self.PDFToOfficeProduct.isSubscribed) {
+        return YES;
+    }
+    return NO;
+#endif
+    
+#endif
+}
+
+#if !VERSION_DMG
+#pragma mark - Private Methods
+
+- (void)loadReceipt:(void (^)(NSError *error))handler {
+    NSURL *receiptURL  = [[NSBundle mainBundle] appStoreReceiptURL];
+    BOOL isPresent = [receiptURL checkResourceIsReachableAndReturnError:nil];
+    if (!isPresent) {
+        SKReceiptRefreshRequest *refreshRequest = [[SKReceiptRefreshRequest alloc] init];
+        [refreshRequest start];
+        if (handler) {
+            handler([NSError errorWithDomain:@"" code:0 userInfo:nil]);
+        }
+        return;
+    }
+    NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];
+    if (!receiptData) {
+        if (handler) {
+            handler([NSError errorWithDomain:@"" code:0 userInfo:nil]);
+        }
+        return;
+    }
+    NSString *bundleID = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleIdentifier"]?:@"";
+    NSString *temptransactioReceipt = [self encode:((uint8_t*)[receiptData bytes]) length:receiptData.length];//编码
+
+    temptransactioReceipt = [temptransactioReceipt stringByReplacingOccurrencesOfString:@"\n" withString:@""];
+    temptransactioReceipt = [temptransactioReceipt stringByReplacingOccurrencesOfString:@" " withString:@""];
+    
+    NSMutableDictionary *payLoad = [NSMutableDictionary dictionary];
+    [payLoad setObject:temptransactioReceipt forKey:@"receipt_data"];
+    [payLoad setObject:bundleID forKey:@"app_code"];
+    [payLoad setObject:@(0) forKey:@"sandbox"];
+    
+#if DEBUG
+    NSURL *url = [NSURL URLWithString:KMSandboxServer];
+#else
+    NSURL *url = [NSURL URLWithString:KMItunesServer];
+#endif
+    
+//    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+//        ASIFormDataRequest *request = [[[ASIFormDataRequest alloc] initWithURL:url] autorelease];
+//        request.defaultResponseEncoding = NSUTF8StringEncoding;
+//        request.timeOutSeconds = 20;
+//        request.numberOfTimesToRetryOnTimeout = 3;
+//        [request setRequestMethod:@"POST"];
+//        [request setRequestHeaders:[NSMutableDictionary dictionaryWithObject:@"application/json" forKey:@"Content-Type"]];
+//        [request setPostBody:[IAPProductsManager mutableDataWithDic:payLoad]];
+//        [request startSynchronous];
+//        NSError *error = request.error;
+//        BOOL isSuccessful = NO;
+//        if (!error) {
+//            NSDictionary *jsonResponse = [[request.responseString objectFromJSONString] filterNullObject];
+//            isSuccessful = [self fetchReceipt:jsonResponse[@"data"]];
+//            if (isSuccessful) {
+//                [[NSUserDefaults standardUserDefaults] setObject:jsonResponse[@"data"] forKey:KMStoreReceipt];
+//                [[NSUserDefaults standardUserDefaults] synchronize];
+//            } else {
+//                error = [[[NSError alloc] init] autorelease];
+//            }
+//        }
+//        dispatch_async(dispatch_get_main_queue(), ^{
+//            if (handler) {
+//                handler(error);
+//            }
+//        });
+//    });
+}
+
+- (BOOL)fetchReceipt:(NSDictionary *)jsonResponse
+{
+    if (![jsonResponse objectForKey:@"latest_receipt_info"] &&
+        ![[jsonResponse objectForKey:@"receipt"] objectForKey:@"in_app"]) {
+        return NO;
+    }
+
+    if ([jsonResponse objectForKey:@"latest_receipt_info"]) {
+        NSArray *receipts = [jsonResponse objectForKey:@"latest_receipt_info"];
+        for (NSDictionary *receipt in receipts) {
+            NSString *product_id = receipt[@"product_id"];
+            NSString *expires_date_ms = receipt[@"expires_date_ms"];
+            NSInteger quantity = [receipt[@"quantity"] integerValue];
+            
+            long long expiresDate = [expires_date_ms longLongValue]/1000;
+            long long currentDate = [[NSDate date] timeIntervalSince1970];
+            BOOL isActive = (expiresDate > currentDate) ? YES : NO;
+            
+            if ([product_id isEqualToString:self.monthProduct.productIdentifier]) {
+                if (!self.monthProduct.isSubscribed) {
+                    self.monthProduct.isSubscribed = isActive;
+                }
+                self.monthProduct.originalPurchased = YES;
+            } else if ([product_id isEqualToString:self.newlyMonthProduct.productIdentifier]) {
+                if (!self.newlyMonthProduct.isSubscribed) {
+                    self.newlyMonthProduct.isSubscribed = isActive;
+                }
+                if ([receipt[@"is_trial_period"] boolValue]) {
+                    self.newlyMonthProduct.isTrialPeriod = YES;
+                }
+                self.newlyMonthProduct.originalPurchased = YES;
+                
+            } else if ([product_id isEqualToString:self.allAccessProduct.productIdentifier]) {
+                if (!self.allAccessProduct.isSubscribed) {
+                    self.allAccessProduct.isSubscribed = quantity > 0 ? YES : NO;
+                }
+                self.allAccessProduct.originalPurchased = YES;
+            } else if ([product_id isEqualToString:self.PDFToOfficeProduct.productIdentifier]) {
+                if (!self.PDFToOfficeProduct.isSubscribed) {
+                    self.PDFToOfficeProduct.isSubscribed = quantity > 0 ? YES : NO;
+                }
+                self.PDFToOfficeProduct.originalPurchased = YES;
+            }
+        }
+    }
+    if ([[jsonResponse objectForKey:@"receipt"] objectForKey:@"in_app"]) {
+        NSArray *receipts = [[jsonResponse objectForKey:@"receipt"] objectForKey:@"in_app"];
+        for (NSDictionary *receipt in receipts) {
+            NSString *product_id = receipt[@"product_id"];
+            NSString *expires_date_ms = receipt[@"expires_date_ms"];
+            NSInteger quantity = [receipt[@"quantity"] integerValue];
+            
+            long long expiresDate = [expires_date_ms longLongValue]/1000;
+            long long currentDate = [[NSDate date] timeIntervalSince1970];
+            BOOL isActive = (expiresDate > currentDate) ? YES : NO;
+            
+            if ([product_id isEqualToString:self.monthProduct.productIdentifier]) {
+                if (!self.monthProduct.isSubscribed) {
+                    self.monthProduct.isSubscribed = isActive;
+                }
+                self.monthProduct.originalPurchased = YES;
+            } else if ([product_id isEqualToString:self.newlyMonthProduct.productIdentifier]) {
+                if (!self.newlyMonthProduct.isSubscribed) {
+                    self.newlyMonthProduct.isSubscribed = isActive;
+                }
+                if ([receipt[@"is_trial_period"] boolValue]) {
+                    self.newlyMonthProduct.isTrialPeriod = YES;
+                }
+                self.newlyMonthProduct.originalPurchased = YES;
+            } else if ([product_id isEqualToString:self.allAccessProduct.productIdentifier]) {
+                if (!self.allAccessProduct.isSubscribed) {
+                    self.allAccessProduct.isSubscribed = quantity > 0 ? YES : NO;
+                }
+                self.allAccessProduct.originalPurchased = YES;
+            } else if ([product_id isEqualToString:self.PDFToOfficeProduct.productIdentifier]) {
+                if (!self.PDFToOfficeProduct.isSubscribed) {
+                    self.PDFToOfficeProduct.isSubscribed = quantity > 0 ? YES : NO;
+                }
+                self.PDFToOfficeProduct.originalPurchased = YES;
+            }
+        }
+    }
+    
+    [[NSUserDefaults standardUserDefaults] setObject:self.allAccessProduct.isSubscribed ? @"YES":@"NO" forKey:@"allAccessProduct.isSubscribed"];    
+    [[NSUserDefaults standardUserDefaults] setObject:self.PDFToOfficeProduct.isSubscribed ? @"YES":@"NO" forKey:@"PDFToOfficeProduct.isSubscribed"];
+    [[NSUserDefaults standardUserDefaults] synchronize];
+    
+    return YES;
+}
+
+- (void)loadAllProducts {
+    NSSet *identifiers = [NSSet setWithArray:self.productIdentifiers];
+    SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:identifiers];
+    productRequest.delegate = self;
+    [productRequest start];
+}
+
+- (void)productDidFailed:(SKPaymentTransaction *)transaction {
+    if (!self.isPurchasing) {
+        return;
+    }
+    dispatch_async(dispatch_get_main_queue(), ^{
+        NSString *productIdentifier = transaction.payment.productIdentifier;
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductFailedNotification
+                                                            object:productIdentifier];
+        
+        NSString *informative = [NSString stringWithFormat:@"\n%@\n\n%@\n\n%@\n\n",
+                                 NSLocalizedString(@"Purchase failed. Please check your settings and try again.", nil),
+                                 NSLocalizedString(@"—》If you already completed the payment, simply click the \"Restore Previous Purchase\" button directly from the upgrade page to enable all the advanced features at no cost to you.", nil),
+                                 NSLocalizedString(@"—》Due to Apple needs to confirm your purchase info, you may be required to sign in with your Apple ID. When you restore your purchase, make sure you use the same Apple ID that you previously used.", nil)];
+        NSAlert *alert = [[NSAlert alloc] init];
+        [alert addButtonWithTitle:NSLocalizedString(@"OK", nil)];
+        [alert setAlertStyle:NSAlertStyleWarning];
+        [alert setMessageText:@""];
+        [alert setInformativeText:informative];
+        [alert runModal];
+    });
+}
+
+- (void)productDidPurchased:(SKPaymentTransaction *)transaction {
+    NSString *productIdentifier = transaction.payment.productIdentifier;
+    if ([productIdentifier isEqualToString:self.monthProduct.productIdentifier]) {
+        self.monthProduct.isSubscribed = YES;
+    } else if ([productIdentifier isEqualToString:self.newlyMonthProduct.productIdentifier]) {
+        self.newlyMonthProduct.isSubscribed = YES;
+    } else if ([productIdentifier isEqualToString:self.allAccessProduct.productIdentifier]) {
+        self.allAccessProduct.isSubscribed = YES;
+        [[NSUserDefaults standardUserDefaults] setObject:self.allAccessProduct.isSubscribed ? @"YES":@"NO" forKey:@"allAccessProduct.isSubscribed"];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    } else if ([productIdentifier isEqualToString:self.PDFToOfficeProduct.productIdentifier]) {
+        self.PDFToOfficeProduct.isSubscribed = YES;
+        [[NSUserDefaults standardUserDefaults] setObject:self.PDFToOfficeProduct.isSubscribed ? @"YES":@"NO" forKey:@"PDFToOfficeProduct.isSubscribed"];
+        [[NSUserDefaults standardUserDefaults] synchronize];
+    }
+    if (!self.isPurchasing) {
+        return;
+    }
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductPurchasedNotification
+                                                            object:productIdentifier];
+        
+        NSString *informative = nil;
+        NSAlert *alert = [[NSAlert alloc] init];
+        [alert addButtonWithTitle:NSLocalizedString(@"OK", nil)];
+        [alert setAlertStyle:NSAlertStyleWarning];
+        [alert setMessageText:@""];
+#if VERSION_FREE
+        informative = NSLocalizedString(@"Purchase completed. You can start using the advanced tools, including PDF to Office, PDF Watermark, Page Editor, and more.", nil);
+#else
+        informative = NSLocalizedString(@"Purchase Completed", nil);
+#endif
+        [alert setInformativeText:informative];
+        if ([alert runModal]) {
+            NSString *message = [NSString stringWithFormat:@"%@\n%@",
+                                 NSLocalizedString(@"In-App Purchase FAQ:", nil),
+                                 NSLocalizedString(@"I bought the in-app purchase, but the app doesn't recognize that automatically. How to recover my purchase?", nil)];
+            
+            NSString *informative = [NSString stringWithFormat:@"\n%@\n\n%@\n\n%@\n\n",
+                                     NSLocalizedString(@"—》If you already completed the payment, simply click the \"Restore Previous Purchase\" button directly from the upgrade page to enable all the advanced features at no cost to you.", nil),
+                                     NSLocalizedString(@"—》Due to Apple needs to confirm your purchase info, you may be required to sign in with your Apple ID. When you restore your purchase, make sure you use the same Apple ID that you previously used.", nil),
+                                     NSLocalizedString(@"—》Once you see the \"Restore Successfully\" message, you will be able to access the advanced features, including PDF to Office, PDF Watermark, Page Editor, and more.", nil)];
+            
+            NSAlert *alert = [[NSAlert alloc] init];
+            [alert addButtonWithTitle:NSLocalizedString(@"OK", nil)];
+            [alert setAlertStyle:NSAlertStyleWarning];
+            [alert setMessageText:message];
+            [alert setInformativeText:informative];
+            [alert runModal];
+        }
+    });
+}
+
+- (void)restoreDidFailed {
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductRestoreFailedNotification
+                                                            object:nil];
+        
+        NSString *informative = [NSString stringWithFormat:@"\n%@\n\n%@\n\n%@\n\n",
+                                 NSLocalizedString(@"Failed to restore previous purchases. Please make sure you've made a valid purchase or try again later.", nil),
+                                 NSLocalizedString(@"—》If you already completed the payment, simply click the \"Restore Previous Purchase\" button directly from the upgrade page to enable all the advanced features at no cost to you.", nil),
+                                 NSLocalizedString(@"—》Due to Apple needs to confirm your purchase info, you may be required to sign in with your Apple ID. When you restore your purchase, make sure you use the same Apple ID that you previously used.", nil)];
+        NSAlert *alert = [[NSAlert alloc] init];
+        [alert addButtonWithTitle:NSLocalizedString(@"OK", nil)];
+        [alert setAlertStyle:NSAlertStyleWarning];
+        [alert setMessageText:@""];
+        [alert setInformativeText:informative];
+        [alert runModal];
+    });
+}
+
+- (void)restoreDidFinished {
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductRestoreFinishedNotification
+                                                            object:nil];
+        
+        NSString *informative = nil;
+        NSAlert *alert = [[NSAlert alloc] init];
+        [alert addButtonWithTitle:NSLocalizedString(@"OK", nil)];
+        [alert setAlertStyle:NSAlertStyleWarning];
+        [alert setMessageText:@""];
+#if VERSION_FREE
+        if (self.monthProduct.isSubscribed ||
+            self.newlyMonthProduct.isSubscribed) {
+            informative = NSLocalizedString(@"Restore successfully", nil);
+        } else if (self.allAccessProduct.isSubscribed) {
+            informative = NSLocalizedString(@"Restore successfully. You can start using the advanced tools, including PDF to Office, PDF Watermark, Page Editor, and more.", nil);
+        } else if (self.monthProduct.originalPurchased ||
+                   self.newlyMonthProduct.originalPurchased) {
+            informative = [NSString stringWithFormat:@"\n%@\n\n%@\n\n%@\n\n",
+                           NSLocalizedString(@"Your subscription has expired, please repurchase", nil),
+                           NSLocalizedString(@"—》If you already completed the payment, simply click the \"Restore Previous Purchase\" button directly from the upgrade page to enable all the advanced features at no cost to you.", nil),
+                           NSLocalizedString(@"—》Due to Apple needs to confirm your purchase info, you may be required to sign in with your Apple ID. When you restore your purchase, make sure you use the same Apple ID that you previously used.", nil)];
+        } else {
+            informative = [NSString stringWithFormat:@"\n%@\n\n%@\n\n%@\n\n",
+                           NSLocalizedString(@"Failed to restore previous purchases. Please make sure you've made a valid purchase or try again later.", nil),
+                           NSLocalizedString(@"—》If you already completed the payment, simply click the \"Restore Previous Purchase\" button directly from the upgrade page to enable all the advanced features at no cost to you.", nil),
+                           NSLocalizedString(@"—》Due to Apple needs to confirm your purchase info, you may be required to sign in with your Apple ID. When you restore your purchase, make sure you use the same Apple ID that you previously used.", nil)];
+        }
+#else
+        if (self.PDFToOfficeProduct.isSubscribed) {
+            informative = NSLocalizedString(@"Restore successfully", nil);
+        } else {
+            informative = [NSString stringWithFormat:@"\n%@\n\n%@\n\n%@\n\n",
+                           NSLocalizedString(@"Failed to restore previous purchases. Please make sure you've made a valid purchase or try again later.", nil),
+                           NSLocalizedString(@"—》If you already completed the payment, simply click the \"Restore Previous Purchase\" button directly from the upgrade page to enable all the advanced features at no cost to you.", nil),
+                           NSLocalizedString(@"—》Due to Apple needs to confirm your purchase info, you may be required to sign in with your Apple ID. When you restore your purchase, make sure you use the same Apple ID that you previously used.", nil)];
+        }
+#endif
+        [alert setInformativeText:informative];
+        [alert runModal];
+    });
+}
+
+
+//编码
+- (NSString *)encode:(const uint8_t *)input length:(NSInteger)length {
+    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+    
+    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
+    uint8_t *output = (uint8_t *)data.mutableBytes;
+    
+    for (NSInteger i = 0; i < length; i += 3) {
+        NSInteger value = 0;
+        for (NSInteger j = i; j < (i + 3); j++) {
+            value <<= 8;
+            
+            if (j < length) {
+                value |= (0xFF & input[j]);
+            }
+        }
+        
+        NSInteger index = (i / 3) * 4;
+        output[index + 0] =                    table[(value >> 18) & 0x3F];
+        output[index + 1] =                    table[(value >> 12) & 0x3F];
+        output[index + 2] = (i + 1) < length ? table[(value >> 6)  & 0x3F] : '=';
+        output[index + 3] = (i + 2) < length ? table[(value >> 0)  & 0x3F] : '=';
+    }
+    
+    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
+}
+
++ (NSMutableData*)mutableDataWithDic:(NSDictionary*)dic {
+    NSString *json = [IAPProductsManager postStringWithDic:dic];
+    json = [json stringByReplacingOccurrencesOfString:@"\n" withString:@""];
+    json = [json stringByReplacingOccurrencesOfString:@"\r\0" withString:@""];
+    json = [json stringByReplacingOccurrencesOfString:@"\0" withString:@""];
+    NSData *postData = [json dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
+    return [postData mutableCopy];
+}
+
++ (NSString*)postStringWithDic:(NSDictionary*)dic {
+    return [IAPProductsManager postStringWithObject:dic];
+}
+
++ (NSString*)postStringWithObject:(id)value {
+    NSString *string;
+    
+    if ([value isKindOfClass:[NSArray class]]) {
+        string = @"[";
+        BOOL isFirst = YES;
+        
+        for (id object in value) {
+            if (isFirst) {
+                isFirst = NO;
+            }else {
+                string = [string stringByAppendingString:@","];
+            }
+            string = [string stringByAppendingString:[IAPProductsManager postStringWithObject:object]];
+        }
+        
+        string = [string stringByAppendingString:@"]"];
+    }else if ([value isKindOfClass:[NSDictionary class]]) {
+        string = @"{";
+        BOOL isFirst = YES;
+        
+        for (NSString *key in [value allKeys]) {
+            if (isFirst) {
+                isFirst = NO;
+            }else {
+                string = [string stringByAppendingString:@","];
+            }
+            string = [string stringByAppendingFormat:@"\"%@\"", key];
+            string = [string stringByAppendingString:@":"];
+            string = [string stringByAppendingString:[IAPProductsManager postStringWithObject:[value valueForKey:key]]];
+        }
+        string = [string stringByAppendingString:@"}"];
+    }else {
+        string = [NSString stringWithFormat:@"\"%@\"", value];
+    }
+    
+    return string;
+}
+
+
+#pragma mark - SKProductsRequestDelegate
+
+- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response {
+    for (SKProduct *product in response.products) {
+        if ([product.productIdentifier isEqualToString:self.monthProduct.productIdentifier]) {
+            self.monthProduct.product = product;
+        } else if ([product.productIdentifier isEqualToString:self.newlyMonthProduct.productIdentifier]) {
+            self.newlyMonthProduct.product = product;
+        } else if ([product.productIdentifier isEqualToString:self.allAccessProduct.productIdentifier]) {
+            self.allAccessProduct.product = product;
+        } else if ([product.productIdentifier isEqualToString:self.PDFToOfficeProduct.productIdentifier]) {
+            self.PDFToOfficeProduct.product = product;
+        }
+    }
+    dispatch_async(dispatch_get_main_queue(), ^{
+        [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductLoadedNotification
+                                                            object:nil];
+    });
+}
+
+#pragma mark - SKPaymentTransactionObserver
+
+- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray<SKPaymentTransaction *> *)transactions {
+    for (SKPaymentTransaction *transaction in transactions) {
+        switch (transaction.transactionState) {
+            case SKPaymentTransactionStatePurchasing:
+                self.isPurchasing = YES;
+                break;
+            case SKPaymentTransactionStateDeferred:
+                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
+                break;
+            case SKPaymentTransactionStateFailed:
+                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
+                [self productDidFailed:transaction];
+                self.isPurchasing = NO;
+                break;
+            case SKPaymentTransactionStatePurchased:
+                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
+                [self productDidPurchased:transaction];
+                self.isPurchasing = NO;
+                break;
+            case SKPaymentTransactionStateRestored:
+                [[SKPaymentQueue defaultQueue] finishTransaction:transaction];
+                break;
+        }
+    }
+}
+
+- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {
+    [self restoreDidFailed];
+}
+
+- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue {
+    [self loadReceipt:^(NSError *error) {
+        if (error) {
+            [self restoreDidFailed];
+        } else {
+            [self restoreDidFinished];
+            [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductLoadedNotification
+                                                                object:nil];
+            [[NSNotificationCenter defaultCenter] postNotificationName:KMIAPProductRestoreFinishedNotification
+                                                                object:nil];
+        }
+    }];
+}
+#endif
+@end

+ 1 - 0
PDF Office/PDF Master/PDF_Master DMG-Bridging-Header.h

@@ -78,5 +78,6 @@
 //文件权限
 #import "AppSandboxFileAccess.h"
 
+#import "IAPProductsManager.h"
 #import "VerificationManager.h"
 #import "KMPurchaseCompareWindowController.h"

+ 1 - 0
PDF Office/PDF Master/PDF_Master Pro-Bridging-Header.h

@@ -62,5 +62,6 @@
 //文件权限
 #import "AppSandboxFileAccess.h"
 
+#import "IAPProductsManager.h"
 #import "VerificationManager.h"
 #import "KMPurchaseCompareWindowController.h"

+ 1 - 0
PDF Office/PDF Master/PDF_Master-Bridging-Header.h

@@ -74,5 +74,6 @@
 //文件权限
 #import "AppSandboxFileAccess.h"
 
+#import "IAPProductsManager.h"
 #import "VerificationManager.h"
 #import "KMPurchaseCompareWindowController.h"

BIN
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/FirebaseABTesting


+ 83 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Headers/FIRExperimentController.h

@@ -0,0 +1,83 @@
+// Copyright 2019 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <Foundation/Foundation.h>
+
+@class ABTExperimentPayload;
+
+// Forward declaration to avoid importing into the module header
+typedef NS_ENUM(int32_t, ABTExperimentPayloadExperimentOverflowPolicy);
+
+NS_ASSUME_NONNULL_BEGIN
+
+@class FIRLifecycleEvents;
+
+/// The default experiment overflow policy, that is to discard the experiment with the oldest start
+/// time when users start the experiment on the web console.
+extern const ABTExperimentPayloadExperimentOverflowPolicy FIRDefaultExperimentOverflowPolicy;
+
+/// This class is for Firebase services to handle experiments updates to Firebase Analytics.
+/// Experiments can be set, cleared and updated through this controller.
+NS_SWIFT_NAME(ExperimentController)
+@interface FIRExperimentController : NSObject
+
+/// Returns the FIRExperimentController singleton.
++ (FIRExperimentController *)sharedInstance;
+
+/// Updates the list of experiments with an optional completion handler. Experiments already
+/// existing in payloads are not affected, whose state and payload is preserved. This method
+/// compares whether the experiments have changed or not by their variant ID. This runs in a
+/// background queue and calls the completion handler when finished executing.
+/// @param origin         The originating service affected by the experiment.
+/// @param events         A list of event names to be used for logging experiment lifecycle events,
+///                       if they are not defined in the payload.
+/// @param policy         The policy to handle new experiments when slots are full.
+/// @param lastStartTime  The last known experiment start timestamp for this affected service.
+///                       (Timestamps are specified by the number of seconds from 00:00:00 UTC on 1
+///                       January 1970.).
+/// @param payloads       List of experiment metadata.
+/// @param completionHandler Code to be executed after experiments are updated in the background
+///                       thread.
+- (void)updateExperimentsWithServiceOrigin:(NSString *)origin
+                                    events:(FIRLifecycleEvents *)events
+                                    policy:(ABTExperimentPayloadExperimentOverflowPolicy)policy
+                             lastStartTime:(NSTimeInterval)lastStartTime
+                                  payloads:(NSArray<NSData *> *)payloads
+                         completionHandler:
+                             (nullable void (^)(NSError *_Nullable error))completionHandler;
+
+/// Returns the latest experiment start timestamp given a current latest timestamp and a list of
+/// experiment payloads. Timestamps are specified by the number of seconds from 00:00:00 UTC on 1
+/// January 1970.
+/// @param timestamp  Current latest experiment start timestamp. If not known, affected service
+///                   should specify -1;
+/// @param payloads   List of experiment metadata.
+- (NSTimeInterval)latestExperimentStartTimestampBetweenTimestamp:(NSTimeInterval)timestamp
+                                                     andPayloads:(NSArray<NSData *> *)payloads;
+
+/// Expires experiments that aren't in the list of running experiment payloads.
+/// @param origin The originating service affected by the experiment.
+/// @param payloads The list of valid, running experiments.
+- (void)validateRunningExperimentsForServiceOrigin:(NSString *)origin
+                         runningExperimentPayloads:(NSArray<ABTExperimentPayload *> *)payloads;
+
+/// Directly sets a given experiment to be active.
+/// @param experimentPayload The payload for the experiment that should be activated.
+/// @param origin The originating service affected by the experiment.
+- (void)activateExperiment:(ABTExperimentPayload *)experimentPayload
+          forServiceOrigin:(NSString *)origin;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 66 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Headers/FIRLifecycleEvents.h

@@ -0,0 +1,66 @@
+// Copyright 2019 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+/// Default event name for when an experiment is set.
+extern NSString *const FIRSetExperimentEventName NS_SWIFT_NAME(DefaultSetExperimentEventName);
+/// Default event name for when an experiment is activated.
+// clang-format off
+// clang-format12 will merge lines and exceed 100 character limit.
+extern NSString *const FIRActivateExperimentEventName
+    NS_SWIFT_NAME(DefaultActivateExperimentEventName);
+/// Default event name for when an experiment is cleared.
+extern NSString *const FIRClearExperimentEventName NS_SWIFT_NAME(DefaultClearExperimentEventName);
+/// Default event name for when an experiment times out for being activated.
+extern NSString *const FIRTimeoutExperimentEventName
+    NS_SWIFT_NAME(DefaultTimeoutExperimentEventName);
+// clang-format on
+/// Default event name for when an experiment is expired as it reaches the end of TTL.
+extern NSString *const FIRExpireExperimentEventName NS_SWIFT_NAME(DefaultExpireExperimentEventName);
+
+/// An Experiment Lifecycle Event Object that specifies the name of the experiment event to be
+/// logged by Firebase Analytics.
+NS_SWIFT_NAME(LifecycleEvents)
+@interface FIRLifecycleEvents : NSObject
+
+/// Event name for when an experiment is set. It is default to FIRSetExperimentEventName and can be
+/// overridden. If experiment payload has a valid string of this field, always use experiment
+/// payload.
+@property(nonatomic, copy) NSString *setExperimentEventName;
+
+/// Event name for when an experiment is activated. It is default to FIRActivateExperimentEventName
+/// and can be overridden. If experiment payload has a valid string of this field, always use
+/// experiment payload.
+@property(nonatomic, copy) NSString *activateExperimentEventName;
+
+/// Event name for when an experiment is cleared. It is default to FIRClearExperimentEventName and
+/// can be overridden. If experiment payload has a valid string of this field, always use experiment
+/// payload.
+@property(nonatomic, copy) NSString *clearExperimentEventName;
+/// Event name for when an experiment is timeout from being STANDBY. It is default to
+/// FIRTimeoutExperimentEventName and can be overridden. If experiment payload has a valid string
+/// of this field, always use experiment payload.
+@property(nonatomic, copy) NSString *timeoutExperimentEventName;
+
+/// Event name when an experiment is expired when it reaches the end of its TTL.
+/// It is default to FIRExpireExperimentEventName and can be overridden. If experiment payload has a
+/// valid string of this field, always use experiment payload.
+@property(nonatomic, copy) NSString *expireExperimentEventName;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 16 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Headers/FirebaseABTesting.h

@@ -0,0 +1,16 @@
+// Copyright 2019 Google
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#import "FIRExperimentController.h"
+#import "FIRLifecycleEvents.h"

+ 20 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Info.plist

@@ -0,0 +1,20 @@
+<?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>CFBundleExecutable</key>
+	<string>FirebaseABTesting</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.firebase.Firebase-FirebaseABTesting</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>FirebaseABTesting</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleVersion</key>
+	<string>8.15.0</string>
+	<key>DTSDKName</key>
+	<string>iphonesimulator11.2</string>
+</dict>
+</plist>

+ 11 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseABTesting.framework/Modules/module.modulemap

@@ -0,0 +1,11 @@
+framework module FirebaseABTesting {
+umbrella header "FirebaseABTesting.h"
+export *
+module * { export * }
+  link framework "AppKit"
+  link framework "CoreTelephony"
+  link framework "Foundation"
+  link framework "Security"
+  link framework "SystemConfiguration"
+  link "z"
+}

BIN
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/FirebaseRemoteConfig


+ 290 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers/FIRRemoteConfig.h

@@ -0,0 +1,290 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import <Foundation/Foundation.h>
+
+@class FIRApp;
+
+/// The Firebase Remote Config service default namespace, to be used if the API method does not
+/// specify a different namespace. Use the default namespace if configuring from the Google Firebase
+/// service.
+extern NSString *const _Nonnull FIRNamespaceGoogleMobilePlatform NS_SWIFT_NAME(
+    NamespaceGoogleMobilePlatform);
+
+/// Key used to manage throttling in NSError user info when the refreshing of Remote Config
+/// parameter values (data) is throttled. The value of this key is the elapsed time since 1970,
+/// measured in seconds.
+extern NSString *const _Nonnull FIRRemoteConfigThrottledEndTimeInSecondsKey NS_SWIFT_NAME(
+    RemoteConfigThrottledEndTimeInSecondsKey);
+
+/// Indicates whether updated data was successfully fetched.
+typedef NS_ENUM(NSInteger, FIRRemoteConfigFetchStatus) {
+  /// Config has never been fetched.
+  FIRRemoteConfigFetchStatusNoFetchYet,
+  /// Config fetch succeeded.
+  FIRRemoteConfigFetchStatusSuccess,
+  /// Config fetch failed.
+  FIRRemoteConfigFetchStatusFailure,
+  /// Config fetch was throttled.
+  FIRRemoteConfigFetchStatusThrottled,
+} NS_SWIFT_NAME(RemoteConfigFetchStatus);
+
+/// Indicates whether updated data was successfully fetched and activated.
+typedef NS_ENUM(NSInteger, FIRRemoteConfigFetchAndActivateStatus) {
+  /// The remote fetch succeeded and fetched data was activated.
+  FIRRemoteConfigFetchAndActivateStatusSuccessFetchedFromRemote,
+  /// The fetch and activate succeeded from already fetched but yet unexpired config data. You can
+  /// control this using minimumFetchInterval property in FIRRemoteConfigSettings.
+  FIRRemoteConfigFetchAndActivateStatusSuccessUsingPreFetchedData,
+  /// The fetch and activate failed.
+  FIRRemoteConfigFetchAndActivateStatusError
+} NS_SWIFT_NAME(RemoteConfigFetchAndActivateStatus);
+
+/// Remote Config error domain that handles errors when fetching data from the service.
+extern NSString *const _Nonnull FIRRemoteConfigErrorDomain NS_SWIFT_NAME(RemoteConfigErrorDomain);
+/// Firebase Remote Config service fetch error.
+typedef NS_ENUM(NSInteger, FIRRemoteConfigError) {
+  /// Unknown or no error.
+  FIRRemoteConfigErrorUnknown = 8001,
+  /// Frequency of fetch requests exceeds throttled limit.
+  FIRRemoteConfigErrorThrottled = 8002,
+  /// Internal error that covers all internal HTTP errors.
+  FIRRemoteConfigErrorInternalError = 8003,
+} NS_SWIFT_NAME(RemoteConfigError);
+
+/// Enumerated value that indicates the source of Remote Config data. Data can come from
+/// the Remote Config service, the DefaultConfig that is available when the app is first installed,
+/// or a static initialized value if data is not available from the service or DefaultConfig.
+typedef NS_ENUM(NSInteger, FIRRemoteConfigSource) {
+  FIRRemoteConfigSourceRemote,   ///< The data source is the Remote Config service.
+  FIRRemoteConfigSourceDefault,  ///< The data source is the DefaultConfig defined for this app.
+  FIRRemoteConfigSourceStatic,   ///< The data doesn't exist, return a static initialized value.
+} NS_SWIFT_NAME(RemoteConfigSource);
+
+/// Completion handler invoked by fetch methods when they get a response from the server.
+///
+/// @param status Config fetching status.
+/// @param error  Error message on failure.
+typedef void (^FIRRemoteConfigFetchCompletion)(FIRRemoteConfigFetchStatus status,
+                                               NSError *_Nullable error)
+    NS_SWIFT_NAME(RemoteConfigFetchCompletion);
+
+/// Completion handler invoked by activate method upon completion.
+/// @param error  Error message on failure. Nil if activation was successful.
+typedef void (^FIRRemoteConfigActivateCompletion)(NSError *_Nullable error)
+    NS_SWIFT_NAME(RemoteConfigActivateCompletion);
+
+/// Completion handler invoked upon completion of Remote Config initialization.
+///
+/// @param initializationError nil if initialization succeeded.
+typedef void (^FIRRemoteConfigInitializationCompletion)(NSError *_Nullable initializationError)
+    NS_SWIFT_NAME(RemoteConfigInitializationCompletion);
+
+/// Completion handler invoked by the fetchAndActivate method. Used to convey status of fetch and,
+/// if successful, resultant activate call
+/// @param status Config fetching status.
+/// @param error  Error message on failure of config fetch
+typedef void (^FIRRemoteConfigFetchAndActivateCompletion)(
+    FIRRemoteConfigFetchAndActivateStatus status, NSError *_Nullable error)
+    NS_SWIFT_NAME(RemoteConfigFetchAndActivateCompletion);
+
+#pragma mark - FIRRemoteConfigValue
+/// This class provides a wrapper for Remote Config parameter values, with methods to get parameter
+/// values as different data types.
+NS_SWIFT_NAME(RemoteConfigValue)
+@interface FIRRemoteConfigValue : NSObject <NSCopying>
+/// Gets the value as a string.
+@property(nonatomic, readonly, nullable) NSString *stringValue;
+/// Gets the value as a number value.
+@property(nonatomic, readonly, nonnull) NSNumber *numberValue;
+/// Gets the value as a NSData object.
+@property(nonatomic, readonly, nonnull) NSData *dataValue;
+/// Gets the value as a boolean.
+@property(nonatomic, readonly) BOOL boolValue;
+/// Gets a foundation object (NSDictionary / NSArray) by parsing the value as JSON. This method uses
+/// NSJSONSerialization's JSONObjectWithData method with an options value of 0.
+@property(nonatomic, readonly, nullable) id JSONValue NS_SWIFT_NAME(jsonValue);
+/// Identifies the source of the fetched value.
+@property(nonatomic, readonly) FIRRemoteConfigSource source;
+@end
+
+#pragma mark - FIRRemoteConfigSettings
+/// Firebase Remote Config settings.
+NS_SWIFT_NAME(RemoteConfigSettings)
+@interface FIRRemoteConfigSettings : NSObject
+/// Indicates the default value in seconds to set for the minimum interval that needs to elapse
+/// before a fetch request can again be made to the Remote Config backend. After a fetch request to
+/// the backend has succeeded, no additional fetch requests to the backend will be allowed until the
+/// minimum fetch interval expires. Note that you can override this default on a per-fetch request
+/// basis using -[FIRRemoteConfig fetchWithExpirationDuration:completionHandler]. For E.g. setting
+/// the expiration duration to 0 in the fetch request will override the minimumFetchInterval and
+/// allow the request to the backend.
+@property(nonatomic, assign) NSTimeInterval minimumFetchInterval;
+/// Indicates the default value in seconds to abandon a pending fetch request made to the backend.
+/// This value is set for outgoing requests as the timeoutIntervalForRequest as well as the
+/// timeoutIntervalForResource on the NSURLSession's configuration.
+@property(nonatomic, assign) NSTimeInterval fetchTimeout;
+@end
+
+#pragma mark - FIRRemoteConfig
+/// Firebase Remote Config class. The shared instance method +remoteConfig can be created and used
+/// to fetch, activate and read config results and set default config results.
+NS_SWIFT_NAME(RemoteConfig)
+@interface FIRRemoteConfig : NSObject <NSFastEnumeration>
+/// Last successful fetch completion time.
+@property(nonatomic, readonly, strong, nullable) NSDate *lastFetchTime;
+/// Last fetch status. The status can be any enumerated value from FIRRemoteConfigFetchStatus.
+@property(nonatomic, readonly, assign) FIRRemoteConfigFetchStatus lastFetchStatus;
+/// Config settings are custom settings.
+@property(nonatomic, readwrite, strong, nonnull) FIRRemoteConfigSettings *configSettings;
+
+/// Returns the FIRRemoteConfig instance configured for the default Firebase app. This singleton
+/// object contains the complete set of Remote Config parameter values available to the app,
+/// including the Active Config and Default Config. This object also caches values fetched from the
+/// Remote Config Server until they are copied to the Active Config by calling
+/// `activateWithCompletion:`. When you fetch values from the Remote Config Server using the default
+/// Firebase namespace service, you should use this class method to create a shared instance of the
+/// FIRRemoteConfig object to ensure that your app will function properly with the Remote Config
+/// Server and the Firebase service.
++ (nonnull FIRRemoteConfig *)remoteConfig NS_SWIFT_NAME(remoteConfig());
+
+/// Returns the FIRRemoteConfig instance for your (non-default) Firebase appID. Note that Firebase
+/// analytics does not work for non-default app instances. This singleton object contains the
+/// complete set of Remote Config parameter values available to the app, including the Active Config
+/// and Default Config. This object also caches values fetched from the Remote Config Server until
+/// they are copied to the Active Config by calling `activateWithCompletion:`. When you fetch values
+/// from the Remote Config Server using the default Firebase namespace service, you should use this
+/// class method to create a shared instance of the FIRRemoteConfig object to ensure that your app
+/// will function properly with the Remote Config Server and the Firebase service.
++ (nonnull FIRRemoteConfig *)remoteConfigWithApp:(nonnull FIRApp *)app
+    NS_SWIFT_NAME(remoteConfig(app:));
+
+/// Unavailable. Use +remoteConfig instead.
+- (nonnull instancetype)init __attribute__((unavailable("Use +remoteConfig instead.")));
+
+/// Ensures initialization is complete and clients can begin querying for Remote Config values.
+/// @param completionHandler Initialization complete callback with error parameter.
+- (void)ensureInitializedWithCompletionHandler:
+    (void (^_Nonnull)(NSError *_Nullable initializationError))completionHandler;
+#pragma mark - Fetch
+/// Fetches Remote Config data with a callback. Call `activateWithCompletion:` to make fetched data
+/// available to your app.
+///
+/// Note: This method uses a Firebase Installations token to identify the app instance, and once
+/// it's called, it periodically sends data to the Firebase backend. (see
+/// `[FIRInstallations authTokenWithCompletion:]`).
+/// To stop the periodic sync, developers need to call `[FIRInstallations deleteWithCompletion:]`
+/// and avoid calling this method again.
+///
+/// @param completionHandler Fetch operation callback with status and error parameters.
+- (void)fetchWithCompletionHandler:(void (^_Nullable)(FIRRemoteConfigFetchStatus status,
+                                                      NSError *_Nullable error))completionHandler;
+
+/// Fetches Remote Config data and sets a duration that specifies how long config data lasts.
+/// Call `activateWithCompletion:` to make fetched data available to your app.
+///
+/// Note: This method uses a Firebase Installations token to identify the app instance, and once
+/// it's called, it periodically sends data to the Firebase backend. (see
+/// `[FIRInstallations authTokenWithCompletion:]`).
+/// To stop the periodic sync, developers need to call `[FIRInstallations deleteWithCompletion:]`
+/// and avoid calling this method again.
+///
+/// @param expirationDuration  Override the (default or optionally set minimumFetchInterval property
+/// in FIRRemoteConfigSettings) minimumFetchInterval for only the current request, in seconds.
+/// Setting a value of 0 seconds will force a fetch to the backend.
+/// @param completionHandler   Fetch operation callback with status and error parameters.
+- (void)fetchWithExpirationDuration:(NSTimeInterval)expirationDuration
+                  completionHandler:(void (^_Nullable)(FIRRemoteConfigFetchStatus status,
+                                                       NSError *_Nullable error))completionHandler;
+
+/// Fetches Remote Config data and if successful, activates fetched data. Optional completion
+/// handler callback is invoked after the attempted activation of data, if the fetch call succeeded.
+///
+/// Note: This method uses a Firebase Installations token to identify the app instance, and once
+/// it's called, it periodically sends data to the Firebase backend. (see
+/// `[FIRInstallations authTokenWithCompletion:]`).
+/// To stop the periodic sync, developers need to call `[FIRInstallations deleteWithCompletion:]`
+/// and avoid calling this method again.
+///
+/// @param completionHandler Fetch operation callback with status and error parameters.
+- (void)fetchAndActivateWithCompletionHandler:
+    (void (^_Nullable)(FIRRemoteConfigFetchAndActivateStatus status,
+                       NSError *_Nullable error))completionHandler;
+
+#pragma mark - Apply
+
+/// Applies Fetched Config data to the Active Config, causing updates to the behavior and appearance
+/// of the app to take effect (depending on how config data is used in the app).
+/// @param completion Activate operation callback with changed and error parameters.
+- (void)activateWithCompletion:(void (^_Nullable)(BOOL changed,
+                                                  NSError *_Nullable error))completion;
+
+#pragma mark - Get Config
+/// Enables access to configuration values by using object subscripting syntax.
+/// <pre>
+/// // Example:
+/// FIRRemoteConfig *config = [FIRRemoteConfig remoteConfig];
+/// FIRRemoteConfigValue *value = config[@"yourKey"];
+/// BOOL b = value.boolValue;
+/// NSNumber *number = config[@"yourKey"].numberValue;
+/// </pre>
+- (nonnull FIRRemoteConfigValue *)objectForKeyedSubscript:(nonnull NSString *)key;
+
+/// Gets the config value.
+/// @param key Config key.
+- (nonnull FIRRemoteConfigValue *)configValueForKey:(nullable NSString *)key;
+
+/// Gets the config value of a given source from the default namespace.
+/// @param key              Config key.
+/// @param source           Config value source.
+- (nonnull FIRRemoteConfigValue *)configValueForKey:(nullable NSString *)key
+                                             source:(FIRRemoteConfigSource)source;
+
+/// Gets all the parameter keys of a given source from the default namespace.
+///
+/// @param source           The config data source.
+/// @return                 An array of keys under the given source.
+- (nonnull NSArray<NSString *> *)allKeysFromSource:(FIRRemoteConfigSource)source;
+
+/// Returns the set of parameter keys that start with the given prefix, from the default namespace
+///                         in the active config.
+///
+/// @param prefix           The key prefix to look for. If prefix is nil or empty, returns all the
+///                         keys.
+/// @return                 The set of parameter keys that start with the specified prefix.
+- (nonnull NSSet<NSString *> *)keysWithPrefix:(nullable NSString *)prefix;
+
+#pragma mark - Defaults
+/// Sets config defaults for parameter keys and values in the default namespace config.
+/// @param defaults         A dictionary mapping a NSString * key to a NSObject * value.
+- (void)setDefaults:(nullable NSDictionary<NSString *, NSObject *> *)defaults;
+
+/// Sets default configs from plist for default namespace.
+///
+/// @param fileName The plist file name, with no file name extension. For example, if the plist file
+///                 is defaultSamples.plist, call:
+///                 [[FIRRemoteConfig remoteConfig] setDefaultsFromPlistFileName:@"defaultSamples"];
+- (void)setDefaultsFromPlistFileName:(nullable NSString *)fileName
+    NS_SWIFT_NAME(setDefaults(fromPlist:));
+
+/// Returns the default value of a given key from the default config.
+///
+/// @param key              The parameter key of default config.
+/// @return                 Returns the default value of the specified key. Returns
+///                         nil if the key doesn't exist in the default config.
+- (nullable FIRRemoteConfigValue *)defaultValueForKey:(nullable NSString *)key;
+
+@end

+ 17 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Headers/FirebaseRemoteConfig.h

@@ -0,0 +1,17 @@
+/*
+ * Copyright 2019 Google
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#import "FIRRemoteConfig.h"

+ 20 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Info.plist

@@ -0,0 +1,20 @@
+<?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>CFBundleExecutable</key>
+	<string>FirebaseRemoteConfig</string>
+	<key>CFBundleIdentifier</key>
+	<string>com.firebase.Firebase-FirebaseRemoteConfig</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>FirebaseRemoteConfig</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleVersion</key>
+	<string>8.15.0</string>
+	<key>DTSDKName</key>
+	<string>iphonesimulator11.2</string>
+</dict>
+</plist>

+ 11 - 0
PDF Office/PDF Master/Third Pard Library/FirebaseAnalytics/FirebaseRemoteConfig/FirebaseRemoteConfig.framework/Modules/module.modulemap

@@ -0,0 +1,11 @@
+framework module FirebaseRemoteConfig {
+umbrella header "FirebaseRemoteConfig.h"
+export *
+module * { export * }
+  link framework "AppKit"
+  link framework "CoreTelephony"
+  link framework "Foundation"
+  link framework "Security"
+  link framework "SystemConfiguration"
+  link "z"
+}

+ 30 - 0
PDF Office/PDF Master/Third Pard Library/RemoteConfig /DMGRemoteConfigDefaults.plist

@@ -0,0 +1,30 @@
+<?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>appEvaluateBeforeAdsCount</key>
+	<string>2</string>
+	<key>appEvaluateAfterAdsCount</key>
+	<string>3</string>
+	<key>isDisplayAds</key>
+	<true/>
+	<key>isDisplayAdsEvaluateAfter</key>
+	<true/>
+	<key>displayAdsUrl </key>
+	<string>https://www.pdfreaderpro.com/native?s=PDFReaderPro_Mac_DMG_728x90_pro</string>
+	<key>displayHouseAdsUrl</key>
+	<string>https://www.pdfreaderpro.com/native?s=PDFReaderPro_Mac_DMG_HouseAD_728x90</string>
+	<key>refreshAdsRate</key>
+	<string>1000000</string>
+	<key>refreshAdsRateEvaluateAfter</key>
+	<string>1000000</string>
+	<key>refreshAdsDate</key>
+	<string>180</string>
+	<key>refreshAdsDateEvaluateAfter</key>
+	<string>180</string>
+	<key>closeIntervalDate</key>
+	<string>600</string>
+	<key>closeIntervalDateEvaluateAfter</key>
+	<string>600</string>
+</dict>
+</plist>

+ 195 - 0
PDF Office/PDF Master/Third Pard Library/RemoteConfig /KMFirebaseRemoteConfig.swift

@@ -0,0 +1,195 @@
+import Foundation
+import FirebaseRemoteConfig
+
+enum KMRemoteConfigFetchStatus: Int {
+    case success
+    case failure
+}
+
+let KMFirebaseRemateConfigRequestIsSuccessful = "KMFirebaseRemateConfigRequestIsSuccessful"
+let KMFirebaseRemateConfigFinishNoti = "KMFirebaseRemateConfigFinishNoti"
+
+class KMKdanRemoteConfig: NSObject {
+
+    typealias KMRemoteConfigFetchCompletion = (KMRemoteConfigFetchStatus, Error?) -> Void
+
+    private let kIsDisplayAdsKey = "isDisplayAds"
+    private let kIsDisplayAdsEvaluateAfterKey = "isDisplayAdsEvaluateAfter"
+    private let kDisplayAdsUrlConfigKey = "displayAdsUrl"
+    private let kDisplayHouseAdsUrlConfigKey = "displayHouseAdsUrl"
+    private let kRefreshAdsRateDayKey = "refreshAdsRate"
+    private let kRefreshAdsRateDayEvaluateAfterKey = "refreshAdsRateEvaluateAfter"
+    private let kRefreshAdsDateDayKey = "refreshAdsDate"
+    private let kRefreshAdsDateDayEvaluateAfterKey = "refreshAdsDateEvaluateAfter"
+    private let kCloseIntervalDateDayKey = "closeIntervalDate"
+    private let kCloseIntervalDateDayEvaluateAfterKey = "closeIntervalDateEvaluateAfter"
+    private let kAppEvaluateBeforeAdsCountKey = "appEvaluateBeforeAdsCount"
+    private let kAppEvaluateAfterAdsCountKey = "appEvaluateAfterAdsCount"
+
+    private var remoteConfigDatas: [String: Any] = [:]
+    private var userInfo: [String: Any] = [:]
+
+    private lazy var firebaseConfig: RemoteConfig = {
+        let config = RemoteConfig.remoteConfig()
+        let settings = RemoteConfigSettings()
+        settings.minimumFetchInterval = 0
+        config.configSettings = settings
+        
+        #if VERSION_FREE
+            config.setDefaults(fromPlist: "RemoteConfigDefaults")
+        #else
+            config.setDefaults(fromPlist: "ProRemoteConfigDefaults")
+        #endif
+        
+        return config
+    }()
+
+    static func remoteConfig() -> KMKdanRemoteConfig {
+        return KMKdanRemoteConfig()
+    }
+
+    override init() {
+        super.init()
+        let mainBundleString = Bundle.main.bundleIdentifier ?? ""
+        var dataPath: String?
+
+        #if VERSION_DMG
+            dataPath = Bundle.main.path(forResource: "DMGRemoteConfigDefaults", ofType: "plist")
+        #else
+            #if VERSION_FREE
+                dataPath = Bundle.main.path(forResource: "RemoteConfigDefaults", ofType: "plist")
+            #else
+                dataPath = Bundle.main.path(forResource: "ProRemoteConfigDefaults", ofType: "plist")
+            #endif
+        #endif
+
+        if let path = dataPath, let dict = NSDictionary(contentsOfFile: path) as? [String: Any] {
+            self.userInfo = dict
+        }
+    }
+
+    func fetch(completionHandler: @escaping KMRemoteConfigFetchCompletion) {
+        // Your implementation here
+    }
+
+    func fetchWithRemoteConfigCompletionHandler(completionHandler: @escaping RemoteConfigFetchCompletion) {
+        // Your implementation here
+    }
+
+    func isDisplayAds() -> Bool {
+        var isDisplayAds = userInfo[kIsDisplayAdsKey] as? Bool ?? true
+        if let value = remoteConfigDatas[kIsDisplayAdsKey] as? Bool {
+            isDisplayAds = value
+        }
+        return isDisplayAds
+    }
+
+    func isDisplayAdsEvaluateAfter() -> Bool {
+        var isDisplayAds = userInfo[kIsDisplayAdsEvaluateAfterKey] as? Bool ?? true
+        if let value = remoteConfigDatas[kIsDisplayAdsEvaluateAfterKey] as? Bool {
+            isDisplayAds = value
+        }
+        return isDisplayAds
+    }
+
+    func displayHouseAdsUrl() -> String {
+        var adsUrl = userInfo[kDisplayHouseAdsUrlConfigKey] as? String ?? ""
+        if let value = remoteConfigDatas[kDisplayHouseAdsUrlConfigKey] as? String {
+            adsUrl = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
+        }
+        return adsUrl
+    }
+
+    func displayAdsUrl() -> String {
+        var adsUrl = userInfo[kDisplayAdsUrlConfigKey] as? String ?? ""
+        if let value = remoteConfigDatas[kDisplayAdsUrlConfigKey] as? String {
+            adsUrl = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? ""
+        }
+        return adsUrl
+    }
+
+    func refreshAdsRate() -> Int {
+        var adsRate = userInfo[kRefreshAdsRateDayKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kRefreshAdsRateDayKey] as? Int {
+            adsRate = value
+        }
+        return adsRate
+    }
+
+    func refreshAdsRateEvaluateAfter() -> Int {
+        var adsRate = userInfo[kRefreshAdsRateDayEvaluateAfterKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kRefreshAdsRateDayEvaluateAfterKey] as? Int {
+            adsRate = value
+        }
+        return adsRate
+    }
+
+    func refreshAdsDate() -> Int {
+        var adsDate = userInfo[kRefreshAdsDateDayKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kRefreshAdsDateDayKey] as? Int {
+            adsDate = value
+        }
+        return adsDate
+    }
+
+    func refreshAdsDateEvaluateAfter() -> Int {
+        var adsDate = userInfo[kRefreshAdsDateDayEvaluateAfterKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kRefreshAdsDateDayEvaluateAfterKey] as? Int {
+            adsDate = value
+        }
+        return adsDate
+    }
+
+    func closeIntervalDate() -> Int {
+        var intervalDate = userInfo[kCloseIntervalDateDayKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kCloseIntervalDateDayKey] as? Int {
+            intervalDate = value
+        }
+        return intervalDate
+    }
+
+    func closeIntervalDateEvaluateAfter() -> Int {
+        var intervalDate = userInfo[kCloseIntervalDateDayEvaluateAfterKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kCloseIntervalDateDayEvaluateAfterKey] as? Int {
+            intervalDate = value
+        }
+        return intervalDate
+    }
+
+    func appEvaluateBeforeAdsCount() -> Int {
+        var evaluateCount = userInfo[kAppEvaluateBeforeAdsCountKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kAppEvaluateBeforeAdsCountKey] as? Int {
+            evaluateCount = value
+        }
+        return evaluateCount
+    }
+
+    func appEvaluateAfterAdsCount() -> Int {
+        var evaluateCount = userInfo[kAppEvaluateAfterAdsCountKey] as? Int ?? 0
+        if let value = remoteConfigDatas[kAppEvaluateAfterAdsCountKey] as? Int {
+            evaluateCount = value
+        }
+        return evaluateCount
+    }
+
+    func showSDKRecommendInfo() -> Bool {
+        guard firebaseConfig.lastFetchStatus == .success else {
+            return false
+        }
+        return firebaseConfig["SDKRecommendKey"].boolValue
+    }
+
+    func showAPP_AveragePrice() -> Bool {
+        guard firebaseConfig.lastFetchStatus == .success else {
+            return false
+        }
+        return firebaseConfig["ShowAPP_AveragePrice"].boolValue
+    }
+
+    func showHelp_More_RecommendLink() -> Bool {
+        guard firebaseConfig.lastFetchStatus == .success else {
+            return false
+        }
+        return firebaseConfig["Help_More_Link_Recommend"].boolValue
+    }
+}

+ 34 - 0
PDF Office/PDF Master/Third Pard Library/RemoteConfig /ProRemoteConfigDefaults.plist

@@ -0,0 +1,34 @@
+<?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>appEvaluateAfterAdsCount</key>
+	<string>3</string>
+	<key>appEvaluateBeforeAdsCount</key>
+	<string>2</string>
+	<key>isDisplayAds</key>
+	<true/>
+	<key>isDisplayAdsEvaluateAfter</key>
+	<true/>
+	<key>displayAdsUrl</key>
+	<string>https://www.pdfreaderpro.com/native?s=PDFReaderPro_Mac_Store_728x90_pro</string>
+	<key>displayHouseAdsUrl</key>
+	<string>https://www.pdfreaderpro.com/native?s=PDFReaderPro_Mac_Store_HouseAD_728x90</string>
+	<key>refreshAdsRate</key>
+	<string>1000000</string>
+	<key>refreshAdsRateEvaluateAfter</key>
+	<string>1000000</string>
+	<key>refreshAdsDate</key>
+	<string>180</string>
+	<key>refreshAdsDateEvaluateAfter</key>
+	<string>180</string>
+	<key>closeIntervalDate</key>
+	<string>600</string>
+	<key>closeIntervalDateEvaluateAfter</key>
+	<string>600</string>
+	<key>ShowAPP_AveragePrice</key>
+	<false/>
+	<key>SDKRecommendKey</key>
+	<false/>
+</dict>
+</plist>

+ 34 - 0
PDF Office/PDF Master/Third Pard Library/RemoteConfig /RemoteConfigDefaults.plist

@@ -0,0 +1,34 @@
+<?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>appEvaluateAfterAdsCount</key>
+	<string>3</string>
+	<key>appEvaluateBeforeAdsCount</key>
+	<string>2</string>
+	<key>isDisplayAds</key>
+	<true/>
+	<key>isDisplayAdsEvaluateAfter</key>
+	<true/>
+	<key>displayAdsUrl</key>
+	<string>https://www.pdfreaderpro.com/native?s=PDFReaderPro_Mac_Store_728x90_pro</string>
+	<key>displayHouseAdsUrl</key>
+	<string>https://www.pdfreaderpro.com/native?s=PDFReaderPro_Mac_Store_HouseAD_728x90</string>
+	<key>refreshAdsRate</key>
+	<string>1000000</string>
+	<key>refreshAdsRateEvaluateAfter</key>
+	<string>1000000</string>
+	<key>refreshAdsDate</key>
+	<string>180</string>
+	<key>refreshAdsDateEvaluateAfter</key>
+	<string>180</string>
+	<key>closeIntervalDate</key>
+	<string>600</string>
+	<key>closeIntervalDateEvaluateAfter</key>
+	<string>600</string>
+	<key>SDKRecommendKey</key>
+	<false/>
+	<key>ShowAPP_AveragePrice</key>
+	<false/>
+</dict>
+</plist>