From 52bc654764db371cb55dcf88914b26d8cf89714e Mon Sep 17 00:00:00 2001 From: atusi Date: Fri, 29 Oct 2021 20:28:12 +0900 Subject: [PATCH] Add AdNetwork --- popcorn/Assets/ExternalDependencyManager.meta | 8 + .../ExternalDependencyManager/Editor.meta | 8 + .../Editor/CHANGELOG.md | 1301 +++++++++++++++++ .../Editor/CHANGELOG.md.meta | 7 + .../Editor/Google.IOSResolver_v1.2.164.dll | Bin 0 -> 66048 bytes .../Google.IOSResolver_v1.2.164.dll.meta | 33 + .../Editor/Google.JarResolver_v1.2.164.dll | Bin 0 -> 349184 bytes .../Google.JarResolver_v1.2.164.dll.meta | 33 + ...Google.PackageManagerResolver_v1.2.164.dll | Bin 0 -> 73216 bytes ...e.PackageManagerResolver_v1.2.164.dll.meta | 33 + .../Editor/Google.VersionHandler.dll | Bin 0 -> 14848 bytes .../Editor/Google.VersionHandler.dll.meta | 33 + .../Google.VersionHandlerImpl_v1.2.164.dll | Bin 0 -> 117248 bytes ...oogle.VersionHandlerImpl_v1.2.164.dll.meta | 33 + .../ExternalDependencyManager/Editor/LICENSE | 245 ++++ .../Editor/LICENSE.meta | 7 + .../Editor/README.md | 768 ++++++++++ .../Editor/README.md.meta | 7 + ...dency-manager_version-1.2.164_manifest.txt | 13 + ...-manager_version-1.2.164_manifest.txt.meta | 7 + popcorn/Assets/IronSource.meta | 8 + popcorn/Assets/IronSource/DemoScene.meta | 8 + .../IronSource/DemoScene/IronSourceDemo.unity | 546 +++++++ .../DemoScene/IronSourceDemo.unity.meta | 7 + .../DemoScene/IronSourceDemoScript.cs | 427 ++++++ .../DemoScene/IronSourceDemoScript.cs.meta | 11 + .../IronSource/DemoScene/logo_small.png | Bin 0 -> 20634 bytes .../IronSource/DemoScene/logo_small.png.meta | 88 ++ popcorn/Assets/IronSource/Editor.meta | 8 + .../IronSource/Editor/IAdapterSettings.cs | 10 + .../Editor/IAdapterSettings.cs.meta | 11 + .../Editor/IronSourceBuildPostprocessor.cs | 88 ++ .../IronSourceBuildPostprocessor.cs.meta | 11 + .../Editor/IronSourceDependenciesManager.cs | 558 +++++++ .../IronSourceDependenciesManager.cs.meta | 11 + .../Editor/IronSourceEditorCoroutines.cs | 37 + .../Editor/IronSourceEditorCoroutines.cs.meta | 11 + .../Editor/IronSourceManifestProcessor.cs | 134 ++ .../IronSourceManifestProcessor.cs.meta | 11 + .../IronSourceMediatedNetworkSettings.cs | 21 + .../IronSourceMediatedNetworkSettings.cs.meta | 11 + ...nSourceMediatedNetworkSettingsInspector.cs | 27 + ...ceMediatedNetworkSettingsInspector.cs.meta | 11 + .../IronSourceMediationSettingsInspector.cs | 27 + ...onSourceMediationSettingsInspector.cs.meta | 11 + .../IronSource/Editor/IronSourceMenu.cs | 72 + .../IronSource/Editor/IronSourceMenu.cs.meta | 11 + .../Editor/IronSourcePlistProcessor.cs | 133 ++ .../Editor/IronSourcePlistProcessor.cs.meta | 11 + .../Editor/IronSourceSDKDependencies.xml | 42 + .../Editor/IronSourceSDKDependencies.xml.meta | 7 + popcorn/Assets/IronSource/Plugins.meta | 8 + .../Assets/IronSource/Plugins/Android.meta | 8 + .../Plugins/Android/IronSource.plugin.meta | 28 + .../IronSource.plugin/AndroidManifest.xml | 23 + .../AndroidManifest.xml.meta | 7 + .../Android/IronSource.plugin/libs.meta | 8 + .../IronSource.plugin/libs/android-bridge.jar | Bin 0 -> 19129 bytes .../libs/android-bridge.jar.meta | 7 + .../IronSource.plugin/project.properties | 1 + .../IronSource.plugin/project.properties.meta | 7 + popcorn/Assets/IronSource/Plugins/iOS.meta | 8 + .../Plugins/iOS/IronSourceUnityConfig.m | 78 + .../Plugins/iOS/IronSourceUnityConfig.m.meta | 37 + .../Assets/IronSource/Plugins/iOS/iOSBridge.h | 17 + .../IronSource/Plugins/iOS/iOSBridge.h.meta | 27 + .../Assets/IronSource/Plugins/iOS/iOSBridge.m | 1019 +++++++++++++ .../IronSource/Plugins/iOS/iOSBridge.m.meta | 37 + popcorn/Assets/IronSource/Scripts.meta | 9 + .../Assets/IronSource/Scripts/AndroidAgent.cs | 314 ++++ .../IronSource/Scripts/AndroidAgent.cs.meta | 11 + .../Assets/IronSource/Scripts/IronSource.cs | 317 ++++ .../IronSource/Scripts/IronSource.cs.meta | 11 + .../IronSource/Scripts/IronSourceConfig.cs | 127 ++ .../Scripts/IronSourceConfig.cs.meta | 11 + .../IronSource/Scripts/IronSourceConstants.cs | 35 + .../Scripts/IronSourceConstants.cs.meta | 11 + .../IronSource/Scripts/IronSourceError.cs | 35 + .../Scripts/IronSourceError.cs.meta | 11 + .../IronSource/Scripts/IronSourceEvents.cs | 1246 ++++++++++++++++ .../Scripts/IronSourceEvents.cs.meta | 11 + .../IronSource/Scripts/IronSourceIAgent.cs | 176 +++ .../Scripts/IronSourceIAgent.cs.meta | 11 + .../Scripts/IronSourceImpressionData.cs | 127 ++ .../Scripts/IronSourceImpressionData.cs.meta | 11 + .../Scripts/IronSourceInitilizer.cs | 43 + .../Scripts/IronSourceInitilizer.cs.meta | 11 + .../IronSource/Scripts/IronSourceJSON.cs | 495 +++++++ .../IronSource/Scripts/IronSourceJSON.cs.meta | 11 + .../Scripts/IronSourceMediationSettings.cs | 26 + .../IronSourceMediationSettings.cs.meta | 11 + .../IronSource/Scripts/IronSourcePlacement.cs | 37 + .../Scripts/IronSourcePlacement.cs.meta | 11 + .../IronSource/Scripts/IronSourceSegment.cs | 66 + .../Scripts/IronSourceSegment.cs.meta | 11 + .../IronSource/Scripts/IronSourceUtils.cs | 59 + .../Scripts/IronSourceUtils.cs.meta | 11 + .../Scripts/UnsupportedPlatformAgent.cs | 287 ++++ .../Scripts/UnsupportedPlatformAgent.cs.meta | 11 + popcorn/Assets/IronSource/Scripts/iOSAgent.cs | 455 ++++++ .../IronSource/Scripts/iOSAgent.cs.meta | 11 + popcorn/Assets/MyGame/Scripts/AdManager.cs | 56 +- .../Scripts/InitializeUnityEditorChecker.cs | 6 +- .../ProjectSettings/GvhProjectSettings.xml | 6 + 104 files changed, 10289 insertions(+), 34 deletions(-) create mode 100644 popcorn/Assets/ExternalDependencyManager.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.IOSResolver_v1.2.164.dll create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.IOSResolver_v1.2.164.dll.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.JarResolver_v1.2.164.dll create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.JarResolver_v1.2.164.dll.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.PackageManagerResolver_v1.2.164.dll create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.PackageManagerResolver_v1.2.164.dll.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/LICENSE create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/LICENSE.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/README.md create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/README.md.meta create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt create mode 100644 popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt.meta create mode 100644 popcorn/Assets/IronSource.meta create mode 100644 popcorn/Assets/IronSource/DemoScene.meta create mode 100644 popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity create mode 100644 popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity.meta create mode 100644 popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs create mode 100644 popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs.meta create mode 100644 popcorn/Assets/IronSource/DemoScene/logo_small.png create mode 100644 popcorn/Assets/IronSource/DemoScene/logo_small.png.meta create mode 100644 popcorn/Assets/IronSource/Editor.meta create mode 100644 popcorn/Assets/IronSource/Editor/IAdapterSettings.cs create mode 100644 popcorn/Assets/IronSource/Editor/IAdapterSettings.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceBuildPostprocessor.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceBuildPostprocessor.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMenu.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceMenu.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs create mode 100644 popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs.meta create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml create mode 100644 popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml.meta create mode 100644 popcorn/Assets/IronSource/Plugins.meta create mode 100644 popcorn/Assets/IronSource/Plugins/Android.meta create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin.meta create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml.meta create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs.meta create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs/android-bridge.jar create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs/android-bridge.jar.meta create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties create mode 100644 popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties.meta create mode 100644 popcorn/Assets/IronSource/Plugins/iOS.meta create mode 100644 popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m create mode 100644 popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m.meta create mode 100644 popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h create mode 100644 popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h.meta create mode 100755 popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m create mode 100644 popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m.meta create mode 100644 popcorn/Assets/IronSource/Scripts.meta create mode 100644 popcorn/Assets/IronSource/Scripts/AndroidAgent.cs create mode 100644 popcorn/Assets/IronSource/Scripts/AndroidAgent.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSource.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSource.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceError.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceError.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs create mode 100644 popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs create mode 100644 popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs.meta create mode 100644 popcorn/Assets/IronSource/Scripts/iOSAgent.cs create mode 100644 popcorn/Assets/IronSource/Scripts/iOSAgent.cs.meta create mode 100644 popcorn/ProjectSettings/GvhProjectSettings.xml diff --git a/popcorn/Assets/ExternalDependencyManager.meta b/popcorn/Assets/ExternalDependencyManager.meta new file mode 100644 index 00000000..2bef3d81 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a541636fe019e4287bbde9fc5406301a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/ExternalDependencyManager/Editor.meta b/popcorn/Assets/ExternalDependencyManager/Editor.meta new file mode 100644 index 00000000..4eafa420 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 949bf3efe84914b718a63835d0f934f3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md b/popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md new file mode 100644 index 00000000..93580bfc --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md @@ -0,0 +1,1301 @@ +# Version 1.2.164 - Feb 4, 2021 +## New Features +* Android Resolver - Added support for Android packages with classifier in their + namespaces. +* iOS Resolver - Added new settings in iOS Resolver to configure generated + Podfile. +* iOS Resolver - Added a new attribute `addToAllTargets` in Dependencies.xml. + +## Bug Fixes +* iOS Resolver - Fixed XML parsing for `bitcodeEnabled` attribute in + Dependencies.xml. + +# Version 1.2.163 - Dec 15, 2020 +## Bug Fixes +* Version Handler - Fixed measurement reporting + +# Version 1.2.162 - Nov 19, 2020 +## Bug Fixes +* Version Handler - Improved #413 by preventing Version Handler from running + from static constructor when it is disabled. +* Package Manager Resolver - Remove GPR + +# Version 1.2.161 - Oct 12, 2020 +## Bug Fixes +* Android Resolver - Fixed the issue that Android Resolver does not resolve + again before build in Unity 2020 if it failed to resolve previously. + +# Version 1.2.160 - Sep 30, 2020 +## Bug Fixes +* Android Resolver - Fixed a regression that gradleResolver can be null until + Initialize() is called. +* Android Resolver - Fixed a regression that Android Resolver failed in Unity + 2019.3+ due to `gradleTemplate.properties` not enabled when + `mainTemplate.gradle` is not enabled at all. + +# Version 1.2.159 - Sep 11, 2020 +## Bug Fixes +* Android Resolver - Fixed #322 where the Unity editor will lose its target SDK + setting between Unity restarts if `>28` is selected in 2019. This is due to + Unity AndroidSdkVersions enum does not contain values above 28. +* Android Resolver - Fixed #360 where building Android app with Untiy 2019.3+ + may fail due to Jetifier and AndroidX not enabled properly in generated + Gradle project. This fix requires the user to enable + `Custom Gradle Properties Template` found under + `Player Settings > Settings for Android > Publishing Settings`. + +# Version 1.2.158 - Sep 3, 2020 +## Bug Fixes +* Version Handler: Fixed editor freeze when `-executeMethod` is used in + non-batch mode. +* Android Resolver: Normalized file paths when generating local Maven repo + since the path may contains a mix of forward and backward slash on Windows. +* Export Unity Package: Fixed generation of .unitypackage with tarfile on + Windows. + +# Version 1.2.157 - Aug 6, 2020 +## Bug Fixes +* Android Resolver: Delay initialization until active build target is Android + and the editor is not in play mode. +* iOS Resolver: Delay initialization until active build target is iOS + and the editor is not in play mode. +* Export Unity Package: Workaround directory creation racy if multiple export + operations are spawned at the same time. + +# Version 1.2.156 - June 10, 2020 +## Bug Fixes +* Android Resolver: Fixed that the generated local repo assets contains + redundent labels which are causing Version Handler to failed while + uninstalling packages. +* Android Resolver: Fixed that the repo url injected into mainTemplate.gradle + is incorrect when Unity is configured to export gradle project. +* Android Resolver: Limited to only create local Maven repo when the source + repo contains ".srcaar" file. + +## Changes +* All: Described EDM4U analytics data usage in readme. + +# Version 1.2.155 - May 14, 2020 +## Bug Fixes +* All: Fixed compiler error when build with Unity 5.4 or below due to the + usage of Rect.zero. +* All: Ignore cases when checking command line arguments. + +# Version 1.2.154 - May 14, 2020 +## Bug Fixes +* All: Make each MultiSelectWindow for different purposes to have its own + unique window. + +## Changes +* All: Replace all dialog with DialogWindow which is implemented from + EditorWindow. +* Package Manager Resolver: Clarify how manifest.json will be changed in Package + Manager Resolver window. + +# Version 1.2.153 - Apr 24, 2020 +## Bug Fixes +* Android Resolver: Fixed an exception when repainting the Android resolution + window in Unity 2019.3.x. + +# Version 1.2.152 - Apr 17, 2020 +## Bug Fixes +* Version Handler: Fixed exception when waiting for enabled editor DLLs to + load. +* Android Resolver: Fixed regression when using a Custom Gradle Template + on Windows. + +# Version 1.2.151 - Apr 16, 2020 +## Bug Fixes +* Version Handler: When waiting for newly enabled editor DLLs to load, ignore + all DLLs that do not have a file-system location. +* Android Resolver: Fixed resolution when using a Custom Gradle Template with + libraries stored in a local maven repository distributed with a plugin + installed with the Unity Package Manager. + +# Version 1.2.150 - Apr 9, 2020 +## Bug Fixes +* All: The new packaging script when run on MacOS was generating a + .unitypackage archive that could not be read by Unity on Windows. + This release simply repackages the plugin with tar/gzip to fix the problem. + +# Version 1.2.149 - Apr 8, 2020 +## Bug Fixes +* Package Manager Resolver: Fixed spurious error message when resuming + migration after installing a UPM package. + +# Version 1.2.148 - Apr 8, 2020 +## Bug Fixes +* Package Manager Resolver: Fixed an exception when resuming migration + after installing a UPM package. + +# Version 1.2.147 - Apr 8, 2020 +## Bug Fixes +* Version Handler: Fixed alias traversal bug which caused problems when + migrating from installed .unitypackage files to UPM packages. + +# Version 1.2.146 - Apr 8, 2020 +## Bug Fixes +* Version Handler: Fixed exception in manifest parsing when a manifest is + detected with no aliases. + +# Version 1.2.145 - Apr 2, 2020 +## New Features +* Package Manager Resolver: Added a method to migrate Version Handler + managed packages installed via `.unitypackage` to Unity Package Manager + packages. This is initially used to migrate the External Dependency Manager + to UPM. + +## Changes +* All: Verbose logging is now no longer automatically enabled in batch mode + across all components. Instead logging can be configured using each + component's verbose logging setting or by using the `-gvh_log_debug` command + line flag when starting Unity. +* Version Handler: Sped up version handler updates when the app domain isn't + reloaded. + +## Bug Fixes +* Version Handler: Fixed the display of the obsolete files clean up dialog + when the asset database refreshes. +* Version Handler: Improved reliability of callback from + the VersionHandler.UpdateCompleteMethods event when an asset database + refresh occurs. +* Version Handler: Fixed duplicate exportPath labels when 'Assets/' is the + root of paths assigned to files. +* Version Handler: Handle empty lines in manifest files. + +# Version 1.2.144 - Mar 23, 2020 +## Changed +* iOS Resolver: Removed the ability to configure the Xcode target a Cocoapod + is added to. + +## Bug Fixes +* iOS Resolver: Reverted support for adding Cocoapods to multiple targets as + it caused a regression (exception thrown during post-build step) in some + versions of Unity. + +# Version 1.2.143 - Mar 20, 2020 +## Bug Fixes +* Android Resolver: Fixed caching of resolution state which was causing + the resolver to always run when no dependencies had changed. + +# Version 1.2.142 - Mar 19, 2020 +## Changes +* Package Manager Resolver: Enabled auto-add by default. + +# Version 1.2.141 - Mar 19, 2020 +## Bug Fixes +* Fixed a bug when retrieving project settings. If a plugin was configured + to fetch project settings, if a setting was fetched (e.g "foo") and this + setting existed in the system settings but not the project settings the + system value would override the default value leading to unexpected + behavior. +* Fixed a warning when caching web request classes in Unity 5.6. + +# Version 1.2.140 - Mar 19, 2020 +## Bug Fixes +* Fixed measurement reporting in Unity 5.x. +* Version Handler: Fixed NullReferenceException when an asset doesn't have + an AssetImporter. + +# Version 1.2.139 - Mar 18, 2020 +## Changed +* Added documentation to the built plugin. + +# Version 1.2.138 - Mar 17, 2020 +## New Features +* Package Manager Resolver: Added the Package Manager Resolver + component that allows developers to easily boostrap Unity Package Manager + (UPM) registry addition using unitypackage plugins. +* Version Handler: Added a window that allows plugins to managed by the + Version Handler to be uninstalled. +* Version Handler: Added support for displaying installed plugins. +* Version Handler: Added support for moving files in plugins to their install + locations (if the plugin has been configured to support this). +* iOS Resolver: Added the ability to configure the Xcode target a Cocoapod is + added to. + +## Bug Fixes +* Fixed upgrade from version 1.2.137 and below after the plugin rename to + EDM4U broke the upgrade process. +* Android Resolver: Worked around PlayerSettings.Android.targetSdkVersion + returning empty names for some values in 2019.x. +* Version Handler: Fixed the display of the obsolete files clean up window. +* Version Handler: Fixed managed file check when assets are modified in the + project after plugin import. + +# Version 1.2.137 - Mar 6, 2020 +## Changed +* Renamed package to External Package Manager for Unity (EDM4U). + We changed this to reflect what this plugin is doing today which is far more + than the original scope which just consisted of importing jar files from the + Android SDK maven repository. + Scripts that used to pull `play-services-resolver*.unitypackage` will now have + to request `external-dependency-manager*.unitypackage` instead. + We'll still be shipping a `play-services-resolver*_manifest.txt` file to + handle upgrading from older versions of the plugin. + +## New Features +* All Components: Added reporting of usage so that we can remotely detect + errors and target improvements. +* Android Resolver: Added support for *Dependencies.xml files in Unity Package + Manager packages. +* iOS Resolver: Added support for *Dependencies.xml files in Unity Package + Manager packages. + +## Bug Fixes +* Version Handler: Disabled attempts to disable asset metadata modification + when assets are in a Unity Package Manager managed package. + +# Version 1.2.136 - Feb 19, 2019 +## Bug Fixes +* Android Resolver: Fixed OpenJDK path discovery in Unity 2019.3.1. + +# Version 1.2.135 - Dec 5, 2019 +## Bug Fixes +* All Components: Fixed stack overflow when loading project settings. + +# Version 1.2.134 - Dec 4, 2019 +## Bug Fixes +* All Components: Fixed an issue which caused project settings to be cleared + when running in batch mode. + +# Version 1.2.133 - Nov 18, 2019 +## Bug Fixes +* All Components: Failure to save project settings will now report an error + to the log rather than throwing an exception. + +# Version 1.2.132 - Nov 11, 2019 +## Bug Fixes +* Android Resolver: Worked around expansion of DIR_UNITYPROJECT on Windows + breaking Gradle builds when used as part of a file URI. +* Android Resolver: mainTemplate.gradle is only written if it needs to be + modified. + +# Version 1.2.131 - Oct 29, 2019 +## Bug Fixes +* Version Handler: Improved execution of events on the main thread in batch + mode. +* Version Handler: Improved log level configuration at startup. +* Version Handler: Improved performance of class lookup in deferred method + calls. +* Version Handler: Fixed rename to enable / disable for editor assets. +* iOS Resolver: Improved log level configuration at startup. +* Android Resolver: Improved local maven repo path reference in + mainTemplate.gradle using DIR_UNITYPROJECT. DIR_UNITYPROJECT by Unity + to point to the local filesystem path of the Unity project when Unity + generates the Gradle project. + +# Version 1.2.130 - Oct 23, 2019 +## New Features +* iOS Resolver: Added support for modifying the Podfile before `pod install` + is executed. + +## Bug Fixes +* Version Handler: Fixed invalid classname error when calling + `VersionHandler.UpdateVersionedAssets()`. + +# Version 1.2.129 - Oct 2, 2019 +## Bug Fixes +* iOS Resolver: Changed Cocoapod integration in Unity 2019.3+ to + only add Pods to the UnityFramework target. + +# Version 1.2.128 - Oct 1, 2019 +## Bug Fixes +* iOS Resolver: Fixed Cocoapod project integration mode with Unity + 2019.3+. + +# Version 1.2.127 - Sep 30, 2019 +## Changes +* Android Resolver: All Android Resolver settings File paths are now + serialized with POSIX directory separators. + +# Version 1.2.126 - Sep 27, 2019 +## Changes +* Android Resolver: File paths are now serialized with POSIX directory + separators. +## Bug Fixes +* Android Resolver: Fixed resolution when the parent directory of a Unity + project contains a Gradle project (i.e `settings.gradle` file). + +# Version 1.2.125 - Sep 23, 2019 +## Bug Fixes +* All components: Silenced a warning about not being able to set the console + encoding to UTF8. +* Android Resolver: Worked around broken AndroidSDKTools class in some + versions of Unity. +* iOS Resolver: Fixed iOS target SDK version check +* Version Handler: Changed clean up obsolete files window so that it doesn't + exceed the screen size. + +# Version 1.2.124 - Jul 28, 2019 +## Bug Fixes +* All components: Fixed regression with source control integration when using + Unity 2019.1+. + +# Version 1.2.123 - Jul 23, 2019 +## New Features +* All components: Source control integration for project settings. +## Changes +* Android Resolver: Removed AAR cache as it now makes little difference to + incremental resolution performance. +* Android Resolver: Improved embedded resource management so that embedded + resources should upgrade when the plugin is updated without restarting + the Unity editor. +## Bug Fixes +* Version Handler: Fixed InvokeMethod() and InvokeStaticMethod() when calling + methods that have interface typed arguments. + +# Version 1.2.122 - Jul 2, 2019 +## Bug Fixes +* iOS Resolver: Worked around Unity not loading the iOS Resolver DLL as it + referenced the Xcode extension in a public interface. The iOS Resolver + DLL still references the Xcode extension internally and just handles + missing type exceptions dynamically. + +# Version 1.2.121 - Jun 27, 2019 +## Bug Fixes +* Android Resolver: Fixed warning about missing Packages folder when loading + XML dependencies files in versions of Unity without the package manager. +* Android Resolver: Fixed resolution window progress bar exceeding 100%. +* Android Resolver: If AndroidX is detected in the set of resolved libraries, + the user will be prompted to enable the Jetifier. +* Android Resolver: Improved text splitting in text area windows. +* iOS Resolver: Added support for Unity's breaking changes to the Xcode API + in 2019.3.+. Cocoapods are now added to build targets, Unity-iPhone and + UnityFramework in Unity 2019.3+. + +# Version 1.2.120 - Jun 26, 2019 +## New Features +* Android Resolver: Added support for loading *Dependencies.xml files from + Unity Package Manager packages. +* Android Resolver: Resolution window is now closed if resolution runs as + a pre-build step. +* iOS Resolver: Added support for loading *Dependencies.xml files from + Unity Package Manager packages. +## Bug Fixes +* Android Resolver: Fixed generation of relative repo paths when using + mainTemplate.gradle resolver. +* Android Resolver: Fixed copy of .srcaar to .aar files in repos embedded in a + project when a project path has characters (e.g whitespace) that are escaped + during conversion to URIs. +* Android Resolver: Fixed auto-resolution always running if the Android SDK + is managed by Unity Hub. + +# Version 1.2.119 - Jun 19, 2019 +## Bug Fixes +* Android Resolver: Fixed error reported when using Jetifier integration + in Unity 2018+ if the target SDK is set to "highest installed". + +# Version 1.2.118 - Jun 18, 2019 +## New Features +* Android Resolver: Added initial + [Jetifier](https://developer.android.com/studio/command-line/jetifier) + integration which simplifies + [migration](ttps://developer.android.com/jetpack/androidx/migrate) + to Jetpack ([AndroidX](https://developer.android.com/jetpack/androidx)) + libraries in cases where all dependencies are managed by the Android + Resolver. + This can be enabled via the `Use Jetifier` option in the + `Assets > Play Services Resolver > Android Resolver > Settings` menu. + Caveats: + - If your project contains legacy Android Support Library .jar and .aar + files, these files will need to be removed and replaced with references to + artifacts on Maven via `*Dependencies.xml` files so that the Jetifier + can map them to Jetpack (AndroidX) libraries. + For example, remove the file `support-v4-27.0.2.jar` and replace it with + `` in a + `*Dependencies.xml` file. + - If your project contains .jar or .aar files that use the legacy Android + Support Libraries, these will need to be moved into a local Maven repo + [See this guide](https://maven.apache.org/guides/mini/guide-3rd-party-jars-local.html) + and then these files should be removed from your Unity project and instead + referenced via `*Dependencies.xml` files so that the Jetifier can + patch them to reference the Jetpack lirbaries. + +## Bug Fixes +* Android Resolver: Disabled version locking of com.android.support:multidex + does not use the same versioning scheme as other legacy Android support + libraries. +* Version Handler: Made Google.VersionHandler.dll's asset GUID stable across + releases. This faciliates error-free import into projects where + Google.VersionHandler.dll is moved from the default install location. + +# Version 1.2.117 - Jun 12, 2019 +## Bug Fixes +* Android Resolver: Fix copying of .srcaar to .aar files for + mainTemplate.gradle resolution. PluginImporter configuration was previously + not being applied to .aar files unless the Unity project was saved. + +# Version 1.2.116 - Jun 7, 2019 +## Bug Fixes +* Android Resolver: Fixed resolution of Android dependencies without version + specifiers. +* Android Resolver: Fixed Maven repo not found warning in Android Resolver. +* Android Resolver: Fixed Android Player directory not found exception in + Unity 2019.x when the Android Player isn't installed. + +# Version 1.2.115 - May 28, 2019 +## Bug Fixes +* Android Resolver: Fixed exception due to Unity 2019.3.0a4 removing + x86 from the set of supported ABIs. + +# Version 1.2.114 - May 27, 2019 +## New Features +* Android Resolver: Added support for ABI stripping when using + mainTemplate.gradle. This only works with AARs stored in repos + on the local filesystem. + +# Version 1.2.113 - May 24, 2019 +## New Features +* Android Resolver: If local repos are moved, the plugin will search the + project for matching directories in an attempt to correct the error. +* Version Handler: Files can be now targeted to multiple build targets + using multiple "gvh_" asset labels. +## Bug Fixes +* Android Resolver: "implementation" or "compile" are now added correctly + to mainTemplate.gradle in Unity versions prior to 2019. + +# Version 1.2.112 - May 22, 2019 +## New Features +* Android Resolver: Added option to disable addition of dependencies to + mainTemplate.gradle. + See `Assets > Play Services Resolver > Android Resolver > Settings`. +* Android Resolver: Made paths to local maven repositories in + mainTemplate.gradle relative to the Unity project when a project is not + being exported. +## Bug Fixes +* Android Resolver: Fixed builds with mainTemplate.gradle integration in + Unity 2019. +* Android Resolver: Changed dependency inclusion in mainTemplate.gradle to + use "implementation" or "compile" depending upon the version of Gradle + included with Unity. +* Android Resolver: Gracefully handled exceptions if the console encoding + can't be modified. +* Android Resolver: Now gracefully fails if the AndroidPlayer directory + can't be found. + +# Version 1.2.111 - May 9, 2019 +## Bug Fixes +* Version Handler: Fixed invocation of methods with named arguments. +* Version Handler: Fixed occasional hang when the editor is compiling + while activating plugins. + +# Version 1.2.110 - May 7, 2019 +## Bug Fixes +* Android Resolver: Fixed inclusion of some srcaar artifacts in builds with + Gradle builds when using mainTemplate.gradle. + +# Version 1.2.109 - May 6, 2019 +## New Features: +* Added links to documentation from menu. +* Android Resolver: Added option to auto-resolve Android libraries on build. +* Android Resolver: Added support for packaging specs of Android libraries. +* Android Resolver: Pop up a window when displaying Android dependencies. + +## Bug Fixes +* Android Resolver: Support for Unity 2019 Android SDK and JDK install locations +* Android Resolver: e-enable AAR explosion if internal builds are enabled. +* Android Resolver: Gracefully handle exceptions on file deletion. +* Android Resolver: Fixed Android Resolver log spam on load. +* Android Resolver: Fixed save of Android Resolver PromptBeforeAutoResolution + setting. +* Android Resolver: Fixed AAR processing failure when an AAR without + classes.jar is found. +* Android Resolver: Removed use of EditorUtility.DisplayProgressBar which + was occasionally left displayed when resolution had completed. +* Version Handler: Fixed asset rename to disable when a disabled file exists. + +# Version 1.2.108 - May 3, 2019 +## Bug Fixes: +* Version Handler: Fixed occasional hang on startup. + +# Version 1.2.107 - May 3, 2019 +## New Features: +* Version Handler: Added support for enabling / disabling assets that do not + support the PluginImporter, based upon build target selection. +* Android Resolver: Added support for the global specification of maven repos. +* iOS Resolver: Added support for the global specification of Cocoapod sources. + +# Version 1.2.106 - May 1, 2019 +## New Features +* iOS Resolver: Added support for development pods in Xcode project integration + mode. +* iOS Resolver: Added support for source pods with resources in Xcode project + integration mode. + +# Version 1.2.105 - Apr 30, 2019 +## Bug fixes +* Android Resolver: Fixed reference to Java tool path in logs. +* Android and iOS Resolvers: Changed command line execution to emit a warning + rather than throwing an exception and failing, when it is not possible to + change the console input and output encoding to UTF-8. +* Android Resolver: Added menu option and API to delete resolved libraries. +* Android Resolver: Added menu option and API to log the repos and libraries + currently included in the project. +* Android Resolver: If Plugins/Android/mainTemplate.gradle file is present and + Gradle is selected as the build type, resolution will simply patch the file + with Android dependencies specified by plugins in the project. + +# Version 1.2.104 - Apr 10, 2019 +## Bug Fixes +* Android Resolver: Changed Android ABI selection method from using whitelisted + Unity versions to type availability. This fixes an exception on resolution + in some versions of Unity 2017.4. + +# Version 1.2.103 - Apr 2, 2019 +## Bug Fixes +* Android Resolver: Whitelisted Unity 2017.4 and above with ARM64 support. +* Android Resolver: Fixed Java version check to work with Java SE 12 and above. + +# Version 1.2.102 - Feb 13, 2019 +## Bug Fixes +* Android Resolver: Fixed the text overflow on the Android Resolver + prompt before initial run to fit inside the buttons for + smaller screens. + +# Version 1.2.101 - Feb 12, 2019 +## New Features +* Android Resolver: Prompt the user before the resolver runs for the + first time and allow the user to elect to disable from the prompt. +* Android Resolver: Change popup warning when resolver is disabled + to be a console warning. + +# Version 1.2.100 - Jan 25, 2019 +## Bug Fixes +* Android Resolver: Fixed AAR processing sometimes failing on Windows + due to file permissions. + +# Version 1.2.99 - Jan 23, 2019 +## Bug Fixes +* Android Resolver: Improved performance of project property polling. +* Version Handler: Fixed callback of VersionHandler.UpdateCompleteMethods + when the update process is complete. + +# Version 1.2.98 - Jan 9, 2019 +## New Features +* iOS Resolver: Pod declaration properties can now be set via XML pod + references. For example, this can enable pods for a subset of build + configurations. +## Bug Fixes +* iOS Resolver: Fixed incremental builds after local pods support caused + regression in 1.2.96. + +# Version 1.2.97 - Dec 17, 2018 +## Bug Fixes +* Android Resolver: Reduced memory allocation for logic that monitors build + settings when auto-resolution is enabled. If auto-resolution is disabled, + almost all build settings are no longer polled for changes. + +# Version 1.2.96 - Dec 17, 2018 +## Bug Fixes +* Android Resolver: Fixed repacking of AARs to exclude .meta files. +* Android Resolver: Only perform auto-resolution on the first scene while + building. +* Android Resolver: Fixed parsing of version ranges that include whitespace. +* iOS Resolver: Added support for local development pods. +* Version Handler: Fixed Version Handler failing to rename some files. + +# Version 1.2.95 - Oct 23, 2018 +## Bug Fixes: +* Android Resolver: Fixed auto-resolution running in a loop in some scenarios. + +# Version 1.2.94 - Oct 22, 2018 +## Bug Fixes +* iOS Resolver: Added support for PODS_TARGET_SRCROOT in source Cocoapods. + +# Version 1.2.93 - Oct 22, 2018 +## Bug Fixes +* Android Resolver: Fixed removal of Android libraries on auto-resolution when + `*Dependencies.xml` files are deleted. + +# Version 1.2.92 - Oct 2, 2018 +## Bug Fixes +* Android Resolver: Worked around auto-resolution hang on Windows if + resolution starts before compilation is finished. + +# Version 1.2.91 - Sep 27, 2018 +## Bug Fixes +* Android Resolver: Fixed Android Resolution when the selected build target + isn't Android. +* Added C# assembly symbols the plugin to simplify debugging bug reports. + +# Version 1.2.90 - Sep 21, 2018 +## Bug Fixes +* Android Resolver: Fixed transitive dependency selection of version locked + packages. + +# Version 1.2.89 - Aug 31, 2018 +## Bug Fixes +* Fixed FileLoadException in ResolveUnityEditoriOSXcodeExtension an assembly + can't be loaded. + +# Version 1.2.88 - Aug 29, 2018 +## Changed +* Improved reporting of resolution attempts and conflicts found in the Android + Resolver. +## Bug Fixes +* iOS Resolver now correctly handles sample code in CocoaPods. Previously it + would add all sample code to the project when using project level + integration. +* Android Resolver now correctly handles Gradle conflict resolution when the + resolution results in a package that is compatible with all requested + dependencies. + +# Version 1.2.87 - Aug 23, 2018 +## Bug Fixes +* Fixed Android Resolver "Processing AARs" dialog getting stuck in Unity 5.6. + +# Version 1.2.86 - Aug 22, 2018 +## Bug Fixes +* Fixed Android Resolver exception in OnPostProcessScene() when the Android + platform isn't selected. + +# Version 1.2.85 - Aug 17, 2018 +## Changes +* Added support for synchronous resolution in the Android Resolver. + PlayServicesResolver.ResolveSync() now performs resolution synchronously. +* Auto-resolution in the Android Resolver now results in synchronous resolution + of Android dependencies before the Android application build starts via + UnityEditor.Callbacks.PostProcessSceneAttribute. + +# Version 1.2.84 - Aug 16, 2018 +## Bug Fixes +* Fixed Android Resolver crash when the AndroidResolverDependencies.xml + file can't be written. +* Reduced log spam when a conflicting Android library is pinned to a + specific version. + +# Version 1.2.83 - Aug 15, 2018 +## Bug Fixes +* Fixed Android Resolver failures due to an in-accessible AAR / JAR explode + cache file. If the cache can't be read / written the resolver now continues + with reduced performance following recompilation / DLL reloads. +* Fixed incorrect version number in plugin manifest on install. + This was a minor issue since the version handler rewrote the metadata + after installation. + +# Version 1.2.82 - Aug 14, 2018 +## Changed +* Added support for alphanumeric versions in the Android Resolver. + +## Bug Fixes +* Fixed Android Resolver selection of latest duplicated library. +* Fixed Android Resolver conflict resolution when version locked and non-version + locked dependencies are specified. +* Fixed Android Resolver conflict resolution when non-existent artifacts are + referenced. + +# Version 1.2.81 - Aug 9, 2018 +## Bug Fixes +* Fixed editor error that would occur when when + `PlayerSettings.Android.targetArchitectures` was set to + `AndroidArchitecture.All`. + +# Version 1.2.80 - Jul 24, 2018 +## Bug Fixes +* Fixed project level settings incorrectly falling back to system wide settings + when default property values were set. + +# Version 1.2.79 - Jul 23, 2018 +## Bug Fixes +* Fixed AndroidManifest.xml patching on Android Resolver load in Unity 2018.x. + +# Version 1.2.78 - Jul 19, 2018 +## Changed +* Added support for overriding conflicting dependencies. + +# Version 1.2.77 - Jul 19, 2018 +## Changed +* Android Resolver now supports Unity's 2018 ABI filter (i.e arm64-v8a). +* Reduced Android Resolver build option polling frequency. +* Disabled Android Resolver auto-resolution in batch mode. Users now need + to explicitly kick off resolution through the API. +* All Android Resolver and Version Handler dialogs are now disabled in batch + mode. +* Verbose logging for all plugins is now enabled by default in batch mode. +* Version Handler bootstrapper has been improved to no longer call + UpdateComplete multiple times. However, since Unity can still reload the + app domain after plugins have been enabled, users still need to store their + plugin state to persistent storage to handle reloads. + +## Bug Fixes +* Android Resolver no longer incorrectly adds MANIFEST.MF files to AARs. +* Android Resolver auto-resolution jobs are now unscheduled when an explicit + resolve job is started. + +# Version 1.2.76 - Jul 16, 2018 +## Bug Fixes +* Fixed variable replacement in AndroidManifest.xml files in the Android + Resolver. + Version 1.2.75 introduced a regression which caused all variable replacement + to replace the *entire* property value rather than the component of the + property that referenced a variable. For example, + given "applicationId = com.my.app", "${applicationId}.foo" would be + incorrectly expanded as "com.my.app" rather than "com.my.app.foo". This + resulted in numerous issues for Android builds where content provider + initialization would fail and services may not start. + +## Changed +* Gradle prebuild experimental feature has been removed from the Android + Resolver. The feature has been broken for some time and added around 8MB + to the plugin size. +* Added better support for execution of plugin components in batch mode. + In batch mode UnityEditor.update is sometimes never called - like when a + single method is executed - so the new job scheduler will execute all jobs + synchronously from the main thread. + +# Version 1.2.75 - Jun 20, 2018 +## New Features +* Android Resolver now monitors the Android SDK path when + auto-resolution is enabled and triggers resolution when the path is + modified. + +## Changed +* Android auto-resolution is now delayed by 3 seconds when the following build + settings are changed: + - Target ABI. + - Gradle build vs. internal build. + - Project export. +* Added a progress bar display when AARs are being processed during Android + resolution. + +## Bug Fixes +* Fixed incorrect Android package version selection when a mix of + version-locked and non-version-locked packages are specified. +* Fixed non-deterministic Android package version selection to select + the highest version of a specified package rather than the last + package specification passed to the Gradle resolution script. + +# Version 1.2.74 - Jun 19, 2018 +## New Features +* Added workaround for broken AndroidManifest.xml variable replacement in + Unity 2018.x. By default ${applicationId} variables will be replaced by + the bundle ID in the Plugins/Android/AndroidManifest.xml file. The + behavior can be disabled via the Android Resolver settings menu. + +# Version 1.2.73 - May 30, 2018 +## Bug Fixes +* Fixed spurious warning message about missing Android plugins directory on + Windows. + +# Version 1.2.72 - May 23, 2018 +## Bug Fixes +* Fixed spurious warning message about missing Android plugins directory. + +# Version 1.2.71 - May 10, 2018 +## Bug Fixes +* Fixed resolution of Android dependencies when the `Assets/Plugins/Android` + directory is named in a different case e.g `Assets/plugins/Android`. + +# Version 1.2.70 - May 7, 2018 +## Bug Fixes +* Fixed bitcode flag being ignored for iOS pods. + +# Version 1.2.69 - May 7, 2018 +## Bug Fixes +* Fixed escaping of local repository paths in Android Resolver. + +# Version 1.2.68 - May 3, 2018 +## Changes +* Added support for granular builds of Google Play Services. + +# Version 1.2.67 - May 1, 2018 +## Changes +* Improved support for iOS source-only pods in Unity 5.5 and below. + +# Version 1.2.66 - April 27, 2018 +## Bug Fixes +* Fixed Version Handler renaming of Linux libraries with hyphens in filenames. + Previously, libraries named Foo-1.2.3.so were not being renamed to + libFoo-1.2.3.so on Linux which could break native library loading on some + versions of Unity. + +# Version 1.2.65 - April 26, 2018 +## Bug Fixes +* Fix CocoaPods casing in logs and comments. + +# Version 1.2.64 - Mar 16, 2018 +## Bug Fixes +* Fixed bug in download_artifacts.gradle (used by Android Resolver) which + reported a failure if required artifacts already exist. + +# Version 1.2.63 - Mar 15, 2018 +## Bug Fixes +* Fixed iOS Resolver include search paths taking precedence over system headers + when using project level resolution. +* Fixed iOS Resolver includes relative to library root, when using project level + resolution. + +# Version 1.2.62 - Mar 12, 2018 +## Changes +* Improved error reporting when a file can't be moved to trash by the + Version Handler. +## Bug Fixes +* Fixed Android Resolver throwing NullReferenceException when the Android SDK + path isn't set. +* Fixed Version Handler renaming files with underscores if the + "Rename to Canonical Filenames" setting is enabled. + +# Version 1.2.61 - Jan 22, 2018 +## Bug Fixes +* Fixed Android Resolver reporting non-existent conflicting dependencies when + Gradle build system is enabled. + +# Version 1.2.60 - Jan 12, 2018 +## Changes +* Added support for Maven / Ivy version specifications for Android packages. +* Added support for Android SNAPSHOT packages. + +## Bug Fixes +* Fixed Openjdk version check. +* Fixed non-deterministic Android package resolution when two packages contain + an artifact with the same name. + +# Version 1.2.59 - Oct 19, 2017 +## Bug Fixes +* Fixed execution of Android Gradle resolution script when it's located + in a path with whitespace. + +# Version 1.2.58 - Oct 19, 2017 +## Changes +* Removed legacy resolution method from Android Resolver. + It is now only possible to use the Gradle or Gradle prebuild resolution + methods. + +# Version 1.2.57 - Oct 18, 2017 +## Bug Fixes +* Updated Gradle wrapper to 4.2.1 to fix issues using Gradle with the + latest Openjdk. +* Android Gradle resolution now also uses gradle.properties to pass + parameters to Gradle in an attempt to workaround problems with + command line argument parsing on Windows 10. + +# Version 1.2.56 - Oct 12, 2017 +## Bug Fixes +* Fixed Gradle artifact download with non-version locked artifacts. +* Changed iOS resolver to only load dependencies at build time. + +# Version 1.2.55 - Oct 4, 2017 +## Bug Fixes +* Force Android Resolution when the "Install Android Packages" setting changes. + +# Version 1.2.54 - Oct 4, 2017 +## Bug Fixes +* Fixed execution of command line tools on Windows when the path to the tool + contains a single quote (apostrophe). In this case we fallback to executing + the tool via the system shell. + +# Version 1.2.53 - Oct 2, 2017 +## New Features +* Changed Android Resolver "resolution complete" dialog so that it now displays + failures. +* Android Resolver now detects conflicting libraries that it does not manage + warning the user if they're newer than the managed libraries and prompting + the user to clean them up if they're older or at the same version. + +## Bug Fixes +* Improved Android Resolver auto-resolution speed. +* Fixed bug in the Gradle Android Resolver which would result in resolution + succeeding when some dependencies are not found. + +# Version 1.2.52 - Sep 25, 2017 +## New Features +* Changed Android Resolver's Gradle resolution to resolve conflicting + dependencies across Google Play services and Android Support library packages. + +# Version 1.2.51 - Sep 20, 2017 +## Changes +* Changed iOS Resolver to execute the CocoaPods "pod" command via the shell + by default. Some developers customize their shell environment to use + custom ssh certs to access internal git repositories that host pods so + executing "pod" via the shell will work for these scenarios. + The drawback of executing "pod" via the shell could potentially cause + users problems if they break their shell environment. Though users who + customize their shell environments will be able to resolve these issues. + +# Version 1.2.50 - Sep 18, 2017 +## New Features +* Added option to disable the Gradle daemon in the Android Resolver. + This daemon is now disabled by default as some users are getting into a state + where multiple daemon instances are being spawned when changing dependencies + which eventually results in Android resolution failing until all daemon + processes are manually killed. + +## Bug Fixes +* Android resolution is now always executed if the user declines the update + of their Android SDK. This ensure users can continue to use out of date + Android SDK packages if they desire. + +# Version 1.2.49 - Sep 18, 2017 +## Bug Fixes +* Removed modulemap parsing in iOS Resolver. + The framework *.modulemap did not need to be parsed by the iOS Resolver + when injecting Cocoapods into a Xcode project. Simply adding a modular + framework to a Xcode project results in Xcode's Clang parsing the associated + modulemap and injecting any compile and link flags into the build process. + +# Version 1.2.48 - Sep 12, 2017 +## New Features +* Changed settings to be per-project by default. + +## Bug Fixes +* Added Google maven repository to fix GradlePrebuild resolution with Google + components. +* Fixed Android Resolution failure with spaces in paths. + +# Version 1.2.47 - Aug 29, 2017 +## New Features +* Android and iOS dependencies can now be specified using *Dependencies.xml + files. This is now the preferred method for registering dependencies, + we may remove the API for dependency addition in future. +* Added "Reset to Defaults" button to each settings dialog to restore default + settings. +* Android Resolver now validates the configured JDK is new enough to build + recently released Android libraries. +## Bug Fixes +* Fixed a bug that caused dependencies with the "LATEST" version specification + to be ignored when using the Gradle mode of the Android Resolver. +* Fixed a race condition when running Android Resolution. +* Fixed Android Resolver logging if a PlayServicesSupport instance is created + with no logging enabled before the Android Resolver is initialized. +* Fixed iOS resolver dialog in Unity 4. +* Fixed iOS Cocoapod Xcode project integration in Unity 4. + +# Version 1.2.46 - Aug 22, 2017 +## Bug Fixes +* GradlePrebuild Android resolver on Windows now correctly locates dependent + data files. + +# Version 1.2.45 - Aug 22, 2017 +## Bug Fixes +* Improved Android package auto-resolution and fixed clean up of stale + dependencies when using Gradle dependency resolution. + +# Version 1.2.44 - Aug 21, 2017 +## Bug Fixes +* Enabled autoresolution for Gradle Prebuild. +* Made the command line dialog windows have selectable text. +* Fixed incorrect "Android Settings" dialog disabled groups. +* Updated PlayServicesResolver android platform detection to use the package + manager instead of the 'android' tool. +* UnityCompat reflection methods 'GetAndroidPlatform' and + 'GetAndroidBuildToolsVersion' are now Obsolete due to dependence on the + obsolete 'android' build tool. + +# Version 1.2.43 - Aug 18, 2017 +## Bug Fixes +* Fixed Gradle resolution in the Android Resolver when running + PlayServicesResolver.Resolve() in parallel or spawning multiple + resolutions before the previous resolve completed. + +# Version 1.2.42 - Aug 17, 2017 +## Bug Fixes +* Fixed Xcode project level settings not being applied by IOS Resolver when + Xcode project pod integration is enabled. + +# Version 1.2.41 - Aug 15, 2017 +## Bug Fixes +* IOS Resolver's Xcode workspace pod integration is now disabled when Unity + Cloud Build is detected. Unity Cloud Build does not follow the same build + process as the Unity editor and fails to open the generated xcworkspace at + this time. + +# Version 1.2.40 - Aug 15, 2017 +## Bug Fixes +* Moved Android Resolver Gradle Prebuild scripts into Google.JarResolver.dll. + They are now extracted from the DLL when required. +* AARs / JARs are now cleaned up when switching the Android resolution + strategy. + +# Version 1.2.39 - Aug 10, 2017 +## New Features +* Android Resolver now supports resolution with Gradle. This enables support + for non-local artifacts. +## Bug Fixes +* Android Resolver's Gradle Prebuild now uses Android build tools to determine + the Android platform tools version rather than relying upon internal Unity + APIs. +* Android Resolver's Gradle Prebuild now correctly strips binaries that are + not required for the target ABI. + +# Version 1.2.38 - Aug 7, 2017 +## Bug Fixes +* Fixed an issue in VersionHandler where disabled targets are ignored if + the "Any Platform" flag is set on a plugin DLL. + +# Version 1.2.37 - Aug 3, 2017 +## New Features +* Exposed GooglePlayServices.PlayServicesResolver.Resolve() so that it's + possible for a script to be notified when AAR / Jar resolution is complete. + This makes it easier to setup a project to build from the command line. + +# Version 1.2.36 - Aug 3, 2017 +## New Features +* VersionHandler.UpdateCompleteMethods allows a user to provide a list of + methods to be called when VersionHandlerImpl has completed an update. + This makes it easier to import a plugin and wait for VersionHandler to + execute prior executing a build. + +# Version 1.2.35 - Jul 28, 2017 +## New Features +* VersionHandler will now rename Linux libraries so they can target Unity + versions that require different file naming. Libraries need to be labelled + gvh_linuxlibname-${basename} in order to be considered for renaming. + e.g gvh\_linuxlibname-MyLib will be named MyLib.so in Unity 5.5 and below and + libMyLib.so in Unity 5.6 and above. + +# Version 1.2.34 - Jul 28, 2017 +## Bug Fixes +* Made VersionHandler bootstrap module more robust when calling static + methods before the implementation DLL is loaded. + +# Version 1.2.33 - Jul 27, 2017 +## New Features +* Added a bootstrap module for VersionHandler so the implementation + of the VersionHandler module can be versioned without resulting in + a compile error when imported at different versions across multiple + plugins. + +# Version 1.2.32 - Jul 20, 2017 +## New Features +* Added support for build target selection based upon .NET framework + version in the VersionHandler. + When applying either gvh\_dotnet-3.5 or gvh\_dotnet-4.5 labels to + assets, the VersionHandler will only enable the asset for the + specified set of build targets when the matching .NET framework version + is selected in Unity 2017's project settings. This allows assets + to be provided in a plugin that need to differ based upon .NET version. + +# Version 1.2.31 - Jul 5, 2017 +## Bug Fixes +* Force expansion of AARs with native components when using Unity 2017 + with the internal build system. In contrast to Unity 5.x, Unity 2017's + internal build system does not include native libraries included in AARs. + Forcing expansion of AARs with native components generates an + Ant / Eclipse project for each AAR which is correctly included by Unity + 2017's internal build system. + +# Version 1.2.30 - Jul 5, 2017 +## Bug Fixes +* Fixed Cocoapods being installed when the build target isn't iOS. +* Added support for malformed AARs with missing classes.jar. + +# Version 1.2.29 - Jun 16, 2017 +## New Features +* Added support for the Android sdkmanager tool. + +# Version 1.2.28 - Jun 8, 2017 +## Bug Fixes +* Fixed non-shell command line execution (regression from + Cocoapod installation patch). + +# Version 1.2.27 - Jun 7, 2017 +## Bug Fixes +* Added support for stdout / stderr redirection when executing + commands in shell mode. + This fixes CocoaPod tool installation when shell mode is + enabled. +* Fixed incremental builds when additional sources are specified + in the Podfile. + +# Version 1.2.26 - Jun 7, 2017 +## Bug Fixes +* Fixed a crash when importing Version Handler into Unity 4.7.x. + +# Version 1.2.25 - Jun 7, 2017 +## Bug Fixes +* Fixed an issue in the Jar Resolver which incorrectly notified + event handlers of bundle ID changes when the currently selected + (not active) build target changed in Unity 5.6 and above. + +# Version 1.2.24 - Jun 6, 2017 +## New Features +* Added option to control file renaming in Version Handler settings. + Disabling file renaming (default option) significantly increases + the speed of file version management operations with the downside + that any files that are referenced directly by canonical filename + rather than asset ID will no longer be valid. +* Improved logging in the Version Handler. +## Bug Fixes +* Fixed an issue in the Version Handler which caused it to not + re-enable plugins when re-importing a custom package with disabled + version managed files. + +# Version 1.2.23 - May 26, 2017 +## Bug Fixes +* Fixed a bug with gradle prebuild resolver on windows. + +# Version 1.2.22 - May 19, 2017 +## Bug Fixes +* Fixed a bug in the iOS resolver with incremental builds. +* Fixed misdetection of Cocoapods support with Unity beta 5.6. + +# Version 1.2.21 - May 8, 2017 +## Bug Fixes +* Fix for https://github.com/googlesamples/unity-jar-resolver/issues/48 + Android dependency version number parsing when "-alpha" (etc.) are + included in dependency (AAR / JAR) versions. + +# Version 1.2.20 - May 8, 2017 +## Bug Fixes +* Attempted to fix + https://github.com/googlesamples/unity-jar-resolver/issues/48 + where a NullReferenceException could occur if a target file does not + have a valid version string. + +# Version 1.2.19 - May 4, 2017 +## Bug Fixes +* Fixed Jar Resolver exploding and deleting AAR files it isn't managing. + +# Version 1.2.18 - May 4, 2017 +## New Features +* Added support for preserving Unity pods such as when GVR is enabled. + +# Version 1.2.17 - Apr 20, 2017 +## Bug Fixes +* Fixed auto-resolution when an Android application ID is modified. + +# Version 1.2.16 - Apr 17, 2017 +## Bug Fixes +* Fixed Unity version number parsing on machines with a locale that uses + "," for decimal points. +* Fixed null reference exception if JDK path isn't set. + +# Version 1.2.15 - Mar 17, 2017 +## New Features +* Added warning when the Jar Resolver's background resolution is disabled. +## Bug Fixes +* Fixed support of AARs with native libraries when using Gradle. +* Fixed extra repository paths when resolving dependencies. + +# Version 1.2.14 - Mar 7, 2017 +## New Features +* Added experimental Android resolution using Gradle. + This alternative resolver supports proguard stripping with Unity's + internal build system. +* Added Android support for single ABI builds when using AARs include + native libraries. +* Disabled Android resolution on changes to all .cs and .js files. + File patterns that are monitored for auto-resolution can be added + using PlayServicesResolver.AddAutoResolutionFilePatterns(). +* Added tracking of resolved AARs and JARs so they can be cleaned up + if they're no longer referenced by a project. +* Added persistence of AAR / JAR version replacement for each Unity + session. +* Added settings dialog to the iOS resolver. +* Integrated Cocoapod tool installation in the iOS resolver. +* Added option to run pod tool via the shell. +## Bug Fixes +* Fixed build of some source Cocoapods (e.g Protobuf). +* VersionHandler no longer prompts to delete obsolete manifests. +* iOS resolver handles Cocoapod installation when using Ruby < 2.2.2. +* Added workaround for package version selection when including + Google Play Services on Android. +* Fixed support for pods that reference static libraries. +* Fixed support for resource-only pods. + +# Version 1.2.12 - Feb 14, 2017 +## Bug Fixes +* Fixed re-explosion of AARs when the bundle ID is modified. + +# Version 1.2.11 - Jan 30, 2017 +## New Features +* Added support for Android Studio builds. +* Added support for native (C/C++) shared libraries in AARs. + +# Version 1.2.10 - Jan 11, 2017 +## Bug Fixes +* Fixed SDK manager path retrieval. +* Also, report stderr when it's not possible to run the "pod" tool. +* Handle exceptions thrown by Unity.Cecil on asset rename +* Fixed IOSResolver to handle PlayerSettings.iOS.targetOSVersionString + +# Version 1.2.9 - Dec 7, 2016 +## Bug Fixes +* Improved error reporting when "pod repo update" fails. +* Added detection of xml format xcode projects generated by old Cocoapods + installations. + +# Version 1.2.8 - Dec 6, 2016 +## Bug Fixes +* Increased speed of JarResolver resolution. +* Fixed JarResolver caches getting out of sync with requested dependencies + by removing the caches. +* Fixed JarResolver explode cache always being rewritten even when no + dependencies change. + +# Version 1.2.7 - Dec 2, 2016 +## Bug Fixes +* Fixed VersionHandler build errors with Unity 5.5, due to the constantly + changing BuildTarget enum. +* Added support for Unity configured JDK Path rather than requiring + JAVA_HOME to be set in the Jar Resolver. + +# Version 1.2.6 - Nov 15, 2016 +## Bug Fixes +* Fixed IOSResolver errors when iOS support is not installed. +* Added fallback to "pod" executable search which queries the Ruby Gems + package manager for the binary install location. + +# Version 1.2.5 - Nov 3, 2016 +## Bug Fixes +* Added crude support for source only Cocoapods to the IOSResolver. + +# Version 1.2.4 - Oct 27, 2016 +## Bug Fixes +* Automated resolution of out of date pod repositories. + +# Version 1.2.3 - Oct 25, 2016 +## Bug Fixes +* Fixed exception when reporting conflicting dependencies. + +# Version 1.2.2 - Oct 17, 2016 +## Bug Fixes +* Fixed issue working with Unity 5.5 +* Fixed issue with PlayServicesResolver corrupting other iOS dependencies. +* Updated build script to use Unity distributed tools for building. + +# Version 1.2.1 - Jul 25, 2016 +## Bug Fixes +* Removed 1.2 Resolver and hardcoded whitelist of AARs to expand. +* Improved error reporting when the "jar" executable can't be found. +* Removed the need to set JAVA_HOME if "jar" is in the user's path. +* Fixed spurious copying of partially matching AARs. +* Changed resolver to only copy / expand when source AARs change. +* Auto-resolution of dependencies is now performed when the Android + build target is selected. + +## New Features +* Expand AARs that contain manifests with variable expansion like + ${applicationId}. +* Added optional logging in the JarResolverLib module. +* Integration with the Android SDK manager for dependencies that + declare required Android SDK packages. + +# Version 1.2.0 - May 11 2016 +## Bug Fixes +* Handles resolving dependencies when the artifacts are split across 2 repos. +* #4 Misdetecting version for versions like 1.2-alpha. These are now string + compared if alphanumeric +* Removed resolver creation via reflection since it did not work all the time. + Now a resolver needs to be loaded externally (which is existing behavior). + +## New Features +* Expose PlayServicesResolver properties to allow for script access. +* Explodes firebase-common and firebase-measurement aar files to support + ${applicationId} substitution. + +# Version 1.1.1 - 25 Feb 2016 +## Bug Fixes +* #1 Spaces in project path not handled when exploding Aar file. +* #2 Script compilation error: TypeLoadException. + +# Version 1.1.0 - 5 Feb 2016 +## New Features +* Adds friendly alert when JAVA_HOME is not set on Windows platforms. +* Adds flag for disabling background resolution. +* Expands play-services-measurement and replaces ${applicationId} with the + bundle Id. + + ## Bug Fixes +* Fixes infinite loop of resolution triggered by resolution. diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md.meta b/popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md.meta new file mode 100644 index 00000000..4cac943b --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 39dd59b7c002145379fd263f890f693f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/Google.IOSResolver_v1.2.164.dll b/popcorn/Assets/ExternalDependencyManager/Editor/Google.IOSResolver_v1.2.164.dll new file mode 100644 index 0000000000000000000000000000000000000000..3db1838d2a345a59f67a42eb1a235904b56422a4 GIT binary patch literal 66048 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

C)XHPIIqpN4!-A+JWER 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 Ik?#| zDk{78hRbguXhJWOrsZo!56h-$5SFAh0w>|OtkA)-X(OCZHRoGodOKEuV;NYaS?p1K z=A6LdY2AD14HN8#4y$SCjHy>5Tyn{WtJNU39%U9gfu9qjL04*R@5<{kx^vhn#$B=( z=+hUD4g^khKX%;C;~}ka8*f2*4L-wTPEIBt$4wp4# z!jS*k8!~Nbe|KSG{lp>JptdNu#$Qa=T=+tF{tWA!)Z`}-Fn2UvX7WQ9R4GYG$XCPG zfZXjP?!0L_gDT*4Xf-Pam|?8K-7RW|)@Td!!s=Hpt}*mjqYH?*Sho|8x<)5JIe+_> zY!xr+fw3Bw{dQZX*2i{6cL)(N`n95^Zd#C)1zJuYSmeQi1;F`G$44^L(EDuf$4&36 z(I#)^h(dGj_9H9EsjU~Tu^r*fgI09HJO&WKM_%X;;Z=z%z5E- z+oyf3;(}0x+(oo@OzXrCwgP=FKO8SlS}W2Yi1*6jLoK~JtjkBe+LkH>a5?ke7%@gO zPGod3L&>!(A1f)#?GyN^aaFtR>l;}bcKaJ50+0$%)!O5JvU?$5Vfl3B`8_KYDY0(# zCiy)>>K^GUq2~frOt*Zzph?22Ku)$43Ch<9hb2osFc8#wV-7ZDL0+5_cyUtt>i%sT zvK5h4eDgOD5OpvR5U&5hHe@ncdt*ZzQA=kRCrcyO|7&oQqO2o>D}?qrW468QQsvmv zx}nqT8E$>KaiAk3gz}xZITVA?he|e)SiW-|K1nX>OL{;NSRmL>sK&<%SSUyGS<7(# z!{EF&*@x*5(mhheJ!Mb>g{UC+IE6Rs+x@6S@nXw99;ceew0jnrN20FPU5E1Ow^d0i z2fR0CFTXuFM}EEAF(C4u7PT7nBvh@uj|=I!c)XLEpRjp| z-&<*HC8J|gr4fYpmaFK4hCmq~iZ9~6=Se?OiX z*h~8F1|bi3|G2ABZ7I=>2tm%S#uQW-wWeS9Y#h}OdHZ*QDnBgv9MEt?epHyyZ6MgA zAiidwUh(3!`!GuAkSadn%0GIA2tS&Ae~!LHz@Q7uP?}mYT|%TI7K)%XH8ZBecnyw; zPBkVivTG(VG_6K|kn@=pJ*CS2Bz?9~(izDKX|{}yNaoCXgwJB{1zjQj_DzlgW8d! z>}Vkj_?TLDKNyWb2x8O;snKjO4Z)ySz5DorL(3LWuK#prbrhCt~K+ee)( zPvy?jM`#4|j(naEr|^0V%|~lQ1K1v2NAr>yIsM`VvNJ2%6=YxT0lKStN1v@)uOiz^ zADxYor~;F#3d9HBRRi*a?`i6)0GD;2O%v{Hq@u2bV zP-Cs>uG(s{4ZE<1_Rn4-_PcrQ)9olKx>D&29KV*1@KydC+>sW!%PVZr3q?w4@>^xZ zR%P8p=T76olSo5XiI+u?wcF^m#*pAlYySX@8k509FlSPZx z9Uf{suS$2Ck-bRNplx%;n9CZI^f6hlK|ZcmW5%Z}HL-T)AU`C|-OiY&kIDVUyKTXk zt}ZFVdWM&p%$_WMXl-B_*n!3=9BfLYp_W`jp@%TXx#@pYtwysN#lf01foGJ}QYf(* zD!3ips1YSL<+2;4TequTPRYOF&1G{knoqbxg`S?YGcL7WE6p|K^W^Os1ah(CKExU# zmc^i)O}*Rr*~tf7^70MFPrVN&6A#+|T36Q=<+M5uRZ>1-&~CY}4QX}aOY-DQbIrrV0 zfITD&U0X*ZFD*l#QUbF{S0*_Zf2;}{c74PbGg8x?!zNnkDUpgj$9QG27Uc-vcF2zd zU@kONWpg*qj>vJ}*7cWH6#340Scc;VFekt2K&Y|%{BqZ5_mLmPhMzqI$7ZzRiV6ad zXD>3vKw~pna>coulPBd$Nmm(KmJk$=-Zcr_aD2&`6NcU8QAi#{@$scnbL1V zBacagvhMUIhv<@0gwt>{(A%(xede-Jlrt0mys5^11Yf1-;PgawPIpKTZ+}RGUI)fx zSkZ)2MQ7hhz}w1LHuIp9(phN{31`H!0MI#@hlbWEa-}iuv0hSY+fgS0!l>!I^3=Ul zm&fkku%A5oq++@ns|{4GpRUhUzK(g54=&r@P|swg*?X3ZgJa&vnA(id)`X?PCrcNH z1Xwq;s#2?4>B>BAXyZn#)M=&6NxyYZ$QEi*Yol;fJ1D8lZCupVr!#Y^jDC1x+`}+z zUhFA<;jWB-S5uRKzN}6GR&S0~WH*X~c9PFm%r$#UuEsg>|vb zx;6fM=+?Wv69K|uzzM-kaL_duro-J=W7P|3c;~y%MJK?lFL?3$+s%5Eugw^jbI0ne zpYJnD@l9?M(DgZ2OvHUx>xCL7`>uL>zzrtw7JZ2;@kXm!H@h<7w;(G5aQOi%2BU^U`R>i#Xq$H~5A zwft0x_9BH(x*ZaAi{3`wxovHCNvFROv^jX2zeh&1XF(Tn`nS{8X@)gpWisMih}6}y zF57-jdZAgiu^>4lSFXMr#YYsi-gHXULI@ky8FjuRlgBr?2v`gGIqON3LDU3;Z`KfE z;;RV1kp0`)NigRy?l9}^nC2R5UJF^uL)V_!^myKa)|+5-axuDCgezH~{uk z28-Y}@*!<>1s}>;8#rE?yCtm^){ck5XLl+V*M7*oKsoR&pE*>VuBG1ag*hCW{D(*X z+$Z%mjCy*Mb~thrDxwW{>}_9gmz+_#VC@fAt!jy88FP;%5c&I1kWanGHzN{4BHUqr zSpgQ-0Cz)lHzQKF1k_s!>8=iz@p+^U2i%0+p^%-}@16xosLu)T2pum(>n~6$uT+Ly zQf7Q&c6=gidE_9Biidorb;@p`jjL4N!HsRu01$eKxGEr)nM3@0bmHvuLYyq)ZCRek zcaQ8YMAk^8<1nDWFST##*e6w{>2;|FPy6%&BC+uZ_#V)NCe?nq*K$)N6TO+=efE+y z=_K>(S2HBPJleBVdnvbu+(@=2-R1~yQ1ytm7&{F-ez-Wjq?#R@+9-odPC@^loPz#;QwfK^6qCW> z|MQmns}N?Tq$wm-5?queAY1>Y|5nYm~1?y~!% z7V>EAKDNcj+aJjUEN@F{IIpP7p=(j!&mC2z{~-4L>&^bN?>^$cax7yT%YX6Q|3~-u z@yArYzx`FfK|q-QYj+`|e-vgLyNKA^+8WxK$XeQ&irCw^nf~7r?G#l#dlVrwelXZ5 z+SYK}n%z0X<06+$fec|usCf(FO5}y%F;nbSTZ1$>ks|-W-9kpT`C-DnIF=o)c*WG_ zN5j({ZtvR;=aZdnL4W^G2#0V|FzBnZHFl(d*l+l=DbK>5-1wgO;P_$ykCETHTBhMA z_hoR}+qVvYWx(ZKl40Gn*rb&^v=pb$=0&ddpxPhk@`>4-fPy7ps4>srg-eH}yI#`@ zfu!MjZ+27>n`u9u#=M6TKm-Rman|qGYZiZ^(tL*j%@-`xUr7W3|G4hy-DY( zHnc*`N!GQlC+s#;ZbE=$6gl2PV{3R&t<-`w!!keJc+4|B^InjlwSNE9z%C>+TF+T> z3U)Ph=p}bxE0v`QlfG|*=g-bw&bfv$hpKa)T=KA>+A9M~j>2D%E`&5ShxL(GSe?SM z<*?$5gfLlsZfb;08ozCSE=vve+XALsS5rix|45~CNgfa&U`KMMBLSAWDFD~xqM?&h zqRSzySB?tuS;FuI$nQryLLzR?tFr-b3q}J|Ox?O%&99z`L`|$BV(y<5sx){lOOMuC zZ?t4TgwJ-7iDjk>*rmE~w8S~o+d=*a$)mYj#6TM0&^A+yebW?+yxNwL%%m%tsZq); z{3EVT+Vu*X5QiC_izZEK5vuGMvbFTCR$9Do;agpR-fn-=&}s zQmEn)5SCmulK{=dL3xTbCYU)YSo%VFWF5jc()7a%klTKxX-FxrrbCYsUOqVWOhNt;?ylW5o#GOUPkf#rETtE5 zSh8P8TKpv`b-@khV}1s{3mWYMf#sd|7V{4On?A$m-@;B=7#hF)Z`eIUfPnD*PyVZ% zrL(i8ow6(KKJ@f*0w#$y_#m}aryHl_z zVh;!N?KHigV*O_0qgcF#&9t9HhKQ8!IqHN)py6S$7VE=tac1_r0p!sVLe;OIPvM4@ zX&9_iPdh&Vvd?ZzvINFlenrLr=XQ}wPN1GjnxR=EKV$Soi&0%EY#Q0mZC4mcea7BO;fSc~LL7e8P8y zL{0Hk%V_Yq5|GLxSXa?rb`O{%Wq+FkD)`tSR<27&3mMQEkw^t>qKvOV2Yj&53ZCR! z+ja#4hHG37hY1i$@|0qv2}~w}0DB1NQSx-B=vEOy&SNb5ABQn`i|uIn7<~LclwxN; z+Z0l6u3(L>s=^k1LL>LNOI*N{^u@GhStZ!P zuthDn$SsgxQE3go-(#u|iY>4{iqbqG{%ZtuSIe>d!|OQs@500XKZ$_HnU9lA}7SfGULcY1V0KXj^b!WY7|%U7%<}O(ZEDUK|14fQ$+ku~T|o3a8~Z zag+K|*FTX3>3s(pK{49opL{p%RwHa}#pSY-_1x=uyJ^4kI5x|;3xakx)sJ)nk7YIA zkZ(L603dHk=Sfw|v{4$1j8y{!(w~nTWD%$42^!4(vfDPos*oJ>TIQ?O-oaIBp=Qx` zv>p^d%2oYCRSq7uU@m!^^L@ef2~2?}rqSDngb%r$K*VU(k*>}LcDD_xP0O(dunrX6 zZk@`cmm4I2EvwD!!N|4u?AS?>hV!D|Qd;crIhM?ZS;UYZvLTh(PI%ShIRq?6M*3pr zC+QO-zl*HGLXGWw>{RPoH*4@WS_xI~7UJAJPilCJa;FfNtYRUhUjBIS`U1fQ zJedw53#mjj{${M4{;_dFNZ!^Nx>l+@+PnE^wE|mV$G*L6CxtIf6lemf&`@g}yzlul z)^uN|E7qR77w)KHnV(?M7pd~F=sQKcnWWz7biLz{Wv6mAJ;sm+V+$6+Qy+9D)}|BA zfZ+?k0>|tvXMlxYI9U7ugI^0?7h0yva3jOSQXA=K`}Z$dgfXZZFq&}{$%H%$FbCX2 zMQ5>l(J(<`aYutPhrslwZ=Fxb+BV*Ix7(em{K3oxIixc>>(0ly#I-HG!rqe%$c#u{ z`OB6*d7mQv63kO$@yCbh$Ef2EQfRMe>Yfy2%`0{|$jUoprNW84?IHw}PF3T34D*vD zVctiU75F5%G2wm1ve7n91wi~ak`D%^wTsu^thNSaT8UKhVbh7pS?Wye>`MD`jeLno zzf)PaAzWZaD-2@qnfVazn$lry35-ox(FldV6&>*tMJ*9+8+=oUe+B-%ET0 z0g(ayf0C?!!usEt-PP9A&PB|_*wo>lQlAOa(qPPJp$c!TMJ=t`wzL<6H_d90t0_U@ zK}_xSC4XFSN)s|fSy(TuJ80U0-+ZW;rDV|QgS57ea<~3$quzhsy+Q23O{2i9u^4WO zZHoo>bDsv4@dv#X_$v@rU@9SdeW*GjyTt*%hsto9eOJqab;}wdEroDFvn)B83=kKo zY@awaBF+JZ>UJPM1AAwL9#d#AC)R$$?dhr%?aM?79|8z54r70T?5(n(oZRP^a0 zHK%#}DTSku7RY#AabV8ZDwO(Ng8sdvcS^Otw&QN|ZE~&RTe4D!v2bYqL!1WkmEUyV zr06f>)^<@?&ktC$;~!Js@%3_kyW}o*E#Alq>0f>@|E^%JT6oJW;i59u zV}+|?G2cGJ_U!4pp1DKo$gAhyZnigsY-$9b${Cufh=jLxTy$F%_&2^Gh-vXP1_=TZ zhWbC8fn@CL-R=Hk8v2i4{%H~3*0lCOJ4W~GGfC2-00V@A1ge*1#+x`Jev6uGCN3-n z{J@osZr(6-mxbVD-OO13el;SkbG@xU$D!`s0JY&2D2*cAy`*1X_hYr8%|@Xu-1L(c71uk)Xon~|?v|8GBdcTyU_-D~s7iHlH;QDm`+HKV2O z?>+Tx^zrm{OBJNB5RHWgk+E0z%HhD>nIA)$dNl(X_a|jt+GG#<1~KsJS$YHQ?}9Pq9`9%GzTrN8%9UjSa;0R-~6WCT)HT-{KI~9)CuifOxC~g ziRvL|NnjYv(S} zUeJCT#p~rcV}peT^;^^Neg$22ArFVQcoVW&1bR^PtvWpwYsn_~`5Vjd4vMCGlBHaF zuNwFKmi|`2VD*vCI!o7e!cw|jCurBj!_ad5mMXM0wr7HmBWTsybLREarG&0B{hWHA z4Stoli+kM3l#agku0xeO_JJ&g%ae3QS|cdAcufCBb@!F4tBy1MOf}3T{_?f25H^hz zWAnMKe&ey2z&H|g9PE$1-7my*t?bTinf*jk+wSIvg@H*7eIC#CU%m#=MpOo1>c3*o zIkB=&F7GY0xh!Cw@-+tF+Y<^XzpqS%HEy=H6m6NmoUOvR6-W%I+h{o8yHTx0#8ICK zw*?8oL9;Q~sqiGZ5k{N~y|jHFn}+7m_)xD|S>|!I+FHP0Zq{91zFAV6R$av275;D( zIDE$EsU90|+})GnxTOYHIK&Rj*)FY&Bi}B<=5Q5uUMjYY!FA-X-7#FZvO!*^N0F!H z3f`q@2j`^qzz~6%F_Iii?r$w**tOe%vbo zS-L)EJ;VmYx@qeDh(~IZ6T&Y!ey@QQbyn`NzlWx+f^!rvW5?pGCbbff<_#~Kk$8dC zNqVRZ=+M2}zN-!HeqS<5soX=^L2iEnd$J0QC2x(zD_sV6n4Y{40+pMzBzi2xWb_T} zJm_JuU|ZU-q%X6=GW&H!>T%=!j`jud`&6=|A*_lr>99HZ6 zGAk+AATSooTI@6Kz6X2EzMAnYEt*?lmvg7!{-Rpj7q)mr_ zg^h`o07*c$zYTR7ZWD)*+L^nrfSDbgj9?-R9m1wj z)`q&CY>9;mPN)>WM7ITn9VbzbVj`+RmC)ysfx$luHv7JoH~Fu(UO_VTU5$xh=y6RU z=9oOMWY+|u)P@127Kdokg+>r1^V}f-b48BOdy7T1Vv7f~!TF0hGn3_`+)# zNiUxcRj_f%<9Y>oVj{!pEfIb>n3$egUH(8?A{^T6misCEx_?R}bpf4j4Ui?;=ZbZ|B}MAA|? zdTfF~u7VR|(#wPdPw=3Ud7zp4)W#N&9==KTF?Ls&TP zibMDmFdHggZ0~2v1FC@@+fTQR>YZhFhpet6*1sHNR%iW&n^mUdeDUG`YGlQjADo}) zyv7&CBR%#eImA{-XNwb)KtX6G98@aQP5;^Jieak-!%>Xh{QMvnUVFIo=Zj1+7je)P z4I&&?lT^R7x<|6XAH6MVm5Eq?%<&F_VkFB$vpY2Dz*ZL}4Vdcz`GtI|O!s-i-5s^% zpY7z9-dKqCY=CMvB9!<+0KU(v5BLhE85v7>2<~^8$9mD)f>464l%R)dkZUAEFluh7 z=-^S+;{bCs6G|t%YreTVXVI$ILt1VF=4&b%!W;;NQqKj$s5pda7{bLEEL}nZ%J!KA zF37dGTlcYQL!;vspHYcFaj&pUeWC5j7-@zy6?W?azbttHW5V}e|EALMtT7s<|8lm? zzbc*cf38vfU7e(;*(xk5qWRga&MWa?*{cA-Md5JmO#_JFkh6_2Fqtxl?~Jjh>CUwm z+=lb^5%;5h_DdSQT*Z;(ZgM!+OYe(#&+?yg&vra_H~ZK6eLyJo$40ZAm^|KVAfAxZ zjUzQs8ADH^=u2xRBpm!f)0fgb1iC_tLF1z6v%1(~rS99ZkU72jLNu5VUcmXH4=uQ7 z#ei+UR^z7^W0$Y7Pj9W_1>cI4ocXfr0;YBv%-7T>?C`8(Pu3BFm0RhysWUP!FG4gc z*W~qTcsB|vs@NA5p*QEMMF>ukPTD(JJ(G&YiI(5-!QbM$LWzKMqonty2hF}6{Y=QW zb3u#?dbkkJIOTYjl$lmm>UuR^v4+c0fiXlX9UO-{0}1*MkvTYiF#DT>u9b76^x)8{ z2rn)TTC`}M%M`buCTF!ct}+jqd_^f=_$}wyrEhg`xOZ9`WL6zkoH?1j#=zEbw~)Nk zB^Z`74IqRLN-MVd?HYSh)#uI=8t3d#-*)jq!K@w70r%?Nx2I-VYk3v-h0w#OB(mY+}c6cd)z?_mrIs z#Md)!Tdby+{nBx)hlvSZ_OkT%qCP^ZRkrr%JdK0S9969^> zuMu)&v`o4GH$v?G@@T>TNrb4`S^qaIx<_qN`LB-W=bs=mWcdMwbQc;c}2x4d=9em`gB%C-RQ$ zKH1qt0Sb2kwz;xx8kIKbm0@T!;uw>?e_vQ~3X__l<0egRhp8c}Q+FVKvG)K+e1iiw zkz)Q1KC89G;bfg_y#awg0vo0Y*e{wAP-uwFBT4{Y8F<-$RoRm+9 zyu_fcN?9nq5je?8WzauDYj2s+Q@IK@So5|@lmt__I&FPe@M}NLi2X>*rcZW2NzdIi zJ=^is*LRAMmTKcy=FC~ouQyf!T-ID{?j**0v*cK|DMT6*F6>z5+igZO>mQOj{n}}C zVK(B#>IYs3vekRK?btUq^Ha;}r&Al2VvB2kTbx|Uj?|gE%_#h+Fy=-*h@tVCr=04J zv?Eh}B&rY=N{cjv6K}{rpui|N$MB$aj48x^iGJ5`ix4)x(zT(a2iI3woO~w5VIgua=IrjBGFt^ z7+$aIOhi#rzmQ~PfYik;COVHw=SamD1li|nw`u*P&D2dmEb|N?kNCy0WIiTU+ zqDSGMk^wpDI?jvgNT11AlMP}haKrlqL;=RATNt3p#fngEKO_T+r9|?@8q_3I6Lhss z7XI{nz;-{@9G4(As|*%Txx5XFn7>iJiEQ{usGF=e%9JKW%;YZTZri)}@!u2rf4$)b zq}|!#@iLJc^TcwjBY}20cebc#06q!E-HfJ z*@$~ciwiyIM)SuUB&c>{29PSr9aqp0WyGaMy-`f6j?PlGQs>zHBzme&XkzV-O4-ac zg~yWh+0@F6tWlm;`tU34;Fsx6O7V0!qlPFwg_W+2Or=bMU`N&>c3wC1E+Q#C>-s;#n?q{A=GdK-V_tVwc0bz118EL7jnNpo#M zZ8S!86xLwC(Wh}fZk4w*7iWe#ZZA=6kK3WlBX2L|B%vsugG4h+G%bUR;1Z-KAYr$_ zWKv-($g8Geuz72DqxRQyTTPX>GCbw7Sb18uoPYRz(^afh8EeF5KcKs~8qCEsuC6PH zlMz<%b!hDeo1=@vz@MsJS6?F5U&@|P1GSYz454bSQ(7glF;b$>duk^&q{1he>DRt+ z;&YLYx0aLmvuMqt0?L))MEM|yOLkMb>~mRx+tT7RVqm5tY(J~&Qj`x3;j-YK(^Pa` zU&me`i?U)lRDT2B&{_t`MWFMcp#deyh^^gE*2`n4Ei`Dx*#;b@Uiw)+y{6bcWS!Y) z(iun>q#&{QHIybZOkHJk+Vaqu@2xO?5f7}~BeGd&#@H{^);B=|=WUP?*9r{ofq4p- z5VxR#xjD#<{sTi`AUp8q<%h7lv4V+D`5vjy6vB#b+@)zN?{eWL%#&eXkOHtG2u%15 zE-&gD^O5| zic$@clJbjTCs$IdyKvkd9=d{e->4FUObv?Kt&4i)kfwK^AM&ytj=^?*)jG?;Fub{G z`HhmJc*froTlq=wlISv;<_iDf6WQESX%-YBdthDR7ium|Xrc|5YIkw~$44PB!VPU7 zeu#*eVho3?{b4zDRpkHq7O}IDaOjL^=?iP)LqX#7H z-DZ67Wt?PbIHbRX!$>fFZ(oqdBfmFJMz2+yb`-4Bpw7upvr^~237O{kcHLkd?;J&y z{AVj)jqp5k$JitfG)#+U7=_gi(^r@C=914q5!{JA05 zX{dXq49Yng$8a%WJ$%?Izx7AH2wyI&!3_{pifemm;>}DRq3b1+n>$!(b|O!IaD&yQ z@m%k)TL0OZN~?jvc!+NG$ho*_a_t5GVEv}o)FyM9f-}l}km?*}f?$^8H&RbbYftS2 zOY0IyE)n^F`sms)!;RN^m>%7npPNxUHi2Po9rB6Rr`{;HE~V#*LqeZ0Blxd6Pv{Yc zD7RBx(CjgA#uk+UeYdbm)&YI_*0Yjyn*A%1S8Z3fL0UIX=V&MS-Y`7R5XnDr@S<5T zOI@3F&m|{*Yi)$uFB!HMr%n$?i3LX|8C%mB6ZpVHnLn~P_dg~w#!-ufXY3X;aQaFA zc#QfIfR{0@bNOl~orBe~;p=tW)$cgDP;PmfEI1c>qDw(jcDJ|QTcH@4fp1c+)RxQF z_MyVvD^>^< zcmaDWigf4rh74=zMlh4pb(%ZL@BaDz@d3Ao^wY;SSh%-@$^yazaVqKu9^A~Rd&yY_w)zXPL+;j&5e=_#T&SQnz zGlfha`fp<~?ciQTz<%L|&(W?Yk|R0k0h?ru?kr7ljR{R(uk)HOk^%nJ z6(Wmlvq^ zW)8aI_HYGi21D+V!f8x8XHz;q;j`$G^}dlP(m_eS81;tK)S9w)cq_zTre`*WGrtok z>5%*=L=B(*E!D5%VV9o#mkf^~|38=X|NW3n{s{vA$K7e&A6EnYQ+#uLL9{__EOwhh zZILV0lp8=c=TQ-LNFj%}N$n`*pbdj+O`;HQo;*Jup(8C*Fc(@<0-l-b%Ni9}%mz&% zn9BKbH-l^64b(vDZ@S!rixWIf&Ce&#*(G4EIq{QNT}2=>CXqmYjZfMX3ripDrn zN_C_TEbpoxE+QF{&mY;YplAr0l+qn&^xz{s)WXh_$wwCl-MrI9$s04po~674?L``k zV(CraYhWawi%m1};SRLJa`X}F{uz6Se&?rV(M=)m#~x9)->B)Q2jU|#dg<7m@B^_o zV>ru0=FCTiua};{e&QuIq$Y&0^r zT5EHp+1ibI$^1*Tnac6NXbwm)LVO8*ri}Igq_m}mjSPNUTGI-I=h}-hX3b+_}h$RxNJJOoX0HCtTO79{Sx|4PT1>LwuX$kstl&J zebdNsHbsbVk{mR#Z(Ya}&n=#DtL0smvfGObSW5gh&35$A6|NBi9fA$D5mo=IHOH#xmw&qX(^8v@cIKKNV4uWz-f|Mq>tx zD_{$QlL%c{)bHX=HOirGs@yuPWX`O39EvN`U@|3Zsx@NI)kC!xxD(d%fuOW5E|Z;s zpRIJ|Dcbzk;~dtH^I0q4%T*nVc4Y}f1h|~3)|6e1uHd|esnQ$WLv36=Jti1s&Ez#l z&*l>KjUl>wVRE2^P_5W_ZyoTWf7f;|$QE?=KWBiB#9B3l50mxP<_;;4%_ZRhA-Ln`exRRVaU+AI~?(U;ZIg?IJB^b!C<--}4t&hpV+(PFjpREr78UFCT-J z;9++h(0Y{T?b=#J2r|*2 zoXgqVRtS-s*=SpMTzG4B@))kgKMt+f-JXI4^`v>_BgGTQD^Sohl!wU5HpM6x~b0AFkPsqrc@8t4n5`R_B{%i^l6kFWC#&~ z8djA4q7v~K_=wQKx}iYg+V!)~H=@-rj_QAWASQbih$j9u6u=h1WOCD;*ac4Qj$6>7 z1GW1j#3S-v6E=l~+|!&;F{_H?ygZcr_|I6e`mVUyPpqkhp0F9Bgk(gX1R zU#)!wR2|v2E$;5_?(XhR2(Ah4?jGEo;I6^lHMqOGyM*8n;M2eF`|0L(_w9H47vqe> z8PuM$sM>bcUVBaw81a^z3>`6vNWDiJnp-|1?W*ztEGK_kr`@p*m9tjo^f7&OlVRfD z7@zx-NVhm55v*hHkX_=P@VffbD+mPvBeyU%B%%;SyC8?4*3ZWBGb7+O6ghQmbM zrIncpLLg6QGPO(ba9^qe}7hI+#E04}6< zZ7Rb7)s-%e)6ca6+>UHHa*MG^lJ*F&;KFc1qAR}!dLzlRyL%+t4hrlEvaC2yxLOBi znmJg-jMo}!V&M4t5V}jeptvM*z7$%$uL>eL$**X;QcD^`tWAZ3^vf}1_FBEUKfBsg zEWLebM&-`DF@1s|)p64KftuqV5NRUJ)xs{auTgmE-95H^kSu*3#xc7>4|Rj)_7eM{ zVyPBc*GINMp}a88aSTfIn8IcW}F7PhF5 ze1zC41>SY_7YGEg7{hC=_2^C}>BsllK&b12prZYP3;?UbEUh4CRvU(5@!D(2CY~&e zm1ovNkQy>+RE1NqnY2WAPEOp@5_Wlz{re~yxKcffVRxm*kFeu6@4PLY9F>@?wT|! zoC>VZ=_>$ksx$@Auw5TT2A$$KK`bI8LV1cwsG2+b%P2OdRjwcrcHn_&ms_dN zvyW*=bB%Q9ONm@Aj2vWOAVg}scdai>I<{ZF2v}A5?!&z#kx5N^mqqFKDZr}MTrrSX z-_B7+?fTBx#AAA1D9}H`tn9i|Y~)7$U=g=W$zYq3Zft$pCx}iZ>iac8%T8A^0I|chwnzmI#klPjkCB=>vaXNYRYTh zuvFS`!*f?m8Sogr2h3r+zIww&*l_rzJA-Rft#c?b7@zTDVZOW4Ef`Bpwu}!SJLUDu z7!ig7Rjfg_$AvCHD+J69L-v3iX4Hz>ywW(b1*7#8p8jwk1(cE@IvjFf29%O4N)7qt z-kH4U`b`QFlZ9%%6c7La2q*x6*x#9`3+vh&N?O?)TG^XAm^vB$aV}E6;;#v@%pNow zdNK8P>b;=}^ey=hdIS+tdO{>-LesZ^U};8+mQIO%9b4WTy@@GzA3biwG0$nRWuU>3 zg_GR($C~!Xc%5(dE3DT6S-$ZA1Isf>9FqF*w#CCLIW(GOS#1>gcm^6sb5e2W1%IX{ zhqpJS~^vhE1p#fO+N^+f_07GbFi_w_TU5R{Q&NKBat-|a_bs(BZ_@bI@tOyLXeW=IB=OP@C(cNI9 z{Y*GIWO3t%Jl#$`0f~nCdojiFoGW^PKnM8hF`R^d5XTEWVz77daSZARN1l0Q z(%2QP|Gu^cRO>B=cA`;QJIRUWUxYM*}0x&iRUVx#rf&= zn&z^*wfnN0x#nTVO>**x3>?|b_Vx*{dqvya((%Q4o%7m{yC!52mN5CfDYysk`yZlw z_=EcuSWmQx&vN+3JK2g{ryr+^Le#f$(j82-xiC-W7Q1zl=U8q`(^C7n_79ah1Lf{{ zgtlY2P%pmljP3jK(CskqFl%fRrNe#0z>k_W<%ybJsF)_fJKtvBy#=|KK?#-Q((aD) z)S@9a9yAUOm$|-RF&Uip^r-J+c7S3C+d+zub}ZJru}!Ys{SG-03U#jpwM10VW<2Vq6@nkd$XH1T7X{HSAAtLQT-#HOWw zbCGjtj}?lJc{7h9IaP>lM=gT3>#fjFS3p=F_O{6u=fTo7TywA3?p)@|t+6Dh}R z)<>)m(ZDEM&a6KdYBK`W?|ZQ!N1Yl>xvrDmZpA&_DBZo>9iy%5ZdZpHp+4Eyh}pmb zC%DyHn0)+^$_4|D8Fdz1pE0=J*gV(L49dO8GD1_qou$Cm-?SEslOH3Z7rUiir~;08 z1qf`obWUPs2y4EP+3?enw$aQ`bQsUTFh-|Wgo8O_dX?Gr5^4!nJ9`GC++eP!^T(S1jvD zMtXa&D}h-vHt9!D>ebQ}N*0ycKcP^-V=qeq*I_kt)oV=F2|*}O6OS61q+`Mko%dvMui^P)De~!B z*Bgs?NJ>@sOA*oYyGIXBQ%Wc8eYU`{=$*1q2=$gu5wICB$Ge043TFY3KJ3h{Irymu zZ!a-Vq3jb`b@yfnb9@)1H{&Sg6xKADA$+4tnGG}(*qM&cL@3F&D$RLT`zL=R##YF-^T}?11on`=w47?gN$fp zjEb}#Y(Q{zAW_>JN)|VOhgt_Xgs@=|W3@r92#DJ%fi5^=8Lx z42Ua=aaHlu)rOs@jMT~lE)7m~^`Y{8ut>Esqrr_Tl=w{Jw}63RLk9ZN>CPl^-77PN zV+Tr9M@IHFsA00H-1cPCSFzcGSty_aV`s_0)ceCj_JK8a?(y zbqn?eSR)>s3JF<%yx_WfCAdtv~_vIs(mUe=#a5s zD?8Fp@Fb=W>x1DpyftbVe&WoMtN0|16ifNaQubI2Yu+KQ_0BOUK zw0_n*z`=f@P=5U5?2O7Vlq_vWXzJ|S7+=0DxZH1z?t-m%fy1}{LayZc{-gjeh}~*eCzfY*r1>01>^6EGV|!!sDNm& z0EZi5^TXe+AOj{s?jZGQPv6|AQyBL3OE!Y7`Gnml7vk7Kme~*M<=c_5Vhl9Xy>yVCJSVEMK3z>5Be@eAE2K zw)(JQVenT^B-^vYs>99j&Kkz0jr}_?zsGx5h~)CtDOO#HQx5rLg4UDV8Z}E8%@%&Y;_;z06cbN>~oitHl??U>#i* zWL_Cat+!z-wuREB4oks$#UZvT28NSr!Hwa@nhfmwfeKf1 ztV(y;Y^~m>`{0a2*WlHQuK^*?dL0V@b^4-02ny+KNn90vvBY>T)b)E@qg$1xHu3GjWdnr}Vf7ZlHF771XBj)W~@l7s2`%CEZ6FC(YR7wJX@LP;3v zZSx~Ief9!#H9=@F4QegB+MN-!WeE5cHft&61X85b(@f;^9vX|TAFZCV88DW+Oq2(jL3_apjDHM zOR??;R4%IWjS$Ks%FoUQOcn<86%FXL4jWpTJM2^usXs;`lBV=}eHBVb9pRBd4!Zp3!flirF6AZMf;vJc z)NB1xf(N9x^IgQ~#jVbJu0&@$a9?a=RG<8cY2)4b6rMSnsJCt@CbpI$&lA6yGd4|j zo2c`)*}}L0*cOr?(+E5Vsw~NcbjUzr=rf8%AZTkjAPim*ho4SlG&WDq z{bDyf6g547hjpzKTBdr~Koy~E6{<|fD-@;o4DnEXTCwrceTC8FUvx}xH4cpJ%)iTi ztthCtShI7KD^#Gvm76Fwf2*jVsQ$^_R7ThpKcaWG|J3<*lA}P_8c+^ag~jsuY3>k?$Oy*fuB?R8(qs$d8f!|<3{w0f)k6_f zxDndeQTCz`PfO5PjFVZ!`1x@*XV904b7?E|;t4>^jOC4@G1?*2IAwm3%PQ(0v7Vz} zCYjZbAQRj|cUJy$cxrNj_P|Lpw5T#7 z-vg{iutc&=D)qR~YRjQdqG?F0Mu&JWn^HR}GHc7yIv}e{RH=xlWAjR%ULk=Vw$w&= zffe6Uh~U2mPtRe9%7Tc>m&=ggZcNJ2lCsSZ*Itp}b|pUDvYZ)BcOX5_FS!Fa-4r*a z=Z{?PH^JwZpT8)n&0H_Qz5{NK@s?-5#6MJdre5vCpFZV`eMWlZm8i5b=vF;6zgv@x zJG6BJY7>vPU@8z~?#>9HV@n4!RXjMpB00nn9^(%{ZJIDENx2rZvdU4Fs+gY6n$GfT zn+r;R0-SS0>M+0ObOYms|9r_^*~2J#jpNJ&Kj{wgusPS+A!>yyo*=jTK>?o^JoT2G zQA~k1Gp3BKr|r`-q#L6Tmpvm9X2s_w!U78b2#bwoY$+TmU^-e*E%0>p9T+`ZdbO4P zPCfkCC(=~Vmh7g$Dp_Cbw%V-r*6b~jx@F~4%I_#m_(D=>u151Nz=JErgI}G{_a+{m z@OsYafjn!2i?X}Gkg+slI%9i%8GP_G>~>}z4S^XsLFdQ_lHu!imxMfM&9yBrv_1NnY8_n&pzL^L0T_p!{wmpM#{z z9=WZ!ayn?h8+L76(sc;WRT%R^_MzSqah~cMaLRYhr`p=0*2FPTk2xTfL{>o1W4FWB zz)+O-n@PK*oXoMHL%J`vsubok0NqG89F%STf~{<+&;g@Rl?oEU;T;r%J9-T2AtQ4Z zbWP7IAc>As(gL+~1n*D1J{8<~%3(~4Uw?G+Cxe%f$KdfiQs}6t+~g?pMfp;xvCuB% z8hWcc1vUS%^K|_B*wZ0I`oNfoU?DSAMqN)UpnIlText zw>6Ks&LCYaJ8G_ESL!a=r)zkH{+(hRkjYGQ1aB=Owg!U4nK5$xdyt7`EtjS?N_jBX zIPR~LIxa_K{+kJfii9qtK+*za=#VGkP>DhxBM%LK7Y`r(tXst5f) zxSssweWj7s;BxdhC_jqM10<0e*b_c7xR3tJQOtQVRBw2(7Ca{J%h&VF!?r0g}aL(xM%FX-&-PSv^rd zVc+bD^8-F`PMtEVSlk38nvM(B= z2od~#PFL?x)Xw;Xtmc`OR4};ZE{rLzYKsZMLjBEl26(QXOG!L~OVPq{M70|$LiEsc zRwKAI*_Ws%>4e=;mv~KXefy0kbjp4-`rR}+Hlv+7Vr2R|@h^?%wBcQfn(znRfYq`$ z+aCZdjr%>5)w26p;Z9uPTA%U1$(#NF&o`9|1OPw@4gkRXcLJ+|Mh=E{zotRh{~EU{ z`}}`%ru$zSu#XSGuqlGap?w9Qmoq!sp8($Vg@U0@V^t>|l1r*GmJmj`!jhpW z#VgY=?Hqa44Dyz2xv+J+^rFMo5H{{E8Lc{wkZaXim^-c;2N2p1U!-lYb?-P-KgxV2 zY&+5fp_k}>aH=s1D{S41HEi6PZ_?cDig7cL0oRlZBlO-k{21164b*>|*SzOiujc4l zVi;$J7mgE#Nk&Mvbxe7z7uQj-hz*D?xIDnXr0v?fZa2NF)4c-Wzs;&*#D@7^i^afB zI}Qf89bNcKV;93r!m@%XQx+DRd$fCx6kSdj?d^Kh_woC+=JTf_vRhR!XZP6z9C|#- zUS%+bQryj?xWU~@)cADJdn#rb979OI`c3Pw=BLh>GRCD{X8N!Z;-FR!?crSflu**Z zU6BXo^Sb?xOSiPO1zkm^K1Wpc?`nOrfld0?1l=dL^_jXCcdLTz9ImRE1ysHCoXM}+EMDo-e5AF>Ach=&18 z;UyJKMh-3DL#;dn%@UPB{jTstLRID_`i~}(0)Q69md_}*KoF#mh7UMHVj!ADa3EaN zDL!d*68l=`(?I`bo&W8A=6_{@D4xpwlKnglUmstmJ(Nh1;;XzwYe>089^8k8Obmz& z1NH)Ys+M5koVwb3kb4L6{8@xxvIqQIcDQo^wa_xio&EkAxBVIK{@BPlKff2?m#syD z@~n6={el=l^+0<{rKzN#d|g6VSVPm|DVhQs)eP+^n-ATC&Z%=o z2g_FW$-159LG}BwHF_;hjYABYC%p5il$MMnW;((Q2J;rGrRNP!{x1pV970atk5(49 z+G)2bk|CT=KMAhCgXK1)@Yrqcs^H{-06En#&seWb;j`xGD(0?NzSN*SV>1Y2UxD}k zz!5>(UY`pLgQsAAjPWdI;>9(~G{FS9sB^kmwXMcEV$6AJw+ zBg}=HHi%$$bFIKPjf>c$M<`iqw?{AS*4o{Pes`)7>EK9R3@$s2n7x=t8W=sDA`_QV zeN1W?RW$8mDWZiQ5gG@6He4!ZrnD+f14hFdq zj6%L%cPK7GZ)e(4#FFm|h8klBaf~#c?gn&$m(Vhwm{g!&ym2iK;S*}y3tQlrg$MU0 z3xRo+Zm;n9OoR)=JxWdnTA3ZaDW2dtSX3quIrm55&{6RX*jVwd?Bv}h{T{gHjTGP1 zbYgPm2?pFzf$s1WpDU~EPmM8MmMe$4Vq4A0rp8IKB~y$eRGK|`&9NA(XS`aXSnQ?& zF%Qtcui`FbTS^~6006L{0RXuFTr1}9EP|G)XgXslqdddG$S@`E`DU|{l}W;&0>PHm zo6@pKP0xHB6fFudrFQxRnT%p&V-zg%;&)!Y>;B;w+EPneHS-Dg8O|}&hrpmRU%hKf z>t@mT+}isw>-%;)6H14Jf|^N6<1+0%=+=?pmotW0*W?DbZ+Q=EWp0Bxb3kT7Mq` z+r>RXyFdc_E%>*55cqnqN?w0kk6v=_R#$>8!u1!4o_QiWnCH9#^BW{TcAP~$goKEk zA%@sV2gf#*!IC{s(hp>k1o|lP-xKuAJl2q)ZZeD*wZ<`wD0P@V>#0Ye4{7jxZm>|K zTu3cYP?ptHEHlh~uW&`g-ePe8PNFml(yb=RtHQPNWho__IXs9s*>hJQBoVa@Wqhfi zAW_1xE8k7L4z;Wl4YR3uAh>naWZ~d+`*U=ep>g@#b(o7 zS&BoqgLFb;$7eS|OCppDSVQ)b&kns#)sNfQmy3nV1C(FOZ(s)&n_|{gp`D1f&=iJ_ z5?$@{xpPlbIdV^UTR`rS1zAIDovCdY=+ahvk9r>d=1gr)0+^ZBrol{Y&&ePgE6_h%&tqQ z?fzNSHN{eWHIYNDM*8mV+LDqTy1*Cm;PT_H=#&0>^AF42z0WK~l@ldfN{U;A2xp}L zn4?>&R*jln3|V!>6rbD5VR2_!Hxk|tl0MJPHlOlz!yo9*rc2%`F0>!z6rj&O^w9}d zqNAEVlgyYrMpU{xXZ9LR6kiC--ndX4I*gNZVw{np8y&p#a(;_~=(FanJD;GD<6V`# z+spKO5(0)NE4t?HA}HuQFU$RO*$4muL=P*+KYe8ED$jMUTW(k@wWM=IFXq|twPrir zx-)eZ@e6V_?A@Fm?A^Q`3o16o!t=a208m{Vh(l=mJ|a;R&R2(N4P+l?sL809H3;P_ zhEt2RzK9Gb5$aw7ERLl?0(W{Jiz8+__3&i^_Kp-MR_jCpI2#0<< zMW`0{4->Bx2}VQ6w+^2Out7~Uq5BAPO97ggerI=jXLn_N2^@5dquwHQp>4kJBaJ3$ zm)-{?X|+Kd)RCG?`TcVi;{M0aGP4sOLe;zKU9>{0hyByv zuNe7kA7=P}-*LsIx1zSbj?DzGV>8X)NXq=}Zi@&-&HpPcQr|#(N|djKB1nOrO*<5d z-ukWtgpts+ClAceT9{is@RvcE7SS7OoUHvWD?}<<#PdcRbNqxZA4Sq5Ii2${{oG@n zley!?;|1^|A~mJKyLSpQguX)X4-A<(yMdvpk~DeIpECMrX~=9fz0SWhQg__$ROfBA zhk`>PxsO=bstOiV58ouMefKX?^*^SiJ}83f*3%i@gfeROO7yK6q!F%gi>wUaWy&X! z>O#^{7i9UcpoE}VcO1W>iiqYtX=Y)+kGjl88C$l%YGlPEK46a#?#k^Oze8QGe-PMx zL^f|;F!6z@fA?CsW%8qn_IpbfUR_NkI#U~KMXYxWN%U!nB6xBLB5Axn4k>B8=&hX^ zDYM7ak&|XN!-@>?{86!yaiy?>&(iXCK~33uW|P>UMa8RjWZQa_(lFWr>vU#p0a=3S1!aUBUD_`~<6NZU4v#n-Gz zDL3=3zeorV8Fw~uX||sd@1o?`A@*e}_Bx(s6TFZ+c3anOA{wWcj1g7CMGVnYHIC#` z{2*e((V2QLnv9dU{T)8`_rX;bBM(dmW8uE{6x7&P8?nB?U#j2@e&{Fm-NQvJ)_>*1 z|NQc1_^$7)v`>0%1;t?hE5#i_XI(qPe@jj;Q+}PRDj@JSXg8laRiS2kZGh_`HlskX z4irKmF_OTh%&>g*ZaCFIZ)n*&n~M^^fc&uyFDnv3!uJW@FikT-V=6^-D|2jYB-y^e zdGGA`$MqBVC)ZN)=pI;DuIlfmLb;i#SY(X(gy6!xwP2{sR7R{M4260+qA`T(_NlUG zGtvqAOyP-IlN2l<70X81Mw$WrS}sPOm+(fP3HSILT2Hj_9nj0QDM;K#?Py-;y1R>P zTpB&fyRs~r9nIKCfw{|!W>Mr_W(x-14VKxqbOn$;5queN!eollc}O_6Xx$@vNBy`` z*xG)|QLs?kw4dy+33tl0oEh?L-aNRjBKzInJ6IPZnd-waKbb*1&*wyAj6il=U>5_q!^r63j5S(9(6>FwErJJUsYVNo%K4a7%T) zieu4)FZ9MmTX?`2WZkOV-0M24jk~z8PBa$tm|(7L&l?f+E&-BNapyL(Id1n$8 zXi~jDK#fQw#bzmU?uU6oO(f=pKPfLr`z7H!4Sd8XL9Y>`P!-JXm%tOztS1syq8?Ys zT)<1Hdn8omf)0WEiOn#g0tueNC%8=D z@0|0=nP*&o@V*C^H~}lasmd*q1gj6`&^(%=b#e&vu>zT2X5DTSm?PLF@%%7GjmR~O zQ%?DvI!-tP0kRr&t4$Q`@Xq@8Rh}F~0tOQh0KoW{V8mZm`8V^^2nAW`ZUF?(>AAj{ ziemC{A{HpI3Ry}C1r#7C$hC&UW(!I7>ecvXHuz@%@AyX9Y>+r1^n`TRn)5c@z5Ux` z>`vY>TnF4Vq%;ym=yKTXb?8EiuRr1`H#;!O7ddtXA>DE1UG;z}pb)vDhW)*J&vy%o{$ya6};ic3JYL$pEz-)0`ZjdtEbqfOMSyJ;>V>>FIp}mJzXG%EFykpre;>cgwJFb3_kd2?H0cJZwO+2~ zKYTitTH$}@4c#^BwB?6(A5LAfsFW&T^3gGcRtT9k^>ne+@PZ8oo3-+T(n^X{zY3g< zT95e-M1QaQcktieU*So#y(3@%01xQDDPt#OXk=|?C}wJB@1W?Y_piVIddquNEESPe zQM|0GZER~yBw#<+FG%>qC%Lezh(5a5mgD&b!|%vP}vjPEmJuxw;nI6^(gcbo>yhtu6F27}#Nc%p|`~Kh0=gs>*mCW3G?z!ilbMD#h zy_t)`s%0m?J!W42sRQ4uRd$ED$I%KaA4pg`r>uXsq>!pL&K(PDHuIOE6T{E6U;5FW z8C!bJtF+W_z?c=m4Lf#vY}D?YUQf7w2pkmZ*id)ONN>-cFc+oG*Mzwtobb7jhx*=UMA(YNll5ucsh+5Vlx?6k4de=3+$ z`{CT(@$=uVJaLTk=b$o&#?JWpsWXcXMC8oQhGe-t0ED7?q=4e7_NZ!a4e)uHmmt`(D3uZdnbZ`_rs%_m$>-#4d4{Ty3#b6i{= zwc@SkSJ&D1&`%c^{qSDnjFWSo+&+9n6QKuuShNl$e7QAsmd7-hXVh79f5rcPsrZkVNzU+D{6{h6|#G=1wAQ})4#*x>xUofCGaB)m27r3wcw z*GRZf_*CR_Yvk_sy`Sy=)4^Y7k8HW*r!p6&53nt@9hx(7U;Ov}`R#_SFZ0K);|Uu! zG)3Jjp9Lx3}@#DD%n}1;%c=pHFuK)2>@`Acs&sDSc`)t_22WLKFU-WX= zrpe2WuU~%V>ZO+3o@-m{-k(JeR;(EL*mJRMdX9{$TWLse*S%TeADg(~*e^A&_B=oP z+W6rWPgp;m@Z|Anzkc(ts8(5Z$~EZla^9i*plwfuo&6&4c==}Q`nFs*{>_XRCT!ni z51rWLkNu5$gf5PJB(dD~sp0h+l&f`Ntn$bMdz*~xm{{p_Wa(Fit;nvMFn!C!^(~ep zP3!z}eDl5$W$OM_HM#lRE03=DWb@H^t`>(@-QBQu+LD)h*?;I7yYlsmbw2D^ZqlY6 zQKw#<_G;T1-NH^h8nCm$;}PlY*4h5(u&cvMr@O|rskFbrwSBd3*z2G4JGgygMz4EA z&(3XmZ+)d6u1^aat-L+_l|7pi50wsl;aG)w)AFx6Ggr)MxVYWd0gn^QVqH zHEjOT_-&Jw*W)WJiCg$ryJLmr>P(p#Q1zi}3qA}V@ao2iA3XEvu+^)|6qN4!bmcEP zKJx7Bj77IzEB);3%vUN8t#onnq?qajJusd+37^KerweTI=`STb6dJ zI=VQ0jcNb|K2UyYOi~F%Av_iE4T0a zV!3PG;=Z#qYH;QAx`#VGkQ`K@ZPmbp))hWHnYuA}{P)dfzhPPPO7HwufV5nlU^>HGe5t8?DY(+|IBo;~@K zca{uZoDqEd`)jXVDgER(UrkO-9{yL)yq6a2zBV#u_r$Z^S14IeH!FL#_ouV=MJ#{) z)Ki0^J6au|P3YSH$SFtD+2e11o6xj>+mZJ=S$o7k_vL`vSry9r`Tca{$!d2;oS*yK z=T~>PdLyf4=c0WwTyzA1nzY)$YZQ>u-5dfmD5KW{jHbol$tCa2a~Keu0t zPtP2g|ND@AX+2zdvp*|SJ!PTuy+`Y>FKSSA`UkIX+id;H^x(p7NBrwOv^^p=eO=k; zv#-}rP6~>TzUH^K*Pz-F?e_op_N&%U9)EcK+%Db2e|WD=R2xgBPvp8p1epmYNiWOHArc}C>^+5Y2gZm%3vtwAt-a(Z^ZXXQa)HTQdkKBrnj@Z+@)q)ph z?S5jZ(ocE!@iV(OOo&|;S<054H0IgXHTHb<@WaWLugffav&@w63XMni=()Xo$owZ~ z)O?~x|6}LA%Wgcc@vGzNY%RDJVt)7Lz0_uTCx6I%E6PDK92}UE`BO179CBE^d48c?VKc)zn&R-ZRps#<*UZld^mG@yLRthd3f4_YV#_soN{jQ?UjqScCEL2 z`juB|EJ)bBwb$XO8;_Q+)NZu7{+?kS#tj@4Fe13!ge^m7Z+Ww6!OExWFIzwUhjn8U zpMCT@rFn(TtEwlwnZN4OS>|i|ep?gpeDceyg3nBwwyWN?_dm;?Q{hTtm6;J&+Qnrx zTH3(*(N{aWOpRaoZmsc!v8_Jdu&v*eDP3D$pW9=7=Rr-sO&(fm{u5OqBdWeJ?161% z%01Zcho9ekv~}(q^AfSZ` zlmc0WGU?2;qDS-18*79U>yRKoj*nuPW^@o~3R zHJ5%?{p#()M}AF2G9gy7cm{%8$)|>Pr^5wNd>u>FwyDg{7@}IJockceebB7i*Dz$Uw_m$86(dC0_!~0$R zvR`v0;-S$;$MmcGTl1Pd%(I3ycz9f+wLNBb-1=Ud7uG!R`pryRYrpMBdepWay4m_* zRMyB=k0+0r5Tw-1L-Bj5)$#q?-1%j6na3IoS-JF^g7H6n_UXM-W0TS!{e0C|k7T?s ztVQGw=Z`PfNbK^?`cv6e3KFVpEmgLA-He#zbC1nfHF3`N*VetZzHZ)MCvHVgXg7IM zGe6g}J!-_QpKTe?V%Lk+Uivno^b=9h6DBA5z1BbXsVNnMPkwv(ku_xtzpF6$wApXi z%&P&DSJ$gGXjGNG&qse1)7(Gk=>B1KOFeM!$0g%0{Zf5O{{c6mwq75Qa(qCA^XKpO zveka1eAyelJ3X@NNcO&%(zm~V!7nfP#*Vd%7fe-_%zNjFI|tGZzEkshyJZa)Y}nA< zZ)B~aHg9YUt=}-PK~VjV7PN2B@LI~)1I>TCscft>vU1mZy+>W{U2pcN-oKqbKYYQ) z;BmLtj&3mOw<%Z4eX(Wl7lGHW?%qFYdac{v_c%SK(v7!%?tE|V%)8Y-E({&`uM=0N z=JdbkoN}a8=`weoIeMVwFQ@IMrK4Z{SN)fI{p*9jqE>fUZ#fv%V@23VOP_K#_T0SG zU~a>&Yu_4p_i(L0Lu+-Ka^Rz%Pk$P`ZrTTTo_ep%9|Kx^({SUfk5&G8+Dnap{`vP; zn~kbCX~q2Y2XFab^1FKa(z%2|f#agaR?FYDI&Wq3{9$*NXPW~TEVB=?hb_vUpPh4~ z!S%EUdUZVWc;uPkAFtlq&F}il4}7$7!^Uo-Cv~0l)LGZ4mlhvsSL3rui??k!T>0?c zRa-8!`lELFQRVMkE9$)N)tS{s75sX0X~pk?H}1~(VZecV30EH59o7D=PnzBRY3=O7 ztj;4Y414h7qazO;zf$Gf>c^s5ZMzd*e_P)>!Pl~@v?@AVw*1JKr;oqa+qP)b#8tlp zRr&GquqIJ48%A{N-F4Ks`Wd-rFYMT~VAA5H3-_F^di~_%(^mgb+4=C(KP{{MO8CfU z+TMsSbNmJZ8h@rOIDg~AN#E9PxNP2ESLgoFFnG`T?nB1jo73ZVgA@*=I!_xjAZ z6uLj~do0gxdwtw;L?) zeKV?Gtx;XB7Sy@a;LY4U_tKud6nf^s)zz~;etplqoM+A*d2iFqz&i=`cfU01krku5 zTyEyLJ+olfjU!v89QkeI!*%X%IcdMyvDDVp?d@{|qF%{7a4&u0@pqdB?h9+sWW!zM z_K#f(Z(llf&#!xzG7tFU&{286r&2C-ul!qN!?*qX{QkiI0`b2rhdCq15?1Ii=jB-( zVf@cf@uw-zVaKN~tHqf+={x_?ZL4;;-ezmt?5vt`k9-;X{_Z)QZtpMK`1jZc+rK<~ z+vxW;1e7kb_vAb054_Rj<3k6-qcR*dwl}&|dRo1Dmm{BySWLu*gBPRN`Swsz5;Kj(hGbl>nFJHMH8C~sFfyy?-z zAI6@#s(t%p;o)na=Qd7VIwokyb63`PpZUc4ho-M8zbs@$h z`g_@3d$yl+Cbr{_zR8a?x#Y|`xMFkC0|7gpYyHLZr(UmEy8OP0ADBxoJ94c~|N5<~ z`B&?@y#DR#A0ACA)igPL-uN$1?>w;c>cF8b%LSKi@l^ijCnFDZ3=CPA_*mT*nLGEU zEkETN9@fgfGi+IpuL3`PXjhwc(VL&hZvRc_Yd@C%WBjGbhsU0IQfbumi@#9!6Snrk zyoV3JziLMHhi7~-{-vPoh=L9AjVlbwkDvd1MAM@yB11<#dhCPiuUy_br1Z{$4+=6q z+Pu2;3o%PpKR70QLA}d2C*GR<!JWK3aWrgN^U?e>e3^%;uqQJh^Ab z^t+c&-dL6$@_WGaJ0EqrcjmV%!EZI%nS3&=+~db^*UDR89}2Dz9y?-N%a-RSZri-` z#G+L*H?Mf6`MB&Q^-@jKzx}-b&$%OKCvID|qjLSarZYtwaRN8$)qqL!Zzms{_|3#G z4vhTi%SGd>Di<;;-nf!Bt^D}Y)_S%bm6ueS`swaDS4+LMZ_3X{YQ1yk;IcY>)^2PY zGTV8rTiB~@uoljo05P2@|KwD5pg+N zrv#1C+tWRm`H?zf?&lgSH(WiaaCw_V~9+$ujxzs1R^@^##_i35-@=Nbe zw^mDOIJ(CJX=|Ms!&ff2Rj=EaxsNAQ`t{toi%Z702tSuy@s%eA|I&6z+c#@}__lJv zvGcd8Yj0*YEtq+48;H5jrV@%8eidU%h!E^M_kJOAg*~#n;~cO8~ji% z?TOLPcO0^>|Ha{(_b&;3t#@Af!b^YMUOcK`|9cQ8!>v! zt;su{Ti)y2fR-mmKYnE9P`?!^wSQT&GXJHj0sEi&VZgar&v#w*=eTQCwjVDQ_3#|m zzmx{$O1JD<>y=h-=f8Tn=ee7SYqqW}h??Kkc6ZK+OZ|7Piv6lf)fKnzR1B>wKU^_`nh627h<;v1fnGFkc(8HTIEZ56}AT z#FsT*dAMBT$3{N7k6s@!dt&TrW*2b-rfbqjkoXUbSUUrB5bpE^4(uLxk2J7bKEP>wh8<#Jve&WgXS6^g`TMT*}*Iy(6& z`@zolmX17F>#9n`AU@I~Y2UOt-sb~$I#xIX8i6MI*j)%5p1@vC}Wt6Fqx zcKOKaKfK@IT*AESmtOC^{`CPDqSLawRIOW>W7=Q2b?t(h9m~Dj>*}kul5QWWn{;DE zr6YsqkFGFg;)&-i)v{iW{VuKS>upB#o%qz*c`t06_T}qYf1L^cpj7jQZ{Qk4Wnkgx zTis2w+T=C4*>6yXef@i^Katxy_<`HwdNdC2TjkQg;9qlB_dj_rBB$v`KQz0#YDez- zxf}nA-u!fh?^nDyq}i}O6KCY_F14_0?L)IxP1^j?!RDistQsAAzG%NUesu10NqcUe z8};MLN%lqcH{2UuKj+xmkCxQF`+n$w8yf~+*|yBGyV=MEeeYfGz1mhIs@jgX8@w4m zJN?_Uzju7+%*Ax4E9>O^+{5c4P9N}})j6*D_mf}T)TsaIjE~;jGunLdcF?3Mk#icF z-#olvY=eahYi4|OBz#5kjSm)G`FvULT?3~t7|FnRuVUORKy|>cGm(s_5HmgFb zsP*?oA3ybSa?s}bCvN|%-m#n6yYEIgEW=04cy#sU0me;v_m+e-}UNZKhWWk4K*%|dVBey2Rb$UCET&luUuw8-&J!TZ@)ioSJf>u`o&fJIyG(0 z8*g?QIXtuWye(TIn|}R%o3{`C+Iqvyf?A({yZ7jn9#?+1b!}a~^o7=+Wt{5ue4k|r z38s1tf89IlTGmq$s~b&g+VF|p<2&z3?*3upWmOlyIQDwW@3*8MO1d{a@SPoR2L-n8 zTw!8paAvzjp<|wUv*n1uJ`caP=9k~1#+1u!xM20-z-|c@t(V^(8hy0o;_W#nqQ86N z;)ivQwwh?0wj!^3+2dV$z1ylugVX!k{Cs)Iv!C^O+P^-e(#_T622#*8m>ht{rtd24XFZ<;(2wt3gn z%d_guo|AvbIlA$u-(?rZ{Ofq&=l*c@}EdrKI{9@p?j7j^BUOi(g{rIw3>s@C$ z>^SjU%U90LeWmV=gDXC9yw~t-%HCD>+5_Ksx#NOH9Zhensr+4q$1n7IdDOoa26hRJ zi%rV7FuTkAFVlDax?<4NA)EGmdgS{0z$aqoeA+NI@#QCShva`X@w_8w==RTk?D|&n z{FK~dHBXKHaqsgFTdzKoG-zUOQq|ulEW5mX?2iX`AHHDCY}G&a(fnmGVakz@N8aeP zvzB9I!DnS-njSd$X}izY*0}jvNR7S^Or2P*Ro~-%)~(4{SozZBM_x_4H><^`Yo`0x zu3Nfyv?`X+)np59ah3w>-YpmXH>=k1zPCZ05@^FZ}-4Me}dJuDt1tnpD~K z?AkdSGQQq*d5#GyQFaqZ05yo>LiocD8^(4~<#Fa22hmsV~2DAu{3*E-j#ept=99s6#M@qg-* zr&{+(zgqpqg0i2~THnjH_W3@G_tbs!%=We$pWK`JcEQihk2rVLd3WrP#cNwAXD8RI z-8?gD#B*<~{OE1hwijCcHEY3{`u#Iv)=VlG_G5O%OK0ajy>!!|Tf45*JNj^kcDCng z?AX@nooU~W{ziQ4a`>#{ue=E4u>A_l2HJ@DFHgv)DYfb0x3z)a<@lSFtE{^Zu zyu3N(;!wY11v%U7uMDaCRJ%$Ie(G_y^toYsFFrEjvuEqsPp%l+=F1-DzpAv@eB%A^ zrwhu~Q!Yl-+qU-Gw@;;XXp)n8dQad7mJd!o_Rjps69X!CJur4v!S*UcrgVBI&p&U` z+b8#r85#RWYV~{9D)?E?j4V}g$RD;pPHpeqy-TUmRm*UvqSrg7?htCf()1tvklD?D z9`QSiGBjy~hv_?!CqiGzPL=2n_CuW-;5RqF#J%(Dk&k`;^jbf^u0Qzs)e&9kpLs9z z^6c#9)C@K|+`+kfMH1q?7uH}9H(cDnX+DxWRCjMgLOuJ!Tk9m$LibMY+ER9!_d>`P zwG-*i?p?~3qc6+h|6VNR=U4G-`fKd`Qhs5<{z|YCW6vvcShEJXl*Wz1n=2jd_N*L> z5@$;{DbYDO3j4~bI4n+!qrj43LKo`Q)tYXxIV~AVzAeMzP+Ws7N_3t%9sh`LLX=(> zhtq1eDUD5ylt5|_AifF+YDFN5?D}f7Dnw!xfuSl_H>KiI%mq1#<&mfm8FCr|gu&~f% zW(b??j;yd8J{@OR*SMJ2Zb`ABKw5O_Y0I%Vi2y_Ltqx2$tw@0nj1J~BpqgVYRO}AL zoaM0KJC~i1E_7I3R$Eqx;4}%+Y(0B_}W0GSsC+Dgglj{>il7 z9a&sKai%-0SaHAy8o5q}NTxj}$6knz5&oe{bVi0#iMC}p?A8o$O@YOR70I(ZtuDI* zVF#kT(_(g{4^ndM=>i>^kr`2mOmn)+X_7#|Y7RL`ti?Zt1+k%V1+@UkX>k$bad_&m zgqV)1XlKuN<>kAu+zv}RkS`*{+FPA@Ip!ihZvluT!Abm#1p`+JIK}oh+lmzMbT$@^ zK$%@ip~Ycg0+wmV;+XvXO(JwtsD!4`Dku#VD5k+c#gvwB&B@>kVRG8@9qE=1B#aGN zvwr>j6{TN5X!rQ&Ua{QS{|imVw^Lz zUx1=^?;ah~CAwp5(tzZI0Wk^PpDiAS8!=T#q1}_C6FbHx4`?5k7@6WSJF-B0m7=Ns z{?XmqCnm(TAJ8cwK2`~|=MjIJa}k?m#@Ia?3Oe`UpW~{02)un}1ET$|kTp={9)1GTFF&Q;Mi?wCba*6<{ za1a!Oq;-Z;V8tvjAnhZ$P*`A28#EjgQ4SPB&!pG^oXA}hVxqe;rv8VN4&fuyRz~6r zl81+oMkh8AOHQgc9W$V<4&p&ep974&=$}9*R5Sa$D>VuXqD_UA2)8Jd412mWh?c5d zk&u>FAT2@i-r%{VbOJ|S67oXPQj*PMZ|!;*_NGpg=DHdRv=Gdze_ zLX^QUE?iL4v}Bw>^nt^i6U68YK$#X-`XJg=R84C#(8Jq69;E0Tn;h36E;jM+5P%6a zldk)(d1nhYA1j$hc6$!~1H9AiHf*LYP#_bk8Emh~rzOjrUZn1EN%?tsb~Mbfra7Q* zcsl?j{SG*RLRIt$!n~Qt3Ql0~8kzjtM<+)QXa_qWu3N_ey_)fsujZoh1fx* z0YpBW>Ad!4msv@(+A@f|eE1>-NHb#&oJ|bOx|11HM2+~QxLJ_tu;(&n&0+Has#2*r zi{(d= zAsS)puw|GXswDxt(qhgfeW2-McM?WItW4-e=95V*M1=S^6yHG=M>K9`YGev;)z829 zwhl{ZzRQ~96z%^f6}U#~`>{xSX>Ab^nUA1b54)h9VlXS%My1*mVJ>?Z^~1mZWW4(8 ztR-bQV;-F~N*@T-E>yVoK@8VqfkEseq3Oh5TnDm0M&RoVOP&Spl`WmbpTkVgF*}{K zaVi1&Wg-RR8z^b$OY!N#o-<;!wWOp(<2gTSke78)tbL(Fn?S5!u2XI*MA6uq1%M`=@ zk!bvbuHDTJ*!v|0pi;_2wr@N%90dO#^zJSx?hk3AndHMbWD)F73DTr~kueuAQQ>-CuGITTtNz&0gr zC;0TQ8)UE!O@UYuI{_J*a9^x0vKi$*LC!8zCi7dcY?uyix$ zTAYzCM?TDH@lgk>1&#>&EXY4EKMi)1!uVbdDUcs)AzR!DLPB{tm@h6!+e>U!0tE;> z8aOR97XgfOq>3xKqyDrkh-@fuX+b~q&4=->&4-WAHaD1*Y;pup2@cc1ih%qd;Oa06R&O0-en zo@whuzj1beWy^^IZsJp9`~rQHp9kQXiY-6a;=t--=fZAj3zdKC2Svb1Hey9;V4kt!(Inx0dL zRKctB;`_Qqq=9AB`ISso-6T}ZK*ChjmC0q#w%Dx0EP)M74T6*iE^~&t#SYCQ`Gt|4 zkq)z!GzoYW94vte1ciAE?ziUV=PKqj?1c!IBHRL9<8`JSGPX`5BoAHGOY8_xL-8DX zFM_G6AA<%Fu(~m-#i+UptRvJ3g%zcaSBXlKQvYyjyi9zfer|#_=j@HBY+yjcfFP|A z6Ma%Nc}%JsDykD@oEX!C2&v?lWjq`~YVjlV6trY-L1-0sgD`8zIP=rE9t~_1qTz0G z(qaZFq3{M(;67-=L{n{~kc##kJj(mW*yb7qXd|S-hata~ex%G5H>x@f4#FU2HcO$j z6r|pdkSyZ9tfs+st1U3Vgyq2K|0TXP5B*Q_Er%}8h< zPV5lyA!*qC>D%yzijxH()utlhL(-8>Hn$$0uA8=>{zrumHWAl>Fr6h0BfSch-l|Zd zRIIUsdzDOX)CD2J9}dN>sgmO4F3^MaN~mriF2G*@%hb3wg&^!4oNR$i^mw2D57j`T zu$lD+nV=A~rj7EBlng7u#8Rtfgrmsdl*rlBSXPJ@SGo^mfaG%A64%pla(@JUB&?*UvKq!v~7|=q0!{5#nYpTFdG&kZQ38Rrp>p%#J z_-&**OCuEw+7YgZ5xD-_Af56w!XQ7Zoi!_tyNW?d>&P}p9+2FqNVzwmG$Q{oOqO*u z_7n}l+lbS%P;?zoI0*A1uU$-!H8Pkx2Czc?_4$$LhH=!8_|`<0bUh5fczcF5vxtFFAd;sz^WpSE=Rgo#${_GXj@?eB1tP`5qEob3!HPMZ%2~+T;R$+Vu0qhPz{)c! zl(J;Oz8o#hf(fH=fqGB|nHeC#(sh-{c%^z*Lc*qViNH+=OgpWh5ru1XlkuRkAR(WK zP2EupDvnJO@KttqLMqc$oo7m?u(60~kW3;*$U;9%RmCBgJrwOdfk>`}*TEQ^WWY<; zHcTFP%t+NKhIU?|rx=8hRU?DX%zU>(bj^US{hBAM&?S zVTA=?WK>+R7(Le-hS3@Bq0-_Sp;*XR@R);dKhppVw9*C=uq16gX6;4=J&s%(p@-l- zJ#Vnp^dKTYYbVgp??6 za8)0Y77)Axs4Tw%XNE#+`e2MG#v%ohYlb2)$pE(nZjZDq5ZAy4K-vNOdHNs*gBGS+ zLbuou3KMpN+N5vr8S20~@(-o>A`)R%kjp{kmKFtKL7(V$NeNwhCiCXeYJ5dlJ37?V z3JTH@@p0Ya;(NxkfkpU4svsJ`tiav~6iKKv*aBAz3 zS(1qYLssD5l14~mG$O(R&F+*V&>~41F^B|S^9I@~kswjb9$?%F1iOsDio}68D!D@k zHCY@1FdIprBD5g8{{x@`f|Ph*S`24$__~P;*3xFI@g?I!1}hR2P>Nw;6S1#8tI?4v zWw5!*8B>%n*KMkTaJ&d4OtBVdd!%uRu+Jt_P%*=fyaZ*|sh$#fH>-0H(jl%w3wBx5 zmFDC-DTziyv1}9jOVX9GqX>^GR+B|Zp^!k6kW?0LXKseb{8QW=TYjMUo^Pcz|6rvp zs0S}ez|=@4DWek+GJhDY4gI;nqFPy;OIgJjuacr1kMuiu0|!GEdhGE9lntpTH$ZbqX(`t^mLet86QjyQF|ke#-5xgf*7f6ji_!*jc|+ADRu%% zSpR-045ieDK*j?V$Pf<_iDeSYX;_*-VribQ&9K`Vpj3^lOy>PF`q0{tjToq*2(Tr@ zj&LIqHdM(ZI&!AtjDoP07Mo>X1d5dr_-c!$Mr^f@LZqf(v19zjbp_jVrE8ljH_Qkr zZ(4swU{X~~6Y;eajwa^GzO`fstffjuT#)zyrths7lk+AdVui=C;70{$(-ba&JoH`e&={!DDQ;I?|%Szm=-OXf1}Q?jw4mr<+ss zx8#>uJG9+!DIhVd<3R>3IgT(7*AA-r=h2u=hQo1ZWG`@3i_b&)7#tZ?qCxS2AtEFV zGa;kGnb0=0;>;D@j-y#4Ldzm%t!ZO5zTiao8RiAbfQ7Fk*)`n^=T>lq){jY@s>Nk= z%^2m;TC=&{4-iweZjhXLC}47B1_q?mbB5G&rUt0HkGk>j9prw%rF<6yUkAKoFa>w} z0$Is?0x%96wwZPG&>|DX~vMKQ-bf^Fmq; z55*Te%L6pg z$q5G_&)$3$5asuhx*r_>RjN)uI0tI+I-X3D>FAJQra z@3%d8+j}Icl5eP3NkQyeDC=IFj|{dLYU|h}Xd-HNovns+lk}I=?tU}GdFpHlw8-SZvLSsm}%kZl%6wN}FqQ;q>1NrZdJBl)Dc_@UR$Mspq z+>y#)wcLt`wVEjiBc?$-ZwyT`BUbvZ5UXf${Pk~wk%uF6kObH0Hir@+Bos@dPV{}dN}$5!Hr9H_4%Ld1v@{l{rWXy3VN5)eHCTbJ@t=#bp zIaL)w%B6bmr2HTP>m-exP-F!!R=wfhkReEgb)2#MV&Zt7+z(%sc%PrqG5= zv!t8pV4}t`FjL8#fQ^EG*vwdd0f&nqS1u?~Rxbp82w}LfC_0k_jt(Co5tEn-L=T-!mF7I&pZs(9G+783@J3OjZ=}X4HO#}GeAvlxeq~PtXK(tv`MBkPDLn8=X6ot-W_FH zE(1DERJ1iFH8g0N>fubrh~vUqd5%y3a$`Zk3Ez}hF^)Tlq1X`Pr&GpUlhJ(D43&3P z;$&4e#2z}hV0Mt&d!5hy#`M&lO!>KYYs0)+t|gt4HPq@J{&^c8+EJ~y7u@D!X1dZJ zoxZlZg5YquIb9mv#RVm(1qV9zx zv&D+H0OBdDqT=}e%bv&&WM)K5JG!Ln4HJV-a%vsDLHf_Hzx$|i;oUz+)WnFd+seCt zZR7wC*2~Mzf+<5n#yL#r;5eLR<~Je)^7R&4@fMevYA;I6G5k&eF93>z{GaC; zU!zN=@%6p9cgb@;ZfxUg+W(V$6Qf2MOU^+mKazea;GsAT4sJZ+_rwV)(wm9on4!K? zGs_Ke-XuifVM|EkT-Y$0o#&*oX)&G`14FcTN@GOd5juxr{Dxj!K=nt#y^P4>^gheA zi4ws^lswH6AI2Wx)2>JmNwSz~?zwL$s^RCu(krg28-?CEgWzsC2069k*@5^-MuNF# zAY-k3K}GzZiuC1rqkjo{_*h(-QDp&hkNl0-g%PyjF?LzxMO&(*xaJb^KoMdVY&)cQ zx!J}ShXu-oB~Nw2h^z}1qF@Lvm*7L|mQ4)Hh(hP~^?$pkL-gOdyH;WtOBbwaU zczn%jY;8EQWBiVdLKZ1qHN}qf(3wlaCV-6ubYzh;Z7a|M4_^6~`^M_Vp|zG_O^O=R zsKLGiuhBNuQz1H~B7GZA7kwfbO>^L}G>V;a#4Wh`li-PH80}dcHDl73+(cYhiCxV@ z8z2w`1td2i_t+mVlH_-*IIIP9Q4Ql_83uq}q6K1yN@U1Du8N_dju`6seaaCs=9WEl zH%ai@Ciu5(q4*k09@2Vv^ii9LZoH$%y!8-_u!-)*Z~6C{i{t*S2M!*i;V4Oihz9tt z282$Rw54l5CBkf66=`Blx2h-lh<-F$vV#=f2D>k0-8f!Hx!)MlO(cA{B&kPhEaEFt4Y-S!GS)&yDIn~2w$}%f zccch>w1_>ZyRUB!S7$4Pf{|P38udGQ4v;d+jS(T$zDQ|gGO<%g>|Bk3S_Z}Be&wr^ zRb_Z3PmJ5`u==JttApc9_6F_z{4aIB?i1i&JH^!v5#qcJ<|?mC(v~(%TUb{<3Q_o) z{wMJ_ESdL-Fs_rU>U$OjlB4nl7a!9ls^k=VB{khxMqdhZkGJtkW7$%ruz{lnK@r)K z{Ix0%7W!yVdSRfQ`Hi51W)Hh@&9G#AI zBz^-R{sHXY2vtzD{eTluNS_3X6*MS@4&;&0UBN7+l*iN1dgn8potr_ET%@~@R>*;| zz%KU^ZHXmtuwPu1>7cqIoDyaATOw*KkykSkf&8LNbc60f9){JJMdTKR3Xoc6TPdWJ zIv)ZlLb?hV^GWgEEtRZccCDf>kS5A#2e9Qc9*q_QYsnK2LP+Gjif*(dj%PPcF1Y?o zq9Swx?s<=sIPHUL3&qWAA>3^0&R0css@k-HPj8Uef8c?aWE4r3cE-_&&JkP)WD9YJ z8q*KznG1swK_}dsX84H9j_9MBbyBlxVyXBbgFc<4%e_0@&^2LOk^~}i!+=8wu7%R9 z5-}a3G&d!YT@v^qdM)l}bOX;V2#GZ@p&p9p&1KObkv_no!+%Xc1zd$#O_fGMBbXvV zZ1QSRfaGe0M3UVi_3stOVx^G@BO`CHj2r0ni0Xad6uO17^k$AcJN&2W6w1q6vur2} zFkF=whnxK2AX~|15L*FLT9iMhOGxAzF)L3hFWgT=-w(oT8g#jV=*LN?dOOf;!fk>= zG-v}uDN!-1#F)(G`k4ZGLcz-QlUPBes_XW5)kk-C&B3l~NMyG)xUsR6kiQ?qb05T% zW>gn}Vn(?1TwLA|i>e*%PF(N$!k6xoE5~G1iwG*hIhJx5B3X*su@WS9RfHC^6i6{J zK`Ei(sa&Cvh#KUNj8V;(7mLC#pjM@ah4tLY05-XA@?H)1s#yByCAowwJ=%o@_Do(R z8Xgv-*iQ`BAx(hmU8i>WhCAwiFJ6o4B?%LxBl3ZOC?moSLmrq!l~S)FN+>@fc2-Z& zGy6)e8v5eiM0SY-heVSOFet@;3Z5#hVJY`>>D@my5N%waTQ?{fOCT*E29F4 zfTA7~0}DU&`e-4imEKxd8)WI$Ye*py>bsPy7Pp^=QyR zq@S!}FbtxFI>km;9PeR-wtN%O2+~~` z9mMOw5T9VSP3Q>ife)X*ghZ))0Yh%CLU{ooCTgIT@D;qbC%R+vqc=H-?rt>YaCGjf z0HP^2^bhp-5a>xekBgbnIwNBWH3J5Vjklu(VK=ALQE7$UMO>CS?;uuG0t@!_W{vjX5mk!0*c-=MOj61oW_SCj+yynX)A{c^W`FlMD3z{GzIESdx=0Vdbm~;ccr*+*)r}=k%cYn$r;+b z`FRAEuaTNUY#(GQ5hsWMi%49P$i06K>FDVV(y=)`kXS;%1Jk$*~tyH1;S`a%JHY{|eTRY~7o#w5!W#!`xn8 zT1fZgX@;PBDIHdx9&2K+UZ6Et3rQ34IFba2oylM_6d|Eyrz&|ICdC_pd|*KZlb(ZV z<>cEF^x)cX_Fe?b8_K#ZoUb(FIU6kvqNzW%vk85B(W`HC9C5fJew7e#RuNh7GQpvy9PmqpFcPNuoTns21srg24o1L zJ1}N* z6CKl#1r4$)S%Py%f!XXZL+LnVp2rmQCYpj&J{5<%LuBvrsFPs1P zVuXKkqH}TralINXdysYu7AZFzH6h1P`vD*!a_r>_^wI!B zuFW<)?jyxn_TseX3ul6!jOA}$c#u~Bc4JlJTSk(hQ7lJ-k64>0jeT*Q4pRw6FLx4M zm8R|p7SGZKGD%n}(N)$Dq8tiG-mQmm#f*P(5`uko^iyGzD=ieNU@2W#gr890_(+)i zU;bY#Xir2B+;k+n;Ged2x@}M@Om(9b?+CDaO1T0x>_b=^_WlC;!nQ&jB&$f%tVOED zK!=`~Vij~~FU?iSoTZ zAgfTwDEAn}DE975gtZq~8E((9Y!$e4XaouB_icS)Z zG{fn+WcHA%@Gy1k_jha(;1S^duAq2-QY0>oY%G-_F|xr?jnU-|DU^qc`^Y9y)JGKq z#cPPTk`Cod^s-%_AlMG#sWWbr5kb|U2vupfBTL4X)l1Z+$$y1`AtACS5JgjLv-AQZ zf=5h=2Ge6*{Ap~}Jdi;ih1G$(Kb@GHkB}=uU$Cj@VqW1`Qxbt=M;N2)EC-_32;y{PK5mfk?vqJptfrw2V|GBaVMfXd*BYY z%$ew2%J%#@SpHRD5bkWH967lc{1E|?J$6R|`$j}#GN7O=-oF=5nTy9rAqiSDx;KMC zfjo4;7LbNOV_YUx55zfT?I5e*GmeRt_QL4gG+fPzSGNR_of=pTJ0}9Dc}WNun^7wX z&r}8GNoSg-mrsMmg^gH4k6`>@@k*k)VX3j~Jh{A-_jUVPE&#)lMnzc!*f}BJ)edqa zHH944XNZ~@7(dvyg@_C_5&A-NMCg8Jk8`51$HA@`N8}V0?^7X#H*F$_Z+MQ=2i?UPVJ$&{ zQ9yTA3amRJ%~eidhBT!(XGSPKSoS`3Vv8)Gg~K^o|f`4J6t1G6mBS_tKLgi9Ot9c4iYydRr2IQf(3AFSnu^5#|9n zHQWQ=kG4GlfOnFq3N@!MbGUK{V>2&dYKWJx08|(PJ7ZV*EjN@p0ByL;w8e<2xCg8l z5i_WrL`kIe(E-oeaU%1wK30{G$CEWO(IPL|Vy`XJv>CnF+z}}u^CJiE1#%R18(1fz7K z9Q-0=X==uEZ>$2q07B>$T%Q465hcJHwM}#$!6siR#IK-)qzc#HhGe0*M!7gTQQQVKbL7Jo5 zOH71e#TJp(%owN158 z7m2mvU{oC~>7ZK%?GY<=Z0?dPige8~>>aEQxB$adR%Y*cJ4{wvrX5;dWk%`ca{yvr zkn95Ro*Ek~AhsysHjtNs9Yuss$yXwkqVtf18wFON3JYn`x@mLK%|n}8hT`57T;N}< zw%4F)#xAKS$Qe7x0X4)Qqt?D|MR$eBZ34C{EIK9(*}2oxD6 zMi*GBU2sFUgyh%=Ucq3qSg_9EB`gJArQ|+o5#GsDt#Jfa_@|U768Ab{d?w`%3;7Ln z#}26%S%*jJhX9ZppKZaVOD;HJbf(Cd3ZN#Ws@RM6#5R&${?B3Z>M*H(7+b1;gTG{m z!gw*-#ESf%-NrXoV)6g8+nC%Vkk8V@Fixf4psW5OQKv8%7ibHLW!ZxStTFA>Vkhe( zwTM(Y>^L($7>0YX^781Ey!?jQBJ}iD8olnpyqg@Tp<)xq0vZ^V8slaL0 z8R>vVPL5_cGCM^3Q?ogWwL*cH7vqSVBHXSZ+f(AselL-UEhc*(E1Td+^mK-e&dO#x z`hSa^EifjOjHb5LmY45xvh`GLRQ8uxS)5q)Y@m@}wEEjt9Rlz6u2hDu*|`)SB4#0n zAG;zwX_xOvw?GiI;S33e6p|BN4+8@WBy5%}JWPpZ>|%5(AJXumbq(`}`>wl1qbplG zLH0OWz+x&|VUeo~w2Zi{(tjHV4`!*#o9`bZ5`KZ}ZkeDh8MVkUE{Ke2L1UQ@#Eln-3 zn2^7s1_(3YsbunY*@ZiXSwd?WI#cXh^tHIsiC*Hzog$g2$f3sWuWI420j-@Ve8h12yxT|P~wOmf|!1a`*+lq4~G*fTOQ4ia+CaE785!0e&HITN^fLtt9>FKM&gUd~f+9@8VREC#NEn6&k^Cg>Gzp)@gvg~Nr3Z}J z%WI^KcqoY-s4}dHajI0@D^Xmla zTSbnPic2>XP(gwZ?>C4`+{ID|4wMU~=Vzu%V5;)$XlOq2rA1FO>2(gWs>Mox;}mDW zA=@nQ2cMl}oS!1#6ru&~Xt$GoU<@n8m3WlR0$>pRVlt&F7*2YcpWE!*cuyi9kIV2Al=!_;;Y@C7ML9CoK`2{B1*W9(iXiFgjQdwP-dOWeE< zggx#z4-ZzANR(s}y+nmV_%jU&F+Gu`R?sO0H=V5!U$3|_tOeE#U1=As05KjnW$+@l z_D3Xm&22S&Xo9E1^iK~E1Tm!U<|ozU6|A3Y9&C5W2}UwWly5=>E(Df#9C#cKJ3_LQkHgLmq8N--ZVDs`unuX6P;Y`m|1g69f+!)C@Vnim66GxDLT5^okcm%d_ir$o#cC@6fWhg9pRzywMV_MK1G&8B@(kWWY%v68z%oEl>$VA)ruxAIoJG>*a;uEQY3B6iH2j}8!wSA69ccmn7kM*~ ze{Uk0%+6dgtto_1(;kAO)DO7j2oY^9)F;j&d8-z0BS<6wiq`_DspyA$Ea>DXxv$(P zu)^KqS`$~$6sJ4fQ6eo&x}JB2k*@Or>mA{v(yQQ3H$?>D#m$&mT49Dd zYqB|n(iFo;y+9g(;IJW>5#(j(@OgUyKRe1(OO!x{(jkD}^)ol&jY<;kgNh{AlhnVh zR5zdkp{{Ep@zx{FR3I~Z*zO=`4j+s~I@Dt-LLnQGBMlekk8w06Qjv-+gHh%C#f3gkvr+v3;yEp7Wx!1Wpet#K7K8lDgvda{bm#*PjN%CYJFYTYhdD zYJ6zpW2=schQ~%lbt}X=Dq-0=7qeVdcAvFiHnH94Rl3`TM$#>oY>i%PAVc zkzMuSB=vqSBiRty#@&uM8!{Z$pNaCWZLlYg2r@C#2G0}gZ{8_pwvsH8$$TC^qMLoy z^T|MpF&HtKAdI>Tc)w4BpL0iZ;VX#CR0N4Nrvma|9Eq;rkjA^#OpI=9DrLqUBfSuL z!&oX@cDp^fIyh8ev#2jEs~X*#69jyHO+}@U*JWigDArWUD;GtbIC}3%vj%qRHbDHs zVlnDs%4nAAKR^nli@>hA5r9QJ8G!&+GD^|~MJ&G5+5PlITlhleTvd+bx^taxF*_jZ zB#06+pPJg-LoU19QAj`)-4tSk6P`vWLQV(DNetwH3_Uz5F@T37j)y~C7sJ@1AJIne zgLrc2sP1mDsS)5PXs;(-=;to z@@eFrSBu|h~9n-UG=!joeIms7@qAeJjUVEsA0_MW4j{K3$v<(D&K&bU@BS!ohWv|o4DJoxomXjmN^eE!m)})CI=L7XFN{wCQo*eP_en%sGMI& zHtVX&6qihg9Z~v3`VR)8NptuV8F1ivK?E|WgOpRt_`yxxbj8I@?k(s}Au4&K4I-HCkAb(Uy0xe#A~O*~^24wCZ%D{Q zSJ{f^yO?JzzY(PH>@Uxe^H6{&dSp*!ff9r1Y!8?Nw^0?~I1g+NB@^dqL_&@3TSpq) z`&vkgRoWd|y*FMqgSuyTY6=K+&11JlJ6!FF5o0F8|T*oY+Y|BT9f;c!Y8$DwEjWVDm|0QpSnC=@zo zlEW(j*jlSy^yzI~YTJEEJ{KBCn%R|vTnqm5iSV*sT*OAIM@$3Dg*}M022-cnEr5^& zq4OZ)Vk1yPL&%WYZG3^8{7xjIFHWE!X@HBk0biTE6LrL7pmG*t4APy~3#pRr!4d=w zcRlcm^AgiZ!s|xLQW~j7Y!EGGpxt5Wm5X{1o#4RMh7Mv->L~_D#t%$L>E;C@s>~W=#bQWVGu0>+xK2$nVu}c$M2U$2N;8F& zaPm@YL=}JWi$PISlH-i2rY#coYYOX`HIC!IX=cS-S`uXj? zJS4=T`bGr-9`YI_652!plEGxAG1Lpx)XOVn-4a2Q)(M3@goUL`P7u52LQ_$Cf~t(! z-yVSosxang$-THF_)w=Xf3#GO6pHax$F>dSNaEG#fcQGujy^mTRD5Sa4Fu-g0h52q z<;3F~7Wn5oj_jX89x7XhXmLn_yVRuANIqp39GYehtvgIN|2##uXN8HW?8-|(y6_9h0k$zEbP%z4>x^kpr#@h2_sK;DXA4MK&(NqYEO%bcXn&6-b zUHdHEGrrdN8&XFXIa3P+b8vTY>Ah8iDmf&$t2vVo@8ecs&(* z8_z{>yH#13rrq5V@+K`3;nqRBRYdfGzYHvZx-LdVoGjPV7=JTlN%X-ho(tiSj9qDx zv?_7D6r$LulBmlU3ez+0#P`Shx~ZHM*nNo}cUiSp%}y{9uJG2$x-X|m>>#@L;k-nv zsj%ADO)j8-{LwT^iEg10CYW3!SO&Bs#A7Gx+j-;_FsWom%@y$##o{8(k zBSz4Z92m7U+V>)P2Z)GVX3!mE;wTL6KNS1pKjkGL-&Ln@RYfm%M_!sJ3rTr;0j$9a zB6S-cj1FFG40s+eL?xg5YG@6`H<*LkSI)~#qGYvoF}63izTE*yE8P8aT0pjhaUK=@ zV%cSd6$q~@@M6+TGD%xK$~RH^1&dJvL-GbWS-UMAK^PnWhpanDjRQ3;P0QISj@79} z(y|(~wwS-J>;t|4X$G&%==L$T3pG2=H6S@8hMs&}T_{L(P(Ae&RWZ7YIGYWVT8(NHz0+U2C#dx?97?5D^z<6 z`+>*8`QmD>fnrW~*q!8h0FGEYZaOgum4g6p)pavIkmKwB4S?SU z7vD;S+Zr!m9}w)o?(ZlTf(MNWjIh-IUPm#c=KrhLM^IdiexN;l1cZcG&;!NtPQmV6 zQe>b`SR`K5o_miFez%tl>#?yRIBe(8={`sxm0)UA(+MHeDD#T22%13EaUV!qWZ%f$ zUngTCJPXZx#feN~*E zN{sH-G1d*3S8xWs!nYk%2uYEO(BVmhA_|G`3^n(?xW>dO8d_i<06aQtYagUhOVXH> zvXSca3Fq{Z2p4An-rhIQ@>X6<32FYbP$g|xYOsn$sJQP$T1|Rxk|m+gDB+0aNL>?i z-q*KfH0BQOaBtaBX9 zB|Qh3e^FJr=)>jF)1CIvcB*W8wq<8Q{!^~E?|hTG#8PYE=!wo{Dp5`=N+&V;&e-J; zonT=u%~`@Hh*t!uxhy4uJqaN|$oQe;ELtS;M>rI^keC%E=q@Ob-wA+-a3J%r0CJ1DIH*X`At%x{&P-;{X`G@X znAmT41u)%7t)vgKpdgJnOl2RzHk>{2jRr~GgCskW?M{8QAtbYrg`*;lLpl;~kWAaT zJo!wWtk@cKEa}-;$CN_d#nCY`_ArJzIKp%p`8gKRKyK*X9YCWdwc40Q)$a_XapkN8 zhQ>bP#FHFNKUF$OuLgm@HthaNl{cl8BL9U#)woh~;XQ0dN@}W5h1DS=S-v!-ISa`f z5ngp!afp`c^ood?DFRN5jN^j184m}}vk)GaMR6jHNr%+aW$qU1uNz{`D?v{;?Rn?e!63%z0yX+1Q`A!@pq0wnktb`>OoT z8~#%=@!qhHOGG5FI$UCnRy^0vVTkYq{Q<4Z%yi99mYR^%CWUVJEv?+7f`E{;Wac}d z04aAwN4Tuo8FD})H(NtcSoo|8Puz70Lz?FsamNfIM@*{Z?oDz>x>cnZ08%Uh5~nf= zoh0Mg5HjLLUdo0m;;=K&J)hWaq&`;EYQq2zAwqRO`f8z*5{3 z9G;t}4qkViTc#oF*`=gPOoLHU300X~*A={=O&KWqh>obFGcK(LNVpmv4}0(ya=+Eu zt3gikP(@Lwxw1ImV}=2c_Jc{jAX>vb13bj-+rVChnPhsws7zsd`l*`G;>fjnQ{_zg(y|^ z;D%OufD6SEPPa@isH^2ONEjtup&-m0QjU7q&NYZ~9e92%3)g5HygA6QMLoxWa;jWb zMjgfsl`xdj!27dvXoi|E!j+PyQhpJZmWOo>sqpqPNy!Wkkq6h?_IlG&ZT$C-D`-MM zOI}B}ufRUJe_3o0mVqva$E@hbLm=g%8TV25W+mM{HOVWPbt|wEjB8+KI3haSyfM1y z%*Y~}f?eF*2Lsepl^&uubK=~mD+{eb6v~4O=h2JacJEkHI{nQ}RO%-|C%QmC*&ZW& zXKx;xwgHKvC|dhKwfGG4N~P=0nGZyh48n4e&cR{CAk$zZ8Uq8u)aQ0|5}+*!P|(}k zI{K@;4#DtNN}(M?ma18Hrn~U@Mcl?2y0^n3>j&|u@GxSDg=R`ipG^vggd@;154s4h zkRBEsgh)1ViIdw{bOILiKunq+jub*JPn*hK9rZ7zN(pAH#+OjjBy7&Ay)65?jjAr3 z0dA_mfpId_YaH$$qG~hLp{ptr3KtJ^up_lBKdO?33^}C9=)qocg!Lz7Bs?CPhBhX> zDlucV0G=rx`88icI)(uQq781RQ8yZc1*V!@^^8SH8AxM7%ja=NCeRraA>OP|94T&~$fP2-1XVmj`F;J^>GZd#liY!@?elYa^qXq%>B$70|AD=WPPnLN zAf!;zD?oVuSQrX)PJ%WT(p9)Phi+;$Av}t+DY(YfRTLP|zGr;*0qtYk_3SvHV`6mo zP64{4y6k||da)hIw+%-}ek{n>R)l9G<<9kA*^JZ!)&}*eGBT~zKUIzfcTu%WiG6*T zi(VfEW?W2YAVlW99#jo|t4;sDPwti!)9=o}R}Sq?abGcdHRbK$r$|QCp^Asn>N$hK zx9mnM@<|NwRD6&|o)HUk(YHZCZn6{r2qt!?7$T^$rHRX~E`>%kWTspJbS0wU@^_tg zK##>`s9dFO{rV>QR0e^RGr}a4(9kw)9zZf66<0@p~4gI-(Sv#TLX2VYTvucAP+#Rc3Sb(dI*;^d!dNJV?l9-Fz z$yuExtFjiSUJ;?7<9f0sc5YO((4hs95aAbtC6JXso4O>I48P)%bU}AsI|k)J8^03~ zS0q&s=ml)G55cDM0qk54L7?onh(PjzsXJx%@SPqqeJpF|`Qd6_HA=u3!qkAjj*2+7 z))*UTFtuq5rG^V4^dQB!?sUZkb#%su7pDrM2uctz2}zH*4@lgjC7SsLBPavsk=_wZ zNaK%A(F%yWBxt!XugX%JSb&XV)xEUR8hmx7u1;?aW;BD(lJRi2jC zl@AlbY=c(M+R^~hDiH|FTz;-Ny&|VbBr={<(`UQ{p^{{cj8Spvh0?uc8^nxZ%V0BS zcMgiL#VqcBd4_J?`IyCAw4qyB_4I^TA2E6U7dM(HL_tODlE>ZIi7_WTOe0A}HXR_S z!GeEAAWuC`BoYWZC7s~s@nUN&bX9hY= zMa*0ZuH9k%f82cue3iu&@62~^!VPQKG_qd8mXL)&Si>TLgng3)1OXu=Aqj*8auXIs z0YM9j3I$T6RzD+P>G{yUNLT z=FFTqvzkD+Os~)`GH7DcvN_H%Eg^w|y&4p7UookwuGEbU*m) zM9mY{41c?sB+j+>oMX37h2lh+Qb%WZtWMljtJ{y&WmMcA**29E|HZaIQ~u4p1M< z;~_8hqxZtFw-+CJrmBU4AT>wXYATG`BSLwheg$+rJ>CyO4BG6a^}#+iJzN-W9K1xX zc`D_B4XRw5fw@;u!b9`ikQ)Beiem`Z14NtEvPZABsY3c5lQhvh^I6)^T$Y$8Ib4k| ztN`89kMQ`TgoZ`KwF{w+IWrW!@;J=SL04@E7Y986Zf|fY4!(9mhct1T>6P%j zbg3yvENu)e*@`}FP+`Z$6P<=bvWu6x zBt+F|@?;9aOa&;4aji2?ox*bGDFxPjGjA!PtXChyT&3XINn}eL5f)LHuug1shebIk zTeSd%$wg35Scr41SnWoOE7#T(mg;D$4^qy}oi2aJOIJa5_J{&@dharhMyrkV`i5TG z&4_nfNQV{`7E~3{&A#q#BAkutDsXyJzg@5dCv&L^p)2B}2rCM3n2~!BrFBg2j29)) z$Aohu8(DEg&qNzD_?9xf?%^D!aq1l9sl7FcHo%QjTfID0iagon6t?XElN^R*pC3>f zlcuCDH#y*bs)*R(=L9n+7--b4dxh9~)~Q;Y;C z@?aMuy$5l!&#O}?0Y)S7bu(0ib?!R|*Wz_-II!~ua_JyE&e7kl4w8J*(az%dNm<5wEe(o%!Ngmz!L7JSuE-3(ow3lNM{YO)f~xU0Qh`u+pdaM#5J zFt$m~klH$?L)JYi3)K|T)1V7$=&naIisk{Yy6D3UB-Hh4$YCBfkoI*C9cU{O)sFO7C_gcpO!5n|Q5v2Hz>ONzXwAQkTryJDi_ z|2(}(uKK=`sk(wIO;*p)*u>hfad95*&8#k~uAvqGN<8R^)k0?~h*Ym($IGQ^KF65< z^m46|N>!(H*ihKJpcY!t8`QDcLWglKMTlrlVMRn@M9nsH;%BPPo4Q7_&gP6TW7XbZ zIg||q%TR&x8unzIe@{@;k_)FS}WcGw5jb7At z5~K6QJs-=F>SESagVhT5+^RJ)Pwpi}i2~yv z;KDN&nC+}wf#(xEdb6ko?|qy1u3c?0xD>{ddP|*G`MNkMH^u05ozd4qr`hV$zJjNF z5e_YxT1zjAbC#LzF6^%pqt5Gkee1%q=kHvT{H{F%VNoblAD}bE9X7{KepL5cZxj(s z)cUMWps948N{YQo(JDbYO$E_Wx72Tio>81U0zV7>{hOi&|XW*a8D2_k0(*=JDf#2>Rygn zP@{bm`W9|`3WZKGI=g?SS1 z)hWF&!BizSk}cJZe-xi*DMEx~pqpf+Lzm+byQHWr!W^liaYAzP8>)t|P>01IJ0nnk zt1+vG_sy`xoEo+8sde!$u|{vQF$tkCD1Ij|&abQNh{LYT(s`n*LIlSYbpV|7Ko>6y zM-fxkY1Yzc=tBM+LyjuC!&WVmD0`GV-*((<=%V;Cvk#nAcXNH!@91Nza%Cfb*S($3$_J zofb6M^m_XlUHQI6#}QT|qx2h?+F#QZnv1M0j|tK1p6%Nyf!(y=Hadx1PMv8tMB z_iv$gO_Gx%Y~(I59{JY&bW>x+0+KHlq;gRP82b4}B9U z!8!=<8P=jSU?}SfsUq_XWWzJbGcl!c_LESoo=VK!x@(h+Z8~D;SeUvtoU+G!Q zM;=@qv?r0Y1}-x75f>GkaAw6w_d>S2GY7=^9=X$jS4G1a)9g^R%}6ny22nE_k80fBLsGf zsI{OjT$0gS^_{Kd7**DUlDN0GV<2wzHzcEIoCsL@uxL$zgs;g*mW)0P?iF%&S@qnA zXN$0!?P+32TB6dHi8=#q^912}&3Y~qxcNv7vOQBI+4G(@YAZw`Y}9J80+v8+BN46?4NIc6j;OI}1JMzDyD#T6)yj!&*DN z^NxizyHcIEokVB)-)JkS4{Ye;;dK~C)E)7xiG8`YQF~-;P#=TU+ND^qMHi!br=qe@ zAuS4HRHo{QVyJ_0XKfq&x`nuUT*b|4IrYAk$5l7l77Ao1x*X4@2IY-I&_K^aqs`P_ z2c*qgK+Z_jE1}Zu+OjZWhplCi#(<_&qfE2)CJGy8-i-9B-BP_iX`PENdBsRdTAE(3<7ycdm04r687uu|E<0id*ll8Bb2MWR{Xtdb3Qkq- z%EDrP=FH5wk_xov&Bj$=I8cVWN^I@Lv(ttp5FX0uGzWWj5A}?i#VR>8Oj0RFA0L)Y z_8tXNsL-k|?HQgqD)o3sQ!CGKx_jGTVnN!1tirS+qeR&tO4Mg{W=E%Df>wt@$# z7^Ja|OUI-~;#{q@E+AeCR!5{n`p?H$M{M=QbV2Eg;2)iHgL#4<_WdHSi4Xs4P%f)r zt}vb!2`k&Fa!zC8J&39j@qPf+(D?Bd>X;PeJhOUazvAD&j)SA>xwUg0bwL%Iqi(5Ob;rSpFi5WbW(lb${Pbce)tj@8lX{e1tuGJ`QX zDg3FV@JpKPvO}9phyKedN-I_>l-oHw6{juCN=a1ZLT%UhON4=EBPNi_HSLa&jwj7V zm#>RYRwf-FaN;u}qYk=2`@;3{;`xoF%LD$Xck~O}*od>}Gqhx!qs+L3L3J z@6P4GDl5;c$m+KhBTPk(#cZ%7i6I;xE}^;*ZQDbTE*4kzur?>DZ_+B+sRZ_e1|~g9 z{D>|I>P?rf=Psae^s0hg%CKkCODZc%%8S!68DCXdR+L_{B$S1zlvQcimbJVLtDR{J zustcOPhV)EJ}CJG71klw8I&7V&g-rZ7usAne%FN)RIi;{ zLdU|WFH~piRWE6FN7+4v`cTs0eGx4IH9tEwXo1Stw`qD%<#Zt`ZTYLh!#DJ31hN2w z5!yLmx(9O&9Ok6!=o^BGYJH4GF$Ry zt(~T+)?>8U7TcKO3c5BJO$*0yd76*bhOp~aMP}R8;Z}Ua44+pxml^IfSg({WFWeqI za|&vEp+{LlmD#UX>CO{Qrt@@Ks_lt7N|-m!i35*!`}HY!Qx}8O9UC{}Z`0eV_U~@` zkrmBtFY31F4sia;qDK*0#Tfr}w@a)d~e| zwl(U1*ysr#s-S+mOdc~tW@+m)c~o*tx+6v^&SaoR3u?u{%hk}H7cgd7t|oz%%12Nh zwy-+m8f7N2T5b5h|yAcKx<`|q*kXd1GQqu;n zG0IiB(cEZVr~aI&MEl&6v&p;ON)%BwxciTg#HbLR6H1ogY%V%hkaZ>-^C|tz{G2M^ zI=x2AAyv8;s)J20><(9deWG}bY3IokPO3{4xpKfLq$gUSxeP;MfIg7 zlW9dLO21lChV9>=LFq(D=ya|w`NCC@ClslHNKXeRGMirBHwJVjh*m9l5^T#?l2`8@RxR}rPt9ZN-(X*jKshJiFT7#F8uUr@-k zsNyo{>K!P;l!NILt<{@q;3`RP?$()r|CzRCB#azXg%{x5s9E5tsSQs` z*K{&4T%L-H{vWk%ry+BT;hv8{gm4XN*5QpZ`c~`6ww{N1Zz#Ri-}pYGq7yjH#HM$GZ}Lu$!dvEw@I5>q(9=`hn-0` zdxSErgi=vlWXm5##^`LZj;ZvO9X+Q-#Rf~nagHu*lq5#TsItv1TfJq)@WT&~M1~3GG>9;3H*nw~8)IE5#xcc4HXl;`D{-C0VpH3e62o#cpU0f!&S&YV=>l zS^8E|Z_B+Z9sgymOk0)JU#;SzVqEVqJba~a0akLEQY1=B}24Ia%J3ILkmT})HVSPsM&M}p9 z;T3>lrlg>%*awN+^}(4kGuQgmlSr%;&aQW=JE9`Fr+=OPMn_?rbMA?34-3jtY_1H? z)rQL9)ZA|^hf{`*9Cm4)Uk=-=uHWB64u^%R^m^;Clbifif3Y|`sF~rSdzGVMJnAhL zhlLTt6pL;;=g$n&##FW7y-DE{|Dmd90+S&+zik2Ok9M4PIuOt z%d?#J$E>ir9@a9o#S}`aC$~bLt7M~=w!84_<>XR)(eljA$KHaYIxFgY$oP#&nyZ@+ zOB^nSQ0FZ!WN>Tvn=UkRSWCxDqb%*4fF{qKZa!SB@GRtuMYWO7yTT2Nxsi5&E--bg zwKjBdU?;aCM6WneH^t{cAUzIL;O+rTd>2#%iGV0xpZfp4#_m!6OLv0QDMI7E1g7_XMMpe?v_=_ zp!~Pfq($N*VmuT@W=uueRbHrwUC9jc4aanF$)qgAo1o}~p}Q-y=bK562=SFYH9N5n zZzRMu4cNiecM$zi-_BRx%zlKV6_n$EIQz3{Fc-A{{)yD?jX>V4MjYwj4b!L(cqu-8 zuuG>ur`RL1s}zPAZc(#ewUF+P;Zgz(uOffC2yAtp=kTe%$Rr@jP!aC~x02^K}BgV~#5> z(eoK&6Wr^tvTRAs625uCbEhk7mf5r2>O*gLq|Nye&alzK)uXCl8b$=@+o#{aeuFXx z^c!efcadECVwyTyY<WnUh49&>c*fCsukMO7vo&_GlFd{JT^JnfLDh|yZk>HRm{Qh)5DW8j3GHYQTPCyE z#ae@cTmu%S7g2hqEQI?&Iqi77IaJKIm{9kDPH0JRc6lkbpH?y8qg8XM9|^DQbt-Tr zu(wLo?KzmCH=s2%0B1)%o);8X7wE1emG*72IALwaBaS=3`IvKuXLFCrJcIhQu%6Ad z$9lw8oT-I1L}uG}q`-B=AB-w2jWbAzM6xlII?9J82I>x&N$L0&5i-lV0}|V)lGYnt z^iX{<=ip?vQBcMf4001N4V9aMd%1p^I&tV(ucvMi&&g=gFlF;nY+qzf?gD zk(7zopUXs1A-|(S(cFvFv2|z|Tb0x}rwz2$>>mAUJ; z?zv0Pt`V9G)Y+)!tUZfXbx&iXg{JpSBR!XPRe?Rb<#H|P3&WEuL!xrU)dfXq1vnEI z;n>IV+7DxUdwGh(*#Xp$+a21DfI{gxFJulpnn*B-Za({)59VqRv%X5biN~t76~8@k z?+NEhl1qA*Yj{FAry}wsYW~^DVs`HI8>u~6;Yy=7A3S+!5{mp$IT4X!UFqx_-PQAw zTv%p)*qJi-SSY+6XP@A~l`(Yljvm2L*A~5tHVvtsUOA#irfF&#Ug{eq8)#grlsRpp zz6o#L7Wljz>>4sIwbPV^-jjfCpFI1QYab6uGUxqhQxoQvp~n*WQ=c%KU4K~p8bE50 z!vrrhybjK>s+ywv*m`4SpKPys4bIF4$xNZ61RmI+z$&0^;x;T0CojV}7^#jLI)$uM zmt&V|92T6;2JL`-;q-t6Zl#V=*rpnDE6@``;S5|ogkotbHgzcVRBj^M72I>wY^52s z@o^3oFWl-xg$k+*E{Tov3)?}+VN=O$^&~nxm%fLjRLPz_B=bU~O8Msy9&k~;Zd4U72j&9x25 zTRSV=8S^dE6}6l$JXulMuo2kcRHtV+WSN}P7=*upsf}USIPOVc8W{AML+O4-t&!F9ma;@*kQ{)LF?jy_-Ez6a0 zV~pzh?Hf|g-=Z5ZV}J!gHue{AU!WsKZ$KAesh$B-?NOEmDAq{3M~64v8YU4qT`+dx zmkzcztS6vbpIp|C>hL`C57UUR*)imJ#qz#Bo-t30GTW@Ylfa&zp3XxMn(o%!GcYqe z@OUOP_N2no5q&VtH9!RWotve0cMVl32 zK^vBi?2&m>CQi?{(_*B#kQCG}Mm_R>$1*SvL+Qbs65~PySBW*M@LLstv(+Ii`x{!3 zre#ka6PEi%pl_R$@F%)$$(*(jtuFodl9FufcUMNb91?yQ|)4q$2@-`78$F~r^0Y%{LB>qdnUtoJMDL!vg`0omzWaPMz zoY#T=pXa zz9L22NRAm}rZZ+J15^d8B3lbfY;MQ!38@H9%64VTm4mxxF`W5}dd*gQ?!uhUP;w-7 z$Nm>GS&Pj@DC|PJC!$SR(1eAyJ=u&k#<~e@Fa0{1plwvOXy%%$(A!tkzMWj!dZOnj zJOs1BMtRdaOguh#pNTppYqn$-6;u~2D6615(eYMvsCZ)8f-1c9j9Z;B$*N{$qaNk) zZsDX|XL_nUs_$|Pr{U9)DQr^ie=Aft39McwkK0@rE1KvSeIf*HC@r8*7T?&w1^tMgmyXG@4nC|Y&q@Is_)hnqciNkEQB)w zmx|ZGDc?;}s8-{rQ-r}1T6!^MIi<^!S(=7=Oz%l2M@_Li{C7yVW`hw{^z=t-*mi=Q z4}NHd4`I3Fsy{0{YgM{RsFq7((DB99e3ojedeNn_szD9j!-f@QB%egpvPnzo>uD}P z6?o6;)vr5ruNGAw)Tupi#6n&4v@+fHljVHr_RUs@SC5&k<#lQr7iZ%K3Ph)?Xg3^(&?5TB!~L%Bfm)eT8c=qunlCA4P<4@A&q%Vbgl+(?`50R-ZzOs*#Lx zL~{QV%IQ41i1(#X&KiCDT{{7jF|Ou+!D@{&&dngYUc2DzJD-kI+i!zp%;;rUZ=G|A zh#pcNr`)@GsEx{E4AuF=;0HOXy9hR^gx z@iHme!Wr98uGra9)r{>0B+U%__(s`#bSXluplu!+w+#=~sF6m^Ae`<_fbEGAtUcm_ zQ0>L0HuT;AZ~EzUx#4NEs_)2@lVT@A!yx?8S(CatFL`vB>C|}crQwSbY@zDA9K`l? z-pguqjP)@KyJHhAk?QEw`I&8c=2pGKQ*2)5p}#nGR!vW2Ha1UV6tAr2 z{r6}{w4;NYNkM2ay4Hh(X+z9OG|vA7{x)3rd|ZA zAslV+GokV;M^Pe(tGUQQNgd9eAFnd!1I)5V#5>}&pThH;h+>Aa;>W(!jWt6avYcHJ6SolPPWr3$NzFc%w30m6SMb`s8`}xq10{iFoW@9ieda z83LNeDe!4_OVS=-$}oNn6|aVrSE^^jlyWQ%W-B`>n3pqwvQV1?p`yjpD)EZ9{rEB| zcamu-EvwAVTNSD<#+{nQ)sAf0lXIp`8J9C}?378lSjS>%+#NvF1bG7mFO3Klq?;$} ziX@oDZ$n4M<;YiDu{hiLXirMC9b8FL2%=?S7*hVlszMN^1NxeQ>VD9mMJk$33z;>buGrzPgfNuB@RjS zJi|k41X}p?r8S|_B$^+G7<5Wl&8(;%9_ckpiFnUu5`}@1E-0TyV%u+n)+zV&yxe(8 zqKQ*RWl!W3IBg>u$Eb;l&L%hv?=1s!l0$vh%a&jT|>QXWZm5^Je5u%NsXkvLkIU7%e75qkd7v zkIs?9P~j^PyF~IeqN4Mm$7jncf~CdfOY_mi>iD!`D6Xo);5%`udX3$5%d3LX;tejT zL9dKsRdvi7s0VcxQooBFqPlA`J_uET=LT@5t03o?HNW}GDoA(Q%Fr?1G&YRhw6a;K z&cNfpj=6|v#gfJOPg=*rflWEsFWF0%;*L_?1)CJW*uYe4QE_28wn5V~D4tgh!Em;z zJ7FX|YF!b+Q>n{~bz~v^xETpiM;NySqkP*Vdxh5Ewnln zu2!CK{4jSJp2X1clh!px0X&AFvGDY-W2ul~P>v(ybPo{q7u3;{;SgpZP@DAjUZx4m z#!NLbBGg-xdoSrroe%P*vT7Bbz|v%Oe~*`HlFo$|43c$-!l^EWf}kQKJSt1yv zTARUldhtq_T^RNxhxb0j3!N2pK%VZ0t23O zZT{MsK-^T~aVvXGRk^!Fj3LfBPnYIGCj6lS2q}}8W6^V=+>+RV`X6l}*kX_oK~4{O84+ohA3NzHC1I) zZ#<%zY|C8MVM%ccy!6JbQM@We~v}#ZxcCFyD=o;SVZ3HhPmAe^8OT%RGEE zqQ^R>+^Y+!V0i_LaPK_LZLFgFr`FfS$mtmxOwArOA$v@2-n{%N^F~dXI?L$}qjpT^ z>6XH|*pLVA~QuKI8=Mjg1`RclUr4r4e!aA?pXqgd;@rEa0?(F|SICZ9a^ zYorWbBbEv%Tol*JL5S>>stBn(wy&q2B!)+*#sf-u8GTGu+B~#P{Q{b#eg@lKOR??u z=*6F(J#9>G{=A%VF01X^6uiUdKU3rmKfAD1z0N7Cf^v^qL}6j5&O2f7CS(^LOmLrI zyW_!&vQYK{yntR)T}&N-zF>gckc!I*-nCV{0k-RD*e9?WhmF3HeqcPzF zutfBRO4iy>hcrZ_(Zn8IJ=r(On*8$K6{G_jtyabFq}3(b$W>%2`z%7++4kv0q)sW`-zla3gK>Ll0;QEfno3Zs*vV z4iKdeqz-nPj@dAC-}z?BZrsA)iemf^JF|v|qEu4!p19Kl?K0%~*X3%fj-Gxls>J;# zG4-u(-Og z)HV4H86Yy22+{n@=xL0lFp&|RVyBaDE^T$C$UWz5lyAr_6d2TBb2V?67p@0GF1*De z9{RbsnWkXtFyr7n%1wq;^!`xu(e2L+!b7Ta)N!d8T`;2Ykg7K8Ty+KV$m~3s;s{C0 z1ANa6zef)?DBqDaW#ww*gj$Osu~s~x;&RyGC{|N@&#yQ*e4Y+xa_EA!M>;j0Y}8I= z(gb1usOR2jq~$6TSNiZ4987BWP&ax>P+$0evoxY+NL{6Y$Ji82&DAn9^ra|msp6qH$=p`tX!>ROJ0+BBFhy%}0p)zQt?T@PI~ z+5H(cg?5HqxM`#lVY+!$p~t{Lg&A0vW}%y?P`kcG{f=tSg?0BAu5F@nC2bNtv(y0H zEL>ru*93Y9QJ0r((m2V}8(h%P$5a&*!A>lyEDlxltTuL9o%uu)98R~w-A@4*IQ3NJ zSoGwbR>9Kh>ZPHq-n~okqC^cI)2v+5yM!Y$f679kn&MFJKK%v_q?wq?3iJp_vtdPD zkBKH&jTh9>$MnP=276scO$Z>+0uEOdgj_3%ds2VPH;dUqrH2h4sFp`|>}nx;;Ho=u~ZcqZt)Wc){t-ui?%-{~yjW$&?c52=n6^WJAd3Spar&%_rNVaC8l* zoC`5#q^UYL7n*vAWa64;HeIrc7K#AYFEwDrTW^afuPQDmS_K1;CZ~g;vL&?iKr^US z)o9z;EGkY5c^Pm_kC}`b*uN{tb|(}ITSx~C zspVw_oLL16DzToe>MvEwI5(*)bL$aRC8O%BNDipXU}EMp^&(+`QCT$Chj&(SK?%uF zqF*C3t~56C<$^cpv{WQYH$^q)+lBrO(_M4j9gZoxSrKF`RmF05KM>gGBO(C zzo5Rg85OQvBlNY-(>!gC;6`&c9m1U(qNzz=+5EqSjz%^{QMY8yv7TXlo9fgwC>vBT zyWCI@b&W*5RT+C;b+0rase&LEKJSWStxVOeprqKYn(2j5`qjncAzWiCb*jre)y@Fc z$qwq|huiots+gk>-$thwm(T!_GZeF);83Op7Nu|nEt~pWZ?(j_Hq#76s0RCps<4}f zree&xBk_WN+H64eSx-T;NlF)Lm1DG(irO5a$CS~Cv&et1V7?t*hte!Cy`mO1bqDEc z26i~xGNLZiKKew~cUV*7B~0|5b{~_jBG0a{SN8R!l4r2z+%_6LCepTK$`=tg?E6{8 zxj{B;dSk9Z?sloK>JLq+$g&qRu+GhGmurVwi72X^Sb#kp%3RaUN0bgcG7=Po;XW!`8h{ov$|~QKYq}kWf*0Z!{$;Tm;9M)V-`d?*vm9 zGkY|RZfCYlgQZlRbhUkfAvOTfw`z3eT1JgsV+JjD;IJk*Rdr8xp#a%EZ*thaC8lM>nnUG7FPh1kb0^fpLjEk5=T17RAg04MSx>s zj?skcyKl9G=-sO^x+JK%RaIprrPaZ{8GQzu4L{>53e$r$xymHEY!Z4NYjQ9MIMl>4 zY#^b1=NQ7!92)wyY!om4Xi93(WEBphVxbz8L`_Oe9zqeXs;uGF3+krOi+~3fT&XWb z_f}ZE6k|Zzt3iR%j0n2KzKpQ?9A(NqE|q&bJE?dqz; z#*Kv-nKyo<6jIQyDgG@-DWvz$7}$3pxx|R2fUj2w(e+v(##Rb(n!Z&B6(S#l-WB5D zui!R4Pn^C_if1zMJ+i!V0ca1rCq+E|b{#W)Tn>5GKePjR`R+&J;#$CA7b1^^13sU| zza{whGLU`nREd8+;QR4+CH{Vlf8_5l{vn8Hf`1+HZ#n+`8vjc1kLUsXqi|F8Uj)Z* zUjor6WMk11u#-r|R~}%jn9D9z3~zu-d$Emu{!~1Q@89zGC+xF}q_F)NW-+`$ri$j` z$Ff$&iud8tO8iTHD#wV%h&EQVvRaCZ#7wKiiWTduO;$T`w{;)Bzp}ozhA`)LqO zwnrcpY3UcZ&uXEmm7unlt5Jw~Vmn|baTi=ViI*9^#_&zRO!*g36GcK?v$#YthT(j` zR^r;YPm#JEag@e;8U7A1R{SN7(%!gnt!yRQH6}lU_&Xclv0_DIqTUOa=He(|Z#e=L z3^k+)m1%Jk^0ThVqmVhKDdkCPhSQt26pxEX&~(~~X3aj2X)HQ7qjaSdj{YClD^iI+u5y2hKUTT7+wb$E8b{L{$txvt;lFY zWjY)%R%~m-c`j<@O}b6J)`rsZZX4or3NTi@)t1734cJ^fcM;|P%Yd!K7Z-gh8_Dd8 zsU6L}m?T-ua3#YvfUU%yi%HtwUrZbtC6J#E40|SICbSY`6Nq}a8&Ut#gW&!oO7GcJ zUs|l_mP- z5`hYWi4~NeLjhw&ZbeH{K4NzQL8Woy#cvayPKaU52Tl1dXfeWq7P6qK&H(E#8i@|@ zA1}UQpG`D&(IrnOv=J>tI@6MX#UNBau?Kh#Fab#hGwpI?qVKezq*95WHBEa zI9|NYSejVC*vE`zibd?RQ9JTENK|ort=c`Ea1c^n&9rWyO%>VDZ)*`>|8^x-j2MIZ zLp(=wxUpgf@-1G>M7S6+5#0#UN|-i9JfPCYw0!X(({5qf0&$ROcQMaJ;xWb^WS>>y z2;vjsh{k>e`QpWKg!@8Pi{G)&kC|32evjCN_y(A?YQ!7tvrT(S(O!`wDO@+k_KE3| zBWm;$1$fCOYGBk64kt|y? zwhTU>w9+)TN@Eu@&0y^ryGheJGqyuxT^YMeV?7yrNMk9CJ*KhVjJ=?-Ov{JdeFIpG zNRtB@`#WQqaxi1fVLrr&0WyoRUW^Tr!x$UISeCq$u>!`1%528gF*Zu(GWIjZ#>p{^ zy~fxCIgYW<7@H&~FxH|I#Wz(>Vyrh~d2$M4qZ!MWQyH7f*yS>hu`0&q%jt~W!q@_N zIb-)QRwQRJ_8Z2Ezks4~%V>%NhHMv0Ay3vGzfVVW+%`u^h&JC|5JKim@NbHH_6Vc86TY*v}c;BiA!_ zl(8Sn>lyokvAg8=7)$IzG3=F_7#qddKDn8(YR2}d|H!}9Typyr}7<)n9#n{V?{Zih|*h$7-miM4J z1iG%dq@@_ztzSDSa=Q%zEb2BC@Y-%80C#rFX%`!NWB0!WW~}{w_d)Gutlh=%Uci>( zvFtrUb}3cul4#-2cM`(>D#fT z*qQQXAXY3*&4Qh{g5kBPe}l_G{(gqPf63oRlHTnYD~_g;oF`Jh=qLqIrT94YpZNYP z^$24 zk7j%X|Hm>YKi>gtDS~}Ig`XjPJ_j7%=Nw|3-*0$gthl4kNWl9UR`nZ)@2By7+1joB zC@1e`_$b383}0jTA;Yg3w&_nklNe?(%x72*c#*h{;ch@Fss>Q0ts6k!TNwUmz{o`8 z6@S0Vex4dY`TR@38EZdd_kS~NHjvWQX&|K~Z6K$G;p~A_GglA%ymQ{#g26;xJa{{- zrEytr2J+VK$jXYzTl)}TOI_}Vvz`I;lnLA`TmqwcW6hqeU#_0aZ!9}MjdcxGrCpnq6jz&69O0J{wv z3D|GgM8KS3GXV34%>yiAKh^AK!?04gY-hN481XqUtP1cje;*%4JmbbwDRdsc<`O9e zGn_g;2Q74LTgv~6wtog(&G44CRF`(Qr5ae!mO{P6E)TIw_X*^G%!IV=Qv7@ZQyJz> zB=;2z?_l^FhRVHgl0&_fzm=b-_*?n>lE0sxLOefUSUi=!Zw55lrrBlR^qR4@J;QXs z%hnFNjB4W;hBFwJGrX4JW`;jx_%Op?GyIgHe;S2t&9FPe(F}_K^VY5aY$-NPqq?_q z8r7Viv&*x9QoK3MpVC_VX30{moq#xkiHl3_qxloVtisV zfA3`YGlnlP{1a1;j3)nIu#0~teJ3&;#&GJ)%#_R4E||Hi14eZ-2c^V{Tj3rncFZJA zawmTu;O{3GKF=^dgL3{TQ%ORMduEdEIt4yH(RkLd6zKMhb%66`-2k|H7Wu!8;lWu{ zm)-(2`TX`3lw)5pymPe*9Dcd$ z_HI70V!;>P{Nfh4v=)yo__TATIK1GFR4IxVE@ST5Hbdi^R>v32CNwl`pi?XRKYu za224BdmNuQl0s$oCx&NIa@zUCxs)xPeBxM2NoSupx^NSGDwl&vTk*Xt>5Gm&@%x3f z_>RvQp6C;wF8m?Bi!$~wbuYuJ?mm%MM7#pSw#wfy>h+ zBO&>%$Y-C}!SHwqegA~NpC}|M^+!IjmUCuG$zM^9)Q3`B>(Ca`OI!A)Z%XyV(zf`f z`sNcAr9JU|b6=85Nq%?V6u4~aLt(Eim1#av#nf9$)4Kb_{iWj&S7BeGKF2PkX?@&F z`oynGsT8J^JOh{hWos_+iOFT3!(~a?b>O+8jO4t&>=u0A#_kW45zki`E=!{CFUyFt zT=ar1gOcs;zC=}=m26~t7|9j2f2QN7O(vC{^3yG|eFo%VYVo2>d@ow`H>7t<<`8_Z z&m=ilEF#&I3>z0wZtPq%2~<^Q)c1i!)8O*tB1ghqB^7WvzNiXN$)MoMQB<;GG4W}# z_-0TQXZ2k=irh1D2&&X6|9AJLP?1!(yYhe8;@uo0`CqtrKfYHi?vC#l7E>yIx0obU zsr$=fO6eQ96xZjADWxy-_p+pC5$d9Ha#6Z&SrTzG-+ux1x1))VaUtq+V~J0w{A*Bm zaO%ES?(0K!nE3pVxxG1!TIHscK%Y~vy@j|TA%W*8{IHr8);&&&1RHCM@!)pGj);qV znHX&!Ry5JM>ke=|u4#p>0bhtN4xFA^f5ZV_O5sU4MLuUj!Me4UFx2AFx!7 z&0uV$@+nHXJ`CDsjos4q;3YBQcJ1@2u1{amNW9&ZVyF%LQ~c$UfSA}_VaK`-wgO^~ z#@_FmV8w}2##H*^#MGYTvt`2XyY2GFiJ6S83%t{NQDK0B}WMb}UW{SeT2U<($AcbuKt(DlXvD-kytfj{80}VEu#-8kv?QboPGp1@m zYjH|rRMM@X(~0L1LA9W@NKGZIR=m{X^LA~-2O7JiXKee6#P&3zskC1#ZdX{~`krm& z#bTevcJ#~?3E}~b-Q6?MN)S(I?BSjp#3kY|W3}Shp55ACB0iw0GR?C+#s!Q8nkQY> zzP)JLTVXfLS-^4>CORjTx9=c2WH3z(1BRhI|Bl2ICOyy|Lu-v)mGpS~&KNroN>Zm; zUBojw-0exPwC^gm_c1h#*2L|M)r!KTciZ<6rG1H3E3QiVtbMYG$NGs7TgC9?<{kQo zQyQyI?$u#{7|~zR?o6KCVW>FAn2K+>XfuFls)mdZIgH&9=+J9}7$J5twodfwRncLD zc#&6jK9rP(Y!Mhl;XagaLexBSMUb%@0w;R?q(iPqVr-o_1)jO$ zR2KPMCpxE8bQlc_oiG){7;#c#6vJ59+eA}kJ6_CTY^#`<(o2pP`-T&3t0+xr-f^Nh z%2=&b;fGNlPP%} zr-}S*@>wg!_^Ue36h#_~O>d#u81XXt7AOvG+SJ7AqO64IE4Tq+_MnXww>Zsuah81;q`4A!)5URf*FY zn+PlyFM+o({hnN-bgmN z(+bgTf{O30w4zQ|i4ht*3G8YyM`I+*YOzvdB+E5oJ20eAoK3@wg*eUFIw8|Tovsy4 zClYO)xHw&kHR1!tC?|GwS|fs!RD2WDcXV1ShH7jMuytal#wvkbC#p5J2H1MB1sKKm z{q);AZ4l3B?CVBSTrW~56RlSKIQ?*^>&2WY%IBl$ue85G;s9f{qM&!T&YQ&*2F-T4-=kFmqz=b&vB)p?4`lPSYGZx#9ZgdLVg zK-(#nDop%}v6YOi6MukYJH-aZD0j;{?-ZwjQTpCW3w6FtG@Y)nlfZU~Bw$=B8DCpJ z6ge8}k?~6V+r`_A-5`c!T-SNGXgWjroSq@Y9?_4n8^n>`8$0h2^DifwYDag9a>i=K z`i#3e-zg@}BpS)`ht7LNwZa1LXJm?fVztJo@7O0cXzcTh4ZxmJn2>#PI|7?!xJYrY zc#$y`-@W1_W9!7MK5@Z&MTgnsbDem#PipXfv4yd1;;()B2Y)V#<`8Y0Xxq1!d_Ziz zQei{-mIWUY8|D+XPE70jOz>f`y+~mP`&wNN!iFa7263!!S(ig%3uEiVJHVb0tIL$n z(|vF3^0YXtv0<4feb0-8MT&L>u)`u%W1-A_U0x8U7~2-uo%x}BNhB>MpWDQN%%0*U zaav=)$-Gs(ES@P>w9hg>=yFu7U81nqem%vnL}?XaTSd!$*UMjvJsQjC*FW($;vi#6 z+Z+>TJ(vhlIF*CP#307Diii47OFSlK)+nA&^}jXoRdIT`!Uhg_Iq?tT%nHJ4#pD4W z%6G&QD-||xz_i47ME=!;QGDIIzAN5VnE1_reqBEhhgTcgo&EN#z1!RK8CJ*0(VL^t*ih(tjV>PyB z`2Oxq4TD+X9u{%I(DL?qWqCE*NEoJ;Rh5eqfZW{Z7 zeeTs*U<8HRyq$b*3#5!_)T5=`&RA_=zzE{9pRujz0|-03gL#VSBX;>)%5xf9#8^%( za}n2!Xaz1?Gq4BeLEF4A^Tvr_VNLZU75Yh-%*aZP0^NRSM=y84{PkU>`;$Ra_BBayBj_`%W{qV zJbP`A&T_<$h_+3f&VIf}qI~@h<+Jz5Ph+~vnY$G>edO65J>^o3T{Uu-KUp5u*!M`%GH|o9JmaUdo}G8Vi+Xf)|fwMmw&KK*sFL3bFS(+Sf18ccFvBT!{pGr6|DeR zww&`5g{{ds)H7EO-KVgd!DXy0XRKE2VQj6&-f2&?1KQ_9Ir(v8Xr`o2qM z$%7i}FnX7NmV8lT8H@!UQa(qH{xN*cd01gHM|V!1CHEgt*iEAodR`$jenHq)v2XO1 z$+P8YjlDbi>f|fs?T;v*Uyh#Kp+Gi$RAFt$>`pF}XEfG*%wx$#vigwXGIPv_vQ%!- zSoN4){!+=C01(5iV-l=V8F)T4x_H1&wOnO{#364#$DrAPnvc`TIQz1(=mOr*>ucdOS##RGcCO2qo+t?3fm2C5b z;<9gSeq5EDqp_Dk3(1`t`}5dc{*XMyn9}Sad4@5i*+a7Flf>nQz@qUxE(ystjI9r> z7~ip1NCq`+18CJUNz-ltty=cew4LK`ZdW6RYTDi7*8>~NSgm+ye2-qsVq`dwZ>vV>R~S z`2Ag1$=4ZEGYePAc-jKU{oja2SIKIHiKkmP4_qTxzhG#u_gW*jD=aX7!UpVJxt+0f zftm@4);hUQ({7w_qStlu0Zse<1gpz+@(D#l4=b_T;;{Dl$%IT`M>TeKLR-0BzOJ#D ziJ4-9JfX366WhuS@|4D6FWn$ur7*TG@WsSL>w1Yypfm(Jf_8%pFt#qxbW);qgKVQ| z13~+q?4W5qK>MCd(zGW*+bAzTcDz7)m6B?tuzELLql44i+ zd81s*n5sQD%8d#`@4Ep$w`h!{zER$;vF?*Mh@0eIjpa7SF-p;9c~E1NqRsNK z#tIScW_eU&*CX7`@^y_-YHyJzG)AetMV`{wJqUNJJfpGK5bjnfUQ{_qIk80sG)6hG zMYhq{Hwd>?cFAE59#uG}Z^SZE~W zXDW=jY?t#j?Pu`0U6yL>Mflt;{JwNVFxm{x;LHn`X$Jo|D z(e%OAkL44ZcGdI*>n{1W#)vr^y^;}=>kwf2LOdO3T zn*UA0R4cwmmNHf=5@wA|xkqki?1-fKiG4EvE%qtWX0?_3%ACh}jIL^U`3}w=h>8paF{5Yt}Q*l(G(?@t_i;BQPjuCe%e6t2Su zO0xd*I{P1!QyHrj(;3_Mp`u+iuV3n8a^GJRcHg|qQXiM+H1^uOg48Eu{z(->%lQe` zQ*yJ$`p+K>>>0*t#jN?4r9Le`(Ac8+2fIBZ&nhf%HNrh7{T~sR+Q7{S_nd6Qn5y&7 z%MOew{rSAi&^}{jRqFF{kjG~=W9!9_76j$<@-$=X!~+X1YkydF`~(p9u@B|x79Xd+j_n5y?M)eEOy${|axY`+ z13xIfto@s^!)fwaEAA^EoA#zmWo#R;%hTSIOFtvpHZic#wP}Brdl}m*zA64*+DW+rT+_}Z4=`c?(%;o z>D$L;dqNuQh@9XLb^2V>j>z2$8>OGIu>%WJJALU1ch;s&@JsPe8{56Gb-II5xO1Lx z|F(Tj@L$*Y8ynlbuwyzlNV8<9iwNh_7}dcO(r?oy_+M!sYh$|?Ca1^Q7=>%@3D?4= zP4M58($dCuFC3EI%El;MTTi%)Y}y3>#?A>gwtL~&^h<1v!gcV3>uA#^_~YU_+t}`f z`RQG3jKX#IgzI6`CivURBpchka6x*qjZwH%Pq;LjHo?Cny|<0+URaaf$HpjJf2#x6 z0;N#~Slt*~FJ3@>8DOpU&^CCm&D!T57lt|wu+C`gB*G1}{QsabQ#=P+O&MD+{>ij% z9$KoV$&%|j5485UXoIYMnic?UkhStl;<;XQDoL~kTgNn(3R;$Rk}(zE5bLz2WrH@v zN;>PvGStdoY`qv;a#PAstH?zgW|eE&EQA|o-R`0dxAtnS)>sd1s-_Jry{_{ZYp07g*4m?KSCpn%W3Bja9G>H?1jg2jcffPJwO?a@ zW-JN2;VI|;3ZCPwLD=C-*cYX7Z&79*u$ zInSMlwKEVHZx##DT>te~bHUG!G^EbEMmc7=6L(@rcpoqmP21=cc2eG)Ouw)Qfn zxXiKkYuahh=2(Yaw7C{p*%a<9XmhP|F4~nArg)il$>K!oN~;57iswA5o2GSHjD3OD zS`TfbrX@3Nr-!yj)A}&&MU4$c4D+mWE}!!)e=8MxHfZy$Zj7ne3#?R48@Kqa^a5+2 zi?+aeK+|qs{ELhQR#9ukUyN-Y1yD!#Gh zi8y5$)Y#(k&oWA_jf|<-%d9P$wx(R-^vz)p?Wm@0W7-EE+9^%Dv-}_FW!BP59LXxI zm5i+y_m(e7uRu>CMYFC1+cNCV@LGm<16tyK{(iZ^aC{HqreI_!#sAA5@$r_3=}A6& zFm(HT6E2qc3%k3ysqbY;CX|I8ZuEU4poMb;^nH-Op8>=!GIsfhUH;B4%D>x%V)tXe zC7q{;2gJ!az(%|)DWLhg{m%f^&oak|GJMmi1d3hpSJW+Vk6}Ntn!}@TG14mkZF*7I z9EOo8B0pFeOCi{sVWgjVDU^qbkD}7IiG}th4#CWAEL&bmr5L3rN+lM65UcM#)%BwF)oFRA15y;XRc-H&lo-fXkpi= zDK9@xUJwW6{xQ2}q>+oehFk*|ODOj(Onrr2UP~j%Rc^TbyT6;J$3qXk7Qxf)hhmpv ze>%a)8s+w>zE|}opKBP>x5d)>#69fd&WC6@Px_NhwB%|9_Cx(xB`Uc`|0aarO= zfV2ma{41A7+2t6ZAE!ddT~V*=L;g3xjP&6=hz08XfH61;LVoUN80bsiUHeiUOXY9n zvWdeM!iDze66c!%W3UsI{HvT-e#o76sB*j<%I%`+YMV^*(+$v%y|UzUnhUPMw}rj3 z0~1K%e*{pkI6e7$ceup!R+-ASPyA zen!E?&pu<=r}3k>Re@^ZR0~VRK7RxlgHtWUjbf4FtpOJNoPZ0o>p=4VZ+!c3o`qag zDI8+=mjJPQ7SNA<=ER4nIQz>!U+zlzA3um{b^AdSb}YjJhBXX#F;udB==xSA-g7X; zJ_yj{#&i6w;O9&|$1VrC&R?BH{;vb{wm5g4tn2&Ca0>espf@aWMtvJW?gybI%=ZiI z@-f5a+2p4qpiiU#`o%y%DU>|#WKf&Eo?TRpI)-mc{4SevMy0gXNOI``i2P)q^lgb8 zK%8*l@0tdGcNj&XE*(Yj-p#F`6yH9vlHGsGuoTeZ`j3+Z>{Hc$$6fjNW8XD#BgrlJ zBninywVj5!Q`@0f2nHaJ1C@($w?tvCpBlxzkE1P6isf%Np`QVLA{)>zE@StKw&eb3gTJfC z5;p~(c3)_g0__Q-GDyv5aLBkoItU61eBcr7VjeT*40SUA3>ai-VT`;L9P+T!psAQE2f}@!ybXLR zw$pK2N4`y`9?5#RvpG-R!?{sC^3x;Bvi-+(Kve`9a)F6(i?J%Ig~`XFFi*$;l& z$u8n$D+u^IYX@RHVRgs%$5t=E&#Vl2NCbQXWHO&?>W3T{EQcZo)`$mjYtuOSsz~u| z!0jKG`c&8{@(t$m2J$Bp+&;FZ!$0K@Nj?WWY4^n+#S~wm{7B66l}XA6j9kIFLQZ7P zsVvo39O{tR?&~F`ywi8RjFWV>Dxdx5bGhV;M}4(&j&`Ax7V-BSmb09>6>$!fGq)lx zks|S-?-AT*@{V{;u7;nGSk2UANh=6_B&|#imSg-M%Vex}NRiF%;{g9I$4NSaFiURq ze{+NBrNw>i8T00i6x)8v2Ep6d1Y(@zC-w4 z1*tZG+m6^waK0xNx9iA)&WC&DnnsJQd*!A^tE@kYt&P@N zm&sb(fAtxs=rj3~Mz>lUxD+;U3)&za#{B7L@=&8Y;OE&!cY!*$(LlIR>)600vYGvF z=F;4b@8*J_#A$>NeUDkUqoj^ld%2{xGq=55Ufa2p_j4)lXBU#^b89=-pY6=Ki+HKg z*Kna2H*-x`C0|9lw#xS!B|!2|8u@&;an9T;&oqkj-7D#wMVxg}APx7?P>)8Da6MYb$JPR07f}+(6dy33KGyocGP>t1KpKNu-zg4zio>4auy3=^qkzrD zIY0?Wy6YUr<;TwLHNr2c4QAtv*a_Ur@<`w*-z;ljqockub}6vV1djWfN@`8ZtR8VE zeao!OxE*4dH8O4kU|!rmeCw=5ahalxB#p5Np)l^WZi;K<--_>6xL@r@aS8t0tOw#c z13m`0$$BBKE2yu=B?G<&cqe?O!u`#-e*Sx{({V!p&&FlLh4x(>vU)Yn^}l3IZal?* z$ePo5I$%lT0{^Sl>c$oRE@ExtYQW8nuZExP@bd<^wS^=H8m|NA2jafxf7W`o@lF0e zTEB0+4PoD54u5UD3*Y|&=Psg2lUv0ftxKBR0heGCa!&``WMwtMOcl7DkR7;&cR;IO zL$m8TjrYS3op{+~(McDQ=ODt)Y5bJ`E32}}FY$df_>hEOTiv)7NZ*Z3GSLQq(ByT0 zDl~P4?8l{WNbGBJJ@mi~i<&~zxVh)M-nhxN)mka7Yn)Z^(K1%yU&W$$UJXq#4=ZVOf ze~WysORri<%_=a}O+J%-?}&LZgMIP131+Y_7I2QFmRkgBbM#Fkn=OwiN7#0_qi0I9 zO)*8>_N$ryYK9wF{>>cAYWO?=`H4eQQQi#NfMY>VidNi|YxV8yb35nWcFw)qS*q>e zGeeX!&okUEx`^e?g4m}-lI-Pp2g~m@I}&rJxU<=-F-^te;J->7Y4*4{B!1J3O6QYi zze7Iwo4*B^*!<6c>CHa{90<6dIqzo)rOa(EW0%Q1xF`GO%0O(g?`GL7HkEt)WZz1w zRqQOQp!uelSyrfdLhJz!`vgPE8HwAksKpg=o7&E@9p+RVM(PU0QAyUtQAw5tSp{Qa z4~b39ub0%)agzaaDB{w2n{(qhb34wtag;T{+sy4K>!st8ESV4Bzc}`k_D@#FQI__U z_DMOs7g~CaIKXAyMI3MPwY5yvHt!|Nd`FsZj9un?uX&=i%ok{JYwRZ9s1`o}oYJBv zYWwUKyOA5EE$)t$vZlqSF=seM4~pwr1m!vYMk=6PQ^o&b?@i$2JdQij9snc&QWQy% z6m?K0c!@W_Qf@onuon|LE{-v3|KHQnDgGbCg=FYo<+A%D~O zzP`JuPt~81m>-kyeT%+6_xbvdFM0_zd}`4@&HaqvOhX-Eepwx%eHl(mfM?c` zXTE@XmSsLy|CL4SA#qUx`CR?m8`0a$w-&LV4U4bB>bbK1sz!4A)r}v4)HIZNq5eQ- zL*one>lSZl{F>D8QvKbFznb}e{l8nhqcPLK8C)tHW(C5%jcX;`B4IPa;l}2=-&qWg zmwL9?T=)BUZm#=NgqixUEY2hKC5f4T#WG;*iYq|l4Lw(!X>67ruEH7P7J=bUG(L~} z>He-B*nY*&H{RUvyH~s$;h$XbfyPYzZJ7@@wm0z9bhAM9PW0*mB%h^AKHqqAW-Y>9 z=*fl59tk@o?2+(gp~{a)TQ3WCjb%8xn={*&yojY@mF2w1I2Q(T1N{vK4dpOH01j_;~#Xm;BGhL22b)30Kt7t9ewO$0b}VF;nvV zh=f}t<|+64OV+!$*1xdi7aQIz@k{HzvgBaXQp^iv?7HtPxeL!+zn0cf_P9Cok4xx- zwxaQ#rt=s(_B(|}eoD%A*DYWAmdsdY!_u3<`FZ~F=MjIZX(?cJxf{zITzVDg;_juy z{Kp!<0~*gQU0t`Tf%COWAoELg|5>(qBOM{L*(dJq>!f26u9CM&5%k!9-vs`b+;0lbKV8Rre4ei3eLYXt@iw2Q>v)^b({;Sf=jl4$=JRwNZ}54#j<@-I zN^*Wm;y)$vpOW|w)O~r`_nMw>_|~!?G<^nR1UHkKKP7cG%Srf8NzI>hb0;%gk<{bFiV;eOYkz%XQQTzbqL0Wx-_T{6I7Fe7N~Vcl0W* zw#0|;N!gbX{s7O!^UEauDK~u8XPZ}H)%XI!vse8M!si?Rw)y=TdVO6c>&5qg12<M1L}EZpy9;e-wK;6IAQsggT6%)M}&(K971H1_#x#$WhyHvt0 z!i{(NP_#&CYYW!R8{L+A%B#B&UX$4)`7g_Gr8qxFWIPEUlkjl~pOo+e5`IL&rzCt9 zA@E$n7bNC$2=8ioQNpiD{7Vx5eF>Xj4>&Nd33_}F!VT`ud6(nX&0&Ot?(>Kla(ChR zZg=(k%W)6%282`YR)i0^QG}1UpPYXMwEhDum3ay=gD@&wf%`5Qb9bf#&qw9?-ps$p z^L_GsEc4OJE_b7uEs#4-WsWSk0=$Iz$20H2^MpK4X1;~z2jzJxbNS_HF>?grBbi^i z{0jF*#9x8491P!r5SGo%JqX{HxexWcKl2gf{6yyW5Pl}}*9iY2bM?Y2+*c(34_3uEqrT(i3x7GJ9x*YTN zc7!+8{~5wP^{W?O?)KK7Mc7&Y7YJ{!UvN@aKeQ!}ZOTwol{3ya!_l>0swzs%;S!Wv38s zUiS0bvu@|Io_Xgbd{V+^CH#_m?Xut4{$z%!&r0~Bgqb?V9Fy>zgilELjD!~?bXakE z=Cw$;SHfo`ydYsm!vIpBX<(iU8qVRfn=7Rx+$&+Gi81vOu92`q!bc^1w}j70_$3MJ zo0)%&gdGx&NcgCPPfGZ137?hlISIccVf{QQD`AI(BN9F;;kzY#PQou~{Cwtrw}j70 z`275lWz##qB+vDiNo^8#NH`+lqY}Pb!sjIXl7#gOn7>8BH4;85;kzYVbvaX?S;+8$ zgnJkB`TP|OpOo-f315^jvxM=hBy5*3E8%$wpOo-f315^jvsCg+*e+pK!Y3tsR>Bu0 zd}bMQUXU44!{>$FuT$0neY^@yyzLmTlU3?t0etgoMvXctJw9p7AXb z?v?PEgy$rDLc(Vxyda_5Ao(TSE8#H-pONr_gl?nck#Mhs$0T%{C0@e45+0NA2??K( z@PdSHi{zAWuY|`WJSX8356=XBy??( zU&6f-9+U8#gilC#K|;4pa!R;Y!gCTnA>lI;UeNd(nezz=pONr_gzhG(LBhQf9+U71 z37^rJ*D=pI37?Sg83`{)=x&o5B-|_EF$vE}_=JSdNO(a)x0m_3L*cNK@MBlM?do5? z`r}uB^Xi^!-f_*-*L?Dt&tLQPYrcKW_pe!W?dEGot}R~s*tMU%_8ZqWt+;N*-W5kz zjI5Yi@#u=Tu6T0A2Uq;wiqEgOu;P0w)?Ihobv@UexbE%OedfA#ui5#UdtP(;H8ZdI z)z^IJHJ^UXw_meqg84UuYT|9zh3>7)i1BUZOxH2!)xBS=C{}U)f%^U)!J=q?^^r#+9%h( zckLV2J-6pr{grFDP5?&WotU4PB>ue<*K>mRuO4cGtl^`E}}JJ+vTzhiyh`jPec zF7NsuU;iuX-@pFj>p!>t$_-;19^LS}8@{{Y2OF9;?%deF@qvwR-T3&%_iy}zjbGUK z-!{5Ub2n|-blaxhO%t2WZ2E~!zrN|YO@FxQo16aIrX`zKZ0_FNyLo8yeVaeH`4gKz zz48yQb~twp`npwny52vF%-Lf8MrrTj#d>x1HVgzi<1G+y2Y8Kic-xJ_3uGYW9^Ii$R+4@~c{W8MGcu6sC zSH-otxLtKM!av?~eWngI*Q3Tc`2NOR-2B~$8^Y$Joy*V;zjbkiTaKrz@c(N3Ux6=l zT!$|nw4n7h_}}K%xgEFzYZq|k2FRSRg|lFX+vK{S{~f@6_D7K8Znw?d>$bab>_bi9 z9`Q5i%lFn?bB%Kg*RDZ$wS?EN-Hhkfwc8M8*FAx-upq0%w)M=j zOG0QZc)m@ZUs%*~t#kh<&kY;);`z=E??ib2hF?W^bQ5DbH-Be^bD!Vx-Rm4~BD?uD z&V8+o@y**=kJfhOcE zGcVy=CFY$HJ|!`qknnH2uR_^xOZ@-3t(f9{oM?bRFPS@ZvjJm1;Jn*a1FhW|sJwTD;V#Tr^AY?ts(2~XX{ zoF#dFOu}E2@M98wQc~OYvFsNm<{uE;TSRDe;#8!tFsL6kgzD><5{MDD4T~D$0y|ZujKjf<$1|* z#_u}LQiBpcc>E#6JUhymb@dECDbFt~;`3+Z`HQ1}jXYnM@E;^*ZjPzPAA zxCnc6^k!=U4K=ybpw30W^9IB;gQA*%@1&_b!a968q!BSC{1!p;Y69IYKrT4JBW!Zh zNM8inn1}d==0+hQL@qYzM#y2StWI-hB5xgN|5`j>4~|d=`e(QSdEu1{n*}_a5N1I4Yw)~7!rdrQ z2R^YLVHY?>ojd3@Bh0$32y-aMJIS`=`ArhO9UP<1{Q`IfJUpON*J0Q9W`s|J&(yh( z!UA09e%IZG@Q<+@UFSXx-c#rP1a;TBFMt%nY6<5oTN|!!K?W5oX+U=8brs zLdbg?-h}5f2)R#t9?uUUgg0B}Q9Qo^VFsG`Tk!k{!VJEf@#A=Y6T*!9_nEii`8+~+ z8REMyb+{MdC-MB_nYZEj#}H<4cfil!`KJ)#X0^;?c>ZaG@aD<<9G-s`A^dM(0jtBA ze17TU=Q6*5=buNIasL6n1ab@cdqc8TYH1590ZK2zg@q*YW%T z3IDImhY<78%tsLOG{TJgSmrnI{JRJ~9t%P5P7Xs{InZHELe@B>c{{uEEcqJmlJ@}a~;`tvC z@X>@?3!l2gy(-km~sCr^A$Y*03jCry1&KqKW7+b>b{1suI?KMo9n&>dc7Uo z>ml6ic6nxB=4|HQWqtyu^?x<i)Fui*?_uyBwDM*7}3>{q?V} zKUM!^{rl=aRR7!cU#x$*{(TL9((uKGuQzO(vtv%roWVJ{Ir%w{%=y_lkI#8>&im&4 z`keoB&d28b{hZg#y?*ZYxqIgJ&%JN%gL5C5`|ERmdv0Chg2tN~4>TTbJkt2vjUQ|L zMB@u!n2k*>O&gnbG~Lp)ujyFRbkiG~-rw|xO@G?-S4}VBmuX(y{O;ywnxAX_bhDdx z*}N;~wanW%Z^yiw=k1;Mr7aETD96@8-mrf^brt<^!oN9$2>#WBTid^@z&R@ayz3Yo19GTSb2-5bDjZ$zy(q1KyG=PmfX7HNA>_pPYubx6MrzrBcW$8R5g9eC@+ z`qhQse*EywG~m;GaNx__9rzu@y48cO&vz#IGN}0sIE>8^Z4{{Epyv zH&Tz{_j=^G2eJ2}pZDQ+KYqjb9m6k+-*Nm#@EgT1hu;bOPU3e8zcKtCK(5nB9S0;R zgYw_)?wf$5b8ql}*ED=HKWEO%%}ele6Qz+taeVB!>plKJZe+?0%#@~b6Rve+s!(*@ zUHR#WT#=tIJht5@wRRN7$B}akU-oO24|aOhgbPivvk}k9Rh>PA(i{$9bjup`iEAE&s7IXP2dDhat zId=#jGCYir1H0}{e3-dVA_&k;KIYuu%%rx%77pVpg|09;-1Xpe7K576iVM@I7GH(u zwqpPWCUP9(?f7sbhK)-3w!c`I2r)Jt?m(e%ay-}SKjEnv ziZ1o4ncV)d{AkB`wp4N@8|t9~#){r3-n9;%!biVHi8Wn>kn4H~c+#IcnR}?5gP&|h z%=CD+*j4_xbqUCZPxY1roP=XfE`Jh`9hg4Ok7=SlOvVVn(VxR-wnuV+2U7*vTf2MZ zbs#sHEoRx7!GcHKL)od3Q%=4&EVDB(Ju-q%e7cV8bNhJV(n!Gwn6A162sj=~rJ516U$7kG$C1tb_@*2!d zOfsX8J%~Wi!H=kOEPFCvC{2xx2)kmEz(H6R#}nSz&!JLo;8bpWTp^y5(X$u zltMZ{3{$zog(IMw!dc1CpBu%uWk;q^Rem&E9M!>AP3kHZNmzpZ0X+=-0X<5s@=;?M z@ThuphK2n%feMb&pUUJ9Xn|^%07^ra{Fe`Gj{MK<_)wvfn~(CmuB)K9og~m zy}sa9N%1a`*Ps%>@BEcRQ~cC%fxS;Hh1TA4r|%~DmVpN1V)a!j`18;(60Q0 zlGKTh4KqtOxlr#3=`5B2_7{2C^~1TdJ!B`Sl-(;ifwJ^;|M+z2lR@)TuOvT4FCcor`k)H{m$%E_BbY#Q_=(OJI;rbD0cV6IEfkG zSH_TK_3Ikf(a8&v$y158J|0VmE(b_rX(oF_!g$)JKu7#0vkaF2Jv=>e9PP-gA^TzQ zMG*`H=JtXFUkCqCAONzqgDuFKq>%UEKqLO?F3@)Y=PJo0CdTpun07ZXg3m@P!#X=Q zinWW)oXYWQ-12Do9)eq3KgvsCNGljW_#B{=8^o$ESr3Diu=L>A$mtR?PlAt6IehH6 zCyNhlPx)!lzLjGYRWTRfZrO3>9+;W|JCC21Q|#zXA8yABSm~YJLfAygC2U4ULG0fYUFkWL+GoI z7yu!T06oTY+96aP^+9Ow_Cj&&4HVPHDZ_Q=K}{;f?VFyO0^m?2%7V8t1ojt3rb|S& zLtyjSlese0@1M?(fJz2V0n8oalo!jOq!5eGf0s)8LMYZ$ zEL7z;r^`=xm+n9qQ8q#pnx>%Y36w&KkQSLRn7hdMicBR4LPMC#GHV|>Jy?{{4-9k- z4h-+_?dk05hoUgV&w_^reMBGlCLvs2LeddJcNlCs9{h%DC03pCA};C&;FgwbFCI9YENJs0x^x5~&pgLwORjqoczCC7htbPW`ik!gnDr0xIxGB~@YXK$bob zMsI#-aujqr1o?ZMb12IkMkU&S2lAop1BD_82MfDOgQ`CiPU`A~+=d2B05x|#1ddZ8 zPU&n?ekl~8X_Y}E>(x|FSU0AP<$I$!P&GoUr&h#th;5Tm1%?;oiX~Bj^o>trMJ*>_ zO_nyM#=ry!k@oydSrFVeJvKf%m@T41t|DVOm)0fi88XXDdEtpNcu-2ZEDRtP1xm-M z+{kH6hd|HZB|?37NtKN5d42w-QHC<+i^ zQ;DUR3!#TN*SAhEFj?)Rg|4RnQN%B1R7z!9blEKJn;FcW6n^0|2qW&!=W|6F2v@7{ zhCDLNpkQkHD227~NODxs(u*k?;a@}$qsqVn>9}$W9<$v*7Q&V>Bjve$#oP&j!M;KP zixzM!C^aV8GP*)Y6_wNG8!JN(nD*eQY(CZ=f;y&+r4@^@5|C(y-Pd%;`$fUI0n@pG zdBa)olry;)7X^L5Ej z7QFERSrCXOl(q!M#GoOrW<$ksnO@&;6|SLU>c#>9nGO;PtVQMLgl_0f6DqTL;ljjU z%t{VGmC^T&P3FcasLGqcUbRXP1LTfFIk2=*PC;j30z!-Q(56mf!cd9rHfn(afh`Xr zxO+ndIFCu@WY)6ydX{DU*paE1Uplh+5y&zIhAZEys*O^r@*6_RfQ{~S!g2XzdbQk6tCaFkAzy#Hf8m9S@2{r zcV?_GU6LY!5JnwnSj?7!d5K&|(lVSxZ7Pltv2Qd7sPL&fKad+KKx}Y8yphw;LUYA4 z+3^rL;+`oJkU~!qwLCi(?Qlj=TM@M{n+ItVVM1pd zQ8fYr50Vk(@%85@yB?SxBc@`0#I!Y4oTm6Ga`irp7r3{7JPUa91uPTtGI#;z5>~ab z6JsjM&?e>!npJjS^t4~tln+cmD=bIJXfaQMXCew$S>=M9Qzg+UXO(WE_nyz{AFd^? z12YNZfMoDm@`3TfaWZ~YSfcey0R_!RZ4R99@v%|TE@?p5cg~MKLAZqhLuC!MB;S!O z0)-0WX8?^ofD5?n>&#vmrL~TNaj9LItYZN5Fb0d8L9G4wSlBZFL{E&JoQ83ig0NUH zy}27u^pYhzXTn28qSYF*M-09@WCtU~;#qV(=n8NdCG z3{j$Q1T3vH2WAX8YQzh46WRPIrA%-9;u@|tCr~nsYTo`JW~Vsj5ax6YO2$Ld-#j`i zMl*0+t5B^qWu;Xm3gqsB;bU|(2ZNRBlu$*4!9+0!idk$Ol;=?%#H!4d9JVM)rc?pr zYsjXg2X!5z>CRK)f$XDs)ffQCLPZ`w1W6BOGcf|tq)2l!d;T?QC-GH15focCZwT6Q)U*G zNxrl&W1mVCt`ZHL;98$ZnH&?1>W>Eg|~O55imf@WN)uy=nj)XcVK!_Y>Hm)5=8_{2I$dZx_j+OZ7&_;uunmvQLVUa zUh(6OEHBX`RXo)#_rUBgDF3>V;oaJ$e2fEGO(0n-cGj%cHVu3(HUZ6GOeo?jQ3;Y5ziZh-G8zGeYlh?za5hs@f~3| zsT`OsiX9*@kK9}tfM-+bsxWc0%g7nzK15->T6>s{ICUsr%AUxj`h+?0lke#s1a8<8 zI+`kksRCQ#4pTc6=u{#ge+f7M)i03)2tPXj04-m6_kl@%|Ay;)s{6nvKRc-eAdgSr zhDa(A*rP(I&w?fKIP6?lBU2d#n<%YTWUQ=p2T;mXy{diM0gUnqI=Ss9Ak7&c7GXTu z{0?#w6>p*fm`gZERLc%TOk_{h2J{oPM{EYEk?sKY(NHI8z$D3-Di7q7RuvmOr-x=_ zBS>Wj+DZ0yzu?r)NnVk~9x`QTs|;2=87K6IVya@G?8V_s<{X19RUTMKWS?{ry;iwv-4@~>Bd;0S>C!tn=0#`bGiZWJps959ZL(G0Ab8wJ{OvSfx{ z9U{sZ)ei*L@SXzH(43X`?jhxD+I*Z%QH;+cqPFJoG39Pm z4x^mp65Y2p{9j+s7*{p`6H^E6Pi!X?tzUO~7`CYq?(eD^MNTEUNo5KL%#l^5lzURq z$%?$TXC7p|))A2$35-P7bQa^z3c##?2}Md$tbdYHevx`ro~eZkhG>w%BG6Ej7D!-U zNe2$2nFpfG-|(>8pT(v#_JgqV+GzqbYTj9IOEF zoPl~?6s4I)2U@yR0-_e}x_iR}PI}Lq(iChej%G*asbFCEQ1`$<_u&Jsv%9^g_rUOA z_h3(#n}Sj(h{Xrv7$pbUkBU0_sEzygcI?vTEU_~;B6ew?M#1%V)s>+_dEoVw6@DsS z#T?C(XTSk{d`a5J0>;#fNc`3$a(cso&usO0-OYEU~qoJ#3FJTTba(=*)D+tD5+19Qr>*j+NkTefz+gi7LolRD}fUY4By_>&i&r@yV|>Z+V}NK1RtV{f@C^5#w;B2T6=u3jr7XIkV()hQ-Nmk~P1B`jFx32G{? z%a*;yJb8hR$_g{ApGjYcF9zDjPaU|w~XoyF4 z%i_SCxJ~6w0r_CjodQiln)2Rj;%BVh#znwWw=_!X@pXLq#0jwX?$TWan4SQA^ZEe{ zreHCLdoy<&a@e=@21VM_$N*uK9(7t=JaV`#lt}aYMu|A$pF-L1Qc^+%d|;OYi}rs- zbbZ~#@bE5|rLUOh6TTc6<8*FRSgAZZ-7&OE*k56&94eMI50av6TSbYo4PSmAI5mw~ zJ)4KOHUUVq^W9LR3|}aaD0iWPk$4~6h2XLQa%Vh{ zUiPD*hS^>mg{ptbMN*~%$3Ltsepa@dhNMUje8iti~6Jw{+7^uw5LF9Ae^Cp!u_P^-<(cH*+(r|o0;Uixt9fiIrV|;%}4meN!7}HBz;7yTJca{#<#EomHX zFU5#t8ZtB(Y`zqQ2Sst%ekE4|wPNolWRTZHn(iKf8A*0@nrb&HO~%J9huY#;t2B-q z#4(3F2%LxmYV@8ep?o^U>PW|HJ<1G14{cLSh(!|>yjksC$OjA3v@$SiMW8P3*@dzA zh!}XlN9MuIXqzR@^1kuH$Z46WTz)jX6!okQoz!$KiXw#8v@VEcV|giMv?W!I6H&^o ziE|cm?(c@WG0<^)*P$+m%|b1td$N9^Yd)CU5TreL-vrw6`8}y7CT_+bp}_8xEOM9} zO$P^s);c~tn)4QukRh>R+#s~>=~td*-!L@JWh;_}A*O2somqHT=C!NvZie-NOe8fA zDmg=okagU96eb6tc1(37q$?C0O>8KG1wRC6{P6a}vY9AKYXh3}6h@@P%0blN>VcWf zs^YEVXWTS?d-OF?k)F>ZU%?TJa`R|iyc?YXCk2=YC}e1|K`abG7YWkIsJQ``qq_4^ zKK8i6T~=tTPtD1|6kWPGsyx*-#hCJIoEbbOs{0Noxx=^j0^8ueGBzVT7w!#k41ui59{HFv*(l0#M^O);0?{=&c&5t>#DLJyeo;G3Yh(ebKjO_MB8$ld z1);i`iC;F?rH9Ghv8kvVICH`VKww8+0>974R?p z>=N(Txk|ia(=PFj9lFFjw%`))*l0_yr|?YpKR0jW$ZIO!2j14NT{ueLzbaPYB(%80PWd)U0}b!ID|v63L!tLdk%1SG9X& zsg=pTS`SziK9rzpvV`(@G&lI^1n8aCDzBYc^Fw*aUZ=||fbd{!s8mK3PL{2d<2jz) z!|eHvMb7l#&h4Y4$?6hpXwvwREMH8*F_B`jfLK~f&{Vjo082^aUk`h$tR}FC>VXnn zT&NV&ux4*0n8Y(pc~X$8Y01~=nW5lOGHQU#vg|ls?j7_&oI6o~ zULo;H4aG9iSX~rAk%1~QM-2EUUGhO6d1%^9vs&q|;(P3y3{EdZ&Lr=um9tj7)Shz6 zaATziG3ov28;*Qg%-cgLtuh@HV!kfP(l~Y>_87gHv=?Tn#9;&&?6?V#JCw^$`?_8F z8N}~_4dP-Vxl9#*AF`WXI2&h26B;UFy+KE9W8D-~^oW}36$;njgi3YO^u4$yjUUU4 z`WGj7Wi@3%(CpG*-Tf(hFsZA%XHr>+T5{M8@|Qmsj)MobV`Nf3&OJ_Jj~f7}Z~<~E zc~eOdbFJW}XhtGWmzkVGEg9E~a|r6tZzKk2$vg;NTOuJFVk4O^vLSdwkOy@M9RS~k zA&FO}0EZ?4od5tqro?KBNj6O5o>lo-4C`?4Ju&u>-$AbQRl=E{i?}Aq-v8^zCfysx z>=; z{YeOeNoH!Ij>gs&0uv}}%8W0R&=;%9apl@8Ww_L;=3i^cZd#GtnNdS#>+I_5I^5ZH zxZ~(BoB{^BhG{6nBnyv%4`qc@myl~^v~hrnl#>u2tv2<#@>Pp8sVgoR+ps<{w^b#% z%P-(8FtuXmhKJ7(s|IMf6p5VNJOH_UR`%Zs2e->nI2?zC*1Aw`)O)xoVU3*P!L(8A zrlnTBioxx{QdkiQJeRShOUrmFA~|9%s3rfmA_Eimn8Z}k7!31znyh9HHeiX;O8JE; z>Ee>3BC=ehB1Ir3PKw^MI3}LT-YP<-RHjnW=2DqGzeRmxPZ^gH~O$bG6%<6})2ns2oHBQ>r9amQD?;N(Jd0m37n{ zYn9q+=Z)*F28u*wRWl@KAc0TGr1X%IskOUk`Kq>F#+P_OuVB>|ON=29n(0-#QCWOeD%%vMmSq zph}Qa%a>8n6ooUeb~hDYsRTm=W2|3oM93H)k76J_^387)b7xNzvAO3vZrXS`UhZD= z$LEyh%1M=|6f(%hL|Jk1?ZQ%K(laZ8@rmAX*g@d#CS%GHmB{#J&i9&zv@0szz8o}( zTrx9LQNQ*;x2mK@Gd1zH4xD4+4F@^+W#Lex9wILLy9IYs=JJP%JtU);ih&U$^x*Mi z>h6R|zfg{IyJ-wgMdh7+)&~b(NW8EP>BUJzZ;uGJf1nCHaj|NG5QOC|&wtru=0#19 z7J|1a_(;}t9BcK6<58k4yRauUl2|H&mC%ohJTg?ICTA-(waHFbn|x1qROqYCzEl8w ztd%U#Rrd(l&laGj-cuAH_9z`!C3$Fj+!Rlh(tgVIh0(r@Vr3{)NmQX+EvgEoYvy2Y zEAf+Kt&C;fh#sZ(_?_uV0+lSOC`0UM?k%daN#6M~V8qhv^K<`?~tOdpn1_55qsdr>A?MtE2aD=K%IydC!`i^_?h;;wCol?IPhqJ#eW&PpL%wr9D{Ryh;0$1kt7 zlGOuR9lqvsDn~I(I?4~jA0!W9g}>Ou>?(k z6pcCCVX3K%+{xqJ216J3DA{&p3+;zH`+IR50%rz>2RaW9@5fn(eK=?^e6Z`Nv&6oh z_CXvXIFwB7?AqTx)H672xqKDQ;>)G{IRrO!xO?zuIlG-s=sJv}3jRP=GKclaa`yH2 zfEV6LSD~y-)%IpK>z9bTj(R%)`7fJd~ zSIr3b9`OS)7o&^iJ^TvtdMye|tGX^-tX`G8(pk-W$qzUJM>$2r3wrlNiGW}PrYZ@E zLfrTTti<2dv=Cl|u0Uq#S~<$qknxna8!>FdSwjhWV&S$rcyvn<9*^_Dh$h>+%!+oX z=%HRv{zgK*Mdx^QMd1N|6Xfn2P+9wN>_#W{$gv%uHwXbC*^{J@iY#ZYh2Yvot<-Yy zOQA<{3T@pQ80_bvOy##HuzyzN4*yX*g)k$QFEh&9^eF0U&hij5%3aQDBKum=tW8X|T%HcmnQBELvsa(r!By?pmjMpc| z87M?-OS~9+W3DiI$rrscHH=?UqgSTJ5Rmjl1atV7upcazux^}~;pjwjp^&iMAhW{@ z>KstHuTf{BmJ^Mn8lXS`8a1~XV=#y++o8BquI`jL3=B?4+h3RgadyPrW210ALq^`E z=;y|#Xrb5#fOkIvW#PN+I|=tAe;0t>@s_Sar>;zem^HC)L7{_2%v-R=%Xd+SYmnez zm+leWwa@t57}4QGABa{ULfF}O9H>_=qHZ5g-8jbk=i`y!&@vo3Vc5cL>_)(BBs~Dx z^z}l!3i3`4+>bynGcAU9ZO{c6m*VlNPr0Mpe^>&3PRGgHj(CCHK$I&D@h{u(K7+KCO2P74ED{LvlDpFdm(b8{zBAJ`4FnMZKoz*WQ+1YYU=U{C}p00NqwflbW zwD|qzJ#u1tynHi-KOoG;cKL$4e8F9w{&vx+8|l0K-(9}KT|{?7@yONb1de``=-p>$ zBE@3orM+-+M(W&kqjoBXBZCgi47i~29{+ZEyxrvivin9kFgpd`Rj>)#woQbj%=Os+n23yv#WX$XSo0`D&R5dVJugA zg4)+{@nR++S>{201aD#174c;}I7#DMdSm#AaPoaCzDx^(a&C#n-+-?KGVUhEH9myD zH#oOI{|@7M7e1*xfqEwKy<4}yo+Q3;KfV}lo`Qz*hAJoC1YYA-SW`$F4V~!?4`S{dVDL|jQdclW;egx_2XlToEUpn0N<_C zadq6kPW0-Gj5s&zmIoskCd%W>#W{Q?6c_p+$7_K+;jP5??e}7wn*p=r->vwBBR}=~ z28?hkKIym(;m!D*BfjS)H?;-BL++$J?hD|CA7$XBX zwc)o4L`$rFBd~dcd)RHq(?;h`6Z=T)>>25$fKbP&V<1hWDN&(h^klVaS%n-dkf^UH zWwWSzn&Zaz(Ob~6_Cb5#=Cd!1L0{_UVIBxS@_`YQXvG|p21%===P~>R6xyownS6uT zVlB+`V?>?xYn;2b5A$#mHTEMPDZu#3t>~Af5xa4PJU(se&i!q*MvO@qB5if^cq~z6n7aq8!;HQHTul1pX5Fng3yY-xchuem#DxL3$&|HHs7x zF(#|I4SjCGH&b2nag@TvImknTXhEAyLAmDjAh-2=daX|4YCne6Qor_pJH8TYt+ilG z`nC&gKa4N1q6g>RS`E~kPvRLVL{|r;&)I=oft3Wh;-}$X0Js8!oplQq;A6Fq;N!H9 z;IBJvdDoYxMki%GQrS1IKb+`W@UGyrc;ai($8)Ij1gzxwIz5nGkxH--1ZZpX0BXXi zav3!=0KARkKPOEmgsUTY!YFVVnypMD-wa)FQwGq(HJ2xF{#jX92|XvzT<0)}6YG5+ z0*VlU<5iT9ZUOpc(c&pV7F~DKe1dByQ7qZVkPC>>$ksLh#X#S42whjdz`6D|)XkE% z!oscs`Xri?8!7K-a}Q!ngyf9$Wdu3OobW($btL+C;?u${SPA1g2;)1;wY1x`VaGR0-o`f2+XxP&!Agy3@U=3a@h?uTBC4Vi7)6Om{GuO&69h zLvfSF%GovTZW1I){iNe$xB14!S_rRv5H>Aq z)E`fR$>i{#iZbt~U5v4xP~gw?zWUxK@P6n=)z<{hKU_@`-Q(_u zSWbO;BgONT_e)wQTA=P?AHc2b2qE2O3|^@$b8jmOJfc4HMd{{{O{`Vww#dV z3{${Sj!Ze-Elg_XuGvQ77Vya+?v@dHG}aN5DcDfdaW@~58KgG+O87fqcmDZWB$yrw z&2wazfgv8pTQzb}MT){PS+N-glVBxCsWzCZM1?Ag7FsYU*18D;Q`w8=2BxsxN>icM zLQ?<%t2tFi*1l5f<-{e4eFCw}MWI~H4TgBCUQ(=Le_4*q#7vc^kejUF6p&N_O*;W6 zQ*~=)2Au38g2*&b1*GOAo|ax}D`!zkl}R-r8KQGa(q#%*dAC5e9iz|%o+Dz9$s}of*@7MrMUqfI3{ykD>&1pZ zCzi+C@pK6AQg61+4x2d#lMK zvDJl4fYTWR(d1VJt>GqZVX?(WX@ZDg4XYN}ErU(kgSel9>om}*q@6g(mYi(%f!+RL zBwe;mG*THl*w7U#gHcuH zwXB-;ihCKcy~Z7C#nN;S7}~w~e_xs42)7W+Je1^U@n&fyKDB$_3uJu=b2#qSI(IeG zs^xOH!mWA=VR;Lnth+Sr0!^Z}TM(YH2rN#*4KZ)5hJ|DdvAvyU4W}@w!d(Hf1iFYE`k(sj(@xHk6gzg52Kh<5gwGaKhcj8@rUl>Ly^5iR^C(6Y)DNC*q5nvgg51Jxl@EI9&|r5`dxH+}~+ zZn2Jb9gvIvk!v^CG)@{#>^9mY!&GB^Y_@eWz^Or9`eo6T*UtwjSnZtJQl};KV)zhH9H?q2@rawQ9G1hP^1==73t+ zOiaUl9FQI#!1%`?nGqh`l;y}(=_NEz06ruKQIXcA)eWwU6}i?QLQRxMNRk(+ZEG7! zE8KL;wM|SjWJ{cbHfdWK4NMT54=o)_4&0RP-u6!VFd93JT^2&UZ8Q=B3nsMMFZY^bu&#sk}?#XT)!vL^Bf)(hfX3R zQa*nNpu7{mZ4kBEv369G_}#KWSzQibyo1mLIeu?_v$*ol&Caaf#@*e6}phNZQB z)Yy%h4m;QJYR2wO>)uIa1|}ooS4$tj+hvna#}H?T+Ix=Or1b!x^XC_Rjq3w z>5D3O7XOQYg7OFA#4Q-l@v=bWw#Th)y-2OCC?j<}dTS3lj|;6)y)K%%gp(iB5Hspl ziK*$Ryij#-n+(+&~=-NSHjH{CY()1^FLz%$%bY!N@act~67X$k0oWwhswys~yt0n}B6Ex-F zYc=R|+AoOt)kp6D{+g%OJfOBtzN*qOBGJS{M9O323UOm{x+QxYtq?jY^1V8ksL1+C zw9HsMvzd+IW4k^~i(wStZfpx5S`hdu)X2CgAk7An)@~6HPwp(m*kkaacs$QTl)eLG z;6Vn7`>u0G{AU?szkK5?6$DSQ7xu>Vt_}MUwDTfFtYi$GhLZDHLY`6J6k9i%B1Hxa zVG5VwG@Ef_ms)V(ik+&r1*|pHO!JZ9-hkk2SmY`28MSdQEj^BSiA^t&+y_#7NM3kL z%=G*|2o7(DB|0r^a74cccp=r2L>*X@+@{ElJHJ z!g-L2sEv@lai&QHs%z`gXBG-`%5&ExA<{08wA$DQFMAZKnYt+ZQ+rW;njx1^_R*H^ zYIsVF<$}u5q-Ubs^64ZS&@##P&Pq$C%MkdX+ghXjrtADLdKAyzu+71dYU3w#&8E@f z?tp~ZjgeLBN3bX;#+Ao86FZR;AJv_{1*T6GQtlI@ZZe*8c^_I*s?|A7>YkjJ3BZSX zn$|_1R+h1v+`(!iN|vJ_NUo$j!b-+khW62|)7dlwUk&%kL;6kwCRsJz59n|4amCxmQB&Kx`$ABPa+yy{(L4PsK<+K&=u z%uIJUpqtNqYqkCoI4Wb142>C9_SRJ`eQ^TT`Sh_TA!2T9@j_|P8#dn&6irjPGGjpVn#X2Y-4U9 zxroL2OdJTg$!@BTMgZC`(8^w_l+RMDx-|Wr=*-(X_7TM zod?r_f{o;Fjk3$iMrcl^RL=!C=!&MB#FBEgHqyp2Y8b(sHV;AorF2pWS+EMPy1bHw zQ6!|MeG*0xSU%x7&M68yNZRC^WTg)Y-jL=fLXyF|jwIfZzl7SzBFT}05#w&eaFP>s z^xh#c#+S$i(xvDRSUGK#b#Xy+n|m-$3dAg-aIP%tr~KfhAi!C(t!6GjO0h&6>T7YT zyX{i2=!)v%(x0r&oqMuVq5^m=(<=uJ0TFkODzc$idKg3tPExGt1R0S|lVm!1%9q`* z4qOCe0f56cDV+2#uF_o`SVSzVOAxWbjX8HFInBGb9CCf4R zRFbo@N-{j!%*kT7_;V1%?ST7nNdn~64W9d*v-2?{HX6Q!-e_Nw(`4o+)m~UGFw{^o z4H*FL(RK4+_NEnvL$9uGa#iE(P)H{z=mw_-2yO0%wZdN75~#A5+DPfuV2*z36vu(7 zL4pLK)5!D5hJ_R%lEMPayRB26)Eqas|Vrw!*HNsa}l-WP6 zc7riB0kd!?t)OPl4H8ZoWwkCHRqeU5rHS%PP}{YA;*mm^%sO~EYbuRhNgKQvjc%=` z!m@pp{R0cBMwaf*K7kYQ(LC5G$ECSsCvqjV1u~m{#40fdL!v8P%34XdsfmP?p)#cM z@k&W4oRsSWCIx>j?pT`^2zP@88&Ho@8s5(RWxD&Zr7=`u%ZD)$vsrQ?O|c;mxrh)v z3^`ES$gl}gC1X&8V-kq6B%*!ND4$%2Dp^2nHAWX5Q6$fOt=fE3T~Lw7Fu4{8VqT$3 z3N7M1^cy=>SL+;SJ2{|q8z$E2+DlLBpip*_4=ft7`;0d`7YuD5CBpZUC9NEmbRKvMT5^%)^X?3Y#-gF|h z6VQ|lK;PJd2{nO|oG3XG8@zEEi1dN^7mPdS#Fjg<(zg^N{hpy91XJ>udKrQP0+PnLFxx+`*%UZmTBWlQ`pcp2Yaf zA!QIFCHJS1ky>*NGwFKrDb8bM{m5PT3^8?pPk7w8&PH$dSe+J?2nR)6QxuEY~*k+cVgO<;JZ!jFEA@Qw5FI zY@&=omwqMgWU@D!#u7A;oJM&SE`q}?IWfm-W3>9>zSw$iK7QOjNW(APhP(OFu&UlW zxBdtqPogm5i6vDcw8F+MuHc!g(rw1PkSl?^Hr?;wsOom6OIOaW_Bbw6iCZ!6P_9a; zR_)fDF}E{GV9F1ZdD1;`+m)EPve9v@RaQHE*9bEgTMDC1nH$q3V$)XIjuw^M9rxc> zy>#!=)Z#X`!x@b3V1wQTtQ{Wh!{FLT^xHVpxl=1S0%3@2MlYxTOaq4l%3>p zWlCDEoRdphydmdCURnRrw3TkJDo;K6%EnYlla){)+$%WlcFK&z9C9ifr^$oHZFK?k zdwHvP7Uo|6>jduh0ekJ8X>Rz{!H3H+TcmMWO?6zkxbwhR7<_ZD7B;$KbXT-N>MFN# z?gN_5fIuckBNt@>0*KQ_wi^S7%f_WiIJO*`A*t4quTE*I2`ihevh3gj3r=i6@uV1= zMz}OW#$KK#rnr=&R3$nkiK-F-<62w5GVdO zhFqyk#Y%Chr*P9Er%$P&ZN&dpL29BjiP5-t{3Xl>0Mg)u)o*`aX*(BNpekCMZ>>P+smHHCf;0oJs%t@E;GC@oiP0#; zLu|-zpV}PJR2Gy_K>7GbJ61U+8?I8U$o|jI^Ch! z)>CO-Gm4CQg}tiTjjDESzK>Ve%HftJp-)->=FYlh`dz8k67OzDV}PnVyD?O+$@hOv zYz!plqsg)tGfAvrg@WF(+;khUUE(R_DfJlTtgc)IcjEf52rwx z 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 literal 0 HcmV?d00001 diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll.meta b/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll.meta new file mode 100644 index 00000000..e5bfbde6 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 592cfd036a2c941f9ad2da0e1eb567ba +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll b/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll new file mode 100644 index 0000000000000000000000000000000000000000..021473d3a79640e7c63bab11ee44dd2896b96f88 GIT binary patch literal 117248 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 Qg^qj*>Hq)zpQFHk1JV`rTmS$7 literal 0 HcmV?d00001 diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll.meta b/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll.meta new file mode 100644 index 00000000..587aaf72 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b94960ef1b252403380dd890e1c05761 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/LICENSE b/popcorn/Assets/ExternalDependencyManager/Editor/LICENSE new file mode 100644 index 00000000..6258cc47 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/LICENSE @@ -0,0 +1,245 @@ +Copyright (C) 2014 Google Inc. + + 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. + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. + +==================================================================================================== +This package uses MiniJSON + +Copyright (c) 2013 Calvin Rien + +Based on the JSON parser by Patrick van Bergen +http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + +Simplified it so that it doesn't throw exceptions +and can be used in Unity iPhone with maximum code stripping. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/LICENSE.meta b/popcorn/Assets/ExternalDependencyManager/Editor/LICENSE.meta new file mode 100644 index 00000000..37bc43c5 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/LICENSE.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 807495fed00f447198f5a6bc6a416c69 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/README.md b/popcorn/Assets/ExternalDependencyManager/Editor/README.md new file mode 100644 index 00000000..cbc98e19 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/README.md @@ -0,0 +1,768 @@ +External Dependency Manager for Unity +======== + +# Overview + +The External Dependency Manager for Unity (EDM4U) +(formerly Play Services Resolver / Jar Resolver) is intended to be used by any +Unity plugin that requires: + + * Android specific libraries (e.g + [AARs](https://developer.android.com/studio/projects/android-library.html)). + * iOS [CocoaPods](https://cocoapods.org/). + * Version management of transitive dependencies. + * Management of Package Manager (PM) Registries. + +Updated releases are available on +[GitHub](https://github.com/googlesamples/unity-jar-resolver) + +# Background + +Many Unity plugins have dependencies upon Android specific libraries, iOS +CocoaPods, and sometimes have transitive dependencies upon other Unity plugins. +This causes the following problems: + + * Integrating platform specific (e.g Android and iOS) libraries within a + Unity project can be complex and a burden on a Unity plugin maintainer. + * The process of resolving conflicting dependencies on platform specific + libraries is pushed to the developer attempting to use a Unity plugin. + The developer trying to use you plugin is very likely to give up when + faced with Android or iOS specific build errors. + * The process of resolving conflicting Unity plugins (due to shared Unity + plugin components) is pushed to the developer attempting to use your Unity + plugin. In an effort to resolve conflicts, the developer will very likely + attempt to resolve problems by deleting random files in your plugin, + report bugs when that doesn't work and finally give up. + +EDM provides solutions for each of these problems. + +## Android Dependency Management + +The *Android Resolver* component of this plugin will download and integrate +Android library dependencies and handle any conflicts between plugins that share +the same dependencies. + +Without the Android Resolver, typically Unity plugins bundle their AAR and +JAR dependencies, e.g. a Unity plugin `SomePlugin` that requires the Google +Play Games Android library would redistribute the library and its transitive +dependencies in the folder `SomePlugin/Android/`. When a user imports +`SomeOtherPlugin` that includes the same libraries (potentially at different +versions) in `SomeOtherPlugin/Android/`, the developer using `SomePlugin` and +`SomeOtherPlugin` will see an error when building for Android that can be hard +to interpret. + +Using the Android Resolver to manage Android library dependencies: + + * Solves Android library conflicts between plugins. + * Handles all of the various processing steps required to use Android + libraries (AARs, JARs) in Unity 4.x and above projects. Almost all + versions of Unity have - at best - partial support for AARs. + * (Experimental) Supports minification of included Java components without + exporting a project. + +## iOS Dependency Management + +The *iOS Resolver* component of this plugin integrates with +[CocoaPods](https://cocoapods.org/) to download and integrate iOS libraries +and frameworks into the Xcode project Unity generates when building for iOS. +Using CocoaPods allows multiple plugins to utilize shared components without +forcing developers to fix either duplicate or incompatible versions of +libraries included through multiple Unity plugins in their project. + +## Package Manager Registry Setup + +The [Package Manager](https://docs.unity3d.com/Manual/Packages.html) +(PM) makes use of [NPM](https://www.npmjs.com/) registry servers for package +hosting and provides ways to discover, install, upgrade and uninstall packages. +This makes it easier for developers to manage plugins within their projects. + +However, installing additional package registries requires a few manual steps +that can potentially be error prone. The *Package Manager Resolver* +component of this plugin integrates with +[PM](https://docs.unity3d.com/Manual/Packages.html) to provide a way to +auto-install PM package registries when a `.unitypackage` is installed which +allows plugin maintainers to ship a `.unitypackage` that can provide access +to their own PM registry server to make it easier for developers to +manage their plugins. + +## Unity Plugin Version Management + +Finally, the *Version Handler* component of this plugin simplifies the process +of managing transitive dependencies of Unity plugins and each plugin's upgrade +process. + +For example, without the Version Handler plugin, if: + + * Unity plugin `SomePlugin` includes `EDM4U` plugin at + version 1.1. + * Unity plugin `SomeOtherPlugin` includes `EDM4U` + plugin at version 1.2. + +The version of `EDM4U` included in the developer's project depends upon the +order the developer imports `SomePlugin` or `SomeOtherPlugin`. + +This results in: + + * `EDM4U` at version 1.2, if `SomePlugin` is imported then `SomeOtherPlugin` + is imported. + * `EDM4U` at version 1.1, if `SomeOtherPlugin` is imported then + `SomePlugin` is imported. + +The Version Handler solves the problem of managing transitive dependencies by: + + * Specifying a set of packaging requirements that enable a plugin at + different versions to be imported into a Unity project. + * Providing activation logic that selects the latest version of a plugin + within a project. + +When using the Version Handler to manage `EDM4U` included in `SomePlugin` and +`SomeOtherPlugin`, from the prior example, version 1.2 will always be the +version activated in a developer's Unity project. + +Plugin creators are encouraged to adopt this library to ease integration for +their customers. For more information about integrating EDM4U +into your own plugin, see the [Plugin Redistribution](#plugin-redistribution) +section of this document. + +# Analytics + +The External Dependency Manager for Unity plugin by default logs usage to Google +Analytics. The purpose of the logging is to quantitatively measure the usage of +functionality, to gather reports on integration failures and to inform future +improvements to the developer experience of the External Dependency Manager +plugin. Note that the analytics collected are limited to the scope of the EDM4U +plugin’s usage. + +For details of what is logged, please refer to the usage of +`EditorMeasurement.Report()` in the source code. + +# Requirements + +The *Android Resolver* and *iOS Resolver* components of the plugin only work +with Unity version 4.6.8 or higher. + +The *Version Handler* component only works with Unity 5.x or higher as it +depends upon the `PluginImporter` UnityEditor API. + +The *Package Manager Resolver* component only works with +Unity 2018.4 or above, when +[scoped registry](https://docs.unity3d.com/Manual/upm-scoped.html) +support was added to the Package Manager. + +# Getting Started + +Before you import EDM4U into your plugin project, you first +need to consider whether you intend to *redistribute* `EDM4U` +along with your own plugin. + +## Plugin Redistribution + +If you're a plugin maintainer, redistributing `EDM4U` inside your own plugin +will ease the integration process for your users, by resolving dependency +conflicts between your plugin and other plugins in a user's project. + +If you wish to redistribute `EDM4U` inside your plugin, +you **must** follow these steps when importing the +`external-dependency-manager-*.unitypackage`, and when exporting your own plugin +package: + + 1. Import the `external-dependency-manager-*.unitypackage` into your plugin + project by + [running Unity from the command line](https://docs.unity3d.com/Manual/CommandLineArguments.html), ensuring that + you add the `-gvh_disable` option. + 1. Export your plugin by [running Unity from the command line](https://docs.unity3d.com/Manual/CommandLineArguments.html), ensuring that + you: + - Include the contents of the `Assets/PlayServicesResolver` and + `Assets/ExternalDependencyManager` directory. + - Add the `-gvh_disable` option. + +You **must** specify the `-gvh_disable` option in order for the Version +Handler to work correctly! + +For example, the following command will import the +`external-dependency-manager-1.2.46.0.unitypackage` into the project +`MyPluginProject` and export the entire Assets folder to +`MyPlugin.unitypackage`: + +``` +Unity -gvh_disable \ + -batchmode \ + -importPackage external-dependency-manager-1.2.46.0.unitypackage \ + -projectPath MyPluginProject \ + -exportPackage Assets MyPlugin.unitypackage \ + -quit +``` + +### Background + +The *Version Handler* component relies upon deferring the load of editor DLLs +so that it can run first and determine the latest version of a plugin component +to activate. The build of `EDM4U` plugin has Unity asset metadata that is +configured so that the editor components are not initially enabled when it's +imported into a Unity project. To maintain this configuration when importing +the `external-dependency-manager.unitypackage` into a Unity plugin project, you +*must* specify the command line option `-gvh_disable` which will prevent the +Version Handler component from running and changing the Unity asset metadata. + +# Android Resolver Usage + +The Android Resolver copies specified dependencies from local or remote Maven +repositories into the Unity project when a user selects Android as the build +target in the Unity editor. + + 1. Add the `external-dependency-manager-*.unitypackage` to your plugin + project (assuming you are developing a plugin). If you are redistributing + EDM4U with your plugin, you **must** follow the + import steps in the [Getting Started](#getting-started) section! + + 2. Copy and rename the + [SampleDependencies.xml](https://github.com/googlesamples/unity-jar-resolver/blob/master/sample/Assets/ExternalDependencyManager/Editor/SampleDependencies.xml) + file into your plugin and add the dependencies your plugin requires. + + The XML file just needs to be under an `Editor` directory and match the + name `*Dependencies.xml`. For example, + `MyPlugin/Editor/MyPluginDependencies.xml`. + + 3. Follow the steps in the [Getting Started](#getting-started) + section when you are exporting your plugin package. + +For example, to add the Google Play Games library +(`com.google.android.gms:play-services-games` package) at version `9.8.0` to +the set of a plugin's Android dependencies: + +``` + + + + + extra-google-m2repository + + + + +``` + +The version specification (last component) supports: + + * Specific versions e.g `9.8.0` + * Partial matches e.g `9.8.+` would match 9.8.0, 9.8.1 etc. choosing the most + recent version. + * Latest version using `LATEST` or `+`. We do *not* recommend using this + unless you're 100% sure the library you depend upon will not break your + Unity plugin in future. + +The above example specifies the dependency as a component of the Android SDK +manager such that the Android SDK manager will be executed to install the +package if it's not found. If your Android dependency is located on Maven +central it's possible to specify the package simply using the `androidPackage` +element: + +``` + + + + + +``` + +## Auto-resolution + +By default the Android Resolver automatically monitors the dependencies you have +specified and the `Plugins/Android` folder of your Unity project. The +resolution process runs when the specified dependencies are not present in your +project. + +The *auto-resolution* process can be disabled via the +`Assets > External Dependency Manager > Android Resolver > Settings` menu. + +Manual resolution can be performed using the following menu options: + + * `Assets > External Dependency Manager > Android Resolver > Resolve` + * `Assets > External Dependency Manager > Android Resolver > Force Resolve` + +## Deleting libraries + +Resolved packages are tracked via asset labels by the Android Resolver. +They can easily be deleted using the +`Assets > External Dependency Manager > Android Resolver > Delete Resolved Libraries` +menu item. + +## Android Manifest Variable Processing + +Some AAR files (for example play-services-measurement) contain variables that +are processed by the Android Gradle plugin. Unfortunately, Unity does not +perform the same processing when using Unity's Internal Build System, so the +Android Resolver plugin handles known cases of this variable substitution +by exploding the AAR into a folder and replacing `${applicationId}` with the +`bundleID`. + +Disabling AAR explosion and therefore Android manifest processing can be done +via the `Assets > External Dependency Manager > Android Resolver > Settings` +menu. You may want to disable explosion of AARs if you're exporting a project +to be built with Gradle / Android Studio. + +## ABI Stripping + +Some AAR files contain native libraries (.so files) for each ABI supported +by Android. Unfortunately, when targeting a single ABI (e.g x86), Unity does +not strip native libraries for unused ABIs. To strip unused ABIs, the Android +Resolver plugin explodes an AAR into a folder and removes unused ABIs to +reduce the built APK size. Furthermore, if native libraries are not stripped +from an APK (e.g you have a mix of Unity's x86 library and some armeabi-v7a +libraries) Android may attempt to load the wrong library for the current +runtime ABI completely breaking your plugin when targeting some architectures. + +AAR explosion and therefore ABI stripping can be disabled via the +`Assets > External Dependency Manager > Android Resolver > Settings` menu. +You may want to disable explosion of AARs if you're exporting a project to be +built with Gradle / Android Studio. + +## Resolution Strategies + +By default the Android Resolver will use Gradle to download dependencies prior +to integrating them into a Unity project. This works with Unity's internal +build system and Gradle / Android Studio project export. + +It's possible to change the resolution strategy via the +`Assets > External Dependency Manager > Android Resolver > Settings` menu. + +### Download Artifacts with Gradle + +Using the default resolution strategy, the Android resolver executes the +following operations: + + - Remove the result of previous Android resolutions. + e.g Delete all files and directories labeled with "gpsr" under + `Plugins/Android` from the project. + - Collect the set of Android dependencies (libraries) specified by a + project's `*Dependencies.xml` files. + - Run `download_artifacts.gradle` with Gradle to resolve conflicts and, + if successful, download the set of resolved Android libraries (AARs, JARs). + - Process each AAR / JAR so that it can be used with the currently selected + Unity build system (e.g Internal vs. Gradle, Export vs. No Export). + This involves patching each reference to `applicationId` in the + AndroidManifest.xml with the project's bundle ID. This means resolution + must be run if the bundle ID is changed again. + - Move the processed AARs to `Plugins/Android` so they will be included when + Unity invokes the Android build. + +### Integrate into mainTemplate.gradle + +Unity 5.6 introduced support for customizing the `build.gradle` used to build +Unity projects with Gradle. When the *Patch mainTemplate.gradle* setting is +enabled, rather than downloading artifacts before the build, Android resolution +results in the execution of the following operations: + + - Remove the result of previous Android resolutions. + e.g Delete all files and directories labeled with "gpsr" under + `Plugins/Android` from the project and remove sections delimited with + `// Android Resolver * Start` and `// Android Resolver * End` lines. + - Collect the set of Android dependencies (libraries) specified by a + project's `*Dependencies.xml` files. + - Rename any `.srcaar` files in the build to `.aar` and exclude them from + being included directly by Unity in the Android build as + `mainTemplate.gradle` will be patched to include them instead from their + local maven repositories. + - Inject the required Gradle repositories into `mainTemplate.gradle` at the + line matching the pattern + `.*apply plugin: 'com\.android\.(application|library)'.*` or the section + starting at the line `// Android Resolver Repos Start`. + If you want to control the injection point in the file, the section + delimited by the lines `// Android Resolver Repos Start` and + `// Android Resolver Repos End` should be placed in the global scope + before the `dependencies` section. + - Inject the required Android dependencies (libraries) into + `mainTemplate.gradle` at the line matching the pattern `***DEPS***` or + the section starting at the line `// Android Resolver Dependencies Start`. + If you want to control the injection point in the file, the section + delimited by the lines `// Android Resolver Dependencies Start` and + `// Android Resolver Dependencies End` should be placed in the + `dependencies` section. + - Inject the packaging options logic, which excludes architecture specific + libraries based upon the selected build target, into `mainTemplate.gradle` + at the line matching the pattern `android +{` or the section starting at + the line `// Android Resolver Exclusions Start`. + If you want to control the injection point in the file, the section + delimited by the lines `// Android Resolver Exclusions Start` and + `// Android Resolver Exclusions End` should be placed in the global + scope before the `android` section. + +## Dependency Tracking + +The Android Resolver creates the +`ProjectSettings/AndroidResolverDependencies.xml` to quickly determine the set +of resolved dependencies in a project. This is used by the auto-resolution +process to only run the expensive resolution process when necessary. + +## Displaying Dependencies + +It's possible to display the set of dependencies the Android Resolver +would download and process in your project via the +`Assets > External Dependency Manager > Android Resolver > Display Libraries` +menu item. + +# iOS Resolver Usage + +The iOS resolver component of this plugin manages +[CocoaPods](https://cocoapods.org/). A CocoaPods `Podfile` is generated and +the `pod` tool is executed as a post build process step to add dependencies +to the Xcode project exported by Unity. + +Dependencies for iOS are added by referring to CocoaPods. + + 1. Add the `external-dependency-manager-*.unitypackage` to your plugin + project (assuming you are developing a plugin). If you are redistributing + EDM4U with your plugin, you **must** follow the + import steps in the [Getting Started](#getting-started) section! + + 2. Copy and rename the + [SampleDependencies.xml](https://github.com/googlesamples/unity-jar-resolver/blob/master/sample/Assets/ExternalDependencyManager/Editor/SampleDependencies.xml) + file into your plugin and add the dependencies your plugin requires. + + The XML file just needs to be under an `Editor` directory and match the + name `*Dependencies.xml`. For example, + `MyPlugin/Editor/MyPluginDependencies.xml`. + + 3. Follow the steps in the [Getting Started](#getting-started) + section when you are exporting your plugin package. + +For example, to add the AdMob pod, version 7.0 or greater with bitcode enabled: + +``` + + + + + +``` + +## Integration Strategies + +The `CocoaPods` are either: + * Downloaded and injected into the Xcode project file directly, rather than + creating a separate xcworkspace. We call this `Xcode project` integration. + * If the Unity version supports opening a xcworkspace file, the `pod` tool + is used as intended to generate a xcworkspace which references the + CocoaPods. We call this `Xcode workspace` integration. + +The resolution strategy can be changed via the +`Assets > External Dependency Manager > iOS Resolver > Settings` menu. + +### Appending text to generated Podfile +In order to modify the generated Podfile you can create a script like this: +``` +using System.IO; +public class PostProcessIOS : MonoBehaviour { +[PostProcessBuildAttribute(45)]//must be between 40 and 50 to ensure that it's not overriden by Podfile generation (40) and that it's added before "pod install" (50) +private static void PostProcessBuild_iOS(BuildTarget target, string buildPath) +{ + if (target == BuildTarget.iOS) + { + + using (StreamWriter sw = File.AppendText(buildPath + "/Podfile")) + { + //in this example I'm adding an app extension + sw.WriteLine("\ntarget 'NSExtension' do\n pod 'Firebase/Messaging', '6.6.0'\nend"); + } + } +} +``` + +# Package Manager Resolver Usage + +Adding registries to the +[Package Manager](https://docs.unity3d.com/Manual/Packages.html) +(PM) is a manual process. The Package Manager Resolver (PMR) component +of this plugin makes it easy for plugin maintainers to distribute new PM +registry servers and easy for plugin users to manage PM registry servers. + +## Adding Registries + + 1. Add the `external-dependency-manager-*.unitypackage` to your plugin + project (assuming you are developing a plugin). If you are redistributing + EDM4U with your plugin, you **must** follow the + import steps in the [Getting Started](#getting-started) section! + + 2. Copy and rename the + [SampleRegistries.xml](https://github.com/googlesamples/unity-jar-resolver/blob/master/sample/Assets/ExternalDependencyManager/Editor/sample/Assets/ExternalDependencyManager/Editor/SampleRegistries.xml) + file into your plugin and add the registries your plugin requires. + + The XML file just needs to be under an `Editor` directory and match the + name `*Registries.xml` or labeled with `gumpr_registries`. For example, + `MyPlugin/Editor/MyPluginRegistries.xml`. + + 3. Follow the steps in the [Getting Started](#getting-started) + section when you are exporting your plugin package. + +For example, to add a registry for plugins in the scope `com.coolstuff`: + +``` + + + + com.coolstuff + + + +``` + +When PMR is loaded it will prompt the developer to add the registry to their +project if it isn't already present in the `Packages/manifest.json` file. + +For more information, see Unity's documentation on +[scoped package registries](https://docs.unity3d.com/Manual/upm-scoped.html). + +## Managing Registries + +It's possible to add and remove registries that are specified via PMR +XML configuration files via the following menu options: + +* `Assets > External Dependency Manager > Package Manager Resolver > + Add Registries` will prompt the user with a window which allows them to + add registries discovered in the project to the Package Manager. +* `Assets > External Dependency Manager > Package Manager Resolver > + Remove Registries` will prompt the user with a window which allows them to + remove registries discovered in the project from the Package Manager. +* `Assets > External Dependency Manager > Package Manager Resolver > + Modify Registries` will prompt the user with a window which allows them to + add or remove registries discovered in the project. + +## Migration + +PMR can migrate Version Handler packages installed in the `Assets` folder +to PM packages. This requires the plugins to implement the following: + +* `.unitypackage` must include a Version Handler manifests that describes + the components of the plugin. If the plugin has no dependencies + the manifest would just include the files in the plugin. +* The PM package JSON provided by the registry must include a keyword + (in the `versions.VERSION.keyword` list) that maps the PM package + to a Version Handler package using the format + `vh-name:VERSION_HANDLER_MANIFEST_NAME` where `VERSION_HANDLER_MANIFEST_NAME` + is the name of the manifest defined in the `.unitypackage`. For + more information see the description of the `gvhp_manifestname` asset label + in the *Version Handler Usage* section. + +When using the `Assets > External Dependency Manager > +Package Manager Resolver > Migrate Packages` menu option, PMR then +will: + +* List all Version Handler manager packages in the project. +* Search all available packages in the PM registries and fetch keywords + associated with each package parsing the Version Handler manifest names + for each package. +* Map each installed Version Handler package to a PM package. +* Prompt the user to migrate the discovered packages. +* Perform package migration for all selected packages if the user clicks + the `Apply` button. + +## Configuration + +PMR can be configured via the `Assets > External Dependency Manager > +Package Manager Resolver > Settings` menu option: + +* `Add package registries` when enabled, when the plugin loads or registry + configuration files change, this will prompt the user to add registries + that are not present in the Package Manager. +* `Prompt to add package registries` will cause a developer to be prompted + with a window that will ask for confirmation before adding registries. + When this is disabled registries are added silently to the project. +* `Prompt to migrate packages` will cause a developer to be prompted + with a window that will ask for confirmation before migrating packages + installed in the `Assets` directory to PM packages. +* `Enable Analytics Reporting` when enabled, reports the use of the plugin + to the developers so they can make imrpovements. +* `Verbose logging` when enabled prints debug information to the console + which can be useful when filing bug reports. + +# Version Handler Usage + +The Version Handler component of this plugin manages: + +* Shared Unity plugin dependencies. +* Upgrading Unity plugins by cleaning up old files from previous versions. +* Uninstallation of plugins that are distributed with manifest files. +* Restoration of plugin assets to their original install locations if assets + are tagged with the `exportpath` label. + +Since the Version Handler needs to modify Unity asset metadata (`.meta` files), +to enable / disable components, rename and delete asset files it does not +work with Package Manager installed packages. It's still possible to +include EDM4U in Package Manager packages, the Version Handler component +simply won't do anything to PM plugins in this case. + +## Using Version Handler Managed Plugins + +If a plugin is imported at multiple different versions into a project, if +the Version Handler is enabled, it will automatically check all managed +assets to determine the set of assets that are out of date and assets that +should be removed. To disable automatic checking managed assets disable +the `Enable version management` option in the +`Assets > External Dependency Manager > Version Handler > Settings` menu. + +If version management is disabled, it's possible to check managed assets +manually using the +`Assets > External Dependency Manager > Version Handler > Update` menu option. + +### Listing Managed Plugins + +Plugins managed by the Version Handler, those that ship with manifest files, +can displayed using the `Assets > External Dependency Manager > +Version Handler > Display Managed Packages` menu option. The list of plugins +are written to the console window along with the set of files used by each +plugin. + +### Uninstalling Managed Plugins + +Plugins managed by the Version Handler, those that ship with manifest files, +can be removed using the `Assets > External Dependency Manager > +Version Handler > Uninstall Managed Packages` menu option. This operation +will display a window that allows a developer to select a set of plugins to +remove which will remove all files owned by each plugin excluding those that +are in use by other installed plugins. + +Files managed by the Version Handler, those labeled with the `gvh` asset label, +can be checked to see whether anything needs to be upgraded, disabled or +removed using the `Assets > External Dependency Manager > +Version Handler > Update` menu option. + +### Restore Install Paths + +Some developers move assets around in their project which can make it +harder for plugin maintainers to debug issues if this breaks Unity's +[special folders](https://docs.unity3d.com/Manual/SpecialFolders.html) rules. +If assets are labeled with their original install / export path +(see `gvhp_exportpath` below), Version Handler can restore assets to their +original locations when using the `Assets > External Dependency Manager > +Version Handler > Move Files To Install Locations` menu option. + +### Settings + +Some behavior of the Version Handler can be configured via the +`Assets > External Dependency Manager > Version Handler > Settings` menu +option. + +* `Enable version management` controls whether the plugin should automatically + check asset versions and apply changes. If this is disabled the process + should be run manually when installing or upgrading managed plugins using + `Assets > External Dependency Manager > Version Handler > Update`. +* `Rename to canonical filenames` is a legacy option that will rename files to + remove version numbers and other labels from filenames. +* `Prompt for obsolete file deletion` enables the display of a window when + obsolete files are deleted allowing the developer to select which files to + delete and those to keep. +* `Allow disabling files via renaming` controls whether obsolete or disabled + files should be disabled by renaming them to `myfilename_DISABLED`. + Renaming to disable files is required in some scenarios where Unity doesn't + support removing files from the build via the PluginImporter. +* `Enable Analytics Reporting` enables / disables usage reporting to plugin + developers to improve the product. +* `Verbose logging` enables _very_ noisy log output that is useful for + debugging while filing a bug report or building a new managed plugin. +* `Use project settings` saves settings for the plugin in the project rather + than system-wide. + +## Redistributing a Managed Plugin + +The Version Handler employs a couple of methods for managing version +selection, upgrade and removal of plugins. + +* Each plugin can ship with a manifest file that lists the files it includes. + This makes it possible for Version Handler to calculate the difference + in assets between the most recent release of a plugin and the previous + release installed in a project. If a files are removed the Version Handler + will prompt the user to clean up obsolete files. +* Plugins can ship using assets with unique names, unique GUIDs and version + number labels. Version numbers can be attached to assets using labels or + added to the filename (e.g `myfile.txt` would be `myfile_version-x.y.z.txt). + This allows the Version Handler to determine which set of files are the + same file at different versions, select the most recent version and prompt + the developer to clean up old versions. + +Unity plugins can be managed by the Version Handler using the following steps: + + 1. Add the `gvh` asset label to each asset (file) you want Version Handler + to manage. + 1. Add the `gvh_version-VERSION` label to each asset where `VERSION` is the + version of the plugin you're releasing (e.g 1.2.3). + 1. Add the `gvhp_exportpath-PATH` label to each asset where `PATH` is the + export path of the file when the `.unitypackage` is created. This is + used to track files if they're moved around in a project by developers. + 1. Optional: Add `gvh_targets-editor` label to each editor DLL in your + plugin and disable `editor` as a target platform for the DLL. + The Version Handler will enable the most recent version of this DLL when + the plugin is imported. + 1. Optional: If your plugin is included in other Unity plugins, you should + add the version number to each filename and change the GUID of each asset. + This allows multiple versions of your plugin to be imported into a Unity + project, with the Version Handler component activating only the most + recent version. + 1. Create a manifest text file named `MY_UNIQUE_PLUGIN_NAME_VERSION.txt` + that lists all the files in your plugin relative to the project root. + Then add the `gvh_manifest` label to the asset to indicate this file is + a plugin manifest. + 1. Optional: Add a `gvhp_manifestname-NAME` label to your manifest file + to provide a human readable name for your package. If this isn't provided + the name of the manifest file will be used as the package name. + NAME can match the pattern `[0-9]+[a-zA-Z -]' where a leading integer + will set the priority of the name where `0` is the highest priority + and preferably used as the display name. The lowest value (i.e highest + priority name) will be used as the display name and all other specified + names will be aliases of the display name. Aliases can refer to previous + names of the package allowing renaming across published versions. + 1. Redistribute EDM4U Unity plugin with your plugin. + See the [Plugin Redistribution](#plugin-redistribution) for the details. + +If you follow these steps: + + * When users import a newer version of your plugin, files referenced by the + older version's manifest are cleaned up. + * The latest version of the plugin will be selected when users import + multiple packages that include your plugin, assuming the steps in + [Plugin Redistribution](#plugin-redistribution) are followed. + +# Building from Source + +To build this plugin from source you need the following tools installed: + * Unity (with iOS and Android modules installed) + +You can build the plugin by running the following from your shell +(Linux / OSX): + +``` +./gradlew build +``` + +or Windows: + +``` +./gradlew.bat build +``` + +# Releasing + +Each time a new build of this plugin is checked into the source tree you +need to do the following: + + * Bump the plugin version variable `pluginVersion` in `build.gradle` + * Update `CHANGELOG.md` with the new version number and changes included in + the release. + * Build the release using `./gradlew release` which performs the following: + * Updates `external-dependency-manager-*.unitypackage` + * Copies the unpacked plugin to the `exploded` directory. + * Updates template metadata files in the `plugin` directory. + The GUIDs of all asset metadata is modified due to the version number + change. Each file within the plugin is versioned to allow multiple + versions of the plugin to be imported into a Unity project which allows + the most recent version to be activated by the Version Handler + component. + * Create release commit using `./gradlew gitCreateReleaseCommit` which + performs `git commit -a -m "description from CHANGELOG.md"` + * Once the release commit is merge, tag the release using + `./gradlew gitTagRelease` which performs the following: + * `git tag -a pluginVersion -m "version RELEASE"` to tag the release. + * Update tags on remote branch using `git push --tag REMOTE HEAD:master` diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/README.md.meta b/popcorn/Assets/ExternalDependencyManager/Editor/README.md.meta new file mode 100644 index 00000000..fb6594e7 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 046625c64f6614014b29265dc01461c1 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt b/popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt new file mode 100644 index 00000000..9ced6bc8 --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt @@ -0,0 +1,13 @@ +Assets/ExternalDependencyManager/Editor/CHANGELOG.md +Assets/ExternalDependencyManager/Editor/Google.IOSResolver_v1.2.164.dll +Assets/ExternalDependencyManager/Editor/Google.IOSResolver_v1.2.164.dll.mdb +Assets/ExternalDependencyManager/Editor/Google.JarResolver_v1.2.164.dll +Assets/ExternalDependencyManager/Editor/Google.JarResolver_v1.2.164.dll.mdb +Assets/ExternalDependencyManager/Editor/Google.PackageManagerResolver_v1.2.164.dll +Assets/ExternalDependencyManager/Editor/Google.PackageManagerResolver_v1.2.164.dll.mdb +Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll +Assets/ExternalDependencyManager/Editor/Google.VersionHandler.dll.mdb +Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll +Assets/ExternalDependencyManager/Editor/Google.VersionHandlerImpl_v1.2.164.dll.mdb +Assets/ExternalDependencyManager/Editor/LICENSE +Assets/ExternalDependencyManager/Editor/README.md diff --git a/popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt.meta b/popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt.meta new file mode 100644 index 00000000..fd432a3b --- /dev/null +++ b/popcorn/Assets/ExternalDependencyManager/Editor/external-dependency-manager_version-1.2.164_manifest.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 102cb82df4d3147bf867693f29bc5a03 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource.meta b/popcorn/Assets/IronSource.meta new file mode 100644 index 00000000..1553f976 --- /dev/null +++ b/popcorn/Assets/IronSource.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8de7dc06d234246b388388a6760b3342 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/DemoScene.meta b/popcorn/Assets/IronSource/DemoScene.meta new file mode 100644 index 00000000..fe62dcc9 --- /dev/null +++ b/popcorn/Assets/IronSource/DemoScene.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50d65beef4907445493567daa5ba2ecf +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity b/popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity new file mode 100644 index 00000000..a75afcc7 --- /dev/null +++ b/popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity @@ -0,0 +1,546 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &144620207 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 144620210} + - component: {fileID: 144620209} + - component: {fileID: 144620208} + - component: {fileID: 144620211} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &144620208 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144620207} + m_Enabled: 1 +--- !u!20 &144620209 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144620207} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.9487362, g: 0.9613346, b: 0.9811321, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_GateFitMode: 2 + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &144620210 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144620207} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: + - {fileID: 1974370200} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &144620211 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 144620207} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 191f5798a75bd42589f98898505e981f, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!1 &484534187 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 484534191} + - component: {fileID: 484534190} + - component: {fileID: 484534189} + - component: {fileID: 484534188} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &484534188 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 484534187} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &484534189 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 484534187} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!223 &484534190 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 484534187} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &484534191 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 484534187} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &498045477 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 498045479} + - component: {fileID: 498045478} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &498045478 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498045477} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &498045479 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 498045477} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!1 &910476656 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 910476659} + - component: {fileID: 910476658} + - component: {fileID: 910476657} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &910476657 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910476656} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &910476658 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910476656} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &910476659 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 910476656} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 3 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1488306033 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1488306034} + - component: {fileID: 1488306036} + - component: {fileID: 1488306035} + m_Layer: 5 + m_Name: RawImage + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1488306034 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1488306033} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 1974370200} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 1} + m_AnchorMax: {x: 0.5, y: 1} + m_AnchoredPosition: {x: 0, y: -117} + m_SizeDelta: {x: 500, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1488306035 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1488306033} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -98529514, guid: f70555f144d8491a825f0804e09c671c, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 2800000, guid: 5e326581693fd4e0db4c590543c3edc4, type: 3} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 +--- !u!222 &1488306036 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1488306033} + m_CullTransparentMesh: 0 +--- !u!1 &1974370199 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1974370200} + - component: {fileID: 1974370203} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1974370200 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1974370199} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_Children: + - {fileID: 1488306034} + m_Father: {fileID: 144620210} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!223 &1974370203 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1974370199} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 diff --git a/popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity.meta b/popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity.meta new file mode 100644 index 00000000..cc9401e3 --- /dev/null +++ b/popcorn/Assets/IronSource/DemoScene/IronSourceDemo.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ccc0ac08126704384bdda74c26d99797 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs b/popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs new file mode 100644 index 00000000..f1478258 --- /dev/null +++ b/popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs @@ -0,0 +1,427 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System; + + +// Example for IronSource Unity. +public class IronSourceDemoScript : MonoBehaviour +{ + + + + public void Start() + { + +#if UNITY_ANDROID + string appKey = "85460dcd"; +#elif UNITY_IPHONE + string appKey = "8545d445"; +#else + string appKey = "unexpected_platform"; +#endif + + + + Debug.Log("unity-script: IronSource.Agent.validateIntegration"); + IronSource.Agent.validateIntegration(); + + Debug.Log("unity-script: unity version" + IronSource.unityVersion()); + + // SDK init + Debug.Log("unity-script: IronSource.Agent.init"); + IronSource.Agent.init(appKey); + + } + + void OnEnable() + { + + //Add Rewarded Video Events + IronSourceEvents.onRewardedVideoAdOpenedEvent += RewardedVideoAdOpenedEvent; + IronSourceEvents.onRewardedVideoAdClosedEvent += RewardedVideoAdClosedEvent; + IronSourceEvents.onRewardedVideoAvailabilityChangedEvent += RewardedVideoAvailabilityChangedEvent; + IronSourceEvents.onRewardedVideoAdStartedEvent += RewardedVideoAdStartedEvent; + IronSourceEvents.onRewardedVideoAdEndedEvent += RewardedVideoAdEndedEvent; + IronSourceEvents.onRewardedVideoAdRewardedEvent += RewardedVideoAdRewardedEvent; + IronSourceEvents.onRewardedVideoAdShowFailedEvent += RewardedVideoAdShowFailedEvent; + IronSourceEvents.onRewardedVideoAdClickedEvent += RewardedVideoAdClickedEvent; + + //Add Rewarded Video DemandOnly Events + IronSourceEvents.onRewardedVideoAdOpenedDemandOnlyEvent += RewardedVideoAdOpenedDemandOnlyEvent; + IronSourceEvents.onRewardedVideoAdClosedDemandOnlyEvent += RewardedVideoAdClosedDemandOnlyEvent; + IronSourceEvents.onRewardedVideoAdLoadedDemandOnlyEvent += RewardedVideoAdLoadedDemandOnlyEvent; + IronSourceEvents.onRewardedVideoAdRewardedDemandOnlyEvent += RewardedVideoAdRewardedDemandOnlyEvent; + IronSourceEvents.onRewardedVideoAdShowFailedDemandOnlyEvent += RewardedVideoAdShowFailedDemandOnlyEvent; + IronSourceEvents.onRewardedVideoAdClickedDemandOnlyEvent += RewardedVideoAdClickedDemandOnlyEvent; + IronSourceEvents.onRewardedVideoAdLoadFailedDemandOnlyEvent += RewardedVideoAdLoadFailedDemandOnlyEvent; + + + // Add Offerwall Events + IronSourceEvents.onOfferwallClosedEvent += OfferwallClosedEvent; + IronSourceEvents.onOfferwallOpenedEvent += OfferwallOpenedEvent; + IronSourceEvents.onOfferwallShowFailedEvent += OfferwallShowFailedEvent; + IronSourceEvents.onOfferwallAdCreditedEvent += OfferwallAdCreditedEvent; + IronSourceEvents.onGetOfferwallCreditsFailedEvent += GetOfferwallCreditsFailedEvent; + IronSourceEvents.onOfferwallAvailableEvent += OfferwallAvailableEvent; + + + // Add Interstitial Events + IronSourceEvents.onInterstitialAdReadyEvent += InterstitialAdReadyEvent; + IronSourceEvents.onInterstitialAdLoadFailedEvent += InterstitialAdLoadFailedEvent; + IronSourceEvents.onInterstitialAdShowSucceededEvent += InterstitialAdShowSucceededEvent; + IronSourceEvents.onInterstitialAdShowFailedEvent += InterstitialAdShowFailedEvent; + IronSourceEvents.onInterstitialAdClickedEvent += InterstitialAdClickedEvent; + IronSourceEvents.onInterstitialAdOpenedEvent += InterstitialAdOpenedEvent; + IronSourceEvents.onInterstitialAdClosedEvent += InterstitialAdClosedEvent; + + // Add Interstitial DemandOnly Events + IronSourceEvents.onInterstitialAdReadyDemandOnlyEvent += InterstitialAdReadyDemandOnlyEvent; + IronSourceEvents.onInterstitialAdLoadFailedDemandOnlyEvent += InterstitialAdLoadFailedDemandOnlyEvent; + IronSourceEvents.onInterstitialAdShowFailedDemandOnlyEvent += InterstitialAdShowFailedDemandOnlyEvent; + IronSourceEvents.onInterstitialAdClickedDemandOnlyEvent += InterstitialAdClickedDemandOnlyEvent; + IronSourceEvents.onInterstitialAdOpenedDemandOnlyEvent += InterstitialAdOpenedDemandOnlyEvent; + IronSourceEvents.onInterstitialAdClosedDemandOnlyEvent += InterstitialAdClosedDemandOnlyEvent; + + + // Add Banner Events + IronSourceEvents.onBannerAdLoadedEvent += BannerAdLoadedEvent; + IronSourceEvents.onBannerAdLoadFailedEvent += BannerAdLoadFailedEvent; + IronSourceEvents.onBannerAdClickedEvent += BannerAdClickedEvent; + IronSourceEvents.onBannerAdScreenPresentedEvent += BannerAdScreenPresentedEvent; + IronSourceEvents.onBannerAdScreenDismissedEvent += BannerAdScreenDismissedEvent; + IronSourceEvents.onBannerAdLeftApplicationEvent += BannerAdLeftApplicationEvent; + + //Add ImpressionSuccess Event + IronSourceEvents.onImpressionSuccessEvent += ImpressionSuccessEvent; + } + + void OnApplicationPause(bool isPaused) + { + Debug.Log("unity-script: OnApplicationPause = " + isPaused); + IronSource.Agent.onApplicationPause(isPaused); + } + + public void OnGUI() + { + + GUI.backgroundColor = Color.blue; + GUI.skin.button.fontSize = (int)(0.035f * Screen.width); + + + + + + Rect showRewardedVideoButton = new Rect(0.10f * Screen.width, 0.15f * Screen.height, 0.80f * Screen.width, 0.08f * Screen.height); + if (GUI.Button(showRewardedVideoButton, "Show Rewarded Video")) + { + Debug.Log("unity-script: ShowRewardedVideoButtonClicked"); + if (IronSource.Agent.isRewardedVideoAvailable()) + { + IronSource.Agent.showRewardedVideo(); + } + else + { + Debug.Log("unity-script: IronSource.Agent.isRewardedVideoAvailable - False"); + } + } + + + + Rect showOfferwallButton = new Rect(0.10f * Screen.width, 0.25f * Screen.height, 0.80f * Screen.width, 0.08f * Screen.height); + if (GUI.Button(showOfferwallButton, "Show Offerwall")) + { + if (IronSource.Agent.isOfferwallAvailable()) + { + IronSource.Agent.showOfferwall(); + } + else + { + Debug.Log("IronSource.Agent.isOfferwallAvailable - False"); + } + } + + Rect loadInterstitialButton = new Rect(0.10f * Screen.width, 0.35f * Screen.height, 0.35f * Screen.width, 0.08f * Screen.height); + if (GUI.Button(loadInterstitialButton, "Load Interstitial")) + { + Debug.Log("unity-script: LoadInterstitialButtonClicked"); + IronSource.Agent.loadInterstitial(); + } + + Rect showInterstitialButton = new Rect(0.55f * Screen.width, 0.35f * Screen.height, 0.35f * Screen.width, 0.08f * Screen.height); + if (GUI.Button(showInterstitialButton, "Show Interstitial")) + { + Debug.Log("unity-script: ShowInterstitialButtonClicked"); + if (IronSource.Agent.isInterstitialReady()) + { + IronSource.Agent.showInterstitial(); + } + else + { + Debug.Log("unity-script: IronSource.Agent.isInterstitialReady - False"); + } + } + + Rect loadBannerButton = new Rect(0.10f * Screen.width, 0.45f * Screen.height, 0.35f * Screen.width, 0.08f * Screen.height); + if (GUI.Button(loadBannerButton, "Load Banner")) + { + Debug.Log("unity-script: loadBannerButtonClicked"); + IronSource.Agent.loadBanner(IronSourceBannerSize.BANNER, IronSourceBannerPosition.BOTTOM); + } + + Rect destroyBannerButton = new Rect(0.55f * Screen.width, 0.45f * Screen.height, 0.35f * Screen.width, 0.08f * Screen.height); + if (GUI.Button(destroyBannerButton, "Destroy Banner")) + { + Debug.Log("unity-script: loadBannerButtonClicked"); + IronSource.Agent.destroyBanner(); + } + + + + + } + + + #region RewardedAd callback handlers + + void RewardedVideoAvailabilityChangedEvent(bool canShowAd) + { + Debug.Log("unity-script: I got RewardedVideoAvailabilityChangedEvent, value = " + canShowAd); + } + + void RewardedVideoAdOpenedEvent() + { + Debug.Log("unity-script: I got RewardedVideoAdOpenedEvent"); + } + + void RewardedVideoAdRewardedEvent(IronSourcePlacement ssp) + { + Debug.Log("unity-script: I got RewardedVideoAdRewardedEvent, amount = " + ssp.getRewardAmount() + " name = " + ssp.getRewardName()); + + } + + void RewardedVideoAdClosedEvent() + { + Debug.Log("unity-script: I got RewardedVideoAdClosedEvent"); + } + + void RewardedVideoAdStartedEvent() + { + Debug.Log("unity-script: I got RewardedVideoAdStartedEvent"); + } + + void RewardedVideoAdEndedEvent() + { + Debug.Log("unity-script: I got RewardedVideoAdEndedEvent"); + } + + void RewardedVideoAdShowFailedEvent(IronSourceError error) + { + Debug.Log("unity-script: I got RewardedVideoAdShowFailedEvent, code : " + error.getCode() + ", description : " + error.getDescription()); + } + + void RewardedVideoAdClickedEvent(IronSourcePlacement ssp) + { + Debug.Log("unity-script: I got RewardedVideoAdClickedEvent, name = " + ssp.getRewardName()); + } + + /************* RewardedVideo DemandOnly Delegates *************/ + + void RewardedVideoAdLoadedDemandOnlyEvent(string instanceId) + { + + Debug.Log("unity-script: I got RewardedVideoAdLoadedDemandOnlyEvent for instance: " + instanceId); + } + + void RewardedVideoAdLoadFailedDemandOnlyEvent(string instanceId, IronSourceError error) + { + + Debug.Log("unity-script: I got RewardedVideoAdLoadFailedDemandOnlyEvent for instance: " + instanceId + ", code : " + error.getCode() + ", description : " + error.getDescription()); + } + + void RewardedVideoAdOpenedDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got RewardedVideoAdOpenedDemandOnlyEvent for instance: " + instanceId); + } + + void RewardedVideoAdRewardedDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got RewardedVideoAdRewardedDemandOnlyEvent for instance: " + instanceId); + } + + void RewardedVideoAdClosedDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got RewardedVideoAdClosedDemandOnlyEvent for instance: " + instanceId); + } + + void RewardedVideoAdShowFailedDemandOnlyEvent(string instanceId, IronSourceError error) + { + Debug.Log("unity-script: I got RewardedVideoAdShowFailedDemandOnlyEvent for instance: " + instanceId + ", code : " + error.getCode() + ", description : " + error.getDescription()); + } + + void RewardedVideoAdClickedDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got RewardedVideoAdClickedDemandOnlyEvent for instance: " + instanceId); + } + + + #endregion + + + + #region Interstitial callback handlers + + void InterstitialAdReadyEvent() + { + Debug.Log("unity-script: I got InterstitialAdReadyEvent"); + } + + void InterstitialAdLoadFailedEvent(IronSourceError error) + { + Debug.Log("unity-script: I got InterstitialAdLoadFailedEvent, code: " + error.getCode() + ", description : " + error.getDescription()); + } + + void InterstitialAdShowSucceededEvent() + { + Debug.Log("unity-script: I got InterstitialAdShowSucceededEvent"); + } + + void InterstitialAdShowFailedEvent(IronSourceError error) + { + Debug.Log("unity-script: I got InterstitialAdShowFailedEvent, code : " + error.getCode() + ", description : " + error.getDescription()); + } + + void InterstitialAdClickedEvent() + { + Debug.Log("unity-script: I got InterstitialAdClickedEvent"); + } + + void InterstitialAdOpenedEvent() + { + Debug.Log("unity-script: I got InterstitialAdOpenedEvent"); + } + + void InterstitialAdClosedEvent() + { + Debug.Log("unity-script: I got InterstitialAdClosedEvent"); + } + + /************* Interstitial DemandOnly Delegates *************/ + + void InterstitialAdReadyDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got InterstitialAdReadyDemandOnlyEvent for instance: " + instanceId); + } + + void InterstitialAdLoadFailedDemandOnlyEvent(string instanceId, IronSourceError error) + { + Debug.Log("unity-script: I got InterstitialAdLoadFailedDemandOnlyEvent for instance: " + instanceId + ", error code: " + error.getCode() + ",error description : " + error.getDescription()); + } + + void InterstitialAdShowFailedDemandOnlyEvent(string instanceId, IronSourceError error) + { + Debug.Log("unity-script: I got InterstitialAdShowFailedDemandOnlyEvent for instance: " + instanceId + ", error code : " + error.getCode() + ",error description : " + error.getDescription()); + } + + void InterstitialAdClickedDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got InterstitialAdClickedDemandOnlyEvent for instance: " + instanceId); + } + + void InterstitialAdOpenedDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got InterstitialAdOpenedDemandOnlyEvent for instance: " + instanceId); + } + + void InterstitialAdClosedDemandOnlyEvent(string instanceId) + { + Debug.Log("unity-script: I got InterstitialAdClosedDemandOnlyEvent for instance: " + instanceId); + } + + + + + #endregion + + #region Banner callback handlers + + void BannerAdLoadedEvent() + { + Debug.Log("unity-script: I got BannerAdLoadedEvent"); + } + + void BannerAdLoadFailedEvent(IronSourceError error) + { + Debug.Log("unity-script: I got BannerAdLoadFailedEvent, code: " + error.getCode() + ", description : " + error.getDescription()); + } + + void BannerAdClickedEvent() + { + Debug.Log("unity-script: I got BannerAdClickedEvent"); + } + + void BannerAdScreenPresentedEvent() + { + Debug.Log("unity-script: I got BannerAdScreenPresentedEvent"); + } + + void BannerAdScreenDismissedEvent() + { + Debug.Log("unity-script: I got BannerAdScreenDismissedEvent"); + } + + void BannerAdLeftApplicationEvent() + { + Debug.Log("unity-script: I got BannerAdLeftApplicationEvent"); + } + + #endregion + + + #region Offerwall callback handlers + + void OfferwallOpenedEvent() + { + Debug.Log("I got OfferwallOpenedEvent"); + } + + void OfferwallClosedEvent() + { + Debug.Log("I got OfferwallClosedEvent"); + } + + void OfferwallShowFailedEvent(IronSourceError error) + { + Debug.Log("I got OfferwallShowFailedEvent, code : " + error.getCode() + ", description : " + error.getDescription()); + } + + void OfferwallAdCreditedEvent(Dictionary dict) + { + Debug.Log("I got OfferwallAdCreditedEvent, current credits = " + dict["credits"] + " totalCredits = " + dict["totalCredits"]); + + } + + void GetOfferwallCreditsFailedEvent(IronSourceError error) + { + Debug.Log("I got GetOfferwallCreditsFailedEvent, code : " + error.getCode() + ", description : " + error.getDescription()); + } + + void OfferwallAvailableEvent(bool canShowOfferwal) + { + Debug.Log("I got OfferwallAvailableEvent, value = " + canShowOfferwal); + + } + + #endregion + + #region ImpressionSuccess callback handler + + void ImpressionSuccessEvent(IronSourceImpressionData impressionData) + { + Debug.Log("unity - script: I got ImpressionSuccessEvent ToString(): " + impressionData.ToString()); + Debug.Log("unity - script: I got ImpressionSuccessEvent allData: " + impressionData.allData); + } + + #endregion + +} diff --git a/popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs.meta b/popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs.meta new file mode 100644 index 00000000..39100480 --- /dev/null +++ b/popcorn/Assets/IronSource/DemoScene/IronSourceDemoScript.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 191f5798a75bd42589f98898505e981f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/DemoScene/logo_small.png b/popcorn/Assets/IronSource/DemoScene/logo_small.png new file mode 100644 index 0000000000000000000000000000000000000000..6dcdd6358d3c0fcc1fc7b4544d580bc61bddc0d6 GIT binary patch literal 20634 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 Regex.IsMatch (Path.GetFileName (file), "^(?!(IAdapter|IronSource)).+Settings.*$")); + + //Go over all the adapter settings classes, and call their updateProject method + foreach (string file in files) { + string classname = Path.GetFileNameWithoutExtension (file); + + if (!String.IsNullOrEmpty (classname)) { + IAdapterSettings adapter = (IAdapterSettings)Activator.CreateInstance (Type.GetType (currentNamespace + "." + classname)); + adapter.updateProject (buildTarget, projectPath); + } + } + } + } + + Debug.Log ("IronSource build postprocessor finished"); + } + + private static void updateProject (BuildTarget buildTarget, string projectPath) + { + Debug.Log ("IronSource - Update project for IronSource"); + + PBXProject project = new PBXProject (); + project.ReadFromString (File.ReadAllText (projectPath)); + + string targetId; +#if UNITY_2019_3_OR_NEWER + targetId = project.GetUnityMainTargetGuid(); +#else + targetId = project.TargetGuidByName(PBXProject.GetUnityTargetName()); +#endif + + // Required System Frameworks + project.AddFrameworkToProject (targetId, "AdSupport.framework", false); + project.AddFrameworkToProject (targetId, "AudioToolbox.framework", false); + project.AddFrameworkToProject (targetId, "AVFoundation.framework", false); + project.AddFrameworkToProject (targetId, "CoreGraphics.framework", false); + project.AddFrameworkToProject (targetId, "CoreMedia.framework", false); + project.AddFrameworkToProject (targetId, "CoreTelephony.framework", false); + project.AddFrameworkToProject (targetId, "CoreVideo.framework", false); + project.AddFrameworkToProject (targetId, "CFNetwork.framework", false); + project.AddFrameworkToProject (targetId, "Foundation.framework", false); + project.AddFrameworkToProject (targetId, "MobileCoreServices.framework", false); + project.AddFrameworkToProject (targetId, "QuartzCore.framework", false); + project.AddFrameworkToProject (targetId, "Security.framework", false); + project.AddFrameworkToProject (targetId, "StoreKit.framework", false); + project.AddFrameworkToProject (targetId, "SystemConfiguration.framework", false); + project.AddFrameworkToProject (targetId, "WebKit.framework", false); + + + project.AddFileToBuild (targetId, project.AddFile ("usr/lib/libz.tbd", "Frameworks/libz.tbd", PBXSourceTree.Sdk)); + + // Custom Link Flag + project.AddBuildProperty (targetId, "OTHER_LDFLAGS", "-ObjC"); + + File.WriteAllText (projectPath, project.WriteToString ()); + } + } +} +#endif + diff --git a/popcorn/Assets/IronSource/Editor/IronSourceBuildPostprocessor.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceBuildPostprocessor.cs.meta new file mode 100644 index 00000000..4e768d28 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceBuildPostprocessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 160c30613c17c4bc1a9dfcc2b2663ff4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs b/popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs new file mode 100644 index 00000000..cc8b34f3 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs @@ -0,0 +1,558 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; +using IronSourceJSON; +using UnityEditor; +using UnityEngine; +using UnityEngine.Networking; + +public class IronSourceDependenciesManager : EditorWindow +{ + private const string jsonURL = "http://ssa.public.s3.amazonaws.com/Ironsource-Integration-Manager/IronSourceSDKInfo.json"; + private const string ironSourceDownloadDir = "Assets/IronSource/Editor/"; + private const string sdk = "sdk"; + private const string errorMessage = "SDK and adapters data are not available right now. Try again soon."; + private const int Width = 760; + private const int Height = 760; + private const string Android = "Android"; + private const string iOS = "iOS"; + private readonly SortedSet providersSet = new SortedSet(new ProviderInfoComparor()); + private providerInfo ironSourceProviderInfo; + private UnityWebRequest downloadWebClient; + private string messageData; + private IronSourceEditorCoroutines mEditorCoroutines; + + private GUIStyle headerStyle; + private GUIStyle textStyle; + private GUIStyle boldTextStyle; + private readonly GUILayoutOption buttonWidth = GUILayout.Width(90); + + public class providerInfo + { + public Status currentStatues; + public string providerName; + public string currentUnityVersion; + public string latestUnityVersion; + public string downloadURL; + public string displayProviderName; + public bool isNewProvider; + public string fileName; + public Dictionary sdkVersionDic; + + public providerInfo() + { + isNewProvider = false; + fileName = string.Empty; + downloadURL = string.Empty; + currentUnityVersion = "none"; + sdkVersionDic = new Dictionary(); + } + + public enum Status + { + installed = 1, + none = 2, + updated = 3 + } + + public bool GetFromJson(string name, Dictionary dic) + { + providerName = name; + object obj; + + dic.TryGetValue("keyname", out obj); + if (obj != null) + { + this.displayProviderName = obj as string; + } + else this.displayProviderName = providerName; + + dic.TryGetValue("isNewProvider", out obj); + if (obj != null) + { + this.isNewProvider = bool.Parse(obj as string); + } + + //Get Unity versions + if (dic.TryGetValue("Unity", out obj)) + { + Dictionary remoteVersions = obj as Dictionary; + if (remoteVersions != null) + { + if (remoteVersions.TryGetValue("DownloadUrl", out obj)) + { + this.downloadURL = obj as string; + } + if (remoteVersions.TryGetValue("FileName", out obj)) + { + this.fileName = obj as string; + } + if (remoteVersions.TryGetValue("UnityAdapterVersion", out obj)) + { + this.latestUnityVersion = obj as string; + } + } + } + ////Get Android version + if (dic.TryGetValue(Android, out obj)) + { + Dictionary androidVersion = obj as Dictionary; + if (androidVersion != null) + { + androidVersion.TryGetValue("version", out obj); + androidVersion = obj as Dictionary; + if (androidVersion != null) + { + if (androidVersion.TryGetValue(sdk, out obj)) + { + this.sdkVersionDic.Add(Android, obj as string); + } + } + } + } + + //Get iOS version + dic.TryGetValue(iOS, out obj); + Dictionary iosVersion = obj as Dictionary; + if (iosVersion != null) + { + iosVersion.TryGetValue("version", out obj); + iosVersion = obj as Dictionary; + if (iosVersion != null) + { + if (iosVersion.TryGetValue(sdk, out obj)) + { + this.sdkVersionDic.Add(iOS, obj as string); + } + } + } + + currentUnityVersion = GetVersionFromXML(fileName); + + if (currentUnityVersion.Equals("none")) + { + currentStatues = Status.none; + } + + else + { + if (isNewerVersion(currentUnityVersion, latestUnityVersion)) + { + currentStatues = Status.installed; + } + else + { + currentStatues = Status.updated; + } + } + + return true; + } + } + + private static string GetVersionFromXML(string fileName) + { + XmlDocument xmlDoc = new XmlDocument(); + string version = "none"; + try + { + xmlDoc.LoadXml(File.ReadAllText(ironSourceDownloadDir + fileName)); + } + catch (Exception) + { + return version; + } + var unityVersion = xmlDoc.SelectSingleNode("dependencies/unityversion"); + if (unityVersion != null) + { + return (unityVersion.InnerText); + } + File.Delete(ironSourceDownloadDir + fileName); + return version; + } + + private IEnumerator GetVersions() + { + UnityWebRequest unityWebRequest = UnityWebRequest.Get(jsonURL); + var webRequest = unityWebRequest.SendWebRequest(); + + while (!webRequest.isDone) + { + yield return new WaitForSeconds(0.1f); + } + if (!unityWebRequest.isHttpError && !unityWebRequest.isNetworkError) + { + string json = unityWebRequest.downloadHandler.text; + providersSet.Clear(); + ironSourceProviderInfo = new providerInfo(); + Dictionary dic = new Dictionary(); + try + { + dic = Json.Deserialize(json) as Dictionary; + } + + catch (Exception e) + { + Debug.Log("Error getting response " + e.ToString()); + } + if (dic != null && dic.Count != 0) + { + object providersJson; + if (dic.TryGetValue("SDKSInfo", out providersJson)) + { + if (providersJson != null) + { + foreach (var item in providersJson as Dictionary) + { + providerInfo info = new providerInfo(); + if (info.GetFromJson(item.Key, item.Value as Dictionary)) + { + if (item.Key.ToLower().Contains("ironsource")) + { + ironSourceProviderInfo = info; + } + else + { + providersSet.Add(info); + } + } + } + } + } + + if (ironSourceProviderInfo.currentStatues == providerInfo.Status.installed || ironSourceProviderInfo.currentStatues == providerInfo.Status.none) + { + if (dic.TryGetValue("UpdateMessage", out providersJson)) + { + messageData = providersJson.ToString(); + } + } + else + { + if (dic.TryGetValue("LatestMessage", out providersJson)) + { + messageData = providersJson.ToString(); + } + } + } + } + + Repaint(); + } + + private void CancelDownload() + { + // if downloader object is still active + if (downloadWebClient != null) + { + downloadWebClient.Abort(); + return; + } + + if (mEditorCoroutines != null) + { + mEditorCoroutines.StopEditorCoroutine(); + mEditorCoroutines = null; + } + + downloadWebClient = null; + } + + public static void ShowISDependenciesManager() + { + var win = GetWindowWithRect(new Rect(0, 0, Width, Height), true); + win.titleContent = new GUIContent("ironSource Integration Manager"); + win.Focus(); + } + + void Awake() + { + headerStyle = new GUIStyle(EditorStyles.label) + { + fontStyle = FontStyle.Bold, + fontSize = 14, + fixedHeight = 20, + stretchWidth = true, + fixedWidth = Width / 4 + 5, + clipping = TextClipping.Overflow, + alignment = TextAnchor.MiddleLeft + }; + textStyle = new GUIStyle(EditorStyles.label) + { + fontStyle = FontStyle.Normal, + alignment = TextAnchor.MiddleLeft + + }; + boldTextStyle = new GUIStyle(EditorStyles.label) + { + fontStyle = FontStyle.Bold + }; + CancelDownload(); + } + + private void OnEnable() + { + mEditorCoroutines = IronSourceEditorCoroutines.StartEditorCoroutine(GetVersions()); + } + + private void OnDestroy() + { + CancelDownload(); + AssetDatabase.Refresh(); + } + + void DrawProviderItem(providerInfo providerData) + { + if (!providerData.Equals(default(providerInfo))) + { + using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) + { + GUI.enabled = true; + bool isNew = providerData.isNewProvider; + string isNewAddition = isNew ? " - New Network" : string.Empty; + string androidVersion = ""; + string iosVersion = ""; + string tooltipText = "Latest Version: \n " + providerData.providerName + " Adapter Version " + providerData.latestUnityVersion; + if (!providerData.sdkVersionDic.TryGetValue(Android, out androidVersion)) + { + androidVersion = ""; + } + else tooltipText = tooltipText + "\n Android SDK version " + androidVersion; + if (!providerData.sdkVersionDic.TryGetValue(iOS, out iosVersion)) + { + iosVersion = ""; + } + else tooltipText = tooltipText + "\n iOS SDK version " + iosVersion; + + EditorGUILayout.LabelField(providerData.displayProviderName + isNewAddition, isNew ? boldTextStyle : textStyle); + EditorGUILayout.LabelField(providerData.currentUnityVersion, textStyle); + EditorGUILayout.LabelField(providerData.latestUnityVersion, textStyle); + + if (providerData.currentStatues == providerInfo.Status.none) + { + bool btn = GUILayout.Button(new GUIContent + { + text = "Install", + tooltip = tooltipText + }, buttonWidth); + if (btn && downloadWebClient == null) + { + GUI.enabled = true; + IronSourceEditorCoroutines.StartEditorCoroutine(DownloadFile(providerData.downloadURL)); + } + + } + else if (providerData.currentStatues == providerInfo.Status.installed) + { + var btn = GUILayout.Button(new GUIContent + { + text= "Update", + tooltip = tooltipText + } + ,buttonWidth); + if (btn && downloadWebClient == null) + { + GUI.enabled = true; + IronSourceEditorCoroutines.StartEditorCoroutine(DownloadFile(providerData.downloadURL)); + } + } + else + { + GUI.enabled = false; + GUILayout.Button(new GUIContent + { + text = "Updated", + tooltip = tooltipText + }, buttonWidth); + } + GUILayout.Space(5); + GUI.enabled = true; + } + } + } + + void OnGUI() + { + if (ironSourceProviderInfo == null) + { + GUILayout.Label(errorMessage); + return; + } + + GUILayout.Space(10); + using (new EditorGUILayout.VerticalScope("box")) + { + DrawSDKHeader(); + GUILayout.Space(5); + GUILayout.BeginHorizontal(); + DrawProviderItem(ironSourceProviderInfo); + GUILayout.Space(5); + GUILayout.EndHorizontal(); + GUILayout.Space(5); + } + + GUILayout.Space(15); + DrawAdaptersHeader(); + GUILayout.Space(15); + + foreach (var provider in providersSet) + { + DrawProviderItem(provider); + GUILayout.Space(2); + } + GUILayout.Space(30); + if (!string.IsNullOrEmpty(messageData)) + { + using (new EditorGUILayout.VerticalScope("box", GUILayout.ExpandHeight(true))) + { + GUILayout.Space(5); + using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) + { + EditorGUILayout.SelectableLabel(messageData, EditorStyles.textField, GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true)); + } + GUILayout.Space(5); + } + using (new EditorGUILayout.VerticalScope(GUILayout.ExpandHeight(false))) + { + GUILayout.Space(15); + } + } + + } + + private void DrawSDKHeader() + { + using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) + { + EditorGUILayout.LabelField("Current SDK Version", new GUIStyle(EditorStyles.label) + { + fontStyle = FontStyle.Bold, + fontSize = 13, + fixedHeight = 20, + stretchWidth = true, + fixedWidth = Width / 4, + clipping = TextClipping.Overflow, + padding = new RectOffset(Width / 4 + 15, 0, 0, 0) + }); + GUILayout.Space(85); + EditorGUILayout.LabelField("Latest SDK Version", new GUIStyle(EditorStyles.label) + { + fontStyle = FontStyle.Bold, + fontSize = 13, + fixedHeight = 20, + stretchWidth = true, + fixedWidth = Screen.width / 4, + clipping = TextClipping.Overflow, + }); + } + } + + private void DrawAdaptersHeader() + { + using (new EditorGUILayout.HorizontalScope(GUILayout.ExpandWidth(false))) + { + EditorGUILayout.LabelField("Network", headerStyle); + EditorGUILayout.LabelField("Current Adapter Version", headerStyle); + EditorGUILayout.LabelField("Latest Adapter Version", headerStyle); + GUILayout.Space(30); + EditorGUILayout.LabelField("Action", headerStyle); + } + } + + private IEnumerator DownloadFile(string downloadFileUrl) + { + int fileNameIndex = downloadFileUrl.LastIndexOf("/") + 1; + string downloadFileName = downloadFileUrl.Substring(fileNameIndex); + string fileDownloading = string.Format("Downloading {0}", downloadFileName); + string genericFileName = Regex.Replace(downloadFileName, @"_v+(\d\.\d\.\d\.\d|\d\.\d\.\d)", ""); + string path = Path.Combine(ironSourceDownloadDir, genericFileName); + bool isCancelled = false; + downloadWebClient = new UnityWebRequest(downloadFileUrl); + downloadWebClient.downloadHandler = new DownloadHandlerFile(path); + downloadWebClient.SendWebRequest(); + if (!downloadWebClient.isHttpError && !downloadWebClient.isNetworkError) + { + while (!downloadWebClient.isDone) + { + yield return new WaitForSeconds(0.1f); + if (EditorUtility.DisplayCancelableProgressBar("Download Manager", fileDownloading, downloadWebClient.downloadProgress)) + { + if (downloadWebClient.error != null) + { + Debug.LogError(downloadWebClient.error); + } + CancelDownload(); + isCancelled = true; + } + } + } + else + { + Debug.LogError("Error Downloading " + genericFileName + " : " + downloadWebClient.error); + } + + EditorUtility.ClearProgressBar(); + + if (genericFileName.EndsWith(".unitypackage") && !isCancelled) + { + AssetDatabase.ImportPackage(Path.Combine(ironSourceDownloadDir, genericFileName), true); + } + else + { + // in case the download was cancelled, delete the file + if(isCancelled && File.Exists(ironSourceDownloadDir + genericFileName)) + { + File.Delete(ironSourceDownloadDir + genericFileName); + } + + IronSourceEditorCoroutines.StartEditorCoroutine(GetVersions()); + } + + //clean the downloadWebClient object regardless of whether the request succeeded or failed + downloadWebClient.Dispose(); + downloadWebClient = null; + + IronSourceEditorCoroutines.StartEditorCoroutine(GetVersions()); + } + + private static bool isNewerVersion(string current, string latest) + { + bool isNewer = false; + try + { + int[] currentVersion = Array.ConvertAll(current.Split('.'), int.Parse); + int[] remoteVersion = Array.ConvertAll(latest.Split('.'), int.Parse); + int remoteBuild = 0; + int curBuild = 0; + if (currentVersion.Length > 3) + { + curBuild = currentVersion[3]; + } + if (remoteVersion.Length > 3) + { + remoteBuild = remoteVersion[3]; + + } + System.Version cur = new System.Version(currentVersion[0], currentVersion[1], currentVersion[2], curBuild); + System.Version remote = new System.Version(remoteVersion[0], remoteVersion[1], remoteVersion[2], remoteBuild); + isNewer = cur < remote; + } + catch (Exception) + { + + } + return isNewer; + + } + + internal class ProviderInfoComparor : IComparer + { + public int Compare(providerInfo x, providerInfo y) + { + return x.providerName.CompareTo(y.providerName); + } + } +} diff --git a/popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs.meta new file mode 100644 index 00000000..1409f7c1 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceDependenciesManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c6e4d9251bd484b8691739732905761c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs b/popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs new file mode 100644 index 00000000..60e26998 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs @@ -0,0 +1,37 @@ +using UnityEditor; +using System.Collections; + +public class IronSourceEditorCoroutines +{ + readonly IEnumerator mRoutine; + + public static IronSourceEditorCoroutines StartEditorCoroutine( IEnumerator routine) + { + IronSourceEditorCoroutines coroutine = new IronSourceEditorCoroutines(routine); + coroutine.start(); + return coroutine; + } + + IronSourceEditorCoroutines(IEnumerator routine) + { + mRoutine = routine; + } + + void start() + { + EditorApplication.update += update; + } + + void update() + { + if(!mRoutine.MoveNext()) + { + StopEditorCoroutine(); + } + } + + public void StopEditorCoroutine() + { + EditorApplication.update -= update; + } +} diff --git a/popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs.meta new file mode 100644 index 00000000..31c1a992 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceEditorCoroutines.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 001447b23ecb34541b82b7d1874874d9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs b/popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs new file mode 100644 index 00000000..482cc590 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs @@ -0,0 +1,134 @@ +#if UNITY_ANDROID +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Xml.Linq; +using UnityEditor; +using UnityEditor.Build; +#if UNITY_2018_1_OR_NEWER +using UnityEditor.Build.Reporting; +#endif +using UnityEngine; + + +#if UNITY_2018_1_OR_NEWER +public class IronSourceManifestProcessor : IPreprocessBuildWithReport +#else +public class IronSourceManifestProcessor : IPreprocessBuild +#endif +{ + private const string META_APPLICATION_ID = "com.google.android.gms.ads.APPLICATION_ID"; + + private XNamespace ns = "http://schemas.android.com/apk/res/android"; + + public int callbackOrder { get { return 0; } } + +#if UNITY_2018_1_OR_NEWER + public void OnPreprocessBuild(BuildReport report) +#else + public void OnPreprocessBuild(BuildTarget target, string path) +#endif + { + if (File.Exists(IronSourceMediatedNetworkSettings.MEDIATION_SETTINGS_ASSET_PATH)) + { + string appId = IronSourceMediatedNetworkSettingsInspector.IronSourceMediatedNetworkSettings.AdmobAndroidAppId; + + if (IronSourceMediatedNetworkSettingsInspector.IronSourceMediatedNetworkSettings.EnableAdmob) + { + string manifestPath = Path.Combine( + Application.dataPath, "IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml"); + + XDocument manifest = null; + try + { + manifest = XDocument.Load(manifestPath); + } +#pragma warning disable 0168 + catch (IOException e) +#pragma warning restore 0168 + { + StopBuildWithMessage("AndroidManifest.xml is missing. Try re-importing the plugin."); + } + + XElement elemManifest = manifest.Element("manifest"); + if (elemManifest == null) + { + StopBuildWithMessage("AndroidManifest.xml is not valid. Try re-importing the plugin."); + } + + XElement elemApplication = elemManifest.Element("application"); + if (elemApplication == null) + { + StopBuildWithMessage("AndroidManifest.xml is not valid. Try re-importing the plugin."); + } + + IEnumerable metas = elemApplication.Descendants() + .Where(elem => elem.Name.LocalName.Equals("meta-data")); + + XElement elemAdMobEnabled = GetMetaElement(metas, META_APPLICATION_ID); + + if (appId.Length == 0) + { + StopBuildWithMessage( + "Android AdMob app ID is empty. Please enter your app ID to run ads properly"); + } + else if (!Regex.IsMatch(appId, "^[a-zA-Z0-9-~]*$")) + { + StopBuildWithMessage( + "Android AdMob app ID is not valid. Please enter a valid app ID to run ads properly"); + } + + else if (elemAdMobEnabled == null) + { + elemApplication.Add(CreateMetaElement(META_APPLICATION_ID, appId)); + } + else + { + elemAdMobEnabled.SetAttributeValue(ns + "value", appId); + } + + elemManifest.Save(manifestPath); + } + } + } + + private XElement CreateMetaElement(string name, object value) + { + return new XElement("meta-data", + new XAttribute(ns + "name", name), new XAttribute(ns + "value", value)); + } + + private XElement GetMetaElement(IEnumerable metas, string metaName) + { + foreach (XElement elem in metas) + { + IEnumerable attrs = elem.Attributes(); + foreach (XAttribute attr in attrs) + { + if (attr.Name.Namespace.Equals(ns) + && attr.Name.LocalName.Equals("name") && attr.Value.Equals(metaName)) + { + return elem; + } + } + } + return null; + } + + private void StopBuildWithMessage(string message) + { + string prefix = "[IronSourceApplicationSettings] "; + + EditorUtility.DisplayDialog( + "IronSource Developer Settings", "Error: " + message, "", ""); +#if UNITY_2017_1_OR_NEWER + throw new BuildPlayerWindow.BuildMethodException(prefix + message); +#else + throw new OperationCanceledException(prefix + message); +#endif + } +} + +#endif diff --git a/popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs.meta new file mode 100644 index 00000000..e9848a62 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceManifestProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b63a7ef12abd42eabd7c7b7c8250f83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs new file mode 100644 index 00000000..d1b037e8 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs @@ -0,0 +1,21 @@ +using System.IO; +using UnityEngine; + +public class IronSourceMediatedNetworkSettings : ScriptableObject +{ + public static readonly string MEDIATION_SETTINGS_ASSET_PATH = Path.Combine(IronSourceConstants.IRONSOURCE_RESOURCES_PATH, IronSourceConstants.IRONSOURCE_MEDIATED_NETWORK_SETTING_NAME + ".asset"); + + [Header("")] + [Header("AdMob Integration")] + [SerializeField] + [Tooltip("This will add AdMob Application ID to AndroidManifest.xml/info.plist")] + public bool EnableAdmob = false; + + [SerializeField] + [Tooltip("This Will be added to your AndroidManifest.xml")] + public string AdmobAndroidAppId = string.Empty; + + [SerializeField] + [Tooltip("This will be added to your info.plist")] + public string AdmobIOSAppId = string.Empty; +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs.meta new file mode 100644 index 00000000..98201f61 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6dcd730eacb2043e8a6f1c61c16243da +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs new file mode 100644 index 00000000..273988ca --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs @@ -0,0 +1,27 @@ +using System.IO; +using UnityEditor; + +[CustomEditor(typeof(IronSourceMediatedNetworkSettings))] +public class IronSourceMediatedNetworkSettingsInspector : UnityEditor.Editor +{ + private static IronSourceMediatedNetworkSettings ironSourceMediatedNetworkSettings; + public static IronSourceMediatedNetworkSettings IronSourceMediatedNetworkSettings + { + get + { + if (ironSourceMediatedNetworkSettings == null) + { + ironSourceMediatedNetworkSettings = AssetDatabase.LoadAssetAtPath(IronSourceMediatedNetworkSettings.MEDIATION_SETTINGS_ASSET_PATH); + if (ironSourceMediatedNetworkSettings == null) + { + IronSourceMediatedNetworkSettings asset = CreateInstance(); + Directory.CreateDirectory(IronSourceConstants.IRONSOURCE_RESOURCES_PATH); + AssetDatabase.CreateAsset(asset, IronSourceMediatedNetworkSettings.MEDIATION_SETTINGS_ASSET_PATH); + ironSourceMediatedNetworkSettings = asset; + } + } + + return ironSourceMediatedNetworkSettings; + } + } +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs.meta new file mode 100644 index 00000000..f10008dd --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMediatedNetworkSettingsInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ddcb1096c420410ead13befae195114 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs b/popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs new file mode 100644 index 00000000..d62f312b --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs @@ -0,0 +1,27 @@ +using System.IO; +using UnityEditor; + +[CustomEditor(typeof(IronSourceMediationSettings))] +public class IronSourceMediationSettingsInspector : UnityEditor.Editor +{ + private static IronSourceMediationSettings ironSourceMediationSettings; + public static IronSourceMediationSettings IronSourceMediationSettings + { + get + { + if (ironSourceMediationSettings == null) + { + ironSourceMediationSettings = AssetDatabase.LoadAssetAtPath(IronSourceMediationSettings.IRONSOURCE_SETTINGS_ASSET_PATH); + if (ironSourceMediationSettings == null) + { + IronSourceMediationSettings asset = CreateInstance(); + Directory.CreateDirectory(IronSourceConstants.IRONSOURCE_RESOURCES_PATH); + AssetDatabase.CreateAsset(asset, IronSourceMediationSettings.IRONSOURCE_SETTINGS_ASSET_PATH); + ironSourceMediationSettings = asset; + } + } + + return ironSourceMediationSettings; + } + } +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs.meta new file mode 100644 index 00000000..1325fb42 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMediationSettingsInspector.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4a5cecbf374304044822daeaa54c686c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMenu.cs b/popcorn/Assets/IronSource/Editor/IronSourceMenu.cs new file mode 100644 index 00000000..544c45c2 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMenu.cs @@ -0,0 +1,72 @@ +using System.IO; +using UnityEditor; +using UnityEngine; + +public class IronSourceMenu : UnityEditor.Editor +{ + + [MenuItem("IronSource/Documentation", false, 0)] + public static void Documentation() + { + Application.OpenURL("https://developers.ironsrc.com/ironsource-mobile/unity/unity-plugin/"); + } + + + [MenuItem("IronSource/SDK Change Log", false, 1)] + public static void ChangeLog() + { + Application.OpenURL("https://developers.ironsrc.com/ironsource-mobile/unity/sdk-change-log/"); + } + + + [MenuItem("IronSource/Integration Manager", false , 2)] + public static void SdkManagerProd() + { + IronSourceDependenciesManager.ShowISDependenciesManager(); + } + + [MenuItem("IronSource/Developer Settings/IronSource Mediation Settings", false, 3)] + public static void mediationSettings() + { + string path = "Assets/IronSource/Resources"; + + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + + + var ironSourceMediationSettings = Resources.Load(IronSourceConstants.IRONSOURCE_MEDIATION_SETTING_NAME); + if (ironSourceMediationSettings == null) + { + Debug.LogWarning(IronSourceConstants.IRONSOURCE_MEDIATION_SETTING_NAME + " can't be found, creating a new one..."); + ironSourceMediationSettings = CreateInstance(); + AssetDatabase.CreateAsset(ironSourceMediationSettings, IronSourceMediationSettings.IRONSOURCE_SETTINGS_ASSET_PATH); + ironSourceMediationSettings = Resources.Load(IronSourceConstants.IRONSOURCE_MEDIATION_SETTING_NAME); + } + + Selection.activeObject = ironSourceMediationSettings; + } + + [MenuItem("IronSource/Developer Settings/Mediated Network Settings", false, 4)] + public static void mediatedNetworkSettings() + { + string path = IronSourceConstants.IRONSOURCE_RESOURCES_PATH; + + if (!Directory.Exists(path)) + { + Directory.CreateDirectory(path); + } + + var ironSourceMediatedNetworkSettings = Resources.Load(IronSourceConstants.IRONSOURCE_MEDIATED_NETWORK_SETTING_NAME); + if (ironSourceMediatedNetworkSettings == null) + { + Debug.LogWarning(IronSourceConstants.IRONSOURCE_MEDIATED_NETWORK_SETTING_NAME + " can't be found, creating a new one..."); + ironSourceMediatedNetworkSettings = CreateInstance(); + AssetDatabase.CreateAsset(ironSourceMediatedNetworkSettings, IronSourceMediatedNetworkSettings.MEDIATION_SETTINGS_ASSET_PATH); + ironSourceMediatedNetworkSettings = Resources.Load(IronSourceConstants.IRONSOURCE_MEDIATED_NETWORK_SETTING_NAME); + } + + Selection.activeObject = ironSourceMediatedNetworkSettings; + } +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Editor/IronSourceMenu.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourceMenu.cs.meta new file mode 100644 index 00000000..d7da227f --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 70dd99db2841b47fb8709e8e707d714a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs b/popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs new file mode 100644 index 00000000..8a81f655 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs @@ -0,0 +1,133 @@ + +#if UNITY_IOS || UNITY_IPHONE + +using System.IO; +using UnityEditor.Callbacks; +using UnityEditor; +using System; +using UnityEngine; +using UnityEditor.iOS.Xcode; +using System.Text.RegularExpressions; + +///

+/// PostProcessor script to automatically fill all required dependencies +/// +public class IronSourcePlistProcessor +{ + [PostProcessBuild] + public static void OnPostprocessBuild(BuildTarget buildTarget, string buildPath) + { + if (File.Exists(IronSourceMediationSettings.IRONSOURCE_SETTINGS_ASSET_PATH)) + { + if (buildTarget == BuildTarget.iOS) + { + /* + * PBXProject + */ + string plistPath = Path.Combine(buildPath, "Info.plist"); + PBXProject project = new PBXProject(); + string projectPath = PBXProject.GetPBXProjectPath(buildPath); + project.ReadFromFile(projectPath); + PlistDocument plist = new PlistDocument(); + plist.ReadFromString(File.ReadAllText(plistPath)); + if (plist != null) + { + // Get root + PlistElementDict rootDict = plist.root; + + // Check if SKAdNetworkItems already exists + PlistElementArray SKAdNetworkItems = null; + if (rootDict.values.ContainsKey("SKAdNetworkItems")) + { + try + { + SKAdNetworkItems = rootDict.values["SKAdNetworkItems"] as PlistElementArray; + } + catch (Exception e) + { + Debug.LogWarning(string.Format("Could not obtain SKAdNetworkItems PlistElementArray: {0}", e.Message)); + } + } + + //Add IronSource's SKAdNetwork ID + if (IronSourceMediationSettingsInspector.IronSourceMediationSettings.AddIronsourceSkadnetworkID) + { + // If not exists, create it + if (SKAdNetworkItems == null) + { + SKAdNetworkItems = rootDict.CreateArray("SKAdNetworkItems"); + } + + string plistContent = File.ReadAllText(plistPath); + if (!plistContent.Contains(IronSourceConstants.IRONSOURCE_SKAN_ID_KEY)) + { + PlistElementDict SKAdNetworkIdentifierDict = SKAdNetworkItems.AddDict(); + SKAdNetworkIdentifierDict.SetString("SKAdNetworkIdentifier", IronSourceConstants.IRONSOURCE_SKAN_ID_KEY); + } + } + + + + File.WriteAllText(plistPath, plist.WriteToString()); + } + } + } + if ( File.Exists(IronSourceMediatedNetworkSettings.MEDIATION_SETTINGS_ASSET_PATH)) + { + if (buildTarget == BuildTarget.iOS) + { + /* + * PBXProject + */ + string plistPath = Path.Combine(buildPath, "Info.plist"); + PBXProject project = new PBXProject(); + string projectPath = PBXProject.GetPBXProjectPath(buildPath); + project.ReadFromFile(projectPath); + PlistDocument plist = new PlistDocument(); + plist.ReadFromString(File.ReadAllText(plistPath)); + if (plist != null) + { + // Get root + PlistElementDict rootDict = plist.root; + + + //Adding AdMob App ID to Plist + if (IronSourceMediatedNetworkSettingsInspector.IronSourceMediatedNetworkSettings.EnableAdmob == true) + { + string appId = IronSourceMediatedNetworkSettingsInspector.IronSourceMediatedNetworkSettings.AdmobIOSAppId; + if (appId.Length == 0) + { + StopBuildWithMessage( + "iOS AdMob app ID is empty. Please enter your app ID to run ads properly"); + } + else if (!Regex.IsMatch(appId, "^[a-zA-Z0-9-~]*$")) + { + StopBuildWithMessage( + "iOS AdMob app ID is not valid. Please enter a valid app ID to run ads properly"); + } + else + { + plist.root.SetString("GADApplicationIdentifier", appId); + } + } + + File.WriteAllText(plistPath, plist.WriteToString()); + } + } + } + } + private static void StopBuildWithMessage(string message) + { + string prefix = "[IronSourceApplicationSettings] "; + + EditorUtility.DisplayDialog( + "IronSource Developer Settings", "Error: " + message, "", ""); + +#if UNITY_2017_1_OR_NEWER + throw new BuildPlayerWindow.BuildMethodException(prefix + message); +#else + throw new OperationCanceledException(prefix + message); +#endif + } +} +#endif \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs.meta b/popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs.meta new file mode 100644 index 00000000..053dfb10 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourcePlistProcessor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 920ec5e5fa67e48c2a6380c2c2be88fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml b/popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml new file mode 100644 index 00000000..ff85fd69 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml @@ -0,0 +1,42 @@ + + 7.1.12 + + + + https://android-sdk.is.com/ + + + + + + + + https://maven.google.com/ + + + + + + + + https://maven.google.com/ + + + + + + + + https://maven.google.com/ + + + + + + + + https://github.com/CocoaPods/Specs + + + + diff --git a/popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml.meta b/popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml.meta new file mode 100644 index 00000000..47a5d3b3 --- /dev/null +++ b/popcorn/Assets/IronSource/Editor/IronSourceSDKDependencies.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d618a278f636e4718b9e6409b1f031eb +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins.meta b/popcorn/Assets/IronSource/Plugins.meta new file mode 100644 index 00000000..34a680b0 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 54543a6abf5c743eebffbdd3ab80a1e7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/Android.meta b/popcorn/Assets/IronSource/Plugins/Android.meta new file mode 100644 index 00000000..61b6d82a --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e68fc23b7584a4aeb9ad1faec8a8708c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin.meta b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin.meta new file mode 100644 index 00000000..f5ce407e --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin.meta @@ -0,0 +1,28 @@ +fileFormatVersion: 2 +guid: f1bc66601864e445e88faef50fa5886c +folderAsset: yes +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml new file mode 100644 index 00000000..31f3d214 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml.meta b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml.meta new file mode 100644 index 00000000..f896b5c3 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/AndroidManifest.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9632a9cae064644419de54f10c604559 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs.meta b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs.meta new file mode 100644 index 00000000..88150830 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52c96c6ebd65b44b3858b9ae1afdf87a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs/android-bridge.jar b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs/android-bridge.jar new file mode 100644 index 0000000000000000000000000000000000000000..a5d2bb2f6a2ac4feb3ebd45acd679713aa05a9a1 GIT binary patch literal 19129 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 literal 0 HcmV?d00001 diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs/android-bridge.jar.meta b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs/android-bridge.jar.meta new file mode 100644 index 00000000..68a69fb4 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/libs/android-bridge.jar.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2dbf0193032a2473098de3a49a1e75f7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties new file mode 100644 index 00000000..823f52e6 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties @@ -0,0 +1 @@ +android.library=true diff --git a/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties.meta b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties.meta new file mode 100644 index 00000000..574798a0 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/Android/IronSource.plugin/project.properties.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 21b205bdddcad4558ab4a0831cb093f2 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/iOS.meta b/popcorn/Assets/IronSource/Plugins/iOS.meta new file mode 100644 index 00000000..c03efe27 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/iOS.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d169a20af57cb4a47b056b3317f02f12 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m b/popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m new file mode 100644 index 00000000..4209bfc1 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m @@ -0,0 +1,78 @@ +// +// iOSBridge +// +// Created by Ori on 5/13/15. +// + +#import +#import +#import + +@interface IronSourceUnityConfig:NSObject +//IronSource +- (void) setClientSideCallbacks:(bool)useClientSideCallbacks; +- (void) setLanguage:(NSString *)language; +- (void) setRewardedVideoCustomParams:(NSString *)rvParams; +- (void) setOfferwallCustomParams:(NSString *)owParams; + +@end + +@implementation IronSourceUnityConfig + +//IronSource +- (void) setClientSideCallbacks:(bool)useClientSideCallbacks { + NSNumber *ucsc = @0; + if (useClientSideCallbacks) + ucsc = @1; + + [ISSupersonicAdsConfiguration configurations].useClientSideCallbacks = ucsc; +} + +- (void) setLanguage:(NSString *)language { + [ISSupersonicAdsConfiguration configurations].language = language; +} + +- (void) setRewardedVideoCustomParams:(NSString *)rvParams { + NSError *jsonError; + NSData *objectData = [rvParams dataUsingEncoding:NSUTF8StringEncoding]; + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError]; + if (!jsonError) + [ISConfigurations configurations].rewardedVideoCustomParameters = json; +} + +- (void) setOfferwallCustomParams:(NSString *)owParams { + NSError *jsonError; + NSData *objectData = [owParams dataUsingEncoding:NSUTF8StringEncoding]; + NSDictionary *json = [NSJSONSerialization JSONObjectWithData:objectData options:NSJSONReadingMutableContainers error:&jsonError]; + if (!jsonError) + [ISConfigurations configurations].offerwallCustomParameters = json; +} + + + +#ifdef __cplusplus +extern "C" { +#endif + +#define ParseNSStringParam( _x_ ) ( _x_ != NULL ) ? [NSString stringWithUTF8String:_x_] : [NSString stringWithUTF8String:""] + + //IronSource + void CFSetClientSideCallbacks(bool useClientSideCallbacks){ + [[IronSourceUnityConfig new] setClientSideCallbacks:useClientSideCallbacks]; + } + void CFSetLanguage(const char *language){ + [[IronSourceUnityConfig new] setLanguage:ParseNSStringParam(language)]; + } + void CFSetRewardedVideoCustomParams(const char *rvParams){ + [[IronSourceUnityConfig new] setRewardedVideoCustomParams:ParseNSStringParam(rvParams)]; + } + void CFSetOfferwallCustomParams(const char *owParam){ + [[IronSourceUnityConfig new] setOfferwallCustomParams:ParseNSStringParam(owParam)]; + } + + +#ifdef __cplusplus +} +#endif + +@end diff --git a/popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m.meta b/popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m.meta new file mode 100644 index 00000000..55d7028a --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/iOS/IronSourceUnityConfig.m.meta @@ -0,0 +1,37 @@ +fileFormatVersion: 2 +guid: e0be82736da5a41d4af2ea3ac34d5ac4 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: {} + - first: + tvOS: tvOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h new file mode 100644 index 00000000..ac825625 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h @@ -0,0 +1,17 @@ +// +// iOSBridge.h +// iOSBridge +// +// Created by Supersonic. +// Copyright (c) 2015 Supersonic. All rights reserved. +// + +#import +#import +static NSString * UnityGitHash = @"04bfbea"; + +@interface iOSBridge : NSObject + +@end + + diff --git a/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h.meta b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h.meta new file mode 100644 index 00000000..1b1aca3a --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.h.meta @@ -0,0 +1,27 @@ +fileFormatVersion: 2 +guid: 33123db285ad544b59cf1c18d83f66b8 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m new file mode 100755 index 00000000..b6f22b15 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m @@ -0,0 +1,1019 @@ +// +// iOSBridge.m +// iOSBridge +// +// Created by Supersonic. +// Copyright (c) 2015 Supersonic. All rights reserved. +// + +#import "iOSBridge.h" +#import + +// Converts NSString to C style string by way of copy (Mono will free it) +#define MakeStringCopy( _x_ ) ( _x_ != NULL && [_x_ isKindOfClass:[NSString class]] ) ? strdup( [_x_ UTF8String] ) : NULL + +// Converts C style string to NSString +#define GetStringParam( _x_ ) ( _x_ != NULL ) ? [NSString stringWithUTF8String:_x_] : [NSString stringWithUTF8String:""] + +#define BANNER_POSITION_TOP 1 +#define BANNER_POSITION_BOTTOM 2 + +#ifdef __cplusplus +extern "C" { +#endif + + extern void UnitySendMessage( const char *className, const char *methodName, const char *param ); + +#ifdef __cplusplus +} +#endif + +@interface iOSBridge () +{ + ISBannerView* _bannerView; + NSInteger _position; + UIViewController* _bannerViewController; +} + +@end + +@implementation iOSBridge + +char *const IRONSOURCE_EVENTS = "IronSourceEvents"; + ++ (iOSBridge *)start { + static iOSBridge *instance; + static dispatch_once_t onceToken; + dispatch_once( &onceToken, + ^{ + instance = [iOSBridge new]; + }); + + return instance; +} + +- (instancetype)init { + if(self = [super init]){ + [IronSource setRewardedVideoDelegate:self]; + [IronSource setInterstitialDelegate:self]; + [IronSource setISDemandOnlyInterstitialDelegate:self]; + [IronSource setISDemandOnlyRewardedVideoDelegate:self]; + [IronSource setOfferwallDelegate:self]; + [IronSource setBannerDelegate:self]; + [IronSource addImpressionDataDelegate:self]; + [IronSource setConsentViewWithDelegate:self]; + + _bannerView = nil; + _bannerViewController = nil; + _position = BANNER_POSITION_BOTTOM; + + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) + name:UIDeviceOrientationDidChangeNotification object:nil]; + } + + return self; +} + +- (void)setPluginDataWithType:(NSString *)pluginType pluginVersion:(NSString *)version pluginFrameworkVersion:(NSString *)frameworkVersion { + [ISConfigurations getConfigurations].plugin = pluginType; + [ISConfigurations getConfigurations].pluginVersion = version; + [ISConfigurations getConfigurations].pluginFrameworkVersion = frameworkVersion; +} + +#pragma mark Base API + +- (void)setMediationSegment:(NSString *)segment { + [IronSource setMediationSegment:segment]; +} + +- (const char *)getAdvertiserId { + NSString *advertiserId = [IronSource advertiserId]; + + return MakeStringCopy(advertiserId); +} + +- (void)validateIntegration { + [ISIntegrationHelper validateIntegration]; +} + +- (void)shouldTrackNetworkState:(BOOL)flag { + [IronSource shouldTrackReachability:flag]; +} + +- (BOOL)setDynamicUserId:(NSString *)dynamicUserId { + return [IronSource setDynamicUserId:dynamicUserId]; +} + +- (void)setAdaptersDebug:(BOOL)enabled { + [IronSource setAdaptersDebug:enabled]; +} + +- (void)setConsent:(BOOL)consent { + [IronSource setConsent:consent]; +} + +- (void)setMetaDataWithKey:(NSString *)key value:(NSString *)value { + [IronSource setMetaDataWithKey:key value:value]; +} + +- (void)setMetaDataWithKey:(NSString *)key values:(NSMutableArray *)valuesArray { + [IronSource setMetaDataWithKey:key values:valuesArray]; +} + +#pragma mark Init SDK + +- (void)setUserId:(NSString *)userId { + [IronSource setUserId:userId]; +} + +- (void)initWithAppKey:(NSString *)appKey { + [IronSource initWithAppKey:appKey]; +} + +- (void)initWithAppKey:(NSString *)appKey adUnits:(NSArray *)adUnits { + [IronSource initWithAppKey:appKey adUnits:adUnits]; +} + +- (void)initISDemandOnly:(NSString *)appKey adUnits:(NSArray *)adUnits { + [IronSource initISDemandOnly:appKey adUnits:adUnits]; +} + +#pragma mark Rewarded Video API + +- (void)showRewardedVideo { + [IronSource showRewardedVideoWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; +} + +- (void)showRewardedVideoWithPlacement:(NSString *)placementName { + [IronSource showRewardedVideoWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController placement:placementName]; +} + +- (const char *) getPlacementInfo:(NSString *)placementName { + char *res = nil; + + if (placementName){ + ISPlacementInfo *placementInfo = [IronSource rewardedVideoPlacementInfo:placementName]; + if(placementInfo){ + NSDictionary *dict = @{@"placement_name": [placementInfo placementName], + @"reward_amount": [placementInfo rewardAmount], + @"reward_name": [placementInfo rewardName]}; + + res = MakeStringCopy([self getJsonFromObj:dict]); + } + } + + return res; +} + +- (BOOL)isRewardedVideoAvailable { + return [IronSource hasRewardedVideo]; +} + +- (BOOL)isRewardedVideoPlacementCapped:(NSString *)placementName { + return [IronSource isRewardedVideoCappedForPlacement:placementName]; +} + +- (void)setRewardedVideoServerParameters:(NSDictionary *)params { + [IronSource setRewardedVideoServerParameters:params]; +} + +- (void)clearRewardedVideoServerParameters { + [IronSource clearRewardedVideoServerParameters]; +} + +#pragma mark Rewarded Video DemanOnly API + +- (void)showISDemandOnlyRewardedVideo:(NSString *)instanceId { + [IronSource showISDemandOnlyRewardedVideo:[UIApplication sharedApplication].keyWindow.rootViewController instanceId:instanceId]; +} + +- (void)loadISDemandOnlyRewardedVideo:(NSString *)instanceId { + [IronSource loadISDemandOnlyRewardedVideo:instanceId]; +} + +- (BOOL)isDemandOnlyRewardedVideoAvailable:(NSString *)instanceId { + return [IronSource hasISDemandOnlyRewardedVideo:instanceId]; +} + +#pragma mark Rewarded Video Delegate + +- (void)rewardedVideoHasChangedAvailability:(BOOL)available { + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAvailabilityChanged", (available) ? "true" : "false"); +} + +- (void)didReceiveRewardForPlacement:(ISPlacementInfo *)placementInfo { + NSDictionary *dict = @{@"placement_reward_amount": placementInfo.rewardAmount, + @"placement_reward_name": placementInfo.rewardName, + @"placement_name": placementInfo.placementName}; + + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdRewarded", MakeStringCopy([self getJsonFromObj:dict])); +} + +- (void)rewardedVideoDidFailToShowWithError:(NSError *)error { + if (error) + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdShowFailed", MakeStringCopy([self parseErrorToEvent:error])); + else + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdShowFailed",""); +} + +- (void)rewardedVideoDidOpen { + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdOpened", ""); +} + +- (void)rewardedVideoDidClose { + [self centerBanner]; + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClosed", ""); +} + +- (void)rewardedVideoDidStart { + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdStarted", ""); +} + +- (void)rewardedVideoDidEnd { + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdEnded", ""); +} + +- (void)didClickRewardedVideo:(ISPlacementInfo *)placementInfo { + NSDictionary *dict = @{@"placement_reward_amount": placementInfo.rewardAmount, + @"placement_reward_name": placementInfo.rewardName, + @"placement_name": placementInfo.placementName}; + + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClicked", MakeStringCopy([self getJsonFromObj:dict])); +} + +#pragma mark Rewarded Video DemandOnly Delegate + +- (void)rewardedVideoDidLoad:(NSString *)instanceId{ + NSArray *params = @[instanceId]; + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdLoadedDemandOnly", MakeStringCopy([self getJsonFromObj:params])); +} + +- (void)rewardedVideoDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId{ + NSArray *params; + if (error) + params = @[instanceId, [self parseErrorToEvent:error]]; + else + params = @[instanceId,@""]; + + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdLoadFailedDemandOnly", MakeStringCopy([self getJsonFromObj:params])); +} + +- (void)rewardedVideoAdRewarded:(NSString *)instanceId { + NSArray *params = @[instanceId]; + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdRewardedDemandOnly", MakeStringCopy([self getJsonFromObj:params])); +} + +- (void)rewardedVideoDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId { + + NSArray *params; + if (error) + params = @[instanceId, [self parseErrorToEvent:error]]; + else + params = @[instanceId,@""]; + + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdShowFailedDemandOnly", MakeStringCopy([self getJsonFromObj:params])); +} + +- (void)rewardedVideoDidOpen:(NSString *)instanceId { + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdOpenedDemandOnly", MakeStringCopy(instanceId)); + +} + +- (void)rewardedVideoDidClose:(NSString *)instanceId { + [self centerBanner]; + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClosedDemandOnly", MakeStringCopy(instanceId)); +} + +- (void)rewardedVideoDidClick:(NSString *)instanceId { + NSArray *params = @[instanceId]; + UnitySendMessage(IRONSOURCE_EVENTS, "onRewardedVideoAdClickedDemandOnly", MakeStringCopy([self getJsonFromObj:params])); +} + +#pragma mark Interstitial API + +- (void)loadInterstitial { + [IronSource loadInterstitial]; +} + +- (void)showInterstitial { + [IronSource showInterstitialWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; +} + +- (void)showInterstitialWithPlacement:(NSString *)placementName { + [IronSource showInterstitialWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController placement:placementName]; +} + +- (BOOL)isInterstitialReady { + return [IronSource hasInterstitial]; +} + +- (BOOL)isInterstitialPlacementCapped:(NSString *)placementName { + return [IronSource isInterstitialCappedForPlacement:placementName]; +} + +#pragma mark Interstitial DemandOnly API + +- (void)loadISDemandOnlyInterstitial:(NSString *)instanceId { + [IronSource loadISDemandOnlyInterstitial:instanceId]; +} + +- (void)showISDemandOnlyInterstitial:(NSString *)instanceId { + [IronSource showISDemandOnlyInterstitial:[UIApplication sharedApplication].keyWindow.rootViewController instanceId:instanceId]; +} + +- (BOOL)isISDemandOnlyInterstitialReady:(NSString *)instanceId { + return [IronSource hasISDemandOnlyInterstitial:instanceId]; +} + +#pragma mark Interstitial Delegate + +- (void)interstitialDidLoad { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdReady", ""); +} + +- (void)interstitialDidFailToLoadWithError:(NSError *)error { + if (error) + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdLoadFailed", MakeStringCopy([self parseErrorToEvent:error])); + else + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdLoadFailed",""); +} + +- (void)interstitialDidOpen { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdOpened", ""); +} + +- (void)interstitialDidClose { + [self centerBanner]; + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClosed", ""); +} + +- (void)interstitialDidShow { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowSucceeded", ""); +} + +- (void)interstitialDidFailToShowWithError:(NSError *)error { + if (error) + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowFailed", MakeStringCopy([self parseErrorToEvent:error])); + else + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowFailed",""); +} + +- (void)didClickInterstitial { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClicked", ""); +} + +#pragma mark Interstitial DemandOnly Delegate + +- (void)interstitialDidLoad:(NSString *)instanceId { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdReadyDemandOnly", MakeStringCopy(instanceId)); +} + +- (void)interstitialDidFailToLoadWithError:(NSError *)error instanceId:(NSString *)instanceId { + NSArray *parameters; + if (error) + parameters = @[instanceId, [self parseErrorToEvent:error]]; + else + parameters = @[instanceId, @""]; + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdLoadFailedDemandOnly",MakeStringCopy([self getJsonFromObj:parameters])); +} + +- (void)interstitialDidOpen:(NSString *)instanceId { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdOpenedDemandOnly", MakeStringCopy(instanceId)); +} + +- (void)interstitialDidClose:(NSString *)instanceId { + [self centerBanner]; + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClosedDemandOnly", MakeStringCopy(instanceId)); +} + +- (void)interstitialDidShow:(NSString *)instanceId { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowSucceededDemandOnly", MakeStringCopy(instanceId)); +} + +- (void)interstitialDidFailToShowWithError:(NSError *)error instanceId:(NSString *)instanceId { + NSArray *parameters; + if (error) + parameters = @[instanceId, [self parseErrorToEvent:error]]; + else + parameters = @[instanceId, @""]; + + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdShowFailedDemandOnly", MakeStringCopy([self getJsonFromObj:parameters])); +} + +- (void)didClickInterstitial:(NSString *)instanceId { + UnitySendMessage(IRONSOURCE_EVENTS, "onInterstitialAdClickedDemandOnly", MakeStringCopy(instanceId)); +} + +#pragma mark Offerwall API + +- (void)showOfferwall { + [IronSource showOfferwallWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController]; +} + +- (void)showOfferwallWithPlacement:(NSString *)placementName { + [IronSource showOfferwallWithViewController:[UIApplication sharedApplication].keyWindow.rootViewController placement:placementName]; +} + +- (void)getOfferwallCredits { + [IronSource offerwallCredits]; +} + +- (BOOL)isOfferwallAvailable { + return [IronSource hasOfferwall]; +} + +#pragma mark Offerwall Delegate + +- (void)offerwallHasChangedAvailability:(BOOL)available { + UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallAvailable", (available) ? "true" : "false"); +} + +- (void)offerwallDidShow { + UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallOpened", ""); +} + +- (void)offerwallDidFailToShowWithError:(NSError *)error { + if (error) + UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallShowFailed", MakeStringCopy([self parseErrorToEvent:error])); + else + UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallShowFailed", ""); +} + +- (void)offerwallDidClose { + [self centerBanner]; + UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallClosed", ""); +} + +- (BOOL)didReceiveOfferwallCredits:(NSDictionary *)creditInfo { + if(creditInfo) + UnitySendMessage(IRONSOURCE_EVENTS, "onOfferwallAdCredited", [self getJsonFromObj:creditInfo].UTF8String); + + return YES; +} + +- (void)didFailToReceiveOfferwallCreditsWithError:(NSError *)error { + if (error) + UnitySendMessage(IRONSOURCE_EVENTS, "onGetOfferwallCreditsFailed", MakeStringCopy([self parseErrorToEvent:error])); + else + UnitySendMessage(IRONSOURCE_EVENTS, "onGetOfferwallCreditsFailed", ""); +} + +#pragma mark ConsentView API + +-(void)loadConsentViewWithType:(NSString *)consentViewType { + [IronSource loadConsentViewWithType: consentViewType]; +} + +-(void)showConsentViewWithType:(NSString *)consentViewType { + @synchronized(self) { + UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController; + [IronSource showConsentViewWithViewController:viewController andType:consentViewType]; + } +} + +#pragma mark Banner API + +- (void)loadBanner:(NSString *)description width:(NSInteger)width height:(NSInteger)height position:(NSInteger)position placement:(NSString *)placement { + @synchronized(self) { + _position = position; + ISBannerSize* size = [self getBannerSize:description width:width height:height]; + + _bannerViewController = [UIApplication sharedApplication].keyWindow.rootViewController; + [IronSource loadBannerWithViewController:_bannerViewController size:size placement:placement]; + } +} + +- (void)destroyBanner { + dispatch_async(dispatch_get_main_queue(), ^{ + @synchronized(self) { + if (_bannerView != nil) { + [IronSource destroyBanner:_bannerView]; + _bannerView = nil; + _bannerViewController = nil; + } + } + }); +} + +- (void)displayBanner { + dispatch_async(dispatch_get_main_queue(), ^{ + @synchronized(self) { + if (_bannerView != nil) { + [_bannerView setHidden:NO]; + } + } + }); +} + +- (void)hideBanner { + dispatch_async(dispatch_get_main_queue(), ^{ + @synchronized(self) { + if (_bannerView != nil) { + [_bannerView setHidden:YES]; + } + } + }); +} + +- (BOOL)isBannerPlacementCapped:(NSString *)placementName { + return [IronSource isBannerCappedForPlacement:placementName]; +} + +- (ISBannerSize *) getBannerSize:(NSString *)description width:(NSInteger)width height:(NSInteger)height { + if ([description isEqualToString:@"CUSTOM"]) { + return [[ISBannerSize alloc] initWithWidth:width andHeight:height]; + } + if ([description isEqualToString:@"SMART"]) { + return ISBannerSize_SMART; + } + if ([description isEqualToString:@"RECTANGLE"]) { + return ISBannerSize_RECTANGLE; + } + if ([description isEqualToString:@"LARGE"]) { + return ISBannerSize_LARGE; + } + else { + return ISBannerSize_BANNER; + } +} + +#pragma mark Banner Delegate + +- (CGPoint)getBannerCenter:(NSInteger)position rootView:(UIView *)rootView { + CGFloat y; + if (position == BANNER_POSITION_TOP) { + y = (_bannerView.frame.size.height / 2); + if (@available(ios 11.0, *)) { + y += rootView.safeAreaInsets.top; + } + } + else { + y = rootView.frame.size.height - (_bannerView.frame.size.height / 2); + if (@available(ios 11.0, *)) { + y -= rootView.safeAreaInsets.bottom; + } + } + + return CGPointMake(rootView.frame.size.width / 2, y); +} + +- (void)bannerDidLoad:(ISBannerView *)bannerView { + dispatch_async(dispatch_get_main_queue(), ^{ + @synchronized(self) { + _bannerView = bannerView; + [_bannerView setAccessibilityLabel:@"bannerContainer"]; + + _bannerView.center = [self getBannerCenter:_position rootView:_bannerViewController.view]; + [_bannerViewController.view addSubview:_bannerView]; + + UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLoaded", ""); + } + }); +} + +- (void)bannerDidFailToLoadWithError:(NSError *)error { + if (error) + UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLoadFailed", MakeStringCopy([self parseErrorToEvent:error])); + else + UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLoadFailed", ""); +} + +- (void)didClickBanner { + UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdClicked", ""); +} + +- (void)bannerWillPresentScreen { + UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdScreenPresented", ""); +} + +- (void)bannerDidDismissScreen { + UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdScreenDismissed", ""); +} + +- (void)bannerWillLeaveApplication { + UnitySendMessage(IRONSOURCE_EVENTS, "onBannerAdLeftApplication", ""); +} + +- (void)centerBanner { + dispatch_async(dispatch_get_main_queue(), ^{ + @synchronized(self) { + if (_bannerView != nil && _bannerViewController != nil) { + _bannerView.center = [self getBannerCenter:_position rootView:_bannerViewController.view]; + } + } + }); +} + +- (void)orientationChanged:(NSNotification *)notification { + [self centerBanner]; +} + +#pragma mark Helper methods + +- (void) setSegment:(NSString*) segmentJSON { + [IronSource setSegmentDelegate:self]; + ISSegment *segment = [[ISSegment alloc] init]; + NSError* error; + if (!segmentJSON) + return; + + NSData *data = [segmentJSON dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) + return; + + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; + + if (!dict) + return; + + NSMutableArray *allKeys = [[dict allKeys] mutableCopy]; + for (id key in allKeys) + { + NSString* keyString = (NSString*)key; + NSString *object = [dict objectForKey: keyString]; + if ([keyString isEqualToString:@"age"]){ + segment.age = [object intValue] ; + } + else if([keyString isEqualToString:@"gender"]){ + if([object caseInsensitiveCompare:@"male"] == NSOrderedSame) + segment.gender = IRONSOURCE_USER_MALE ; + else if([object caseInsensitiveCompare:@"female"] == NSOrderedSame) + segment.gender = IRONSOURCE_USER_FEMALE; + + } + else if ([keyString isEqualToString:@"level"]){ + segment.level = [object intValue]; + } + else if ([keyString isEqualToString:@"isPaying"]){ + segment.paying = [object boolValue]; + } + else if ([keyString isEqualToString:@"userCreationDate"]){ + NSDate *date = [NSDate dateWithTimeIntervalSince1970: [object longLongValue]/1000]; + segment.userCreationDate = date; + + } + else if ([keyString isEqualToString:@"segmentName"]){ + segment.segmentName = object; + + } else if ([keyString isEqualToString:@"iapt"]){ + segment.iapTotal = [object doubleValue]; + } + else{ + [segment setCustomValue:object forKey:keyString]; + } + + } + + [IronSource setSegment:segment]; +} + +- (void)didReceiveSegement:(NSString *)segment{ + UnitySendMessage(IRONSOURCE_EVENTS, "onSegmentReceived", MakeStringCopy(segment)); +} + +- (NSString *)parseErrorToEvent:(NSError *)error{ + if (error){ + NSString* codeStr = [NSString stringWithFormat:@"%ld", (long)[error code]]; + + NSDictionary *dict = @{@"error_description": [error localizedDescription], + @"error_code": codeStr}; + + return [self getJsonFromObj:dict]; + } + + return nil; +} + +- (NSString *)getJsonFromObj:(id)obj { + NSError *error; + NSData *jsonData = [NSJSONSerialization dataWithJSONObject:obj options:0 error:&error]; + + if (!jsonData) { + NSLog(@"Got an error: %@", error); + return @""; + } else { + NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; + return jsonString; + } +} + +#pragma mark ImpressionData Delegate + +- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData { + UnitySendMessage(IRONSOURCE_EVENTS, "onImpressionSuccess", [self getJsonFromObj:[impressionData all_data]].UTF8String); + +} + +#pragma mark ConsentView Delegate + +- (void)consentViewDidAccept:(NSString *)consentViewType { + UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidAccept", MakeStringCopy(consentViewType)); +} + +- (void)consentViewDidDismiss:(NSString *)consentViewType { + UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidDismiss", MakeStringCopy(consentViewType)); +} + +- (void)consentViewDidFailToLoadWithError:(NSError *)error consentViewType:(NSString *)consentViewType { + NSArray *params; + if (error) + params = @[consentViewType, [self parseErrorToEvent:error]]; + else + params = @[consentViewType, @""]; + + UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidFailToLoadWithError", MakeStringCopy([self getJsonFromObj:params])); +} + +- (void)consentViewDidLoadSuccess:(NSString *)consentViewType { + UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidLoadSuccess", MakeStringCopy(consentViewType)); +} + +- (void)consentViewDidFailToShowWithError:(NSError *)error consentViewType:(NSString *)consentViewType { + NSArray *params; + if (error) + params = @[consentViewType, [self parseErrorToEvent:error]]; + else + params = @[consentViewType, @""]; + + UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidFailToShowWithError", MakeStringCopy([self getJsonFromObj:params])); +} + +- (void)consentViewDidShowSuccess:(NSString *)consentViewType { + UnitySendMessage(IRONSOURCE_EVENTS, "onConsentViewDidShowSuccess", MakeStringCopy(consentViewType)); +} + +#pragma mark ConversionValue API + +-(const char *) getConversionValue { + NSNumber *conversionValue = [IronSource getConversionValue]; + char *res = MakeStringCopy([conversionValue stringValue]); + return res; +} + +#pragma mark ILRD API +- (void)setAdRevenueData:(NSString *)dataSource impressionData:(NSData *)impressionData { + [IronSource setAdRevenueDataWithDataSource:dataSource impressionData:impressionData]; +} + +#pragma mark - C Section + +#ifdef __cplusplus +extern "C" { +#endif + + void CFSetPluginData(const char *pluginType, const char *pluginVersion, const char *pluginFrameworkVersion){ + [[iOSBridge start] setPluginDataWithType:GetStringParam(pluginType) pluginVersion:GetStringParam(pluginVersion) pluginFrameworkVersion:GetStringParam(pluginFrameworkVersion)]; + } + + + void CFSetMediationSegment(const char *segment){ + [[iOSBridge start] setMediationSegment:GetStringParam(segment)]; + } + + const char *CFGetAdvertiserId(){ + return [[iOSBridge start] getAdvertiserId]; + } + + void CFValidateIntegration(){ + [[iOSBridge start] validateIntegration]; + } + + void CFShouldTrackNetworkState(bool flag){ + [[iOSBridge start] shouldTrackNetworkState:flag]; + } + + bool CFSetDynamicUserId(char *dynamicUserId){ + return [[iOSBridge start] setDynamicUserId:GetStringParam(dynamicUserId)]; + } + + void CFSetAdaptersDebug(bool enabled){ + [[iOSBridge start] setAdaptersDebug:enabled]; + } + + void CFSetUserId(char *userId){ + return [[iOSBridge start] setUserId:GetStringParam(userId)]; + } + + void CFSetConsent (bool consent) { + [[iOSBridge start] setConsent:consent]; + } + + void CFSetMetaData (char *key, char *value) { + [[iOSBridge start] setMetaDataWithKey:GetStringParam(key) value:GetStringParam(value)]; + } + + void CFSetMetaDataWithValues (char *key,const char *values[]) { + NSMutableArray *valuesArray = [NSMutableArray new]; + if(values != nil ) { + int i = 0; + + while (values[i] != nil) { + [valuesArray addObject: [NSString stringWithCString: values[i] encoding:NSASCIIStringEncoding]]; + i++; + } + + [[iOSBridge start] setMetaDataWithKey:GetStringParam(key) values:valuesArray]; + } + } + +#pragma mark Init SDK + + void CFInit(const char *appKey){ + [[iOSBridge start] initWithAppKey:GetStringParam(appKey)]; + } + + void CFInitWithAdUnits(const char *appKey, const char *adUnits[]){ + NSMutableArray *adUnitsArray = [NSMutableArray new]; + + if(adUnits != nil ) { + int i = 0; + + while (adUnits[i] != nil) { + [adUnitsArray addObject: [NSString stringWithCString: adUnits[i] encoding:NSASCIIStringEncoding]]; + i++; + } + + [[iOSBridge start] initWithAppKey:GetStringParam(appKey) adUnits:adUnitsArray]; + } + } + + void CFInitISDemandOnly(const char *appKey, const char *adUnits[]){ + NSMutableArray *adUnitsArray = [NSMutableArray new]; + + if(adUnits != nil ) { + int i = 0; + + while (adUnits[i] != nil) { + [adUnitsArray addObject: [NSString stringWithCString: adUnits[i] encoding:NSASCIIStringEncoding]]; + i++; + } + [[iOSBridge start] initISDemandOnly:GetStringParam(appKey) adUnits:adUnitsArray]; + } + } + +#pragma mark RewardedVideo API + void CFShowRewardedVideo(){ + [[iOSBridge start] showRewardedVideo]; + } + + void CFShowRewardedVideoWithPlacementName(char *placementName){ + [[iOSBridge start] showRewardedVideoWithPlacement:GetStringParam(placementName)]; + } + + const char *CFGetPlacementInfo(char *placementName){ + return [[iOSBridge start] getPlacementInfo:GetStringParam(placementName)]; + } + + bool CFIsRewardedVideoAvailable(){ + return [[iOSBridge start] isRewardedVideoAvailable]; + } + + bool CFIsRewardedVideoPlacementCapped(char *placementName){ + return [[iOSBridge start] isRewardedVideoPlacementCapped:GetStringParam(placementName)]; + } + + void CFSetRewardedVideoServerParameters(char *jsonString) { + NSData *data = [GetStringParam(jsonString) dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) { + return; + } + + NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; + if (dict) { + [[iOSBridge start] setRewardedVideoServerParameters:dict]; + } + } + + void CFClearRewardedVideoServerParameters() { + [[iOSBridge start] clearRewardedVideoServerParameters]; + } + +#pragma mark RewardedVideo DemandOnly API + + void CFShowISDemandOnlyRewardedVideo(char * instanceId){ + [[iOSBridge start] showISDemandOnlyRewardedVideo:GetStringParam(instanceId)]; + } + + void CFLoadISDemandOnlyRewardedVideo(char * instanceId) { + [[iOSBridge start] loadISDemandOnlyRewardedVideo:GetStringParam(instanceId)]; + } + + bool CFIsDemandOnlyRewardedVideoAvailable(char * instanceId) { + return [[iOSBridge start] isDemandOnlyRewardedVideoAvailable:GetStringParam(instanceId)]; + } + +#pragma mark Interstitial API + + void CFLoadInterstitial(){ + [[iOSBridge start] loadInterstitial]; + } + + void CFShowInterstitial(){ + [[iOSBridge start] showInterstitial]; + } + + void CFShowInterstitialWithPlacementName(char *placementName){ + [[iOSBridge start] showInterstitialWithPlacement:GetStringParam(placementName)]; + } + + bool CFIsInterstitialReady(){ + return [[iOSBridge start] isInterstitialReady]; + } + + bool CFIsInterstitialPlacementCapped(char *placementName){ + return [[iOSBridge start] isInterstitialPlacementCapped:GetStringParam(placementName)]; + } + +#pragma mark Interstitial DemandOnly API + + void CFLoadISDemandOnlyInterstitial(char * instanceId) { + [[iOSBridge start] loadISDemandOnlyInterstitial:GetStringParam(instanceId)]; + } + + void CFShowISDemandOnlyInterstitial(char * instanceId) { + [[iOSBridge start] showISDemandOnlyInterstitial:GetStringParam(instanceId)]; + + } + + bool CFIsDemandOnlyInterstitialReady(char * instanceId) { + return [[iOSBridge start] isISDemandOnlyInterstitialReady:GetStringParam(instanceId)]; + } + +#pragma mark Offerwall API + + void CFShowOfferwall(){ + [[iOSBridge start] showOfferwall]; + } + + void CFShowOfferwallWithPlacementName(char *placementName){ + [[iOSBridge start] showOfferwallWithPlacement:GetStringParam(placementName)]; + } + + void CFGetOfferwallCredits(){ + [[iOSBridge start] getOfferwallCredits]; + } + + bool CFIsOfferwallAvailable(){ + return [[iOSBridge start] isOfferwallAvailable]; + } + +#pragma mark Banner API + + void CFLoadBanner(char* description, int width, int height, int position, char* placementName){ + [[iOSBridge start] loadBanner:GetStringParam(description) width:width height:height position:position placement:GetStringParam(placementName)]; + } + + void CFDestroyBanner (){ + [[iOSBridge start] destroyBanner]; + } + + void CFDisplayBanner (){ + [[iOSBridge start] displayBanner]; + } + + void CFHideBanner (){ + [[iOSBridge start] hideBanner]; + } + + bool CFIsBannerPlacementCapped (char *placementName){ + return [[iOSBridge start] isBannerPlacementCapped:GetStringParam(placementName)]; + } + +#pragma mark Segment API + + void CFSetSegment (char* jsonString) { + [[iOSBridge start] setSegment:GetStringParam(jsonString)]; + } + +#pragma mark ConsentView API + + void CFLoadConsentViewWithType (char* consentViewType){ + [[iOSBridge start] loadConsentViewWithType:GetStringParam(consentViewType)]; + } + + void CFShowConsentViewWithType (char* consentViewType){ + [[iOSBridge start] showConsentViewWithType:GetStringParam(consentViewType)]; + } + +#pragma mark ConversionValue API + + const char *CFGetConversionValue(){ + return [[iOSBridge start] getConversionValue]; + } + +#pragma mark ILRD API + void CFSetAdRevenueData(char* datasource,char* impressiondata){ + NSData *data=[GetStringParam(impressiondata)dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) { + return; + } + return [[iOSBridge start] setAdRevenueData:GetStringParam(datasource)impressionData:data]; + } + +#ifdef __cplusplus +} +#endif + +@end + + diff --git a/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m.meta b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m.meta new file mode 100644 index 00000000..a1c73f48 --- /dev/null +++ b/popcorn/Assets/IronSource/Plugins/iOS/iOSBridge.m.meta @@ -0,0 +1,37 @@ +fileFormatVersion: 2 +guid: 270589a8de1714a00bc20bfd059e4441 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + iPhone: iOS + second: + enabled: 1 + settings: {} + - first: + tvOS: tvOS + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts.meta b/popcorn/Assets/IronSource/Scripts.meta new file mode 100644 index 00000000..5428f14a --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1bbaa67142d994184844ed2864338043 +folderAsset: yes +timeCreated: 1486985218 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/AndroidAgent.cs b/popcorn/Assets/IronSource/Scripts/AndroidAgent.cs new file mode 100644 index 00000000..f6948319 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/AndroidAgent.cs @@ -0,0 +1,314 @@ +#if UNITY_ANDROID +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System; + +public class AndroidAgent : IronSourceIAgent +{ + private static AndroidJavaObject _androidBridge; + private readonly static string AndroidBridge = "com.ironsource.unity.androidbridge.AndroidBridge"; + private const string REWARD_AMOUNT = "reward_amount"; + private const string REWARD_NAME = "reward_name"; + private const string PLACEMENT_NAME = "placement_name"; + + public AndroidAgent () + { + Debug.Log ("AndroidAgent ctr"); + } + +#region IronSourceIAgent implementation + public AndroidJavaObject getBridge () + { + if (_androidBridge == null) + using (var pluginClass = new AndroidJavaClass( AndroidBridge )) + _androidBridge = pluginClass.CallStatic ("getInstance"); + + return _androidBridge; + } + + //******************* Base API *******************// + + public void onApplicationPause (bool pause) + { + if (pause) + { + getBridge ().Call ("onPause"); + } + else + { + getBridge ().Call ("onResume"); + } + } + + public void setMediationSegment (string segment) + { + getBridge ().Call ("setMediationSegment", segment); + } + + public string getAdvertiserId () + { + return getBridge ().Call ("getAdvertiserId"); + } + + public void validateIntegration () + { + getBridge ().Call ("validateIntegration"); + } + + public void shouldTrackNetworkState (bool track) + { + getBridge ().Call ("shouldTrackNetworkState", track); + } + + public bool setDynamicUserId (string dynamicUserId) + { + return getBridge ().Call ("setDynamicUserId", dynamicUserId); + } + + public void setAdaptersDebug(bool enabled) + { + getBridge ().Call ("setAdaptersDebug", enabled); + } + + public void setMetaData(string key, string value) + { + getBridge().Call("setMetaData", key, value); + } + + public void setMetaData(string key, params string[] values) + { + getBridge().Call("setMetaData", key, values); + } + + public int? getConversionValue() + { + Debug.Log("Unsupported Platform"); + return null; + } + + //******************* SDK Init *******************// + + public void setUserId(string userId) { + getBridge ().Call ("setUserId", userId); + } + + public void init(string appKey) + { + getBridge ().Call ("setPluginData", "Unity", IronSource.pluginVersion (), IronSource.unityVersion ()); + Debug.Log ("IntegrationHelper pluginVersion: " + IronSource.pluginVersion ()); + getBridge ().Call ("init", appKey); + } + + public void init (string appKey, params string[] adUnits) + { + getBridge ().Call ("setPluginData", "Unity", IronSource.pluginVersion (), IronSource.unityVersion ()); + Debug.Log ("IntegrationHelper pluginVersion: " + IronSource.pluginVersion ()); + getBridge ().Call ("init", appKey, adUnits); + } + + public void initISDemandOnly (string appKey, params string[] adUnits) + { + getBridge ().Call ("setPluginData", "Unity", IronSource.pluginVersion (), IronSource.unityVersion ()); + Debug.Log ("IntegrationHelper pluginVersion: " + IronSource.pluginVersion ()); + getBridge ().Call ("initISDemandOnly", appKey, adUnits); + } + + //******************* RewardedVideo API *******************// + + public void showRewardedVideo () + { + getBridge ().Call ("showRewardedVideo"); + } + + public void showRewardedVideo (string placementName) + { + getBridge ().Call ("showRewardedVideo", placementName); + } + + public bool isRewardedVideoAvailable () + { + return getBridge ().Call ("isRewardedVideoAvailable"); + } + + public bool isRewardedVideoPlacementCapped (string placementName) + { + return getBridge ().Call ("isRewardedVideoPlacementCapped", placementName); + } + + public IronSourcePlacement getPlacementInfo (string placementName) + { + string placementInfo = getBridge ().Call ("getPlacementInfo", placementName); + IronSourcePlacement pInfo = null; + if (placementInfo != null) { + Dictionary pInfoDic = IronSourceJSON.Json.Deserialize (placementInfo) as Dictionary; + string pName = pInfoDic [PLACEMENT_NAME].ToString (); + string rName = pInfoDic [REWARD_NAME].ToString (); + int rAmount = Convert.ToInt32 (pInfoDic [REWARD_AMOUNT].ToString ()); + + pInfo = new IronSourcePlacement (pName, rName, rAmount); + } + return pInfo; + } + + public void setRewardedVideoServerParams(Dictionary parameters) { + string json = IronSourceJSON.Json.Serialize (parameters); + getBridge ().Call ("setRewardedVideoServerParams", json); + } + + public void clearRewardedVideoServerParams() { + getBridge ().Call ("clearRewardedVideoServerParams"); + } + + //******************* RewardedVideo DemandOnly API *******************// + + public void showISDemandOnlyRewardedVideo (string instanceId) + { + getBridge ().Call ("showISDemandOnlyRewardedVideo",instanceId); + } + + public void loadISDemandOnlyRewardedVideo (string instanceId) + { + getBridge ().Call ("loadISDemandOnlyRewardedVideo", instanceId); + } + + public bool isISDemandOnlyRewardedVideoAvailable (string instanceId) + { + return getBridge ().Call ("isISDemandOnlyRewardedVideoAvailable", instanceId); + } + + //******************* Interstitial API *******************// + + public void loadInterstitial () + { + getBridge ().Call ("loadInterstitial"); + } + + public void showInterstitial () + { + getBridge ().Call ("showInterstitial"); + } + + public void showInterstitial (string placementName) + { + getBridge ().Call ("showInterstitial", placementName); + } + + public bool isInterstitialReady () + { + return getBridge ().Call ("isInterstitialReady"); + } + + public bool isInterstitialPlacementCapped (string placementName) + { + return getBridge ().Call ("isInterstitialPlacementCapped", placementName); + } + + //******************* Interstitial DemandOnly API *******************// + + public void loadISDemandOnlyInterstitial (string instanceId) + { + getBridge ().Call ("loadISDemandOnlyInterstitial",instanceId); + } + + public void showISDemandOnlyInterstitial (string instanceId) + { + getBridge ().Call ("showISDemandOnlyInterstitial",instanceId); + } + + public bool isISDemandOnlyInterstitialReady (string instanceId) + { + return getBridge ().Call ("isISDemandOnlyInterstitialReady",instanceId); + } + + //******************* Offerwall API *******************// + + public void showOfferwall () + { + getBridge ().Call ("showOfferwall"); + } + + public void showOfferwall (string placementName) + { + getBridge ().Call ("showOfferwall", placementName); + } + + public void getOfferwallCredits () + { + getBridge ().Call ("getOfferwallCredits"); + } + + public bool isOfferwallAvailable () + { + return getBridge ().Call ("isOfferwallAvailable"); + } + + //******************* Banner API *******************// + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position) + { + loadBanner(size, position, ""); + } + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position, string placementName) + { + getBridge().Call("loadBanner", size.Description, (int)size.Width, (int)size.Height, (int)position, placementName); + } + + public void destroyBanner() + { + getBridge ().Call ("destroyBanner"); + } + + public void displayBanner() + { + getBridge ().Call ("displayBanner"); + } + + public void hideBanner() + { + getBridge ().Call ("hideBanner"); + } + + public bool isBannerPlacementCapped(string placementName) + { + return getBridge ().Call ("isBannerPlacementCapped", placementName); + } + + public void setSegment(IronSourceSegment segment) + { + Dictionary dict = segment.getSegmentAsDict (); + string json = IronSourceJSON.Json.Serialize (dict); + getBridge ().Call ("setSegment", json); + } + + public void setConsent(bool consent) + { + getBridge().Call("setConsent",consent); + } + + //******************* ConsentView API *******************// + + public void loadConsentViewWithType(string consentViewType) + { + Debug.Log("Unsupported Platform"); + } + + public void showConsentViewWithType(string consentViewType) + { + Debug.Log("Unsupported Platform"); + } + + //******************* ILRD API *******************// + + public void setAdRevenueData(string dataSource, Dictionary impressionData) + { + string json = IronSourceJSON.Json.Serialize(impressionData); + getBridge().Call("setAdRevenueData", dataSource, json); + } + + #endregion +} + +#endif + diff --git a/popcorn/Assets/IronSource/Scripts/AndroidAgent.cs.meta b/popcorn/Assets/IronSource/Scripts/AndroidAgent.cs.meta new file mode 100644 index 00000000..520e1f5f --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/AndroidAgent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 383e513a18bd7449994e83f8f434e950 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSource.cs b/popcorn/Assets/IronSource/Scripts/IronSource.cs new file mode 100644 index 00000000..bb9e3867 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSource.cs @@ -0,0 +1,317 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System; + +public class IronSource : IronSourceIAgent +{ + private IronSourceIAgent _platformAgent; + private static IronSource _instance; + private const string UNITY_PLUGIN_VERSION = "7.1.12-r"; + private static bool isUnsupportedPlatform; + + private IronSource() + { + if (!isUnsupportedPlatform) + { +#if UNITY_EDITOR || UNITY_STANDALONE + _platformAgent = new UnsupportedPlatformAgent(); +#elif (UNITY_IPHONE || UNITY_IOS) + _platformAgent = new iOSAgent(); +#elif UNITY_ANDROID + _platformAgent = new AndroidAgent (); +#endif + } + + else + { + _platformAgent = new UnsupportedPlatformAgent(); + } + var type = typeof(IronSourceEvents); + var mgr = new GameObject("IronSourceEvents", type).GetComponent(); // Creates IronSourceEvents gameObject + } + + #region IronSourceIAgent implementation + public static IronSource Agent { + get { + if (_instance == null) { + _instance = new IronSource(); + } + return _instance; + } + } + + public static string pluginVersion() + { + return UNITY_PLUGIN_VERSION; + } + + public static string unityVersion() + { + return Application.unityVersion; + } + + public static void setUnsupportedPlatform() + { + isUnsupportedPlatform = true; + } + + //******************* Base API *******************// + + public void onApplicationPause(bool pause) + { + _platformAgent.onApplicationPause(pause); + } + + public void setMediationSegment(string segment) + { + _platformAgent.setMediationSegment(segment); + } + + public string getAdvertiserId() + { + return _platformAgent.getAdvertiserId(); + } + + public void validateIntegration() + { + _platformAgent.validateIntegration(); + } + + public void shouldTrackNetworkState(bool track) + { + _platformAgent.shouldTrackNetworkState(track); + } + + public bool setDynamicUserId(string dynamicUserId) + { + return _platformAgent.setDynamicUserId(dynamicUserId); + } + + public void setAdaptersDebug(bool enabled) + { + _platformAgent.setAdaptersDebug(enabled); + } + + public void setMetaData(string key, string value) + { + _platformAgent.setMetaData(key, value); + } + + public void setMetaData(string key, params string[] values) + { + _platformAgent.setMetaData(key, values); + } + + public int? getConversionValue() + { + return _platformAgent.getConversionValue(); + } + + //******************* SDK Init *******************// + + public void setUserId (string userId) + { + _platformAgent.setUserId (userId); + } + + public void init (string appKey) + { + _platformAgent.init (appKey); + } + + public void init (string appKey, params string[] adUnits) + { + _platformAgent.init (appKey, adUnits); + } + + public void initISDemandOnly (string appKey, params string[] adUnits) + { + _platformAgent.initISDemandOnly (appKey, adUnits); + } + + //******************* RewardedVideo API *******************// + + public void showRewardedVideo () + { + _platformAgent.showRewardedVideo (); + } + + public void showRewardedVideo (string placementName) + { + _platformAgent.showRewardedVideo (placementName); + } + + public IronSourcePlacement getPlacementInfo (string placementName) + { + return _platformAgent.getPlacementInfo (placementName); + } + + public bool isRewardedVideoAvailable () + { + return _platformAgent.isRewardedVideoAvailable (); + } + + public bool isRewardedVideoPlacementCapped (string placementName) + { + return _platformAgent.isRewardedVideoPlacementCapped (placementName); + } + + public void setRewardedVideoServerParams(Dictionary parameters) + { + _platformAgent.setRewardedVideoServerParams(parameters); + } + + public void clearRewardedVideoServerParams() + { + _platformAgent.clearRewardedVideoServerParams(); + } + + //******************* RewardedVideo DemandOnly API *******************// + + public void showISDemandOnlyRewardedVideo (string instanceId) + { + _platformAgent.showISDemandOnlyRewardedVideo(instanceId); + } + + public void loadISDemandOnlyRewardedVideo (string instanceId) + { + _platformAgent.loadISDemandOnlyRewardedVideo(instanceId); + } + + public bool isISDemandOnlyRewardedVideoAvailable (string instanceId) + { + return _platformAgent.isISDemandOnlyRewardedVideoAvailable(instanceId); + } + + //******************* Interstitial API *******************// + + public void loadInterstitial () + { + _platformAgent.loadInterstitial (); + } + + public void showInterstitial () + { + _platformAgent.showInterstitial (); + } + + public void showInterstitial (string placementName) + { + _platformAgent.showInterstitial (placementName); + } + + public bool isInterstitialReady () + { + return _platformAgent.isInterstitialReady (); + } + + public bool isInterstitialPlacementCapped (string placementName) + { + return _platformAgent.isInterstitialPlacementCapped (placementName); + } + + //******************* Interstitial DemandOnly API *******************// + + public void loadISDemandOnlyInterstitial (string instanceId) + { + _platformAgent.loadISDemandOnlyInterstitial(instanceId); + } + + public void showISDemandOnlyInterstitial (string instanceId) + { + _platformAgent.showISDemandOnlyInterstitial(instanceId); + } + + public bool isISDemandOnlyInterstitialReady (string instanceId) + { + return _platformAgent.isISDemandOnlyInterstitialReady(instanceId); + } + + //******************* Offerwall API *******************// + + public void showOfferwall () + { + _platformAgent.showOfferwall (); + } + + public void showOfferwall (string placementName) + { + _platformAgent.showOfferwall (placementName); + } + + public void getOfferwallCredits () + { + _platformAgent.getOfferwallCredits (); + } + + public bool isOfferwallAvailable () + { + return _platformAgent.isOfferwallAvailable (); + } + + //******************* Banner API *******************// + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position) + { + _platformAgent.loadBanner (size, position); + } + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position, string placementName) + { + _platformAgent.loadBanner (size, position, placementName); + } + + public void destroyBanner() + { + _platformAgent.destroyBanner (); + } + + public void displayBanner() + { + _platformAgent.displayBanner (); + } + + public void hideBanner() + { + _platformAgent.hideBanner (); + } + + + public bool isBannerPlacementCapped(string placementName) + { + return _platformAgent.isBannerPlacementCapped (placementName); + + } + + public void setSegment(IronSourceSegment segment) + { + _platformAgent.setSegment (segment); + } + + public void setConsent(bool consent) + { + _platformAgent.setConsent(consent); + } + + //******************* ConsentView API *******************// + + public void loadConsentViewWithType(string consentViewType) + { + _platformAgent.loadConsentViewWithType(consentViewType); + } + + public void showConsentViewWithType(string consentViewType) + { + _platformAgent.showConsentViewWithType(consentViewType); + } + + //******************* ILRD API *******************// + + public void setAdRevenueData(string dataSource, Dictionary impressionData) + { + _platformAgent.setAdRevenueData( dataSource , impressionData); + } + + #endregion +} diff --git a/popcorn/Assets/IronSource/Scripts/IronSource.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSource.cs.meta new file mode 100644 index 00000000..0d5f3458 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSource.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ec69520ef1aa4f74b7695ff3da85a8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs b/popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs new file mode 100644 index 00000000..a43dc35e --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs @@ -0,0 +1,127 @@ +using System.Runtime.InteropServices; +using UnityEngine; +using System.Collections; + +using System.Collections.Generic; + +public class IronSourceConfig +{ + private const string unsupportedPlatformStr = "Unsupported Platform"; + private static IronSourceConfig _instance; + + public static IronSourceConfig Instance { + get { + if (_instance == null) { + _instance = new IronSourceConfig (); + } + return _instance; + } + } + + + #if UNITY_ANDROID && !UNITY_EDITOR + private static AndroidJavaObject _androidBridge; + private readonly static string AndroidBridge = "com.ironsource.unity.androidbridge.AndroidBridge"; + + public IronSourceConfig () + { + using (var pluginClass = new AndroidJavaClass( AndroidBridge )) + _androidBridge = pluginClass.CallStatic ("getInstance"); + } + + //Setters + public void setLanguage (string language) + { + _androidBridge.Call ("setLanguage", language); + } + + public void setClientSideCallbacks (bool status) + { + _androidBridge.Call ("setClientSideCallbacks", status); + } + + public void setRewardedVideoCustomParams (Dictionary rewardedVideoCustomParams) + { + string json = IronSourceJSON.Json.Serialize (rewardedVideoCustomParams); + _androidBridge.Call ("setRewardedVideoCustomParams", json); + } + + public void setOfferwallCustomParams (Dictionary offerwallCustomParams) + { + string json = IronSourceJSON.Json.Serialize (offerwallCustomParams); + _androidBridge.Call ("setOfferwallCustomParams", json); + } + + + #elif (UNITY_IPHONE || UNITY_IOS) && !UNITY_EDITOR + [DllImport("__Internal")] + private static extern void CFSetLanguage (string language); + + [DllImport("__Internal")] + private static extern void CFSetClientSideCallbacks (bool useClientSideCallbacks); + + [DllImport("__Internal")] + private static extern void CFSetRewardedVideoCustomParams (string rewardedVideoCustomParams); + + [DllImport("__Internal")] + private static extern void CFSetOfferwallCustomParams (string offerwallCustomParams); + + + public void setLanguage (string language) + { + CFSetLanguage (language); + } + + public void setClientSideCallbacks (bool status) + { + CFSetClientSideCallbacks (status); + } + + public void setRewardedVideoCustomParams (Dictionary rewardedVideoCustomParams) + { + string json = IronSourceJSON.Json.Serialize (rewardedVideoCustomParams); + CFSetRewardedVideoCustomParams (json); + } + + public void setOfferwallCustomParams (Dictionary offerwallCustomParams) + { + string json = IronSourceJSON.Json.Serialize (offerwallCustomParams); + CFSetOfferwallCustomParams (json); + } + + public IronSourceConfig () + { + + } + + + #else + public void setLanguage (string language) + { + Debug.Log (unsupportedPlatformStr); + } + + public void setClientSideCallbacks (bool status) + { + Debug.Log (unsupportedPlatformStr); + } + + public void setRewardedVideoCustomParams (Dictionary rewardedVideoCustomParams) + { + Debug.Log (unsupportedPlatformStr); + } + + public void setOfferwallCustomParams (Dictionary offerwallCustomParams) + { + Debug.Log (unsupportedPlatformStr); + } + + public IronSourceConfig () + { + Debug.Log (unsupportedPlatformStr); + } + + #endif +} + + diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs.meta new file mode 100644 index 00000000..58b3248f --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceConfig.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e25760c5c158c41b4aa31bffb0209769 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs b/popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs new file mode 100644 index 00000000..287bd086 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs @@ -0,0 +1,35 @@ +public static class IronSourceConstants +{ + public const string interstitialBridgeListenerClass = "com.ironsource.unity.androidbridge.UnityInterstitialListener"; + public const string rewardedVideoBridgeListenerClass = "com.ironsource.unity.androidbridge.UnityRewardedVideoListener"; + public const string bridgeClass = "com.ironsource.unity.androidbridge.AndroidBridge"; + public const string offerwallBridgeListenerClass = "com.ironsource.unity.androidbridge.UnityOfferwallListener"; + public const string bannerBridgeListenerClass = "com.ironsource.unity.androidbridge.UnityBannerListener"; + public const string segmentBridgeListenerClass = "com.ironsource.unity.androidbridge.UnitySegmentListener"; + public const string ERROR_CODE = "error_code"; + public const string ERROR_DESCRIPTION = "error_description"; + public const string INSTANCE_ID_KEY = "instanceId"; + public const string PLACEMENT_KEY = "placement"; + public const string IMPRESSION_DATA_KEY_AUCTION_ID = "auctionId"; + public const string IMPRESSION_DATA_KEY_AD_UNIT = "adUnit"; + public const string IMPRESSION_DATA_KEY_COUNTRY = "country"; + public const string IMPRESSION_DATA_KEY_ABTEST = "ab"; + public const string IMPRESSION_DATA_KEY_SEGMENT_NAME = "segmentName"; + public const string IMPRESSION_DATA_KEY_PLACEMENT = "placement"; + public const string IMPRESSION_DATA_KEY_AD_NETWORK = "adNetwork"; + public const string IMPRESSION_DATA_KEY_INSTANCE_NAME = "instanceName"; + public const string IMPRESSION_DATA_KEY_INSTANCE_ID = "instanceId"; + public const string IMPRESSION_DATA_KEY_REVENUE = "revenue"; + public const string IMPRESSION_DATA_KEY_PRECISION = "precision"; + public const string IMPRESSION_DATA_KEY_LIFETIME_REVENUE = "lifetimeRevenue"; + public const string IMPRESSION_DATA_KEY_ENCRYPTED_CPM = "encryptedCPM"; + public const string IMPRESSION_DATA_KEY_CONVERSION_VALUE= "conversionValue"; + public const string GENDER_MALE = "male"; + public const string GENDER_FEMALE = "female"; + public const string GENDER_UNKNOWN = "unknown"; + + public const string IRONSOURCE_MEDIATION_SETTING_NAME = "IronSourceMediationSettings"; + public const string IRONSOURCE_MEDIATED_NETWORK_SETTING_NAME = "IronSourceMediatedNetworkSettings"; + public const string IRONSOURCE_RESOURCES_PATH = "Assets/IronSource/Resources"; + public const string IRONSOURCE_SKAN_ID_KEY = "su67r6k2v3.skadnetwork"; +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs.meta new file mode 100644 index 00000000..807a305e --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceConstants.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 86d04d1d517d942e79c31e208285c06a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceError.cs b/popcorn/Assets/IronSource/Scripts/IronSourceError.cs new file mode 100644 index 00000000..10bf9c32 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceError.cs @@ -0,0 +1,35 @@ + +using System; + +public class IronSourceError +{ + private string description; + private int code; + + public int getErrorCode () + { + return code; + } + + public string getDescription () + { + return description; + } + + public int getCode () + { + return code; + } + + public IronSourceError (int errorCode, string errorDescription) + { + code = errorCode; + description = errorDescription; + } + + public override string ToString () + { + return code + " : " + description; + } +} + diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceError.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceError.cs.meta new file mode 100644 index 00000000..1b3d1db6 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceError.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c3eeee77c4aea4a979d85dcb1630fbe4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs b/popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs new file mode 100644 index 00000000..0144a3c9 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs @@ -0,0 +1,1246 @@ + using UnityEngine; + using System; + using System.Collections; + using System.Collections.Generic; + using System.Linq; + using System.Globalization; + + public class IronSourceEvents : MonoBehaviour + { + private const string ERROR_CODE = "error_code"; + private const string ERROR_DESCRIPTION = "error_description"; + private const string INSTANCE_ID_KEY = "instanceId"; + private const string PLACEMENT_KEY = "placement"; + + void Awake () + { + gameObject.name = "IronSourceEvents"; //Change the GameObject name to IronSourceEvents. + DontDestroyOnLoad (gameObject); //Makes the object not be destroyed automatically when loading a new scene. + } + + // ******************************* Rewarded Video Events ******************************* + private static event Action _onRewardedVideoAdShowFailedEvent; + + public static event Action onRewardedVideoAdShowFailedEvent { + add { + if (_onRewardedVideoAdShowFailedEvent == null || !_onRewardedVideoAdShowFailedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdShowFailedEvent += value; + } + } + + remove { + if (_onRewardedVideoAdShowFailedEvent != null || _onRewardedVideoAdShowFailedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdShowFailedEvent -= value; + } + } + } + + public void onRewardedVideoAdShowFailed (string description) + { + if (_onRewardedVideoAdShowFailedEvent != null) { + IronSourceError sse = getErrorFromErrorObject (description); + _onRewardedVideoAdShowFailedEvent (sse); + } + } + + private static event Action _onRewardedVideoAdOpenedEvent; + + public static event Action onRewardedVideoAdOpenedEvent { + add { + if (_onRewardedVideoAdOpenedEvent == null || !_onRewardedVideoAdOpenedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdOpenedEvent += value; + } + } + + remove { + if (_onRewardedVideoAdOpenedEvent != null || _onRewardedVideoAdOpenedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdOpenedEvent -= value; + } + } + } + + public void onRewardedVideoAdOpened (string empty) + { + if (_onRewardedVideoAdOpenedEvent != null) { + _onRewardedVideoAdOpenedEvent (); + } + } + + private static event Action _onRewardedVideoAdClosedEvent; + + public static event Action onRewardedVideoAdClosedEvent { + add { + if (_onRewardedVideoAdClosedEvent == null || !_onRewardedVideoAdClosedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClosedEvent += value; + } + } + + remove { + if (_onRewardedVideoAdClosedEvent != null || _onRewardedVideoAdClosedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClosedEvent -= value; + } + } + } + + public void onRewardedVideoAdClosed (string empty) + { + if (_onRewardedVideoAdClosedEvent != null) { + _onRewardedVideoAdClosedEvent (); + } + } + + private static event Action _onRewardedVideoAdStartedEvent; + + public static event Action onRewardedVideoAdStartedEvent { + add { + if (_onRewardedVideoAdStartedEvent == null || !_onRewardedVideoAdStartedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdStartedEvent += value; + } + } + + remove { + if (_onRewardedVideoAdStartedEvent != null || _onRewardedVideoAdStartedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdStartedEvent -= value; + } + } + } + + public void onRewardedVideoAdStarted (string empty) + { + if (_onRewardedVideoAdStartedEvent != null) { + _onRewardedVideoAdStartedEvent (); + } + } + + private static event Action _onRewardedVideoAdEndedEvent; + + public static event Action onRewardedVideoAdEndedEvent { + add { + if (_onRewardedVideoAdEndedEvent == null || !_onRewardedVideoAdEndedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdEndedEvent += value; + } + } + + remove { + if (_onRewardedVideoAdEndedEvent != null || _onRewardedVideoAdEndedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdEndedEvent -= value; + } + } + } + + public void onRewardedVideoAdEnded (string empty) + { + if (_onRewardedVideoAdEndedEvent != null) { + _onRewardedVideoAdEndedEvent (); + } + } + + private static event Action _onRewardedVideoAdRewardedEvent; + + public static event Action onRewardedVideoAdRewardedEvent { + add { + if (_onRewardedVideoAdRewardedEvent == null || !_onRewardedVideoAdRewardedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdRewardedEvent += value; + } + } + + remove { + if (_onRewardedVideoAdRewardedEvent != null || _onRewardedVideoAdRewardedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdRewardedEvent -= value; + } + } + } + + public void onRewardedVideoAdRewarded (string description) + { + if (_onRewardedVideoAdRewardedEvent != null) { + IronSourcePlacement ssp = getPlacementFromObject (description); + _onRewardedVideoAdRewardedEvent (ssp); + } + } + + private static event Action _onRewardedVideoAdClickedEvent; + + public static event Action onRewardedVideoAdClickedEvent { + add { + if (_onRewardedVideoAdClickedEvent == null || !_onRewardedVideoAdClickedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClickedEvent += value; + } + } + + remove { + if (_onRewardedVideoAdClickedEvent != null || _onRewardedVideoAdClickedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClickedEvent -= value; + } + } + } + + public void onRewardedVideoAdClicked (string description) + { + if (_onRewardedVideoAdClickedEvent != null) { + IronSourcePlacement ssp = getPlacementFromObject (description); + _onRewardedVideoAdClickedEvent (ssp); + } + } + + private static event Action _onRewardedVideoAvailabilityChangedEvent; + + public static event Action onRewardedVideoAvailabilityChangedEvent { + add { + if (_onRewardedVideoAvailabilityChangedEvent == null || !_onRewardedVideoAvailabilityChangedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAvailabilityChangedEvent += value; + } + } + + remove { + if (_onRewardedVideoAvailabilityChangedEvent != null || _onRewardedVideoAvailabilityChangedEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAvailabilityChangedEvent -= value; + } + } + } + + public void onRewardedVideoAvailabilityChanged (string stringAvailable) + { + bool isAvailable = (stringAvailable == "true") ? true : false; + if (_onRewardedVideoAvailabilityChangedEvent != null) + _onRewardedVideoAvailabilityChangedEvent (isAvailable); + } + + // ******************************* RewardedVideo DemandOnly Events ******************************* + + private static event Action _onRewardedVideoAdLoadedDemandOnlyEvent; + + public static event Action onRewardedVideoAdLoadedDemandOnlyEvent { + add { + if (_onRewardedVideoAdLoadedDemandOnlyEvent == null || !_onRewardedVideoAdLoadedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdLoadedDemandOnlyEvent += value; + } + } + + remove { + if (_onRewardedVideoAdLoadedDemandOnlyEvent != null || _onRewardedVideoAdLoadedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdLoadedDemandOnlyEvent -= value; + } + } + } + + public void onRewardedVideoAdLoadedDemandOnly (string instanceId) + { + if (_onRewardedVideoAdLoadedDemandOnlyEvent != null ) { + _onRewardedVideoAdLoadedDemandOnlyEvent (instanceId); + } + } + + private static event Action _onRewardedVideoAdLoadFailedDemandOnlyEvent; + + public static event Action onRewardedVideoAdLoadFailedDemandOnlyEvent { + add { + if (_onRewardedVideoAdLoadFailedDemandOnlyEvent == null || !_onRewardedVideoAdLoadFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdLoadFailedDemandOnlyEvent += value; + } + } + + remove { + if (_onRewardedVideoAdLoadFailedDemandOnlyEvent != null || _onRewardedVideoAdLoadFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdLoadFailedDemandOnlyEvent -= value; + } + } + } + + public void onRewardedVideoAdLoadFailedDemandOnly (string args) + { + if (_onRewardedVideoAdLoadFailedDemandOnlyEvent != null && !String.IsNullOrEmpty(args)) { + List argList = IronSourceJSON.Json.Deserialize (args) as List; + IronSourceError err = getErrorFromErrorObject(argList[1]); + string instanceId = argList[0].ToString(); + _onRewardedVideoAdLoadFailedDemandOnlyEvent (instanceId, err); + } + } + + private static event Action _onRewardedVideoAdOpenedDemandOnlyEvent; + + public static event Action onRewardedVideoAdOpenedDemandOnlyEvent { + add { + if (_onRewardedVideoAdOpenedDemandOnlyEvent == null || !_onRewardedVideoAdOpenedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdOpenedDemandOnlyEvent += value; + } + } + + remove { + if (_onRewardedVideoAdOpenedDemandOnlyEvent != null || _onRewardedVideoAdOpenedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdOpenedDemandOnlyEvent -= value; + } + } + } + + public void onRewardedVideoAdOpenedDemandOnly (string instanceId) + { + if (_onRewardedVideoAdOpenedDemandOnlyEvent != null) { + _onRewardedVideoAdOpenedDemandOnlyEvent (instanceId); + } + } + + private static event Action _onRewardedVideoAdClosedDemandOnlyEvent; + + public static event Action onRewardedVideoAdClosedDemandOnlyEvent { + add { + if (_onRewardedVideoAdClosedDemandOnlyEvent == null || !_onRewardedVideoAdClosedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClosedDemandOnlyEvent += value; + } + } + + remove { + if (_onRewardedVideoAdClosedDemandOnlyEvent != null || _onRewardedVideoAdClosedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClosedDemandOnlyEvent -= value; + } + } + } + + public void onRewardedVideoAdClosedDemandOnly (string instanceId) + { + if (_onRewardedVideoAdClosedDemandOnlyEvent != null) { + _onRewardedVideoAdClosedDemandOnlyEvent (instanceId); + } + } + + private static event Action _onRewardedVideoAdRewardedDemandOnlyEvent; + + public static event Action onRewardedVideoAdRewardedDemandOnlyEvent { + add { + if (_onRewardedVideoAdRewardedDemandOnlyEvent == null || !_onRewardedVideoAdRewardedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdRewardedDemandOnlyEvent += value; + } + } + + remove { + if (_onRewardedVideoAdRewardedDemandOnlyEvent != null || _onRewardedVideoAdRewardedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdRewardedDemandOnlyEvent -= value; + } + } + } + + public void onRewardedVideoAdRewardedDemandOnly (string instanceId) + { + if (_onRewardedVideoAdRewardedDemandOnlyEvent != null) { + _onRewardedVideoAdRewardedDemandOnlyEvent (instanceId); + } + } + + private static event Action _onRewardedVideoAdShowFailedDemandOnlyEvent; + + public static event Action onRewardedVideoAdShowFailedDemandOnlyEvent { + add { + if (_onRewardedVideoAdShowFailedDemandOnlyEvent == null || !_onRewardedVideoAdShowFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdShowFailedDemandOnlyEvent += value; + } + } + + remove { + if (_onRewardedVideoAdShowFailedDemandOnlyEvent != null || _onRewardedVideoAdShowFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdShowFailedDemandOnlyEvent -= value; + } + } + } + + public void onRewardedVideoAdShowFailedDemandOnly (string args) + { + if (_onRewardedVideoAdShowFailedDemandOnlyEvent != null && !String.IsNullOrEmpty(args)) { + List argList = IronSourceJSON.Json.Deserialize (args) as List; + IronSourceError err = getErrorFromErrorObject(argList[1]); + string instanceId = argList[0].ToString(); + _onRewardedVideoAdShowFailedDemandOnlyEvent (instanceId, err); + } + } + + private static event Action _onRewardedVideoAdClickedDemandOnlyEvent; + + public static event Action onRewardedVideoAdClickedDemandOnlyEvent { + add { + if (_onRewardedVideoAdClickedDemandOnlyEvent == null || !_onRewardedVideoAdClickedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClickedDemandOnlyEvent += value; + } + } + + remove { + if (_onRewardedVideoAdClickedDemandOnlyEvent != null || _onRewardedVideoAdClickedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onRewardedVideoAdClickedDemandOnlyEvent -= value; + } + } + } + + public void onRewardedVideoAdClickedDemandOnly (string instanceId) + { + if (_onRewardedVideoAdClickedDemandOnlyEvent != null) { + _onRewardedVideoAdClickedDemandOnlyEvent (instanceId); + } + } + + // ******************************* Interstitial Events ******************************* + + private static event Action _onInterstitialAdReadyEvent; + + public static event Action onInterstitialAdReadyEvent { + add { + if (_onInterstitialAdReadyEvent == null || !_onInterstitialAdReadyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdReadyEvent += value; + } + } + + remove { + if (_onInterstitialAdReadyEvent != null || _onInterstitialAdReadyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdReadyEvent -= value; + } + } + } + + public void onInterstitialAdReady () + { + if (_onInterstitialAdReadyEvent != null) + _onInterstitialAdReadyEvent (); + } + + private static event Action _onInterstitialAdLoadFailedEvent; + + public static event Action onInterstitialAdLoadFailedEvent { + add { + if (_onInterstitialAdLoadFailedEvent == null || !_onInterstitialAdLoadFailedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdLoadFailedEvent += value; + } + } + + remove { + if (_onInterstitialAdLoadFailedEvent != null || _onInterstitialAdLoadFailedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdLoadFailedEvent -= value; + } + } + } + + public void onInterstitialAdLoadFailed (string description) + { + if (_onInterstitialAdLoadFailedEvent != null) { + IronSourceError sse = getErrorFromErrorObject (description); + _onInterstitialAdLoadFailedEvent (sse); + } + } + + private static event Action _onInterstitialAdOpenedEvent; + + public static event Action onInterstitialAdOpenedEvent { + add { + if (_onInterstitialAdOpenedEvent == null || !_onInterstitialAdOpenedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdOpenedEvent += value; + } + } + + remove { + if (_onInterstitialAdOpenedEvent != null || _onInterstitialAdOpenedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdOpenedEvent -= value; + } + } + } + + public void onInterstitialAdOpened (string empty) + { + if (_onInterstitialAdOpenedEvent != null) { + _onInterstitialAdOpenedEvent (); + } + } + + private static event Action _onInterstitialAdClosedEvent; + + public static event Action onInterstitialAdClosedEvent { + add { + if (_onInterstitialAdClosedEvent == null || !_onInterstitialAdClosedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClosedEvent += value; + } + } + + remove { + if (_onInterstitialAdClosedEvent != null || _onInterstitialAdClosedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClosedEvent -= value; + } + } + } + + public void onInterstitialAdClosed (string empty) + { + if (_onInterstitialAdClosedEvent != null) { + _onInterstitialAdClosedEvent (); + } + } + + private static event Action _onInterstitialAdShowSucceededEvent; + + public static event Action onInterstitialAdShowSucceededEvent { + add { + if (_onInterstitialAdShowSucceededEvent == null || !_onInterstitialAdShowSucceededEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdShowSucceededEvent += value; + } + } + + remove { + if (_onInterstitialAdShowSucceededEvent != null || _onInterstitialAdShowSucceededEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdShowSucceededEvent -= value; + } + } + } + + public void onInterstitialAdShowSucceeded (string empty) + { + if (_onInterstitialAdShowSucceededEvent != null) { + _onInterstitialAdShowSucceededEvent (); + } + } + + private static event Action _onInterstitialAdShowFailedEvent; + + public static event Action onInterstitialAdShowFailedEvent { + add { + if (_onInterstitialAdShowFailedEvent == null || !_onInterstitialAdShowFailedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdShowFailedEvent += value; + } + } + + remove { + if (_onInterstitialAdShowFailedEvent != null || _onInterstitialAdShowFailedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdShowFailedEvent -= value; + } + } + } + + public void onInterstitialAdShowFailed (string description) + { + if (_onInterstitialAdShowFailedEvent != null) { + IronSourceError sse = getErrorFromErrorObject (description); + _onInterstitialAdShowFailedEvent (sse); + } + } + + private static event Action _onInterstitialAdClickedEvent; + + public static event Action onInterstitialAdClickedEvent { + add { + if (_onInterstitialAdClickedEvent == null || !_onInterstitialAdClickedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClickedEvent += value; + } + } + + remove { + if (_onInterstitialAdClickedEvent != null || _onInterstitialAdClickedEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClickedEvent -= value; + } + } + } + + public void onInterstitialAdClicked (string empty) + { + if (_onInterstitialAdClickedEvent != null) { + _onInterstitialAdClickedEvent (); + } + } + + // ******************************* Interstitial DemanOnly Events ******************************* + + private static event Action _onInterstitialAdReadyDemandOnlyEvent; + + public static event Action onInterstitialAdReadyDemandOnlyEvent { + add { + if (_onInterstitialAdReadyDemandOnlyEvent == null || !_onInterstitialAdReadyDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdReadyDemandOnlyEvent += value; + } + } + + remove { + if (_onInterstitialAdReadyDemandOnlyEvent != null || _onInterstitialAdReadyDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdReadyDemandOnlyEvent -= value; + } + } + } + + public void onInterstitialAdReadyDemandOnly (string instanceId) + { + if (_onInterstitialAdReadyDemandOnlyEvent != null) + _onInterstitialAdReadyDemandOnlyEvent (instanceId); + } + + + private static event Action _onInterstitialAdLoadFailedDemandOnlyEvent; + + public static event Action onInterstitialAdLoadFailedDemandOnlyEvent { + add { + if (_onInterstitialAdLoadFailedDemandOnlyEvent == null || !_onInterstitialAdLoadFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdLoadFailedDemandOnlyEvent += value; + } + } + + remove { + if (_onInterstitialAdLoadFailedDemandOnlyEvent != null || _onInterstitialAdLoadFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdLoadFailedDemandOnlyEvent -= value; + } + } + } + + public void onInterstitialAdLoadFailedDemandOnly (string args) + { + if (_onInterstitialAdLoadFailedDemandOnlyEvent != null && !String.IsNullOrEmpty(args)) { + List argList = IronSourceJSON.Json.Deserialize (args) as List; + IronSourceError err = getErrorFromErrorObject(argList[1]); + string instanceId = argList[0].ToString(); + _onInterstitialAdLoadFailedDemandOnlyEvent (instanceId, err); + } + } + + private static event Action _onInterstitialAdOpenedDemandOnlyEvent; + + public static event Action onInterstitialAdOpenedDemandOnlyEvent { + add { + if (_onInterstitialAdOpenedDemandOnlyEvent == null || !_onInterstitialAdOpenedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdOpenedDemandOnlyEvent += value; + } + } + + remove { + if (_onInterstitialAdOpenedDemandOnlyEvent != null || _onInterstitialAdOpenedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdOpenedDemandOnlyEvent -= value; + } + } + } + + public void onInterstitialAdOpenedDemandOnly (string instanceId) + { + if (_onInterstitialAdOpenedDemandOnlyEvent != null) { + _onInterstitialAdOpenedDemandOnlyEvent (instanceId); + } + } + + private static event Action _onInterstitialAdClosedDemandOnlyEvent; + + public static event Action onInterstitialAdClosedDemandOnlyEvent { + add { + if (_onInterstitialAdClosedDemandOnlyEvent == null || !_onInterstitialAdClosedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClosedDemandOnlyEvent += value; + } + } + + remove { + if (_onInterstitialAdClosedDemandOnlyEvent != null || _onInterstitialAdClosedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClosedDemandOnlyEvent -= value; + } + } + } + + public void onInterstitialAdClosedDemandOnly (string instanceId) + { + if (_onInterstitialAdClosedDemandOnlyEvent != null) { + _onInterstitialAdClosedDemandOnlyEvent (instanceId); + } + } + + private static event Action _onInterstitialAdShowFailedDemandOnlyEvent; + + public static event Action onInterstitialAdShowFailedDemandOnlyEvent { + add { + if (_onInterstitialAdShowFailedDemandOnlyEvent == null || !_onInterstitialAdShowFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdShowFailedDemandOnlyEvent += value; + } + } + + remove { + if (_onInterstitialAdShowFailedDemandOnlyEvent != null || _onInterstitialAdShowFailedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdShowFailedDemandOnlyEvent -= value; + } + } + } + + public void onInterstitialAdShowFailedDemandOnly (string args) + { + if (_onInterstitialAdLoadFailedDemandOnlyEvent != null && !String.IsNullOrEmpty (args)) { + List argList = IronSourceJSON.Json.Deserialize (args) as List; + IronSourceError sse = getErrorFromErrorObject(argList[1]); + string instanceId = argList[0].ToString(); + _onInterstitialAdShowFailedDemandOnlyEvent (instanceId, sse); + } + } + + private static event Action _onInterstitialAdClickedDemandOnlyEvent; + + public static event Action onInterstitialAdClickedDemandOnlyEvent { + add { + if (_onInterstitialAdClickedDemandOnlyEvent == null || !_onInterstitialAdClickedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClickedDemandOnlyEvent += value; + } + } + + remove { + if (_onInterstitialAdClickedDemandOnlyEvent != null || _onInterstitialAdClickedDemandOnlyEvent.GetInvocationList ().Contains (value)) { + _onInterstitialAdClickedDemandOnlyEvent -= value; + } + } + } + + public void onInterstitialAdClickedDemandOnly (string instanceId) + { + if (_onInterstitialAdClickedDemandOnlyEvent != null) { + _onInterstitialAdClickedDemandOnlyEvent (instanceId); + } + } + + // ******************************* Offerwall Events ******************************* + + private static event Action _onOfferwallOpenedEvent; + + public static event Action onOfferwallOpenedEvent { + add { + if (_onOfferwallOpenedEvent == null || !_onOfferwallOpenedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallOpenedEvent += value; + } + } + + remove { + if (_onOfferwallOpenedEvent != null || _onOfferwallOpenedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallOpenedEvent -= value; + } + } + } + + public void onOfferwallOpened (string empty) + { + if (_onOfferwallOpenedEvent != null) { + _onOfferwallOpenedEvent (); + } + } + + private static event Action _onOfferwallShowFailedEvent; + + public static event Action onOfferwallShowFailedEvent { + add { + if (_onOfferwallShowFailedEvent == null || !_onOfferwallShowFailedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallShowFailedEvent += value; + } + } + + remove { + if (_onOfferwallShowFailedEvent != null || _onOfferwallShowFailedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallShowFailedEvent -= value; + } + } + } + + public void onOfferwallShowFailed (string description) + { + if (_onOfferwallShowFailedEvent != null) { + IronSourceError sse = getErrorFromErrorObject (description); + _onOfferwallShowFailedEvent (sse); + } + } + + private static event Action _onOfferwallClosedEvent; + + public static event Action onOfferwallClosedEvent { + add { + if (_onOfferwallClosedEvent == null || !_onOfferwallClosedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallClosedEvent += value; + } + } + + remove { + if (_onOfferwallClosedEvent != null || _onOfferwallClosedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallClosedEvent -= value; + } + } + } + + public void onOfferwallClosed (string empty) + { + if (_onOfferwallClosedEvent != null) { + _onOfferwallClosedEvent (); + } + } + + private static event Action _onGetOfferwallCreditsFailedEvent; + + public static event Action onGetOfferwallCreditsFailedEvent { + add { + if (_onGetOfferwallCreditsFailedEvent == null || !_onGetOfferwallCreditsFailedEvent.GetInvocationList ().Contains (value)) { + _onGetOfferwallCreditsFailedEvent += value; + } + } + + remove { + if (_onGetOfferwallCreditsFailedEvent != null || _onGetOfferwallCreditsFailedEvent.GetInvocationList ().Contains (value)) { + _onGetOfferwallCreditsFailedEvent -= value; + } + } + } + + public void onGetOfferwallCreditsFailed (string description) + { + if (_onGetOfferwallCreditsFailedEvent != null) { + IronSourceError sse = getErrorFromErrorObject (description); + _onGetOfferwallCreditsFailedEvent (sse); + + } + } + + private static event Action> _onOfferwallAdCreditedEvent; + + public static event Action> onOfferwallAdCreditedEvent { + add { + if (_onOfferwallAdCreditedEvent == null || !_onOfferwallAdCreditedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallAdCreditedEvent += value; + } + } + + remove { + if (_onOfferwallAdCreditedEvent != null || _onOfferwallAdCreditedEvent.GetInvocationList ().Contains (value)) { + _onOfferwallAdCreditedEvent -= value; + } + } + } + + public void onOfferwallAdCredited (string json) + { + if (_onOfferwallAdCreditedEvent != null) + _onOfferwallAdCreditedEvent (IronSourceJSON.Json.Deserialize (json) as Dictionary); + } + + private static event Action _onOfferwallAvailableEvent; + + public static event Action onOfferwallAvailableEvent { + add { + if (_onOfferwallAvailableEvent == null || !_onOfferwallAvailableEvent.GetInvocationList ().Contains (value)) { + _onOfferwallAvailableEvent += value; + } + } + + remove { + if (_onOfferwallAvailableEvent != null || _onOfferwallAvailableEvent.GetInvocationList ().Contains (value)) { + _onOfferwallAvailableEvent -= value; + } + } + } + + public void onOfferwallAvailable (string stringAvailable) + { + bool isAvailable = (stringAvailable == "true") ? true : false; + if (_onOfferwallAvailableEvent != null) + _onOfferwallAvailableEvent (isAvailable); + } + + // ******************************* Banner Events ******************************* + private static event Action _onBannerAdLoadedEvent; + + public static event Action onBannerAdLoadedEvent { + add { + if (_onBannerAdLoadedEvent == null || !_onBannerAdLoadedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdLoadedEvent += value; + } + } + + remove { + if (_onBannerAdLoadedEvent != null || _onBannerAdLoadedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdLoadedEvent -= value; + } + } + } + + public void onBannerAdLoaded () + { + if (_onBannerAdLoadedEvent != null) + _onBannerAdLoadedEvent (); + } + + private static event Action _onBannerAdLoadFailedEvent; + + public static event Action onBannerAdLoadFailedEvent { + add { + if (_onBannerAdLoadFailedEvent == null || !_onBannerAdLoadFailedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdLoadFailedEvent += value; + } + } + + remove { + if (_onBannerAdLoadFailedEvent != null || _onBannerAdLoadFailedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdLoadFailedEvent -= value; + } + } + } + + public void onBannerAdLoadFailed (string description) + { + if (_onBannerAdLoadFailedEvent != null) { + IronSourceError sse = getErrorFromErrorObject (description); + _onBannerAdLoadFailedEvent (sse); + } + + } + + private static event Action _onBannerAdClickedEvent; + + public static event Action onBannerAdClickedEvent { + add { + if (_onBannerAdClickedEvent == null || !_onBannerAdClickedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdClickedEvent += value; + } + } + + remove { + if (_onBannerAdClickedEvent != null || _onBannerAdClickedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdClickedEvent -= value; + } + } + } + + public void onBannerAdClicked () + { + if (_onBannerAdClickedEvent != null) + _onBannerAdClickedEvent (); + } + + private static event Action _onBannerAdScreenPresentedEvent; + + public static event Action onBannerAdScreenPresentedEvent { + add { + if (_onBannerAdScreenPresentedEvent == null || !_onBannerAdScreenPresentedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdScreenPresentedEvent += value; + } + } + + remove { + if (_onBannerAdScreenPresentedEvent != null || _onBannerAdScreenPresentedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdScreenPresentedEvent -= value; + } + } + } + + public void onBannerAdScreenPresented () + { + if (_onBannerAdScreenPresentedEvent != null) + _onBannerAdScreenPresentedEvent (); + } + + private static event Action _onBannerAdScreenDismissedEvent; + + public static event Action onBannerAdScreenDismissedEvent { + add { + if (_onBannerAdScreenDismissedEvent == null || !_onBannerAdScreenDismissedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdScreenDismissedEvent += value; + } + } + + remove { + if (_onBannerAdScreenDismissedEvent != null || _onBannerAdScreenDismissedEvent.GetInvocationList ().Contains (value)) { + _onBannerAdScreenDismissedEvent -= value; + } + } + } + + public void onBannerAdScreenDismissed () + { + if (_onBannerAdScreenDismissedEvent != null) + _onBannerAdScreenDismissedEvent (); + } + + private static event Action _onBannerAdLeftApplicationEvent; + + public static event Action onBannerAdLeftApplicationEvent { + add { + if (_onBannerAdLeftApplicationEvent == null || !_onBannerAdLeftApplicationEvent.GetInvocationList ().Contains (value)) { + _onBannerAdLeftApplicationEvent += value; + } + } + + remove { + if (_onBannerAdLeftApplicationEvent != null || _onBannerAdLeftApplicationEvent.GetInvocationList ().Contains (value)) { + _onBannerAdLeftApplicationEvent -= value; + } + } + } + + public void onBannerAdLeftApplication () + { + if (_onBannerAdLeftApplicationEvent != null) + _onBannerAdLeftApplicationEvent (); + } + + private static event Action _onSegmentReceivedEvent; + public static event Action onSegmentReceivedEvent { + add { + if (_onSegmentReceivedEvent == null || !_onSegmentReceivedEvent.GetInvocationList ().Contains (value)) { + _onSegmentReceivedEvent += value; + } + } + + remove { + if (_onSegmentReceivedEvent != null || _onSegmentReceivedEvent.GetInvocationList ().Contains (value)) { + _onSegmentReceivedEvent -= value; + } + } + } + + public void onSegmentReceived (string segmentName) + { + if (_onSegmentReceivedEvent != null) + _onSegmentReceivedEvent (segmentName); + } + + // ******************************* ImpressionData Callbacks ******************************* + + private static event Action _onImpressionSuccessEvent; + + public static event Action onImpressionSuccessEvent + { + add + { + if (_onImpressionSuccessEvent == null || !_onImpressionSuccessEvent.GetInvocationList().Contains(value)) + { + _onImpressionSuccessEvent += value; + } + } + + remove + { + if (_onImpressionSuccessEvent != null || _onImpressionSuccessEvent.GetInvocationList().Contains(value)) + { + _onImpressionSuccessEvent -= value; + } + } + } + + public void onImpressionSuccess(string args) + { + if (_onImpressionSuccessEvent != null) + { + IronSourceImpressionData impressionData = new IronSourceImpressionData(args); + _onImpressionSuccessEvent(impressionData); + } + + } + + // ******************************* ConsentView Callbacks ******************************* + + //iOS callbacks only - in order to prevent using macro for iOS it's not only iOS + private static event Action _onConsentViewDidFailToLoadWithErrorEvent; + + public static event Action onConsentViewDidFailToLoadWithErrorEvent + { + add + { + if (_onConsentViewDidFailToLoadWithErrorEvent == null || !_onConsentViewDidFailToLoadWithErrorEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidFailToLoadWithErrorEvent += value; + } + } + + remove + { + if (_onConsentViewDidFailToLoadWithErrorEvent != null || _onConsentViewDidFailToLoadWithErrorEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidFailToLoadWithErrorEvent -= value; + } + } + } + + public void onConsentViewDidFailToLoadWithError(string args) + { + if (_onConsentViewDidFailToLoadWithErrorEvent != null && !String.IsNullOrEmpty(args)) + { + List argList = IronSourceJSON.Json.Deserialize(args) as List; + IronSourceError err = getErrorFromErrorObject(argList[1]); + string consentViewType = argList[0].ToString(); + _onConsentViewDidFailToLoadWithErrorEvent(consentViewType, err); + } + } + + private static event Action _onConsentViewDidFailToShowWithErrorEvent; + + public static event Action onConsentViewDidFailToShowWithErrorEvent + { + add + { + if (_onConsentViewDidFailToShowWithErrorEvent == null || !_onConsentViewDidFailToShowWithErrorEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidFailToShowWithErrorEvent += value; + } + } + + remove + { + if (_onConsentViewDidFailToShowWithErrorEvent != null || _onConsentViewDidFailToShowWithErrorEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidFailToShowWithErrorEvent -= value; + } + } + } + + public void onConsentViewDidFailToShowWithError(string args) + { + if (_onConsentViewDidFailToShowWithErrorEvent != null && !String.IsNullOrEmpty(args)) + { + List argList = IronSourceJSON.Json.Deserialize(args) as List; + IronSourceError err = getErrorFromErrorObject(argList[1]); + string consentViewType = argList[0].ToString(); + _onConsentViewDidFailToShowWithErrorEvent(consentViewType, err); + } + } + + private static event Action _onConsentViewDidAcceptEvent; + + public static event Action onConsentViewDidAcceptEvent + { + add + { + if (_onConsentViewDidAcceptEvent == null || !_onConsentViewDidAcceptEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidAcceptEvent += value; + } + } + + remove + { + if (_onConsentViewDidAcceptEvent != null || _onConsentViewDidAcceptEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidAcceptEvent -= value; + } + } + } + + public void onConsentViewDidAccept(string consentViewType) + { + if (_onConsentViewDidAcceptEvent != null) + { + _onConsentViewDidAcceptEvent(consentViewType); + } + } + + private static event Action _onConsentViewDidDismissEvent; + + public static event Action onConsentViewDidDismissEvent + { + add + { + if (_onConsentViewDidDismissEvent == null || !_onConsentViewDidDismissEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidDismissEvent += value; + } + } + + remove + { + if (_onConsentViewDidDismissEvent != null || _onConsentViewDidDismissEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidDismissEvent -= value; + } + } + } + + public void onConsentViewDidDismiss(string consentViewType) + { + if (_onConsentViewDidDismissEvent != null) + { + _onConsentViewDidDismissEvent(consentViewType); + } + } + + private static event Action _onConsentViewDidLoadSuccessEvent; + + public static event Action onConsentViewDidLoadSuccessEvent + { + add + { + if (_onConsentViewDidLoadSuccessEvent == null || !_onConsentViewDidLoadSuccessEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidLoadSuccessEvent += value; + } + } + + remove + { + if (_onConsentViewDidLoadSuccessEvent != null || _onConsentViewDidLoadSuccessEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidLoadSuccessEvent -= value; + } + } + } + + public void onConsentViewDidLoadSuccess(string consentViewType) + { + if (_onConsentViewDidLoadSuccessEvent != null) + { + _onConsentViewDidLoadSuccessEvent(consentViewType); + } + } + + private static event Action _onConsentViewDidShowSuccessEvent; + + public static event Action onConsentViewDidShowSuccessEvent + { + add + { + if (_onConsentViewDidShowSuccessEvent == null || !_onConsentViewDidShowSuccessEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidShowSuccessEvent += value; + } + } + + remove + { + if (_onConsentViewDidShowSuccessEvent != null || _onConsentViewDidShowSuccessEvent.GetInvocationList().Contains(value)) + { + _onConsentViewDidShowSuccessEvent -= value; + } + } + } + + public void onConsentViewDidShowSuccess(string consentViewType) + { + if (_onConsentViewDidShowSuccessEvent != null) + { + _onConsentViewDidShowSuccessEvent(consentViewType); + } + } + + // ******************************* Helper methods ******************************* + + private IronSourceError getErrorFromErrorObject (object descriptionObject) + { + Dictionary error = null; + if (descriptionObject is IDictionary) { + error = descriptionObject as Dictionary; + } + else if (descriptionObject is String && !String.IsNullOrEmpty (descriptionObject.ToString())) { + error = IronSourceJSON.Json.Deserialize (descriptionObject.ToString()) as Dictionary; + } + + IronSourceError sse = new IronSourceError (-1, ""); + if (error != null && error.Count > 0) { + int eCode = Convert.ToInt32 (error [ERROR_CODE].ToString ()); + string eDescription = error [ERROR_DESCRIPTION].ToString (); + sse = new IronSourceError (eCode, eDescription); + } + + return sse; + } + + private IronSourcePlacement getPlacementFromObject (object placementObject) + { + Dictionary placementJSON = null; + if (placementObject is IDictionary) { + placementJSON = placementObject as Dictionary; + } + else if (placementObject is String) { + placementJSON = IronSourceJSON.Json.Deserialize (placementObject.ToString()) as Dictionary; + } + + IronSourcePlacement ssp = null; + if (placementJSON != null && placementJSON.Count > 0) { + int rewardAmount = Convert.ToInt32 (placementJSON ["placement_reward_amount"].ToString ()); + string rewardName = placementJSON ["placement_reward_name"].ToString (); + string placementName = placementJSON ["placement_name"].ToString (); + + ssp = new IronSourcePlacement (placementName, rewardName, rewardAmount); + } + + return ssp; + } + } diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs.meta new file mode 100644 index 00000000..e7b4a105 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 06a7a5a9d456c4634864ec18b18f72dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs b/popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs new file mode 100644 index 00000000..dd692561 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs @@ -0,0 +1,176 @@ +using System.Collections.Generic; + +public interface IronSourceIAgent +{ + //******************* Base API *******************// + + void onApplicationPause (bool pause); + + void setMediationSegment (string segment); + + string getAdvertiserId (); + + void validateIntegration (); + + void shouldTrackNetworkState (bool track); + + bool setDynamicUserId (string dynamicUserId); + + void setAdaptersDebug(bool enabled); + + void setMetaData(string key, string value); + + void setMetaData(string key, params string[] values); + + int? getConversionValue(); + + //******************* SDK Init *******************// + + void setUserId (string userId); + + void init (string appKey); + + void init (string appKey, params string[] adUnits); + + void initISDemandOnly (string appKey, params string[] adUnits); + + //******************* RewardedVideo API *******************// + + void showRewardedVideo (); + + void showRewardedVideo (string placementName); + + bool isRewardedVideoAvailable (); + + bool isRewardedVideoPlacementCapped (string placementName); + + IronSourcePlacement getPlacementInfo (string name); + + void setRewardedVideoServerParams(Dictionary parameters); + + void clearRewardedVideoServerParams(); + + //******************* RewardedVideo DemandOnly API *******************// + + void showISDemandOnlyRewardedVideo (string instanceId); + + void loadISDemandOnlyRewardedVideo (string instanceId); + + bool isISDemandOnlyRewardedVideoAvailable (string instanceId); + + //******************* Interstitial API *******************// + + void loadInterstitial (); + + void showInterstitial (); + + void showInterstitial (string placementName); + + bool isInterstitialReady (); + + bool isInterstitialPlacementCapped (string placementName); + + //******************* Interstitial DemandOnly API *******************// + + void loadISDemandOnlyInterstitial (string instanceId); + + void showISDemandOnlyInterstitial (string instanceId); + + bool isISDemandOnlyInterstitialReady (string instanceId); + + //******************* Offerwall API *******************// + + void showOfferwall (); + + void showOfferwall (string placementName); + + bool isOfferwallAvailable (); + + void getOfferwallCredits (); + + //******************* Banner API *******************// + + void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position); + + void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position, string placementName); + + void destroyBanner(); + + void displayBanner(); + + void hideBanner(); + + bool isBannerPlacementCapped(string placementName); + + void setSegment(IronSourceSegment segment); + + void setConsent(bool consent); + + //******************* ConsentView API *******************// + + void loadConsentViewWithType(string consentViewType); + + void showConsentViewWithType(string consentViewType); + + //******************* ILRD API *******************// + + void setAdRevenueData(string dataSource, Dictionary impressionData); +} + +public static class dataSource +{ + public static string MOPUB { get { return "MoPub"; } } + +} + + +public static class IronSourceAdUnits +{ + public static string REWARDED_VIDEO { get { return "rewardedvideo"; } } + + public static string INTERSTITIAL { get { return "interstitial"; } } + + public static string OFFERWALL { get { return "offerwall"; } } + + public static string BANNER { get { return "banner"; } } +} + +public class IronSourceBannerSize +{ + private int width; + private int height; + private string description; + + public static IronSourceBannerSize BANNER = new IronSourceBannerSize("BANNER"); + public static IronSourceBannerSize LARGE = new IronSourceBannerSize("LARGE"); + public static IronSourceBannerSize RECTANGLE = new IronSourceBannerSize("RECTANGLE"); + public static IronSourceBannerSize SMART = new IronSourceBannerSize("SMART"); + + private IronSourceBannerSize() { + + } + + public IronSourceBannerSize(int width, int height) + { + this.width = width; + this.height = height; + this.description = "CUSTOM"; + } + + public IronSourceBannerSize(string description) + { + this.description = description; + this.width = 0; + this.height = 0; + } + + public string Description { get { return description; } } + public int Width { get { return width; } } + public int Height { get { return height; } } +}; + +public enum IronSourceBannerPosition +{ + TOP = 1, + BOTTOM = 2 +}; diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs.meta new file mode 100644 index 00000000..9fb1e9f8 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceIAgent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a69a6174c46124e04b4b27ac7fbdd78d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs b/popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs new file mode 100644 index 00000000..56cc4b1b --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using UnityEngine; + +public class IronSourceImpressionData +{ + + public readonly string auctionId; + public readonly string adUnit; + public readonly string country; + public readonly string ab; + public readonly string segmentName; + public readonly string placement; + public readonly string adNetwork; + public readonly string instanceName; + public readonly string instanceId; + public readonly double? revenue; + public readonly string precision; + public readonly double? lifetimeRevenue; + public readonly string encryptedCPM; + public readonly int? conversionValue; + public readonly string allData; + + + public IronSourceImpressionData(string json) + { + if (json != null) + { + try + { + object obj; + double parsedDouble; + int parsedInt; + allData = json; + // Retrieve a CultureInfo object. + CultureInfo invCulture = CultureInfo.InvariantCulture; + Dictionary jsonDic = IronSourceJSON.Json.Deserialize(json) as Dictionary; + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_AUCTION_ID, out obj) && obj != null) + { + auctionId = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_AD_UNIT, out obj) && obj != null) + { + adUnit = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_COUNTRY, out obj) && obj != null) + { + country = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_ABTEST, out obj) && obj != null) + { + ab = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_SEGMENT_NAME, out obj) && obj != null) + { + segmentName = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_PLACEMENT, out obj) && obj != null) + { + placement = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_AD_NETWORK, out obj) && obj != null) + { + adNetwork = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_INSTANCE_NAME, out obj) && obj != null) + { + instanceName = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.INSTANCE_ID_KEY, out obj) && obj != null) + { + instanceId = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_PRECISION, out obj) && obj != null) + { + precision = obj.ToString(); + } + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_ENCRYPTED_CPM, out obj) && obj != null) + { + encryptedCPM = obj.ToString(); + } + + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_REVENUE, out obj) && obj != null && double.TryParse(string.Format(invCulture, "{0}", obj), NumberStyles.Any, invCulture, out parsedDouble)) + { + revenue = parsedDouble; + } + + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_LIFETIME_REVENUE, out obj) && obj != null && double.TryParse(string.Format(invCulture,"{0}",obj), NumberStyles.Any, invCulture, out parsedDouble)) + { + lifetimeRevenue = parsedDouble; + } + + if (jsonDic.TryGetValue(IronSourceConstants.IMPRESSION_DATA_KEY_CONVERSION_VALUE, out obj) && obj != null && int.TryParse(string.Format(invCulture, "{0}", obj), NumberStyles.Any, invCulture, out parsedInt)) + { + conversionValue = parsedInt; + } + + } + catch (Exception ex) + { + Debug.Log("error parsing impression " + ex.ToString()); + } + + } + } + + public override string ToString() + { + return "IronSourceImpressionData{" + + "auctionId='" + auctionId + '\'' + + ", adUnit='" + adUnit + '\'' + + ", country='" + country + '\'' + + ", ab='" + ab + '\'' + + ", segmentName='" + segmentName + '\'' + + ", placement='" + placement + '\'' + + ", adNetwork='" + adNetwork + '\'' + + ", instanceName='" + instanceName + '\'' + + ", instanceId='" + instanceId + '\'' + + ", revenue=" + revenue + + ", precision='" + precision + '\'' + + ", lifetimeRevenue=" + lifetimeRevenue + + ", encryptedCPM='" + encryptedCPM + '\'' + + ", conversionValue=" + conversionValue + + '}'; + } +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs.meta new file mode 100644 index 00000000..2450e9a8 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceImpressionData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7ab0e9e995e4a4024abb4cee85c301ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs b/popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs new file mode 100644 index 00000000..e9b12e61 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs @@ -0,0 +1,43 @@ +using UnityEngine; + +public class IronSourceInitilizer +{ +#if UNITY_IOS || UNITY_ANDROID + [RuntimeInitializeOnLoadMethod] + static void Initilize() + { + var developerSettings = Resources.Load(IronSourceConstants.IRONSOURCE_MEDIATION_SETTING_NAME); + if (developerSettings != null) + { +#if UNITY_ANDROID + string appKey = developerSettings.AndroidAppKey; +#elif UNITY_IOS + string appKey = developerSettings.IOSAppKey; +#endif + if (developerSettings.EnableIronsourceSDKInitAPI == true) + { + if (appKey.Equals(string.Empty)) + { + Debug.LogWarning("IronSourceInitilizer Cannot init without AppKey"); + } + else + { + IronSource.Agent.init(appKey); + } + + } + + if (developerSettings.EnableAdapterDebug) + { + IronSource.Agent.setAdaptersDebug(true); + } + + if (developerSettings.EnableIntegrationHelper) + { + IronSource.Agent.validateIntegration(); + } + } + } +#endif + +} diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs.meta new file mode 100644 index 00000000..da552e01 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceInitilizer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f3e8e12247da34eafb182ebdfb06c10e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs b/popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs new file mode 100644 index 00000000..433e440b --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs @@ -0,0 +1,495 @@ +/* + * Based on the miniJSON by Calvin Rien + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + +namespace IronSourceJSON +{ + public static class Json + { + public static object Deserialize (string json) + { + if (json == null) { + return null; + } + return Parser.Parse (json); + } + + sealed class Parser : IDisposable + { + const string WHITE_SPACE = " \t\n\r"; + const string WORD_BREAK = " \t\n\r{}[],:\""; + + enum TOKEN + { + NONE, + CURLY_OPEN, + CURLY_CLOSE, + SQUARED_OPEN, + SQUARED_CLOSE, + COLON, + COMMA, + STRING, + NUMBER, + TRUE, + FALSE, + NULL + } + ; + + StringReader json; + + Parser (string jsonString) + { + json = new StringReader (jsonString); + } + + public static object Parse (string jsonString) + { + using (var instance = new Parser(jsonString)) { + return instance.ParseValue (); + } + } + + public void Dispose () + { + json.Dispose (); + json = null; + } + + Dictionary ParseObject () + { + Dictionary table = new Dictionary (); + + // ditch opening brace + json.Read (); + + // { + while (true) { + switch (NextToken) { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.CURLY_CLOSE: + return table; + default: + // name + string name = ParseString (); + if (name == null) { + return null; + } + + // : + if (NextToken != TOKEN.COLON) { + return null; + } + // ditch the colon + json.Read (); + + // value + table [name] = ParseValue (); + break; + } + } + } + + List ParseArray () + { + List array = new List (); + + // ditch opening bracket + json.Read (); + + // [ + var parsing = true; + while (parsing) { + TOKEN nextToken = NextToken; + + switch (nextToken) { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.SQUARED_CLOSE: + parsing = false; + break; + default: + object value = ParseByToken (nextToken); + + array.Add (value); + break; + } + } + + return array; + } + + object ParseValue () + { + TOKEN nextToken = NextToken; + return ParseByToken (nextToken); + } + + object ParseByToken (TOKEN token) + { + switch (token) { + case TOKEN.STRING: + return ParseString (); + case TOKEN.NUMBER: + return ParseNumber (); + case TOKEN.CURLY_OPEN: + return ParseObject (); + case TOKEN.SQUARED_OPEN: + return ParseArray (); + case TOKEN.TRUE: + return true; + case TOKEN.FALSE: + return false; + case TOKEN.NULL: + return null; + default: + return null; + } + } + + string ParseString () + { + StringBuilder s = new StringBuilder (); + char c; + + // ditch opening quote + json.Read (); + + bool parsing = true; + while (parsing) { + + if (json.Peek () == -1) { + parsing = false; + break; + } + + c = NextChar; + switch (c) { + case '"': + parsing = false; + break; + case '\\': + if (json.Peek () == -1) { + parsing = false; + break; + } + + c = NextChar; + switch (c) { + case '"': + case '\\': + case '/': + s.Append (c); + break; + case 'b': + s.Append ('\b'); + break; + case 'f': + s.Append ('\f'); + break; + case 'n': + s.Append ('\n'); + break; + case 'r': + s.Append ('\r'); + break; + case 't': + s.Append ('\t'); + break; + case 'u': + var hex = new StringBuilder (); + + for (int i=0; i< 4; i++) { + hex.Append (NextChar); + } + + s.Append ((char)Convert.ToInt32 (hex.ToString (), 16)); + break; + } + break; + default: + s.Append (c); + break; + } + } + + return s.ToString (); + } + + object ParseNumber () + { + string number = NextWord; + + if (number.IndexOf ('.') == -1) { + long parsedInt; + Int64.TryParse (number, NumberStyles.Any, CultureInfo.InvariantCulture, out parsedInt); + return parsedInt; + } + + double parsedDouble; + Double.TryParse (number, NumberStyles.Any, CultureInfo.InvariantCulture, out parsedDouble); + return parsedDouble; + } + + void EatWhitespace () + { + while (WHITE_SPACE.IndexOf(PeekChar) != -1) { + json.Read (); + + if (json.Peek () == -1) { + break; + } + } + } + + char PeekChar { + get { + return Convert.ToChar (json.Peek ()); + } + } + + char NextChar { + get { + return Convert.ToChar (json.Read ()); + } + } + + string NextWord { + get { + StringBuilder word = new StringBuilder (); + + while (WORD_BREAK.IndexOf(PeekChar) == -1) { + word.Append (NextChar); + + if (json.Peek () == -1) { + break; + } + } + + return word.ToString (); + } + } + + TOKEN NextToken { + get { + EatWhitespace (); + + if (json.Peek () == -1) { + return TOKEN.NONE; + } + + char c = PeekChar; + switch (c) { + case '{': + return TOKEN.CURLY_OPEN; + case '}': + json.Read (); + return TOKEN.CURLY_CLOSE; + case '[': + return TOKEN.SQUARED_OPEN; + case ']': + json.Read (); + return TOKEN.SQUARED_CLOSE; + case ',': + json.Read (); + return TOKEN.COMMA; + case '"': + return TOKEN.STRING; + case ':': + return TOKEN.COLON; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TOKEN.NUMBER; + } + + string word = NextWord; + + switch (word) { + case "false": + return TOKEN.FALSE; + case "true": + return TOKEN.TRUE; + case "null": + return TOKEN.NULL; + } + + return TOKEN.NONE; + } + } + } + + /// + /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string + /// + /// A Dictionary<string, object> / List<object> + /// A JSON encoded string, or null if object 'json' is not serializable + public static string Serialize (object obj) + { + return Serializer.Serialize (obj); + } + + sealed class Serializer + { + StringBuilder builder; + + Serializer () + { + builder = new StringBuilder (); + } + + public static string Serialize (object obj) + { + var instance = new Serializer (); + + instance.SerializeValue (obj); + + return instance.builder.ToString (); + } + + void SerializeValue (object value) + { + IList asList; + IDictionary asDict; + string asStr; + + if (value == null) { + builder.Append ("null"); + } else if ((asStr = value as string) != null) { + SerializeString (asStr); + } else if (value is bool) { + builder.Append (value.ToString ().ToLower ()); + } else if ((asList = value as IList) != null) { + SerializeArray (asList); + } else if ((asDict = value as IDictionary) != null) { + SerializeObject (asDict); + } else if (value is char) { + SerializeString (value.ToString ()); + } else { + SerializeOther (value); + } + } + + void SerializeObject (IDictionary obj) + { + bool first = true; + + builder.Append ('{'); + + foreach (object e in obj.Keys) { + if (!first) { + builder.Append (','); + } + + SerializeString (e.ToString ()); + builder.Append (':'); + + SerializeValue (obj [e]); + + first = false; + } + + builder.Append ('}'); + } + + void SerializeArray (IList anArray) + { + builder.Append ('['); + + bool first = true; + + foreach (object obj in anArray) { + if (!first) { + builder.Append (','); + } + + SerializeValue (obj); + + first = false; + } + + builder.Append (']'); + } + + void SerializeString (string str) + { + builder.Append ('\"'); + + char[] charArray = str.ToCharArray (); + foreach (var c in charArray) { + switch (c) { + case '"': + builder.Append ("\\\""); + break; + case '\\': + builder.Append ("\\\\"); + break; + case '\b': + builder.Append ("\\b"); + break; + case '\f': + builder.Append ("\\f"); + break; + case '\n': + builder.Append ("\\n"); + break; + case '\r': + builder.Append ("\\r"); + break; + case '\t': + builder.Append ("\\t"); + break; + default: + int codepoint = Convert.ToInt32 (c); + if ((codepoint >= 32) && (codepoint <= 126)) { + builder.Append (c); + } else { + builder.Append ("\\u" + Convert.ToString (codepoint, 16).PadLeft (4, '0')); + } + break; + } + } + + builder.Append ('\"'); + } + + void SerializeOther (object value) + { + if (value is float + || value is int + || value is uint + || value is long + || value is double + || value is sbyte + || value is byte + || value is short + || value is ushort + || value is ulong + || value is decimal) { + builder.Append (value.ToString ()); + } else { + SerializeString (value.ToString ()); + } + } + } + } +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs.meta new file mode 100644 index 00000000..9aa06512 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceJSON.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6704b25b621ab47ebbfa013ced92bdb0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs b/popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs new file mode 100644 index 00000000..93fda39c --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs @@ -0,0 +1,26 @@ +using System.IO; +using UnityEngine; + +public class IronSourceMediationSettings : ScriptableObject +{ + public static readonly string IRONSOURCE_SETTINGS_ASSET_PATH = Path.Combine(IronSourceConstants.IRONSOURCE_RESOURCES_PATH, IronSourceConstants.IRONSOURCE_MEDIATION_SETTING_NAME + ".asset"); + + [Header("Ironsource AppKey")] + [Tooltip("Add your application AppKeys, as provided in Ironsource Platform")] + public string AndroidAppKey = string.Empty; + [Tooltip("Add your application AppKeys, as provided in Ironsource Platform")] + public string IOSAppKey = string.Empty; + + [Header("Automatic Initialization")] + [Tooltip("Use this flag when you wish to initialize all ad units (recommended)")] + public bool EnableIronsourceSDKInitAPI; + + [Header("Ironsource SKAdNetwork ID")] + [Tooltip("Add Ironsource SKAdNetworkIdentifier to your Info.plist for iOS 14+")] + public bool AddIronsourceSkadnetworkID; + + [Header("Project Features")] + public bool EnableAdapterDebug; + + public bool EnableIntegrationHelper; +} diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs.meta new file mode 100644 index 00000000..71bc284a --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceMediationSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d5a679b8640d04834b4f09b8c6adec7a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs b/popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs new file mode 100644 index 00000000..0467ae53 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs @@ -0,0 +1,37 @@ +using System; + +public class IronSourcePlacement +{ + private string rewardName; + private int rewardAmount; + private string placementName; + + public IronSourcePlacement (string placementName, string rewardName, int rewardAmount) + { + this.placementName = placementName; + this.rewardName = rewardName; + this.rewardAmount = rewardAmount; + } + + public string getRewardName () + { + return rewardName; + } + + public int getRewardAmount () + { + return rewardAmount; + } + + public string getPlacementName () + { + return placementName; + } + + public override string ToString () + { + return placementName + " : " + rewardName + " : " + rewardAmount; + } + + +} diff --git a/popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs.meta new file mode 100644 index 00000000..eaa50d3c --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourcePlacement.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 984e6a9b75cea4626baa9dcb08114ebf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs b/popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs new file mode 100644 index 00000000..332761b8 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs @@ -0,0 +1,66 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using System.Linq; + + + + +public class IronSourceSegment +{ + + public int age; + public string gender = null; + public int level; + public int isPaying; + public long userCreationDate; + public double iapt; + public string segmentName = null; + public Dictionary customs; + + public IronSourceSegment () + { + customs = new Dictionary (); + age = -1; + level = -1; + isPaying = -1; + userCreationDate = -1; + iapt = 0; + } + + public void setCustom(string key, string value){ + customs.Add (key, value); + } + + public Dictionary getSegmentAsDict () + { + Dictionary temp = new Dictionary (); + if (age != -1) + temp.Add ("age", age + ""); + if (!string.IsNullOrEmpty(gender)) + temp.Add ("gender", gender); + if (level != -1) + temp.Add ("level", level + ""); + if (isPaying > -1 && isPaying < 2) + temp.Add ("isPaying", isPaying + ""); + if (userCreationDate != -1) + temp.Add ("userCreationDate", userCreationDate + ""); + if (!string.IsNullOrEmpty(segmentName)) + temp.Add ("segmentName", segmentName); + if (iapt > 0) + temp.Add ("iapt", iapt + ""); + + Dictionary result = temp.Concat (customs).GroupBy (d => d.Key).ToDictionary (d => d.Key, d => d.First ().Value); + + return result; + + } + + + + + + +} + + diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs.meta new file mode 100644 index 00000000..7c4793e6 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceSegment.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f060327917ac94f60857545bd54c308e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs b/popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs new file mode 100644 index 00000000..163cfbf1 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs @@ -0,0 +1,59 @@ +using System; +using System.Collections; +using System.Collections.Generic; + +public class IronSourceUtils + { + private const string ERROR_CODE = "error_code"; + private const string ERROR_DESCRIPTION = "error_description"; + private const string INSTANCE_ID_KEY = "instanceId"; + private const string PLACEMENT_KEY = "placement"; + + public static IronSourceError getErrorFromErrorObject(object descriptionObject) + { + Dictionary error = null; + if (descriptionObject is IDictionary) + { + error = descriptionObject as Dictionary; + } + else if (descriptionObject is String && !String.IsNullOrEmpty(descriptionObject.ToString())) + { + error = IronSourceJSON.Json.Deserialize(descriptionObject.ToString()) as Dictionary; + } + + IronSourceError sse = new IronSourceError(-1, ""); + if (error != null && error.Count > 0) + { + int eCode = Convert.ToInt32(error[ERROR_CODE].ToString()); + string eDescription = error[ERROR_DESCRIPTION].ToString(); + sse = new IronSourceError(eCode, eDescription); + } + + return sse; + } + + public static IronSourcePlacement getPlacementFromObject(object placementObject) + { + Dictionary placementJSON = null; + if (placementObject is IDictionary) + { + placementJSON = placementObject as Dictionary; + } + else if (placementObject is String) + { + placementJSON = IronSourceJSON.Json.Deserialize(placementObject.ToString()) as Dictionary; + } + + IronSourcePlacement ssp = null; + if (placementJSON != null && placementJSON.Count > 0) + { + int rewardAmount = Convert.ToInt32(placementJSON["placement_reward_amount"].ToString()); + string rewardName = placementJSON["placement_reward_name"].ToString(); + string placementName = placementJSON["placement_name"].ToString(); + + ssp = new IronSourcePlacement(placementName, rewardName, rewardAmount); + } + + return ssp; + } +} diff --git a/popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs.meta b/popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs.meta new file mode 100644 index 00000000..fa70f690 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/IronSourceUtils.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bba6a563b7b0746aea78a1ea9fea14fe +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs b/popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs new file mode 100644 index 00000000..05394f72 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs @@ -0,0 +1,287 @@ +using UnityEngine; +using System.Collections; +using System.Collections.Generic; + +public class UnsupportedPlatformAgent : IronSourceIAgent +{ + public UnsupportedPlatformAgent () + { + Debug.Log ("Unsupported Platform"); + } + + #region IronSourceAgent implementation + + public void start () + { + Debug.Log ("Unsupported Platform"); + } + + //******************* Base API *******************// + + public void onApplicationPause (bool pause) + { + Debug.Log ("Unsupported Platform"); + } + + public void setMediationSegment (string segment) + { + Debug.Log ("Unsupported Platform"); + } + + public string getAdvertiserId () + { + Debug.Log ("Unsupported Platform"); + return ""; + } + + public void validateIntegration () + { + Debug.Log ("Unsupported Platform"); + } + + public void shouldTrackNetworkState (bool track) + { + Debug.Log ("Unsupported Platform"); + } + + public bool setDynamicUserId (string dynamicUserId) + { + Debug.Log ("Unsupported Platform"); + return false; + } + + public void setAdaptersDebug(bool enabled) + { + Debug.Log ("Unsupported Platform"); + } + + public void setMetaData(string key, string value) + { + Debug.Log("Unsupported Platform"); + } + + public void setMetaData(string key, params string[] values) + { + Debug.Log("Unsupported Platform"); + } + + public int? getConversionValue() + { + Debug.Log("Unsupported Platform"); + return null; + } + + //******************* SDK Init *******************// + + public void setUserId (string userId) + { + Debug.Log ("Unsupported Platform"); + } + + public void init (string appKey) + { + Debug.Log ("Unsupported Platform"); + } + + public void init (string appKey, params string[] adUnits) + { + Debug.Log ("Unsupported Platform"); + } + + public void initISDemandOnly (string appKey, params string[] adUnits) + { + Debug.Log ("Unsupported Platform"); + } + + //******************* RewardedVideo API *******************// + + public void showRewardedVideo () + { + Debug.Log ("Unsupported Platform"); + } + + public void showRewardedVideo (string placementName) + { + Debug.Log ("Unsupported Platform"); + } + + public bool isRewardedVideoAvailable () + { + Debug.Log ("Unsupported Platform"); + return false; + } + + public bool isRewardedVideoPlacementCapped (string placementName) + { + Debug.Log ("Unsupported Platform"); + return true; + } + + public IronSourcePlacement getPlacementInfo (string placementName) + { + Debug.Log ("Unsupported Platform"); + return null; + } + + public void setRewardedVideoServerParams(Dictionary parameters) + { + Debug.Log ("Unsupported Platform"); + } + + public void clearRewardedVideoServerParams() + { + Debug.Log ("Unsupported Platform"); + } + + //******************* RewardedVideo DemandOnly API *******************// + + public void showISDemandOnlyRewardedVideo (string instanceId) + { + Debug.Log ("Unsupported Platform"); + } + + public void loadISDemandOnlyRewardedVideo (string instanceId) + { + Debug.Log ("Unsupported Platform"); + + } + + public bool isISDemandOnlyRewardedVideoAvailable (string instanceId) + { + Debug.Log ("Unsupported Platform"); + return false; + } + + //******************* Interstitial API *******************// + + public void loadInterstitial () + { + Debug.Log ("Unsupported Platform"); + } + + public void showInterstitial () + { + Debug.Log ("Unsupported Platform"); + } + + public void showInterstitial (string placementName) + { + Debug.Log ("Unsupported Platform"); + } + + public bool isInterstitialReady () + { + Debug.Log ("Unsupported Platform"); + return false; + } + + public bool isInterstitialPlacementCapped (string placementName) + { + Debug.Log ("Unsupported Platform"); + return true; + } + + //******************* Interstitial DemandOnly API *******************// + + public void loadISDemandOnlyInterstitial (string instanceId) + { + Debug.Log ("Unsupported Platform"); + } + + public void showISDemandOnlyInterstitial (string instanceId) + { + Debug.Log ("Unsupported Platform"); + } + + public bool isISDemandOnlyInterstitialReady (string instanceId) + { + Debug.Log ("Unsupported Platform"); + return false; + } + + //******************* Offerwall API *******************// + + public void showOfferwall () + { + Debug.Log ("Unsupported Platform"); + } + + public void showOfferwall (string placementName) + { + Debug.Log ("Unsupported Platform"); + } + + public void getOfferwallCredits () + { + Debug.Log ("Unsupported Platform"); + } + + public bool isOfferwallAvailable () + { + Debug.Log ("Unsupported Platform"); + return false; + } + + //******************* Banner API *******************// + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position) + { + Debug.Log ("Unsupported Platform"); + } + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position, string placementName) + { + Debug.Log ("Unsupported Platform"); + } + + public void destroyBanner() + { + Debug.Log ("Unsupported Platform"); + } + + public void displayBanner() + { + Debug.Log ("Unsupported Platform"); + } + + public void hideBanner() + { + Debug.Log ("Unsupported Platform"); + } + + public bool isBannerPlacementCapped(string placementName) + { + Debug.Log ("Unsupported Platform"); + return false; + } + + public void setSegment(IronSourceSegment segment){ + Debug.Log ("Unsupported Platform"); + } + + public void setConsent(bool consent) + { + Debug.Log ("Unsupported Platform"); + } + + //******************* ConsentView API *******************// + + public void loadConsentViewWithType(string consentViewType) + { + Debug.Log("Unsupported Platform"); + } + + public void showConsentViewWithType(string consentViewType) + { + Debug.Log("Unsupported Platform"); + } + + //******************* ILRD API *******************// + + public void setAdRevenueData(string dataSource, Dictionary impressionData) + { + Debug.Log("Unsupported Platform"); + } + + #endregion +} \ No newline at end of file diff --git a/popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs.meta b/popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs.meta new file mode 100644 index 00000000..126fe0c5 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/UnsupportedPlatformAgent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa7a1bdde72c745a48f5ab116d847d96 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/IronSource/Scripts/iOSAgent.cs b/popcorn/Assets/IronSource/Scripts/iOSAgent.cs new file mode 100644 index 00000000..a8787d05 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/iOSAgent.cs @@ -0,0 +1,455 @@ +#if UNITY_IPHONE || UNITY_IOS +using UnityEngine; +using System.Collections; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Linq; +using System; +using System.Globalization; + +public class iOSAgent : IronSourceIAgent +{ + [DllImport("__Internal")] + private static extern void CFSetPluginData (string pluginType, string pluginVersion, string pluginFrameworkVersion); + + [DllImport("__Internal")] + private static extern void CFSetMediationSegment (string segment); + + [DllImport("__Internal")] + private static extern string CFGetAdvertiserId (); + + [DllImport("__Internal")] + private static extern void CFValidateIntegration (); + + [DllImport("__Internal")] + private static extern void CFShouldTrackNetworkState (bool track); + + [DllImport("__Internal")] + private static extern bool CFSetDynamicUserId (string dynamicUserId); + + [DllImport("__Internal")] + private static extern void CFSetAdaptersDebug (bool enabled); + + [DllImport("__Internal")] + private static extern void CFSetMetaData (string key, string value); + + [DllImport("__Internal")] + private static extern void CFSetMetaDataWithValues (string key, params string[] values); + + [DllImport("__Internal")] + private static extern string CFGetConversionValue(); + + //******************* SDK Init *******************// + + [DllImport("__Internal")] + private static extern void CFSetUserId (string userId); + + [DllImport("__Internal")] + private static extern void CFInit (string appKey); + + [DllImport("__Internal")] + private static extern void CFInitWithAdUnits (string appKey, params string[] adUnits); + + [DllImport("__Internal")] + private static extern void CFInitISDemandOnly (string appKey, params string[] adUnits); + + //******************* RewardedVideo API *******************// + + [DllImport("__Internal")] + private static extern void CFShowRewardedVideo (); + + [DllImport("__Internal")] + private static extern void CFShowRewardedVideoWithPlacementName (string placementName); + + [DllImport("__Internal")] + private static extern bool CFIsRewardedVideoAvailable (); + + [DllImport("__Internal")] + private static extern bool CFIsRewardedVideoPlacementCapped (string placementName); + + [DllImport("__Internal")] + private static extern string CFGetPlacementInfo (string placementName); + + [DllImport("__Internal")] + private static extern void CFSetRewardedVideoServerParameters (string jsonString); + + [DllImport("__Internal")] + private static extern void CFClearRewardedVideoServerParameters (); + + //******************* RewardedVideo DemandOnly API *******************// + + [DllImport("__Internal")] + private static extern void CFShowISDemandOnlyRewardedVideo (string instanceId); + + [DllImport("__Internal")] + private static extern void CFLoadISDemandOnlyRewardedVideo (string instanceId); + + [DllImport("__Internal")] + private static extern bool CFIsDemandOnlyRewardedVideoAvailable (string instanceId); + + //******************* Interstitial API *******************// + + [DllImport("__Internal")] + private static extern void CFLoadInterstitial (); + + [DllImport("__Internal")] + private static extern void CFShowInterstitial (); + + [DllImport("__Internal")] + private static extern void CFShowInterstitialWithPlacementName (string placementName); + + [DllImport("__Internal")] + private static extern bool CFIsInterstitialReady (); + + [DllImport("__Internal")] + private static extern bool CFIsInterstitialPlacementCapped (string placementName); + + //******************* Interstitial DemandOnly API *******************// + + [DllImport("__Internal")] + private static extern void CFLoadISDemandOnlyInterstitial (string instanceId); + + [DllImport("__Internal")] + private static extern void CFShowISDemandOnlyInterstitial(string instanceId); + + [DllImport("__Internal")] + private static extern bool CFIsDemandOnlyInterstitialReady (string instanceId); + + + //******************* Offerwall API *******************// + + [DllImport("__Internal")] + private static extern void CFShowOfferwall (); + + [DllImport("__Internal")] + private static extern void CFShowOfferwallWithPlacementName (string placementName); + + [DllImport("__Internal")] + private static extern void CFGetOfferwallCredits (); + + [DllImport("__Internal")] + private static extern bool CFIsOfferwallAvailable (); + + //******************* Banner API *******************// + + [DllImport("__Internal")] + private static extern void CFLoadBanner (string description, int width, int height, int position, string placementName); + + [DllImport("__Internal")] + private static extern void CFDestroyBanner (); + + [DllImport("__Internal")] + private static extern void CFDisplayBanner (); + + [DllImport("__Internal")] + private static extern void CFHideBanner (); + + [DllImport("__Internal")] + private static extern bool CFIsBannerPlacementCapped (string placementName); + + [DllImport("__Internal")] + private static extern void CFSetSegment(string json); + + [DllImport("__Internal")] + private static extern void CFSetConsent(bool consent); + + //******************* ConsentView API *******************// + + [DllImport("__Internal")] + private static extern void CFLoadConsentViewWithType(string consentViewType); + + [DllImport("__Internal")] + private static extern void CFShowConsentViewWithType(string consentViewType); + + //******************* ILRD API *******************// + + [DllImport("__Internal")] + private static extern void CFSetAdRevenueData(string dataSource, string impressionData); + + public iOSAgent () + { + } + +#region IronSourceIAgent implementation + + //******************* Base API *******************// + + public void onApplicationPause (bool pause) + { + + } + + public void setMediationSegment (string segment) + { + CFSetMediationSegment (segment); + } + + public string getAdvertiserId () + { + return CFGetAdvertiserId (); + } + + public void validateIntegration () + { + CFValidateIntegration (); + } + + public void shouldTrackNetworkState (bool track) + { + CFShouldTrackNetworkState (track); + } + + public bool setDynamicUserId (string dynamicUserId) + { + return CFSetDynamicUserId (dynamicUserId); + } + + public void setAdaptersDebug(bool enabled) + { + CFSetAdaptersDebug (enabled); + } + + public void setMetaData(string key, params string[] values) + { + CFSetMetaDataWithValues(key, values); + } + + public void setMetaData(string key, string value) + { + CFSetMetaData(key, value); + } + + public int? getConversionValue() + { + CultureInfo invCulture = CultureInfo.InvariantCulture; + int parsedInt; + if(int.TryParse(string.Format(invCulture, "{0}", CFGetConversionValue()), NumberStyles.Any, invCulture, out parsedInt)) + { + return parsedInt; + } + + return null; + } + + //******************* SDK Init *******************// + + public void setUserId (string userId) + { + CFSetUserId (userId); + } + + public void init (string appKey) + { + CFSetPluginData ("Unity", IronSource.pluginVersion(), IronSource.unityVersion()); + Debug.Log ("IntegrationHelper pluginVersion: " + IronSource.pluginVersion ()); + CFInit (appKey); + } + + public void init (string appKey, params string[] adUnits) + { + CFSetPluginData ("Unity", IronSource.pluginVersion(), IronSource.unityVersion()); + Debug.Log ("IntegrationHelper pluginVersion: " + IronSource.pluginVersion ()); + CFInitWithAdUnits (appKey, adUnits); + } + + public void initISDemandOnly (string appKey, params string[] adUnits) + { + CFSetPluginData ("Unity", IronSource.pluginVersion(), IronSource.unityVersion()); + Debug.Log ("IntegrationHelper pluginVersion: " + IronSource.pluginVersion ()); + CFInitISDemandOnly (appKey, adUnits); + } + + //******************* RewardedVideo API *******************// + + public void showRewardedVideo () + { + CFShowRewardedVideo (); + } + + public void showRewardedVideo (string placementName) + { + CFShowRewardedVideoWithPlacementName (placementName); + } + + public bool isRewardedVideoAvailable () + { + return CFIsRewardedVideoAvailable (); + } + + public bool isRewardedVideoPlacementCapped (string placementName) + { + return CFIsRewardedVideoPlacementCapped (placementName); + } + + public IronSourcePlacement getPlacementInfo (string placementName) + { + IronSourcePlacement sp = null; + + string spString = CFGetPlacementInfo (placementName); + if (spString != null) { + Dictionary spDic = IronSourceJSON.Json.Deserialize (spString) as Dictionary; + string pName = spDic ["placement_name"].ToString (); + string rewardName = spDic ["reward_name"].ToString (); + int rewardAmount = Convert.ToInt32 (spDic ["reward_amount"].ToString ()); + sp = new IronSourcePlacement (pName, rewardName, rewardAmount); + } + + return sp; + } + + public void setRewardedVideoServerParams(Dictionary parameters){ + string json = IronSourceJSON.Json.Serialize (parameters); + CFSetRewardedVideoServerParameters (json); + } + + public void clearRewardedVideoServerParams(){ + CFClearRewardedVideoServerParameters (); + } + + //******************* RewardedVideo DemandOnly API *******************// + + public void showISDemandOnlyRewardedVideo (string instanceId) + { + CFShowISDemandOnlyRewardedVideo(instanceId); + } + + public void loadISDemandOnlyRewardedVideo (string instanceId) + { + CFLoadISDemandOnlyRewardedVideo(instanceId); + } + + public bool isISDemandOnlyRewardedVideoAvailable (string instanceId) + { + return CFIsDemandOnlyRewardedVideoAvailable(instanceId); + } + + //******************* Interstitial API *******************// + + public void loadInterstitial () + { + CFLoadInterstitial (); + } + + public void showInterstitial () + { + CFShowInterstitial (); + } + + public void showInterstitial (string placementName) + { + CFShowInterstitialWithPlacementName (placementName); + } + + public bool isInterstitialReady () + { + return CFIsInterstitialReady (); + } + + public bool isInterstitialPlacementCapped (string placementName) + { + return CFIsInterstitialPlacementCapped (placementName); + } + + //******************* Interstitial DemandOnly API *******************// + + public void loadISDemandOnlyInterstitial (string instanceId) + { + CFLoadISDemandOnlyInterstitial (instanceId); + } + + public void showISDemandOnlyInterstitial (string instanceId) + { + CFShowISDemandOnlyInterstitial(instanceId); + } + + public bool isISDemandOnlyInterstitialReady (string instanceId) + { + return CFIsDemandOnlyInterstitialReady (instanceId); + } + + //******************* Offerwall API *******************// + + public void showOfferwall () + { + CFShowOfferwall (); + } + + public void showOfferwall (string placementName) + { + CFShowOfferwallWithPlacementName (placementName); + } + + public void getOfferwallCredits () + { + CFGetOfferwallCredits (); + } + + public bool isOfferwallAvailable () + { + return CFIsOfferwallAvailable (); + } + + //******************* Banner API *******************// + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position) + { + loadBanner(size, position, ""); + } + + public void loadBanner (IronSourceBannerSize size, IronSourceBannerPosition position, string placementName) + { + CFLoadBanner (size.Description, (int)size.Width, (int)size.Height, (int)position, placementName); + } + + public void destroyBanner () + { + CFDestroyBanner (); + } + + public void displayBanner () + { + CFDisplayBanner (); + } + + public void hideBanner () + { + CFHideBanner (); + } + + public bool isBannerPlacementCapped (string placementName) + { + return CFIsBannerPlacementCapped (placementName); + } + + public void setSegment(IronSourceSegment segment){ + Dictionary dict = segment.getSegmentAsDict (); + string json = IronSourceJSON.Json.Serialize (dict); + CFSetSegment (json); + } + + public void setConsent(bool consent) + { + CFSetConsent(consent); + } + + public void loadConsentViewWithType(string consentViewType) + { + CFLoadConsentViewWithType(consentViewType); + } + + public void showConsentViewWithType(string consentViewType) + { + CFShowConsentViewWithType(consentViewType); + } + + //******************* ILRD API *******************// + + public void setAdRevenueData(string dataSource, Dictionary impressionData) + { + string json = IronSourceJSON.Json.Serialize (impressionData); + CFSetAdRevenueData(dataSource, json); + } + + #endregion +} +#endif diff --git a/popcorn/Assets/IronSource/Scripts/iOSAgent.cs.meta b/popcorn/Assets/IronSource/Scripts/iOSAgent.cs.meta new file mode 100644 index 00000000..648d0170 --- /dev/null +++ b/popcorn/Assets/IronSource/Scripts/iOSAgent.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 39133b84cde1b42d8b4970f62fd20faa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/popcorn/Assets/MyGame/Scripts/AdManager.cs b/popcorn/Assets/MyGame/Scripts/AdManager.cs index 20f1cc34..1120fa43 100644 --- a/popcorn/Assets/MyGame/Scripts/AdManager.cs +++ b/popcorn/Assets/MyGame/Scripts/AdManager.cs @@ -5,17 +5,17 @@ public sealed class AdManager : SingletonMonoBehaviour { //-- ironSource --// #if UNITY_IOS - private static readonly string IRONSOURCE_APP_KEY = ""; + private static readonly string IRONSOURCE_APP_KEY = "11bc8b5ad"; #else - private static readonly string IRONSOURCE_APP_KEY = ""; + private static readonly string IRONSOURCE_APP_KEY = "11bc928bd"; #endif void Awake(){ #if DEVELOPMENT_BUILD - // IronSource.Agent.validateIntegration (); - // IronSource.Agent.setAdaptersDebug(true); + IronSource.Agent.validateIntegration (); + IronSource.Agent.setAdaptersDebug(true); #endif - // IronSource.Agent.init (IRONSOURCE_APP_KEY); + IronSource.Agent.init (IRONSOURCE_APP_KEY); } void Start(){ @@ -27,20 +27,20 @@ public sealed class AdManager : SingletonMonoBehaviour { } void OnApplicationPause(bool isPaused) { - // IronSource.Agent.onApplicationPause(isPaused); + IronSource.Agent.onApplicationPause(isPaused); } //-- Banners Ads --// public void LoadBannerAds(){ - // IronSource.Agent.loadBanner(IronSourceBannerSize.SMART, IronSourceBannerPosition.BOTTOM); + IronSource.Agent.loadBanner(IronSourceBannerSize.SMART, IronSourceBannerPosition.BOTTOM); } public void ShowBannerAd(){ - // IronSource.Agent.displayBanner(); + IronSource.Agent.displayBanner(); } public void HideBanner(){ - // IronSource.Agent.hideBanner(); + IronSource.Agent.hideBanner(); } @@ -48,30 +48,24 @@ public sealed class AdManager : SingletonMonoBehaviour { #if DEVELOPMENT_BUILD || UNITY_EDITOR return !UsayaStorageManager.LoadOrDefault(UsayaStorageFilename.Settings_Data, "DebugAlwaysVideoFailToLoad", false); #endif - return true; -// #if UNITY_EDITOR -// return true; -// #else -// return IronSource.Agent.isRewardedVideoAvailable(); -// #endif + return IronSource.Agent.isRewardedVideoAvailable(); } public void ShowRewardVideo(Action callback){ +#if UNITY_EDITOR callback(true); -// #if UNITY_EDITOR -// callback(true); -// #else -// _rewardAdCallback = callback; -// if(_rewardAdCallback == null){ -// return; -// }else if(IsLoadedRewardVideo()){ -// _rewardAdOpen = false; -// _rewardAdFinish = false; -// _rewardAdClose = false; -// _async_frame_count = 0; -// IronSource.Agent.showRewardedVideo(); -// }else{ -// _rewardAdCallback(false); -// } -// #endif +#else + _rewardAdCallback = callback; + if(_rewardAdCallback == null){ + return; + }else if(IsLoadedRewardVideo()){ + _rewardAdOpen = false; + _rewardAdFinish = false; + _rewardAdClose = false; + _async_frame_count = 0; + IronSource.Agent.showRewardedVideo(); + }else{ + _rewardAdCallback(false); + } +#endif } } \ No newline at end of file diff --git a/popcorn/Assets/USAYAUnityLib/Scripts/InitializeUnityEditorChecker.cs b/popcorn/Assets/USAYAUnityLib/Scripts/InitializeUnityEditorChecker.cs index d9233eef..138a61d7 100644 --- a/popcorn/Assets/USAYAUnityLib/Scripts/InitializeUnityEditorChecker.cs +++ b/popcorn/Assets/USAYAUnityLib/Scripts/InitializeUnityEditorChecker.cs @@ -10,9 +10,9 @@ public sealed class InitializeUnityEditorChecker : MonoBehaviour { UnityEditor.EditorApplication.isPlaying = false; } - var unityChecker = new GameObject("UnityChecker"); - DontDestroyOnLoad(unityChecker); - unityChecker.AddComponent(); + // var unityChecker = new GameObject("UnityChecker"); + // DontDestroyOnLoad(unityChecker); + // unityChecker.AddComponent(); #endif } } diff --git a/popcorn/ProjectSettings/GvhProjectSettings.xml b/popcorn/ProjectSettings/GvhProjectSettings.xml new file mode 100644 index 00000000..a4d74040 --- /dev/null +++ b/popcorn/ProjectSettings/GvhProjectSettings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file