commit 428ff37349c5ba5104fc60094b6392e03b1977cb Author: Aryankc2 Date: Thu Feb 20 10:52:48 2025 +0530 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..603b140 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml new file mode 100644 index 0000000..e1eea1d --- /dev/null +++ b/.idea/kotlinc.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/other.xml b/.idea/other.xml new file mode 100644 index 0000000..1811ddc --- /dev/null +++ b/.idea/other.xml @@ -0,0 +1,450 @@ + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/InfoApp b/app/InfoApp new file mode 100644 index 0000000..ddff561 --- /dev/null +++ b/app/InfoApp @@ -0,0 +1,8 @@ +//Things to Follow + +1) Add Product Flavour For New App +2) For Facebook Login Change keys in string file +3) Add new json file and change corresponding in string file +4) Make colors accordingly +5) Check link urls from string file update new one +6) diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..b74cfea --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,321 @@ +apply plugin: 'com.android.application' + +apply plugin: 'kotlin-android' + +apply plugin: 'kotlin-android-extensions' + +apply plugin: 'kotlin-kapt' + + +android { + compileSdk 34 + namespace "com.consultantvendor" + defaultConfig { + applicationId "com.consultantvendor" + minSdkVersion 24 + targetSdkVersion 34 + versionCode 12 + versionName "1.0.11" + multiDexEnabled true + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + vectorDrawables.useSupportLibrary = true + } + + signingConfigs { + debug { + storeFile file("consultapp.jks") + keyAlias "consultapp" + keyPassword "codebrew" + storePassword "codebrew" + } + release { + storeFile file("consultapp.jks") + keyAlias "consultapp" + keyPassword "codebrew" + storePassword "codebrew" + } + } + + flavorDimensions "app" + productFlavors { + nurseLynx { + dimension "app" + applicationId "com.nurseLynx.expert" + versionCode 12 + versionName "1.0.11" + buildConfigField 'String', 'APP_UNIQUE_ID', "\"c6b484d83fb21425453dcd0af6c1f01b15\"" + // buildConfigField 'String', 'BASE_URL', "\"https://nurselynx.netsolutionindia.com/\"" + buildConfigField 'String', 'BASE_URL', "\"https://nurselynxx.dmlabs.in/\"" + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled false + debuggable false + shrinkResources false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + debug { + signingConfig signingConfigs.debug + debuggable true + minifyEnabled false + shrinkResources false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + + } + + lintOptions { + checkReleaseBuilds false + // Or, if you prefer, you can continue to check for errors in release builds, + // but continue the build even when errors are found: + abortOnError false + } + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + dataBinding { + enabled = true + } + + bundle { + language { + // Specifies that the app bundle should not support + // configuration APKs for language resources. These + // resources are instead packaged with each base and + // dynamic feature APK. + enableSplit = false + } + } + + packagingOptions { + exclude 'META-INF/DEPENDENCIES' + exclude 'META-INF/LICENSE' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/license.txt' + exclude 'META-INF/NOTICE' + exclude 'META-INF/NOTICE.txt' + exclude 'META-INF/notice.txt' + exclude 'META-INF/ASL2.0' + exclude("META-INF/*.kotlin_module") + } +// To inline the bytecode built with JVM target 1.8 into +// bytecode that is being built with JVM target 1.6. (e.g. navArgs) +} + +allprojects { + repositories { + maven { url 'https://jitpack.io' } + maven { url "https://jcenter.bintray.com"} + google() + jcenter() + } + + /* kapt { + generateStubs = true + correctErrorTypes = true + }*/ + +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10" + //implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.20" + implementation 'androidx.appcompat:appcompat:1.3.1' + implementation 'androidx.core:core-ktx:1.6.0' + implementation 'androidx.constraintlayout:constraintlayout:2.1.0' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.navigation:navigation-fragment-ktx:2.3.5' + implementation 'androidx.navigation:navigation-ui-ktx:2.3.5' + testImplementation 'junit:junit:4.13.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.3' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + + implementation "androidx.multidex:multidex:2.0.1" + implementation "androidx.exifinterface:exifinterface:1.3.6" + + /*LIFECYCLE COMPONENTS*/ + implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" + implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1" + + /*COUNTRY CODE PICKER*/ + implementation 'com.hbb20:ccp:2.4.7' + + /*ANDROID SUPPORT*/ + implementation 'androidx.recyclerview:recyclerview:1.2.1' + + /*MATERIAL COMPONENTS*/ + implementation 'com.google.android.material:material:1.4.0' + + /*KOTLIN*/ + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.3' + implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.1' + implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' + + /*PIN VIEW*/ + //implementation "com.chaos.view:pinview:1.4.3" + implementation 'io.github.chaosleung:pinview:1.4.4' + + /*RETROFIT*/ + implementation "com.squareup.retrofit2:retrofit:2.9.0" + implementation "com.squareup.retrofit2:converter-gson:2.9.0" + implementation "com.squareup.retrofit2:converter-scalars:2.9.0" + implementation "com.squareup.retrofit2:adapter-rxjava2:2.9.0" + + /*OK HTTP*/ + implementation "com.squareup.okhttp3:okhttp:4.9.0" + implementation "com.squareup.okhttp3:logging-interceptor:4.9.0" + + /*DAGGER*/ + implementation "com.google.dagger:dagger:2.42" + kapt "com.google.dagger:dagger-compiler:2.42" + implementation "com.google.dagger:dagger-android:2.42" + kapt "com.google.dagger:dagger-android-processor:2.42" + + implementation "com.google.dagger:dagger-android-support:2.42" + kapt "com.google.dagger:dagger-android-support:2.12" + + kapt 'org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.2.0' + /*TIMBER*/ + implementation "com.jakewharton.timber:timber:4.7.1" + + /*Firebase*/ + implementation 'com.google.firebase:firebase-messaging:22.0.0' + implementation 'com.google.firebase:firebase-core:19.0.1' + implementation 'com.google.firebase:firebase-analytics-ktx:19.0.1' + implementation 'com.google.firebase:firebase-dynamic-links-ktx:20.1.1' + + // Add the Firebase Crashlytics dependency. + implementation 'com.google.firebase:firebase-crashlytics-ktx:18.6.2' + + /*ROUNDED IMAGE VIEW*/ + implementation 'com.makeramen:roundedimageview:2.3.0' + + /*FACEBOOK*/ +// implementation 'com.facebook.android:facebook-android-sdk:8.1.0' + + //Google sign in dependency + implementation 'com.google.android.gms:play-services-auth:19.2.0' + implementation 'com.google.firebase:firebase-auth:21.0.1' + implementation 'com.google.android.gms:play-services-location:18.0.0' + implementation 'com.google.android.libraries.places:places:2.4.0' + + /*Chart*/ + implementation 'com.github.PhilJay:MPAndroidChart:v2.2.4' + + /*Image Doc Picker*/ + // implementation 'com.droidninja:filepicker:2.2.5' + + /*GLIDE*/ + implementation 'com.github.bumptech.glide:glide:4.12.0' + annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' + + /*PERMISSION DISPATCHER*/ +// implementation "com.github.hotchemi:permissionsdispatcher:4.8.0" +// kapt "com.github.hotchemi:permissionsdispatcher-processor:4.1.0" + + implementation "com.github.permissions-dispatcher:permissionsdispatcher:4.8.0" + kapt "com.github.permissions-dispatcher:permissionsdispatcher-processor:4.8.0" + + /*Socket*/ + implementation('io.socket:socket.io-client:1.0.0') { + exclude group: 'org.json', module: 'json' + } + + /*Compress image*/ + // implementation 'id.zelory:compressor:2.1.0' + implementation 'id.zelory:compressor:3.0.1' + + /*View full image*/ +// implementation 'com.github.stfalcon:frescoimageviewer:0.5.0' +// implementation 'com.facebook.fresco:fresco:2.4.0' + + // Jitsi Meet + // implementation('org.jitsi.react:jitsi-meet-sdk:2.9.3') { transitive = true } + implementation('org.jitsi.react:jitsi-meet-sdk:5.1.0') { transitive = true } + + /*PAGER INDICATOR*/ + //implementation 'me.relex:circleindicator:2.1.4' + implementation 'me.relex:circleindicator:2.1.6' + + /*Razor Pay*/ + /*Crash in latest version*/ + implementation 'com.razorpay:checkout:1.6.33' + + /*Card Form*/ + implementation 'com.braintreepayments:card-form:5.0.0' + + /*Animations*/ + implementation "com.airbnb.android:lottie:3.4.4" + + /*Date Picker*/ + // implementation 'com.github.florent37:singledateandtimepicker:2.2.6' + implementation 'com.github.florent37:singledateandtimepicker:2.2.7' + + /*Read More TextView*/ + // implementation 'com.borjabravo:readmoretextview:2.1.0' + + //recordView + //implementation 'com.devlomi.record-view:record-view:2.0.1' + + //for AndroidX use: + implementation 'com.github.3llomi:RecordView:3.1.3' + + + /*Bmi*/ + // implementation 'com.ekn.gruzer.gaugelibrary:gaugelibrary:0.1.0' + implementation 'com.github.Gruzer:simple-gauge-android:0.3.1' + // implementation 'pl.pawelkleczkowski.customgauge:CustomGauge:1.0.3' + + /*Contact Picker*/ + // implementation 'com.github.broakenmedia:MultiContactPicker:1.8.5' + + //Twitter +// implementation('com.twitter.sdk.android:twitter:3.3.0@aar') { +// transitive = true +// } + + //Volley + implementation 'com.android.volley:volley:1.2.1' + + //Country code picker + implementation 'io.michaelrocks:libphonenumber-android:8.13.35' + + //snap kit + implementation([ + 'com.snapchat.kit.sdk:login:1.12.0', + 'com.snapchat.kit.sdk:core:1.12.0' + ]) + + //AppsFlyer + implementation 'com.appsflyer:af-android-sdk:6.3.2' + implementation 'com.karumi:dexter:6.2.3' + implementation 'androidx.work:work-runtime-ktx:2.7.1' + + implementation 'com.1gravity:android-contactpicker:1.4.0' + + + // Mobile Payments SDK dependency + // implementation("com.squareup.sdk:mobile-payments-sdk:2.0.2") + + // MockReader UI dependency + // implementation("com.squareup.sdk:mockreader-ui:2.0.2") +} +apply plugin: 'com.google.gms.google-services' +apply plugin: 'com.google.firebase.crashlytics' + + + +//twitter app id 22568785 +//twitter api key HnSJ2ZcDhVw2ZDCFEs1BDBwEP +//twitter secret api key qdhRPJdvdQLfoO77RLrX2fGJ0yIcjISw03D9gjnjJHI5ppac1v +//bearer token AAAAAAAAAAAAAAAAAAAAAFFfWAEAAAAAApNpmAx8ZylDKb97ygL%2BpMXMp90%3DAvKHg6q5x32bJCyVapA8NzCqDC4aRUN1pD7wQCkUcmj4df8dBM \ No newline at end of file diff --git a/app/consultapp.jks b/app/consultapp.jks new file mode 100644 index 0000000..c6afee1 Binary files /dev/null and b/app/consultapp.jks differ diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..094e0f3 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,114 @@ +{ + "project_info": { + "project_number": "1032811457113", + "project_id": "nurselynx-2fb1c", + "storage_bucket": "nurselynx-2fb1c.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1032811457113:android:6101978baed2c4e5f7df48", + "android_client_info": { + "package_name": "com.nurseLynx.expert" + } + }, + "oauth_client": [ + { + "client_id": "1032811457113-07iuipiq574b2kptmhgs29466m4039va.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.expert", + "certificate_hash": "3361f698a0d60d6d3eac4f81ff039897e1550f00" + } + }, + { + "client_id": "1032811457113-ledsgoe1si7i3g8tnv8ttfsrnd0pufkb.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "1032811457113-b8nur4jtaoql7s7k8rl4cpe2qoh67r24.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDYOYmjHI3DXYrWpmfmD4Ekg3YXVcwiZOg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1032811457113-8564gftp1oes9s415mva42ch6di8njkj.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1032811457113-l5u532a9ppl05h2vl6k4hs59393i5h99.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.nurseLynx.user" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1032811457113:android:8985de8c8a94813df7df48", + "android_client_info": { + "package_name": "com.nurseLynx.user" + } + }, + "oauth_client": [ + { + "client_id": "1032811457113-f9gkf2vvpgoo67sgnilnii2hojte2ugf.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.user", + "certificate_hash": "5f9881411557ba40bc3bf7ec8967f0750b1d55b2" + } + }, + { + "client_id": "1032811457113-u2qflc4bogl7mne10cg6ukv3nqkit4ee.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.nurseLynx.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "1032811457113-b8nur4jtaoql7s7k8rl4cpe2qoh67r24.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDYOYmjHI3DXYrWpmfmD4Ekg3YXVcwiZOg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1032811457113-8564gftp1oes9s415mva42ch6di8njkj.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "1032811457113-l5u532a9ppl05h2vl6k4hs59393i5h99.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.nurseLynx.user" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/homeDoctor/release/app-homeDoctor-expert.aab b/app/homeDoctor/release/app-homeDoctor-expert.aab new file mode 100644 index 0000000..45c5818 Binary files /dev/null and b/app/homeDoctor/release/app-homeDoctor-expert.aab differ diff --git a/app/nurseLynx/release/nurseLynx-pro@30jan25-release.aab b/app/nurseLynx/release/nurseLynx-pro@30jan25-release.aab new file mode 100644 index 0000000..34055e7 Binary files /dev/null and b/app/nurseLynx/release/nurseLynx-pro@30jan25-release.aab differ diff --git a/app/nurseLynx/release/output-metadata.json b/app/nurseLynx/release/output-metadata.json new file mode 100644 index 0000000..311d8a9 --- /dev/null +++ b/app/nurseLynx/release/output-metadata.json @@ -0,0 +1,18 @@ +{ + "version": 2, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.nurseLynx.expert", + "variantName": "processNurseLynxReleaseResources", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "versionCode": 6, + "versionName": "1.0.5", + "outputFile": "app-nurseLynx-release.apk" + } + ] +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..ae7fd14 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,272 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile + + + +-dontwarn android.databinding.** +-keep class android.databinding.** { *; } + + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +-keepclassmembers class fqcn.of.javascript.interface.for.webview {public *;} + + +##---------------Begin: proguard configuration for Retrofit ---------- + +# Retrofit does reflection on generic parameters. InnerClasses is required to use Signature and +# EnclosingMethod is required to use InnerClasses. +-keepattributes Signature, InnerClasses, EnclosingMethod + +# Retrofit does reflection on method and parameter annotations. +-keepattributes RuntimeVisibleAnnotations, RuntimeVisibleParameterAnnotations + +# Retain service method parameters when optimizing. +-keepclassmembers,allowshrinking,allowobfuscation interface * { + @retrofit2.http.* ; +} + +# Ignore annotation used for build tooling. +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement + +# Ignore JSR 305 annotations for embedding nullability information. +-dontwarn javax.annotation.** + +# Guarded by a NoClassDefFoundError try/catch and only used when on the classpath. +-dontwarn kotlin.Unit + +# Top-level functions that can only be used by Kotlin. +-dontwarn retrofit2.KotlinExtensions + +# With R8 full mode, it sees no subtypes of Retrofit interfaces since they are created with a Proxy +# and replaces all potential values with null. Explicitly keeping the interfaces prevents this. +-if interface * { @retrofit2.http.* ; } +-keep,allowobfuscation interface <1> +##---------------End: proguard configuration for Retrofit ---------- + + + + +##---------------Begin: proguard configuration for Gson ---------- +# Gson uses generic type information stored in a class file when working with fields. Proguard +# removes such information by default, so configure it to keep all of it. +-keepattributes Signature + +# For using GSON @Expose annotation +-keepattributes Annotation + +# Gson specific classes +-dontwarn sun.misc.** +-keep class com.google.gson.stream.** { *; } + +# Application classes that will be serialized/deserialized over Gson +-keep class com.consultantvendor.data.** { *; } + +# Prevent proguard from stripping interface information from TypeAdapterFactory, +# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter) +-keep class * implements com.google.gson.TypeAdapterFactory +-keep class * implements com.google.gson.JsonSerializer +-keep class * implements com.google.gson.JsonDeserializer + +##---------------End: proguard configuration for Gson ---------- + + + +# JSR 305 annotations are for embedding nullability information. +-dontwarn javax.annotation.** + +# A resource is loaded with a relative path so the package of this class must be preserved. +-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase + +# Animal Sniffer compileOnly dependency to ensure APIs are compatible with older versions of Java. +-dontwarn org.codehaus.mojo.animal_sniffer.* + +# OkHttp platform used only on JVM and when Conscrypt dependency is available. +-dontwarn okhttp3.internal.platform.ConscryptPlatform + + +##---------------Begin: proguard configuration for Glide ---------- +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public class * extends com.bumptech.glide.module.AppGlideModule +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} + +##---------------End: proguard configuration for Glide ---------- + + +##---------------Begin: proguard configuration for Jitsi ---------- + +-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip +-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters +-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip + +# Do not strip any method/class that is annotated with @DoNotStrip +-keep @com.facebook.proguard.annotations.DoNotStrip class * +-keep @com.facebook.common.internal.DoNotStrip class * +-keepclassmembers class * { + @com.facebook.proguard.annotations.DoNotStrip *; + @com.facebook.common.internal.DoNotStrip *; +} + +-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { + void set*(***); + *** get*(); +} + +-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } +-keep class * extends com.facebook.react.bridge.NativeModule { *; } +-keepclassmembers,includedescriptorclasses class * { native ; } +-keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } + +-dontwarn com.facebook.react.** +-keep,includedescriptorclasses class com.facebook.react.bridge.** { *; } + +# okhttp + +-keepattributes Signature +-keepattributes *Annotation* +-keep class okhttp3.** { *; } +-keep interface okhttp3.** { *; } +-dontwarn okhttp3.** + +# okio + +-keep class sun.misc.Unsafe { *; } +-dontwarn java.nio.file.* +-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement +-keep class okio.** { *; } +-dontwarn okio.** + +# WebRTC + +-keep class org.webrtc.** { *; } +-dontwarn org.chromium.build.BuildHooksAndroid + +# Jisti Meet SDK + +-keep class org.jitsi.meet.** { *; } +-keep class org.jitsi.meet.sdk.** { *; } + +# We added the following when we switched minifyEnabled on. Probably because we +# ran the app and hit problems... + +-keep class com.facebook.react.bridge.CatalystInstanceImpl { *; } +-keep class com.facebook.react.bridge.ExecutorToken { *; } +-keep class com.facebook.react.bridge.JavaScriptExecutor { *; } +-keep class com.facebook.react.bridge.ModuleRegistryHolder { *; } +-keep class com.facebook.react.bridge.ReadableType { *; } +-keep class com.facebook.react.bridge.queue.NativeRunnable { *; } +-keep class com.facebook.react.devsupport.** { *; } + +-dontwarn com.facebook.react.devsupport.** +-dontwarn com.google.appengine.** +-dontwarn com.squareup.okhttp.** +-dontwarn javax.servlet.** + +# ^^^ We added the above when we switched minifyEnabled on. + +# Rule to avoid build errors related to SVGs. +-keep public class com.horcrux.svg.** {*;} + +# Hermes +-keep class com.facebook.hermes.unicode.** { *; } + +##---------------End: proguard configuration for Jitsi ---------- + + +##---------------Begin: proguard configuration for RazorPay ---------- +-keepclassmembers class * { + @android.webkit.JavascriptInterface ; +} + +-keepattributes JavascriptInterface +-keepattributes *Annotation* + +-dontwarn com.razorpay.** +-keep class com.razorpay.** {*;} + +-optimizations !method/inlining/* + +-keepclasseswithmembers class * { + public void onPayment*(...); +} +##---------------End: proguard configuration for RazorPay ---------- + +##---------------Start: proguard configuration for picker ---------- +# Glide +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +# support-v7-appcompat +-keep public class android.support.v7.widget.** { *; } +-keep public class android.support.v7.internal.widget.** { *; } +-keep public class android.support.v7.internal.view.menu.** { *; } +-keep public class * extends android.support.v4.view.ActionProvider { + public (android.content.Context); +} +# support-design +-dontwarn android.support.design.** +-keep class android.support.design.** { *; } +-keep interface android.support.design.** { *; } +-keep public class android.support.design.R$* { *; } +##---------------End: proguard configuration for Picker ---------- + +##---------------Begin: proguard configuration for image picker ---------- +# Glide +-keep public class * implements com.bumptech.glide.module.GlideModule +-keep class * extends com.bumptech.glide.module.AppGlideModule { + (...); +} +-keep public enum com.bumptech.glide.load.ImageHeaderParser$** { + **[] $VALUES; + public *; +} +-keep class com.bumptech.glide.load.data.ParcelFileDescriptorRewinder$InternalRewinder { + *** rewind(); +} + +# Uncomment for DexGuard only +#-keepresourcexmlelements manifest/application/meta-data@value=GlideModule + +##---------------End: proguard configuration for image picker ---------- + +##---------------Begin: proguard configuration for threetenabp ---------- + +# Keep class members used for serialization +# https://www.guardsquare.com/en/products/proguard/manual/examples#serializable +-keepclassmembers class org.threeten.bp.** implements java.io.Serializable { + private static final java.io.ObjectStreamField[] serialPersistentFields; + private void writeObject(java.io.ObjectOutputStream); + private void readObject(java.io.ObjectInputStream); + java.lang.Object writeReplace(); + java.lang.Object readResolve(); + +} +##---------------End: proguard configuration for threetenabp ---------- + diff --git a/app/src/airdoc/Info b/app/src/airdoc/Info new file mode 100644 index 0000000..762b38d --- /dev/null +++ b/app/src/airdoc/Info @@ -0,0 +1,13 @@ +//Server Key + +AAAA38hjuQs:APA91bGYEl4yefDaRpe0yv9w4Pc7HYrSZL413WW0pJB5-YqkwCKr3zNFvTvm3xZI4LlJMwDor6XJcl5Wn8ctwaY62_vSvwlCrFVrHhL2el-h4Z1tZEmSQ1KiacR8cgV944thVNl8X2Co + +//Google +Username: K.obianodo@gmail.com +Password: 1Character_swisat +//Facebook +developer.codebrew@gmail.com +developer@facebook +//Fb Ids +816694742513784 +ddbe837729f3c53f80b88e54444e175a \ No newline at end of file diff --git a/app/src/airdoc/google-services.json b/app/src/airdoc/google-services.json new file mode 100644 index 0000000..195dc3a --- /dev/null +++ b/app/src/airdoc/google-services.json @@ -0,0 +1,98 @@ +{ + "project_info": { + "project_number": "961139685643", + "project_id": "airdoc-37725", + "storage_bucket": "airdoc-37725.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:961139685643:android:83becfe316e22829d20a0e", + "android_client_info": { + "package_name": "com.airdoc.expert" + } + }, + "oauth_client": [ + { + "client_id": "961139685643-epfg89f9mrgt6lp52l9l8sgbu9feh20g.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.airdoc.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDRIdPYeDPzQ2FuWZMvqnnKzPBTu8PL_yQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "961139685643-2rg4aq24vesm5quvs80nifgug3a43k51.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.airdoc.user" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:961139685643:android:d9d2ca2e47e15152d20a0e", + "android_client_info": { + "package_name": "com.airdoc.user" + } + }, + "oauth_client": [ + { + "client_id": "961139685643-42lt5fvg94u6eu5e6vq34em502olbdkg.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.airdoc.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDRIdPYeDPzQ2FuWZMvqnnKzPBTu8PL_yQ" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "961139685643-2rg4aq24vesm5quvs80nifgug3a43k51.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.airdoc.user" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/airdoc/ic_launcher-playstore.png b/app/src/airdoc/ic_launcher-playstore.png new file mode 100644 index 0000000..52a144b Binary files /dev/null and b/app/src/airdoc/ic_launcher-playstore.png differ diff --git a/app/src/airdoc/res/drawable-hdpi/ic_push.png b/app/src/airdoc/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..c2ce7a6 Binary files /dev/null and b/app/src/airdoc/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-hdpi/ic_splash.png b/app/src/airdoc/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..f821fbd Binary files /dev/null and b/app/src/airdoc/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-mdpi/ic_push.png b/app/src/airdoc/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..67b45a3 Binary files /dev/null and b/app/src/airdoc/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-mdpi/ic_splash.png b/app/src/airdoc/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..36fc3e4 Binary files /dev/null and b/app/src/airdoc/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-xhdpi/ic_push.png b/app/src/airdoc/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..b12a2d3 Binary files /dev/null and b/app/src/airdoc/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-xhdpi/ic_splash.png b/app/src/airdoc/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..2b94629 Binary files /dev/null and b/app/src/airdoc/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-xxhdpi/ic_push.png b/app/src/airdoc/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..86045a8 Binary files /dev/null and b/app/src/airdoc/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-xxhdpi/ic_splash.png b/app/src/airdoc/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..5004564 Binary files /dev/null and b/app/src/airdoc/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable-xxxhdpi/ic_push.png b/app/src/airdoc/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..f3d5eed Binary files /dev/null and b/app/src/airdoc/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/airdoc/res/drawable-xxxhdpi/ic_splash.png b/app/src/airdoc/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..a04e05f Binary files /dev/null and b/app/src/airdoc/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/airdoc/res/drawable/ic_launcher_foreground.xml b/app/src/airdoc/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/airdoc/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/airdoc/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/airdoc/res/mipmap-hdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..4b98e69 Binary files /dev/null and b/app/src/airdoc/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c52a5be Binary files /dev/null and b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-hdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..fd173dc Binary files /dev/null and b/app/src/airdoc/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-mdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..3db2919 Binary files /dev/null and b/app/src/airdoc/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..fecc73c Binary files /dev/null and b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-mdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..c80ba1d Binary files /dev/null and b/app/src/airdoc/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-xhdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..e1f5a0d Binary files /dev/null and b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..6d06e47 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..1fb694a Binary files /dev/null and b/app/src/airdoc/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..a4ac164 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..8ba134b Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..44e8336 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b435f45 Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d1701cc Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..2703bdb Binary files /dev/null and b/app/src/airdoc/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/airdoc/res/values/colors.xml b/app/src/airdoc/res/values/colors.xml new file mode 100644 index 0000000..d50346a --- /dev/null +++ b/app/src/airdoc/res/values/colors.xml @@ -0,0 +1,8 @@ + + + #0BC3D4 + #0BC3D4 + #0BC3D4 + + #330BC3D4 + diff --git a/app/src/airdoc/res/values/ic_launcher_background.xml b/app/src/airdoc/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..f1d5df0 --- /dev/null +++ b/app/src/airdoc/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #F1F0F0 + \ No newline at end of file diff --git a/app/src/airdoc/res/values/strings.xml b/app/src/airdoc/res/values/strings.xml new file mode 100644 index 0000000..70d0637 --- /dev/null +++ b/app/src/airdoc/res/values/strings.xml @@ -0,0 +1,423 @@ + + AirDoc For Experts + + + 816694742513784 + fb816694742513784 + + + airdocapp.page.link + com.airdoc.expert + + + AIzaSyDRIdPYeDPzQ2FuWZMvqnnKzPBTu8PL_yQ + 961139685643-3ibjpm30psaociplr0c0ltt096lag0rd.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + + Login + Facebook + Google + Login using Email + Sign Up using Email + Sign Up + Enter phone number + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + + Patients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Edit + View + Age: + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Revenue + Calls + Available Balance + Pay-out + + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + %s Completed + %s Unsuccessful + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + New Request + No show + Cancelled + Cancel + Start request + Check request + Are you sure you want to proceed request + Add Money + Added to wallet + Transaction failed + Accept request + Are you sure you want to accept this request + Mark Complete + Are you sure you want to complete this request + accepted + In progress + Starting a call… + Starting a chat + Received from\n%s + NA + + Typing… + Today + Yesterday + Enter message + Type your message… + Photo + Hi %s\nI am Available for chat lets discuss the problem + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + Here is the bank account + Account number + Account Holder name + Bank name + IFSC code + Select currency + Add Bank + Edit Bank + %s Card ending with %s + years + Total Revenue made + Request completed + Title + Description + + %s · %s Reviews + To + End time must be greater than start time + Manage Availability + Select a Category + Let us know which category suits your profile the most to continue + Select Sub-Category + Full Name + Since Working + Next + Consultation Fees + For + Add availability + Add availability for %s + Service Type + Set Preferences + From + + New Interval + S + M + T + W + T + F + S + Week Days + Select Availability + Save + Fixed Price + Add price in %s to %s + Edit availability + Please select any service + Add price for %s + Add price in %s to %s for %s + Please select Title + Update Category + Manage Preferences + Tomorrow + For %s + All %s + All Weekdays + + + + @string/select_country + IN + US + + + + @string/select_currency + INR + USD + + + Dr. + Mr. + Mrs. + Miss. + + + @string/title + @string/dr + @string/mr + @string/mrs + @string/miss + + + Profile + Transaction History + Please select working days + Already have an account? + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Chat Online\nwith Top Doctors + At %s20 + Sign Up with Phone Number + Let’s Get Started ! + Minute + Cancel appointment + Are you sure you want to cancel appointment? + Please don\'t add interval in between of previous intervals + Disconnecting… + Transaction Success + Transaction Failed + + + Your profile has not yet been approved! + Once your profile has been approved, you ll start getting requests from users + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + No transaction history! + Once you successfully complete some requests, your transactions will appear here. + No notifications yet! + All notifications related to your activities will appear here. + + + + Share + Hey, Here is app for taking Online Consultancy Platform. You should try it. + Edit card + Delete + Pay + Input amount + Select card + Add card + Enter amount + Payment + Are you sure you want to delete this card? + Money sent to bank account\n(%s) + + Submit + Add + Upload Documents + Please add + Manage Documents + + + + Appointment + + Prescription + Add Manual Prescription + Record Details + Record title + Add Images + Add Digital Prescription + Prescription Notes + Add notes + Medicine Name + Prescriptions + Duration + Dosage Type + Dosage Timings + Digital Prescription + Manual Prescription + Breakfast + "Dosage " + Before + After + With + Reset + Lunch + Dinner + years old + Select doases for %s + Select dosage Timings + Prescription added + View prescription + View all + Requests + Upload Banner + + + @string/select + 1 day + 2 days + 3 days + 4 days + 5 days + 6 days + 7 days + 8 days + 9 days + 10 days + 11 days + 12 days + 13 days + 14 days + 15 days + 16 days + 17 days + 18 days + 19 days + 10 days + 21 days + 22 days + 23 days + 24 days + 25 days + 26 days + 27 days + 28 days + 29 days + 30 days + + + Select + Tablet + Capsule + + @string/select + @string/tablet + @string/capsule + + + One + Two + Three + Four + + @string/select + @string/one + @string/two + @string/three + @string/four + + + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login with + + + We will need your call permission to give you better experience + Reached Destination + Status : + Start Service + Cancel Service + Service Status Update + Current Status + Status Update + Arrived + Started + Completed + Change Service Status + Pending + Update Status + Clear + Estimate Time of Arrival : %s + Quit + Are you sure you want to quit? It will stop your tracking + Service Completed + Track Status + Cancelled Service + + Details + Type here… + show more + show less + + + Language + Please choose your language + English + عربى + Account Setting + Change Password + Old Password + New Password + Confirm New Password + + + Success! + Your password changed successfully! + View map + Distance + Date + Time + Google map application not found + All Requests + Pdf + Audio + Retry + + Slide To Cancel + View Details + Price + Prescription detail + diff --git a/app/src/androidTest/java/com/consultantvendor/ExampleInstrumentedTest.kt b/app/src/androidTest/java/com/consultantvendor/ExampleInstrumentedTest.kt new file mode 100644 index 0000000..7d15c12 --- /dev/null +++ b/app/src/androidTest/java/com/consultantvendor/ExampleInstrumentedTest.kt @@ -0,0 +1,22 @@ +package com.consultantvendor + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Assert.assertEquals +import org.junit.Test +import org.junit.runner.RunWith + +/** + * Instrumented test, which will execute on an Android device. + * + * See [testing documentation](http://d.android.com/tools/testing). + */ +@RunWith(AndroidJUnit4::class) +class ExampleInstrumentedTest { + @Test + fun useAppContext() { + // Context of the app under test. + val appContext = InstrumentationRegistry.getInstrumentation().targetContext + assertEquals("com.consultantvendor", appContext.packageName) + } +} diff --git a/app/src/clouddoc/Info b/app/src/clouddoc/Info new file mode 100644 index 0000000..19d4336 --- /dev/null +++ b/app/src/clouddoc/Info @@ -0,0 +1,15 @@ +//Server Key +AAAAfuO3mJo:APA91bEWlsEv80Wi5oeTMc4xg9eA9X6JKf6yZD1rTwHJvtHDZd2w4sO8bcNUev73_1mDEr7KA-6A6cIYdiBIgHf8INI39tRDimzYD399whE0dawW5bEuXpFE0T_IlcDagkhHBmEDRYZ9 + +//Google + +//Facebook +developer.codebrew@gmail.com +developer@facebook +//Fb Ids +879961852793008 +4db61a5432be3ddfe7fcaab6cb90b9f7 + +49:72:C4:74:42:44:1E:3D:58:32:07:94:17:49:DC:DF:14:57:B4:E3 +42:3A:10:0F:27:02:B1:FE:04:44:46:62:E5:76:3A:8C:BD:61:B3:A1:C1:06:B5:40:8B:2D:03:AE:96:2F:E9:1C + diff --git a/app/src/clouddoc/google-services.json b/app/src/clouddoc/google-services.json new file mode 100644 index 0000000..24046b0 --- /dev/null +++ b/app/src/clouddoc/google-services.json @@ -0,0 +1,84 @@ +{ + "project_info": { + "project_number": "544986339482", + "project_id": "clouddoc-93eee", + "storage_bucket": "clouddoc-93eee.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:544986339482:android:1db2dc22453067a064e723", + "android_client_info": { + "package_name": "com.clouddoc.expert" + } + }, + "oauth_client": [ + { + "client_id": "544986339482-aj59tcmpnpb44kvn57tch44vmvm2i42l.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.clouddoc.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD6xTauBy54YTN2pvv0ScEOSnLRqO1YPhk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:544986339482:android:8f3596d8487b396b64e723", + "android_client_info": { + "package_name": "com.clouddoc.user" + } + }, + "oauth_client": [ + { + "client_id": "544986339482-p2n3164tumimvt5mr2kv5bl9pptf2kml.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.clouddoc.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD6xTauBy54YTN2pvv0ScEOSnLRqO1YPhk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/clouddoc/ic_launcher-playstore.png b/app/src/clouddoc/ic_launcher-playstore.png new file mode 100644 index 0000000..9a733f6 Binary files /dev/null and b/app/src/clouddoc/ic_launcher-playstore.png differ diff --git a/app/src/clouddoc/res/drawable-hdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-hdpi/ic_splash.jpg new file mode 100644 index 0000000..fff4234 Binary files /dev/null and b/app/src/clouddoc/res/drawable-hdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-mdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-mdpi/ic_splash.jpg new file mode 100644 index 0000000..5c8c558 Binary files /dev/null and b/app/src/clouddoc/res/drawable-mdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-xhdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-xhdpi/ic_splash.jpg new file mode 100644 index 0000000..8cb0ba6 Binary files /dev/null and b/app/src/clouddoc/res/drawable-xhdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-xxhdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-xxhdpi/ic_splash.jpg new file mode 100644 index 0000000..3f5f50d Binary files /dev/null and b/app/src/clouddoc/res/drawable-xxhdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable-xxxhdpi/ic_splash.jpg b/app/src/clouddoc/res/drawable-xxxhdpi/ic_splash.jpg new file mode 100644 index 0000000..4266736 Binary files /dev/null and b/app/src/clouddoc/res/drawable-xxxhdpi/ic_splash.jpg differ diff --git a/app/src/clouddoc/res/drawable/ic_launcher_foreground.xml b/app/src/clouddoc/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/clouddoc/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/clouddoc/res/drawable/ic_push.xml b/app/src/clouddoc/res/drawable/ic_push.xml new file mode 100644 index 0000000..48ec99a --- /dev/null +++ b/app/src/clouddoc/res/drawable/ic_push.xml @@ -0,0 +1,16 @@ + + + + + + diff --git a/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/clouddoc/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/clouddoc/res/mipmap-hdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..c258724 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..13acdbf Binary files /dev/null and b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..7947504 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-mdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..1c4ceab Binary files /dev/null and b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..3bb5665 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..aad98d7 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..16a11b2 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..42c7bf8 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..6c5ed44 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..2512ef7 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c194355 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..7d031e5 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..019a78f Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..f571210 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..314cd74 Binary files /dev/null and b/app/src/clouddoc/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/clouddoc/res/values/colors.xml b/app/src/clouddoc/res/values/colors.xml new file mode 100644 index 0000000..ccd375e --- /dev/null +++ b/app/src/clouddoc/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #2A5C30 + #2A5C30 + #2A5C30 + + #3880325A + #332A5C30 + diff --git a/app/src/clouddoc/res/values/ic_launcher_background.xml b/app/src/clouddoc/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..32686f2 --- /dev/null +++ b/app/src/clouddoc/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #36E201 + \ No newline at end of file diff --git a/app/src/clouddoc/res/values/strings.xml b/app/src/clouddoc/res/values/strings.xml new file mode 100644 index 0000000..86e4618 --- /dev/null +++ b/app/src/clouddoc/res/values/strings.xml @@ -0,0 +1,430 @@ + + CloudDoc Pro + + + 879961852793008 + fb879961852793008 + + + clouddoc.page.link + com.clouddoc.expert + + + AIzaSyD6xTauBy54YTN2pvv0ScEOSnLRqO1YPhk + 544986339482-ced4aaeb82un0s72ie22j60pa6rqvo2u.apps.googleusercontent.com + + You have new update for %s! + Create a %s \n account to continue + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + + Login + Facebook + Google + Login using Email + Sign Up using Email + Sign Up + Enter phone number + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + + Patients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Edit + View + Age: + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Revenue + Calls + Available Balance + Pay-out + + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + %s Completed + %s Unsuccessful + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + New Request + No show + Cancelled + Cancel + Start request + Check request + Are you sure you want to proceed request + Add Money + Added to wallet + Transaction failed + Accept request + Are you sure you want to accept this request + Mark Complete + Are you sure you want to complete this request + accepted + In progress + Starting a call… + Starting a chat + Received from\n%s + NA + + Typing… + Today + Yesterday + Enter message + Type your message… + Photo + Hi %s\nI am Available for chat lets discuss the problem + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + Here is the bank account + Account number + Account Holder name + Bank name + IFSC code + Select currency + Add Bank + Edit Bank + %s Card ending with %s + years + Total Revenue made + Request completed + Title + Description + + %s · %s Reviews + To + End time must be greater than start time + Manage Availability + Select a Category + Let us know which category suits your profile the most to continue + Select Sub-Category + Full Name + Working Since + Next + Consultation Fees + For + Add availability + Add availability for %s + Service Type + Set Preferences + From + + New Interval + S + M + T + W + T + F + S + Week Days + Select Availability + Save + Fixed Price + Add price in %s to %s + Edit availability + Please select any service + Add price for %s + Add price in %s to %s for %s + Please select Title + Update Category + Manage Preferences + Tomorrow + For %s + All %s + All Weekdays + + + + @string/select_country + IN + US + + + + @string/select_currency + INR + USD + + + Dr. + Mr. + Mrs. + Miss. + + + @string/title + @string/dr + @string/mr + @string/mrs + @string/miss + + + Profile + Transaction History + Please select working days + Already have an account? + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Chat Online\nwith Top Doctors + At %s20 + Sign Up with Phone Number + Let’s Get Started ! + Minute + Cancel appointment + Are you sure you want to cancel appointment? + Please don\'t add interval in between of previous intervals + Disconnecting… + Transaction Success + Transaction Failed + + + Your profile has not yet been approved! + Once your profile has been approved, you ll start getting requests from users + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + No transaction history! + Once you successfully complete some requests, your transactions will appear here. + No notifications yet! + All notifications related to your activities will appear here. + + + + Share + Hey, Here is app for taking Online Consultancy Platform for Doctors, Physiotherapists, Accountants, Lawyers, Consultants etc. You should try it. + Edit card + Delete + Pay + Input amount + Select card + Add card + Enter amount + Payment + Are you sure you want to delete this card? + Money sent to bank account\n(%s) + + Submit + Add + Upload Documents + Please add + Manage Documents + + + + Appointment + + Prescription + Add Manual Prescription + Record Details + Record title + Add Images + Add Digital Prescription + Prescription Notes + Add notes + Medicine Name + Prescriptions + Duration + Dosage Type + Dosage Timings + Digital Prescription + Manual Prescription + Breakfast + "Dosage " + Before + After + With + Reset + Lunch + Dinner + years old + Select doases for %s + Select dosage Timings + Prescription added + View prescription + View all + Requests + Upload Banner + + + @string/select + 1 day + 2 days + 3 days + 4 days + 5 days + 6 days + 7 days + 8 days + 9 days + 10 days + 11 days + 12 days + 13 days + 14 days + 15 days + 16 days + 17 days + 18 days + 19 days + 10 days + 21 days + 22 days + 23 days + 24 days + 25 days + 26 days + 27 days + 28 days + 29 days + 30 days + + + Select + Tablet + Capsule + + @string/select + @string/tablet + @string/capsule + + + One + Two + Three + Four + + @string/select + @string/one + @string/two + @string/three + @string/four + + + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login with + + + We will need your call permission to give you better experience + Reached Destination + Status : + Start Service + Cancel Service + Service Status Update + Current Status + Status Update + Arrived + Started + Completed + Change Service Status + Pending + Update Status + Clear + Estimate Time of Arrival : %s + Quit + Are you sure you want to quit? It will stop your tracking + Service Completed + Track Status + Cancelled Service + + Details + Type here… + show more + show less + + + Language + Please choose your language + English + عربى + Account Setting + Change Password + Old Password + New Password + Confirm New Password + + + Success! + Your password changed successfully! + View map + Distance + Date + Time + Google map application not found + All Requests + Pdf + Audio + Retry + + Slide To Cancel + View Details + Price + Prescription detail + + Clinic Address + Please select Address for %s + Request for Payment + Extra Payment + Enter Description + Amount: %s + diff --git a/app/src/consult/.idea/.gitignore b/app/src/consult/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/app/src/consult/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/app/src/consult/.idea/misc.xml b/app/src/consult/.idea/misc.xml new file mode 100644 index 0000000..e0844bc --- /dev/null +++ b/app/src/consult/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/consult/.idea/modules.xml b/app/src/consult/.idea/modules.xml new file mode 100644 index 0000000..2aaa482 --- /dev/null +++ b/app/src/consult/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/consult/.idea/runConfigurations.xml b/app/src/consult/.idea/runConfigurations.xml new file mode 100644 index 0000000..797acea --- /dev/null +++ b/app/src/consult/.idea/runConfigurations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/consult/.idea/vcs.xml b/app/src/consult/.idea/vcs.xml new file mode 100644 index 0000000..c2365ab --- /dev/null +++ b/app/src/consult/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/consult/google-services.json b/app/src/consult/google-services.json new file mode 100644 index 0000000..014f823 --- /dev/null +++ b/app/src/consult/google-services.json @@ -0,0 +1,85 @@ +{ + "project_info": { + "project_number": "952614479078", + "firebase_url": "https://consultapp.firebaseio.com", + "project_id": "consultapp", + "storage_bucket": "consultapp.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:952614479078:android:6446d63474ae18b3cd0727", + "android_client_info": { + "package_name": "com.consultantvendor" + } + }, + "oauth_client": [ + { + "client_id": "952614479078-4394o92fb8c5lksrmq12541vhu0a0dal.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.consultantvendor", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "952614479078-n4emu848uscnrpp3ntnuu54ss616if1m.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCZ6vYaavuJ1AqqVZqacmSZWwYp8SrNDnE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "952614479078-n4emu848uscnrpp3ntnuu54ss616if1m.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:273447074175:android:3675e8c4893392e69c424a", + "android_client_info": { + "package_name": "com.healthcare.expert" + } + }, + "oauth_client": [ + { + "client_id": "273447074175-ic33ck4fj28i3llnchsfhtkgbl5mlnfc.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.healthcare.expert", + "certificate_hash": "235a8e14d427d901a89ac40f61605b5ad83794cc" + } + }, + { + "client_id": "273447074175-s11b0iajssv3aj87auqrtnc81r4b2k10.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyAzqUOhMtoUuUrG7lwv2rCvWVb-g4ZiLfk" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "273447074175-s11b0iajssv3aj87auqrtnc81r4b2k10.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/consult/ic_launcher-playstore.png b/app/src/consult/ic_launcher-playstore.png new file mode 100644 index 0000000..2ddb764 Binary files /dev/null and b/app/src/consult/ic_launcher-playstore.png differ diff --git a/app/src/consult/res/drawable-hdpi/ic_push.png b/app/src/consult/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..92276d7 Binary files /dev/null and b/app/src/consult/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-hdpi/ic_splash.png b/app/src/consult/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..269f1d3 Binary files /dev/null and b/app/src/consult/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-mdpi/ic_push.png b/app/src/consult/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..70f7d09 Binary files /dev/null and b/app/src/consult/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-mdpi/ic_splash.png b/app/src/consult/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..2b0bae4 Binary files /dev/null and b/app/src/consult/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-xhdpi/ic_push.png b/app/src/consult/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..a15d82b Binary files /dev/null and b/app/src/consult/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-xhdpi/ic_splash.png b/app/src/consult/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..3fd8802 Binary files /dev/null and b/app/src/consult/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-xxhdpi/ic_push.png b/app/src/consult/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..c6d42eb Binary files /dev/null and b/app/src/consult/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-xxhdpi/ic_splash.png b/app/src/consult/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..f96038d Binary files /dev/null and b/app/src/consult/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable-xxxhdpi/ic_push.png b/app/src/consult/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..5b77a55 Binary files /dev/null and b/app/src/consult/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/consult/res/drawable-xxxhdpi/ic_splash.png b/app/src/consult/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..340ee58 Binary files /dev/null and b/app/src/consult/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/consult/res/drawable/ic_launcher_foreground.xml b/app/src/consult/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/consult/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/consult/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/consult/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/consult/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/consult/res/mipmap-hdpi/ic_launcher.png b/app/src/consult/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..93dbc70 Binary files /dev/null and b/app/src/consult/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..17acc8a Binary files /dev/null and b/app/src/consult/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-hdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..4012ce2 Binary files /dev/null and b/app/src/consult/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-mdpi/ic_launcher.png b/app/src/consult/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..53d858b Binary files /dev/null and b/app/src/consult/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..ed4d639 Binary files /dev/null and b/app/src/consult/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-mdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..2871bfc Binary files /dev/null and b/app/src/consult/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-xhdpi/ic_launcher.png b/app/src/consult/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..d1563b4 Binary files /dev/null and b/app/src/consult/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0e93ce4 Binary files /dev/null and b/app/src/consult/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..628fe27 Binary files /dev/null and b/app/src/consult/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-xxhdpi/ic_launcher.png b/app/src/consult/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..778dc33 Binary files /dev/null and b/app/src/consult/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a0e1217 Binary files /dev/null and b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..a25517c Binary files /dev/null and b/app/src/consult/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..65571df Binary files /dev/null and b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..44bed44 Binary files /dev/null and b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..42212b7 Binary files /dev/null and b/app/src/consult/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/consult/res/values/colors.xml b/app/src/consult/res/values/colors.xml new file mode 100644 index 0000000..8e8d624 --- /dev/null +++ b/app/src/consult/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #0491FF + #0491FF + #0491FF + + diff --git a/app/src/consult/res/values/ic_launcher_background.xml b/app/src/consult/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/app/src/consult/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/src/consult/res/values/strings.xml b/app/src/consult/res/values/strings.xml new file mode 100644 index 0000000..b3bc56a --- /dev/null +++ b/app/src/consult/res/values/strings.xml @@ -0,0 +1,20 @@ + + RoyoConsult For Experts + + + 614826522700049 + fb614826522700049 + + + royoconsult.page.link + com.codebrew.RoyoConsultantVendor + + + AIzaSyCZ6vYaavuJ1AqqVZqacmSZWwYp8SrNDnE + 952614479078-892v5fage0p4pguerkht8krnpoo55dq3.apps.googleusercontent.com + + + You have new update for %s! + Create a %s\naccount to continue + + diff --git a/app/src/edu/google-services.json b/app/src/edu/google-services.json new file mode 100644 index 0000000..f794afb --- /dev/null +++ b/app/src/edu/google-services.json @@ -0,0 +1,99 @@ +{ + "project_info": { + "project_number": "985496364415", + "firebase_url": "https://royo-education.firebaseio.com", + "project_id": "royo-education", + "storage_bucket": "royo-education.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:985496364415:android:d87fe71afb53698f14264a", + "android_client_info": { + "package_name": "com.edu.expert" + } + }, + "oauth_client": [ + { + "client_id": "985496364415-5jp747is72hccmjm2sosnjmp8f7eitt0.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.edu.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "985496364415-0kv0l82pe2hr12s6ep66etcls77i8481.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBb2uXkk9gZp-oPIS0aP7bRu1ByDB4q1OE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "985496364415-f1jhbr1f65tfqrbdddfcuodqmc3fldgu.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "985496364415-hbo403nmok8chuhihq2c2uk0kmvf2hj9.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.codebrew.RoyoEducation" + } + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:985496364415:android:0830dfcb3a8b49b814264a", + "android_client_info": { + "package_name": "com.edu.user" + } + }, + "oauth_client": [ + { + "client_id": "985496364415-bep6m3c8iaovpdfi855ljhvhuj3j6vt9.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.edu.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "985496364415-0kv0l82pe2hr12s6ep66etcls77i8481.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyBb2uXkk9gZp-oPIS0aP7bRu1ByDB4q1OE" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "985496364415-f1jhbr1f65tfqrbdddfcuodqmc3fldgu.apps.googleusercontent.com", + "client_type": 3 + }, + { + "client_id": "985496364415-hbo403nmok8chuhihq2c2uk0kmvf2hj9.apps.googleusercontent.com", + "client_type": 2, + "ios_info": { + "bundle_id": "com.codebrew.RoyoEducation" + } + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/edu/ic_launcher-playstore.png b/app/src/edu/ic_launcher-playstore.png new file mode 100644 index 0000000..2289d94 Binary files /dev/null and b/app/src/edu/ic_launcher-playstore.png differ diff --git a/app/src/edu/res/drawable-hdpi/ic_push.png b/app/src/edu/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..97515ac Binary files /dev/null and b/app/src/edu/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-hdpi/ic_splash.png b/app/src/edu/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..c5e8520 Binary files /dev/null and b/app/src/edu/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-mdpi/ic_push.png b/app/src/edu/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..cfd2413 Binary files /dev/null and b/app/src/edu/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-mdpi/ic_splash.png b/app/src/edu/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..b8d61fc Binary files /dev/null and b/app/src/edu/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-xhdpi/ic_push.png b/app/src/edu/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..753577e Binary files /dev/null and b/app/src/edu/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-xhdpi/ic_splash.png b/app/src/edu/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..8f68dcf Binary files /dev/null and b/app/src/edu/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-xxhdpi/ic_push.png b/app/src/edu/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..7379c2a Binary files /dev/null and b/app/src/edu/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-xxhdpi/ic_splash.png b/app/src/edu/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..aa63f73 Binary files /dev/null and b/app/src/edu/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable-xxxhdpi/ic_push.png b/app/src/edu/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..7bdb3a8 Binary files /dev/null and b/app/src/edu/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/edu/res/drawable-xxxhdpi/ic_splash.png b/app/src/edu/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..63625b5 Binary files /dev/null and b/app/src/edu/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/edu/res/drawable/ic_launcher_foreground.xml b/app/src/edu/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/edu/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/edu/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/edu/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/edu/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/edu/res/mipmap-hdpi/ic_launcher.png b/app/src/edu/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..4894623 Binary files /dev/null and b/app/src/edu/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..b6e5b15 Binary files /dev/null and b/app/src/edu/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-hdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..7f30bcd Binary files /dev/null and b/app/src/edu/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-mdpi/ic_launcher.png b/app/src/edu/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..1e7b175 Binary files /dev/null and b/app/src/edu/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5c58f27 Binary files /dev/null and b/app/src/edu/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-mdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..72da052 Binary files /dev/null and b/app/src/edu/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-xhdpi/ic_launcher.png b/app/src/edu/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..9242347 Binary files /dev/null and b/app/src/edu/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..64baf6f Binary files /dev/null and b/app/src/edu/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..8f60d61 Binary files /dev/null and b/app/src/edu/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-xxhdpi/ic_launcher.png b/app/src/edu/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..3f92d98 Binary files /dev/null and b/app/src/edu/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2bc7d3e Binary files /dev/null and b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..73961ac Binary files /dev/null and b/app/src/edu/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..c664d9a Binary files /dev/null and b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7c4cadb Binary files /dev/null and b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e83ef64 Binary files /dev/null and b/app/src/edu/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/edu/res/values/colors.xml b/app/src/edu/res/values/colors.xml new file mode 100644 index 0000000..8e8d624 --- /dev/null +++ b/app/src/edu/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #0491FF + #0491FF + #0491FF + + diff --git a/app/src/edu/res/values/ic_launcher_background.xml b/app/src/edu/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..a16dc43 --- /dev/null +++ b/app/src/edu/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #0491FF + \ No newline at end of file diff --git a/app/src/edu/res/values/strings.xml b/app/src/edu/res/values/strings.xml new file mode 100644 index 0000000..f3d8d8b --- /dev/null +++ b/app/src/edu/res/values/strings.xml @@ -0,0 +1,19 @@ + + RoyoEducation For Expert + + + 757819374777114 + fb757819374777114 + + + royoeducation.page.link + com.codebrew.RoyoEducationExpert + + + AIzaSyBb2uXkk9gZp-oPIS0aP7bRu1ByDB4q1OE + 985496364415-f1jhbr1f65tfqrbdddfcuodqmc3fldgu.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + diff --git a/app/src/heal/google-services.json b/app/src/heal/google-services.json new file mode 100644 index 0000000..d980a9a --- /dev/null +++ b/app/src/heal/google-services.json @@ -0,0 +1,85 @@ +{ + "project_info": { + "project_number": "1001624543225", + "firebase_url": "https://heal-f1922.firebaseio.com", + "project_id": "heal-f1922", + "storage_bucket": "heal-f1922.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1001624543225:android:438860df0a1ed7344ea728", + "android_client_info": { + "package_name": "com.heal.expert" + } + }, + "oauth_client": [ + { + "client_id": "1001624543225-d8647let09qv09pgub4gcjvpb5htkag7.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.heal.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD8H-xaJhni0iozyRdTG3pDmrQHQJYkF_M" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:1001624543225:android:90d5886827d1a10a4ea728", + "android_client_info": { + "package_name": "com.heal.user" + } + }, + "oauth_client": [ + { + "client_id": "1001624543225-cfq6m3j6p13uqie1khs6qgfm3rll1b2b.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.heal.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyD8H-xaJhni0iozyRdTG3pDmrQHQJYkF_M" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/heal/ic_launcher-playstore.png b/app/src/heal/ic_launcher-playstore.png new file mode 100644 index 0000000..c2ba30d Binary files /dev/null and b/app/src/heal/ic_launcher-playstore.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_1.png b/app/src/heal/res/drawable-hdpi/ic_1.png new file mode 100644 index 0000000..c272b43 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_2.png b/app/src/heal/res/drawable-hdpi/ic_2.png new file mode 100644 index 0000000..e78d418 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_4.png b/app/src/heal/res/drawable-hdpi/ic_4.png new file mode 100644 index 0000000..1b780f8 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_5.png b/app/src/heal/res/drawable-hdpi/ic_5.png new file mode 100644 index 0000000..2ceb910 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_6.png b/app/src/heal/res/drawable-hdpi/ic_6.png new file mode 100644 index 0000000..a970d3c Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_1.png new file mode 100644 index 0000000..0d538c2 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_2.png new file mode 100644 index 0000000..af06585 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_3.png new file mode 100644 index 0000000..654370d Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-hdpi/ic_health_tool_4.png new file mode 100644 index 0000000..9aae6c5 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_push.png b/app/src/heal/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..b6c2e4f Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-hdpi/ic_splash.png b/app/src/heal/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..37cdd28 Binary files /dev/null and b/app/src/heal/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_1.png b/app/src/heal/res/drawable-mdpi/ic_1.png new file mode 100644 index 0000000..5130da2 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_2.png b/app/src/heal/res/drawable-mdpi/ic_2.png new file mode 100644 index 0000000..77a3411 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_4.png b/app/src/heal/res/drawable-mdpi/ic_4.png new file mode 100644 index 0000000..15bce86 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_5.png b/app/src/heal/res/drawable-mdpi/ic_5.png new file mode 100644 index 0000000..e96a408 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_6.png b/app/src/heal/res/drawable-mdpi/ic_6.png new file mode 100644 index 0000000..e533dc2 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_1.png new file mode 100644 index 0000000..04be829 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_2.png new file mode 100644 index 0000000..740f7b1 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_3.png new file mode 100644 index 0000000..845732f Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-mdpi/ic_health_tool_4.png new file mode 100644 index 0000000..e85165d Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_push.png b/app/src/heal/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..d327d52 Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-mdpi/ic_splash.png b/app/src/heal/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..7f5e79b Binary files /dev/null and b/app/src/heal/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_1.png b/app/src/heal/res/drawable-xhdpi/ic_1.png new file mode 100644 index 0000000..946daa1 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_2.png b/app/src/heal/res/drawable-xhdpi/ic_2.png new file mode 100644 index 0000000..8e3e382 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_4.png b/app/src/heal/res/drawable-xhdpi/ic_4.png new file mode 100644 index 0000000..75fbd5d Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_5.png b/app/src/heal/res/drawable-xhdpi/ic_5.png new file mode 100644 index 0000000..68df71b Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_6.png b/app/src/heal/res/drawable-xhdpi/ic_6.png new file mode 100644 index 0000000..484ccdc Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_1.png new file mode 100644 index 0000000..a46c0f8 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_2.png new file mode 100644 index 0000000..cbfc99d Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_3.png new file mode 100644 index 0000000..d2f6102 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-xhdpi/ic_health_tool_4.png new file mode 100644 index 0000000..e102161 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_push.png b/app/src/heal/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..a616d95 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-xhdpi/ic_splash.png b/app/src/heal/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..3e23fd9 Binary files /dev/null and b/app/src/heal/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_1.png b/app/src/heal/res/drawable-xxhdpi/ic_1.png new file mode 100644 index 0000000..c4f7cba Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_2.png b/app/src/heal/res/drawable-xxhdpi/ic_2.png new file mode 100644 index 0000000..9bcd68a Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_4.png b/app/src/heal/res/drawable-xxhdpi/ic_4.png new file mode 100644 index 0000000..7c318ee Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_5.png b/app/src/heal/res/drawable-xxhdpi/ic_5.png new file mode 100644 index 0000000..28dbded Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_6.png b/app/src/heal/res/drawable-xxhdpi/ic_6.png new file mode 100644 index 0000000..691f071 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_1.png new file mode 100644 index 0000000..df38e73 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_2.png new file mode 100644 index 0000000..a8f7a4a Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_3.png new file mode 100644 index 0000000..ac5010f Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_4.png new file mode 100644 index 0000000..65a8b2f Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_push.png b/app/src/heal/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..c599ed7 Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-xxhdpi/ic_splash.png b/app/src/heal/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..aa3eaac Binary files /dev/null and b/app/src/heal/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_1.png b/app/src/heal/res/drawable-xxxhdpi/ic_1.png new file mode 100644 index 0000000..d0e240a Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_1.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_2.png b/app/src/heal/res/drawable-xxxhdpi/ic_2.png new file mode 100644 index 0000000..20c4446 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_2.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_4.png b/app/src/heal/res/drawable-xxxhdpi/ic_4.png new file mode 100644 index 0000000..60d803f Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_4.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_5.png b/app/src/heal/res/drawable-xxxhdpi/ic_5.png new file mode 100644 index 0000000..d9239d1 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_5.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_6.png b/app/src/heal/res/drawable-xxxhdpi/ic_6.png new file mode 100644 index 0000000..a6b4327 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_6.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_1.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_1.png new file mode 100644 index 0000000..a1b1a66 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_1.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_2.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_2.png new file mode 100644 index 0000000..26a07c4 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_2.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_3.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_3.png new file mode 100644 index 0000000..4b42694 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_3.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_4.png b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_4.png new file mode 100644 index 0000000..b2d5ce4 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_health_tool_4.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_push.png b/app/src/heal/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..a122db0 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/heal/res/drawable-xxxhdpi/ic_splash.png b/app/src/heal/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..3d6e765 Binary files /dev/null and b/app/src/heal/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/heal/res/drawable/ic_launcher_foreground.xml b/app/src/heal/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/heal/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/heal/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/heal/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/heal/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/heal/res/mipmap-hdpi/ic_launcher.png b/app/src/heal/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..1770cb7 Binary files /dev/null and b/app/src/heal/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5dde674 Binary files /dev/null and b/app/src/heal/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-hdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..8366c01 Binary files /dev/null and b/app/src/heal/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-mdpi/ic_launcher.png b/app/src/heal/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..8122704 Binary files /dev/null and b/app/src/heal/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..d4774f5 Binary files /dev/null and b/app/src/heal/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-mdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..c3a32ba Binary files /dev/null and b/app/src/heal/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-xhdpi/ic_launcher.png b/app/src/heal/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..1c17b74 Binary files /dev/null and b/app/src/heal/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..8d948d2 Binary files /dev/null and b/app/src/heal/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..5282412 Binary files /dev/null and b/app/src/heal/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-xxhdpi/ic_launcher.png b/app/src/heal/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..22595a6 Binary files /dev/null and b/app/src/heal/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..12603d5 Binary files /dev/null and b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b2be638 Binary files /dev/null and b/app/src/heal/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..b37ef73 Binary files /dev/null and b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..e75c395 Binary files /dev/null and b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..6aeaf59 Binary files /dev/null and b/app/src/heal/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/heal/res/values/colors.xml b/app/src/heal/res/values/colors.xml new file mode 100644 index 0000000..be6e379 --- /dev/null +++ b/app/src/heal/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #8CCD38 + #8CCD38 + #8CCD38 + + #1A8CCD38 + #338CCD38 + diff --git a/app/src/heal/res/values/ic_launcher_background.xml b/app/src/heal/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..c5d5899 --- /dev/null +++ b/app/src/heal/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/app/src/heal/res/values/strings.xml b/app/src/heal/res/values/strings.xml new file mode 100644 index 0000000..6c13726 --- /dev/null +++ b/app/src/heal/res/values/strings.xml @@ -0,0 +1,596 @@ + + Heal For Doctors + + + 347523059865896 + fb347523059865896 + + + healConsult.page.link + com.heal.expert + + + com.heal.user + + + AIzaSyD8H-xaJhni0iozyRdTG3pDmrQHQJYkF_M + 1001624543225-ivqv1cmgl2bot7nd0c6r3mdcjmn7tdrn.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + + Nationality + Select Nationality + + Login + Facebook + Google + Login using Email + Sign Up using Email + Sign Up + Enter phone number + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + + Patients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Contact Us + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Re-Enter Password + Bio + Edit + View + Age: + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Revenue + Calls + Available Balance + Pay-out + + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + %s Completed + %s Unsuccessful + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + New Request + No show + Cancelled + Cancel + Start request + Check request + Are you sure you want to proceed request + Add Money + Added to wallet + Transaction failed + Accept request + Are you sure you want to accept this request + Mark Complete + Are you sure you want to complete this request + Accepted + In progress + Starting a call… + Starting a chat + Received from\n%s + NA + + Typing… + Today + Yesterday + Active now + Offline + Enter message + Type your message… + Photo + Hi %s\nI am Available for chat lets discuss the problem + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + Here is the bank account + Account number + Account Holder name + Bank name + IBAN + Select currency + Add Bank + Edit Bank + %s Card ending with %s + years + Total Revenue made + Request completed + Title + Description + + + Online Programs + Add new + Add Program + Select date + Select Future date + Select Previous date + Select time + Price of Program + Program Name + Program Time + Price of Program + Start Program + Select Category + Category + By starting Program you ll make this Program available for all who occupied. Want to start Program? + User Joined + Complete Program + Are you sure want to complete this Program? + + %s · %s Reviews + End time must be greater than start time + Manage Availability + Select a Category + Let us know which category suits your profile the most to continue + Select Sub-Category + Full Name + Since Working + Next + Consultation Fees + For + Add availability + Add availability for %s + Service Type + Set Preferences + From + + New Interval + S + M + T + W + T + F + S + Week Days + Select Availability + Save + Fixed Price + Add price in %s to %s + Edit availability + Please select any service + Add price for %s + Add price in %s to %s for %s + Please select Title + Update Category + Manage Preferences + Tomorrow + For %s + All %s + All Weekdays + + + + @string/select_country + IN + US + + + + + @string/select_currency + INR + USD + + + + Dr. + Mr. + Mrs. + Miss. + + + @string/title + @string/dr + @string/mr + @string/mrs + @string/miss + + + Profile + Transaction History + Please select working days + Already have an account? + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Chat Online\nwith Top Doctors + At %s20 + Sign Up with Phone Number + Let’s Get Started ! + Minute + Cancel appointment + Are you sure you want to cancel appointment? + Please don\'t add interval in between of previous intervals + Disconnecting… + Transaction Success + Transaction Failed + + + Your profile has not yet been approved! + Once your profile has been approved, you ll start getting requests from users + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + No appointments history! + No Appointments scheduled. + No transaction history! + Once you successfully complete some requests, your transactions will appear here. + No programs created by you yet! + Click on add button to create some programs which will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No Expert advise Found! + Your Expert advise will be shown here once someone asks. + No Answers Yet! + No one advised this. Be the first. + No Health Tips! + Health Tips will appear here once added + + + Start YourJourney now + Address + City + State + Zip Code + I agree to the Terms of Service, Privacy Policy, Cookies Policy and Fee Schedules. + I understand that the service providers and other professionals that I am connected to on app, and understand the service is a communication tool only. + I understand that each service provider may have their own fee schedule and billing rates. + Do you accept insurance + If \'Yes\' what Insurance + Your Accepted Insurance + Please check all terms + Select State + Select City + Submit + Add + + Add + Upload Documents + Please add + Manage Documents + + + + Post + Post Health Tips + Latest Health Tips + Health Tips + + + Appointment + + Prescription + Add Manual Prescription + Record Details + Record title + Add Images + Add Digital Prescription + Prescription Notes + Add notes + Medicine Name + Prescriptions + Duration + Dosage Type + Dosage Timings + Digital Prescription + Manual Prescription + Breakfast + "Dosage " + Before + After + With + Reset + Lunch + Dinner + years old + Select doases for %s + Select dosage Timings + Prescription added + View prescription + View all + Requests + Upload Banner + + + @string/select + 1 day + 2 days + 3 days + 4 days + 5 days + 6 days + 7 days + 8 days + 9 days + 10 days + 11 days + 12 days + 13 days + 14 days + 15 days + 16 days + 17 days + 18 days + 19 days + 10 days + 21 days + 22 days + 23 days + 24 days + 25 days + 26 days + 27 days + 28 days + 29 days + 30 days + + + Select + Tablet + Capsule + + @string/select + @string/tablet + @string/capsule + + + One + Two + Three + Four + + @string/select + @string/one + @string/two + @string/three + @string/four + + + + + Are you a Doctor or Patient? + Doctor + Patient + + + Chat with Patient + Have a quick chat with your patient about their concern. + + Video/Audio Appointments + Accept online consultation and earn a feasible amount of money wherever you are. + + Online Program + Enroll yourself to a specific program to help improve the patient\'s lifestyle. + + Easy Wallet Management + Manage your earnings through the requests you accept and transfer it to your personal account with simple steps. + + Home Visit + Accept home visit requests and start healing patients while visiting them at home. + + Get Started + Skip + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login with + + Gender + Select Gender + Sign Up As + Choose Language + + + We will need your call permission to give you better experience + Reached Destination + Status : + Start Service + Cancel Service + Service Status Update + Current Status + Status Update + Arrived + Started + Completed + Change Service Status + Pending + Update Status + Clear + Estimate Time of Arrival : %s + Quit + Are you sure you want to quit? It will stop your tracking + Service Completed + Track Status + Cancelled Service + + Details + Type here… + show more + show less + Free Expert Advice + + + Language + Please choose your language + English + عربى + Account Setting + Change Password + Old Password + New Password + Confirm New Password + + + Success! + Your password changed successfully! + View map + Distance + Date + Time + Google map application not found + All Requests + Pdf + Audio + Retry + + + Health Tools + BMI Calculator + BMI Calculator + Water Intake Calculator + Water Intake Calculator + Protein Intake Calculator + Protein Intake Calculator + Pregnancy Calculator + Pregnancy Calculator + + Calculation Method + Calculate My Due Date + Last Period + Ultrasound + IVF + Conception Date + + The first day of your last period + Cycle Length + Date of Conception + Date of Transfer + IVF Transfer Date + Date of Ultrasound + Congratulations! + Your due date is %s + Your are %s weeks and %s days pregnant + + I don\'t know + days + day + weeks + week + Your Pregnancy Timeline + 1st Trimester + 2nd Trimester + 3rd Trimester + Your baby will be a %s + to + ♈ Aries + ♋ Cancer + ♉ Taurus + ♌ Leo + ♊ Gemini + ♍ Virgo + ♎ Libra + ♑ Capricorn + ♏ Scorpio + ♒ Aquarius + ♐ Sagittarius + ♓ Pisces + + + @string/last_period + @string/conception_date + @string/ivf + @string/ultrasound + + + Drink Water + Select amount of water + Set your daily water limit + Water Intake (Literes) + Set daily limit + Lt + ml + g + Kg + Water Intake + Daily Limit + Days Completed + + Protein Intake + Take Protein + Select amount of protein + Set your daily Protein limit + Protein Intake (Grams) + + + Weight + Height + Your BMI + Please enter weight + Please enter weight + Please enter height + UNDERWEIGHT + NORMAL + OVERWEIGHT + 0 - 18.5 + 18.5 - 25 + \>25 + Male + Female + + Symptoms + Slide To Cancel + View Details + Price + Prescription detail + Are you available for Emergency Consultation? + diff --git a/app/src/healthcare/healthcare.jks b/app/src/healthcare/healthcare.jks new file mode 100644 index 0000000..c7395c5 Binary files /dev/null and b/app/src/healthcare/healthcare.jks differ diff --git a/app/src/healthcare/ic_launcher-playstore.png b/app/src/healthcare/ic_launcher-playstore.png new file mode 100644 index 0000000..04f53df Binary files /dev/null and b/app/src/healthcare/ic_launcher-playstore.png differ diff --git a/app/src/healthcare/res/drawable-hdpi/ic_splash.png b/app/src/healthcare/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..c5e8520 Binary files /dev/null and b/app/src/healthcare/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-mdpi/ic_splash.png b/app/src/healthcare/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..b8d61fc Binary files /dev/null and b/app/src/healthcare/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-xhdpi/ic_splash.png b/app/src/healthcare/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..8f68dcf Binary files /dev/null and b/app/src/healthcare/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-xxhdpi/ic_splash.png b/app/src/healthcare/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..aa63f73 Binary files /dev/null and b/app/src/healthcare/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable-xxxhdpi/ic_splash.png b/app/src/healthcare/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..63625b5 Binary files /dev/null and b/app/src/healthcare/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/healthcare/res/drawable/ic_launcher_foreground.xml b/app/src/healthcare/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/healthcare/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/healthcare/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/healthcare/res/mipmap-hdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..4016ed0 Binary files /dev/null and b/app/src/healthcare/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..8417f84 Binary files /dev/null and b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-hdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..45855a2 Binary files /dev/null and b/app/src/healthcare/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-mdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..31573f2 Binary files /dev/null and b/app/src/healthcare/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..99d55a6 Binary files /dev/null and b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-mdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..5e3e1d2 Binary files /dev/null and b/app/src/healthcare/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-xhdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..21d269f Binary files /dev/null and b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..9b4c778 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..75927ba Binary files /dev/null and b/app/src/healthcare/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..6afc828 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..76a0cd2 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..e94ae43 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..e0441e2 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..a302986 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..b6453d6 Binary files /dev/null and b/app/src/healthcare/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/healthcare/res/values/colors.xml b/app/src/healthcare/res/values/colors.xml new file mode 100644 index 0000000..8e8d624 --- /dev/null +++ b/app/src/healthcare/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #0491FF + #0491FF + #0491FF + + diff --git a/app/src/healthcare/res/values/ic_launcher_background.xml b/app/src/healthcare/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..a16dc43 --- /dev/null +++ b/app/src/healthcare/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #0491FF + \ No newline at end of file diff --git a/app/src/healthcare/res/values/strings.xml b/app/src/healthcare/res/values/strings.xml new file mode 100644 index 0000000..5009029 --- /dev/null +++ b/app/src/healthcare/res/values/strings.xml @@ -0,0 +1,18 @@ + + HealthCare For Experts + + + 3597982143546228 + fb3597982143546228 + + + royohealthcare.page.link + + + + 273447074175-iog9kg7n8dlsbp0a3r46bvsi1ltca7e5.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + diff --git a/app/src/hexalud/Info b/app/src/hexalud/Info new file mode 100644 index 0000000..040519b --- /dev/null +++ b/app/src/hexalud/Info @@ -0,0 +1,11 @@ +//Server Key +AAAAGuScgqs:APA91bH_b_K5N7efge8dmA-pwsCbmxLiAcZOXHHQrNnkc_VT2OPtw3JXz2DJzj0n6J5qoVpzEIaqdV1WqYTUI9k1kI5LK85UEIdAA4u2fn10p_JdOt4mXp39d9foPgZ6jHmHcOAv3CG_ + +//Google + +//Facebook +developer.codebrew@gmail.com +developer@facebook +//Fb Ids +680508489286924 +816fc4b097ea81a5784e4cec2a4dc84e \ No newline at end of file diff --git a/app/src/hexalud/google-services.json b/app/src/hexalud/google-services.json new file mode 100644 index 0000000..143c9a5 --- /dev/null +++ b/app/src/hexalud/google-services.json @@ -0,0 +1,68 @@ +{ + "project_info": { + "project_number": "847724593128", + "project_id": "hexalud-c3d45", + "storage_bucket": "hexalud-c3d45.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:847724593128:android:4669a0f7f987ad42edee5d", + "android_client_info": { + "package_name": "com.hexalud.agent" + } + }, + "oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCl7H8Jj01KGnUNEw3ppfOZ2OL31ytgcsM" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:847724593128:android:e8f69badb5688c9bedee5d", + "android_client_info": { + "package_name": "com.hexalud.user" + } + }, + "oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyCl7H8Jj01KGnUNEw3ppfOZ2OL31ytgcsM" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "847724593128-norb2ea1ppc8eu8lje3l3noieb7tror4.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/hexalud/ic_launcher-playstore.png b/app/src/hexalud/ic_launcher-playstore.png new file mode 100644 index 0000000..baed671 Binary files /dev/null and b/app/src/hexalud/ic_launcher-playstore.png differ diff --git a/app/src/hexalud/res/color/color_theme_60.xml b/app/src/hexalud/res/color/color_theme_60.xml new file mode 100644 index 0000000..8caab66 --- /dev/null +++ b/app/src/hexalud/res/color/color_theme_60.xml @@ -0,0 +1,9 @@ + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable-hdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-hdpi/ic_logo_home.png new file mode 100644 index 0000000..5f6eb4e Binary files /dev/null and b/app/src/hexalud/res/drawable-hdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-hdpi/ic_splash.png b/app/src/hexalud/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..a8ed0fd Binary files /dev/null and b/app/src/hexalud/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-mdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-mdpi/ic_logo_home.png new file mode 100644 index 0000000..ea87450 Binary files /dev/null and b/app/src/hexalud/res/drawable-mdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-mdpi/ic_splash.png b/app/src/hexalud/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..b41a63b Binary files /dev/null and b/app/src/hexalud/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-xhdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-xhdpi/ic_logo_home.png new file mode 100644 index 0000000..dd74b8c Binary files /dev/null and b/app/src/hexalud/res/drawable-xhdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-xhdpi/ic_splash.png b/app/src/hexalud/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..b1d3d42 Binary files /dev/null and b/app/src/hexalud/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-xxhdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-xxhdpi/ic_logo_home.png new file mode 100644 index 0000000..679bab2 Binary files /dev/null and b/app/src/hexalud/res/drawable-xxhdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-xxhdpi/ic_splash.png b/app/src/hexalud/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..78e6413 Binary files /dev/null and b/app/src/hexalud/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable-xxxhdpi/ic_logo_home.png b/app/src/hexalud/res/drawable-xxxhdpi/ic_logo_home.png new file mode 100644 index 0000000..2c6c576 Binary files /dev/null and b/app/src/hexalud/res/drawable-xxxhdpi/ic_logo_home.png differ diff --git a/app/src/hexalud/res/drawable-xxxhdpi/ic_splash.png b/app/src/hexalud/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..ba77b77 Binary files /dev/null and b/app/src/hexalud/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/hexalud/res/drawable/drawable_alternate_button.xml b/app/src/hexalud/res/drawable/drawable_alternate_button.xml new file mode 100644 index 0000000..bd2bbcd --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_alternate_button.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme.xml b/app/src/hexalud/res/drawable/drawable_theme.xml new file mode 100644 index 0000000..560f6d9 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_60.xml b/app/src/hexalud/res/drawable/drawable_theme_60.xml new file mode 100644 index 0000000..caf42f1 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_60.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_8.xml b/app/src/hexalud/res/drawable/drawable_theme_8.xml new file mode 100644 index 0000000..9f0504d --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_8.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_rounded_4.xml b/app/src/hexalud/res/drawable/drawable_theme_rounded_4.xml new file mode 100644 index 0000000..cbff00d --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_rounded_4.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_stroke.xml b/app/src/hexalud/res/drawable/drawable_theme_stroke.xml new file mode 100644 index 0000000..83ff4b0 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_stroke.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_stroke_4.xml b/app/src/hexalud/res/drawable/drawable_theme_stroke_4.xml new file mode 100644 index 0000000..2245d9e --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_stroke_4.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/drawable_theme_stroke_60.xml b/app/src/hexalud/res/drawable/drawable_theme_stroke_60.xml new file mode 100644 index 0000000..cbaadb5 --- /dev/null +++ b/app/src/hexalud/res/drawable/drawable_theme_stroke_60.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/ic_launcher_foreground.xml b/app/src/hexalud/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/hexalud/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/drawable/ic_push.xml b/app/src/hexalud/res/drawable/ic_push.xml new file mode 100644 index 0000000..de55efd --- /dev/null +++ b/app/src/hexalud/res/drawable/ic_push.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/hexalud/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/hexalud/res/mipmap-hdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..2cada52 Binary files /dev/null and b/app/src/hexalud/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..08cdc8a Binary files /dev/null and b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-hdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..1d463f1 Binary files /dev/null and b/app/src/hexalud/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-mdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..aaa72a6 Binary files /dev/null and b/app/src/hexalud/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..7a380ec Binary files /dev/null and b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-mdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..34ccf00 Binary files /dev/null and b/app/src/hexalud/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-xhdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..eb2052c Binary files /dev/null and b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..c918954 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..aab8c08 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..d1964fa Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5bdb0ab Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..80dd8bb Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..33e142d Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..2ec1396 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..3264b53 Binary files /dev/null and b/app/src/hexalud/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/hexalud/res/values-ar/strings.xml b/app/src/hexalud/res/values-ar/strings.xml new file mode 100644 index 0000000..61e85e3 --- /dev/null +++ b/app/src/hexalud/res/values-ar/strings.xml @@ -0,0 +1,271 @@ + + Inhomed + + لديك تحديث جديد لبرنامج %s! + أنت بحاجة إلى حساب %s\n للمتابعة + + الطبيب الآن + اطلب + + السماح + أنكر + إعدادات + تحتاج هذه الميزة إلى إذن لاستخدام الكاميرا ووحدة التخزين الخارجية. + تحتاج هذه الميزة إلى إذن لاستخدام تسجيل الصوت والتخزين الخارجي. + + الإنترنت + الرجاء التحقق من اتصال الانترنت الخاص بك + حسنا + إنذار + تسجيل الدخول + موقع التواصل الاجتماعي الفيسبوك + جوجل + تسجيل الدخول باستخدام البريد الإلكتروني + سجل باستخدام البريد الإلكتروني + استمر في %s + مستخدم جديد؟ + سجل + هيا بنا نبدأ! + نحتاج إلى رقم هاتفك للتعرف عليك. + تم إرسال الرمز إلى %s + أعد إرسال الرمز + ألم تتلق الرمز بعد؟ + التحقق + لقد أرسلنا لك رمزًا إلى %s + الرجاء إدخال otp + موقعك + دردشة + العملاء + تجربة + المراجعات + حول + + الصفحة الرئيسية + التاريخ + تنبيه + تسجيل خروج + الأحكام والشروط + ادعو الناس + الإصدار %s + أنت تقوم بتشغيل أحدث إصدار + تعيينات + اسم + البريد الإلكتروني + تاريخ الولادة + كلمه السر + السيرة الذاتية + التسجيل بالفعل؟ + تعديل + عمر: + أدخل رقم الهاتف + رقم الهاتف + DOB + نحتاج إلى بريدك الإلكتروني & ؛ كلمة مرور للتعرف عليك. + ليس لديك حساب؟ + هل نسيت كلمة المرور + محفظة نقود + الرجاء إدخال الاسم + الرجاء تحديد DOB + الرجاء إدخال البريد الإلكتروني + الرجاء إدخال البريد الإلكتروني الصحيح + يجب ألا يقل طول كلمة المرور عن 8 أحرف + الرجاء إدخال السيرة الذاتية + + هل أنت متأكد أنك تريد تسجيل الخروج? + نعم + لا + لاتوجد بيانات + لا توجد فتحة متاحة + اختر صورة + حدد الوثيقة + تحديث + نحتاج إلى بريدك الإلكتروني المسجل للوصول إليك + لقد أرسلنا كلمة مرور مؤقتة في بريدك الإلكتروني. تفقد بريدك الالكتروني من فضلك. + إلغاء + الرصيد المتوفر + سيصرف + إضافة المال + أضف + الرجاء إدخال المبلغ + يضاف إلى المحفظة + إضافة بطاقة + اكتب رسالتك… + صورة فوتوغرافية + أدخل رسالة + اليوم + في الامس + تاريخ المعاملات + دفع الثمن ل\n%s + استرداد من\n%s + اختر البطاقة + طلب جديد + وافقت + في تقدم + عدم الحضور + ألغيت + %s بطاقة تنتهي بـ %s + على + اكتب تعليقاتك + إرسال + يرجى تقديم ملاحظات + الرجاء تحديد التصنيف + نهاية المحادثة + إنهاء \n الدردشة + هذا سينهي الدردشة. لن تتمكن من الدردشة بعد الآن + سنوات + تقييم + %s · %s المراجعات + اكتمل الطلب + كمية غير كافية + تحتاج إلى الاحتفاظ برصيد كافٍ من %s لإنشاء الطلب + طلب جدولة + اطلب الآن + حدد تاريخ + حدد الوقت + + البحث عن %s + الملف الشخصي + %s/%s + تعيين عامل التصفية + اختر التاريخ & ؛ زمن + غدا + امسح الكل + تفاصيل الحجز + تاريخ التعيين & ؛ توقيت + تأكيد الحجز + %s · %s + %s-%s + أضف رمز القسيمة + تفاصيل السعر + المجموع الفرعي + مجموع + تم تطبيق العرض الترويجي + بحجز هذا الموعد ، فإنك توافق على \n الشروط & ؛ الظروف + جدولة اجتماع + شاور + استشارة ل %s \n في %s + تحرير الفتحة + قم بالتسجيل باستخدام رقم الهاتف + بالمتابعة ، أنت توافق على\n + شروط الخدمة + شروط الخدمة + و + سياسة الخصوصية + هل لديك حساب؟ + تطبيق + دقيقة + كمية المدخلات + دفع + إلغاء التعيين + إعادة الجدولة + استشر الطبيب + %s ]]> + %s مستخدم متبقي ]]> + %s خصم على الحجز أ %s إلى %s ]]> + الرجاء إضافة قسيمة صالحة + هل أنت متأكد أنك تريد إلغاء الموعد؟ + فشل الاجراء + حذف + هل أنت متأكد أنك تريد حذف هذه البطاقة؟ + تحرير البطاقة + معدل + صباح + مساء + بعد الظهر + احجز مرة أخرى + توصيل… + جاري قطع الاتصال … + نجاح الصفقة + فشل الاجراء + + + لا تصنيف! + ستظهر الفئات هنا بمجرد إضافتها. + لا طلبات! + ليس لديك أي طلبات تم إنشاؤها في الوقت الحالي. + لم تبدأ أي محادثة بعد! + بمجرد قبول طلبات الدردشة الخاصة بك & ؛ تبدأ المحادثة ، ستظهر المواضيع هنا. + أعد شحن محفظتك لإنشاء حجز! + بمجرد إضافة الأموال أو أي خصم سيظهر هنا. + لا إخطارات حتى الآن! + ستظهر هنا جميع الإخطارات المتعلقة بأنشطتك. + لا يوجد تاريخ للمواعيد! + لا توجد مواعيد مجدولة. + لا خبراء حتى الان! + لم يتم حاليًا تسجيل أي خبير ضمن \'%s\' ، لذا عد لاحقًا. + + + + شارك + تحقق من هذا المنصب + مرحبًا ، هنا تطبيق لمنصة الاستشارات عبر الإنترنت للأطباء وأخصائيي العلاج الطبيعي والمحاسبين والمحامين والاستشاريين وما إلى ذلك ، يجب عليك تجربته. + دفع + عنوان + + مشاهدة الكل + مشاهدة الوصفة الطبية + الكل + تفاصيل + + + تخطي في الوقت الراهن + استخدم موقعي + سنحتاج إلى موقعك لنمنحك تجربة أفضل + اسمح لموقعك + + + انخفاض + إجابة + تسجيل الدخول مع + + + استشر عبر الإنترنت + استشارة طارئة + موعد الرعاية المنزلية + موعد العيادة + + + تقدير وقت الوصول : %s + الحالة : + فى الطريق + وصلت إلى الوجهة + وصل + بدأت + منجز + تتبع الحالة + استقال + هل أنت متأكد من أنك تريد الخروج؟ سوف يوقف التتبع الخاص بك + سنحتاج إلى إذن الاتصال الخاص بك لمنحك تجربة أفضل + اكتملت الخدمة + إعطاء ردود الفعل + الخدمة الملغاة + + + لغة + الرجاء اختيار لغتك + English + عربى + إعدادات الحساب + + + تم إرسال الطلب بنجاح! + تم تغيير كلمة المرور الخاصة بك بنجاح! + تمت إضافة المريض بنجاح! + + + إعرض الخريطة + تطبيق خرائط جوجل غير موجود + مسافة + تاريخ + زمن + نوع الخدمة + + حرك للإلغاء + عرض التفاصيل + السعر + تفاصيل الوصفة + جارى التحميل… + إتمام الدفع \nالرجاء الانتظار + Address for %s + Tax + diff --git a/app/src/hexalud/res/values-es/strings.xml b/app/src/hexalud/res/values-es/strings.xml new file mode 100644 index 0000000..1ba6c68 --- /dev/null +++ b/app/src/hexalud/res/values-es/strings.xml @@ -0,0 +1,657 @@ + + ¡Tienes una nueva actualización para %s! + Crea una %s\ncuenta para continuar + + PERMITIR + Negar + Ajustes + Esta característica necesita permiso para usar la cámara y el almacenamiento externo. + Esta característica necesita permiso para usar grabación de audio y almacenamiento externo. + + Internet + Por favor revise su conexion a internet + OK + Alerta + + Acceso + Facebook + Google + Iniciar sesión usando el correo electrónico + Regístrese usando el correo electrónico + Inscribirse + Ingresa número telefónico + Necesitamos su número de teléfono para identificarlo. + Código enviado a %s + Reenviar codigo + ¿Aún no recibiste el código? + Verificación + Te enviamos un código a %s + Por favor ingrese otp + Ubicación + Charlar + + Pacientes + Experiencia + Reseñas + Sobre + + Hogar + Historia + Notificación + Cerrar sesión + Términos y condiciones + Invitar a la gente + Versión %s + Está ejecutando la última versión + Equipo + Nombre + Correo electrónico + Fecha de nacimiento + Clave + Escriba la contraseña otra vez + biografía + Editar + Vista + Años: + Número de teléfono + fecha de nacimiento + Necesitamos su correo electrónico y amp; Contraseña para identificarte. + ¿No tenías una cuenta? + Has olvidado tu contraseña + Cartera + Ingresos + Llamadas + Saldo disponible + Pagar + + Por favor ingrese el nombre + Seleccione fecha de nacimiento + Por favor ingrese el correo electrónico + Por favor ingrese el correo electrónico correcto + La longitud de la contraseña debe tener al menos 8 caracteres + Por favor ingrese biografía + + ¿Estás seguro de que quieres cerrar sesión? + + No + Datos no encontrados + % s completado + %s fallido + Seleccionar imagen + Seleccionar documento + Actualizar + Necesitamos su correo electrónico registrado para comunicarnos con usted + Hemos enviado una contraseña temporal a su correo electrónico. Por favor revise su correo electrónico. + Nueva solicitud + No show + Cancelado + Cancelar + Solicitud de inicio + Solicitud de cheque + ¿Estás seguro de que quieres proceder solicitud? + Agregar dinero + Agregado a la billetera + Transacción fallida + Aceptar petición + ¿Estás seguro de que quieres aceptar esta solicitud? + Marcar como completo + ¿Está seguro de que desea completar esta solicitud? + Aceptado + En progreso + Iniciando una llamada… + Comenzando un chat + Recibido de\n%s + NA + + Mecanografía… + Este Dia + El dia de ayer + Activo ahora + Desconectado + Introducir mensaje + Escribe tu mensaje… + Foto + Hola, %s\nEstoy disponible para chatear. Discutamos el problema. + Chat finalizado + Finalizar\nchat + Esto finalizará el chat. Ya no podrás chatear + Aquí está la cuenta bancaria + Detalles del banco + Número de cuenta + Nombre del titular de la cuenta + Nombre del banco + código IFSC + Seleccione el tipo de moneda + Agregar banco + Editar banco + Tarjeta %s que termina en %s + años + Ingresos totales realizados + Solicitud completada + Título + Descripción + + + + Clases + transmisiones + Añadir nuevo + Agregar clase + Seleccione fecha + Seleccionar fecha futura + Seleccionar fecha anterior + Seleccionar hora + precio de clase + Nombre de la clase + Hora de clase + Precio de clase + Comenzar la clase + selecciona una categoría + Categoría + Al iniciar CLASS, hará que esta clase esté disponible para todos los que la ocuparon. ¿Quieres empezar la clase? + Usuario unido + Clase completa + ¿Seguro que quieres completar esta clase? + + %s · %s Reseñas + La hora de finalización debe ser mayor que la hora de inicio + Administrar disponibilidad + Seleccione una categoría + Háganos saber qué categoría se adapta más a su perfil para continuar + Seleccionar subcategoría + Nombre completo + trabajando desde + Próximo + Tarifas de consulta + Para + Añadir disponibilidad + Agregar disponibilidad para %s + Tipo de servicio + Establecer preferencias + De + + Nuevo Intervalo + S + M + T + W + T + F + S + Días de la semana + Seleccionar disponibilidad + Ahorrar + Precio fijo + Agregar precio en %s a %s + Editar disponibilidad + Por favor seleccione cualquier servicio + Agregar precio para %s + Agregar precio en %s a %s para %s + Por favor seleccione Título + Actualizar categoría + Administrar preferencias + Mañana + para %s + Todos los %s + Todos los días de la semana + + + @string/select_country + IN + US + + + + + @string/select_currency + INR + USD + + + + Dr. + Mr. + Mrs. + Miss. + + + @string/title + @string/dr + @string/mr + @string/mrs + @string/miss + + + Perfil + Historial de transacciones + Por favor seleccione días laborables + ¿Ya tienes una cuenta? + Al continuar, aceptas nuestros\n + Términos de servicio + and + Política de privacidad + Chatea en línea\ncon los mejores médicos + En %s20 + Regístrese con número de teléfono + Empecemos ! + Minuto + mínimo + Hora + Cancelar cita + ¿Estás seguro de que deseas cancelar una cita? + Por favor, no agregue un intervalo entre los intervalos anteriores + Desconectando… + Éxito de la transacción + Transacción fallida + + + ¡Tu perfil aún no ha sido aprobado! + Una vez que su perfil haya sido aprobado, comenzará a recibir solicitudes de los usuarios. + ¡Sin solicitudes! + No tienes ninguna solicitud generada en este momento. + ¡Ningún chat ha comenzado todavía! + Una vez que sus solicitudes de chat sean aceptadas & inicias la conversación, los hilos aparecerán aquí. + ¡Sin historial de citas! + No hay citas programadas. + ¡Sin historial de transacciones! + Una vez que complete con éxito algunas solicitudes, sus transacciones aparecerán aquí. + ¡No hay clases creadas por ti todavía! + Haga clic en el botón Agregar para crear algunas clases que aparecerán aquí. + ¡Aún no hay notificaciones! + Todas las notificaciones relacionadas con tus actividades aparecerán aquí. + No se encontró ningún experto! + Su consejo de experto se mostrará aquí una vez que alguien pregunte. + ¡Aún no hay respuestas! + Nadie aconsejó esto. Sé el primero. + ¡Sin artículo! + El artículo aparecerá aquí una vez agregado + ¡Sin blogs! + Los blogs aparecerán aquí una vez agregados + ¡No se encontró historial médico! + Sea el primer médico en escribir sobre este paciente. + ¡Ningún contacto añadido! + Ningún contacto añadido. Póngase en contacto con ll mostrar aquí una vez agregado. + + + + Cuota + Oye, aquí hay una aplicación para tomar la plataforma de consultoría en línea para médicos, fisioterapeutas, contadores, abogados, consultores, etc. Deberías probarla. + editar tarjeta + Borrar + Pagar + Importe de entrada + Seleccionar tarjeta + Agregar tarjeta + Ingrese la cantidad + Pago + ¿Estás seguro de que quieres eliminar esta tarjeta? + Dinero enviado a cuenta bancaria\n(%s) + + + Comience su viaje ahora + Dirección + Ciudad + País + Estado + Código postal + Acepto los Términos de servicio, la Política de privacidad, la Política de cookies y las Listas de tarifas. + Entiendo que los proveedores de servicios y otros profesionales con los que estoy conectado en la aplicación, y entiendo que el servicio es solo una herramienta de comunicación. + Entiendo que cada proveedor de servicios puede tener su propio programa de tarifas y tarifas de facturación. + aceptas seguro + Si \'Sí\' qué Seguro + Su seguro aceptado + Por favor revise todos los términos + Seleccione un país + Seleccione estado + Ciudad selecta + Enviar + Agregar + + Agregar + subir documentos + Por favor añadir + Administrar documentos + + + Correo + + Publicar artículo + + Publicar artículo + últimos artículos + blogs + Artículos + + Publicar Blog + Publicar blog + Últimos blogs + %s vistas + Favoritos + Mis artículos + + + Cita + + Receta + Añadir receta manual + Detalles del registro + Título del registro + Añadir imágenes + Añadir Receta Digital + Notas de prescripción + Agregar notas + Nombre del medicamento + recetas + Duración + Tipo de dosis + Tipo de dosis + Receta Digital + Receta Manual + Desayuno + "Dosis" + Antes + Después + Con + Reiniciar + Almuerzo + Cena + años + Seleccionar dosis para %s + Seleccione los tiempos de dosificación + Receta añadida + Ver prescripción + Ver todo + Peticiones + Subir pancarta + + + @string/select + 1 día + 2 días + 3 días + 4 dias + 5 dias + 6 días + 7 días + 8 dias + 9 días + 10 días + 11días + 12días + 13días + 14días + 15días + 16días + 17días + 18días + 19días + 10días + 21días + 22días + 23días + 24días + 25días + 26días + 27días + 28días + 29días + 30días + + + Seleccionar + tableta + Cápsula + + @string/select + @string/tablet + @string/capsule + + + Uno + Dos + Tres + cuatro + + @string/select + @string/one + @string/two + @string/three + @string/four + + + + + ¿Eres médico o paciente? + Médico + Paciente + + + Chatear con el doctor + Elige una especialidad y resuelve tus dudas a través de un Live chat realizado con Doctores + + Citas de video/audio + Obtenga citas en segundos de los mejores médicos líderes a su alrededor y obtenga recetas + + Programar citas + También puedes agendar tus citas con los mejores médicos líderes + + Doctor correcto + Reserve una cita con el médico adecuado y obtenga el asesoramiento adecuado de ellos + + Otras cuentas + Puede agregar cuentas para ancianos y niños y luego completar los detalles que definen su relación con usted + + + Visitas a domicilio + Puedes tener tus citas directo a tu casa a tu gusto + + Empezar + Saltar + + + Saltar por ahora + Usar mi ubicación + Necesitaremos tu ubicación para darte una mejor experiencia. + Permitir tu ubicación + + + Rechazar + Responder + Iniciar con + + Género + Seleccione género + Regístrate como + Elige lengua + + + Necesitaremos su permiso de llamada para brindarle una mejor experiencia. + Destino alcanzado + Estado : + Empieza el servicio + Cancelar servicio + Actualización del estado del servicio + Estado actual + Actualización de estado + Llegado + Empezado + Terminado + Cambiar el estado del servicio + Pendiente + Estado de actualización + Claro + Hora estimada de llegada: %s + Abandonar + ¿Seguro que quieres salir? Detendrá su seguimiento + Servicio completado + Seguimiento del estado + Servicio cancelado + + Detalles + Escriba aquí… + mostrar más + Muestra menos + Asesoramiento gratuito de expertos + + + Idioma + Por favor elige tu idioma + Inglés + عربى + Configuración de cuenta + Cambia la contraseña + Contraseña anterior + Nueva contraseña + Confirmar nueva contraseña + + + ¡Éxito! + ¡Su contraseña cambió con éxito! + Ver el mapa + Distancia + Fecha + Tiempo + Aplicación de mapas de Google no encontrada + Todas las solicitudes + pdf + Audio + Rever + + + Herramientas de salud + Calculadora de IMC + Calculadora de IMC + Calculadora de consumo de agua + Calculadora de consumo de agua + Calculadora de ingesta de proteínas + Calculadora de ingesta de proteínas + Calculadora de embarazo + Calculadora de embarazo + + Método de cálculo + Calcular mi fecha de vencimiento + Último periodo + Ultrasonido + FIV + Fecha de concepción + + El primer día de tu último período. + Duración del ciclo + Fecha de concepción + Fecha de Transferencia + Fecha de transferencia de FIV + Fecha de ultrasonido + ¡Felicidades! + Su fecha de vencimiento es %s + Tiene %s semanas y %s días de embarazo + + No sé + días + día + semanas + semana + Cronología de su embarazo + 1er Trimestre + 2do Trimestre + 3er Trimestre + Tu bebé será un %s + a + ♈ Aries + ♋Cáncer + ♉Tauro + ♌León + ♊Geminis + ♍ Virgo + + ♑ Capricorn + ♏ Scorpio + ♒ Aquarius + ♐ Sagittarius + ♓ Pisces + + + @string/last_period + @string/conception_date + @string/ivf + @string/ultrasound + + + Beber agua + Seleccione la cantidad de agua + Establece tu límite de agua diario + Consumo de agua (Litros) + Establecer límite diario + Teniente + ml + g + Kg + Consumo de agua + Límite diario + Días completados + + Ingesta de proteínas + tomar proteína + Seleccione la cantidad de proteína + Establece tu límite diario de proteínas + Ingesta de proteínas (gramos) + + + Peso + Altura + Tu BMI + Por favor ingrese el peso + Por favor ingrese el peso + Por favor, introduzca la altura + BAJO PESO + NORMAL + EXCESO DE PESO + 0 - 18.5 + 18.5 - 25 + \>25 + Masculino + Femenino + + Síntomas + ​​Deslizar para cancelar + Ver detalles + Precio + Detalle de prescripción + ¿Está disponible para una consulta de emergencia? + Código de uso: %s + Codigo de invitacion + Dirección de %s + Seleccione la dirección para %s + Solicitud de pago + Pago extra + Introduce la descripción + Cantidad: %s + Razón + Razones + Por favor, acepta los Términos + Llama ahora + Plan de cuidado + + Marcar\nListo + + + Cuestionarios de evaluación previa + Necesito ayuda + Necesito mucha ayuda + Historial médico + Fecha de cita: %s + Escriba algo sobre la condición médica del paciente. + La edad debe ser al menos 16 + + + @string/all_requests + @string/new_request + @string/completed + @string/canceled + + + Contactos de emergencia + Seleccione Contactos + ¿Está seguro de que desea eliminar este contacto \"%s\"? + Notificar + ¡Notificaremos a tus contactos que necesitas ayuda! + Notificado. + Notificamos a tus contactos que necesitas ayuda. + practicando desde + Únete a nuestra comunidad de \nWoman of Impact + + + diff --git a/app/src/hexalud/res/values/colors.xml b/app/src/hexalud/res/values/colors.xml new file mode 100644 index 0000000..a63746e --- /dev/null +++ b/app/src/hexalud/res/values/colors.xml @@ -0,0 +1,11 @@ + + + #00C46B + #00C46B + #00C46B + + #3839C6C0 + #33F48D9F + #F48D9F + #e7d27c + diff --git a/app/src/hexalud/res/values/ic_launcher_background.xml b/app/src/hexalud/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..145f446 --- /dev/null +++ b/app/src/hexalud/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FDFDFE + \ No newline at end of file diff --git a/app/src/hexalud/res/values/strings.xml b/app/src/hexalud/res/values/strings.xml new file mode 100644 index 0000000..7e40969 --- /dev/null +++ b/app/src/hexalud/res/values/strings.xml @@ -0,0 +1,285 @@ + + Hexalud Expert + + + 137024514882030 + fb137024514882030 + + + hexalud.page.link + com.hexalud.user + + + + + + AIzaSyCBNV9wVtN32IeE1xzo1In45t4fePJGvBs + 115504612011-72l19995tb28l6t44mkeu05rame3305r.apps.googleusercontent.com + + You have new update for %s! + Create a %s\naccount to continue + + With Experts + Meet + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + Login + Facebook + Google + Login using Email + Sign Up using Email + Continue for %s + New user? + Sign Up + Let’s Get Started ! + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + Clients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Already Registered? + Edit + Age: + Enter Phone Number + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + No Slot available + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + Cancel + Available balance + Pay out + Add Money + Add + Please enter amount + Added to wallet + Add Card + Type your message… + Photo + Enter message + Today + Yesterday + Transaction History + Paid to\n%s + Refund from\n%s + Select card + New Request + Accepted + In progress + No show + Cancelled + %s Card ending with %s + NA + Write down your reviews + Submit + Please give Feedback + please select rating + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + years + Rating + %s · %s Reviews + Request completed + Insufficient amount + You need to maintain sufficient balance of %s to create request + Schedule Request + Request Now + Select date + Select time + + Search for %s + Profile + %s/%s + Set Filter + Choose date & time + Tomorrow + Clear All + Booking Details + Appointment date & timings + Confirm Booking + %s · %s + %s-%s + Add Coupon Code + Price Detail + Sub-Total + Total + Promo Applied + By Booking this appointment, you agree to\nthe terms & conditions + Schedule a meeting + Consult + Consult for %s \n at %s + Edit Slot + Sign Up with Phone Number + By continue, you agree to our\n + Terms of service + Terms Of Use + and + Privacy Policy + Already have an account? + Apply + Minute + Input amount + Pay + Cancel appointment + Re-Schedule + Consult a Doctor + %s ]]> + %s User Remaining ]]> + %s Discount on booking a %s till %s ]]> + Please add valid coupon + Are you sure you want to cancel appointment? + Transaction failed + Delete + Are you sure you want to delete this card? + Edit card + Rate + Morning + Evening + Afternoon + Book again + Connecting… + Disconnecting… + Transaction Success + Transaction Failed + + + No Category! + Categories will shown here once added. + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + Recharge your wallet to create booking! + Once you add money or any deduction will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No appointments history! + No Appointments scheduled. + No experts yet! + Currently not any expert registered under \'%s\', so come back later. + + + + Share + Checkout this post + Hey, Here is app for Online Consultancy Platform for Doctors, Physiotherapists, Accountants, Lawyers, Consultants etc. You should try it. + Payment + Address + + View all + View Prescription + All + Details + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login With + + + Consult Online + Home Care Appointment + Clinic Appointment + + + Estimate Time of Arrival : %s + Status : + On the way + Reached Destination + Arrived + Started + Completed + Track Status + Quit + Are you sure you want to quit? It will stop your tracking + We will need your call permission to give you better experience + Service completed + Give Feedback + Cancelled Service + + + Language + Please choose your language + English + عربى + Account Setting + + + Request Sent successfully! + Your password changed successfully! + Patient added successfully! + + + View map + Google map application not found + Distance + Date + Time + Service Type + + Slide To Cancel + View Details + Price + Prescription detail + Downloading… + Completing your payment\nPlease wait… + Address for %s + Tax + diff --git a/app/src/homeDoctor/google-services.json b/app/src/homeDoctor/google-services.json new file mode 100644 index 0000000..dc2de92 --- /dev/null +++ b/app/src/homeDoctor/google-services.json @@ -0,0 +1,85 @@ +{ + "project_info": { + "project_number": "226777979953", + "firebase_url": "https://home-doctor-54468.firebaseio.com", + "project_id": "home-doctor-54468", + "storage_bucket": "home-doctor-54468.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:226777979953:android:d9cea3c28b968cd5f40910", + "android_client_info": { + "package_name": "com.homeDoctor.expert" + } + }, + "oauth_client": [ + { + "client_id": "226777979953-1btcgm53odl932dj8ue76fg6s6bjf1mf.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.homeDoctor.expert", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDCVqemLb263wtS1eU2qiueV5AP9ME0F_A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + }, + { + "client_info": { + "mobilesdk_app_id": "1:226777979953:android:fc7df9e16ad5d8ddf40910", + "android_client_info": { + "package_name": "com.homeDoctor.user" + } + }, + "oauth_client": [ + { + "client_id": "226777979953-q1595mocupa9lsh66cbvs0hafmkj9kb7.apps.googleusercontent.com", + "client_type": 1, + "android_info": { + "package_name": "com.homeDoctor.user", + "certificate_hash": "3fee5aff71776031cbdc81d0b12cca08afa48d8a" + } + }, + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ], + "api_key": [ + { + "current_key": "AIzaSyDCVqemLb263wtS1eU2qiueV5AP9ME0F_A" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [ + { + "client_id": "226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com", + "client_type": 3 + } + ] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/homeDoctor/ic_launcher-playstore.png b/app/src/homeDoctor/ic_launcher-playstore.png new file mode 100644 index 0000000..b5ae070 Binary files /dev/null and b/app/src/homeDoctor/ic_launcher-playstore.png differ diff --git a/app/src/homeDoctor/res/drawable-hdpi/ic_push.png b/app/src/homeDoctor/res/drawable-hdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-hdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-hdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-hdpi/ic_splash.png new file mode 100644 index 0000000..602bfe3 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-hdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-mdpi/ic_push.png b/app/src/homeDoctor/res/drawable-mdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-mdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-mdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-mdpi/ic_splash.png new file mode 100644 index 0000000..42d3b58 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-mdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-xhdpi/ic_push.png b/app/src/homeDoctor/res/drawable-xhdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xhdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-xhdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-xhdpi/ic_splash.png new file mode 100644 index 0000000..70fc4c2 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xhdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-xxhdpi/ic_push.png b/app/src/homeDoctor/res/drawable-xxhdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxhdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-xxhdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-xxhdpi/ic_splash.png new file mode 100644 index 0000000..631caec Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxhdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable-xxxhdpi/ic_push.png b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_push.png new file mode 100644 index 0000000..40ac37e Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_push.png differ diff --git a/app/src/homeDoctor/res/drawable-xxxhdpi/ic_splash.png b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_splash.png new file mode 100644 index 0000000..abf9302 Binary files /dev/null and b/app/src/homeDoctor/res/drawable-xxxhdpi/ic_splash.png differ diff --git a/app/src/homeDoctor/res/drawable/ic_launcher_foreground.xml b/app/src/homeDoctor/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..7823215 --- /dev/null +++ b/app/src/homeDoctor/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,15 @@ + + + + + \ No newline at end of file diff --git a/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 0000000..036d09b --- /dev/null +++ b/app/src/homeDoctor/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000..6641b23 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..0a7d56f Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000..a6a914e Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000..19707eb Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..85bdf76 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000..8c4e9c7 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000..f3e7a06 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..5ca4389 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000..f4a6e68 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000..5b4ed39 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..e9a3f6e Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..ccffcc3 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000..a376bf1 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_foreground.png new file mode 100644 index 0000000..f6144f0 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ diff --git a/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 0000000..79b9fd1 Binary files /dev/null and b/app/src/homeDoctor/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/app/src/homeDoctor/res/values-ar/strings.xml b/app/src/homeDoctor/res/values-ar/strings.xml new file mode 100644 index 0000000..cf67ddd --- /dev/null +++ b/app/src/homeDoctor/res/values-ar/strings.xml @@ -0,0 +1,428 @@ + + Inhomed للخبراء + + لديك تحديث جديد لخبراء %s! + %sفضلاً إنشاء حساب للمتابعة + + سماح + رفض + إعدادات + تحتاج هذه الميزة إلى إذن لاستخدام الكاميرا. + تحتاج هذه الميزة إلى إذن لاستخدام مكبر الصوت. + + الإنترنت + الرجاء التحقق من اتصال الانترنت الخاص بك + حسناً + تنبيه + + تسجيل الدخول + فيسبوك + جوجل + تسجيل الدخول باستخدام البريد الإلكتروني + سجل باستخدام البريد الإلكتروني + سجل + أدخل رقم الجوال + نحتاج إلى رقم الجوال للتعرف عليك. + تم إرسال الرمز إلى %s + أعد إرسال الرمز + لم يصلك الرمز بعد؟ + التحقق + لقد أرسلنا لك رمزًا إلى %s + الرجاء إدخال otp + موقعك + المحادثات + العملاء + تجربة + المراجعات + حول + + الصفحة الرئيسية + السجل + التنبيهات + تسجيل خروج + الأحكام والشروط + شارك مع أصدقائك + الإصدار %s + أنت تقوم بتشغيل أحدث إصدار + تعيينات + اسم + البريد الإلكتروني + تاريخ الميلاد + كلمة المرور + السيرة الذاتية + تعديل + عرض + العمر: + رقم الجوال + تاريخ الميلاد + نحتاج إلى بريدك الإلكتروني و كلمة مرور للتعرف عليك. + ليس لديك حساب؟ + هل نسيت كلمة المرور + محفظة نقود + إيرادات + المكالمات + الرصيد المتوفر + طلب سحب رصيد + + الرجاء إدخال الاسم + الرجاء تحديد تاريخ الميلاد + الرجاء إدخال البريد الإلكتروني + الرجاء إدخال البريد الإلكتروني الصحيح + يجب ألا يقل طول كلمة المرور عن 8 أحرف + الرجاء إدخال السيرة الذاتية + + هل أنت متأكد من تسجيل الخروج? + نعم + لا + لاتوجد بيانات + %s مكتمل + %s لم يتم + اختر صورة + حدد الوثيقة + تحديث + نحتاج إلى بريدك الإلكتروني المسجل للوصول إليك + لقد أرسلنا كلمة مرور مؤقتة في بريدك الإلكتروني. تفقد بريدك الالكتروني من فضلك. + الجديدة + عدم الحضور + الملغاة + إلغاء + بدأ الطلب + طلب التحقق + هل أنت متأكد من متابعة الطلب + إضافة رصيد + يضاف إلى المحفظة + فشل الاجراء + قبول الطلب + هل أنت متأكد من قبول هذا الطلب + تأكيد اكتمال الخدمة + هل أنت متأكد من إكمال هذا الطلب + تمت الموافقة + جاري العمل + بدء مكالمة … + بدء محادثة + مستلم من\n%s + على + + الكتابة … + اليوم + أمس + أدخل رسالة + اكتب رسالتك… + مكتبة الصور + مرحبًا%s\n أنا متاح للدردشة ، فلنتحدث عن المشكلة + نهاية المحادثة + إنهاء \n الدردشة + سيتم إنهاء الدردشة ولايمكنك متابعة الدردشة بعد الآن + هنا هو الحساب المصرفي + التفاصيل البنكية + رقم الحساب بصيغة IBAN + اسم صاحب الحساب + اسم البنك + كود IFSC + اختر العملة + إضافة بنك + تحرير البنك + %s بطاقة تنتهي بـ %s + سنوات + إجمالي الإيرادات المحققة + اكتمل الطلب + عنوان + تفاصيل + + %s · %s المراجعات + إلى + يجب أن يكون وقت الانتهاء أكبر من وقت البدء + إدارة جدول الأوقات المتاحة + اختر تصنيف + أخبرنا عن الفئة التي تناسب ملفك الشخصي للمتابعة + حدد فئة فرعية + الاسم بالكامل + يعمل منذ + التالى + رسوم الاستشارة + إلى + إضافة أوقات متاحة + إضافة وقت متاح ل %s + نوع الخدمة + تعيين التفضيلات + من + + الفاصل الزمني الجديد + أ + ن + ث + ع + خ + ج + س + أيام الأسبوع + حدد الوقت + حفظ + سعر ثابت + أضف السعر بـ %s إلى %s + توفر التحرير + الرجاء تحديد أي خدمة + أضف سعرًا لـ %s + أضف السعر بـ %s إلى %s لـ %s + الرجاء تحديد العنوان + تحديث الفئة + إدارة التفضيلات + غداً + إلى %s + الكل %s + أيام الأسبوع + + + + @string/select_country + IN + US + + + + @string/select_currency + INR + USD + + + دكتور + سيد + سيدة + آنسة + + + @string/title + @string/dr + @string/mr + @string/mrs + @string/miss + + + الملف الشخصي + تاريخ المعاملات + الرجاء تحديد أيام العمل + هل لديك حساب؟ + بالمتابعة ، أنت توافق على\n + شروط الخدمة + و + سياسة الخصوصية + الدردشة عبر الإنترنت \n مع أفضل الأطباء + في %s20 + قم بالتسجيل باستخدام رقم الجوال + لنبدأ! + دقيقة + إلغاء التعيين + هل أنت متأكد من إلغاء الموعد؟ + الرجاء عدم إضافة فاصل زمني بين الفترات السابقة + جاري قطع الاتصال … + نجاح الصفقة + فشل الاجراء + + + ملفك الشخصي لم يتم الموافقة عليه بعد! + بمجرد الموافقة على ملفك الشخصي، ستبدأ في تلقي طلبات من المستخدمين + لا طلبات! + ليس لديك أي طلبات في الوقت الحالي. + لم تبدأ أي محادثة بعد! + بمجرد قبول طلبات الدردشة الخاصة بك و تبدأ المحادثة ، ستظهر المواضيع هنا. + لا يوجد سجل معاملات! + بمجرد إكمال بعض الطلبات بنجاح، ستظهر معاملاتك هنا. + لا إخطارات حتى الآن! + ستظهر هنا جميع الإخطارات المتعلقة بأنشطتك. + لم يتم العثور على تاريخ طبي! + كن أول طبيب يكتب عن هذا المريض. + + + + مشاركة + مرحباً، +تطبيق إنهوميد لتقديم الاستشارات عبر الإنترنت للأطباء وأخصائيي العلاج الطبيعي وما إلى ذلك، جربّه الآن. + تحرير البطاقة + حذف + دفع + المبلغ المدخل + اختر البطاقة + إضافة بطاقة + أدخل المبلغ + دفع + هل أنت متأكد من حذف هذه البطاقة؟ + الأموال المرسلة إلى الحساب المصرفي \n(%s) + + إرسال + أضف + تحميل المستندات + أضف من فضلك + إدارة المستندات + + + + موعد + + وصفة طبية + إضافة وصفة طبية يدوية + سجل التفاصيل + عنوان التسجيل + إضافة صور + إضافة وصفة طبية رقمية + ملاحظات الوصفة الطبية + إضافة ملاحظات + اسم الدواء + الوصفات الطبية + المدة الزمنية + نوع الجرعة + توقيت الجرعة + الوصفة الرقمية + الوصفة اليدوية + الفطور + "الجرعة " + قبل + بعد + مع + إعادة تعيين + الغداء + العشاء + سنة + حدد الجرعات لـ %s + حدد توقيت الجرعة + الوصفة المضافة + عرض الوصفة الطبية + مشاهدة الكل + الطلبات + تحميل إعلان + + + @string/select + يوم + يومان + 3 أيام + 4 أيام + 5 أيام + 6 أيام + 7 أيام + 8 أيام + 9 أيام + 10 أيام + 11 يوم + 12 يوم + 13 يوم + 14 يوم + 15 يوم + 16 يوم + 17 يوم + 18 يوم + 19 يوم + 10 يوم + 21 يوم + 22 يوم + 23 يوم + 24 يوم + 25 يوم + 26 يوم + 27 يوم + 28 يوم + 29 يوم + 30 يوم + + + اختر + حبوب + كبسولة + + @string/select + @string/tablet + @string/capsule + + + واحد + اثنان + ثلاثة + أربعة + + @string/select + @string/one + @string/two + @string/three + @string/four + + + + + تخطي حالياً + استخدم موقعي + سنحتاج إلى موقعك لنمنحك تجربة أفضل + السماح بمشاركة موقعك معنا + + + رفض + إجابة + تسجيل الدخول مع + + + سنحتاج إلى إذن الاتصال الخاص بك لمنحك تجربة أفضل + وصلت إلى الوجهة + الحالة: + بدء الخدمة + إلغاء الخدمة + تحديث حالة الخدمة + الحالة الحالية + تحديث الحالة + وصل + بدأت الخدمة + المكتملة + تغيير حالة الخدمة + قيد الانتظار + تحديث الحالة + واضح + تقدير وقت الوصول : %s + إنهاء + هل أنت متأكد من طلب الخروج؟ سيتوقف التتبع الخاص بك + اكتملت الخدمة + تتبع الحالة + الخدمة الملغاة + + تفاصيل + أكتب هنا… + أظهر المزيد + أظهر أقل + + + اللغة + فضلاً اختر اللغة + English + عربى + إعدادات الحساب + تغيير كلمة المرور + كلمة المرور القديمة + كلمة المرور الجديدة + تأكيد كلمة المرور الجديدة + + + نجاح! + تم تغيير كلمة المرور الخاصة بك بنجاح! + عرض الخريطة + المسافة + التاريخ + الوقت + تطبيق خرائط جوجل غير موجود + جميع الطلبات + PDF + الصوت + أعد المحاولة + + اسحب للإلغاء + عرض التفاصيل + السعر + تفاصيل الوصفة + عنوان %s + الرجاء تحديد العنوان لـ %s + طلب خدمة جديدة + خدمة إضافية + أدخل الوصف + المبلغ: %s + التاريخ الطبي + تاريخ الموعد: %s + اكتب شيئًا عن حالة المريض الطبية + حدد التاريخ + حدد الوقت + + سبب + سبب : %s + diff --git a/app/src/homeDoctor/res/values/colors.xml b/app/src/homeDoctor/res/values/colors.xml new file mode 100644 index 0000000..0dc0964 --- /dev/null +++ b/app/src/homeDoctor/res/values/colors.xml @@ -0,0 +1,9 @@ + + + #80325A + #80325A + #80325A + + #3880325A + #3380325A + diff --git a/app/src/homeDoctor/res/values/ic_launcher_background.xml b/app/src/homeDoctor/res/values/ic_launcher_background.xml new file mode 100644 index 0000000..000499d --- /dev/null +++ b/app/src/homeDoctor/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #E6E6E6 + \ No newline at end of file diff --git a/app/src/homeDoctor/res/values/strings.xml b/app/src/homeDoctor/res/values/strings.xml new file mode 100644 index 0000000..5c83f07 --- /dev/null +++ b/app/src/homeDoctor/res/values/strings.xml @@ -0,0 +1,448 @@ + + Inhomed For Experts + + + 1304056943287310 + fb1304056943287310 + + + inhomed.page.link + com.homeDoctorKhalid.Expert + + + AIzaSyDCVqemLb263wtS1eU2qiueV5AP9ME0F_A + 226777979953-u34tkmi6lss5m6np5206f60990570pgv.apps.googleusercontent.com + + You have new update for %s! + Create an account to continue%s + + ALLOW + Deny + Settings + This feature needs permission to use camera and external storage. + This feature needs permission to use record audio and external storage. + + Internet + Please check your internet connection + OK + Alert + + Login + Facebook + Google + Login using Email + Sign Up using Email + Sign Up + Enter phone number + We need your Phone number to identify you. + Code sent to %s + Resend code + Didn’t receive the code yet? + Verification + We sent you a code to %s + Please enter otp + Location + Chat + + Patients + Experience + Reviews + About + + Home + History + Notification + Logout + Terms and conditions + Invite People + Version %s + You are running the latest version + Appointments + Name + Email + Date of Birth + Password + Bio + Edit + View + Age: + Phone Number + DOB + We need your Email & Password to identify you. + Didn’t have an account? + Forgot Password + Wallet + Revenue + Calls + Available Balance + Pay-out + + Please enter name + Please select DOB + Please enter email + Please enter correct email + Password length must be atleast 8 characters + Please enter bio + + Are you sure you want to Logout? + Yes + No + No data found + %s Completed + %s Unsuccessful + Select image + Select document + Update + We need your registered email to reach you + We have sent a temporary password in your email. Please check your email. + New Request + No show + Cancelled + Cancel + Start request + Check request + Are you sure you want to proceed request + Add Money + Added to wallet + Transaction failed + Accept request + Are you sure you want to accept this request + Mark Complete + Are you sure you want to complete this request + accepted + In progress + Starting a call… + Starting a chat + Received from\n%s + NA + + Typing… + Today + Yesterday + Enter message + Type your message… + Photo + Hi %s\nI am Available for chat lets discuss the problem + End Chat + End\nChat + This will end chat. You ll no longer be able to chat + Here is the bank account + Bank details + IBAN + Account Holder name + Bank name + IFSC code + Select currency + Add Bank + Edit Bank + %s Card ending with %s + years + Total Revenue made + Request completed + Title + Description + + %s · %s Reviews + To + End time must be greater than start time + Manage Availability + Select a Category + Let us know which category suits your profile the most to continue + Select Sub-Category + Full Name + Since Working + Next + Consultation Fees + For + Add availability + Add availability for %s + Service Type + Set Preferences + From + + New Interval + S + M + T + W + T + F + S + Week Days + Select Availability + Save + Fixed Price + Add price in %s to %s + Edit availability + Please select any service + Add price for %s + Add price in %s to %s for %s + Please select Title + Update Category + Manage Preferences + Tomorrow + For %s + All %s + All Weekdays + + + + @string/select_country + IN + US + + + + @string/select_currency + INR + USD + + + Dr. + Mr. + Mrs. + Miss. + + + @string/title + @string/dr + @string/mr + @string/mrs + @string/miss + + + Profile + Transaction History + Please select working days + Already have an account? + By continue, you agree to our\n + Terms of service + and + Privacy Policy + Chat Online\nwith Top Doctors + At %s20 + Sign Up with Phone Number + Let’s Get Started ! + Minute + Cancel appointment + Are you sure you want to cancel appointment? + Please don\'t add interval in between of previous intervals + Disconnecting… + Transaction Success + Transaction Failed + + + Your profile has not yet been approved! + Once your profile has been approved, you ll start getting requests from users + No Requests! + You don\'t have any requests generated at the moment. + No chat started yet! + Once your chat requests are accepted & you start the conversation, the threads will appear here. + No transaction history! + Once you successfully complete some requests, your transactions will appear here. + No notifications yet! + All notifications related to your activities will appear here. + No medical history found! + Be the first doctor to write about this patient. + + + + Share + Hey, Here is app for taking Online Consultancy Platform for Doctors, Physiotherapists, Accountants, Lawyers, Consultants etc. You should try it. + Edit card + Delete + Pay + Input amount + Select card + Add card + Enter amount + Payment + Are you sure you want to delete this card? + Money sent to bank account\n(%s) + + Submit + Add + Upload Documents + Please add + Manage Documents + + + + Appointment + + Prescription + Add Manual Prescription + Record Details + Record title + Add Images + Add Digital Prescription + Prescription Notes + Add notes + Medicine Name + Prescriptions + Duration + Dosage Type + Dosage Timings + Digital Prescription + Manual Prescription + Breakfast + "Dosage " + Before + After + With + Reset + Lunch + Dinner + years old + Select doases for %s + Select dosage Timings + Prescription added + View prescription + View all + Requests + Upload Banner + + + @string/select + 1 day + 2 days + 3 days + 4 days + 5 days + 6 days + 7 days + 8 days + 9 days + 10 days + 11 days + 12 days + 13 days + 14 days + 15 days + 16 days + 17 days + 18 days + 19 days + 10 days + 21 days + 22 days + 23 days + 24 days + 25 days + 26 days + 27 days + 28 days + 29 days + 30 days + + + Select + Tablet + Capsule + + @string/select + @string/tablet + @string/capsule + + + One + Two + Three + Four + + @string/select + @string/one + @string/two + @string/three + @string/four + + + + + Skip For Now + Use My Location + We will need your location to give you better experience + Allow Your Location + + + Decline + Answer + Login with + + + We will need your call permission to give you better experience + Reached Destination + Status : + Start Service + Cancel Service + Service Status Update + Current Status + Status Update + Arrived + Started + Completed + Change Service Status + Pending + Update Status + Clear + Estimate Time of Arrival : %s + Quit + Are you sure you want to quit? It will stop your tracking + Service Completed + Track Status + Cancelled Service + + Details + Type here… + show more + show less + + + Language + Please choose your language + English + عربى + Account Setting + Change Password + Old Password + New Password + Confirm New Password + + + Success! + Your password changed successfully! + View map + Distance + Date + Time + Google map application not found + All Requests + Pdf + Audio + Retry + + Slide To Cancel + View Details + Price + Prescription detail + + Address for %s + Please select Address for %s + Add new services + Services + Enter Description + Amount: %s + Medical History + Appointment Date: %s + Write something about patient medical condition + Select date + Select time + + + @string/all_requests + @string/new_request + @string/completed + @string/canceled + + + Reason + Reason : %s + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..3c2394e --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,243 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/line_progress.json b/app/src/main/assets/line_progress.json new file mode 100644 index 0000000..b46c63c --- /dev/null +++ b/app/src/main/assets/line_progress.json @@ -0,0 +1 @@ +{"v":"5.6.3","fr":25,"ip":0,"op":75,"w":450,"h":5,"nm":"Refresh_btle","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Livello forma 1","sr":1.5,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-6.296,2.436,0],"to":[38.532,0,0],"ti":[-77.292,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[224.897,2.436,0],"to":[77.292,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37.5,"s":[457.454,2.436,0],"to":[0,0,0],"ti":[77.292,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":55.5,"s":[224.897,2.436,0],"to":[-77.292,0,0],"ti":[38.533,0,0]},{"t":73.5,"s":[-6.3,2.436,0]}],"ix":2},"a":{"a":0,"k":[-162.512,-0.375,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":18,"s":[225,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":37.5,"s":[50,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":55.5,"s":[225,100,100]},{"t":73.5,"s":[50,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[50,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Tracciato rettangolo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.21568627450980393,0.1843137254901961,0.5098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Traccia 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.21568627450980393,0.1843137254901961,0.5098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Riempimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-162.467,-0.311],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Rettangolo 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Livello forma 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[377.17,2.376,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[450,5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Tracciato rettangolo 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.21568627450980393,0.1843137254901961,0.5098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Traccia 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8156862745098039,0.9019607843137255,1,1],"ix":4},"o":{"a":0,"k":8,"ix":5},"r":1,"bm":0,"nm":"Riempimento 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-152.17,0.124],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Trasformazione"}],"nm":"Rettangolo 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":75,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/network_error.json b/app/src/main/assets/network_error.json new file mode 100644 index 0000000..a984809 --- /dev/null +++ b/app/src/main/assets/network_error.json @@ -0,0 +1 @@ +{"v":"5.1.1","fr":74,"ip":0,"op":193,"w":141,"h":112,"nm":"Comp 1","ddd":0,"assets":[],"fonts":{"list":[{"fName":"Lato-Bold","fFamily":"Lato","fStyle":"Bold","ascent":74.2996215820313}]},"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Layer 2/error2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[81.75,74,0],"ix":2},"a":{"a":0,"k":[2.5,40,0],"ix":1},"s":{"a":0,"k":[38.062,46.611,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.145,0],[0,-1.144]],"o":[[0,0],[0,0],[0,-1.144],[1.145,0],[0,0]],"v":[[2.073,39.624],[-2.073,39.624],[-2.073,-37.553],[0,-39.624],[2.073,-37.553]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[2.323,39.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":5,"nm":"Network Error","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[76.25,42,0],"ix":2},"a":{"a":0,"k":[46.5,-4,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":147,"s":[0,0,100],"e":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":152,"s":[105,105,100],"e":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p667_1_0p333_0","0p667_1_0p333_0","0p667_1_0p333_0"],"t":155,"s":[100,100,100],"e":[105,105,100]},{"t":157}],"ix":6}},"ao":0,"t":{"d":{"k":[{"s":{"s":13,"f":"Lato-Bold","t":"Network Error","j":0,"tr":0,"lh":15.6,"ls":0,"fc":[0.96,0.12,0.12]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0],"ix":2}},"a":[]},"ip":147,"op":194,"st":147,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Layer 1/error2 Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":81,"s":[0],"e":[-26]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":94,"s":[-26],"e":[26]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p833_1_0p333_0"],"t":106,"s":[26],"e":[319]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"n":["0p833_1_0p167_0"],"t":124,"s":[319],"e":[414]},{"t":147}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":107,"s":[82.25,47,0],"e":[96,78.5,0],"to":[2.29166674613953,5.25,0],"ti":[-4.375,-4.41666650772095,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":124,"s":[96,78.5,0],"e":[108.5,73.5,0],"to":[4.375,4.41666650772095,0],"ti":[-3.625,-1.41666662693024,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":137,"s":[108.5,73.5,0],"e":[117.75,87,0],"to":[3.625,1.41666662693024,0],"ti":[-1.54166662693024,-2.25,0]},{"t":147}],"ix":2},"a":{"a":0,"k":[29,25.5,0],"ix":1},"s":{"a":0,"k":[35.293,35.293,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.037,-8.539],[0.54,8.538],[-0.541,8.538],[-1.038,-8.539]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.23,-0.237],[-0.009,-0.329],[0,0],[-0.669,0],[0,0],[-0.02,0.669],[0,0],[0.23,0.236],[0.33,0],[0,0]],"o":[[-0.23,0.236],[0,0],[0.02,0.668],[0,0],[0.669,0],[0,0],[0.01,-0.329],[-0.23,-0.237],[0,0],[-0.33,0]],"v":[[-2.317,-9.781],[-2.664,-8.892],[-2.145,8.962],[-0.917,10.154],[0.916,10.154],[2.144,8.962],[2.663,-8.892],[2.316,-9.781],[1.436,-10.154],[-1.436,-10.154]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,26.116],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.1,0],[0,0],[0,0.946],[-0.877,0],[0,-0.992]],"o":[[0,0],[-0.854,0],[0,-0.947],[0.919,0],[0,0.741]],"v":[[0,1.607],[-0.04,1.607],[-1.49,0.001],[0,-1.607],[1.49,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[1.828,0],[0,-1.837],[-1.748,0],[0,0],[0,1.867]],"o":[[-1.771,0],[0,1.836],[0,0],[1.799,0],[0,-1.898]],"v":[[0,-3.222],[-3.105,0.001],[-0.04,3.222],[0,3.222],[3.105,0.001]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,40.443],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.034,-0.061],[0.017,0],[0,0],[0.034,0.06],[-0.009,0.015],[0,0],[-0.069,0],[-0.008,-0.014],[0,0]],"o":[[-0.035,0.06],[0,0],[-0.017,0],[-0.035,-0.061],[0,0],[0.009,-0.014],[0.07,0],[0,0],[0.009,0.015]],"v":[[20.035,17.319],[19.931,17.379],[-19.93,17.379],[-20.034,17.319],[-20.034,17.199],[-0.104,-17.319],[0,-17.378],[0.104,-17.319],[20.035,17.199]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.628,0],[0.314,-0.544],[0,0],[-0.314,-0.544],[-0.628,0],[0,0],[-0.313,0.543],[0.314,0.543],[0,0]],"o":[[-0.627,0],[0,0],[-0.314,0.543],[0.314,0.543],[0,0],[0.626,0],[0.314,-0.544],[0,0],[-0.314,-0.543]],"v":[[0,-18.994],[-1.503,-18.125],[-21.433,16.391],[-21.433,18.127],[-19.93,18.994],[19.931,18.994],[21.433,18.127],[21.433,16.391],[1.503,-18.126]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.702,26.987],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.386,-0.224],[-0.223,0.387],[0,0],[-0.07,0],[-0.008,-0.015],[0,0],[-0.28,0],[-0.127,0.073],[0.222,0.387],[0,0],[0.628,0],[0.314,-0.544],[0,0]],"o":[[0.386,0.223],[0,0],[0.008,-0.014],[0.07,0],[0,0],[0.15,0.26],[0.136,0],[0.387,-0.223],[0,0],[-0.314,-0.544],[-0.627,0],[0,0],[-0.224,0.387]],"v":[[-15.91,13.605],[-14.807,13.309],[-0.105,-12.152],[-0.001,-12.212],[0.104,-12.152],[14.807,13.312],[15.508,13.716],[15.911,13.608],[16.206,12.504],[1.503,-12.959],[-0.001,-13.828],[-1.504,-12.959],[-16.204,12.501]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,14.078],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.313,0.543],[0,0],[0.387,-0.222],[-0.224,-0.387],[0,0],[0.034,-0.06],[0.018,0],[0,0],[0.035,0.06],[-0.009,0.014],[0,0],[0.386,0.223],[0.223,-0.386],[0,0],[-0.313,-0.543],[-0.628,0],[0,0],[-0.313,0.544]],"o":[[0,0],[-0.223,-0.386],[-0.386,0.224],[0,0],[0.007,0.014],[-0.036,0.06],[0,0],[-0.017,0],[-0.035,-0.06],[0,0],[0.224,-0.386],[-0.386,-0.223],[0,0],[-0.313,0.543],[0.314,0.544],[0,0],[0.628,0],[0.313,-0.543]],"v":[[28.139,7.882],[17.833,-9.967],[16.73,-10.264],[16.436,-9.16],[26.742,8.689],[26.742,8.809],[26.636,8.87],[-26.637,8.87],[-26.74,8.809],[-26.74,8.689],[-16.441,-9.148],[-16.736,-10.251],[-17.839,-9.956],[-28.139,7.882],[-28.139,9.617],[-26.635,10.486],[26.636,10.486],[28.139,9.617]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,39.368],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.007,-0.236],[0,0],[0.228,0],[0,0],[0.006,0.228],[0,0],[-0.237,0]],"o":[[0.236,0],[0,0],[-0.007,0.228],[0,0],[-0.228,0],[0,0],[-0.007,-0.236],[0,0]],"v":[[1.436,-9.346],[1.856,-8.914],[1.337,8.938],[0.916,9.346],[-0.917,9.346],[-1.337,8.938],[-1.856,-8.914],[-1.436,-9.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,26.116],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.325,0],[0,-1.402],[1.402,0],[0,0],[0,1.362]],"o":[[1.402,0],[0,1.362],[0,0],[-1.323,0],[0,-1.402]],"v":[[0,-2.415],[2.298,0.001],[0,2.415],[-0.04,2.415],[-2.298,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,40.443],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.357,0.619],[0,0],[0.357,-0.618],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.358,-0.618],[0,0],[0,0],[0,0],[0.714,-0.001]],"v":[[11.125,16.871],[-8.805,-17.646],[-10.413,-17.646],[-11.482,-15.792],[8.241,18.264],[10.321,18.264]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[38.312,26.911],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.357,0.619],[0,0],[-0.357,-0.618],[0,0],[0.714,0],[0,0]],"o":[[0,0],[0.357,-0.618],[0,0],[0.357,0.619],[0,0],[-0.715,0]],"v":[[-20.734,16.871],[-0.804,-17.646],[0.803,-17.646],[20.734,16.871],[19.93,18.264],[-19.93,18.264]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.478,0.533,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,26.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.357,0.619],[0,0],[0.357,-0.618],[0,0],[0,0],[0,0]],"o":[[0,0],[-0.358,-0.618],[0,0],[0,0],[0,0],[0.714,0]],"v":[[14.426,22.678],[-12.21,-23.453],[-13.818,-23.453],[-14.783,-21.778],[11.689,24.071],[13.622,24.071]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.716,24.975],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.357,0.619],[0,0],[-0.357,-0.618],[0,0],[0.714,0],[0,0]],"o":[[0,0],[0.357,-0.618],[0,0],[0.357,0.619],[0,0],[-0.715,0]],"v":[[-27.44,22.678],[-0.804,-23.453],[0.803,-23.453],[27.44,22.678],[26.636,24.071],[-26.636,24.071]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.703,24.975],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"ix":11,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Layer 5/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[94.75,85.5,0],"ix":2},"a":{"a":0,"k":[12,6.5,0],"ix":1},"s":{"a":0,"k":[127.544,127.544,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.253,1.788],[4.333,1.723],[2.872,1.617],[-5.253,1.027],[0.05,-1.788],[5.077,1.378]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.773000021542,0.764999988032,0.791999966491,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.665,5.949],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.253,3.732],[4.333,3.667],[2.872,3.561],[-5.253,2.971],[-3.313,-2.133],[-3.004,-2.949],[-2.704,-3.732],[0.05,0.156],[5.077,3.322]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.532999973671,0.525,0.560999971278,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.665,4.005],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.549,1.607],[7.374,1.195],[2.346,-1.971],[-0.408,-5.859],[-0.426,-5.88],[-7.803,-3.622],[-8.195,-1.245],[-8.475,0.452],[-9.146,4.503],[-9.262,5.193],[-9.376,5.88],[9.376,5.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.670999983245,0.666999966491,0.689999988032,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.369,6.131],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[3.115,-3.643],[-1.07,-1.469],[-3.115,3.643],[2.984,3.643]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.470999983245,0.46699999641,0.497999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[3.364,8.369],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Layer 4/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[1800]},{"t":81}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[-14.5,84,0],"e":[73.75,83.25,0],"to":[14.7083330154419,-0.125,0],"ti":[-14.7083330154419,0.125,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"n":"0p667_0p667_0p333_0p333","t":81,"s":[73.75,83.25,0],"e":[73.75,83.25,0],"to":[0,0,0],"ti":[0,0,0]},{"t":92}],"ix":2},"a":{"a":0,"k":[13.5,13.5,0],"ix":1},"s":{"a":0,"k":[68.362,68.362,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.149,0],[0,-7.152],[-7.152,0],[-2.224,1.795],[0,0],[2.516,0],[0,6.02],[-6.023,0],[0,-6.024],[1.701,-1.925],[0,0],[0,3.328]],"o":[[-7.152,0],[0,7.149],[3.078,0],[0,0],[-1.849,1.433],[-6.023,0],[0,-6.024],[6.021,0],[0,2.765],[0,0],[2.067,-2.295],[0,-7.152]],"v":[[0.002,-12.947],[-12.947,0.001],[0.002,12.947],[8.13,10.077],[6.687,8.633],[0.002,10.924],[-10.924,0.001],[0.002,-10.921],[10.923,0.001],[8.189,7.221],[9.624,8.658],[12.947,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,0.647058823529,0.105882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.196,13.196],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.427,0.022],[0.022,-0.426],[1.04,-0.906],[1.785,0.153],[0.036,-0.426],[-0.427,-0.036],[-0.28,0],[-1.214,1.055],[-0.114,2.16]],"o":[[-0.437,-0.023],[-0.092,1.731],[-1.074,0.933],[-0.438,-0.049],[-0.037,0.427],[0.291,0.027],[1.851,0],[1.365,-1.188],[0.023,-0.426]],"v":[[3.519,-3.755],[2.705,-3.023],[0.975,1.007],[-3.398,2.197],[-4.236,2.902],[-3.531,3.74],[-2.675,3.777],[1.99,2.176],[4.25,-2.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117647059,0.447058823529,0.094117647059,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.519,17.092],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Layer 6/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":0,"s":[0],"e":[1800]},{"t":81}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[-42.75,84.5,0],"e":[51.5,83.75,0],"to":[15.7083330154419,-0.125,0],"ti":[-15.75,0.75000107288361,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":81,"s":[51.5,83.75,0],"e":[51.75,80,0],"to":[3.14999581974007e-10,-1.50000012411056e-11,0],"ti":[-0.04166666790843,-0.04166666790843,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":88,"s":[51.75,80,0],"e":[51.75,84,0],"to":[0.04166666790843,0.04166666790843,0],"ti":[0,-0.66666668653488,0]},{"t":98}],"ix":2},"a":{"a":0,"k":[13.5,13.5,0],"ix":1},"s":{"a":0,"k":[68.362,68.362,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.073,0.933],[0.091,1.73],[0.412,-0.024],[-0.023,-0.427],[-1.364,-1.188],[-1.851,0],[-0.291,0.027],[0.038,0.426],[0.428,-0.048]],"o":[[-1.04,-0.905],[-0.022,-0.427],[-0.428,0.023],[0.113,2.159],[1.215,1.056],[0.28,0],[0.427,-0.036],[-0.037,-0.426],[-1.788,0.154]],"v":[[-0.974,1.007],[-2.703,-3.021],[-3.517,-3.754],[-4.25,-2.939],[-1.991,2.176],[2.675,3.778],[3.531,3.74],[4.235,2.903],[3.398,2.198]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.694117647059,0.447533760819,0.095271046956,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.931,17.091],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.149,0],[2.261,-1.926],[0,0],[-2.64,0],[0,-6.024],[6.023,0],[0,6.02],[-1.568,1.89],[0,0],[0,-3.209],[-7.149,0],[0,7.149]],"o":[[-3.2,0],[0,0],[1.891,-1.562],[6.023,0],[0,6.02],[-6.023,0],[0,-2.645],[0,0],[-1.932,2.261],[0,7.149],[7.149,0],[0,-7.152]],"v":[[0,-12.947],[-8.392,-9.859],[-6.952,-8.419],[0,-10.921],[10.922,0.001],[0,10.924],[-10.922,0.001],[-8.409,-6.962],[-9.849,-8.402],[-12.948,0.001],[0,12.947],[12.948,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,0.647751393038,0.105051900826,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.198,13.196],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Layer 2/erro Outlines","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":81,"s":[0],"e":[7]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":89,"s":[7],"e":[0]},{"t":98}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"n":"0p667_1_0p333_0","t":0,"s":[-28,74.25,0],"e":[63.693,73.5,0],"to":[13.6936912536621,0,0],"ti":[-18.0084609985352,0,0]},{"t":81}],"ix":2},"a":{"a":0,"k":[22,14,0],"ix":1},"s":{"a":0,"k":[68.362,68.362,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0.454],[-0.454,0],[0,0],[0,-0.455],[0.454,0],[0,0]],"o":[[0,-0.454],[0,0],[0.454,0],[0,0.454],[0,0],[-0.454,0]],"v":[[-19.628,-10.889],[-18.805,-11.713],[-10.779,-11.713],[-9.956,-10.889],[-10.779,-10.065],[-18.805,-10.065]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.023,-0.044],[0,0],[-0.442,0.221],[0.221,0.442],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.648,-0.875],[1.12,0],[0,-0.494],[-0.495,0],[-0.794,1.073],[0.04,0.131],[0.393,0],[0,0],[0.11,-0.384],[0,0],[0,0],[0,0],[0,0],[0,1.441],[1.442,0],[0,0],[0,-1.443],[-1.442,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.484,-0.097],[-0.059,0],[-0.084,0.425],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0.016,0.049],[0,0],[0.22,0.443],[0.442,-0.221],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.138,0.799],[-0.443,0.599],[-0.495,0],[0,0.494],[1.702,0],[1.5,-2.026],[-0.115,-0.376],[0,0],[-0.399,0],[0,0],[0,0],[0,0],[0,0],[1.441,0],[0,-1.442],[0,0],[-1.442,0],[0,1.441],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.097,0.485],[0.059,0.012],[0.418,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[10.684,3.214],[11.861,7.136],[11.917,7.278],[14.21,11.864],[15.411,12.265],[15.811,11.064],[13.553,6.548],[12.346,2.523],[11.833,0.807],[10.214,-4.59],[12.247,-11.713],[18.88,-11.713],[18.482,-8.663],[16.158,-7.772],[15.262,-6.877],[16.158,-5.982],[19.921,-7.598],[20.452,-12.871],[19.596,-13.505],[11.572,-13.505],[10.712,-12.856],[8.604,-5.481],[-12.971,-5.481],[-13.77,-8.276],[-10.781,-8.276],[-8.165,-10.89],[-10.781,-13.506],[-18.805,-13.506],[-21.421,-10.89],[-18.805,-8.276],[-15.633,-8.276],[-14.566,-4.548],[-15.548,0.357],[-15.898,2.114],[-17.962,12.435],[-17.262,13.488],[-17.085,13.506],[-16.208,12.786],[-14.145,2.467],[-13.792,0.712],[-12.911,-3.688],[8.615,-3.688],[10.165,1.481]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.992156862745,0.647058823529,0.105882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.671,13.756],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":194,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"N","size":13,"style":"Bold","w":75.6,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.6,0],[0,0],[0,0],[0,0],[0,0],[0.05,1.05],[0.1,1.067],[0,0],[-0.7,-0.333],[-1.067,0],[0,0],[0,0],[0,0],[0,0],[-0.05,-1.116],[-0.134,-1.166],[0,0],[0.3,0.284],[0.316,0.15],[0.4,0.05]],"o":[[0,0],[0,0],[0,0],[0,0],[0,-0.866],[-0.05,-1.05],[0,0],[0.666,0.867],[0.7,0.334],[0,0],[0,0],[0,0],[0,0],[0,0.967],[0.05,1.117],[0,0],[-0.367,-0.466],[-0.3,-0.283],[-0.317,-0.15],[-0.4,-0.05]],"v":[[14.35,-72.3],[7.3,-72.3],[7.3,0],[19.15,0],[19.15,-44.4],[19.075,-47.275],[18.85,-50.45],[56.65,-2.3],[58.7,-0.5],[61.35,0],[68.3,0],[68.3,-72.3],[56.45,-72.3],[56.45,-28.35],[56.525,-25.225],[56.8,-21.8],[18.85,-70.15],[17.85,-71.275],[16.925,-71.925],[15.85,-72.225]],"c":true},"ix":2},"nm":"N","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"N","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"e","size":13,"style":"Bold","w":53.45,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.05,-1.333],[2.116,-2.283],[1.133,-3.083],[0,-3.5],[-1.3,-3.416],[-2.267,-2.316],[-3.067,-1.183],[-3.567,0],[-1.917,0.266],[-1.85,0.65],[-1.7,1.084],[-1.367,1.6],[0,0],[0.366,0.2],[0.5,0],[0.816,-0.466],[1.083,-0.566],[1.45,-0.466],[2,0],[2.466,2.467],[0.366,5.267],[0,0],[-0.367,0.15],[-0.217,0.35],[-0.084,0.617],[0,0.934],[1.1,2.884],[1.966,1.984],[2.716,1.034],[3.233,0]],"o":[[-3.05,1.334],[-2.117,2.284],[-1.134,3.084],[0,4.5],[1.3,3.417],[2.266,2.317],[3.066,1.183],[1.8,0],[1.916,-0.267],[1.85,-0.65],[1.7,-1.083],[0,0],[-0.267,-0.366],[-0.367,-0.2],[-0.767,0],[-0.817,0.467],[-1.084,0.567],[-1.45,0.467],[-4.067,0],[-2.467,-2.466],[0,0],[0.566,0],[0.366,-0.15],[0.216,-0.35],[0.083,-0.616],[0,-3.7],[-1.1,-2.883],[-1.967,-1.983],[-2.717,-1.033],[-3.834,0]],"v":[[17.475,-50.1],[9.725,-44.675],[4.85,-36.625],[3.15,-26.75],[5.1,-14.875],[10.45,-6.275],[18.45,-1.025],[28.4,0.75],[33.975,0.35],[39.625,-1.025],[44.95,-3.625],[49.55,-7.65],[45.95,-12.15],[45,-13],[43.7,-13.3],[41.325,-12.6],[38.475,-11.05],[34.675,-9.5],[29.5,-8.8],[19.7,-12.5],[15.45,-24.1],[47.15,-24.1],[48.55,-24.325],[49.425,-25.075],[49.875,-26.525],[50,-28.85],[48.35,-38.725],[43.75,-46.025],[36.725,-50.55],[27.8,-52.1]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.367,-0.616],[-0.9,-1.066],[-0.434,-1.416],[0,-1.6],[0,0],[-2.034,2.034],[-3.6,0]],"o":[[1.366,0.617],[0.9,1.067],[0.433,1.417],[0,0],[0.566,-3.733],[2.033,-2.033],[1.833,0]],"v":[[32.85,-42.325],[36.25,-39.8],[38.25,-36.075],[38.9,-31.55],[15.7,-31.55],[19.6,-40.2],[28.05,-43.25]],"c":true},"ix":2},"nm":"e","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"e","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"t","size":13,"style":"Bold","w":38.7,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.334,0.766],[-1.8,1.5],[0,0],[0.233,0.184],[0.366,0],[0.3,-0.183],[0.383,-0.2],[0.516,-0.183],[0.766,0],[0.8,0.9],[0,1.6],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0.483,-0.366],[0.133,-0.666],[0,0],[0,0],[0,0],[-0.484,-0.433],[-0.667,0],[0,0],[0,0],[-2.4,-2.516],[-4.434,0]],"o":[[2.333,-0.766],[0,0],[-0.267,-0.366],[-0.234,-0.183],[-0.3,0],[-0.3,0.184],[-0.384,0.2],[-0.517,0.184],[-1.334,0],[-0.8,-0.9],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.734,0],[-0.484,0.367],[0,0],[0,0],[0,0],[0,0.867],[0.483,0.434],[0,0],[0,0],[0,4.434],[2.4,2.517],[2.5,0]],"v":[[30.7,-0.35],[36.9,-3.75],[33.2,-9.75],[32.45,-10.575],[31.55,-10.85],[30.65,-10.575],[29.625,-10],[28.275,-9.425],[26.35,-9.15],[23.15,-10.5],[21.95,-14.25],[21.95,-42.05],[35.45,-42.05],[35.45,-50.85],[21.95,-50.85],[21.95,-67],[15.55,-67],[13.725,-66.45],[12.8,-64.9],[10.2,-50.9],[1.95,-49.55],[1.95,-44.65],[2.675,-42.7],[4.4,-42.05],[9.6,-42.05],[9.6,-13.4],[13.2,-2.975],[23.45,0.8]],"c":true},"ix":2},"nm":"t","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"t","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"w","size":13,"style":"Bold","w":79.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.467,1.467],[0,0],[-0.234,0.984],[-0.2,1],[-0.25,-0.983],[-0.3,-0.966],[0,0],[-1.067,0],[0,0],[0,0],[0,0],[0.633,-0.433],[0.166,-0.666],[0,0],[0.283,-1.433],[0.233,-1.433],[0.35,1.35],[0.433,1.434],[0,0],[0.6,0.434],[0.9,0],[0,0],[0.6,-0.433],[0.2,-0.666],[0,0],[0.416,-1.433],[0.366,-1.433],[0.25,1.434],[0.4,1.5],[0,0],[0.633,0.434],[0.933,0],[0,0]],"o":[[0,0],[1.333,0],[0,0],[0.3,-1],[0.233,-0.983],[0.166,0.967],[0.25,0.984],[0,0],[0.466,1.467],[0,0],[0,0],[0,0],[-0.834,0],[-0.634,0.434],[0,0],[-0.434,1.534],[-0.284,1.434],[-0.334,-1.366],[-0.35,-1.35],[0,0],[-0.2,-0.666],[-0.6,-0.433],[0,0],[-0.8,0],[-0.6,0.434],[0,0],[-0.467,1.5],[-0.417,1.434],[-0.234,-1.433],[-0.25,-1.433],[0,0],[-0.167,-0.666],[-0.634,-0.433],[0,0],[0,0]],"v":[[16.6,0],[26.05,0],[28.75,-2.2],[38.1,-31.75],[38.9,-34.725],[39.55,-37.7],[40.175,-34.775],[41,-31.85],[50.25,-2.2],[52.55,0],[62.5,0],[78.75,-51.3],[69.4,-51.3],[67.2,-50.65],[66,-49],[58.4,-21.6],[57.325,-17.15],[56.55,-12.85],[55.525,-16.925],[54.35,-21.1],[45.95,-49.1],[44.75,-50.75],[42.5,-51.4],[37.05,-51.4],[34.95,-50.75],[33.75,-49.1],[25.25,-21.6],[23.925,-17.2],[22.75,-12.9],[22.025,-17.2],[21.05,-21.6],[13.7,-49],[12.5,-50.65],[10.15,-51.3],[0.35,-51.3]],"c":true},"ix":2},"nm":"w","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"w","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"o","size":13,"style":"Bold","w":56.85,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.133,-1.233],[2.216,-2.266],[1.216,-3.266],[0,-4.033],[-1.217,-3.266],[-2.217,-2.3],[-3.134,-1.233],[-3.834,0],[-3.117,1.233],[-2.2,2.3],[-1.2,3.267],[0,4.067],[1.2,3.267],[2.2,2.267],[3.116,1.234],[3.833,0]],"o":[[-3.134,1.234],[-2.217,2.267],[-1.217,3.267],[0,4.067],[1.216,3.267],[2.216,2.3],[3.133,1.233],[3.833,0],[3.116,-1.233],[2.2,-2.3],[1.2,-3.266],[0,-4.033],[-1.2,-3.266],[-2.2,-2.266],[-3.117,-1.233],[-3.834,0]],"v":[[18.05,-50.25],[10.025,-45],[4.875,-36.7],[3.05,-25.75],[4.875,-14.75],[10.025,-6.4],[18.05,-1.1],[28.5,0.75],[38.925,-1.1],[46.9,-6.4],[52,-14.75],[53.8,-25.75],[52,-36.7],[46.9,-45],[38.925,-50.25],[28.5,-52.1]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[2.066,2.884],[0,5.5],[-2.067,2.917],[-4.334,0],[-2.05,-2.9],[0,-5.533],[2.05,-2.866],[4.266,0]],"o":[[-2.067,-2.883],[0,-5.5],[2.066,-2.916],[4.266,0],[2.05,2.9],[0,5.534],[-2.05,2.867],[-4.334,0]],"v":[[18.9,-13.075],[15.8,-25.65],[18.9,-38.275],[28.5,-42.65],[37.975,-38.3],[41.05,-25.65],[37.975,-13.05],[28.5,-8.75]],"c":true},"ix":2},"nm":"o","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"o","np":5,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"r","size":13,"style":"Bold","w":40.85,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-1.834,1.417],[-2.567,0],[-0.867,-0.233],[-0.5,0],[-0.334,0.25],[-0.1,0.6],[0,0],[2.533,0],[2.466,-1.833],[1.833,-3.166],[0,0],[0.5,0.467],[1.266,0],[0,0],[0,0]],"o":[[0,0],[1.266,-2.733],[1.833,-1.416],[1.433,0],[0.866,0.234],[0.566,0],[0.333,-0.25],[0,0],[-1.667,-1.166],[-3.067,0],[-2.467,1.834],[0,0],[-0.167,-1.133],[-0.5,-0.466],[0,0],[0,0],[0,0]],"v":[[18.95,0],[18.95,-31.95],[23.6,-38.175],[30.2,-40.3],[33.65,-39.95],[35.7,-39.6],[37.05,-39.975],[37.7,-41.25],[39.3,-50.5],[33,-52.25],[24.7,-49.5],[18.25,-42],[17.5,-48.2],[16.5,-50.6],[13.85,-51.3],[6.6,-51.3],[6.6,0]],"c":true},"ix":2},"nm":"r","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"r","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":"k","size":13,"style":"Bold","w":55.15,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[-0.5,-0.233],[-0.5,-0.766],[0,0],[-0.667,-0.333],[-0.967,0],[0,0],[0,0],[0.533,0.667],[0.7,0.5],[-0.6,0.584],[-0.567,0.7],[0,0],[0,0],[0.633,-0.383],[0.566,-0.666],[0,0],[0.466,-0.233],[0.833,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[1,0],[0.5,0.234],[0,0],[0.533,0.8],[0.666,0.334],[0,0],[0,0],[-0.534,-0.766],[-0.534,-0.666],[0.7,-0.433],[0.6,-0.583],[0,0],[0,0],[-1.034,0],[-0.634,0.384],[0,0],[-0.534,0.634],[-0.467,0.234],[0,0],[0,0],[0,0]],"v":[[6.75,-74.3],[6.75,0],[19.1,0],[19.1,-23.5],[21.9,-23.5],[24.15,-23.15],[25.65,-21.65],[38.7,-2.2],[40.5,-0.5],[42.95,0],[54.1,0],[37,-24.9],[35.4,-27.05],[33.55,-28.8],[35.5,-30.325],[37.25,-32.25],[53.2,-51.3],[41.9,-51.3],[39.4,-50.725],[37.6,-49.15],[24.85,-33.4],[23.35,-32.1],[21.4,-31.75],[19.1,-31.75],[19.1,-74.3]],"c":true},"ix":2},"nm":"k","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"k","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"},{"ch":" ","size":13,"style":"Bold","w":19.3,"data":{},"fFamily":"Lato"},{"ch":"E","size":13,"style":"Bold","w":57.25,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[7.3,-72.3],[7.3,0],[52.9,0],[52.9,-10.75],[20.85,-10.75],[20.85,-31.2],[46.1,-31.2],[46.1,-41.55],[20.85,-41.55],[20.85,-61.6],[52.9,-61.6],[52.9,-72.3]],"c":true},"ix":2},"nm":"E","mn":"ADBE Vector Shape - Group","hd":false}],"nm":"E","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}]},"fFamily":"Lato"}]} \ No newline at end of file diff --git a/app/src/main/assets/pregnant_women.json b/app/src/main/assets/pregnant_women.json new file mode 100644 index 0000000..109cde5 --- /dev/null +++ b/app/src/main/assets/pregnant_women.json @@ -0,0 +1 @@ +{"v":"5.5.7","meta":{"g":"LottieFiles AE 0.1.14","a":"G. S. ","k":"embarazada","d":"embarazada feliz","tc":""},"fr":24,"ip":0,"op":48,"w":500,"h":500,"nm":"embarazada","ddd":0,"assets":[],"fonts":{"list":[{"fName":"Verdana","fFamily":"Verdana","fStyle":"Regular","ascent":75.9994506835938}]},"layers":[{"ddd":0,"ind":1,"ty":5,"nm":"Slider Control label","parent":3,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,23,0],"to":[0,0,0],"ti":[0,0,0]},{"t":47,"s":[0,23,0]}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[50,50,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[50,50,100]},{"t":47,"s":[50,50,100]}]}},"ao":0,"t":{"d":{"k":[{"s":{"s":50,"f":"Verdana","t":"Ojos","j":2,"tr":0,"lh":60,"ls":0,"fc":[0.886,0.243,0.243]},"t":0}]},"p":{},"m":{"g":1,"a":{"a":0,"k":[0,0]}},"a":[]},"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":1,"nm":"Slider Control","parent":3,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":9,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[-7.333]},"o":{"x":[0.167],"y":[-8.333]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.951]},"o":{"x":[0.167],"y":[0.083]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.798]},"o":{"x":[0.167],"y":[-0.119]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.142]},"t":14,"s":[58.73]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-4.894]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":33,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-8.333]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"y":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]}},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[37,75,0],"to":[0,0,0],"ti":[0,0,0]},{"t":47,"s":[37,75,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[100,100,100]},{"t":47,"s":[100,100,100]}]}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[62.5,50.5],[9.5,50.5],[37,76]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 1"},{"inv":false,"mode":"i","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[0,34],[0,75],[75,75],[75,34]],"c":true}},"o":{"a":0,"k":100},"x":{"a":0,"k":0},"nm":"Mask 2"}],"ef":[{"ty":5,"nm":"Slider Options","np":7,"mn":"Pseudo/fL3c11baf7UVr","ix":1,"en":1,"ef":[{"ty":7,"nm":"Orientation","mn":"Pseudo/fL3c11baf7UVr-0001","ix":1,"v":{"a":0,"k":0}},{"ty":0,"nm":"Slider Limit","mn":"Pseudo/fL3c11baf7UVr-0002","ix":2,"v":{"a":0,"k":100}},{"ty":7,"nm":"Slider Scale","mn":"Pseudo/fL3c11baf7UVr-0003","ix":3,"v":{"a":0,"k":36}},{"ty":0,"nm":"Arrow Size","mn":"Pseudo/fL3c11baf7UVr-0004","ix":4,"v":{"a":0,"k":100}},{"ty":7,"nm":"Negative Slider Values?","mn":"Pseudo/fL3c11baf7UVr-0005","ix":5,"v":{"a":0,"k":0}}]}],"sw":75,"sh":75,"sc":"#f81f1f","ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Slider Control Origin","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"p":{"a":0,"k":[694,66,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[72,72,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[72,72,100]},{"t":47,"s":[72,72,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[200,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[200,12]},{"t":47,"s":[200,12]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.386029980229,1,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,-5],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,-5]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,100]},{"t":47,"s":[100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Transform"}],"nm":"HitDetection","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,5.5],[0,-7.25]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,100]},{"t":47,"s":[100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Transform"}],"nm":"CenterLine","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[3,12]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[3,12]},{"t":47,"s":[3,12]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[100,-4.5],"to":[0,0],"ti":[0,0]},{"t":47,"s":[100,-4.5]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"OuterLine","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,4]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,4]},{"t":47,"s":[100,4]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"w":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0.386029561361,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[-50,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[-50,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[100,100]},{"t":47,"s":[100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"o":{"a":0,"k":100},"sk":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"sa":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"nm":"Transform"}],"nm":"BaseLine","bm":0,"hd":false},{"ty":"rp","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[1]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[1]},{"t":47,"s":[1]}]},"o":{"a":0,"k":0},"m":1,"tr":{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":1,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":2,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":3,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":4,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":5,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":6,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":7,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":8,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":9,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":10,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":11,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":12,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":13,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":14,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":15,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":16,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":17,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":18,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":19,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":20,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":21,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":22,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":23,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":27,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":28,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":29,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":31,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":32,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":33,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":34,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":35,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":36,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":37,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":38,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":39,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":40,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":41,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":42,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":43,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":44,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[0,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":46,"s":[0,0],"to":[0,0],"ti":[0,0]},{"t":47,"s":[0,0]}]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":0,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":1,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":2,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":3,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":4,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":5,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":6,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":7,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":8,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":9,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":10,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":11,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":12,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":13,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":14,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":15,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":16,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":17,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":18,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":19,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":20,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":21,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":22,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":23,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":24,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":25,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":26,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":27,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":28,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":29,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":30,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":31,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":32,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":33,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":34,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":35,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":36,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":37,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":38,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":39,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":40,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":41,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":42,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":43,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":44,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":45,"s":[-100,100]},{"i":{"x":[0.833,0.833],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":46,"s":[-100,100]},{"t":47,"s":[-100,100]}]},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":9,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]},"so":{"a":0,"k":100},"eo":{"a":0,"k":100},"nm":"Transform"},"nm":"Repeater 1","hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Ojos","hd":true,"sr":1,"ks":{"o":{"a":0,"k":0},"r":{"a":0,"k":0},"p":{"a":0,"k":[250,250,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Slider Control","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":2,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":4,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":5,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":6,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":7,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":8,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":9,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":10,"s":[100]},{"i":{"x":[0.833],"y":[-7.333]},"o":{"x":[0.167],"y":[-8.333]},"t":11,"s":[0]},{"i":{"x":[0.833],"y":[0.951]},"o":{"x":[0.167],"y":[0.083]},"t":12,"s":[0]},{"i":{"x":[0.833],"y":[0.798]},"o":{"x":[0.167],"y":[-0.119]},"t":13,"s":[100]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.142]},"t":14,"s":[58.73]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-4.894]},"t":15,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":16,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":17,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":18,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":19,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":20,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":21,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":22,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":23,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":24,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":25,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":27,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":28,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":30,"s":[0]},{"i":{"x":[0.833],"y":[-3.894]},"o":{"x":[0.167],"y":[0]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.858]},"o":{"x":[0.167],"y":[0.083]},"t":32,"s":[0]},{"i":{"x":[0.833],"y":[1.119]},"o":{"x":[0.167],"y":[0.202]},"t":33,"s":[58.73]},{"i":{"x":[0.833],"y":[0.917]},"o":{"x":[0.167],"y":[0.049]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[-8.333]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":36,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":38,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":39,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":46,"s":[0]},{"t":47,"s":[0]}]}}]}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":1,"nm":"Cabeza general","parent":6,"hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[24.723,34.612,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":21,"s":[101.701,110.047,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":28,"s":[101.701,110.047,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[24.723,34.612,0]}]},"a":{"a":0,"k":[37.5,37.5,0]},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":1,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":2,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":3,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":4,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":5,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":6,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":7,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":8,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":9,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":10,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":11,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":12,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":13,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":14,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":15,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":16,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":17,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":18,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":19,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":20,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":21,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":22,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":23,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":24,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":25,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":26,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":27,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":28,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":29,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":30,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":31,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":32,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":33,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":34,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":35,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":36,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":37,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":38,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":39,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":40,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":41,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":42,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":43,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":44,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":46,"s":[100,100,100]},{"t":47,"s":[100,100,100]}]}},"ao":0,"ef":[{"ty":5,"nm":"joystickLimit","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":200}}]}],"sw":75,"sh":75,"sc":"#f33333","ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Cabeza general Origin","hd":true,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[-150,90,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[16,16,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[251.383,200],"x":"var $bm_rt;\nvar temp;\ntemp = $bm_mul(thisComp.layer('Cabeza general')('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001'), 2);\n$bm_rt = [\n temp,\n temp\n];"},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.294117629528,0.310726553202,1,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":7},"lc":1,"lj":1,"ml":4,"bm":0,"d":[{"n":"d","nm":"dash","v":{"a":0,"k":14}},{"n":"o","nm":"offset","v":{"a":0,"k":0}}],"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"flequillo derecho Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[189.069,58.953,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 189.069198608398,\n 58.9526062011719,\n 0\n ];\n var key2 = [\n 194.069198608398,\n 58.9526062011719,\n 0\n ];\n var key3 = [\n 182.569198608398,\n 58.9526062011719,\n 0\n ];\n var key4 = [\n 189.069198608398,\n 60.9526062011719,\n 0\n ];\n var key5 = [\n 189.069198608398,\n 65.9526062011719,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[42.971,44.396,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[78.128,-7.349],[-77.616,-5.647]],"o":[[0,0],[0,0]],"v":[[-42.721,44.146],[42.721,-38.499]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[42.971,44.396]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"flequillo izquierdo Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[263.296,43.608,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 263.295791625977,\n 43.6083984375,\n 0\n ];\n var key2 = [\n 267.795776367188,\n 43.6083984375,\n 0\n ];\n var key3 = [\n 256.795776367188,\n 43.6083984375,\n 0\n ];\n var key4 = [\n 263.295776367188,\n 45.6083984375,\n 0\n ];\n var key5 = [\n 270.295776367188,\n 53.6083984375,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[52.389,44.001,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-79.107,-11.615],[104.278,-17.596]],"o":[[0,0],[0,0]],"v":[[50.172,43.679],[-52.139,-26.226]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[52.389,44.072]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"ceja derecha Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[212.448,82.662,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 212.448196411133,\n 82.6616058349609,\n 0\n ];\n var key2 = [\n 217.948196411133,\n 82.6616058349609,\n 0\n ];\n var key3 = [\n 206.948196411133,\n 82.6616058349609,\n 0\n ];\n var key4 = [\n 212.448196411133,\n 79.6616058349609,\n 0\n ];\n var key5 = [\n 212.448196411133,\n 94.6616058349609,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[7.879,3.44,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[1.291,-1.544],[0,0],[-2.882,0.224],[-2.19,-1.944],[0,0],[1.958,-0.163]],"o":[[0,0],[1.885,-2.26],[2.887,-0.236],[0,0],[-1.499,-1.331],[-1.972,0.154]],"v":[[-5.038,3.19],[-7.629,0.893],[-0.238,-2.954],[7.629,-0.288],[5.4,2.382],[0.02,0.557]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.368999974868,0.246999987434,0.216000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[7.878,3.441]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"ceja izquierda Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[260.277,82.108,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 260.277297973633,\n 82.1076049804688,\n 0\n ];\n var key2 = [\n 265.277282714844,\n 82.1076049804688,\n 0\n ];\n var key3 = [\n 254.777282714844,\n 82.1076049804688,\n 0\n ];\n var key4 = [\n 260.277282714844,\n 79.1076049804688,\n 0\n ];\n var key5 = [\n 260.277282714844,\n 94.1076049804688,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[7.879,3.994,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.665,-3.195],[0,0],[-4.521,-4.011],[0,0]],"o":[[0,0],[3.896,-4.663],[0,0],[-3.091,-2.742]],"v":[[-5.038,3.744],[-7.629,1.447],[7.629,0.266],[5.4,2.936]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.368999974868,0.246999987434,0.216000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[7.879,3.995]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"ojo izquierdo Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[260.37,99.467,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 260.369598388672,\n 99.4673004150391,\n 0\n ];\n var key2 = [\n 265.369598388672,\n 99.4673004150391,\n 0\n ];\n var key3 = [\n 254.869598388672,\n 99.4673004150391,\n 0\n ];\n var key4 = [\n 260.369598388672,\n 91.4673004150391,\n 0\n ];\n var key5 = [\n 260.369598388672,\n 112.467300415039,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[3.773,3.881,0]},"s":{"a":0,"k":[100,100,100],"x":"var $bm_rt;\nfunction slider(inputValue) {\n var contrl = thisComp.layer('Ojos');\n var contrlCurVal1 = contrl('ADBE Effect Parade')(1)('ADBE Slider Control-0001');\n var k1 = [\n 100,\n 100,\n 100\n ];\n var k2 = [\n 100,\n 20,\n 100\n ];\n k1 = unArray(k1);\n k2 = unArray(k2);\n if (contrlCurVal1 > 0) {\n var resultAdd1 = linear(contrlCurVal1, 0, 100, k1, k2);\n } else if (contrlCurVal1 < 0) {\n var resultAdd1 = $bm_sum(k1, $bm_sum($bm_neg(linear($bm_neg(contrlCurVal1), 0, 100, k1, k2)), k1));\n } else {\n var resultAdd1 = k1;\n }\n var myResult = $bm_sum(resultAdd1, $bm_sub(inputValue, k1));\n return myResult;\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\n$bm_rt = slider(value);"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.004],[1.945,0],[0,2.008],[-1.944,0]],"o":[[0,2.008],[-1.944,0],[0,-2.004],[1.945,0]],"v":[[3.523,-0.002],[-0.001,3.631],[-3.523,-0.002],[-0.001,-3.631]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.250999989229,0.258999992819,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[3.773,3.881]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"ojo derecho Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[212.537,99.467,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 212.537002563477,\n 99.4673004150391,\n 0\n ];\n var key2 = [\n 218.537002563477,\n 99.4673004150391,\n 0\n ];\n var key3 = [\n 207.037002563477,\n 99.4673004150391,\n 0\n ];\n var key4 = [\n 212.537002563477,\n 91.4673004150391,\n 0\n ];\n var key5 = [\n 212.537002563477,\n 112.467300415039,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[3.774,3.881,0]},"s":{"a":0,"k":[100,100,100],"x":"var $bm_rt;\nfunction slider(inputValue) {\n var contrl = thisComp.layer('Ojos');\n var contrlCurVal1 = contrl('ADBE Effect Parade')(1)('ADBE Slider Control-0001');\n var k1 = [\n 100,\n 100,\n 100\n ];\n var k2 = [\n 100,\n 20,\n 100\n ];\n k1 = unArray(k1);\n k2 = unArray(k2);\n if (contrlCurVal1 > 0) {\n var resultAdd1 = linear(contrlCurVal1, 0, 100, k1, k2);\n } else if (contrlCurVal1 < 0) {\n var resultAdd1 = $bm_sum(k1, $bm_sum($bm_neg(linear($bm_neg(contrlCurVal1), 0, 100, k1, k2)), k1));\n } else {\n var resultAdd1 = k1;\n }\n var myResult = $bm_sum(resultAdd1, $bm_sub(inputValue, k1));\n return myResult;\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\n$bm_rt = slider(value);"}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,-2.004],[1.944,0],[0,2.008],[-1.946,0]],"o":[[0,2.008],[-1.946,0],[0,-2.004],[1.944,0]],"v":[[3.524,-0.002],[0.002,3.631],[-3.524,-0.002],[0.002,-3.631]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.255000005984,0.250999989229,0.258999992819,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[3.774,3.881]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"nariz Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[239.024,110.175,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 239.024291992188,\n 110.175003051758,\n 0\n ];\n var key2 = [\n 247.524291992188,\n 110.175003051758,\n 0\n ];\n var key3 = [\n 232.524291992188,\n 110.175003051758,\n 0\n ];\n var key4 = [\n 239.024291992188,\n 103.175003051758,\n 0\n ];\n var key5 = [\n 239.024291992188,\n 124.175003051758,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[12.002,13.156,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[0.734,-12.906],[-11.752,12.787],[11.752,12.906]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.969000004787,0.725,0.642999985639,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[12.002,13.156]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"oreja derecha Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[170.751,119.25,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 170.750793457031,\n 119.249908447266,\n 0\n ];\n var key2 = [\n 168.250793457031,\n 119.249908447266,\n 0\n ];\n var key3 = [\n 175.250793457031,\n 119.249908447266,\n 0\n ];\n var key4 = [\n 170.750793457031,\n 127.249908447266,\n 0\n ];\n var key5 = [\n 170.750793457031,\n 108.249908447266,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[15.797,23.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[2.713,0],[0,-12.977],[-12.935,0],[-2.402,0.877]],"o":[[-2.402,-0.878],[-12.935,0],[0,12.981],[2.713,0],[0,0]],"v":[[15.548,-22.081],[7.873,-23.501],[-15.548,0.001],[7.873,23.501],[15.548,22.084]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[15.797,23.751]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"oreja izquierda Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[307.932,122.088,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 307.931793212891,\n 122.087905883789,\n 0\n ];\n var key2 = [\n 301.431793212891,\n 122.087905883789,\n 0\n ];\n var key3 = [\n 309.931793212891,\n 122.087905883789,\n 0\n ];\n var key4 = [\n 307.931793212891,\n 130.087905883789,\n 0\n ];\n var key5 = [\n 307.931793212891,\n 111.087905883789,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[15.798,23.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-2.713,0],[0,-12.977],[12.936,0],[2.402,0.877]],"o":[[2.402,-0.876],[12.936,0],[0,12.981],[-2.713,0],[0,0]],"v":[[-15.548,-22.083],[-7.874,-23.501],[15.548,-0.001],[-7.874,23.501],[-15.548,22.084]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[15.798,23.751]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"boca Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[239.086,139.172,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 239.085800170898,\n 139.171905517578,\n 0\n ];\n var key2 = [\n 246.585800170898,\n 139.171905517578,\n 0\n ];\n var key3 = [\n 234.085800170898,\n 139.171905517578,\n 0\n ];\n var key4 = [\n 239.085800170898,\n 132.171905517578,\n 0\n ];\n var key5 = [\n 239.085800170898,\n 150.171905517578,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[12.296,8.647,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.03,0],[0,4.029]],"o":[[0,4.029],[-4.029,0],[0,0]],"v":[[7.296,-3.648],[0,3.648],[-7.296,-3.648]],"c":false}},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.255000005984,0.250999989229,0.258999992819,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":2},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[12.296,8.648]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"cabeza y cuello Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[239.171,126.915,0]},"a":{"a":0,"k":[64.834,99.113,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0.16,7.644],[0.053,0.259],[0,0],[0.109,5.77],[-0.053,2.339],[11.726,11.692],[1.331,0.988],[14.554,-0.26],[0,0],[1.228,-0.1],[1.223,-0.158],[1.227,-0.208],[2.449,-0.572],[7.571,-11.229],[0.64,-6.029],[-0.427,-6.913],[-0.108,-3.275],[-0.215,-12.264],[-0.105,-0.83],[-6.237,-5.664],[-1.706,-1.194],[-10.738,-1.794],[5.313,-8.158],[-28.519,-0.939],[-0.894,-0.229],[5.512,12.198],[-8.342,7.784],[-1.066,1.193],[-0.908,1.301],[-1.117,2.441],[-0.587,1.764],[-0.32,1.247]],"o":[[0.053,-0.257],[0,0],[-0.161,-5.771],[-0.053,-2.39],[0.215,-15.019],[-1.17,-1.143],[-11.782,-9.096],[0,0],[-1.175,0],[-1.227,0.054],[-1.229,0.102],[-2.502,0.365],[-13.594,3.221],[-3.463,5.041],[-0.747,7.224],[0.213,3.274],[0.48,12.266],[0,0.834],[0.855,7.436],[1.439,1.349],[7.418,5.215],[-2.372,8.869],[-1.707,1.347],[29.979,0.986],[-8.563,-11.262],[11.296,-1.85],[1.172,-1.034],[1.066,-1.247],[1.707,-2.34],[0.855,-1.663],[0.425,-1.247],[1.865,-7.169]],"v":[[64.424,-12.225],[64.424,-12.949],[64.424,-15.186],[63.783,-32.546],[63.73,-39.613],[51.363,-83.686],[47.635,-86.908],[4.56,-98.603],[-5.568,-98.392],[-9.194,-98.24],[-12.87,-97.925],[-16.605,-97.458],[-24.065,-96.054],[-58.184,-74.849],[-63.836,-57.96],[-63.516,-36.287],[-63.089,-26.464],[-62.34,10.332],[-62.182,12.826],[-51.093,32.786],[-46.296,36.579],[-18.559,47.394],[-29.874,73.018],[7.211,97.877],[39.57,80.691],[18.332,47.34],[48.539,33.199],[51.844,29.875],[54.829,26.132],[59.038,18.96],[61.174,13.816],[62.292,10.071]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[64.833,99.113]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"brazo derecho Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[-2]},{"t":48,"s":[0]}]},"p":{"a":0,"k":[192.756,239.148,0]},"a":{"a":0,"k":[59.632,38.523,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-14.977,-4.45],[-0.26,2.091],[12.037,2.191],[3.135,-58.345]],"o":[[5.603,-33.679],[3.215,-25.747],[-31.912,32.593],[15.363,-0.972]],"v":[[7.299,106.676],[43.819,-49.238],[6.25,-106.676],[-47.034,103.349]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2784313725490196,0.47843137254901963,0.01568627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[47.284,106.927]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0.111,5.99],[0,0],[2.435,3.859],[0,0],[1.242,9.628],[-0.743,4.173],[15.673,-0.829],[0,0],[-14.312,-0.236],[-2.032,4.198],[0,0],[-2.364,3.305],[0,0],[-1.063,6.868]],"o":[[0,0],[-0.105,-5.997],[0,0],[-4.097,-6.497],[-36.279,-11.542],[-0.153,-1.187],[-15.223,-4.696],[-1.34,20.843],[31.404,37.659],[10.546,3.224],[2.294,-4.751],[0,0],[3.73,-5.207],[0,0],[1.068,-6.872]],"v":[[76.682,10.25],[111.014,6.947],[66.294,-0.801],[82.29,-18.337],[37.883,2.628],[-65.035,-30.418],[-64.077,-38.729],[-111.193,-45.156],[-112.915,-10.741],[34.324,29.215],[92.13,41.788],[73.285,29.059],[103.908,34.388],[75.337,19.882],[111.848,22.232]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.957000014361,0.859000052658,0.816000007181,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[114.098,250.811]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"mano izquierda Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[-5]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":24,"s":[0]},{"t":48,"s":[-5]}]},"p":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":0,"s":[381.729,384.367,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":24,"s":[380.729,391.367,0],"to":[0,0,0],"ti":[0,0,0]},{"t":48,"s":[381.729,384.367,0]}]},"a":{"a":0,"k":[25.233,26.15,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-7.979,-2.355],[-0.192,-2.323],[0.63,-4.109],[1.578,-3.18],[0.387,2.333],[-1.034,0.685],[0,0],[2.549,3.736],[-1.477,0.076],[0,0],[1.665,2.433],[-8.267,-0.923],[0,0],[2.493,3.654]],"o":[[0,0],[7.728,2.29],[0.357,4.427],[-0.633,4.11],[-2.325,4.662],[-0.256,-1.567],[1.091,-0.727],[0,0],[-2.551,-3.731],[1.478,-0.081],[0,0],[-1.661,-2.436],[4.632,0.521],[0,0],[-2.497,-3.651]],"v":[[-3.02,-24.137],[8.175,-21.766],[16.626,-5.657],[15.964,9.985],[13.12,19.738],[-11.142,19.281],[-10.287,15.452],[6.617,11.254],[-14.432,7.226],[-13.545,1.846],[7.696,-0.913],[-13.646,-6.691],[-6.09,-12.524],[7.679,-13.11],[-8.476,-20.749]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.952999997606,0.859000052658,0.819999964097,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[17.233,24.65]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"cuerpo Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[309.377,338.95,0]},"a":{"a":0,"k":[126.628,154.618,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[14.324,4.218],[4.752,-7.14],[-11.577,-5.987],[-3.207,16.317]],"o":[[-6.778,-1.996],[-9.891,10.723],[12.863,6.648],[2.852,-14.525]],"v":[[12.168,-18.058],[-17.98,-18.079],[-6.908,16.529],[25.02,8.902]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[225.134,35.803]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[5.79,1.705],[1.921,-2.889],[-4.681,-2.42],[-1.297,6.595]],"o":[[-2.74,-0.807],[-3.997,4.332],[5.199,2.687],[1.153,-5.872]],"v":[[4.919,-7.299],[-7.268,-7.305],[-2.792,6.682],[10.112,3.6]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[182.578,13.122]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[10.011,2.947],[3.321,-4.989],[-8.091,-4.185],[-2.241,11.402]],"o":[[-4.736,-1.395],[-6.912,7.492],[8.987,4.644],[1.995,-10.151]],"v":[[8.502,-12.619],[-12.565,-12.633],[-4.826,11.55],[17.482,6.22]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[184.662,45.194]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 3","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[33.143,12.414],[10.249,17.335],[0,0],[74.745,-16.293],[0,0],[7.045,-36.936],[-47.315,-7.313],[-8.19,0],[0,52.19]],"o":[[3.577,-16.024],[-15.923,-26.94],[0,0],[-3.658,0.8],[0,0],[0,0],[7.475,2.512],[45.877,0],[0,-41.865]],"v":[[38.84,-29.898],[33.235,-79.153],[0.379,-138.075],[-95.854,-138.075],[-98.671,-50.909],[-80.799,125.575],[-10.721,150.484],[26.502,154.369],[99.512,59.865]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.5490196078431373,0.803921568627451,0.2196078431372549,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[99.762,154.618]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 4","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-25.353,21.61],[-18.658,-26.627],[-29.32,-77.338]],"o":[[-28.306,7.334],[18.182,-15.498],[0,0],[0,0]],"v":[[72.669,96.012],[-48.567,-87.847],[0.007,-46.653],[73.92,90.194]],"c":false}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2784313725490196,0.47843137254901963,0.01568627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[132.309,107.265]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 5","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"pelo atras Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[228.732,106.669,0],"x":"var $bm_rt;\nfunction joystick(inputResult) {\n var slideR, slideL, slideU, slideD;\n var easeOverride_right = null;\n var easeOverride_left = null;\n var easeOverride_up = null;\n var easeOverride_down = null;\n var contrl = thisComp.layer('Cabeza general');\n var myLimit = contrl('ADBE Effect Parade')('joystickLimit')('ADBE Slider Control-0001');\n var contrlCurVal = contrl('ADBE Transform Group')('ADBE Position');\n var resultVal;\n var key1 = [\n 228.732452392578,\n 106.669204711914,\n 0\n ];\n var key2 = [\n 226.232452392578,\n 106.669204711914,\n 0\n ];\n var key3 = [\n 239.732452392578,\n 106.669204711914,\n 0\n ];\n var key4 = [\n 233.732452392578,\n 115.669204711914,\n 0\n ];\n var key5 = [\n 232.732452392578,\n 103.669204711914,\n 0\n ];\n key1 = unArray(key1);\n key2 = unArray(key2);\n key3 = unArray(key3);\n key4 = unArray(key4);\n key5 = unArray(key5);\n try {\n if (!thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB').active) {\n throw 'inactive';\n }\n slideR = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0001');\n slideL = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0002');\n slideU = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0003');\n slideD = thisLayer('ADBE Effect Parade')('Pseudo/1k48264d77gIB')('Pseudo/1k48264d77gIB-0004');\n } catch (err) {\n slideR = 0;\n slideL = 0;\n slideU = 0;\n slideD = 0;\n }\n if (easeOverride_right !== null && !isNaN(easeOverride_right)) {\n slideR = moClamp(easeOverride_right, -100, 100);\n }\n if (easeOverride_left !== null && !isNaN(easeOverride_left)) {\n slideL = moClamp(easeOverride_left, -100, 100);\n }\n if (easeOverride_up !== null && !isNaN(easeOverride_up)) {\n slideU = moClamp(easeOverride_up, -100, 100);\n }\n if (easeOverride_down !== null && !isNaN(easeOverride_down)) {\n slideD = moClamp(easeOverride_down, -100, 100);\n }\n var easeResultX, easeResultY;\n if (contrlCurVal[0] >= 0) {\n resultVal = linear(contrlCurVal[0], 0, myLimit, key1, key2);\n if (slideR !== 0) {\n easeResultX = easeSwitch(contrlCurVal[0], 0, myLimit, key1, key2, slideR);\n resultVal = linear(Math.abs(slideR), 0, 100, resultVal, easeResultX);\n }\n } else {\n resultVal = linear($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3);\n if (slideL !== 0) {\n easeResultX = easeSwitch($bm_neg(contrlCurVal[0]), 0, myLimit, key1, key3, slideL);\n resultVal = linear(Math.abs(slideL), 0, 100, resultVal, easeResultX);\n }\n }\n var resultAdd = 0;\n if (contrlCurVal[1] <= 0) {\n resultAdd = $bm_sub(linear($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4), key1);\n if (slideU !== 0) {\n easeResultY = $bm_sub(easeSwitch($bm_neg(contrlCurVal[1]), 0, myLimit, key1, key4, slideU), key1);\n resultAdd = linear(Math.abs(slideU), 0, 100, resultAdd, easeResultY);\n }\n } else {\n resultAdd = $bm_sub(linear(contrlCurVal[1], 0, myLimit, key1, key5), key1);\n if (slideD !== 0) {\n easeResultY = $bm_sub(easeSwitch(contrlCurVal[1], 0, myLimit, key1, key5, slideD), key1);\n resultAdd = linear(Math.abs(slideD), 0, 100, resultAdd, easeResultY);\n }\n }\n return $bm_sum($bm_sum(resultVal, resultAdd), $bm_sub(inputResult, key1));\n}\nfunction cosEase(val, min1, max1, input1, input2) {\n var myCos = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n myCos.push(getMeCos(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n myCos = getMeCos(val, min1, max1, input1, input2);\n }\n return myCos;\n function getMeCos(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var myCos2 = $bm_sum($bm_sum($bm_mul($bm_neg(c), Math.cos($bm_mul(mapVal, $bm_div(Math.PI, 2)))), c), input1);\n return myCos2;\n }\n}\nfunction sinEase(val, min1, max1, input1, input2) {\n var mySin = [];\n if ($bm_isInstanceOfArray(input1)) {\n for (var x = 0; x < input1.length; x++) {\n mySin.push(getMeSin(val, min1, max1, input1[x], input2[x]));\n }\n } else {\n mySin = getMeSin(val, min1, max1, input1, input2);\n }\n return mySin;\n function getMeSin(val, min1, max1, input1, input2) {\n var mapVal = moClamp($bm_div(val, $bm_sub(max1, min1)), 0, 1);\n var c = $bm_sub(input2, input1);\n var mySin2 = $bm_sum($bm_mul(c, Math.sin($bm_mul(mapVal, $bm_div(Math.PI, 2)))), input1);\n return mySin2;\n }\n}\nfunction easeSwitch(val, min1, max1, input1, input2, morph) {\n if (morph < 0) {\n return cosEase(val, min1, max1, input1, input2);\n } else {\n return sinEase(val, min1, max1, input1, input2);\n }\n}\nfunction unArray(inKey) {\n if (inKey instanceof Array && inKey.length === 1) {\n return inKey[0];\n } else {\n return inKey;\n }\n}\nfunction moClamp(a, b, c) {\n if (!(a instanceof Array)) {\n return Math.max(b, Math.min(c, a));\n } else {\n var aryHold = [];\n for (var x = 0; x < a.length; x++) {\n aryHold.push(Math.max(b, Math.min(c, a[x])));\n }\n return aryHold;\n }\n}\n$bm_rt = joystick(value);"},"a":{"a":0,"k":[129.324,110.681,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[17.186,-14.438],[2.262,-34.475],[0,0],[0,0],[0,0],[-11.846,1.499],[49.594,87.514]],"o":[[0,0],[-2.259,34.48],[0,0],[0,0],[0,0],[11.849,-1.499],[-23.356,-41.218]],"v":[[-68.865,-93.001],[-31.399,-14.519],[-57.696,61.439],[-57.696,78.748],[-56.284,94.243],[16.343,105.939],[19.271,-61.303]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[189.534,113.672]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-36.116,-17.336],[-2.262,-34.475],[0,0],[0,0],[0,0],[11.845,1.499],[-49.594,87.514]],"o":[[0,0],[2.259,34.48],[0,0],[0,0],[0,0],[-11.848,-1.499],[23.356,-41.218]],"v":[[84.124,-94.975],[16.14,-13.408],[42.437,62.551],[42.437,84.722],[41.026,95.354],[-31.602,107.051],[-34.53,-60.192]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.356999984442,0.301999978458,0.289999988032,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[84.374,112.561]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 2","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"fondito azul Outlines","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[253.409,305.682,0]},"a":{"a":0,"k":[216.458,190.757,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[5.862,32.22],[-33.492,21.648],[-31.808,68.096],[-46.439,-91.176],[-0.861,-3.129],[-33.333,0.288],[-6.426,-45.615],[-34.661,-43.593],[-0.347,-0.459],[29.408,-0.097]],"o":[[-30.175,0.096],[-4.106,-22.571],[80.78,-52.224],[34.837,-74.572],[1.456,2.855],[3.29,11.952],[40.224,-0.345],[6.548,46.482],[0.365,0.462],[18.662,24.738],[0,0]],"v":[[-149.526,190.411],[-212.102,135.455],[-176.66,65.388],[-122.697,-109.443],[79.659,-99.331],[83.084,-90.293],[132.161,-43.768],[209.66,18.763],[185.259,125.907],[186.329,127.289],[158.995,189.414]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8941176470588236,0.9882352941176471,0.8862745098039215,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[216.458,190.757]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Group 1","bm":0,"hd":false}],"ip":0,"op":48,"st":0,"bm":0}],"markers":[],"chars":[{"ch":"O","size":50,"style":"Regular","w":78.71,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.15,1.709],[5.208,0],[4.248,-1.692],[2.864,-3.19],[1.563,-4.704],[0,-5.924],[-1.579,-4.688],[-2.93,-3.223],[-4.183,-1.692],[-5.111,0],[-4.086,1.66],[-2.995,3.288],[-1.611,4.736],[0,5.99],[1.579,4.72],[2.962,3.255]],"o":[[-4.15,-1.709],[-5.013,0],[-4.248,1.693],[-2.995,3.353],[-1.563,4.704],[0,6.023],[1.579,4.688],[2.93,3.223],[4.182,1.692],[5.241,0],[4.085,-1.66],[2.897,-3.157],[1.611,-4.736],[0,-5.989],[-1.579,-4.72],[-2.898,-3.157]],"v":[[53.394,-71.655],[39.355,-74.219],[25.464,-71.68],[14.795,-64.355],[7.959,-52.271],[5.615,-36.328],[7.983,-20.264],[14.746,-8.398],[25.415,-1.025],[39.355,1.514],[53.345,-0.977],[63.965,-8.398],[70.728,-20.239],[73.145,-36.328],[70.776,-52.393],[63.965,-64.355]],"c":true}},"nm":"O","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[4.28,-5.061],[7.227,0],[4.297,5.062],[0,9.538],[-4.216,5.127],[-7.39,0],[-4.232,-5.127],[0,-9.44]],"o":[[-4.281,5.062],[-7.227,0],[-4.297,-5.061],[0,-9.44],[4.215,-5.127],[7.324,0],[4.231,5.127],[0,9.538]],"v":[[56.665,-14.429],[39.404,-6.836],[22.119,-14.429],[15.674,-36.328],[21.997,-58.179],[39.404,-65.869],[56.738,-58.179],[63.086,-36.328]],"c":true}},"nm":"O","hd":false}],"nm":"O","bm":0,"hd":false}]},"fFamily":"Verdana"},{"ch":"j","size":50,"style":"Regular","w":34.42,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[26.025,-73.193],[15.674,-73.193],[15.674,-63.672],[26.025,-63.672]],"c":true}},"nm":"j","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0.211,-1.839],[0.716,-1.302],[1.432,-0.652],[2.344,0],[1.546,0.455],[0.912,0.358],[0,0],[0,0],[-2.132,-0.261],[-1.302,0],[-3.255,3.255],[0,6.38]],"o":[[0,0],[0,0],[0,0],[0,0],[0,2.637],[-0.212,1.839],[-0.716,1.302],[-1.433,0.651],[-1.465,0],[-1.546,-0.456],[0,0],[0,0],[1.433,0.391],[2.132,0.26],[5.469,0],[3.255,-3.255],[0,0]],"v":[[25.439,-54.541],[4.883,-54.541],[4.883,-46.826],[16.26,-46.826],[16.26,-2.881],[15.942,3.833],[14.551,8.545],[11.328,11.475],[5.664,12.451],[1.147,11.768],[-2.539,10.547],[-3.027,10.547],[-3.027,19.287],[2.319,20.264],[7.471,20.654],[20.557,15.771],[25.439,1.318]],"c":true}},"nm":"j","hd":false}],"nm":"j","bm":0,"hd":false}]},"fFamily":"Verdana"},{"ch":"o","size":50,"style":"Regular","w":60.69,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[4.557,5.16],[7.649,0],[4.541,-5.159],[0,-8.887],[-4.541,-5.143],[-7.715,0],[-4.558,5.144],[0,8.887]],"o":[[-4.558,-5.159],[-7.715,0],[-4.541,5.16],[0,8.887],[4.541,5.144],[7.649,0],[4.557,-5.143],[0,-8.887]],"v":[[48.682,-48.315],[30.371,-56.055],[11.987,-48.315],[5.176,-27.246],[11.987,-6.201],[30.371,1.514],[48.682,-6.201],[55.518,-27.246]],"c":true}},"nm":"o","hd":false},{"ind":1,"ty":"sh","ks":{"a":0,"k":{"i":[[2.783,-3.499],[4.883,0],[2.766,3.532],[0,6.836],[-2.751,3.435],[-4.98,0],[-2.767,-3.434],[0,-7.063]],"o":[[-2.783,3.5],[-4.948,0],[-2.767,-3.532],[0,-7.063],[2.75,-3.434],[4.915,0],[2.766,3.435],[0,6.902]],"v":[[41.87,-11.646],[30.371,-6.396],[18.799,-11.694],[14.648,-27.246],[18.774,-42.993],[30.371,-48.145],[41.895,-42.993],[46.045,-27.246]],"c":true}},"nm":"o","hd":false}],"nm":"o","bm":0,"hd":false}]},"fFamily":"Verdana"},{"ch":"s","size":50,"style":"Regular","w":52.1,"data":{"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[2.311,2.409],[4.264,0.977],[2.1,0.391],[1.692,0.391],[1.367,1.14],[0,2.246],[-2.312,1.286],[-3.353,0],[-3.353,-1.188],[-2.344,-1.725],[0,0],[0,0],[3.336,0.798],[3.255,0],[2.815,-0.895],[1.823,-1.53],[0.928,-1.985],[0,-2.246],[-2.002,-2.457],[-4.785,-1.27],[-2.1,-0.391],[-1.302,-0.293],[-1.237,-1.106],[0,-2.148],[2.278,-1.302],[4.036,0],[3.548,1.286],[2.897,2.181],[0,0],[0,0],[-3.369,-0.96],[-4.037,0],[-4.118,3.191],[0,4.98]],"o":[[-2.312,-2.376],[-1.4,-0.325],[-2.1,-0.391],[-3.06,-0.716],[-1.4,-1.139],[0,-2.539],[2.311,-1.286],[3.223,0],[3.352,1.189],[0,0],[0,0],[-2.214,-1.139],[-3.337,-0.797],[-3.484,0],[-2.816,0.896],[-1.888,1.563],[-0.928,1.986],[0,3.581],[2.002,2.458],[1.725,0.456],[2.1,0.391],[3.516,0.781],[1.237,1.107],[0,2.8],[-2.279,1.302],[-3.255,0],[-3.548,-1.286],[0,0],[0,0],[2.278,1.14],[3.369,0.96],[7.129,0],[4.118,-3.19],[0,-3.971]],"v":[[44.531,-25.293],[34.668,-30.322],[29.419,-31.396],[23.73,-32.568],[17.09,-35.352],[14.99,-40.43],[18.457,-46.167],[26.953,-48.096],[36.816,-46.313],[45.361,-41.943],[45.85,-41.943],[45.85,-51.758],[37.524,-54.663],[27.637,-55.859],[18.188,-54.517],[11.23,-50.879],[7.007,-45.557],[5.615,-39.209],[8.618,-30.151],[18.799,-24.561],[24.536,-23.291],[29.639,-22.266],[36.768,-19.434],[38.623,-14.551],[35.205,-8.398],[25.732,-6.445],[15.527,-8.374],[5.859,-13.574],[5.371,-13.574],[5.371,-3.271],[13.843,-0.122],[24.951,1.318],[41.821,-3.467],[47.998,-15.723]],"c":true}},"nm":"s","hd":false}],"nm":"s","bm":0,"hd":false}]},"fFamily":"Verdana"}]} \ No newline at end of file diff --git a/app/src/main/assets/protein.json b/app/src/main/assets/protein.json new file mode 100644 index 0000000..a41ed91 --- /dev/null +++ b/app/src/main/assets/protein.json @@ -0,0 +1 @@ +{"v":"5.5.8","fr":30,"ip":0,"op":180,"w":1122,"h":987,"nm":"Eiendomsmegleren","ddd":0,"assets":[{"id":"comp_0","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Proteinpulver","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[656.355,997.099,0],"ix":2},"a":{"a":0,"k":[73.558,115.822,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-5.017],[-5.017,0],[0,5.018],[5.017,0]],"o":[[0,5.018],[5.017,0],[0,-5.017],[-5.017,0]],"v":[[-9.084,0],[0,9.084],[9.084,0],[0,-9.084]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.297,84.527],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.748],[-7.747,0],[0,7.748],[7.748,0]],"o":[[0,7.748],[7.748,0],[0,-7.748],[-7.747,0]],"v":[[-14.029,-0.001],[-0.001,14.029],[14.029,-0.001],[-0.001,-14.029]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.608,69.013],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.118,-0.16],[0.503,-0.066],[0.295,-1.224],[-0.616,0.085],[-0.368,0.408],[-0.045,0.645]],"o":[[-0.502,0.07],[-0.295,1.227],[0.619,-0.079],[0.623,-0.086],[0.368,-0.41],[0.074,-1.039]],"v":[[1.278,-3.956],[-0.229,-3.75],[-1.115,-0.074],[0.737,-0.32],[2.224,-1.063],[2.844,-2.644]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.697,-1.124],[1.176,-0.672],[-0.636,-1.374],[1.558,-0.212],[0.539,1.204],[0.369,-0.046],[0.314,-1.309],[1.512,-0.139],[-1.258,5.207],[-1.994,0.294],[-0.905,-0.724],[0.112,-1.599]],"o":[[-0.698,1.125],[0.635,1.38],[-1.551,0.251],[-0.538,-1.2],[-0.37,0.046],[-0.315,1.312],[-1.506,0.176],[1.262,-5.174],[2.005,-0.23],[1.752,-0.26],[0.904,0.722],[-0.096,1.363]],"v":[[6.229,-0.151],[3.419,2.548],[5.326,6.68],[0.663,7.375],[-0.952,3.769],[-2.061,3.907],[-3.005,7.838],[-7.531,8.309],[-3.75,-7.263],[2.248,-8.049],[6.231,-7.366],[7.419,-3.888]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[91.956,164.677],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":4,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.166,-0.138],[0.145,-0.601],[-1.896,0.174],[0.306,-1.255],[1.911,-0.106],[0,0],[-2.249,0.199],[0.324,-1.312],[3.754,-0.088],[-1.268,5.109],[-3.639,0.379],[0.324,-1.319]],"o":[[-0.146,0.602],[1.902,-0.116],[-0.307,1.257],[-1.903,0.163],[0,0],[2.259,-0.12],[-0.324,1.315],[-3.73,0.308],[1.271,-5.077],[3.665,-0.169],[-0.323,1.32],[-2.156,0.212]],"v":[[-0.069,-3.567],[-0.506,-1.764],[5.192,-2.199],[4.272,1.568],[-1.451,1.972],[-1.942,3.992],[4.82,3.514],[3.848,7.455],[-7.383,8.049],[-3.573,-7.229],[7.383,-8.049],[6.414,-4.092]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.829,165.683],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.712,-0.014],[-0.714,0.826],[-0.095,1.296],[0.449,0.475],[0.918,0.009],[0.582,0.011],[0.603,-2.371]],"o":[[1.178,0.021],[0.713,-0.826],[0.064,-0.878],[-0.45,-0.475],[-0.583,-0.006],[-0.603,2.378],[0.712,0.022]],"v":[[-0.523,3.625],[2.314,2.415],[3.526,-0.772],[2.948,-2.803],[0.895,-3.526],[-0.852,-3.552],[-2.659,3.572]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-1.277,4.989],[-2.043,-0.011],[-1.002,-0.506],[-0.486,-0.953],[0.095,-1.315],[0.819,-1.336],[1.338,-0.715],[1.643,0.036],[2.429,0.144]],"o":[[2.046,0.076],[1.423,0.007],[1.001,0.504],[0.484,0.955],[-0.127,1.749],[-0.82,1.334],[-1.338,0.715],[-2.427,-0.053],[1.276,-4.957]],"v":[[-4.425,-7.625],[1.709,-7.495],[5.346,-6.731],[7.576,-4.547],[8.159,-1.145],[6.739,3.484],[3.503,6.565],[-0.969,7.589],[-8.254,7.294]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.671,166.151],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":4,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.503,-0.063],[2.728,-4.791],[1.639,0.184],[0,0],[1.436,-2.452],[1.634,0.264],[0.175,5.043],[-1.507,-0.207],[-0.081,-2.872],[-1.557,2.689],[-1.406,-0.127],[-0.046,-2.912],[-1.581,2.807]],"o":[[-2.727,4.92],[-1.639,-0.142],[0,0],[-1.437,2.488],[-1.637,-0.222],[-0.175,-5.043],[1.505,0.242],[0.081,2.872],[1.555,-2.646],[1.405,0.157],[0.045,2.912],[1.58,-2.763],[1.503,0.097]],"v":[[11.518,-6.115],[3.334,8.451],[-1.583,7.962],[-1.776,-0.004],[-6.086,7.405],[-10.995,6.677],[-11.518,-8.452],[-7,-7.777],[-6.757,0.838],[-2.086,-7.164],[2.129,-6.737],[2.266,2],[7.008,-6.357]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[46.718,164.601],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.564,0.298],[-0.335,0.632],[-0.06,0.817],[0.43,0.616],[0.823,0.173],[0.563,-0.291],[0.333,-0.624],[0.061,-0.814],[-0.429,-0.627],[-0.822,-0.18]],"o":[[0.563,-0.296],[0.334,-0.634],[0.066,-0.874],[-0.432,-0.615],[-0.721,-0.152],[-0.564,0.29],[-0.334,0.624],[-0.064,0.872],[0.43,0.627],[0.719,0.158]],"v":[[1.189,3.38],[2.538,1.984],[3.13,-0.195],[2.582,-2.43],[0.7,-3.609],[-1.226,-3.4],[-2.571,-2.029],[-3.163,0.13],[-2.615,2.378],[-0.737,3.592]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0.99,0.805],[0.482,1.137],[-0.096,1.29],[-0.824,1.16],[-1.344,0.449],[-1.633,-0.336],[-0.996,-0.751],[-0.486,-1.102],[0.097,-1.301],[0.829,-1.216],[1.35,-0.489],[1.631,0.364]],"o":[[-0.99,-0.803],[-0.483,-1.136],[0.127,-1.71],[0.822,-1.16],[1.345,-0.449],[1.377,0.282],[0.996,0.751],[0.487,1.103],[-0.128,1.725],[-0.829,1.218],[-1.349,0.49],[-1.374,-0.305]],"v":[[-4.968,5.865],[-7.177,2.949],[-7.756,-0.691],[-6.332,-4.992],[-3.082,-7.4],[1.385,-7.564],[4.946,-6.02],[7.17,-3.243],[7.755,0.359],[6.319,4.777],[3.05,7.344],[-1.422,7.536]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.407,161.832],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":4,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.369,0.244],[-0.046,0.616],[1.118,0.326],[0.501,0.15],[0.294,-1.079],[-0.616,-0.182]],"o":[[0.368,-0.243],[0.073,-0.993],[-0.502,-0.146],[-0.295,1.081],[0.615,0.189],[0.623,0.184]],"v":[[2.171,1.081],[2.793,-0.206],[1.224,-2.177],[-0.281,-2.623],[-1.164,0.617],[0.683,1.173]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[-0.92,-1.114],[0.114,-1.542],[0.625,-0.79],[1.064,-0.232],[1.346,0.403],[0.767,0.239],[0.305,-1.129],[1.487,0.512],[-1.246,4.59],[-1.979,-0.567]],"o":[[0.919,1.114],[-0.092,1.233],[-0.626,0.792],[-1.064,0.231],[-0.769,-0.23],[-0.303,1.131],[-1.493,-0.476],[1.242,-4.558],[1.966,0.629],[1.781,0.509]],"v":[[6.19,-3.387],[7.399,0.592],[6.323,3.63],[3.788,5.169],[0.172,4.915],[-2.131,4.211],[-3.043,7.602],[-7.513,6.12],[-3.781,-7.602],[2.136,-5.809]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.81,156.774],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":4,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.16,-0.197],[0.148,-0.605],[-1.889,0.224],[0,0],[1.905,-0.157],[0.167,-0.677],[-2.242,0.26],[0.329,-1.322],[3.747,-0.189],[-1.293,5.146],[-3.626,0.478],[0.329,-1.328]],"o":[[-0.148,0.605],[1.897,-0.168],[0,0],[-1.897,0.215],[-0.167,0.679],[2.253,-0.179],[-0.33,1.324],[-3.72,0.409],[1.295,-5.115],[3.657,-0.268],[-0.329,1.331],[-2.15,0.27]],"v":[[-0.047,-3.566],[-0.493,-1.75],[5.188,-2.338],[4.251,1.455],[-1.453,2.014],[-1.955,4.048],[4.787,3.388],[3.798,7.359],[-7.404,8.256],[-3.521,-7.136],[7.404,-8.255],[6.417,-4.267]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[84.078,144.618],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.301,5.058],[-1.522,0.053],[0.957,-3.743],[-2.034,0.102],[0.342,-1.335],[3.57,0.042]],"o":[[1.524,-0.017],[-0.956,3.761],[2.04,-0.036],[-0.34,1.337],[-3.556,0.156],[1.301,-5.025]],"v":[[-1.954,-7.531],[2.616,-7.635],[-0.254,3.62],[5.857,3.413],[4.834,7.421],[-5.857,7.593]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.584,145.512],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.011,0.634],[0.496,1.058],[-0.104,1.314],[-0.839,1.306],[-1.362,0.697],[-1.657,-0.048],[-0.968,-0.537],[-0.416,-0.966],[1.175,-0.934],[1.204,0.039],[0.587,-0.363],[0.365,-0.679],[0.069,-0.888],[-0.468,-0.563],[-0.842,-0.036],[-0.96,1.142],[-0.823,-0.968],[1.039,-0.431],[1.321,0.06]],"o":[[-1.012,-0.633],[-0.496,-1.059],[0.138,-1.743],[0.84,-1.307],[1.362,-0.697],[1.308,0.039],[0.968,0.537],[-1.173,0.956],[-0.516,-1.191],[-0.712,-0.025],[-0.588,0.363],[-0.366,0.679],[-0.071,0.887],[0.469,0.565],[1.153,0.048],[0.824,0.978],[-0.874,1.07],[-1.039,0.432],[-1.386,-0.065]],"v":[[-4.493,6.787],[-6.755,4.245],[-7.342,0.686],[-5.876,-3.883],[-2.572,-6.883],[1.958,-7.853],[5.371,-6.993],[7.446,-4.743],[3.922,-1.909],[1.342,-3.747],[-0.607,-3.24],[-2.037,-1.678],[-2.691,0.673],[-2.094,2.85],[-0.127,3.753],[3.041,2.109],[5.513,5.029],[2.643,7.281],[-0.898,7.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.878,145.415],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.013,0.423],[0.635,0.559],[-0.687,1.149],[-1.592,-0.19],[-0.323,0.122],[-0.022,0.272],[0.305,0.193],[0.671,0.266],[0.574,0.341],[0.403,0.609],[-0.071,0.893],[-0.617,0.771],[-1.072,0.336],[-1.411,-0.143],[-0.857,-0.298],[-0.601,-0.463],[0.647,-1.179],[0.627,0.246],[0.673,0.071],[0.366,-0.16],[0.022,-0.27],[-0.305,-0.193],[-0.711,-0.262],[-0.581,-0.314],[-0.397,-0.581],[0.07,-0.885],[0.624,-0.791],[1.073,-0.353],[1.398,0.173]],"o":[[-1.012,-0.424],[0.686,-1.141],[1.388,1.131],[0.583,0.07],[0.323,-0.121],[0.02,-0.256],[-0.305,-0.192],[-0.886,-0.364],[-0.575,-0.34],[-0.403,-0.608],[0.089,-1.122],[0.617,-0.77],[1.072,-0.336],[1.01,0.103],[0.856,0.298],[-0.647,1.186],[-0.502,-0.417],[-0.626,-0.246],[-0.634,-0.068],[-0.365,0.16],[-0.021,0.27],[0.305,0.193],[0.862,0.321],[0.582,0.314],[0.398,0.581],[-0.089,1.113],[-0.624,0.791],[-1.072,0.354],[-1.178,-0.146]],"v":[[-4.862,6.791],[-7.333,5.317],[-5.274,1.88],[-0.806,3.865],[0.552,3.785],[1.07,3.197],[0.643,2.524],[-0.821,1.839],[-3.01,0.779],[-4.475,-0.645],[-4.972,-2.898],[-3.913,-5.734],[-1.38,-7.391],[2.345,-7.676],[5.146,-7.077],[7.333,-5.939],[5.39,-2.391],[3.698,-3.385],[1.748,-3.859],[0.248,-3.723],[-0.332,-3.079],[0.093,-2.383],[1.616,-1.699],[3.782,-0.747],[5.25,0.593],[5.742,2.791],[4.673,5.649],[2.128,7.371],[-1.577,7.646]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.463,144.321],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.844,0.63],[0.402,0.92],[-0.088,1.095],[-0.15,0.568],[-0.711,2.607],[-1.52,-0.282],[0.703,-2.59],[0.026,-0.324],[-0.282,-0.386],[-0.592,-0.113],[-0.411,0.399],[-0.294,1.065],[-0.705,2.616],[-1.5,-0.21],[0.732,-2.721],[1.33,-0.937],[2.059,0.404]],"o":[[-0.845,-0.632],[-0.403,-0.919],[0.036,-0.45],[0.71,-2.598],[1.516,0.319],[-0.704,2.599],[-0.11,0.379],[-0.053,0.663],[0.284,0.386],[0.67,0.128],[0.411,-0.398],[0.705,-2.607],[1.497,0.246],[-0.734,2.732],[-0.594,2.189],[-1.33,0.937],[-1.21,-0.238]],"v":[[-5.409,6.489],[-7.281,4.16],[-7.755,1.135],[-7.475,-0.392],[-5.344,-8.199],[-0.791,-7.298],[-2.901,0.484],[-3.104,1.54],[-2.76,3.112],[-1.447,3.861],[0.175,3.454],[1.233,1.258],[3.348,-6.575],[7.843,-5.892],[5.642,2.285],[2.756,6.982],[-2.328,7.795]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.486,141.976],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.289,-0.285],[1.274,-4.697],[1.37,0.365],[-0.574,2.134],[1.397,-1.438],[0.66,0.193],[0.545,1.963],[0.574,-2.071],[1.355,0.452],[-1.274,4.602],[-1.219,-0.353],[-0.76,-2.869],[-2.083,2.157]],"o":[[-1.278,4.727],[-1.376,-0.336],[0.573,-2.128],[-1.4,1.471],[-0.661,-0.185],[-0.546,-1.959],[-0.574,2.078],[-1.36,-0.423],[1.269,-4.573],[1.214,0.376],[0.758,2.877],[2.072,-2.083],[1.285,0.312]],"v":[[9.917,-4.944],[6.088,9.191],[1.969,8.138],[3.689,1.746],[-0.506,6.11],[-2.488,5.543],[-4.124,-0.34],[-5.845,5.883],[-9.917,4.571],[-6.104,-9.191],[-2.454,-8.098],[-0.177,0.521],[6.055,-5.839]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.107,138.265],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.838],[-27.995,0],[0,7.838],[27.993,0]],"o":[[0,7.838],[27.993,0],[0,-7.838],[-27.995,0]],"v":[[-50.688,0],[0,14.191],[50.688,0],[0,-14.191]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.558,14.441],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[27.993,0],[0,7.974],[0,0],[-27.994,0],[0,7.974],[0,0]],"o":[[-27.994,0],[0,0],[0,7.974],[27.993,0],[0,0],[0,7.974]],"v":[[0,-1.775],[-50.688,-16.214],[-50.688,1.775],[0,16.214],[50.688,1.775],[50.688,-16.214]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.558,30.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.281,9.686],[0,0],[0,0],[-26.206,0.403]],"o":[[-6.789,-2.18],[0,0],[9.005,15.845],[-41.761,-6.994]],"v":[[-21.241,-38.342],[-31.773,-42.282],[-31.773,22.859],[31.773,41.88]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.023,150.785],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[17.773,5.706],[-41.761,-6.994],[0,0]],"o":[[-47.34,12.614],[1.281,9.686],[26.476,-0.409],[0,0]],"v":[[51.897,-38.444],[-51.897,-40.111],[1.117,40.111],[51.897,35.23]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.679,152.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[19.284,0],[0,0],[0,-20.973],[0,0],[0,0],[0,0],[-40.487,0],[0,11.534],[0,0],[0,0],[0,0]],"o":[[0,0],[-19.283,0],[0,0],[0,0],[0,0],[0,11.534],[40.487,0],[0,0],[0,0],[0,0],[0,-20.973]],"v":[[38.392,-97.418],[-38.392,-97.418],[-73.308,-59.443],[-73.308,-33.425],[-73.308,50.517],[-73.308,76.534],[0,97.418],[73.308,76.534],[73.308,50.517],[73.308,-33.425],[73.308,-59.443]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.558,133.977],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Hode","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":66,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":106,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":114,"s":[6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":156,"s":[7]},{"t":166,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[574,490.45,0],"to":[1,0,0],"ti":[3.333,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[580,490.45,0],"to":[-3.333,0,0],"ti":[1,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":49.803,"s":[554,490.45,0],"to":[-1,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60.621,"s":[574,490.45,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":71.439,"s":[554,490.45,0],"to":[0,0,0],"ti":[-4.667,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":82,"s":[574,490.45,0],"to":[4.667,0,0],"ti":[-1.333,0,0]},{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":106,"s":[582,490.45,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":156,"s":[582,490.45,0],"to":[-1.333,0,0],"ti":[1.333,0,0]},{"t":166,"s":[574,490.45,0]}],"ix":2},"a":{"a":0,"k":[994,355.45,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":0,"nm":"Arm vekt","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[-20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":37,"s":[-10]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":84,"s":[-20]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[-10]},{"t":179,"s":[-20]}],"ix":10},"p":{"a":0,"k":[697.539,589.816,0],"ix":2},"a":{"a":0,"k":[1117.539,454.816,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Kropp","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[592.173,600.206,0],"ix":2},"a":{"a":0,"k":[188.119,146.645,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":0,"s":[105,105,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":45,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":88,"s":[107,107,100]},{"i":{"x":[0.833,0.833,0.833],"y":[0.833,0.833,0.833]},"o":{"x":[0.167,0.167,0.167],"y":[0.167,0.167,0.167]},"t":130,"s":[100,100,100]},{"t":179,"s":[105,105,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.709,1.409],[-6.638,-5.297],[1.228,-17.272],[-33.649,30.266],[44.966,-15.145],[25.695,-59.242]],"o":[[5.495,4.925],[0,0],[0,0],[6.919,-6.222],[-38.003,12.8],[-37.327,86.059]],"v":[[-122.475,-5.474],[-104.307,9.853],[-74.769,89.029],[26.693,81.852],[77.509,-96.974],[-1.427,-17.024]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447000002394,0.109999997008,0.172999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[203.33,198.397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-8,14],[-44,-17],[-1,-17],[0,0]],"o":[[8,-14],[0,0],[1,17],[0,0]],"v":[[-61.113,-102.133],[33.421,-115.125],[83.257,-90.447],[-51.26,-12.909]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[97,11],[0,0],[10.562,-25.047],[-80.605,-72.252],[-6.638,-5.297],[0.869,-18.625],[-33.649,30.266],[-20.109,25.233],[0,0]],"o":[[-97,-11],[0,0],[-9.889,23.448],[5.495,4.925],[0,0],[0,0],[13.085,-11.77],[31.6,-39.653],[0,0]],"v":[[53.886,-118.133],[-64.113,-155.133],[-125.66,-91.425],[-92.282,37.541],[-74.113,52.867],[-41.618,122.185],[56.886,124.867],[110.531,63.624],[172.886,-18.133]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[173.136,155.383],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-43.507,-76.25],[-88.507,-73.25],[-113.507,0.75],[-65.007,76.25],[113.507,-30.73],[35.492,-72.25]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.808000033509,0.675,0.556999954523,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[191.53,109.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Hånd på lår","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[415.448,763.278,0],"ix":2},"a":{"a":0,"k":[45.314,35.696,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.851,9.503],[6.862,2.913],[0.571,-6.701],[-1.091,-14.021],[0,6.609],[0.376,4.816],[-0.365,-0.381],[-2.725,-4.651],[1.888,14.162],[3.018,6.07],[-0.438,-0.521],[-2.912,-5.339],[-0.944,11.329],[3.575,5.473],[-0.501,-0.434],[-0.934,-5.784],[0.2,9.231]],"o":[[-7.336,-8.882],[-28.337,-6.644],[8.43,4.034],[1.252,16.113],[0,-2.326],[-0.041,-0.527],[6.082,6.337],[4.485,7.656],[-0.575,-4.312],[-0.302,-0.609],[7.525,8.937],[2.892,5.299],[0.69,-8.28],[-0.362,-0.554],[3.92,3.391],[1.481,9.175],[-0.123,-5.683]],"v":[[27.885,-16.458],[5.714,-33.337],[-42.841,-9.081],[-18.378,14.699],[-7.992,18.476],[-9.421,0.692],[-8.448,0.24],[0.328,26.801],[7.8,13.172],[1.469,-7.164],[2.425,-7.783],[16.613,22.077],[25.109,13.644],[15.678,-11.384],[16.531,-12.127],[27.76,3.344],[38.641,6.656]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[50.489,41.148],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-39.032,-1.12],[1.186,-0.019],[0.093,-0.07],[3.338,1.238],[0.126,-0.272],[-1.649,-9.895],[-4.959,-2.373]],"o":[[-9.042,-3.838],[-0.116,0.002],[-9.585,7.224],[-0.28,-0.105],[-1.005,2.169],[0.699,4.196],[0.571,-6.701]],"v":[[27.977,-9.097],[10.634,-12.982],[6.035,-16.588],[-22.394,-13.761],[-23.109,-13.463],[-26.328,7.783],[-16.579,16.658]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.226,16.909],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Bein","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,675,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[108.671,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Overarm bak","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[448.777,589.279,0],"ix":2},"a":{"a":0,"k":[102.993,146.718,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.463,-5.698],[-2.372,-1.026],[-2.463,5.698],[2.372,1.025]],"o":[[-2.463,5.698],[2.372,1.025],[2.464,-5.697],[-2.371,-1.025]],"v":[[-4.294,-1.856],[-4.46,10.318],[4.294,1.857],[4.46,-10.316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.484,41.481],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.333,-30.877]],"o":[[0,0],[0,0]],"v":[[9.12,-21.553],[-9.12,21.553]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[39.622,120.501],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[12.742,6.693],[10.09,-25.118],[-2.97,8.212],[0.283,21.502]],"o":[[22.299,44.051],[8.529,-0.065],[0,0],[-0.28,-21.309]],"v":[[-2.755,-63.212],[-19.827,63.212],[-0.572,49.602],[19.543,-27.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666999966491,0.545000023935,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.819,229.975],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.144,7.691],[8.096,3.198],[-3.871,-24.833],[0,0],[-7.962,-1.076],[-0.97,0.006],[-2.969,8.212],[-0.025,20.474]],"o":[[-5.219,-3.958],[-25.248,-9.97],[7.526,48.272],[2.378,7.674],[0.984,0.134],[8.528,-0.065],[0,0],[0.018,-13.52]],"v":[[26.587,-50.559],[6.651,-61.159],[-37.694,-32.752],[-17.708,56.605],[-0.754,70.954],[2.178,71.123],[21.431,57.514],[41.547,-19.719]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.815,222.063],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.576,11.361],[21.954,-5.196],[0,0],[-2.23,30.652],[-3.917,0],[-9.861,6.014]],"o":[[-23.957,60.431],[14.932,13.008],[31.219,0],[3.727,0.665],[12.396,0],[-18.491,-10.105]],"v":[[31.788,-49.078],[-74.83,36.07],[-29.492,46.984],[29.513,-7.846],[40.987,-6.816],[74.83,-16.297]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.666999966491,0.545000023935,0.455000005984,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[96.206,137.266],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.576,11.361],[-0.007,0.371],[0,-19.938],[-0.003,-0.266],[0,-32.685],[-4.859,-4.232],[0,0],[-2.23,30.652],[-3.917,0],[-9.861,6.014]],"o":[[-33.372,-35.851],[-14.118,11.942],[0,0.267],[-45.222,14.787],[0,8.025],[14.932,13.008],[31.219,0],[3.727,0.665],[12.396,0],[-18.491,-10.105]],"v":[[35.83,-12.801],[3.021,-85.354],[-20.07,-35.64],[-20.05,-34.846],[-78.872,54.261],[-70.789,72.346],[-25.451,83.261],[33.555,28.43],[45.029,29.461],[78.872,19.979]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[92.164,100.989],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,23.558],[35.954,0],[11.339,-9.591],[-76.841,-41.99]],"o":[[0,-35.953],[-16.014,0],[-0.009,0.489],[18.742,-11.429]],"v":[[54.049,4.74],[-11.052,-60.359],[-53.06,-44.974],[22.792,60.359]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447000002394,0.109999997008,0.172999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[148.244,60.61],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Puff","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[564.977,913.789,0],"ix":2},"a":{"a":0,"k":[119.979,119.978,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-72.303,-148.179],[0,0],[21.144,0],[0,0],[0,-21.144],[0,0]],"o":[[0,0],[0,-21.144],[0,0],[-21.144,0],[0,0],[14.87,-3.617]],"v":[[119.729,91.625],[119.729,-53.34],[81.443,-91.625],[-81.443,-91.625],[-119.729,-53.34],[-119.729,-19.994]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.46699999641,0.513999968884,0.536999990426,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.979,91.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[21.145,0],[0,0],[0,-21.144],[0,0],[0,0],[-21.144,0],[0,0],[0,21.143],[0,0],[0,0]],"o":[[0,0],[-21.144,0],[0,0],[0,0],[0,21.143],[0,0],[21.145,0],[0,0],[0,0],[0,-21.144]],"v":[[81.444,-119.729],[-81.443,-119.729],[-119.728,-81.443],[-119.728,-48.097],[-119.728,81.445],[-81.443,119.729],[81.444,119.729],[119.728,81.445],[119.728,63.521],[119.728,-81.443]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654999976065,0.713999968884,0.757000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.978,119.978],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Isbiter foran flaske","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[213.542,912.072,0],"ix":2},"a":{"a":0,"k":[24.678,11.355,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.348,0.023],[1.131,-0.229],[3.757,-1.015],[0.13,-0.384],[-0.001,-0.002],[-1.096,-0.153],[-0.83,0.168],[-0.001,0],[-0.455,0.151],[-1.548,0.41],[-0.866,0.215],[-0.706,0.169],[-0.45,0.105],[-0.308,0.071],[-0.126,0.029],[0,0]],"o":[[0,0],[-0.341,-0.051],[-1.123,-0.074],[0,0],[-1.394,0.376],[0.001,0.004],[0.274,0.596],[1.45,0.2],[0.002,-0.001],[0.329,-0.135],[1.14,-0.381],[0.873,-0.232],[0.791,-0.197],[0.539,-0.128],[0.406,-0.095],[0.554,-0.126],[0.03,-0.006],[0,0]],"v":[[8.929,-1.86],[7.201,-2.126],[6.165,-2.236],[2.762,-2.005],[-7.593,-0.13],[-10.122,1.028],[-10.116,1.037],[-7.808,2.11],[-3.802,2.043],[-3.797,2.041],[-2.612,1.609],[1.556,0.397],[4.188,-0.277],[6.451,-0.829],[7.943,-1.18],[9.017,-1.428],[10.071,-1.667],[10.122,-1.677]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[36.033,14.07],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.106,0.01],[0.554,-0.126],[0.405,-0.094],[0,0],[0,0],[-0.653,-0.043],[0,0],[0,0],[0,0]],"o":[[-0.125,0.028],[-0.307,0.072],[0,0],[0,0],[0.649,0.046],[0,0],[0,0],[0,0],[-0.1,-0.023]],"v":[[4.135,-4.151],[3.081,-3.913],[2.008,-3.665],[0.748,-2.167],[-4.448,4.017],[-2.495,4.151],[1.211,-0.257],[3.315,-2.762],[4.448,-4.111]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.969,16.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.57,0.134],[0,0],[0,0],[0,0],[-2.438,-0.104],[-0.778,-0.027]],"o":[[0,0],[-0.104,-0.514],[0,0],[0,0],[0,0],[2.418,0.159],[0.78,0.033],[0,0]],"v":[[4.119,0.937],[3.247,-3.356],[2.128,-4.376],[0.994,-3.028],[-1.11,-0.523],[-4.817,3.886],[2.479,4.285],[4.817,4.376]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[44.29,16.82],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.539,-0.128],[0.791,-0.197],[0,0],[-0.944,-0.069],[0,0]],"o":[[-0.45,0.105],[-0.706,0.169],[0,0],[0.934,0.074],[0,0],[0,0]],"v":[[4.637,-3.841],[3.145,-3.489],[0.882,-2.938],[-4.637,3.628],[-1.82,3.841],[3.377,-2.343]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.34,16.731],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.537,-0.042]],"o":[[0,0],[0,0],[0.532,0.045],[0,0]],"v":[[0.448,-0.923],[-0.823,0.59],[-0.781,0.793],[0.823,0.923]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.749,19.426],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.155,0.183],[0.329,-0.136],[-0.031,-0.156],[0,0],[0,0],[0,0]],"o":[[-0.455,0.151],[-0.031,0.151],[0,0],[0,0],[0,0],[-0.047,-0.233]],"v":[[0.225,-2.168],[-0.96,-1.735],[-0.969,-1.273],[-0.27,2.168],[1,0.656],[0.552,-1.549]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.196,17.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.273,0.596],[-0.106,-0.521],[0,0],[-0.614,-0.059],[0,0]],"o":[[-0.382,0.39],[0,0],[0.605,0.061],[0,0],[-1.097,-0.152]],"v":[[-0.857,-2.327],[-1.345,-0.918],[-0.722,2.147],[1.109,2.327],[1.451,-1.254]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[26.774,17.434],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.031,0.151],[0.002,-0.001],[1.45,0.201],[0,0],[-1.722,-0.144],[0,0]],"o":[[-0.031,-0.155],[-0.001,0],[-0.83,0.168],[0,0],[1.666,0.16],[0,0],[0,0]],"v":[[1.802,-1.592],[1.811,-2.053],[1.806,-2.052],[-2.2,-1.986],[-2.543,1.596],[2.543,2.053],[2.501,1.849]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.426,18.165],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.873,-0.232],[0,0],[0,0],[-0.043,-0.003]],"o":[[-0.866,0.215],[0,0],[0,0],[0.044,0.004],[0,0]],"v":[[3.013,-3.283],[0.38,-2.608],[-3.013,1.428],[-2.638,3.273],[-2.507,3.283]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.209,17.076],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.14,-0.381],[-0.047,-0.233],[0,0],[0,0]],"o":[[0.155,0.183],[0,0],[0,0],[-1.548,0.41]],"v":[[-2.084,-0.806],[-1.757,-0.187],[-1.309,2.018],[2.084,-2.018]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.505,16.485],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.88,0.18],[1.133,-1.936],[0,-0.006],[-1.852,-0.178],[-0.002,0],[-0.609,0.035],[-1.993,-0.043],[-1.115,-0.046],[0,0],[0,0],[0,0],[0,0],[-0.224,-0.108],[0,0]],"o":[[-1.63,-0.953],[0,0],[0.001,0.006],[0.209,2.362],[0.002,-0.001],[0.45,-0.065],[1.502,-0.085],[1.13,0.024],[0,0],[0,0],[0,0],[0,0],[0.262,0.025],[0.039,0.003],[0,0]],"v":[[9.278,1.332],[3.95,-0.387],[-12.575,-1.323],[-12.57,-1.306],[-5.456,2.918],[-5.45,2.917],[-3.846,2.768],[1.566,2.725],[4.964,2.833],[5.165,2.668],[4.928,2.38],[10.039,2.87],[11.787,3.036],[12.51,3.255],[12.575,3.259]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.118,3.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.249,-0.018],[0.262,0.024]],"o":[[0,0],[1.456,0.087],[-0.224,-0.108],[0,0]],"v":[[-1.108,-0.193],[-1.362,0.016],[1.362,0.193],[0.64,-0.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[26.266,6.572],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.332,-0.079],[0,0]],"o":[[0,0],[0,0],[1.796,0.073],[0,0],[0,0]],"v":[[-2.555,-0.349],[-2.318,-0.061],[-2.52,0.104],[2.302,0.349],[2.555,0.141]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.602,6.238],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.111,0.342],[0.45,-0.065],[0.002,-0.001],[0.209,2.361],[0.165,-0.642],[0.014,-0.145],[0,0],[-0.936,-0.141],[-2.173,-0.3],[-0.658,-0.089],[0,0],[0,0],[0,0]],"o":[[-0.61,0.035],[-0.002,0],[-1.851,-0.177],[-0.503,0.35],[-0.034,0.134],[0,0],[0.73,0.114],[1.633,0.246],[0.62,0.085],[0,0],[0,0],[0,0],[0.035,-0.371]],"v":[[5.434,-3.696],[3.83,-3.548],[3.823,-3.547],[-3.292,-7.77],[-4.336,-6.259],[-4.427,-5.852],[-5.589,6.298],[-3.083,6.684],[2.646,7.508],[4.56,7.77],[4.914,4.069],[5.218,0.906],[5.555,-2.618]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.839,9.973],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.123,0.06],[1.456,0.087],[0,0],[-1.056,-0.132],[0,0]],"o":[[-0.249,-0.018],[0,0],[0.983,0.13],[0,0],[-0.109,-0.079]],"v":[[8.008,-5.654],[5.285,-5.831],[-8.365,5.437],[-5.313,5.831],[8.365,-5.459]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.619,12.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.13,0.024],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-1.114,-0.046]],"v":[[1.267,-3.905],[-4.36,0.742],[-4.664,3.905],[4.664,-3.796]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[15.418,10.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.382,0.39],[0.001,0.004],[-1.393,0.376],[0,0],[0.626,0.447],[0,0],[-4.204,-0.422],[0,0]],"o":[[-0.001,-0.003],[0.13,-0.384],[0,0],[0.079,-0.821],[0,0],[3.576,0.45],[0,0],[-0.106,-0.521]],"v":[[4.268,1.837],[4.261,1.827],[6.789,0.67],[7.264,-4.291],[6.334,-6.311],[-7.344,4.98],[4.402,6.311],[3.779,3.245]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.649,13.27],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-0.284,-0.038],[0,0],[1.796,0.073]],"o":[[0,0],[0.278,0.037],[0,0],[-1.332,-0.079],[0,0]],"v":[[-6.898,1.943],[-7.252,5.643],[-6.398,5.756],[7.252,-5.512],[2.43,-5.756]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.652,12.099],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.502,-0.085],[0.035,-0.371],[0,0],[0,0]],"o":[[0.111,0.342],[0,0],[0,0],[-1.994,-0.043]],"v":[[-2.598,-2.258],[-2.477,-1.18],[-2.814,2.344],[2.814,-2.301]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.871,8.535],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Champagne","refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[540,675,0],"ix":2},"a":{"a":0,"k":[960,540,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1920,"h":1080,"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Speil","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[781.846,546.636,0],"ix":2},"a":{"a":0,"k":[242.195,379.656,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-174.838,326.02],[-191.96,-331.179],[191.96,-330.1],[181.37,331.179]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.736999990426,0.808000033509,0.827000038297,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":20,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[241.96,381.179],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[186.952,-250.959],[186.155,-254.752],[160.765,-248.106],[-186.952,132.423],[-183.766,254.752],[182.94,-140.369]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[246.968,302.037],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[39.652,-149.451],[-132.059,31.612],[-128.99,149.451],[132.059,-146.36]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[186.861,202.705],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-183.353,119.777],[-179.434,270.186],[176.773,275.345],[183.353,-275.345]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.894000004787,0.941000007181,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[246.968,436.484],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[86.118,-187.851],[-174.931,107.962],[-172.786,190.264],[174.931,-190.264]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.894000004787,0.941000007181,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[232.803,244.195],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[0.633,-2.062],[-0.633,-1.731],[0.163,2.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[433.757,49.016],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-88.257,-92.159],[-83.455,92.159],[88.257,-88.904]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.894000004787,0.941000007181,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[138.257,142.158],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Gulv","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[564.511,1064.813,0],"ix":2},"a":{"a":0,"k":[568.274,90.176,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[26.277,0],[0,0],[-22.263,12.542],[0,0],[-4.851,0],[0,0],[-4.094,-2.277],[0,0]],"o":[[0,0],[-26.201,0],[0,0],[4.122,-2.322],[0,0],[4.801,0],[0,0],[22.405,12.464]],"v":[[532.026,89.926],[-532.043,89.926],[-545.771,46.207],[-310.422,-86.374],[-296.694,-89.926],[293.689,-89.926],[307.292,-86.443],[545.628,46.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.882000014361,0.905999995213,0.917999985639,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[568.283,90.176],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}]},{"id":"comp_1","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Hair front","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1001.073,207.645,0],"ix":2},"a":{"a":0,"k":[113.881,80.346,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[36.844,21.146]],"o":[[10.607,-14.126],[0,0]],"v":[[-1.807,34.22],[-18.422,-34.22]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156999999402,0.275,0.368999974868,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[134.151,54.22],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[43.342,11.495]],"o":[[6.956,-17.301],[0,0]],"v":[[18.085,32.298],[-25.04,-32.298]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156999999402,0.275,0.368999974868,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[101.566,56.142],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[49.191,-0.126]],"o":[[2.458,-20.308],[0,0]],"v":[[29.868,25.284],[-32.326,-25.159]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.156999999402,0.275,0.368999974868,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[75.762,64.984],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.796,33.552],[0,0],[0,0],[25.894,-64.503],[0,0],[0,0]],"o":[[-2.796,-33.552],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[26.562,-19.553],[-9.786,-47.513],[-29.358,-27.942],[-13.37,47.114],[-9.705,53.105],[5.768,43.08]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[197.352,103.773],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.806,0],[21.377,-41.267],[-1.667,-1.225],[-21.454,-19.021],[0,0],[0,0],[-13.637,5.323],[-3.235,-0.754],[0,0],[0,0]],"o":[[-28.806,0],[-4.705,9.083],[-1.354,11.724],[0,0],[0,0],[0,0],[24.766,14.817],[12.368,2.886],[0,0],[0,-28.442]],"v":[[15.783,-74.454],[-88.953,-17.762],[-82.896,-0.126],[-54.767,74.454],[-51.07,69.354],[-61.52,4.554],[-37.754,0],[15.739,24.373],[74.086,-2.436],[93.658,-22.008]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.908,78.268],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Øyenbryn høyre","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":50,"s":[1036.988,254.153,0],"to":[0,-1.5,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":60,"s":[1036.988,245.153,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":70,"s":[1036.988,254.153,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":80,"s":[1036.988,245.153,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":90,"s":[1036.988,254.153,0],"to":[0,0,0],"ti":[0,1.167,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":100,"s":[1036.988,245.153,0],"to":[0,-1.167,0],"ti":[0,-1.5,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":110,"s":[1036.988,247.153,0],"to":[0,1.5,0],"ti":[0,-1.167,0]},{"t":179,"s":[1036.988,254.153,0]}],"ix":2},"a":{"a":0,"k":[50.764,50.408,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":31,"s":[{"i":[[0,0],[-5.272,2.562],[-8.984,-14.348]],"o":[[0,0],[7.382,-3.584],[0,0]],"v":[[-25.763,20.045],[-15.312,16.193],[25.763,-5.698]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":45,"s":[{"i":[[0,0],[-5.837,0.537],[-19.752,-15.094]],"o":[[0,0],[10.699,-0.984],[0,0]],"v":[[-27.388,4.17],[-13.812,5.193],[26.763,13.302]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":159,"s":[{"i":[[0,0],[-5.837,0.537],[-19.752,-15.094]],"o":[[0,0],[10.699,-0.984],[0,0]],"v":[[-27.388,4.17],[-13.812,5.193],[26.763,13.302]],"c":false}]},{"t":179,"s":[{"i":[[0,0],[-5.272,2.562],[-8.984,-14.348]],"o":[[0,0],[7.382,-3.584],[0,0]],"v":[[-25.763,20.045],[-15.312,16.193],[25.763,-5.698]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[50.764,45.046],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-5.272,2.562],[-8.984,-14.348]],"o":[[0,0],[7.382,-3.584],[0,0]],"v":[[25,65.091],[35.451,61.238],[76.527,39.348]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Øyenbryn - venstre","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[-4]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":140,"s":[-4]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[960.603,255.119,0],"ix":2},"a":{"a":0,"k":[50.665,29.348,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[13.405,3],[0,0]],"o":[[0,0],[-13.405,-3],[0,0]],"v":[[25.665,-1.748],[-1.797,-0.481],[-25.665,3.481]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[50.665,28.481],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Munn 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[100]},{"t":157,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[980.808,355.45,0],"ix":2},"a":{"a":0,"k":[41.337,20.99,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-1.479,1.973],[0,0],[0.225,1.032],[0,0],[-0.085,-0.098],[-2.306,-1.48],[-0.119,-0.064],[-1.41,-0.402],[-1.064,-0.113],[-0.848,-0.225],[-0.178,-0.065],[-1.746,-1.659],[0,0],[-0.897,-0.017],[-0.072,0],[-1.35,0.081],[-1.782,0.032],[0,0],[-1.864,-0.563],[-0.478,-0.193],[-0.549,-0.338],[-1.087,-0.419],[-0.402,-0.131],[0,0]],"o":[[0,0],[0,0],[-2.064,0.373],[0,0],[0.567,-0.756],[0,0],[0.074,0.097],[1.398,1.593],[0.12,0.081],[1.184,0.756],[1.063,0.354],[0.873,0.064],[0.179,0.032],[2.079,0.547],[0,0],[0.98,0.483],[0.071,0.015],[1.852,0.017],[1.35,-0.08],[0,0],[1.721,0],[0.49,0.113],[0.442,0.241],[1.052,0.596],[0.399,0.15],[0,0],[0,0]],"v":[[-9.715,6.577],[-20.171,8.461],[-27.665,9.813],[-29.483,4.837],[-24.52,-1.785],[-23.965,-4.686],[-27.073,-18.966],[-26.842,-18.676],[-19.884,-14.358],[-19.526,-14.148],[-15.63,-12.379],[-12.332,-11.83],[-9.727,-11.428],[-9.19,-11.283],[-3.656,-7.694],[-0.705,-5.603],[2.211,-4.991],[2.426,-4.976],[7.265,-5.137],[12.01,-5.361],[12.165,-5.361],[17.661,-4.767],[19.083,-4.251],[20.517,-3.431],[23.72,-1.934],[24.922,-1.518],[2.223,4.422]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[1.59,-1.996],[1.684,-0.805],[2.605,1.24],[2.976,1.367],[6.846,1.577],[5.7,-3.154],[2.748,2.173],[0.167,0.146],[0.227,-1.617],[-3.188,-4.331],[-0.506,-4.272],[-41.616,19.406],[-0.21,0.105],[-0.189,0.089],[0,0],[-0.009,0.006],[-0.574,1.835],[-0.061,1.094]],"o":[[0,0],[-0.92,1.143],[-1.075,0.514],[-2.617,-1.238],[-4.457,-2.044],[-2.248,-0.516],[-8.09,4.457],[-0.371,-0.29],[0,0],[-0.227,1.617],[0,0],[1.06,8.957],[0.218,-0.087],[0.188,-0.088],[0,0],[0.008,-0.005],[1.792,-1.062],[0.609,-1.834],[0.012,-1.11]],"v":[[40.832,-12.812],[39.146,-7.02],[35.586,-4.444],[27.197,-4.736],[15.737,-14.389],[2.056,-15.966],[-8.209,-19.104],[-27.161,-22.387],[-27.962,-23.048],[-28.692,-20.074],[-27.126,-3.861],[-40.338,14.09],[35.197,-1.168],[35.835,-1.465],[36.398,-1.725],[36.36,-1.728],[36.387,-1.741],[40.043,-6.522],[40.832,-11.09]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[41.094,23.297],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.072,0],[-1.351,0.096],[-1.781,0.038],[0,0]],"o":[[0,0],[0,0],[0.072,0.02],[1.852,0.019],[1.35,-0.096],[0,0],[0,0]],"v":[[5.103,2.455],[-5.103,1.858],[-5.103,-2.014],[-4.888,-1.993],[-0.048,-2.186],[4.697,-2.455],[4.851,-2.455]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[48.419,19.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-0.072,0],[-1.351,0.096],[-1.781,0.038],[0,0]],"o":[[0,0],[0,0],[0.072,0.02],[1.852,0.019],[1.35,-0.096],[0,0],[0,0]],"v":[[5.103,2.455],[-5.103,1.858],[-5.103,-2.014],[-4.888,-1.993],[-0.048,-2.186],[4.697,-2.455],[4.851,-2.455]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.419,19.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.936,-0.212],[0,0],[0,0],[0,0],[0,0],[-1.864,-0.674],[-0.479,-0.23],[-0.55,-0.405],[-1.087,-0.5]],"o":[[0,0],[0,0],[0,0],[0,0],[1.721,0],[0.489,0.135],[0.441,0.289],[1.051,0.713],[1.923,0.867]],"v":[[8.687,2.85],[8.293,2.947],[8.257,2.947],[-8.436,1.964],[-8.687,-2.947],[-3.19,-2.235],[-1.768,-1.619],[-0.334,-0.636],[2.868,1.155]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[61.958,19.929],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.936,-0.212],[0,0],[0,0],[0,0],[0,0],[-1.864,-0.674],[-0.479,-0.23],[-0.55,-0.405],[-1.087,-0.5]],"o":[[0,0],[0,0],[0,0],[0,0],[1.721,0],[0.489,0.135],[0.441,0.289],[1.051,0.713],[1.923,0.867]],"v":[[8.687,2.85],[8.293,2.947],[8.257,2.947],[-8.436,1.964],[-8.687,-2.947],[-3.19,-2.235],[-1.768,-1.619],[-0.334,-0.636],[2.868,1.155]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.958,19.929],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.222,1.198],[-5.222,3.082],[-5.222,-3.082],[4.983,-2.582]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[48.539,24.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.222,1.198],[-5.222,3.082],[-5.222,-3.082],[4.983,-2.582]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.539,24.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.896,-0.019],[0,0],[0,0],[0,0],[-0.18,-0.077],[-1.744,-1.985],[0,0]],"o":[[0,0],[0,0],[0,0],[0.179,0.039],[2.079,0.654],[0,0],[0.98,0.577]],"v":[[5.969,1.916],[5.969,5.788],[-5.969,5.076],[-5.969,-5.788],[-5.43,-5.613],[0.102,-1.319],[3.053,1.186]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[37.45,15.673],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.896,-0.019],[0,0],[0,0],[0,0],[-0.18,-0.077],[-1.744,-1.985],[0,0]],"o":[[0,0],[0,0],[0,0],[0.179,0.039],[2.079,0.654],[0,0],[0.98,0.577]],"v":[[5.969,1.916],[5.969,5.788],[-5.969,5.076],[-5.969,-5.788],[-5.43,-5.613],[0.102,-1.319],[3.053,1.186]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.45,15.673],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.969,-3.862],[5.969,2.301],[-5.969,4.457],[-5.969,-4.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[37.347,25.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.969,-3.862],[5.969,2.301],[-5.969,4.457],[-5.969,-4.457]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.347,25.418],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.27],[0,0],[0,0],[0,0],[-1.41,-0.481],[-1.064,-0.135]],"o":[[0,0],[0,0],[0,0],[1.184,0.905],[1.063,0.424],[0.873,0.077]],"v":[[6.943,-3.804],[6.943,7.059],[-6.943,6.25],[-2.857,-7.059],[1.039,-4.94],[4.337,-4.285]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[24.539,13.121],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.849,-0.27],[0,0],[0,0],[0,0],[-1.41,-0.481],[-1.064,-0.135]],"o":[[0,0],[0,0],[0,0],[1.184,0.905],[1.063,0.424],[0.873,0.077]],"v":[[6.943,-3.804],[6.943,7.059],[-6.943,6.25],[-2.857,-7.059],[1.039,-4.94],[4.337,-4.285]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.539,13.121],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.943,-5.061],[6.943,3.853],[-3.514,5.737],[-6.943,-5.737]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[24.436,26.022],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[6.943,-5.061],[6.943,3.853],[-3.514,5.737],[-6.943,-5.737]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[24.436,26.022],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.347,-1.07],[-8.108,1.891],[-8.347,-1.891]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.877999997606,0.877999997606,0.877999997606,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[61.868,23.946],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[8.347,-1.07],[-8.108,1.891],[-8.347,-1.891]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.868,23.946],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-0.263,-0.226],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0.131,0.112],[0,0],[0,0]],"v":[[4.469,-2.439],[3.979,-1.102],[-0.108,10.018],[-4.457,6.091],[-4.469,-10.018],[-4.457,-10],[-3.86,-9.502],[4.099,-2.76]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.601,10.268],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[6.955,4.481],[-6.955,6.992],[3.524,-6.992]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.969,27.277],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Munn","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":106,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":107,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":156,"s":[0]},{"t":157,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[981.407,351.58,0],"ix":2},"a":{"a":0,"k":[40.453,26.496,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.758,-13.193]],"o":[[0,0],[0,0]],"v":[[6.074,-3.876],[-4.316,6.596]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[13.574,14.097],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.02,2.781]],"o":[[0,0],[0,0]],"v":[[-10.548,-3.536],[10.548,0.755]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[33.369,41.601],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.332,-1.235],[1.409,-0.501],[2.185,0.773],[2.485,0.85],[5.726,0.978],[4.773,-1.957],[1.104,0.703],[-1.828,-1.584],[-3.615,-0.776],[-0.896,-0.072],[-0.85,-0.205],[-1.454,-1.03],[0,0],[-0.786,-0.007],[-1.131,0.047],[-1.487,0.016],[-1.606,-0.35],[-0.396,-0.117],[-0.462,-0.211],[-0.909,-0.257],[-1.821,-0.069],[-1.496,0.66],[-0.48,1.147],[-0.049,0.682]],"o":[[0,0],[-0.775,0.718],[-0.902,0.32],[-2.185,-0.775],[-3.733,-1.275],[-1.884,-0.321],[-7.7,3.157],[0,0],[1.817,1.553],[0.883,0.214],[0.885,0.052],[1.743,0.343],[0,0],[0.891,0.318],[1.553,0.012],[1.131,-0.047],[1.479,-0.002],[0.408,0.074],[0.369,0.151],[0.879,0.371],[1.815,0.511],[1.813,0.065],[1.497,-0.66],[0.508,-1.14],[0.018,-0.688]],"v":[[28.787,-0.686],[27.374,2.908],[24.394,4.516],[17.371,4.334],[7.787,-1.665],[-3.668,-2.643],[-12.259,-4.6],[-28.796,-7.056],[-26.697,-4.735],[-18.465,-0.414],[-15.705,-0.08],[-13.082,0.263],[-8.45,2.49],[-5.981,3.795],[-3.36,4.182],[0.691,4.085],[4.662,3.945],[9.39,4.308],[10.579,4.629],[11.782,5.141],[14.463,6.074],[19.965,6.991],[25.062,6.193],[28.126,3.22],[28.777,0.383]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.032,23.985],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Nese","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[988.63,322.357,0],"ix":2},"a":{"a":0,"k":[31.442,19.574,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-23.626,8.265]],"o":[[0,0],[0,0]],"v":[[-16.442,-7.459],[16.442,-0.806]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.677999997606,0.560999971278,0.475,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[31.442,22.459],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Øye kant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[997.757,273.12,0],"ix":2},"a":{"a":0,"k":[60.475,4.399,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.612,1.448],[-2.785,-0.696],[-4.785,-0.994],[-1.634,-0.071],[-0.46,0.021],[0,0],[0.456,0.043],[0.798,0.144],[2.298,0.73],[3.287,0.36],[1.138,-0.088],[1.173,-0.356],[2.239,-0.965]],"o":[[0,0],[4.605,-1.426],[2.93,0.298],[2.393,0.496],[0.815,0.05],[0.458,-0.013],[0,0],[-0.456,-0.034],[-1.598,-0.256],[-4.587,-1.451],[-0.807,-0.107],[-1.102,0.148],[-2.362,0.678],[-4.477,1.931]],"v":[[-21.669,4.127],[-14.802,0.242],[-2.356,-2.528],[12.751,1.875],[19.018,2.729],[20.957,2.748],[21.669,2.729],[20.959,2.662],[19.05,2.418],[13,0.906],[-1.69,-3.968],[-4.638,-4.039],[-8.089,-3.303],[-15.149,-0.695]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.031,4.377],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-4.505,0.391],[-2.94,1.005],[-0.889,0.331],[-1.021,0.177],[-2.037,-0.845],[-1.299,-0.817],[-0.428,-0.047],[0.001,-0.015],[0.408,0.109],[0.58,0.47],[2.069,1.062],[2.411,-0.255],[0.962,-0.309],[0.565,-0.181],[4.395,-0.884]],"o":[[0,0],[4.517,-0.406],[0.807,-0.278],[0.86,-0.331],[2.037,-0.391],[2.068,0.784],[0.653,0.406],[0.427,0.057],[0.003,-0.015],[-0.408,-0.102],[-1.145,-0.934],[-2.009,-1.117],[-1.195,0.105],[-0.943,0.29],[-2.534,0.881],[-4.418,0.884]],"v":[[-19.965,3.104],[-11.671,2.543],[0.972,0.571],[3.333,-0.394],[6.171,-1.211],[12.568,-0.381],[17.599,2.427],[19.297,3.084],[19.962,3.104],[19.312,3],[17.775,2.168],[12.99,-1.289],[5.961,-2.886],[2.699,-2.2],[0.294,-1.311],[-11.812,1.553]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19199999641,0.19199999641,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.215,4.035],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Øyeskygge","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[996.35,269.127,0],"ix":2},"a":{"a":0,"k":[74.381,28.637,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":30,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[25.982,-12.644],[11.505,-18.243],[-5.073,-7.757],[-20.769,6.806]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":45,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[24.732,-3.394],[0.755,-11.243],[-12.823,-9.007],[-31.269,-9.694]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":162,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[24.732,-3.394],[0.755,-11.243],[-12.823,-9.007],[-31.269,-9.694]],"c":true}]},{"t":177,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[7.493,15.964],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-33.475,5.86],[-25.335,18.243],[-15.233,11.972],[-7.22,10.854],[5.213,14.397],[10.996,15.938],[18.003,16.844],[25.982,-12.644],[11.505,-18.243],[-5.073,-7.757],[-20.769,6.806]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[118.01,18.493],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.322,-0.657],[5.747,0.613],[0,0],[-6.99,2.796],[-2.778,-0.315]],"o":[[-1.322,0.656],[-4.634,-0.493],[2.76,-0.512],[9.449,-3.779],[2.126,0.24]],"v":[[20.076,-2.423],[9.835,-3.233],[-12.079,-2.821],[4.697,-7.016],[21.473,-2.821]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-5.815,0.033],[-9.381,0.325],[-3.715,2.773],[0,0]],"o":[[0,0],[0,0],[0,0],[19.124,5.769],[0,0],[9.166,-6.844],[0,0]],"v":[[19.236,-19.676],[-10.608,-21.396],[-29.671,-13.806],[-27.39,-2.78],[13.572,-0.462],[24.04,18.623],[25.038,-19.666]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.455,38.159],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":4,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Head","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.857,294.617,0],"ix":2},"a":{"a":0,"k":[90.283,139.268,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[12.582,2.796],[0,0],[-6.99,2.796],[-5.592,0]],"o":[[0,0],[0,0],[6.99,-2.796],[0,0]],"v":[[18.753,-8.388],[10.364,-8.388],[22.302,-15.254],[52.305,-9.785]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[4.409,0.313],[0,0],[-6.99,2.796],[-2.796,0],[0,0]],"o":[[-5.208,-0.372],[2.76,-0.512],[9.449,-3.779],[2.796,0],[0,0]],"v":[[-39.698,-9.745],[-60.933,-9.785],[-44.157,-13.98],[-27.381,-9.785],[-28.779,-8.388]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[14.578,22.428],[43.338,-47.531],[0,0],[-17.49,-14.288],[0,0],[6.95,1.487],[-7.092,-5.91],[-1.23,-12.693],[-16.777,2.796],[-2.796,8.388],[-22.91,16.731],[-2.797,13.121],[0,0]],"o":[[-18.174,-27.96],[0,0],[0,0],[8.558,6.991],[0,0],[-10.708,10.886],[7.334,6.113],[1.577,16.287],[16.776,-2.795],[0,0],[12.872,-9.4],[2.797,-13.121],[0,0]],"v":[[78.877,-78.944],[-90.291,-82.482],[-74.249,-10.693],[-75.965,22.199],[-54.048,30.018],[-68.385,31.125],[-58.49,73.341],[-45.555,107.645],[-0.819,127.218],[27.141,110.442],[43.917,48.929],[70.56,15.656],[68.491,-8.545]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.705,130.264],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":5,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Kjeve","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[999.683,350.31,0],"ix":2},"a":{"a":0,"k":[83.673,53.453,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.676,8.315],[18.01,0.761],[7.108,2.839],[-6.116,-9.476],[-0.003,-1.481],[-22.15,-29.224],[0,0],[0,0],[-18.645,1.509],[-1.398,13.979]],"o":[[0,0],[-7.3,-0.308],[0,0],[6.116,9.475],[0.074,35.448],[0,0],[0,0],[0,0],[11.234,-0.909],[0.663,-6.631]],"v":[[76.906,-35.75],[-4.788,-31.031],[-78.52,-45.036],[-76.26,-41.646],[-76.26,-6.696],[-33.462,48.082],[2.107,51.122],[28.531,48.281],[57.948,13.41],[81.714,-12.288]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.626,51.372],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Øre høyre","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1001.772,291.307,0],"ix":2},"a":{"a":0,"k":[98.696,37.743,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[9.063,-2.039],[-5.38,-17.356]],"o":[[-1.794,-3.463],[0,0],[1.656,5.339]],"v":[[10.272,2.36],[-10.272,-10.137],[5.216,6.837]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.426999978458,0.340999977261,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.313,28.436],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.628,-23.538],[-8.463,3.621]],"o":[[0,0],[1.629,23.538],[8.463,-3.621]],"v":[[6.402,-11.885],[-17.431,-5.25],[10.595,25.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.308,29.038],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-12.602,-2.835],[5.381,-17.356]],"o":[[0,0],[0,0],[-1.655,5.339]],"v":[[-7.222,1.117],[7.222,-10.137],[-5.38,7.633]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.426999978458,0.340999977261,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[182.753,37.594],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.629,-23.538],[8.463,3.621]],"o":[[0,0],[-1.629,23.539],[-8.463,-3.621]],"v":[[-6.402,-11.885],[17.43,-5.25],[-10.596,25.167]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[178.084,38.341],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Hair back","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1000.408,309.88,0],"ix":2},"a":{"a":0,"k":[112.936,47.15,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.747,0.308],[0,0],[-7.942,-13.201],[1.408,0.091],[3.958,1.782],[0.316,-0.039],[0,0],[0.261,0.098],[0,0],[0.423,-0.198],[21.27,1.763],[-1.31,0.956],[-19.547,30.297],[-39.515,7.487],[-14.39,9.569],[0.062,-1.424],[0,0],[-0.097,-0.236],[-14.445,-13.144]],"o":[[-14.503,-2.552],[0,0],[0.727,1.208],[-13.318,-0.863],[-0.292,-0.131],[0,0],[-0.277,0.034],[0,0],[-0.438,-0.163],[-3.913,1.839],[-1.616,-0.135],[22.726,-16.559],[8.479,-13.143],[10.13,-1.919],[1.188,-0.789],[0,0],[-0.01,0.255],[1.21,2.914],[1.312,1.194]],"v":[[109.955,41.626],[85.351,27.774],[93.293,43.964],[91.68,46.605],[44.851,30.836],[43.923,30.696],[-21.76,38.794],[-22.579,38.698],[-62.963,23.726],[-64.302,23.777],[-110.569,33.189],[-111.445,30.025],[-75.305,-25.462],[-2.609,8.09],[86.245,-45.908],[88.951,-44.38],[86.978,1.709],[87.108,2.448],[111.443,38.612]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[113.005,46.946],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Skygge under hode","sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[974.662,375.441,0],"ix":2},"a":{"a":0,"k":[78.868,68.028,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-42.979,11.272],[0.458,12.941],[-0.371,42.902],[1.224,-2.093]],"o":[[0,0],[42.98,-11.27],[-0.354,-10.026],[0.347,-40.004],[-9.823,16.797]],"v":[[-73.458,-5.954],[-3.97,66.989],[78.863,-17.807],[-17.373,-31.108],[-52.839,-58.239]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.868,68.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Øye","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[997.64,274.929,0],"ix":2},"a":{"a":0,"k":[40.962,6.342,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-0.805],[-0.805,0],[0,0.804],[0.804,0]],"o":[[0,0.804],[0.804,0],[0,-0.805],[-0.805,0]],"v":[[-1.455,0],[0,1.456],[1.455,0],[0,-1.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[77.278,5.386],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.187],[-1.185,0],[0,1.186],[1.187,0]],"o":[[0,1.186],[1.187,0],[0,-1.187],[-1.185,0]],"v":[[-2.147,0],[-0.001,2.147],[2.147,0],[-0.001,-2.147]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.081,6.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.088],[-3.088,0],[0,3.089],[3.089,0]],"o":[[0,3.089],[3.089,0],[0,-3.088],[-3.088,0]],"v":[[-5.592,-0.001],[-0.001,5.592],[5.592,-0.001],[-0.001,-5.592]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.54900004069,0.698000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[76.081,6.842],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-0.805],[-0.805,0],[0,0.804],[0.804,0]],"o":[[0,0.804],[0.804,0],[0,-0.805],[-0.805,0]],"v":[[-1.456,0],[0,1.456],[1.456,0],[0,-1.456]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[7.04,4.386],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-1.187],[-1.186,0],[0,1.186],[1.186,0]],"o":[[0,1.186],[1.186,0],[0,-1.187],[-1.186,0]],"v":[[-2.147,0],[0,2.147],[2.147,0],[0,-2.147]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.842,5.334],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-3.088],[-3.089,0],[0,3.089],[3.088,0]],"o":[[0,3.089],[3.088,0],[0,-3.088],[-3.089,0]],"v":[[-5.592,-0.001],[0,5.592],[5.592,-0.001],[0,-5.592]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.322000002394,0.54900004069,0.698000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[5.842,5.842],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Hvit bak øye","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[992.759,275.429,0],"ix":2},"a":{"a":0,"k":[62.572,62.571,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-34.419],[-34.419,0],[0,34.42],[34.42,0]],"o":[[0,34.42],[34.42,0],[0,-34.419],[-34.419,0]],"v":[[-62.322,-0.001],[-0.001,62.322],[62.322,-0.001],[-0.001,-62.322]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[62.572,62.572],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}]},{"id":"comp_2","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Underarm med vekter","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[30]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[1056.239,591.883,0],"ix":2},"a":{"a":0,"k":[282.218,121.941,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-20.631,-7.776]],"o":[[0,0],[0,0]],"v":[[-25.274,-1.762],[25.274,3.888]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[254.388,94.591],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":60,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.344,-1.101],[0.771,-0.182],[-1.015,-9.535],[-9.342,-0.191],[-0.808,0.086],[1.1,10.343]],"o":[[-0.808,0.086],[-9.092,2.153],[1.014,9.535],[0.791,0.016],[10.344,-1.101],[-1.101,-10.343]],"v":[[-2.036,-18.235],[-4.403,-17.825],[-18.771,2.487],[-0.45,19.32],[1.95,19.222],[18.686,-1.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.109999997008,0.128999986836,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.266,72.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[10.343,-1.101],[0.77,-0.182],[-1.014,-9.535],[-9.341,-0.191],[-0.808,0.086],[1.101,10.343]],"o":[[-0.808,0.086],[-9.092,2.153],[1.015,9.535],[0.792,0.016],[10.343,-1.101],[-1.1,-10.343]],"v":[[-2.036,-18.235],[-4.403,-17.825],[-18.772,2.487],[-0.451,19.32],[1.95,19.222],[18.685,-1.499]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.165000002992,0.216000007181,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149.271,72.155],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[37.765,-4.019],[2.813,-0.666],[-3.704,-34.815],[-34.108,-0.697],[-2.95,0.313],[4.018,37.765]],"o":[[-2.951,0.314],[-33.198,7.858],[3.705,34.815],[2.89,0.059],[37.766,-4.02],[-4.019,-37.766]],"v":[[-7.433,-66.578],[-16.076,-65.081],[-68.537,9.079],[-1.643,70.538],[7.12,70.183],[68.224,-5.474]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.109999997008,0.128999986836,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149.385,70.847],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.705,34.814],[-33.197,7.858],[2.95,-0.314],[-4.019,-37.765],[-37.766,4.019],[-2.813,0.666]],"o":[[-3.705,-34.815],[-2.89,-0.06],[-37.766,4.019],[4.019,37.765],[2.95,-0.313],[-34.108,-0.697]],"v":[[-22.734,3.623],[29.727,-70.537],[20.964,-70.182],[-40.14,5.475],[35.517,66.578],[44.159,65.082]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.165000002992,0.216000007181,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.582,76.303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.166,29.75],[29.146,0.595],[-3.166,-29.751],[-29.147,-0.596]],"o":[[-3.166,-29.751],[-28.369,6.716],[3.166,29.75],[28.369,-6.716]],"v":[[50.997,-5.427],[-6.166,-57.946],[-50.997,5.427],[6.166,57.946]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.081999999402,0.109999997008,0.128999986836,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.556,68.554],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.166,29.75],[-28.369,6.716],[2.522,-0.269],[-3.435,-32.271],[-32.272,3.434],[-2.404,0.569]],"o":[[-3.166,-29.751],[-2.471,-0.051],[-32.272,3.433],[3.434,32.272],[2.521,-0.268],[-29.147,-0.596]],"v":[[-19.427,3.096],[25.404,-60.277],[17.914,-59.973],[-34.301,4.678],[30.351,56.894],[37.736,55.616]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.165000002992,0.216000007181,0.246999987434,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.986,70.885],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[22.748,12.782],[-14.871,-12.828],[-57.622,3.903],[1.373,15.354],[0,0]],"o":[[-0.679,6.288],[22.522,19.428],[47.932,-3.247],[0,0],[-66.873,20.532]],"v":[[-91.861,-34.602],[-73.465,-6.466],[31.69,30.699],[91.167,-6.516],[91.264,-10.009]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[233.821,132.669],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.373,15.354],[1.274,2.684],[89.189,-8.434],[1.193,-11.057],[-14.871,-12.828],[-57.622,3.903]],"o":[[-0.277,-3.104],[-19.485,-41.019],[0,0],[-0.679,6.288],[22.522,19.428],[47.933,-3.247]],"v":[[91.167,4.533],[88.757,-4.225],[-74.372,-37.217],[-91.861,-23.552],[-73.465,4.583],[31.689,41.749]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[233.822,121.619],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Underarm skygge","parent":1,"sr":1,"ks":{"o":{"a":0,"k":30,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[-6]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[-6]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[296.531,128.289,0],"ix":2},"a":{"a":0,"k":[139.576,59.31,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-41.877,-62.336],[53.927,0.179],[0,0]],"o":[[9.733,14.49],[-53.927,-0.179],[26.52,-35.234]],"v":[[78.654,3.192],[33.676,42.741],[-83.432,-15.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.432,42.742],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Overarm vekter Shine","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1153.327,472.945,0],"ix":2},"a":{"a":0,"k":[12.597,26.517,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.336,-3.748],[-2.258,-0.805],[-1.337,3.748],[2.258,0.805]],"o":[[-1.337,3.748],[2.258,0.805],[1.336,-3.748],[-2.258,-0.805]],"v":[[-4.088,-1.458],[-2.419,6.786],[4.089,1.458],[2.42,-6.786]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.834999952129,0.776000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.071,44.335],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.081,-8.644],[-5.254,-1.873],[-3.081,8.644],[5.254,1.873]],"o":[[-3.082,8.644],[5.254,1.873],[3.082,-8.643],[-5.254,-1.873]],"v":[[-9.512,-3.392],[-5.578,15.651],[9.512,3.391],[5.58,-15.651]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.902000038297,0.834999952129,0.776000019148,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.844,17.774],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Overarm vekter","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1117.577,454.816,0],"ix":2},"a":{"a":0,"k":[64.25,58.755,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[105,105,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":85,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":125,"s":[105,105,100]},{"t":179,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.81,0],[6.212,-2.009],[-5.593,-16.423],[-9.957,-2.967]],"o":[[-6.881,0],[34.822,-0.625],[8.587,1.585],[-6.551,-34.238]],"v":[[-21.668,-26.513],[-41.381,-23.404],[7.929,18.772],[41.381,26.513]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.447000002394,0.109999997008,0.172999991623,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[85.918,26.763],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.81,0],[6.212,-2.009],[0,-28.466],[-0.339,-2.671],[-61.49,-11.349],[-9.957,-2.967]],"o":[[-6.881,0],[-25.697,8.314],[0,2.764],[9.725,-15.835],[8.588,1.585],[-6.551,-34.238]],"v":[[0.476,-36.077],[-19.237,-32.968],[-63.524,27.923],[-63.001,36.077],[35.734,10.177],[63.524,16.949]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[63.775,36.327],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,21.19],[1.821,5.94],[0.874,2.152],[18.648,-2.572],[13.629,-34.609],[-2.623,-2.544],[0,0]],"o":[[0,-6.536],[-0.712,-2.323],[-9.496,-7.286],[5.085,9.463],[6.97,3.48],[-0.239,-0.91],[15.865,-11.647]],"v":[[19.953,-9.933],[12.451,-29.082],[10.068,-35.791],[-14.45,-28.649],[-19.953,33.359],[-5.814,43.077],[-6.218,41.682]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[108.297,74.183],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-6.536],[1.822,5.94],[2.207,1.692],[-0.712,-2.323]],"o":[[0,-6.536],[-2.565,-3.079],[0.874,2.152],[1.821,5.94]],"v":[[4.943,12.929],[2.135,-5.853],[-4.943,-12.929],[-2.56,-6.22]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[123.308,51.321],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-23.295,7.998],[24.53,7.735],[-9.497,-7.286],[26.254,0],[0,-35.346],[-0.34,-2.67],[-4.6,-7.517]],"o":[[21.507,-43.785],[18.648,-2.572],[-8.983,-22.117],[-35.346,0],[0,2.763],[1.164,9.143],[-1.634,1.246]],"v":[[28.32,48.813],[23.156,-22.365],[58.966,-21.71],[6.174,-56.811],[-56.052,2.917],[-58.626,12.301],[-49.777,37.503]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59.4,60.102],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Biceps shine","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":21,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":38,"s":[60]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[30]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":103,"s":[60]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":125,"s":[80]},{"t":179,"s":[30]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":0.667},"o":{"x":0.333,"y":0.333},"t":0,"s":[1056.83,518.177,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":21,"s":[1056.83,518.177,0],"to":[-0.75,-1.25,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":38,"s":[1052.33,510.677,0],"to":[0,0,0],"ti":[-0.986,-1.408,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[1056.83,518.177,0],"to":[1.167,1.667,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":103,"s":[1056.83,518.177,0],"to":[-0.75,-1.25,0],"ti":[0,0,0]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":125,"s":[1052.33,510.677,0],"to":[0,0,0],"ti":[-0.75,-1.25,0]},{"t":179,"s":[1056.83,518.177,0]}],"ix":2},"a":{"a":0,"k":[9.23,16.289,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":21,"s":[40,40,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":38,"s":[85,85,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":85,"s":[30,30,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":103,"s":[40,40,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":125,"s":[100,100,100]},{"t":179,"s":[30,30,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.222,-8.893],[-2.858,-1.358],[-4.222,8.893],[2.86,1.358]],"o":[[-4.222,8.892],[2.86,1.356],[4.221,-8.892],[-2.858,-1.356]],"v":[[-5.176,-2.457],[-7.644,16.101],[5.177,2.457],[7.643,-16.101]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.23,16.289],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Biceps","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":30,"s":[-21]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":85,"s":[0]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":117,"s":[-21]},{"t":179,"s":[0]}],"ix":10},"p":{"a":0,"k":[1100.019,542.592,0],"ix":2},"a":{"a":0,"k":[63.546,84.386,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":30,"s":[120,97.727,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":85,"s":[100,100,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":117,"s":[120,97.727,100]},{"t":179,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.119,-0.24],[12.233,-22.705],[32.37,-8.869],[-13.847,9.618],[2.298,8.764],[6.97,3.48]],"o":[[0,0],[-13.535,25.122],[11.311,5.799],[53.433,-37.113],[-2.622,-2.545],[-0.117,0.238]],"v":[[19.262,-50.308],[14.262,-3.014],[-61.47,56.945],[-10.23,45.667],[34.967,-60.199],[19.606,-51.016]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.8,0.666999966491,0.552999997606,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[85.592,96.413],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[{"i":[[-13.535,25.122],[49.508,19.297],[12.049,-12.667],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-36.449,-14.207],[-10.665,11.213],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":23,"s":[{"i":[[-13.535,25.122],[48.122,22.533],[17.206,-16.35],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-28.458,-13.325],[-11.218,10.66],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":33,"s":[{"i":[[-13.535,25.122],[49.609,19.037],[20.249,-19.176],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-38.468,-14.761],[-16.624,15.743],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-45.439,-57.479],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":85,"s":[{"i":[[-13.535,25.122],[49.508,19.297],[12.049,-12.667],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-36.449,-14.207],[-10.665,11.213],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":111,"s":[{"i":[[-13.535,25.122],[49.21,20.045],[11.603,-12.294],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-33.179,-13.515],[-10.622,11.254],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":121,"s":[{"i":[[-13.535,25.122],[49.329,19.751],[11.232,-10.645],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-49.329,-19.751],[-11.233,10.644],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-50.449,-49.963],[-72.173,8.801],[-49.656,76.554]],"c":true}]},{"t":179,"s":[{"i":[[-13.535,25.122],[49.508,19.297],[12.049,-12.667],[0.625,-18.238],[-14.464,-7.414]],"o":[[12.233,-22.705],[-36.449,-14.207],[-10.665,11.213],[-1.354,39.496],[32.37,-8.869]],"v":[[26.077,16.595],[24.198,-56.803],[-47.3,-41.343],[-72.173,8.801],[-49.656,76.554]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.885999971278,0.74900004069,0.603999956916,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[73.778,76.804],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":180,"st":0,"bm":0}]},{"id":"comp_3","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Bulge","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[991.231,661.924,0],"ix":2},"a":{"a":0,"k":[49.281,40.467,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-9.266,14.965]],"o":[[-1.516,37.162],[0,0]],"v":[[-22.029,-18.581],[23.546,2.664]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":10,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[48.545,43.581],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Høyre lår","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1087.32,646.936,0],"ix":2},"a":{"a":0,"k":[139.818,54.017,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[18.277,15.508],[0,0],[0,0],[-36.262,0],[0,0]],"o":[[0,0],[0,0],[0,0],[-4.135,-7.19],[-62.035,-22.352]],"v":[[-35.001,-41.495],[-67.349,-34.874],[-19.235,18.521],[67.349,41.495],[62.518,22.725]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.599,64.665],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-46.015,-4.486],[0,13.241],[-65.441,-1.899]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,-13.241],[-34.296,-21.491]],"v":[[-23.184,-52.792],[-90.895,-26.479],[-99.203,-23.251],[-51.089,30.144],[31.994,52.792],[30.663,34.348],[99.203,-11.771]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.453,53.042],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.689,-4.469],[-20.819,0.753],[-13.08,2.628],[31.425,8.506]],"o":[[16.466,1.606],[23.859,-0.862],[-43.369,-0.328],[-2.215,7.265]],"v":[[-57.169,8.012],[-1.042,9.679],[60.714,3.621],[-58.5,-10.432]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[188.616,97.822],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[28.494,11.784],[-5.325,-18.657],[-43.369,-0.328],[-0.302,9.564]],"o":[[-65.439,-1.898],[31.425,8.507],[27.952,-2.309],[0.229,-7.295]],"v":[[-14.334,-32.344],[-69.725,19.57],[42.321,34.242],[79.544,20.84]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[199.841,67.82],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Høyre legg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1200.112,836.648,0],"ix":2},"a":{"a":0,"k":[48.134,182.975,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.534,17.912],[14.355,38.199],[-34.409,51.299],[-2.811,-30.533],[4.311,-15.009],[-1.08,-27.428]],"o":[[0,0],[-14.354,-38.198],[19.599,-29.22],[2.124,23.069],[-9.41,32.763],[0.64,16.272]],"v":[[-11.144,123.786],[-18.275,23.523],[-8.464,-112.478],[40.749,-88.378],[36.938,-20.378],[5.415,125.141]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.123,141.948],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[-4.834,-17.164],[-0.999,11.553],[0,0]],"o":[[0,0],[0,0],[4.834,17.166],[0.999,-11.553],[0,0]],"v":[[-18.779,-42.815],[-28.71,-14.086],[-25.171,26.164],[29.006,24.743],[0.849,-43.331]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.786,313.56],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Venstre Lår","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[879.775,654.163,0],"ix":2},"a":{"a":0,"k":[152.413,59.038,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[76.703,25.968],[13.65,-9.676],[5.943,-10.346],[-15.265,12.388]],"o":[[-14.971,14.723],[11.279,13.22],[22.19,-2.101],[28.684,-23.279]],"v":[[-12.692,-40.095],[-64.01,1.091],[-58.397,40.095],[10.189,23.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[266.304,51.713],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[76.703,25.968],[2.173,0.703],[9.486,-0.762],[-11.266,-13.205],[5.943,-10.346],[-15.265,12.388]],"o":[[-2.029,-0.687],[-28.684,-9.285],[37.983,1.5],[11.279,13.22],[22.19,-2.101],[28.684,-23.279]],"v":[[23.053,-34.411],[16.768,-36.493],[-99.755,-18.923],[-28.266,6.775],[-22.652,45.779],[45.934,29.236]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.051000000449,0.128999986836,0.204000001795,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[230.559,46.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[39.785,-6.359],[-85.546,19.664],[11.218,13.204]],"o":[[31.928,4.931],[5.932,-10.327],[-34.552,28.335]],"v":[[-79.555,25.187],[73.623,8.813],[68.072,-30.118]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.800000071526,0.666666686535,0.552941203117,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.283,82.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[11.218,13.204],[38.053,1.502],[0,-10.456],[-23.965,-3.701],[-85.546,19.664]],"o":[[-11.245,-13.237],[-101.782,8.185],[0,0],[31.928,4.931],[5.932,-10.327]],"v":[[95.311,-16.412],[23.76,-42.183],[-106.794,26.402],[-72.172,35.716],[100.862,22.519]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[107.044,69.289],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Venstre legg","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[770.333,820.594,0],"ix":2},"a":{"a":0,"k":[46.292,161.917,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[14.004,42.144],[-1.959,65.291],[-8.574,-37.289],[-2.888,-39.577],[-2.83,-16.226],[3.255,-0.772]],"o":[[0,0],[-11.961,-35.993],[1.226,-40.858],[12.744,55.419],[3.169,43.435],[0.574,3.295],[-16.941,4.02]],"v":[[21.627,125.426],[-0.45,27.302],[-41.552,-92.897],[26.346,-84.805],[28.841,14.104],[42.938,122.501],[38.156,129.735]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.886274576187,0.749019622803,0.603921592236,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[43.761,134.005],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[16.309,-19.608],[-3.112,-3.079],[-2.371,-0.284],[-21.097,11.977],[-5.494,4.296],[1.457,4.26],[0,0],[0,0]],"o":[[-2.8,3.366],[2.108,2.085],[5.301,0.635],[12.427,-7.056],[3.546,-2.772],[0,0],[0,0],[0,0]],"v":[[-40.81,11.743],[-40.283,23.066],[-33.241,27.401],[11.517,15.216],[38.676,5.188],[42.154,-6.563],[37.548,-28.036],[18.048,-20.302]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.54900004069,0.128999986836,0.19199999641,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.738,280.892],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0}]},{"id":"comp_4","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Flaske","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[612.656,715.184,0],"ix":2},"a":{"a":0,"k":[60.166,74.557,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.868,-12.577],[-2.142,-1.253],[-0.012,-0.003],[-0.098,2.306],[-0.7,10.752],[-9.278,5.631],[0,0],[0,0]],"o":[[1.307,5.73],[0.011,0.006],[0.618,0.137],[-1.339,-2.347],[1.273,-19.542],[3.16,-1.917],[0,0],[-32.134,17.82]],"v":[[-16.055,18.263],[-8.194,31.326],[-8.184,31.304],[-6.035,30.341],[-14.018,11.706],[13.644,-27.073],[18.923,-29.989],[17.811,-32.647]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.122,51.996],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.316,5.771],[-32.134,17.82],[0,0],[-8.526,-25.772],[-0.297,-0.589],[-1.475,-0.989],[0,0],[-1.125,-0.145],[0,0],[3.021,2.504],[0.286,0.391]],"o":[[-2.868,-12.577],[-7.405,2.556],[-19.16,8.019],[0.209,0.633],[0.944,1.877],[0,0],[1.124,0.754],[0,0],[0,0],[-0.381,-0.317],[-2.124,-1.193]],"v":[[-8.524,18.934],[25.341,-31.975],[16.114,-30.695],[-16.815,23.771],[-16.052,25.607],[-12.26,29.982],[-11.839,30.264],[-8.427,31.628],[-0.654,31.975],[-1.899,29.238],[-2.898,28.174]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.591,51.325],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-17.194,10.314],[5.99,-4.235],[0.435,-0.655]],"o":[[0,0],[0,0],[-5.125,3.622],[-0.94,1.423]],"v":[[-16.188,-10.872],[8.169,-8.35],[10.198,0.551],[-8.46,9.449]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.704,49.709],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.979,-1.056],[-1.158,-0.454],[0,0],[0,0],[2.288,3.476]],"o":[[1.699,0.526],[0,0],[0,0],[-2.654,-0.551],[-0.446,1.941]],"v":[[-3.923,1.51],[0.686,2.483],[2.148,3.057],[5.073,1.374],[-4.627,-3.057]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.014,80.963],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.474,-1.128],[-6.547,2.745],[0.474,1.128],[8.775,-3.678]],"o":[[0.474,1.129],[6.548,-2.744],[-0.473,-1.128],[-8.775,3.679]],"v":[[-11.855,7.757],[0.857,4.831],[11.856,-2.182],[-3.355,-5.208]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[53.43,9.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.643,-1.536],[-7.885,3.299],[0.643,1.536],[7.885,-3.3]],"o":[[0.643,1.536],[7.886,-3.3],[-0.643,-1.536],[-7.885,3.3]],"v":[[-14.278,5.975],[1.164,2.782],[14.278,-5.975],[-1.164,-2.782]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[53.684,12.531],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[2.965,-1.24],[2.236,-1.321],[0,0],[0,0],[-8.746,3.66],[0.846,2.023],[0,0]],"o":[[-2.51,0.665],[-2.965,1.241],[0,0],[0,0],[0.847,2.023],[8.746,-3.66],[0,0],[0,0]],"v":[[5.507,-5.327],[-2.82,-2.45],[-10.715,1.462],[-15.395,3.22],[-14.007,6.536],[0.245,4.875],[14.549,-5.414],[13.232,-8.559]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[54.801,15.286],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[1.149,-20.93],[-15.713,-13.872],[-1.15,20.93],[15.713,13.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.828,30.742],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.379,-0.907],[-4.657,1.949],[0.38,0.908],[4.656,-1.948]],"o":[[0.38,0.907],[4.656,-1.948],[-0.38,-0.907],[-4.657,1.948]],"v":[[-8.432,3.528],[0.687,1.643],[8.431,-3.528],[-0.688,-1.643]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.227,51.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.552,-3.7],[-19.684,8.259],[1.553,3.699],[26.381,-11.068]],"o":[[1.552,3.7],[19.684,-8.26],[-1.552,-3.7],[-26.38,11.068]],"v":[[-35.641,21.601],[2.81,13.346],[35.641,-8.307],[-8.762,-14.233]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.980000035903,0.325,0.2,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.716,53.491],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[6.676,-2.794],[4.995,-3.065],[0,0],[0,0],[-19.692,8.241],[2.142,5.118],[0,0]],"o":[[-5.689,1.406],[-6.675,2.794],[0,0],[0,0],[2.141,5.119],[19.691,-8.24],[0,0],[0,0]],"v":[[15.526,-14.182],[-3.285,-7.846],[-20.999,1.103],[-38.392,8.383],[-35.06,16.34],[4.473,10.686],[36.25,-13.5],[32.918,-21.46]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.685999971278,0.322000002394,0.282000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.27,66.271],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[-27.705,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[16.208,-45.017],[-13.835,-30.365],[-45.36,-19.251],[-14.816,39.406],[45.36,45.017]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.027000000898,0.078000005086,0.118000000598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.067,101.408],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Champagne beholder kant Foran","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[686.002,779.05,0],"ix":2},"a":{"a":0,"k":[130.546,14.312,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[64.78,0],[3.177,12.469],[0,0],[-71.96,0],[0,15.533],[0,0]],"o":[[-64.78,0],[0,0],[0,15.533],[71.96,0],[0,0],[-3.177,12.469]],"v":[[0,8.325],[-120.845,-14.062],[-130.296,-14.062],[0,14.062],[130.296,-14.062],[120.845,-14.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.546,14.312],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Isbiter","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[684.904,750.011,0],"ix":2},"a":{"a":0,"k":[110.506,42.44,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.211],[0.142,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.771,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.597,62.357],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.193,-0.948],[0,0]],"o":[[0,0],[-0.6,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.601,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.326,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.805],[0.07,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.935,72.51],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.266],[-3.65,6.615],[-3.063,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.345,70.927],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[113.494,67.79],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.422,0.085],[0,0],[0.227,1.123],[0,0]],"o":[[0,0],[0,0],[0.143,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.245,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.967],[4.427,7.752],[5.241,5.471],[2.215,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[118.75,72.673],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.369],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.102,69.602],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.229,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.044,66.492],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.06,-0.733],[-0.78,-2.26],[-1.048,0.724]],"o":[[0,0],[-1.474,-0.072],[0,0],[1.739,2.021],[1.771,-2.702]],"v":[[8.243,-4.843],[5.264,-4.989],[1.417,-3.985],[-7.463,3.04],[-0.973,3.428]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[8.493,19.625],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.582,0.028],[0,0],[0.67,0.969],[0,0],[-1.522,-0.076],[0,0],[-0.67,-0.969],[0,0]],"o":[[0,0],[-0.812,-0.04],[0,0],[-1.257,-1.815],[0,0],[0.812,0.04],[0,0],[0.481,0.696]],"v":[[9.927,10.557],[3.697,10.25],[1.266,8.596],[-9.369,-6.779],[-8.799,-10.509],[-4.583,-10.302],[-2.153,-8.648],[10.145,9.129]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[11.18,31.703],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 9","np":2,"cix":2,"bm":0,"ix":9,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.229,-0.159],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.308,-0.05]],"v":[[-0.673,-11.974],[-1.659,-11.292],[-0.385,9.212],[1.659,12.169],[0.151,-12.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.863,26.933],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 10","np":2,"cix":2,"bm":0,"ix":10,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.149,-7.109],[-1.341,-6.079],[-0.705,4.152],[1.341,7.109],[0.466,-6.966]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.169,24.746],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 11","np":2,"cix":2,"bm":0,"ix":11,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.622,0.102],[0,0],[0,0],[-0.432,0.299],[0,0],[0.793,1.146],[0,0]],"o":[[0,0],[0,0],[0.496,0.717],[0,0],[0.692,-0.478],[0,0],[-0.531,-0.767]],"v":[[-6.638,-13.74],[-5.129,10.549],[-3.651,12.685],[-1.97,13.441],[5.946,5.789],[5.763,2.846],[-4.772,-12.385]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[23.652,28.553],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 12","np":2,"cix":2,"bm":0,"ix":12,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.079,-8.256],[-1.763,-8.113],[-0.888,5.962],[2.079,10.251],[0.805,-10.251]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.398,25.893],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 13","np":2,"cix":2,"bm":0,"ix":13,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.793,-1.146],[0,0],[0,0]],"o":[[-0.692,0.479],[0,0],[0,0],[0,0]],"v":[[-1.523,-2.969],[-1.34,-0.026],[2.215,5.115],[1.579,-5.115]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.249,23.783],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 14","np":2,"cix":2,"bm":0,"ix":14,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.061,-0.734],[-0.78,-2.26],[-1.048,0.724]],"o":[[0,0],[-1.473,-0.073],[0,0],[1.739,2.021],[1.771,-2.702]],"v":[[8.243,-4.842],[5.263,-4.988],[1.416,-3.984],[-7.463,3.04],[-0.973,3.429]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.752,19.979],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 15","np":2,"cix":2,"bm":0,"ix":15,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.582,0.028],[0,0],[0.67,0.969],[0,0],[-1.522,-0.075],[0,0],[-0.67,-0.969],[0,0]],"o":[[0,0],[-0.812,-0.039],[0,0],[-1.257,-1.816],[0,0],[0.813,0.04],[0,0],[0.481,0.695]],"v":[[9.927,10.556],[3.697,10.25],[1.266,8.596],[-9.369,-6.779],[-8.799,-10.509],[-4.584,-10.301],[-2.153,-8.647],[10.145,9.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[16.439,32.057],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 16","np":2,"cix":2,"bm":0,"ix":16,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.229,-0.158],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.308,-0.049]],"v":[[-0.673,-11.974],[-1.659,-11.291],[-0.385,9.212],[1.659,12.169],[0.151,-12.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.122,27.287],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 17","np":2,"cix":2,"bm":0,"ix":17,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.149,-7.11],[-1.341,-6.079],[-0.705,4.153],[1.341,7.11],[0.466,-6.967]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.428,25.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 18","np":2,"cix":2,"bm":0,"ix":18,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.623,0.101],[0,0],[0,0],[-0.432,0.298],[0,0],[0.794,1.147],[0,0]],"o":[[0,0],[0,0],[0.495,0.717],[0,0],[0.693,-0.479],[0,0],[-0.531,-0.767]],"v":[[-6.638,-13.74],[-5.129,10.549],[-3.651,12.686],[-1.971,13.441],[5.945,5.79],[5.762,2.846],[-4.773,-12.384]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.911,28.907],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 19","np":2,"cix":2,"bm":0,"ix":19,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.079,-8.257],[-1.763,-8.114],[-0.888,5.963],[2.079,10.252],[0.805,-10.252]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.657,26.247],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 20","np":2,"cix":2,"bm":0,"ix":20,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.793,-1.147],[0,0],[0,0]],"o":[[-0.692,0.479],[0,0],[0,0],[0,0]],"v":[[-1.523,-2.97],[-1.34,-0.026],[2.215,5.116],[1.579,-5.116]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.508,24.137],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 21","np":2,"cix":2,"bm":0,"ix":21,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.038,-0.211],[0.141,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.77,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[157.133,16.202],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 22","np":2,"cix":2,"bm":0,"ix":22,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.209],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.192,-0.948],[0,0]],"o":[[0,0],[-0.599,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.601,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.326,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.804],[0.07,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[154.471,26.354],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 23","np":2,"cix":2,"bm":0,"ix":23,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.266],[-3.65,6.615],[-3.063,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.881,24.772],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 24","np":2,"cix":2,"bm":0,"ix":24,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.261],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.03,21.635],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 25","np":2,"cix":2,"bm":0,"ix":25,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.423,0.085],[0,0],[0.228,1.123],[0,0]],"o":[[0,0],[0,0],[0.142,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.245,-11.052],[-5.469,7.762],[-5.044,9.852],[-4.02,10.967],[4.426,7.752],[5.24,5.471],[2.214,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[163.286,26.517],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 26","np":2,"cix":2,"bm":0,"ix":26,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.369],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[159.638,23.447],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 27","np":2,"cix":2,"bm":0,"ix":27,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.229,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.346],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.58,20.337],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 28","np":2,"cix":2,"bm":0,"ix":28,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.376],[0.666,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.78,-0.153],[0,0],[0.697,1.379],[4.157,-1.541]],"v":[[12.618,-2.318],[9.018,-2.628],[3.509,-2.29],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[196.17,62.804],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 29","np":2,"cix":2,"bm":0,"ix":29,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.604],[-4.206,5.402],[-6.296,-4.891],[-2.884,-7.155],[2.205,-6.718],[4.031,-5.516],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[189.181,70.551],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 30","np":2,"cix":2,"bm":0,"ix":30,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[201.054,68.066],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 31","np":2,"cix":2,"bm":0,"ix":31,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.352,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[196.765,66.368],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 32","np":2,"cix":2,"bm":0,"ix":32,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.154],[0,0],[0.155,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.481],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.347,7.909],[-7.805,8.501],[7.578,4.35],[9.483,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[203.037,69.18],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 33","np":2,"cix":2,"bm":0,"ix":33,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.182,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[199.337,67.293],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 34","np":2,"cix":2,"bm":0,"ix":34,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.881,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.893,65.642],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 35","np":2,"cix":2,"bm":0,"ix":35,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.375],[0.666,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.78,-0.153],[0,0],[0.697,1.379],[4.157,-1.541]],"v":[[12.618,-2.318],[9.018,-2.628],[3.509,-2.29],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[147.672,38.223],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 36","np":2,"cix":2,"bm":0,"ix":36,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.085],[0,0],[-0.247,-1.215],[0,0],[0.981,0.084],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.155],[2.205,-6.717],[4.031,-5.516],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[140.683,45.97],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 37","np":2,"cix":2,"bm":0,"ix":37,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.556,43.485],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 38","np":2,"cix":2,"bm":0,"ix":38,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.352,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[148.267,41.787],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 39","np":2,"cix":2,"bm":0,"ix":39,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.154],[0,0],[0.155,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.347,7.91],[-7.805,8.501],[7.578,4.35],[9.483,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[154.539,44.599],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 40","np":2,"cix":2,"bm":0,"ix":40,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.182,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[150.839,42.712],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 41","np":2,"cix":2,"bm":0,"ix":41,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.881,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.395,41.061],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 42","np":2,"cix":2,"bm":0,"ix":42,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[199.372,28.672],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 43","np":2,"cix":2,"bm":0,"ix":43,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[189.87,39.47],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 44","np":2,"cix":2,"bm":0,"ix":44,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.736,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[202.199,40.117],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 45","np":2,"cix":2,"bm":0,"ix":45,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[198.719,35.872],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 46","np":2,"cix":2,"bm":0,"ix":46,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[202.557,42.34],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 47","np":2,"cix":2,"bm":0,"ix":47,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[200.937,38.292],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 48","np":2,"cix":2,"bm":0,"ix":48,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[197.433,33.969],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 49","np":2,"cix":2,"bm":0,"ix":49,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.935],[-1.856,-0.177]],"o":[[0,0],[-1.631,-0.953],[0,0],[0.185,2.372],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.324],[-5.456,2.917]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[206.561,46.141],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 50","np":2,"cix":2,"bm":0,"ix":50,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.525],[0,0],[0.185,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.466,8.817],[-5.778,6.256],[-4.204,-10.188],[-0.197,-12.24],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[197.059,56.94],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 51","np":2,"cix":2,"bm":0,"ix":51,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.388,57.587],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 52","np":2,"cix":2,"bm":0,"ix":52,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[205.908,53.341],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 53","np":2,"cix":2,"bm":0,"ix":53,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.074,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.615,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[209.746,59.809],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 54","np":2,"cix":2,"bm":0,"ix":54,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[208.126,55.761],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 55","np":2,"cix":2,"bm":0,"ix":55,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.228],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.811],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[204.622,51.438],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 56","np":2,"cix":2,"bm":0,"ix":56,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[192.536,44.836],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 57","np":2,"cix":2,"bm":0,"ix":57,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[183.034,55.635],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 58","np":2,"cix":2,"bm":0,"ix":58,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.362,56.282],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 59","np":2,"cix":2,"bm":0,"ix":59,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[191.882,52.036],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 60","np":2,"cix":2,"bm":0,"ix":60,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[195.721,58.504],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 61","np":2,"cix":2,"bm":0,"ix":61,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[194.1,54.456],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 62","np":2,"cix":2,"bm":0,"ix":62,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[190.596,50.133],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 63","np":2,"cix":2,"bm":0,"ix":63,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[178.009,19.378],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 64","np":2,"cix":2,"bm":0,"ix":64,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.186,-1.943],[0,0],[0.899,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.205,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[168.507,30.177],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 65","np":2,"cix":2,"bm":0,"ix":65,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[180.836,30.824],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 66","np":2,"cix":2,"bm":0,"ix":66,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[177.356,26.578],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 67","np":2,"cix":2,"bm":0,"ix":67,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[181.194,33.046],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 68","np":2,"cix":2,"bm":0,"ix":68,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[179.573,28.998],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 69","np":2,"cix":2,"bm":0,"ix":69,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.07,24.675],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 70","np":2,"cix":2,"bm":0,"ix":70,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.896,55.196],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 71","np":2,"cix":2,"bm":0,"ix":71,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[167.394,65.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 72","np":2,"cix":2,"bm":0,"ix":72,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[179.723,66.642],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 73","np":2,"cix":2,"bm":0,"ix":73,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[176.243,62.397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 74","np":2,"cix":2,"bm":0,"ix":74,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.766,-0.074],[0,0],[-0.117,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.161],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[180.081,68.864],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 75","np":2,"cix":2,"bm":0,"ix":75,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[178.461,64.816],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 76","np":2,"cix":2,"bm":0,"ix":76,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[174.957,60.493],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 77","np":2,"cix":2,"bm":0,"ix":77,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.667,-1.766],[-1.57,-1.6],[-0.659,1.744]],"o":[[0,0],[-1.347,1.323],[0,0],[2.337,0.445],[0.543,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.514,-4.388],[-4.727,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[157.324,46.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 78","np":2,"cix":2,"bm":0,"ix":78,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.533,-0.523],[0,0],[0.973,0.367],[0,0],[-1.392,1.367],[0,0],[-0.973,-0.367],[0,0]],"o":[[0,0],[-0.743,0.729],[0,0],[-1.826,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.877,1.122],[7.181,6.715],[4.366,7.309],[-11.089,1.475],[-12.018,-2.931],[-8.164,-6.716],[-5.349,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[165.258,57.744],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 79","np":2,"cix":2,"bm":0,"ix":79,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.039,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[168.591,46.183],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 80","np":2,"cix":2,"bm":0,"ix":80,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.773,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[163.574,48.423],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 81","np":2,"cix":2,"bm":0,"ix":81,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.597,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.435,-1.152],[0,0],[-0.772,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.184,-3.788],[7.884,-6.663],[-7.425,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[173.499,46.397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 82","np":2,"cix":2,"bm":0,"ix":82,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.093,-5.361],[1.121,8.386],[5.432,10.014],[-3.619,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[166.198,46.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 83","np":2,"cix":2,"bm":0,"ix":83,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.153,-0.436],[0,0],[0,0]],"o":[[-0.435,1.153],[0,0],[0,0],[0,0]],"v":[[-3.016,0.17],[-1.716,3.046],[3.451,4.997],[-1.065,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[160.895,49.178],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 84","np":2,"cix":2,"bm":0,"ix":84,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.307],[-0.728,-2.12],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.806]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.58],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.416,61.216],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 85","np":2,"cix":2,"bm":0,"ix":85,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.242],[0,0],[0.721,0.751],[0,0],[-1.845,0.635],[0,0],[-0.721,-0.751],[0,0]],"o":[[0,0],[-0.985,0.338],[0,0],[-1.35,-1.408],[0,0],[0.984,-0.339],[0,0],[0.517,0.539]],"v":[[11.106,6.769],[3.557,9.365],[0.76,8.688],[-10.677,-3.232],[-9.619,-7.608],[-4.51,-9.364],[-1.714,-8.687],[11.51,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[154.246,73.901],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 86","np":2,"cix":2,"bm":0,"ix":86,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.37,0.09]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.722],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[161.685,65.394],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 87","np":2,"cix":2,"bm":0,"ix":87,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.71],[-1.255,5.254],[0.945,7.546],[1.255,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[156.182,65.245],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 88","np":2,"cix":2,"bm":0,"ix":88,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.748,-0.182],[0,0],[0,0],[-0.555,0.533],[0,0],[0.853,0.889],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.852],[0,0],[-0.571,-0.594]],"v":[[-6.891,-14.039],[-7.429,11.99],[-5.84,13.647],[-3.869,13.688],[6.511,1.536],[6.576,-1.617],[-4.753,-13.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[169.945,66.419],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 89","np":2,"cix":2,"bm":0,"ix":89,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.432],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.918,65.13],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 90","np":2,"cix":2,"bm":0,"ix":90,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.889],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.659],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[152.701,65.017],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 91","np":2,"cix":2,"bm":0,"ix":91,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.044,0.176],[0.836,-1.777],[-1.031,-0.174]],"o":[[0,0],[-0.825,-0.887],[0,0],[-0.136,2.183],[2.589,-0.573]],"v":[[6.943,3.07],[5.274,1.277],[2.438,-0.335],[-6.807,-1.293],[-3.214,2.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.144,32.637],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 92","np":2,"cix":2,"bm":0,"ix":92,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.326,0.351],[0,0],[-0.16,0.953],[0,0],[-0.852,-0.916],[0,0],[0.161,-0.953],[0,0]],"o":[[0,0],[-0.454,-0.489],[0,0],[0.302,-1.787],[0,0],[0.455,0.489],[0,0],[-0.116,0.684]],"v":[[0.034,11.838],[-3.454,8.089],[-3.936,5.725],[-1.379,-9.407],[1.094,-11.274],[3.452,-8.738],[3.934,-6.373],[0.98,11.124]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[96.881,42.526],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 93","np":2,"cix":2,"bm":0,"ix":93,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.225,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.152,-0.206]],"v":[[5.946,-7.683],[4.975,-7.847],[-6.022,4.937],[-6.514,7.847],[6.514,-7.296]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.719,43.181],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 94","np":2,"cix":2,"bm":0,"ix":94,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.67,-4.398],[2.204,-4.645],[-3.283,1.734],[-3.775,4.645],[3.775,-4.132]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.184,39.252],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 95","np":2,"cix":2,"bm":0,"ix":95,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.308,0.416],[0,0],[0,0],[-0.426,-0.071],[0,0],[-0.191,1.129],[0,0]],"o":[[0,0],[0,0],[-0.119,0.706],[0,0],[0.682,0.116],[0,0],[0.128,-0.755]],"v":[[6.527,-9.403],[-6.501,5.741],[-6.855,7.843],[-6.301,9.25],[2.736,9.287],[4.315,7.451],[6.846,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.706,45.287],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 96","np":2,"cix":2,"bm":0,"ix":96,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.66,-6.632],[2.764,-6.366],[-4.785,2.41],[-5.499,6.632],[5.499,-6.153]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[103.195,41.486],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 97","np":2,"cix":2,"bm":0,"ix":97,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.191,-1.129],[0,0],[0,0]],"o":[[-0.681,-0.114],[0,0],[0,0],[0,0]],"v":[[-0.31,-3.391],[-1.889,-1.555],[-2.743,3.505],[2.743,-2.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[101.645,37.481],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 98","np":2,"cix":2,"bm":0,"ix":98,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.21],[0.141,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.771,-2.409],[-7.199,0.02],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.199,9.759],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 99","np":2,"cix":2,"bm":0,"ix":99,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.192,-0.948],[0,0]],"o":[[0,0],[-0.6,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.6,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.325,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.805],[0.071,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.537,19.911],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 100","np":2,"cix":2,"bm":0,"ix":100,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.017,-9.266],[-3.65,6.615],[-3.062,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[123.947,18.328],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 101","np":2,"cix":2,"bm":0,"ix":101,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.096,15.192],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 102","np":2,"cix":2,"bm":0,"ix":102,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.423,0.085],[0,0],[0.228,1.123],[0,0]],"o":[[0,0],[0,0],[0.142,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.244,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.967],[4.426,7.752],[5.24,5.471],[2.214,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[126.353,20.074],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 103","np":2,"cix":2,"bm":0,"ix":103,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.368],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[122.705,17.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 104","np":2,"cix":2,"bm":0,"ix":104,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.228,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.647,13.894],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 105","np":2,"cix":2,"bm":0,"ix":105,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.851,-0.376],[0.666,-1.455],[-1.828,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.317],[9.017,-2.627],[3.507,-2.289],[-12.618,1.402],[-4.829,2.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.211,53.429],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 106","np":2,"cix":2,"bm":0,"ix":106,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.704,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.156],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[139.222,61.176],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 107","np":2,"cix":2,"bm":0,"ix":107,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.4,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.207,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.095,58.691],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 108","np":2,"cix":2,"bm":0,"ix":108,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.913],[-4.753,2.461],[-4.352,4.441],[4.753,-4.329]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.807,56.992],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 109","np":2,"cix":2,"bm":0,"ix":109,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.153],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.481],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.654],[-9.638,6.48],[-9.347,7.909],[-7.805,8.501],[7.578,4.351],[9.482,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[153.078,59.805],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 110","np":2,"cix":2,"bm":0,"ix":110,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.367],[2.182,-5.254],[-6.923,3.516],[-6.34,6.388],[6.923,-6.388]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149.378,57.918],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 111","np":2,"cix":2,"bm":0,"ix":111,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.246],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.253],[-2.881,3.187],[3.737,-3.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[144.935,56.266],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 112","np":2,"cix":2,"bm":0,"ix":112,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.851,-0.376],[0.667,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.698,1.379],[4.158,-1.541]],"v":[[12.618,-2.318],[9.018,-2.628],[3.508,-2.29],[-12.618,1.402],[-4.83,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.72,48.604],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 113","np":2,"cix":2,"bm":0,"ix":113,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.704,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.159],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.466]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.403],[-6.296,-4.89],[-2.884,-7.154],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.731,56.351],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 114","np":2,"cix":2,"bm":0,"ix":114,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.207,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.603,53.866],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 115","np":2,"cix":2,"bm":0,"ix":115,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.351,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[96.315,52.168],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 116","np":2,"cix":2,"bm":0,"ix":116,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.755,0.154],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.098,0.481],[0,0],[1.207,-0.245],[0,0],[-0.104,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.348,7.909],[-7.805,8.501],[7.578,4.35],[9.482,2.517],[7.411,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.587,54.98],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 117","np":2,"cix":2,"bm":0,"ix":117,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.181,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.887,53.093],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 118","np":2,"cix":2,"bm":0,"ix":118,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.157,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.675,-2.088],[-3.58,-0.254],[-2.882,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.443,51.442],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 119","np":2,"cix":2,"bm":0,"ix":119,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.953],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[148.304,18.612],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 120","np":2,"cix":2,"bm":0,"ix":120,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.256],[-4.204,-10.188],[-0.198,-12.24],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[138.802,29.411],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 121","np":2,"cix":2,"bm":0,"ix":121,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.131,30.058],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 122","np":2,"cix":2,"bm":0,"ix":122,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[147.651,25.812],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 123","np":2,"cix":2,"bm":0,"ix":123,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[151.489,32.28],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 124","np":2,"cix":2,"bm":0,"ix":124,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[149.869,28.232],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 125","np":2,"cix":2,"bm":0,"ix":125,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.364,23.909],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 126","np":2,"cix":2,"bm":0,"ix":126,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[164.691,40.021],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 127","np":2,"cix":2,"bm":0,"ix":127,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[155.189,50.82],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 128","np":2,"cix":2,"bm":0,"ix":128,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[167.518,51.467],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 129","np":2,"cix":2,"bm":0,"ix":129,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[164.038,47.221],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 130","np":2,"cix":2,"bm":0,"ix":130,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[167.876,53.689],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 131","np":2,"cix":2,"bm":0,"ix":131,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[166.256,49.641],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 132","np":2,"cix":2,"bm":0,"ix":132,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.117,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[162.752,45.319],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 133","np":2,"cix":2,"bm":0,"ix":133,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.177]],"o":[[0,0],[-1.631,-0.953],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.917]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.546,57.432],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 134","np":2,"cix":2,"bm":0,"ix":134,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.256],[-4.204,-10.188],[-0.197,-12.24],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[123.044,68.231],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 135","np":2,"cix":2,"bm":0,"ix":135,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.373,68.878],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 136","np":2,"cix":2,"bm":0,"ix":136,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.515,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[131.893,64.632],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 137","np":2,"cix":2,"bm":0,"ix":137,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.731,71.1],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 138","np":2,"cix":2,"bm":0,"ix":138,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.111,67.053],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 139","np":2,"cix":2,"bm":0,"ix":139,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.607,62.73],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 140","np":2,"cix":2,"bm":0,"ix":140,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.131,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.184,2.371],[4.464,-0.65]],"v":[[12.574,3.259],[9.277,1.333],[3.949,-0.387],[-12.574,-1.323],[-5.457,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.695,25.331],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 141","np":2,"cix":2,"bm":0,"ix":141,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[125.193,36.13],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 142","np":2,"cix":2,"bm":0,"ix":142,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.522,36.777],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 143","np":2,"cix":2,"bm":0,"ix":143,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.042,32.532],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 144","np":2,"cix":2,"bm":0,"ix":144,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.074,0.767],[0,0],[1.228,0.118],[0,0],[0.079,-0.822]],"v":[[9.682,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.16],[6.618,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[137.88,38.999],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 145","np":2,"cix":2,"bm":0,"ix":145,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[136.26,34.951],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 146","np":2,"cix":2,"bm":0,"ix":146,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.755,30.628],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 147","np":2,"cix":2,"bm":0,"ix":147,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[143.076,59.34],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 148","np":2,"cix":2,"bm":0,"ix":148,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.376],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.072,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.513],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[133.574,70.139],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 149","np":2,"cix":2,"bm":0,"ix":149,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.736,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[145.903,70.786],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 150","np":2,"cix":2,"bm":0,"ix":150,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[142.423,66.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 151","np":2,"cix":2,"bm":0,"ix":151,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.766,-0.074],[0,0],[-0.118,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.821]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.161],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[146.261,73.008],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 152","np":2,"cix":2,"bm":0,"ix":152,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[144.641,68.96],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 153","np":2,"cix":2,"bm":0,"ix":153,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[141.136,64.637],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 154","np":2,"cix":2,"bm":0,"ix":154,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.667,-1.766],[-1.57,-1.6],[-0.659,1.744]],"o":[[0,0],[-1.347,1.323],[0,0],[2.337,0.445],[0.543,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.514,-4.388],[-4.727,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[104.315,46.308],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 155","np":2,"cix":2,"bm":0,"ix":155,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.533,-0.523],[0,0],[0.973,0.367],[0,0],[-1.392,1.367],[0,0],[-0.974,-0.367],[0,0]],"o":[[0,0],[-0.743,0.729],[0,0],[-1.826,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.877,1.122],[7.181,6.715],[4.366,7.309],[-11.089,1.475],[-12.018,-2.931],[-8.163,-6.716],[-5.348,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.249,57.744],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 156","np":2,"cix":2,"bm":0,"ix":156,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.04,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[115.582,46.183],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 157","np":2,"cix":2,"bm":0,"ix":157,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.773,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.565,48.423],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 158","np":2,"cix":2,"bm":0,"ix":158,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.596,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.436,-1.152],[0,0],[-0.771,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.183,-3.788],[7.884,-6.663],[-7.426,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.491,46.397],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 159","np":2,"cix":2,"bm":0,"ix":159,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.094,-5.361],[1.12,8.386],[5.432,10.014],[-3.62,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[113.189,46.91],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 160","np":2,"cix":2,"bm":0,"ix":160,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.153,-0.436],[0,0],[0,0]],"o":[[-0.436,1.153],[0,0],[0,0],[0,0]],"v":[[-3.015,0.17],[-1.717,3.046],[3.452,4.997],[-1.066,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[107.886,49.178],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 161","np":2,"cix":2,"bm":0,"ix":161,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.306],[-0.728,-2.121],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.807]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.581],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[92.747,62.314],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 162","np":2,"cix":2,"bm":0,"ix":162,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.243],[0,0],[0.721,0.751],[0,0],[-1.845,0.634],[0,0],[-0.72,-0.751],[0,0]],"o":[[0,0],[-0.984,0.339],[0,0],[-1.351,-1.407],[0,0],[0.985,-0.338],[0,0],[0.516,0.538]],"v":[[11.107,6.769],[3.556,9.364],[0.761,8.687],[-10.676,-3.233],[-9.618,-7.608],[-4.509,-9.365],[-1.713,-8.688],[11.512,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.576,74.998],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 163","np":2,"cix":2,"bm":0,"ix":163,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.369,0.091]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.721],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.016,66.491],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 164","np":2,"cix":2,"bm":0,"ix":164,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.711],[-1.255,5.253],[0.945,7.546],[1.255,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[96.513,66.342],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 165","np":2,"cix":2,"bm":0,"ix":165,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.748,-0.182],[0,0],[0,0],[-0.556,0.533],[0,0],[0.853,0.89],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.853],[0,0],[-0.571,-0.595]],"v":[[-6.891,-14.039],[-7.429,11.99],[-5.84,13.647],[-3.868,13.688],[6.511,1.537],[6.576,-1.618],[-4.753,-13.425]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.276,67.516],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 166","np":2,"cix":2,"bm":0,"ix":166,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.431],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.249,66.227],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 167","np":2,"cix":2,"bm":0,"ix":167,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.888],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.658],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.032,66.114],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 168","np":2,"cix":2,"bm":0,"ix":168,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.211],[0.141,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.088],[2.209,-1.465]],"v":[[7.199,-0.849],[4.998,-1.922],[1.771,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.746,2.869],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 169","np":2,"cix":2,"bm":0,"ix":169,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.193,0.947],[0,0],[-1.124,-0.549],[0,0],[-0.192,-0.948],[0,0]],"o":[[0,0],[-0.599,-0.293],[0,0],[-0.36,-1.777],[0,0],[0.6,0.292],[0,0],[0.138,0.68]],"v":[[4.276,11.144],[-0.326,8.899],[-1.625,6.865],[-4.68,-8.174],[-3.043,-10.805],[0.071,-9.286],[1.37,-7.252],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[66.084,13.023],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 170","np":2,"cix":2,"bm":0,"ix":170,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.266],[-3.65,6.615],[-3.062,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.494,11.44],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 171","np":2,"cix":2,"bm":0,"ix":171,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.643,8.303],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 172","np":2,"cix":2,"bm":0,"ix":172,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.423,0.085],[0,0],[0.228,1.123],[0,0]],"o":[[0,0],[0,0],[0.142,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.244,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.967],[4.426,7.752],[5.24,5.471],[2.214,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[74.9,13.185],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 173","np":2,"cix":2,"bm":0,"ix":173,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.368],[0.631,-7.158],[-3.259,3.745],[-2.408,7.941],[3.259,-7.941]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[71.251,10.115],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 174","np":2,"cix":2,"bm":0,"ix":174,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.228,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.193,7.005],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 175","np":2,"cix":2,"bm":0,"ix":175,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.376],[0.666,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.78,-0.153],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.317],[9.018,-2.627],[3.509,-2.289],[-12.618,1.402],[-4.829,2.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[114.02,46.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 176","np":2,"cix":2,"bm":0,"ix":176,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.248,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.38,6.605],[-4.205,5.402],[-6.295,-4.89],[-2.884,-7.156],[2.206,-6.717],[4.032,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[107.032,54.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 177","np":2,"cix":2,"bm":0,"ix":177,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[118.904,51.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 178","np":2,"cix":2,"bm":0,"ix":178,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.913],[-4.753,2.461],[-4.352,4.441],[4.753,-4.329]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[114.616,50.201],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 179","np":2,"cix":2,"bm":0,"ix":179,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.153],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.654],[-9.638,6.48],[-9.347,7.909],[-7.805,8.501],[7.578,4.351],[9.482,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.888,53.014],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 180","np":2,"cix":2,"bm":0,"ix":180,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.367],[2.182,-5.254],[-6.923,3.516],[-6.34,6.388],[6.923,-6.388]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.187,51.127],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 181","np":2,"cix":2,"bm":0,"ix":181,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.246],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.253],[-2.881,3.187],[3.737,-3.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.744,49.475],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 182","np":2,"cix":2,"bm":0,"ix":182,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.851,-0.376],[0.666,-1.455],[-1.828,0.371]],"o":[[0,0],[-1.779,-0.152],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.318],[9.017,-2.628],[3.507,-2.289],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.287,26.502],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 183","np":2,"cix":2,"bm":0,"ix":183,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.704,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.085],[0,0],[-0.247,-1.215],[0,0],[0.981,0.084],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.155],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.299,34.249],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 184","np":2,"cix":2,"bm":0,"ix":184,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.207,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.171,31.764],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 185","np":2,"cix":2,"bm":0,"ix":185,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.462,-4.441],[1.864,-3.914],[-4.754,2.461],[-4.351,4.441],[4.754,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.883,30.066],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 186","np":2,"cix":2,"bm":0,"ix":186,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.107],[0,0],[0,0],[-0.754,0.154],[0,0],[0.156,0.768],[0,0]],"o":[[0,0],[0,0],[0.098,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.515]],"v":[[6.073,-8.654],[-9.638,6.479],[-9.348,7.909],[-7.805,8.5],[7.578,4.35],[9.482,2.516],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.155,32.878],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 187","np":2,"cix":2,"bm":0,"ix":187,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.183,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[68.454,30.991],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 188","np":2,"cix":2,"bm":0,"ix":188,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.883,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.011,29.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 189","np":2,"cix":2,"bm":0,"ix":189,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.131,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.184,2.371],[4.464,-0.65]],"v":[[12.574,3.259],[9.277,1.333],[3.949,-0.387],[-12.574,-1.323],[-5.457,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.998,19.429],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 190","np":2,"cix":2,"bm":0,"ix":190,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.953],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[108.496,30.228],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 191","np":2,"cix":2,"bm":0,"ix":191,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[120.824,30.874],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 192","np":2,"cix":2,"bm":0,"ix":192,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[117.345,26.629],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 193","np":2,"cix":2,"bm":0,"ix":193,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[121.183,33.096],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 194","np":2,"cix":2,"bm":0,"ix":194,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[119.562,29.049],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 195","np":2,"cix":2,"bm":0,"ix":195,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[116.058,24.726],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 196","np":2,"cix":2,"bm":0,"ix":196,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[132.5,33.23],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 197","np":2,"cix":2,"bm":0,"ix":197,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.186,-1.943],[0,0],[0.899,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.205,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[122.998,44.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 198","np":2,"cix":2,"bm":0,"ix":198,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.327,44.676],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 199","np":2,"cix":2,"bm":0,"ix":199,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[131.847,40.43],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 200","np":2,"cix":2,"bm":0,"ix":200,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[135.685,46.898],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 201","np":2,"cix":2,"bm":0,"ix":201,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[134.065,42.85],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 202","np":2,"cix":2,"bm":0,"ix":202,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.561,38.528],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 203","np":2,"cix":2,"bm":0,"ix":203,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.953],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[110.443,42.019],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 204","np":2,"cix":2,"bm":0,"ix":204,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.035],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.466,8.818],[-5.778,6.257],[-4.204,-10.188],[-0.197,-12.24],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[100.941,52.818],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 205","np":2,"cix":2,"bm":0,"ix":205,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[113.27,53.465],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 206","np":2,"cix":2,"bm":0,"ix":206,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[109.79,49.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 207","np":2,"cix":2,"bm":0,"ix":207,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.074,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.615,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[113.628,55.687],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 208","np":2,"cix":2,"bm":0,"ix":208,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[112.008,51.64],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 209","np":2,"cix":2,"bm":0,"ix":209,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[108.503,47.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 210","np":2,"cix":2,"bm":0,"ix":210,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.756,0.694],[1.624,-1.546],[-1.734,-0.685]],"o":[[0,0],[-1.303,-1.367],[0,0],[-0.479,2.33],[4.469,0.61]],"v":[[11.688,6.457],[9.052,3.693],[4.409,0.565],[-11.209,-4.911],[-5.544,1.136]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.13,34.553],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 211","np":2,"cix":2,"bm":0,"ix":211,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.515,0.54],[0,0],[-0.381,0.968],[0,0],[-1.346,-1.413],[0,0],[0.382,-0.967],[0,0]],"o":[[0,0],[-0.718,-0.754],[0,0],[0.717,-1.814],[0,0],[0.718,0.753],[0,0],[-0.273,0.694]],"v":[[-1.323,12.852],[-6.831,7.072],[-7.382,4.248],[-1.315,-11.118],[3.103,-11.979],[6.829,-8.068],[7.38,-5.245],[0.366,12.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.613,42.306],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 212","np":2,"cix":2,"bm":0,"ix":212,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.379,0.149],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.235,-0.298]],"v":[[11.019,-5.208],[9.386,-5.853],[-10.774,2.896],[-11.941,5.853],[11.941,-4.513]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.103,45.786],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 213","np":2,"cix":2,"bm":0,"ix":213,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[6.772,-2.688],[4.306,-3.661],[-5.754,0.705],[-6.92,3.661],[6.92,-2.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.941,40.736],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 214","np":2,"cix":2,"bm":0,"ix":214,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.477,0.604],[0,0],[0,0],[-0.717,-0.284],[0,0],[-0.452,1.146],[0,0]],"o":[[0,0],[0,0],[-0.282,0.717],[0,0],[1.146,0.453],[0,0],[0.303,-0.766]],"v":[[12.186,-9.565],[-11.696,0.799],[-12.54,2.935],[-11.754,4.745],[3.617,9.112],[6.511,7.855],[12.519,-7.366]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.859,50.839],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 215","np":2,"cix":2,"bm":0,"ix":215,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.304,-5.318],[5.452,-4.975],[-8.388,1.031],[-10.08,5.318],[10.08,-3.431]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.409,43.366],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 216","np":2,"cix":2,"bm":0,"ix":216,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.453,-1.146],[0,0],[0,0]],"o":[[-1.146,-0.452],[0,0],[0,0],[0,0]],"v":[[-0.107,-2.971],[-3.002,-1.715],[-5.03,3.423],[5.03,-0.943]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.217,38.018],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 217","np":2,"cix":2,"bm":0,"ix":217,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[92.809,12.587],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 218","np":2,"cix":2,"bm":0,"ix":218,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.466,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.307,23.386],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 219","np":2,"cix":2,"bm":0,"ix":219,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.636,24.033],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 220","np":2,"cix":2,"bm":0,"ix":220,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[92.156,19.787],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 221","np":2,"cix":2,"bm":0,"ix":221,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.994,26.255],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 222","np":2,"cix":2,"bm":0,"ix":222,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[94.374,22.207],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 223","np":2,"cix":2,"bm":0,"ix":223,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[90.87,17.884],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 224","np":2,"cix":2,"bm":0,"ix":224,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.894,46.991],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 225","np":2,"cix":2,"bm":0,"ix":225,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.035],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.953],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.392,57.79],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 226","np":2,"cix":2,"bm":0,"ix":226,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[98.721,58.437],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 227","np":2,"cix":2,"bm":0,"ix":227,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[95.241,54.192],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 228","np":2,"cix":2,"bm":0,"ix":228,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[99.079,60.659],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 229","np":2,"cix":2,"bm":0,"ix":229,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[97.459,56.611],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 230","np":2,"cix":2,"bm":0,"ix":230,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[93.955,52.288],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 231","np":2,"cix":2,"bm":0,"ix":231,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.666,-1.766],[-1.571,-1.6],[-0.659,1.744]],"o":[[0,0],[-1.347,1.323],[0,0],[2.336,0.445],[0.543,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.516,-4.388],[-4.726,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.125,39.517],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 232","np":2,"cix":2,"bm":0,"ix":232,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.533,-0.523],[0,0],[0.973,0.367],[0,0],[-1.392,1.367],[0,0],[-0.974,-0.367],[0,0]],"o":[[0,0],[-0.743,0.729],[0,0],[-1.826,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.877,1.122],[7.181,6.715],[4.366,7.309],[-11.089,1.475],[-12.018,-2.931],[-8.163,-6.716],[-5.348,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80.058,50.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 233","np":2,"cix":2,"bm":0,"ix":233,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.039,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[83.392,39.392],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 234","np":2,"cix":2,"bm":0,"ix":234,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.773,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.375,41.632],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 235","np":2,"cix":2,"bm":0,"ix":235,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.596,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.435,-1.152],[0,0],[-0.772,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.184,-3.788],[7.884,-6.663],[-7.425,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[88.3,39.606],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 236","np":2,"cix":2,"bm":0,"ix":236,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.094,-5.361],[1.12,8.386],[5.432,10.014],[-3.62,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[80.999,40.119],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 237","np":2,"cix":2,"bm":0,"ix":237,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.154,-0.436],[0,0],[0,0]],"o":[[-0.435,1.153],[0,0],[0,0],[0,0]],"v":[[-3.016,0.17],[-1.716,3.046],[3.451,4.997],[-1.066,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.696,42.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 238","np":2,"cix":2,"bm":0,"ix":238,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.307],[-0.728,-2.12],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.806]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.58],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.101,56.453],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 239","np":2,"cix":2,"bm":0,"ix":239,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.243],[0,0],[0.721,0.751],[0,0],[-1.845,0.634],[0,0],[-0.721,-0.751],[0,0]],"o":[[0,0],[-0.984,0.338],[0,0],[-1.351,-1.408],[0,0],[0.984,-0.339],[0,0],[0.517,0.538]],"v":[[11.106,6.769],[3.556,9.365],[0.76,8.688],[-10.677,-3.232],[-9.618,-7.608],[-4.509,-9.364],[-1.713,-8.687],[11.511,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[70.93,69.138],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 240","np":2,"cix":2,"bm":0,"ix":240,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.37,0.09]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.721],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.37,60.632],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 241","np":2,"cix":2,"bm":0,"ix":241,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.71],[-1.256,5.254],[0.944,7.546],[1.256,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[72.867,60.482],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 242","np":2,"cix":2,"bm":0,"ix":242,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.747,-0.183],[0,0],[0,0],[-0.555,0.533],[0,0],[0.853,0.889],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.852],[0,0],[-0.571,-0.594]],"v":[[-6.891,-14.038],[-7.429,11.99],[-5.84,13.647],[-3.869,13.688],[6.511,1.537],[6.576,-1.617],[-4.753,-13.425]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[86.63,61.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 243","np":2,"cix":2,"bm":0,"ix":243,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.431],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[75.603,60.367],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 244","np":2,"cix":2,"bm":0,"ix":244,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.889],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.659],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.386,60.254],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 245","np":2,"cix":2,"bm":0,"ix":245,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.037,-0.211],[0.142,-1.957],[-1.025,0.208]],"o":[[0,0],[-1.089,-0.531],[0,0],[0.658,2.087],[2.209,-1.466]],"v":[[7.199,-0.85],[4.998,-1.923],[1.771,-2.409],[-7.199,0.021],[-2.428,2.411]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[31.254,12.514],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 246","np":2,"cix":2,"bm":0,"ix":246,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.43,0.21],[0,0],[0.192,0.947],[0,0],[-1.125,-0.549],[0,0],[-0.193,-0.947],[0,0]],"o":[[0,0],[-0.6,-0.292],[0,0],[-0.36,-1.777],[0,0],[0.601,0.293],[0,0],[0.138,0.68]],"v":[[4.276,11.143],[-0.326,8.898],[-1.625,6.865],[-4.68,-8.175],[-3.043,-10.805],[0.07,-9.287],[1.37,-7.253],[4.902,10.137]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.592,22.667],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 247","np":2,"cix":2,"bm":0,"ix":247,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.224,-0.046],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.216,-0.136]],"v":[[2.981,-9.463],[2.016,-9.268],[-3.65,6.615],[-3.063,9.508],[3.65,-9.307]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.003,21.084],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 248","np":2,"cix":2,"bm":0,"ix":248,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[2.046,-5.557],[0.589,-5.26],[-2.239,2.665],[-1.651,5.557],[2.239,-5.346]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[32.151,17.947],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 249","np":2,"cix":2,"bm":0,"ix":249,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.437,0.277],[0,0],[0,0],[-0.422,0.086],[0,0],[0.228,1.122],[0,0]],"o":[[0,0],[0,0],[0.143,0.701],[0,0],[0.677,-0.138],[0,0],[-0.153,-0.751]],"v":[[1.245,-11.052],[-5.468,7.762],[-5.044,9.852],[-4.02,10.966],[4.427,7.752],[5.24,5.471],[2.215,-9.426]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.407,22.83],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 250","np":2,"cix":2,"bm":0,"ix":250,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.438,-7.369],[0.631,-7.158],[-3.259,3.744],[-2.408,7.942],[3.259,-7.942]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[33.759,19.759],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 251","np":2,"cix":2,"bm":0,"ix":251,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.229,-1.122],[0,0],[0,0]],"o":[[-0.677,0.138],[0,0],[0,0],[0,0]],"v":[[-0.996,-3.347],[-1.81,-1.066],[-0.789,3.963],[2.039,-3.963]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.701,16.649],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 252","np":2,"cix":2,"bm":0,"ix":252,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.376],[0.667,-1.455],[-1.827,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.698,1.378],[4.158,-1.541]],"v":[[12.618,-2.317],[9.018,-2.627],[3.508,-2.289],[-12.618,1.402],[-4.83,2.12]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.012,46.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 253","np":2,"cix":2,"bm":0,"ix":253,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.132,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.084],[0,0],[-0.247,-1.214],[0,0],[0.981,0.085],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.381,6.605],[-4.206,5.402],[-6.296,-4.89],[-2.884,-7.156],[2.207,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[54.023,54.385],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 254","np":2,"cix":2,"bm":0,"ix":254,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.054]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[65.895,51.9],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 255","np":2,"cix":2,"bm":0,"ix":255,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.913],[-4.753,2.461],[-4.352,4.441],[4.753,-4.329]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.607,50.201],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 256","np":2,"cix":2,"bm":0,"ix":256,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.153],[0,0],[0.155,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.654],[-9.638,6.48],[-9.347,7.909],[-7.805,8.501],[7.578,4.351],[9.483,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[67.879,53.014],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 257","np":2,"cix":2,"bm":0,"ix":257,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.367],[2.182,-5.254],[-6.923,3.516],[-6.339,6.388],[6.923,-6.388]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[64.178,51.127],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 258","np":2,"cix":2,"bm":0,"ix":258,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.246],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.253],[-2.881,3.187],[3.737,-3.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59.735,49.475],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 259","np":2,"cix":2,"bm":0,"ix":259,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.85,-0.375],[0.666,-1.456],[-1.827,0.371]],"o":[[0,0],[-1.779,-0.153],[0,0],[0.697,1.378],[4.157,-1.541]],"v":[[12.618,-2.318],[9.017,-2.628],[3.509,-2.29],[-12.618,1.402],[-4.829,2.119]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[13.952,39.656],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 260","np":2,"cix":2,"bm":0,"ix":260,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.703,0.061],[0,0],[0.132,0.649],[0,0],[-1.839,-0.158],[0,0],[-0.131,-0.648],[0,0]],"o":[[0,0],[-0.981,-0.085],[0,0],[-0.248,-1.215],[0,0],[0.981,0.084],[0,0],[0.094,0.465]],"v":[[5.144,7.252],[-2.38,6.605],[-4.205,5.402],[-6.295,-4.89],[-2.884,-7.155],[2.206,-6.717],[4.031,-5.515],[6.449,6.386]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[6.963,47.403],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 261","np":2,"cix":2,"bm":0,"ix":261,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.399,-0.081],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.346,-0.053]],"v":[[6.927,-7.511],[5.206,-7.161],[-8.056,5.614],[-7.655,7.593],[8.056,-7.54]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[18.836,44.918],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 262","np":2,"cix":2,"bm":0,"ix":262,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[4.463,-4.441],[1.865,-3.914],[-4.753,2.461],[-4.352,4.441],[4.753,-4.33]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[14.547,43.22],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 263","np":2,"cix":2,"bm":0,"ix":263,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.701,0.108],[0,0],[0,0],[-0.754,0.154],[0,0],[0.156,0.767],[0,0]],"o":[[0,0],[0,0],[0.097,0.48],[0,0],[1.208,-0.245],[0,0],[-0.105,-0.514]],"v":[[6.073,-8.655],[-9.638,6.479],[-9.347,7.91],[-7.805,8.501],[7.578,4.35],[9.482,2.517],[7.412,-7.678]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[20.819,46.032],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 264","np":2,"cix":2,"bm":0,"ix":264,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[1.891,-5.366],[2.182,-5.255],[-6.923,3.516],[-6.34,6.387],[6.923,-6.387]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[17.119,44.144],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 265","np":2,"cix":2,"bm":0,"ix":265,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.156,-0.768],[0,0],[0,0]],"o":[[-1.208,0.245],[0,0],[0,0],[0,0]],"v":[[-1.676,-2.088],[-3.581,-0.254],[-2.881,3.188],[3.737,-3.188]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[12.676,42.493],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 266","np":2,"cix":2,"bm":0,"ix":266,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.372],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.177,4.437],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 267","np":2,"cix":2,"bm":0,"ix":267,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.376],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.942],[0,0],[0.898,0.524],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.466,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.675,15.236],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 268","np":2,"cix":2,"bm":0,"ix":268,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.004,15.883],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 269","np":2,"cix":2,"bm":0,"ix":269,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[57.524,11.638],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 270","np":2,"cix":2,"bm":0,"ix":270,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.119],[0,0],[0.078,-0.821]],"v":[[9.681,-10.219],[-10.397,6.354],[-10.616,8.639],[-9.361,10.161],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.362,18.106],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 271","np":2,"cix":2,"bm":0,"ix":271,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.953],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59.742,14.058],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 272","np":2,"cix":2,"bm":0,"ix":272,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.118],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.694],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[56.238,9.735],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 273","np":2,"cix":2,"bm":0,"ix":273,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.464,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[79.492,33.23],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 274","np":2,"cix":2,"bm":0,"ix":274,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.644,0.377],[0,0],[-0.099,1.036],[0,0],[-1.685,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.898,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.072,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.778,6.257],[-4.204,-10.187],[-0.197,-12.239],[4.467,-9.512],[5.778,-6.952],[3.959,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[69.99,44.029],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 275","np":2,"cix":2,"bm":0,"ix":275,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.736,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.318,44.676],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 276","np":2,"cix":2,"bm":0,"ix":276,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[78.839,40.43],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 277","np":2,"cix":2,"bm":0,"ix":277,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[82.677,46.898],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 278","np":2,"cix":2,"bm":0,"ix":278,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.363,-7.24],[3.6,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[81.057,42.85],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 279","np":2,"cix":2,"bm":0,"ix":279,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[77.552,38.528],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 280","np":2,"cix":2,"bm":0,"ix":280,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.63,-0.953],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.276,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[57.434,42.019],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 281","np":2,"cix":2,"bm":0,"ix":281,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.035],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.942],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.188],[-0.198,-12.24],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.933,52.818],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 282","np":2,"cix":2,"bm":0,"ix":282,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.038],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.961,-8.409],[7.212,-8.577],[-9.737,5.414],[-10.039,8.577],[10.039,-7.995]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.261,53.465],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 283","np":2,"cix":2,"bm":0,"ix":283,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.819],[2.942,-5.072],[-5.516,1.91],[-5.818,5.072],[5.818,-4.532]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[56.782,49.219],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 284","np":2,"cix":2,"bm":0,"ix":284,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.767,-0.073],[0,0],[-0.117,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.079,-0.822]],"v":[[9.681,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.619,55.687],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 285","np":2,"cix":2,"bm":0,"ix":285,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.652],[-8.474,7.24],[8.474,-6.751]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[58.999,51.64],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 286","np":2,"cix":2,"bm":0,"ix":286,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.17]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[55.495,47.317],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 287","np":2,"cix":2,"bm":0,"ix":287,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.132,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.185,2.371],[4.463,-0.65]],"v":[[12.575,3.259],[9.277,1.333],[3.95,-0.387],[-12.575,-1.323],[-5.456,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[49.495,18.54],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 288","np":2,"cix":2,"bm":0,"ix":288,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.377],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.985],[0,0],[0.099,-1.036],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.186,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.742]],"v":[[2.426,12.846],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.512],[5.777,-6.952],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[39.994,29.339],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 289","np":2,"cix":2,"bm":0,"ix":289,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.222]],"v":[[8.96,-8.409],[7.212,-8.576],[-9.737,5.413],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.322,29.986],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 290","np":2,"cix":2,"bm":0,"ix":290,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.515,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.842,25.741],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 291","np":2,"cix":2,"bm":0,"ix":291,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.447],[0,0],[0,0],[-0.766,-0.073],[0,0],[-0.118,1.226],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.227,0.118],[0,0],[0.078,-0.822]],"v":[[9.681,-10.218],[-10.397,6.354],[-10.616,8.639],[-9.361,10.16],[6.619,10.1],[9.053,8.092],[10.611,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[52.68,32.208],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 292","np":2,"cix":2,"bm":0,"ix":292,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[51.06,28.16],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 293","np":2,"cix":2,"bm":0,"ix":293,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[47.556,23.837],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 294","np":2,"cix":2,"bm":0,"ix":294,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.879,0.18],[1.131,-1.936],[-1.856,-0.178]],"o":[[0,0],[-1.631,-0.952],[0,0],[0.184,2.371],[4.464,-0.65]],"v":[[12.574,3.259],[9.277,1.333],[3.949,-0.387],[-12.574,-1.323],[-5.457,2.918]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[57.876,52.549],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 295","np":2,"cix":2,"bm":0,"ix":295,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.645,0.376],[0,0],[-0.099,1.036],[0,0],[-1.684,-0.984],[0,0],[0.099,-1.035],[0,0]],"o":[[0,0],[-0.899,-0.526],[0,0],[0.185,-1.943],[0,0],[0.898,0.525],[0,0],[-0.071,0.743]],"v":[[2.426,12.847],[-4.467,8.818],[-5.777,6.257],[-4.204,-10.187],[-0.198,-12.239],[4.466,-9.513],[5.777,-6.953],[3.958,12.062]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[48.375,63.348],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 296","np":2,"cix":2,"bm":0,"ix":296,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.406,0.039],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.309,-0.221]],"v":[[8.961,-8.409],[7.212,-8.576],[-9.737,5.414],[-10.039,8.576],[10.039,-7.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[60.703,63.995],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 297","np":2,"cix":2,"bm":0,"ix":297,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[5.581,-4.82],[2.942,-5.072],[-5.516,1.909],[-5.818,5.072],[5.818,-4.533]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[57.223,59.749],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 298","np":2,"cix":2,"bm":0,"ix":298,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.625,0.448],[0,0],[0,0],[-0.767,-0.074],[0,0],[-0.117,1.227],[0,0]],"o":[[0,0],[0,0],[-0.073,0.767],[0,0],[1.228,0.118],[0,0],[0.079,-0.821]],"v":[[9.681,-10.218],[-10.398,6.354],[-10.616,8.639],[-9.361,10.161],[6.618,10.1],[9.052,8.092],[10.61,-8.197]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[61.061,66.217],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 299","np":2,"cix":2,"bm":0,"ix":299,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[3.364,-7.24],[3.601,-6.952],[-8.036,2.653],[-8.474,7.24],[8.474,-6.75]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[59.441,62.169],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 300","np":2,"cix":2,"bm":0,"ix":300,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0.118,-1.227],[0,0],[0,0]],"o":[[-1.227,-0.117],[0,0],[0,0],[0,0]],"v":[[-1.269,-3.695],[-3.703,-1.686],[-4.229,3.812],[4.229,-3.169]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[55.937,57.846],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 301","np":2,"cix":2,"bm":0,"ix":301,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0.666,-1.766],[-1.571,-1.6],[-0.658,1.744]],"o":[[0,0],[-1.346,1.323],[0,0],[2.336,0.445],[0.544,-4.478]],"v":[[6.297,-11.755],[3.571,-9.077],[0.516,-4.388],[-4.726,11.31],[1.234,5.556]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.116,39.517],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 302","np":2,"cix":2,"bm":0,"ix":302,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.532,-0.523],[0,0],[0.974,0.367],[0,0],[-1.392,1.367],[0,0],[-0.973,-0.367],[0,0]],"o":[[0,0],[-0.742,0.729],[0,0],[-1.825,-0.689],[0,0],[0.743,-0.728],[0,0],[0.698,0.264]],"v":[[12.878,1.122],[7.181,6.715],[4.366,7.309],[-11.09,1.475],[-12.017,-2.931],[-8.163,-6.716],[-5.348,-7.309],[12.522,-0.564]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.049,50.953],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 303","np":2,"cix":2,"bm":0,"ix":303,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.144,-0.381],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.295,0.241]],"v":[[-5.392,-10.929],[-6.012,-9.286],[3.039,10.74],[6.012,11.862],[-4.71,-11.862]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[30.383,39.392],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 304","np":2,"cix":2,"bm":0,"ix":304,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-2.808,-6.722],[-3.745,-4.242],[0.772,5.752],[3.745,6.874],[-2.469,-6.874]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[25.366,41.632],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 305","np":2,"cix":2,"bm":0,"ix":305,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.596,-0.485],[0,0],[0,0],[-0.272,0.72],[0,0],[1.153,0.436],[0,0]],"o":[[0,0],[0,0],[0.72,0.273],[0,0],[0.435,-1.152],[0,0],[-0.772,-0.291]],"v":[[-9.619,-12.075],[1.103,11.649],[3.251,12.459],[5.048,11.648],[9.184,-3.788],[7.884,-6.663],[-7.425,-12.441]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[35.292,39.606],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 306","np":2,"cix":2,"bm":0,"ix":306,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-5.432,-5.21],[-5.093,-5.361],[1.121,8.386],[5.432,10.014],[-3.619,-10.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[27.99,40.119],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 307","np":2,"cix":2,"bm":0,"ix":307,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.153,-0.436],[0,0],[0,0]],"o":[[-0.435,1.153],[0,0],[0,0],[0,0]],"v":[[-3.016,0.17],[-1.716,3.046],[3.451,4.997],[-1.066,-4.997]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[22.687,42.387],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 308","np":2,"cix":2,"bm":0,"ix":308,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[1.363,-1.307],[-0.728,-2.12],[-1.345,1.291]],"o":[[0,0],[-1.786,0.614],[0,0],[1.918,1.408],[2.419,-3.806]],"v":[[10.304,-8.739],[6.693,-7.497],[1.914,-4.58],[-9.576,7.331],[-1.718,4.703]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.717999985639,0.866999966491,0.948999980852,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.672,54.587],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 309","np":2,"cix":2,"bm":0,"ix":309,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.706,-0.242],[0,0],[0.721,0.751],[0,0],[-1.845,0.635],[0,0],[-0.72,-0.751],[0,0]],"o":[[0,0],[-0.984,0.338],[0,0],[-1.351,-1.408],[0,0],[0.985,-0.339],[0,0],[0.516,0.538]],"v":[[11.107,6.769],[3.556,9.365],[0.761,8.688],[-10.676,-3.232],[-9.618,-7.608],[-4.509,-9.364],[-1.713,-8.687],[11.512,5.095]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.675,0.834999952129,0.898000021542,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[21.502,67.272],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 310","np":2,"cix":2,"bm":0,"ix":310,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.294,-0.282],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[-0.37,0.09]],"v":[[0.352,-12.466],[-0.915,-11.25],[-1.369,10.722],[0.831,13.014],[1.369,-13.014]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[28.942,58.765],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 311","np":2,"cix":2,"bm":0,"ix":311,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0.884,-7.546],[-1.029,-5.71],[-1.255,5.254],[0.945,7.546],[1.255,-7.538]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.827000038297,0.917999985639,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[23.438,58.616],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 312","np":2,"cix":2,"bm":0,"ix":312,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.748,-0.183],[0,0],[0,0],[-0.556,0.533],[0,0],[0.853,0.889],[0,0]],"o":[[0,0],[0,0],[0.533,0.555],[0,0],[0.889,-0.852],[0,0],[-0.571,-0.594]],"v":[[-6.891,-14.038],[-7.429,11.99],[-5.84,13.647],[-3.868,13.688],[6.511,1.537],[6.576,-1.617],[-4.753,-13.425]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[37.202,59.79],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 313","np":2,"cix":2,"bm":0,"ix":313,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-1.852,-7.432],[-1.481,-7.423],[-1.792,7.661],[1.398,10.986],[1.852,-10.986]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[26.174,58.501],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 314","np":2,"cix":2,"bm":0,"ix":314,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-0.853,-0.889],[0,0],[0,0]],"o":[[-0.889,0.854],[0,0],[0,0],[0,0]],"v":[[-1.533,-1.659],[-1.598,1.496],[2.225,5.482],[2.452,-5.482]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.760999971278,0.889999988032,0.957000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[19.957,58.388],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 315","np":2,"cix":2,"bm":0,"ix":315,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Champagne beholder kant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[686.002,764.988,0],"ix":2},"a":{"a":0,"k":[130.546,28.374,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[66.825,0],[0,13.019],[-66.825,0],[0,-13.021]],"o":[[-66.825,0],[0,-13.021],[66.825,0],[0,13.019]],"v":[[0,22.387],[-120.998,-1.187],[0,-24.762],[120.998,-1.187]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[71.96,0],[0,-15.532],[-71.96,0],[0,15.533]],"o":[[-71.96,0],[0,15.533],[71.96,0],[0,-15.532]],"v":[[0,-28.124],[-130.296,0],[0,28.124],[130.296,0]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":1,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.546,28.374],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Champagne beholder","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[686.002,828.136,0],"ix":2},"a":{"a":0,"k":[130.546,88.16,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-28.19,1.706]],"o":[[0,0],[0,0]],"v":[[-20.384,-4.05],[20.384,2.344]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[95.427,158.292],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":40,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-42.026,-7.44]],"o":[[0,0],[0,0]],"v":[[-33.26,-23.375],[33.26,23.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[73.602,91.644],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":40,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[66.825,0],[0,-13.02],[-66.825,0],[0,13.02]],"o":[[-66.825,0],[0,13.02],[66.825,0],[0,-13.02]],"v":[[0,-23.575],[-120.998,0.001],[0,23.575],[120.998,0.001]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298000021542,0.340999977261,0.356999984442,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.546,23.824],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[-106.147,0]],"o":[[0,0],[0,0],[0,0],[106.146,0]],"v":[[130.296,-53.193],[0,-53.193],[-130.296,-53.193],[0,53.193]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.654999976065,0.713999968884,0.757000014361,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.546,78.206],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[3.668,16.708],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27.928,10.093],[-5.507,-17.562],[-27.928,-17.562],[-27.928,17.562]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[158.474,137.399],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-3.668,16.708],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-27.928,10.093],[5.507,-17.562],[27.928,-17.562],[27.928,17.562]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[102.617,137.399],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-7.832],[-36.286,0],[0,7.833],[36.285,0]],"o":[[0,7.833],[36.285,0],[0,-7.832],[-36.286,0]],"v":[[-65.701,-0.001],[0,14.182],[65.701,-0.001],[0,-14.182]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.497999991623,0.560999971278,0.6,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.545,154.961],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[24.495,0],[11.298,-4.29],[0,0],[0,0],[-36.286,0],[0,7.832],[0,0]],"o":[[-11.298,-4.29],[-24.496,0],[0,0],[0,0],[0,7.832],[36.286,0],[0,0],[0,0]],"v":[[57.142,-6.996],[-0.001,-14.182],[-57.149,-6.996],[-65.702,-6.996],[-65.702,0],[-0.001,14.182],[65.702,0],[65.702,-6.996]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.298000021542,0.340999977261,0.356999984442,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[130.546,161.889],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":450,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Eiendomsmegleren 2","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[567,493.5,0],"ix":2},"a":{"a":0,"k":[571,675,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":1142,"h":1350,"ip":0,"op":180,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/assets/success_light.json b/app/src/main/assets/success_light.json new file mode 100644 index 0000000..4192a28 --- /dev/null +++ b/app/src/main/assets/success_light.json @@ -0,0 +1 @@ +{"v":"4.10.1","fr":25,"ip":0,"op":55,"w":796,"h":714,"nm":"Anim8*","ddd":0,"assets":[{"id":"comp_745","layers":[{"ddd":0,"ind":1,"ty":4,"nm":"cruz3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":18,"s":[1],"e":[100]},{"t":28}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":18,"s":[-33],"e":[13]},{"t":50}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":18,"s":[614.125,467.5,0],"e":[841.125,680.5,0],"to":[37.8333320617676,35.5,0],"ti":[-37.8333320617676,-35.5,0]},{"t":28}],"ix":2},"a":{"a":0,"k":[-882.375,-1726,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-882.239,-1725.811],"ix":2},"a":{"a":0,"k":[-882.239,-1725.811],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":18,"op":1020.5,"st":18,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"cruz2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":16,"s":[1],"e":[100]},{"t":26}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":16,"s":[-30],"e":[16]},{"t":50}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.333,"y":0},"n":"0_1_0p333_0","t":16,"s":[606.125,465.5,0],"e":[322.125,572.5,0],"to":[-47.3333320617676,17.8333339691162,0],"ti":[47.3333320617676,-17.8333339691162,0]},{"t":26}],"ix":2},"a":{"a":0,"k":[-882.375,-1726,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-882.239,-1725.811],"ix":2},"a":{"a":0,"k":[-882.239,-1725.811],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":16,"op":1018.5,"st":16,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"cruz1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"n":["0p833_0p833_0p167_0p167"],"t":15,"s":[1],"e":[100]},{"t":25}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p667_1_0p333_0"],"t":15,"s":[-28],"e":[18]},{"t":50}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.103,"y":1},"o":{"x":0.333,"y":0},"n":"0p103_1_0p333_0","t":15,"s":[614.125,462.5,0],"e":[852.125,164.5,0],"to":[39.6666679382324,-49.6666679382324,0],"ti":[-39.6666679382324,49.6666679382324,0]},{"t":25}],"ix":2},"a":{"a":0,"k":[-882.375,-1726,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-894.5,-1726],[-869.5,-1726]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-882.239,-1725.811],"ix":2},"a":{"a":0,"k":[-882.239,-1725.811],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":-90,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":15,"op":1017.5,"st":15,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Bolas2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[617.5,490.5,0],"ix":2},"a":{"a":0,"k":[-1112,-1428,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.101,0.101,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p101_1_0p333_0","0p101_1_0p333_0","0p667_1_0p333_0"],"t":13,"s":[0,0,100],"e":[100,100,100]},{"t":25}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.30196078431372547,0.3411764705882353,0.3843137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-952.029,-1150.197],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[64.361,64.361],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-1435.793,-1556.371],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[64.361,64.361],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":1015.5,"st":13,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Bolas1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.921]},"o":{"x":[0.333],"y":[0]},"n":["0p833_0p921_0p333_0"],"t":11,"s":[-11],"e":[0]},{"i":{"x":[0.15],"y":[1]},"o":{"x":[0.167],"y":[0.327]},"n":["0p15_1_0p167_0p327"],"t":23,"s":[0],"e":[6]},{"t":50}],"ix":10},"p":{"a":0,"k":[621.5,478.5,0],"ix":2},"a":{"a":0,"k":[-1108,-1440,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.101,0.101,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0p101_1_0p333_0","0p101_1_0p333_0","0p667_1_0p333_0"],"t":11,"s":[0,0,100],"e":[100,100,100]},{"t":23}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-1151.238,-1723.625],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[140.88,140.88],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 2","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-1282.949,-1147.881],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[140.88,140.88],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[19.355,19.355],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[0.8588235294117647,0.23921568627450981,0.3411764705882353,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-819.535,-1371.645],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[85.671,85.671],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 3","np":3,"cix":2,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":11,"op":1013.5,"st":11,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"stroke3","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1950.5,2175.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1117.454,-1623.493]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.04,99.99],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":9,"s":[0],"e":[100]},{"t":17}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":9,"op":1011.5,"st":9,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"stroke4","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[2288.5,1790.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1372.351,-1474.477]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.04,99.99],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":6.5,"s":[0],"e":[100]},{"t":14.5}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":6.5,"op":1009,"st":6.5,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"stroke2","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1818.5,2059.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1027.49,-1672.499]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.04,99.99],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":4,"s":[0],"e":[100]},{"t":12}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":4,"op":1006.5,"st":4,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"stroke1","sr":1,"ks":{"o":{"a":0,"k":50,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1729.5,1918.5,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-1401.5,-1457.5],[-1027.49,-1672.499]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.8980392156862745,0.8980392156862745,0.8980392156862745,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":92,"ix":5},"lc":2,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100.04,99.99],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":0,"s":[0],"e":[100]},{"t":8}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":1002.5,"st":0,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[396.5,357,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[-72,6],[-28,49],[75,-54]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.09019607843137255,0.6470588235294118,0.4588235294117647,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":18,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.156],"y":[1]},"o":{"x":[0.333],"y":[0]},"n":["0p156_1_0p333_0"],"t":18,"s":[0],"e":[100]},{"t":32}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":18,"op":73,"st":18,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[398,357.031,0],"ix":2},"a":{"a":0,"k":[9.719,2.719,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"t":13,"s":[30,30,100],"e":[91.577,91.577,100]},{"t":21}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.438,355.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.719,2.719],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":13,"op":68,"st":13,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[398.111,357.031,0],"ix":2},"a":{"a":0,"k":[9.719,2.719,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0,0,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"n":["0_1_0p333_0","0_1_0p333_0","0p667_1_0p333_0"],"t":8,"s":[30,30,100],"e":[101.143,101.143,100]},{"t":16}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[355.438,355.438],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.09019607843137255,0.6470588235294118,0.4588235294117647,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[9.719,2.719],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":8,"op":63,"st":8,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"BG","refId":"comp_745","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[1513.5,1812.5,0],"ix":2},"a":{"a":0,"k":[1729.5,1918.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"w":3459,"h":3837,"ip":0,"op":1005,"st":0,"bm":0}]} \ No newline at end of file diff --git a/app/src/main/assets/uploading.json b/app/src/main/assets/uploading.json new file mode 100644 index 0000000..2a77050 --- /dev/null +++ b/app/src/main/assets/uploading.json @@ -0,0 +1,3134 @@ +{ + "v": "5.5.5", + "fr": 29.9700012207031, + "ip": 0, + "op": 38.0000015477717, + "w": 1024, + "h": 768, + "nm": "Comp 1", + "ddd": 0, + "assets": [ + { + "id": "comp_0", + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Shape Layer 10", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 27, + "s": [ + 100 + ] + }, + { + "t": 37.0000015070409, + "s": [ + 0 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0, + "y": 1 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 23, + "s": [ + 323, + 357, + 0 + ], + "to": [ + -15.333, + -11, + 0 + ], + "ti": [ + 15.333, + 11, + 0 + ] + }, + { + "t": 35.0000014255792, + "s": [ + 231, + 291, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -233, + -159, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 38, + 38 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -233, + -159 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 23.0000009368092, + "op": 38.0000015477717, + "st": 10.0000004073083, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Shape Layer 9", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 26, + "s": [ + 100 + ] + }, + { + "t": 36.0000014663101, + "s": [ + 0 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0, + "y": 1 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 22, + "s": [ + 685, + 325, + 0 + ], + "to": [ + 17, + -13.333, + 0 + ], + "ti": [ + -17, + 13.333, + 0 + ] + }, + { + "t": 34.0000013848484, + "s": [ + 787, + 245, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -233, + -159, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 38, + 38 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -233, + -159 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 22.0000008960784, + "op": 37.0000015070409, + "st": 9.00000036657752, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Shape Layer 8", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833 + ], + "y": [ + 0.833 + ] + }, + "o": { + "x": [ + 0.167 + ], + "y": [ + 0.167 + ] + }, + "t": 19, + "s": [ + 100 + ] + }, + { + "t": 29.0000011811942, + "s": [ + 0 + ] + } + ], + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0, + "y": 1 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 15, + "s": [ + 489, + 213, + 0 + ], + "to": [ + -0.333, + -23.667, + 0 + ], + "ti": [ + 0.333, + 23.667, + 0 + ] + }, + { + "t": 27.0000010997325, + "s": [ + 487, + 71, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -233, + -159, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 38, + 38 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -233, + -159 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 15.0000006109625, + "op": 30.0000012219251, + "st": 2.00000008146167, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Shape Layer 7", + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 512, + 384, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 74, + 74, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { + "a": 0, + "k": [ + 1024, + 768 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 4 + }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 0, + 1, + 0.583529423732, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Rectangle 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 25.0000010182709, + "op": 900.000036657751, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Shape Layer 6", + "tt": 1, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 1 + }, + "o": { + "x": 0.167, + "y": 0 + }, + "t": 25, + "s": [ + 507.984, + 852.584, + 0 + ], + "to": [ + 0, + -33.333, + 0 + ], + "ti": [ + 0, + 33.333, + 0 + ] + }, + { + "t": 30.0000012219251, + "s": [ + 507.984, + 652.584, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -8, + 336.584, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 116, + 116, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 4.882, + 4.882 + ], + [ + 0, + 0 + ], + [ + 4.882, + -4.882 + ], + [ + 0, + 0 + ], + [ + -4.881, + -4.881 + ], + [ + -4.882, + 4.882 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + -6.903, + 0 + ], + [ + 0, + 6.903 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + -3.199, + 0 + ], + [ + -2.44, + 2.441 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + -4.882, + -4.882 + ], + [ + 0, + 0 + ], + [ + -4.881, + 4.882 + ], + [ + 4.882, + 4.882 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 6.903 + ], + [ + 6.903, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 2.44, + 2.441 + ], + [ + 3.199, + 0 + ], + [ + 4.882, + -4.881 + ] + ], + "v": [ + [ + 55.286, + 254.745 + ], + [ + 0.839, + 200.298 + ], + [ + -16.839, + 200.298 + ], + [ + -71.286, + 254.745 + ], + [ + -71.286, + 272.423 + ], + [ + -53.609, + 272.423 + ], + [ + -20.5, + 239.314 + ], + [ + -20.5, + 324.084 + ], + [ + -8, + 336.584 + ], + [ + 4.5, + 324.084 + ], + [ + 4.5, + 239.314 + ], + [ + 37.608, + 272.423 + ], + [ + 46.447, + 276.084 + ], + [ + 55.286, + 272.423 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 25.0000010182709, + "op": 900.000036657751, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Shape Layer 5", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.667, + "y": 1 + }, + "o": { + "x": 0.842, + "y": 0 + }, + "t": 5, + "s": [ + 507.984, + 652.584, + 0 + ], + "to": [ + 0, + -40, + 0 + ], + "ti": [ + 0, + 40, + 0 + ] + }, + { + "t": 15.0000006109625, + "s": [ + 507.984, + 412.584, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -8, + 336.584, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 116, + 116, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + 4.882, + 4.882 + ], + [ + 0, + 0 + ], + [ + 4.882, + -4.882 + ], + [ + 0, + 0 + ], + [ + -4.881, + -4.881 + ], + [ + -4.882, + 4.882 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + -6.903, + 0 + ], + [ + 0, + 6.903 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + -3.199, + 0 + ], + [ + -2.44, + 2.441 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + -4.882, + -4.882 + ], + [ + 0, + 0 + ], + [ + -4.881, + 4.882 + ], + [ + 4.882, + 4.882 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 6.903 + ], + [ + 6.903, + 0 + ], + [ + 0, + 0 + ], + [ + 0, + 0 + ], + [ + 2.44, + 2.441 + ], + [ + 3.199, + 0 + ], + [ + 4.882, + -4.881 + ] + ], + "v": [ + [ + 55.286, + 254.745 + ], + [ + 0.839, + 200.298 + ], + [ + -16.839, + 200.298 + ], + [ + -71.286, + 254.745 + ], + [ + -71.286, + 272.423 + ], + [ + -53.609, + 272.423 + ], + [ + -20.5, + 239.314 + ], + [ + -20.5, + 324.084 + ], + [ + -8, + 336.584 + ], + [ + 4.5, + 324.084 + ], + [ + 4.5, + 239.314 + ], + [ + 37.608, + 272.423 + ], + [ + 46.447, + 276.084 + ], + [ + 55.286, + 272.423 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 25.0000010182709, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Shape Layer 3", + "parent": 10, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 10, + "s": [ + -19.032, + 8, + 0 + ], + "to": [ + 0, + -5, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 20, + "s": [ + -19.032, + -22, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + -5, + 0 + ] + }, + { + "t": 30.0000012219251, + "s": [ + -19.032, + 8, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -4.016, + -1, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 10, + "s": [ + 89.666, + 89.666, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 20, + "s": [ + 120.666, + 120.666, + 100 + ] + }, + { + "t": 30.0000012219251, + "s": [ + 89.666, + 89.666, + 100 + ] + } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 238, + 238 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -3, + -1 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 10.0000004073083, + "op": 910.00003706506, + "st": 10.0000004073083, + "bm": 0 + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Shape Layer 4", + "parent": 10, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 13, + "s": [ + 76.968, + 72, + 0 + ], + "to": [ + 14.667, + -6.667, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 23, + "s": [ + 164.968, + 32, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 14.667, + -6.667, + 0 + ] + }, + { + "t": 33.0000013441176, + "s": [ + 76.968, + 72, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -4.016, + -1, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 13, + "s": [ + 37.666, + 37.666, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 23, + "s": [ + 76.666, + 76.666, + 100 + ] + }, + { + "t": 33.0000013441176, + "s": [ + 37.666, + 37.666, + 100 + ] + } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 238, + 238 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -3, + -1 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 13.0000005295009, + "op": 913.000037187252, + "st": 13.0000005295009, + "bm": 0 + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Shape Layer 2", + "parent": 10, + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 16, + "s": [ + -72.032, + 75, + 0 + ], + "to": [ + -15, + -6.667, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 26, + "s": [ + -162.032, + 35, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + -15, + -6.667, + 0 + ] + }, + { + "t": 36.0000014663101, + "s": [ + -72.032, + 75, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + -4.016, + -1, + 0 + ], + "ix": 1 + }, + "s": { + "a": 1, + "k": [ + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 16, + "s": [ + 37.666, + 37.666, + 100 + ] + }, + { + "i": { + "x": [ + 0.833, + 0.833, + 0.833 + ], + "y": [ + 0.833, + 0.833, + 0.833 + ] + }, + "o": { + "x": [ + 0.167, + 0.167, + 0.167 + ], + "y": [ + 0.167, + 0.167, + 0.167 + ] + }, + "t": 26, + "s": [ + 73.666, + 73.666, + 100 + ] + }, + { + "t": 36.0000014663101, + "s": [ + 37.666, + 37.666, + 100 + ] + } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "d": 1, + "ty": "el", + "s": { + "a": 0, + "k": [ + 238, + 238 + ], + "ix": 2 + }, + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 3 + }, + "nm": "Ellipse Path 1", + "mn": "ADBE Vector Shape - Ellipse", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + -3, + -1 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Ellipse 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 16.0000006516934, + "op": 916.000037309445, + "st": 16.0000006516934, + "bm": 0 + }, + { + "ddd": 0, + "ind": 10, + "ty": 4, + "nm": "Shape Layer 1", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 0, + "k": [ + 508.016, + 318, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [ + -35.648, + 0 + ], + [ + 0, + 0 + ], + [ + -5.385, + 31.695 + ], + [ + 0.07, + 5.979 + ], + [ + 51.78, + 1.447 + ], + [ + 4.907, + -0.62 + ], + [ + 58.803, + 0 + ], + [ + 16.362, + -61.554 + ], + [ + 0, + -40.599 + ], + [ + -0.021, + -0.752 + ] + ], + "o": [ + [ + 0, + 0 + ], + [ + 32.149, + 0 + ], + [ + 0.966, + -5.688 + ], + [ + -0.608, + -51.796 + ], + [ + -5.108, + -0.143 + ], + [ + -22.365, + -50.519 + ], + [ + -66.704, + 0 + ], + [ + -38.961, + 5.871 + ], + [ + 0, + 0.757 + ], + [ + 0.978, + 35.634 + ] + ], + "v": [ + [ + -158.085, + 126.5 + ], + [ + 157.68, + 126.5 + ], + [ + 223.094, + 71.857 + ], + [ + 224.461, + 54.335 + ], + [ + 130.235, + -41.461 + ], + [ + 115.199, + -40.73 + ], + [ + -16.532, + -126.5 + ], + [ + -155.701, + -19.588 + ], + [ + -224.532, + 60.5 + ], + [ + -224.501, + 62.762 + ] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [ + 1, + 1, + 1, + 1 + ], + "ix": 4 + }, + "o": { + "a": 0, + "k": 100, + "ix": 5 + }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 0, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100 + ], + "ix": 3 + }, + "r": { + "a": 0, + "k": 0, + "ix": 6 + }, + "o": { + "a": 0, + "k": 100, + "ix": 7 + }, + "sk": { + "a": 0, + "k": 0, + "ix": 4 + }, + "sa": { + "a": 0, + "k": 0, + "ix": 5 + }, + "nm": "Transform" + } + ], + "nm": "Shape 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 900.000036657751, + "st": 0, + "bm": 0 + } + ] + } + ], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 0, + "nm": "Shape Layer 1 Comp 1", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 30, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 16, + "s": [ + 512, + 424, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 18, + "s": [ + 512, + 404, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "t": 23.0000009368092, + "s": [ + 512, + 424, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 512, + 384, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "w": 1024, + "h": 768, + "ip": 3.00000012219251, + "op": 903.000036779944, + "st": 3.00000012219251, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 0, + "nm": "Shape Layer 1 Comp 1", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 30, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 15, + "s": [ + 512, + 424, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 17, + "s": [ + 512, + 404, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "t": 22.0000008960784, + "s": [ + 512, + 424, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 512, + 384, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "w": 1024, + "h": 768, + "ip": 2.00000008146167, + "op": 902.000036739213, + "st": 2.00000008146167, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 0, + "nm": "Shape Layer 1 Comp 1", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 30, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 14, + "s": [ + 512, + 424, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 16, + "s": [ + 512, + 404, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "t": 21.0000008553475, + "s": [ + 512, + 424, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 512, + 384, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "w": 1024, + "h": 768, + "ip": 1.00000004073083, + "op": 901.000036698482, + "st": 1.00000004073083, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 0, + "nm": "Shape Layer 1 Comp 1", + "refId": "comp_0", + "sr": 1, + "ks": { + "o": { + "a": 0, + "k": 100, + "ix": 11 + }, + "r": { + "a": 0, + "k": 0, + "ix": 10 + }, + "p": { + "a": 1, + "k": [ + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 13, + "s": [ + 512, + 424, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "i": { + "x": 0.833, + "y": 0.833 + }, + "o": { + "x": 0.167, + "y": 0.167 + }, + "t": 15, + "s": [ + 512, + 404, + 0 + ], + "to": [ + 0, + 0, + 0 + ], + "ti": [ + 0, + 0, + 0 + ] + }, + { + "t": 20.0000008146167, + "s": [ + 512, + 424, + 0 + ] + } + ], + "ix": 2 + }, + "a": { + "a": 0, + "k": [ + 512, + 384, + 0 + ], + "ix": 1 + }, + "s": { + "a": 0, + "k": [ + 100, + 100, + 100 + ], + "ix": 6 + } + }, + "ao": 0, + "w": 1024, + "h": 768, + "ip": 0, + "op": 900.000036657751, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} \ No newline at end of file diff --git a/app/src/main/assets/water_loader.json b/app/src/main/assets/water_loader.json new file mode 100644 index 0000000..d1236a3 --- /dev/null +++ b/app/src/main/assets/water_loader.json @@ -0,0 +1 @@ +{"v":"5.5.2","fr":60,"ip":0,"op":75,"w":147,"h":194,"nm":"Comp 1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"np_glass_80834_000000","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[73.447,96.9,0],"ix":2},"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[146.895,193.8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Path 945","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2},"a":{"a":0,"k":[73.447,96.9,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[118.783,193.8],[28.114,193.8],[0,0],[146.895,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[32.983,188.184],[113.923,188.184],[140.413,5.616],[6.494,5.616]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180392156863,0.560784313725,0.980392156863,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 945","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Path 944","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":0,"s":[1.205,84.746,0],"to":[0,0,0],"ti":[0,0,0]},{"t":71,"s":[0.205,9.746,0]}],"ix":2},"a":{"a":0,"k":[58.815,75.549,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[70,0,100]},{"t":71,"s":[100,100,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":12,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[29.855,-32.137],[0,0]],"o":[[0,0],[0,0],[0,0],[-18.504,4.289],[-36.916,52.915],[0,0]],"v":[[0,5.115],[8.984,156.029],[105.125,156.029],[117.63,0],[59.454,21.334],[0.001,5.116]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":26,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[51.178,24.368],[0,0]],"o":[[0,0],[0,0],[0,0],[-18.504,4.289],[-44.209,-31.954],[0,0]],"v":[[0.154,5.115],[13.554,151.919],[101.291,151.919],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0},"t":41,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[40.633,10.772],[0,0]],"o":[[0,0],[0,0],[0,0],[-15.825,11.758],[-44.395,-12.173],[0,0]],"v":[[0.154,5.115],[18.578,151.097],[97.257,151.097],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":49,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[41.709,2.712],[0,0]],"o":[[0,0],[0,0],[0,0],[-18.842,9.643],[-43.738,-4.701],[0,0]],"v":[[0.154,5.115],[20.845,151.077],[96.238,151.097],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]},{"t":63,"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[44.213,-16.049],[0,0]],"o":[[0,0],[0,0],[0,0],[-25.865,4.721],[-42.208,12.69],[0,0]],"v":[[0.154,5.115],[23.665,151.097],[93.866,151.097],[117.785,0],[59.609,21.334],[0.155,5.116]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.180392156863,0.560784313725,0.980392156863,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Path 944","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":3600,"st":0,"bm":0}],"markers":[]} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ConsultantApplication.kt b/app/src/main/java/com/consultantvendor/ConsultantApplication.kt new file mode 100644 index 0000000..09a035c --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ConsultantApplication.kt @@ -0,0 +1,146 @@ +package com.consultantvendor + +import android.app.Application +import android.util.Log +import androidx.lifecycle.* +import com.appsflyer.AppsFlyerLib +import com.appsflyer.attribution.AppsFlyerRequestListener +import com.consultantvendor.data.models.requests.AppFeatures +import com.consultantvendor.data.models.responses.appdetails.AppVersion +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.di.DaggerAppComponent +import com.consultantvendor.utils.AppSocket +import com.consultantvendor.utils.PrefsManager +import com.facebook.drawee.backends.pipeline.Fresco +import com.google.android.libraries.places.api.Places +import dagger.android.AndroidInjector +import dagger.android.DaggerApplication +import javax.inject.Inject + + +var appFeatures = AppFeatures() +var appClientDetails = AppVersion() + +class ConsultantApplication : DaggerApplication(), LifecycleObserver { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + private var isReceiverRegistered = false + + + override fun onCreate() { + super.onCreate() + + ProcessLifecycleOwner.get().lifecycle.addObserver(this) + Fresco.initialize(this) + setsApplication(this) + appSocket.init() + + appClientDetails = userRepository.getAppSetting() + + // Initialize Places. + try { + Places.initialize(applicationContext, getString(R.string.google_places_api_key)) + } catch (e: Exception) { + } + + /*Check for features*/ + when (BuildConfig.FLAVOR) { + "consult", "edu", "marketplace", "healthcare" -> { + appFeatures.needLanguageScreen = true + appFeatures.needWalkThrough = true + appFeatures.needUserDoctorScreen = false + appFeatures.needLocation = true + appFeatures.needClasses = true + appFeatures.needBlogs = true + appFeatures.needArticles = true + appFeatures.needHealthTools = false + appFeatures.freeExpertAdvise = true + } + "heal" -> { + appFeatures.needLanguageScreen = true + appFeatures.needWalkThrough = true + appFeatures.needUserDoctorScreen = true + appFeatures.needLocation = true + appFeatures.needArticles = true + appFeatures.needClasses = true + appFeatures.needHealthTools = true + appFeatures.signUpAddition = true + appFeatures.needInsurance = false + appFeatures.freeExpertAdvise = true + } + "homeDoctor" -> { + appFeatures.needLanguageScreen = true + appFeatures.needLocation = true + AppsFlyerLib.getInstance().init(getString(R.string.apps_flyer_dev_key), null, this) + AppsFlyerLib.getInstance().start(applicationContext,null,object : AppsFlyerRequestListener{ + override fun onSuccess() { + Log.d("AppsFlyer", "Launch sent successfully, got 200 response code from server"); + } + + override fun onError(i: Int, s: String) { + Log.d("AppsFlyer", "Launch failed to be sent:\n" + + "Error code: " + i + "\n" + + "Error description: " + s) + } + }) + + } + "airdoc" -> { + appFeatures.needLocation = true + } + "nurseLynx" -> { + appFeatures.needLocation = true + appFeatures.needInviteCode = true + } + "taradoc" -> { + appFeatures.needLanguageScreen = false + appFeatures.needLocation = true + } + "clouddoc" -> { + appFeatures.needLocation = true + appFeatures.needBlogs = true + } + "meetMd" -> { + appFeatures.needLocation = true + } + else -> { + appFeatures.needClasses = true + appFeatures.needBlogs = true + appFeatures.needArticles = true + } + } + } + + override fun applicationInjector(): AndroidInjector = + DaggerAppComponent.builder().create(this) + + companion object { + var isApplication: Application? = null + + fun setsApplication(sApplication: Application) { + isApplication = sApplication + } + } + + @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) + fun appInResumeState() { + //Toast.makeText(this, "In Foreground", Toast.LENGTH_LONG).show(); + } + + @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) + fun appInPauseState() { + //Toast.makeText(this, "In Background", Toast.LENGTH_LONG).show(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/UncaughtExceptionHandlerContentProvider.kt b/app/src/main/java/com/consultantvendor/UncaughtExceptionHandlerContentProvider.kt new file mode 100644 index 0000000..d42cd0b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/UncaughtExceptionHandlerContentProvider.kt @@ -0,0 +1,72 @@ +package com.consultantvendor + +import android.content.ContentProvider +import android.content.ContentValues +import android.database.Cursor +import android.net.Uri +import java.lang.Thread.UncaughtExceptionHandler + + +class UncaughtExceptionHandlerContentProvider : ContentProvider() { + override fun onCreate(): Boolean { + val myHandler: MyCustomCrashHandler = + MyCustomCrashHandler(Thread.getDefaultUncaughtExceptionHandler()!!) + Thread.setDefaultUncaughtExceptionHandler(myHandler) + return true + } + + + override fun query( + uri: Uri, + projection: Array?, + selection: String?, + selectionArgs: Array?, + sortOrder: String? + ): Cursor? { + return null + } + + + override fun getType(uri: Uri): String? { + return null + } + + + override fun insert(uri: Uri, values: ContentValues?): Uri? { + return null + } + + override fun delete( + uri: Uri, + selection: String?, + selectionArgs: Array? + ): Int { + return 0 + } + + override fun update( + uri: Uri, + values: ContentValues?, + selection: String?, + selectionArgs: Array? + ): Int { + return 0 + } + + +} + +class MyCustomCrashHandler(private val defaultHandler: UncaughtExceptionHandler) : + UncaughtExceptionHandler { + + + override fun uncaughtException(t: Thread, e: Throwable) { + try { + //do your own thing. + } catch (e: Exception) { + e.printStackTrace(); + } finally { + defaultHandler.uncaughtException(t, e) + } + } +} diff --git a/app/src/main/java/com/consultantvendor/data/apis/WebService.kt b/app/src/main/java/com/consultantvendor/data/apis/WebService.kt new file mode 100644 index 0000000..151e089 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/apis/WebService.kt @@ -0,0 +1,422 @@ +package com.consultantvendor.data.apis + +import com.consultantvendor.data.models.requests.AddPrescription +import com.consultantvendor.data.models.requests.UpdateDocument +import com.consultantvendor.data.models.requests.UpdateServices +import com.consultantvendor.data.models.responses.* +import com.consultantvendor.data.models.responses.appdetails.AppVersion +import com.consultantvendor.data.models.responses.directions.Direction +import com.consultantvendor.data.network.responseUtil.ApiResponse +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.http.* + + +interface WebService { + companion object { + + private const val LOGIN = "/api/login" + private const val PROFILE = "/api/profile" + private const val APP_VERSION = "/api/appversion" + private const val CLIENT_DETAILS = "api/clientdetail" + private const val COUNTRY_DATA = "/api/countrydata" + private const val PREFERENCES = "/api/master/preferences" + private const val UPDATE_NUMBER = "/api/update-phone" + private const val VERIFY_OTP = "/api/verify-otp" + private const val RESEND_OTP = "api/resend-otp" + private const val REGISTER = "/api/register" + private const val FORGOT_PASSWORD = "/api/forgot_password" + private const val CHANGE_PASSWORD = "/api/password-change" + private const val PROFILE_UPDATE = "/api/profile-update" + private const val LOGOUT = "/api/app_logout" + private const val SEND_SMS = "/api/send-sms" + private const val SEND_EMAIL_OTP = "/api/send-email-otp" + private const val EMAIL_VERIFY = "/api/email-verify" + private const val UPDATE_FCM_ID = "/api/update-fcm-id" + private const val ACCEPT_REQUEST = "/api/accept-request" + private const val START_REQUEST = "/api/start-request" + private const val START_CALL = "/api/start-call" + private const val COMPLETE_CHAT = "/api/complete-chat" + private const val ADD_BANK = "/api/add-bank" + private const val UPLOAD_IMAGE = "/api/upload-image" + private const val FEEDS = "/api/feeds" + private const val VIEW_FEEDS = "/api/feeds/view/{feed_id}" + private const val ADD_FAVORITE = "/api/feeds/add-favorite/{feed_id}" + + private const val SUBSCRIBE_SERVICE = "/api/subscribe-service" + private const val REQUESTS = "/api/requests" + private const val REQUEST_DETAIL = "/api/request-detail" + private const val HOME = "/api/home" + private const val WALLET_HISTORY = "/api/wallet-history-sp" + private const val WALLET = "/api/wallet-sp" + private const val REQUEST_CHECK = "/api/request-check" + private const val CHAT_LISTING = "/api/chat-listing" + private const val CHAT_MESSAGES = "/api/chat-messages" + private const val BANK_ACCOUNTS = "/api/bank-accounts" + private const val REVENUE = "/api/revenue" + private const val NOTIFICATIONS = "/api/notifications" + private const val DOCTOR_DETAIL = "/api/doctor-detail" + + private const val CATEGORIES = "/api/categories" + private const val GET_SLOTS = "/api/get-slots" + + private const val ADD_CLASS = "/api/add-class" + private const val CLASSES = "/api/classes" + private const val CLASS_STATUS = "/api/class/status" + private const val SERVICES = "/api/services" + private const val GET_FILTERS = "/api/get-filters" + private const val UPDATE_SERVICES = "/api/update-services" + private const val CANCEL_REQUEST = "/api/cancel-request" + private const val CALL_STATUS = "/api/call-status" + private const val PAGES = "/api/pages" + private const val ADD_CARD = "api/add-card" + private const val UPDATE_CARD = "/api/update-card" + private const val DELETE_CARD = "/api/delete-card" + private const val ADD_MONEY = "/api/add-money" + private const val CARD_LISTING = "/api/cards" + private const val ORDER_CREATE = "/api/order/create" + private const val RAZOR_PAY_WEBHOOK = "/api/razor-pay-webhook" + private const val ADDITIONAL_DETAILS = "/api/additional-details" + private const val ADDITIONAL_DETAIL_DATA = "/api/additional-detail-data" + private const val PAYOUTS = "/api/payouts" + private const val PRE_SCREPTIONS = "/api/pre_screptions" + private const val ASK_QUESTIONS = "/api/ask-questions" + private const val ASK_QUESTIONS_DETAIL = "/api/ask-question-detail" + private const val REPLY_QUESTION = "/api/reply-question" + private const val WATER_LIMIT = "/api/water-limit" + private const val PROTEIN_LIMIT = "/api/protein-limit" + private const val DRINK_WATER = "/api/drink-water" + private const val DRINK_PROTEIN = "/api/drink-protein" + private const val EXTRA_PAYMENT = "/api/extra-payment" + private const val UPDATE_CARE_PLANS = "/api/update-care-plans" + private const val GET_MEDICAL_HISTORY = "/api/get-medical-history" + private const val CREATE_MEDICAL_HISTORY = "/api/create-medical-history" + + private const val DIRECTIONS = "https://maps.googleapis.com/maps/api/directions/json" + + private const val WORKING_HOURS = "/api/workingHours" + private const val SPEAKOUT_LIST = "/common/listSpeakouts" + + private const val CONTACT_LIST = "/api/contact-list" + private const val CONTACT_ADD = "/api/contact-add" + private const val CONTACT_DELETE = "/api/contact-delete" + private const val CONTACT_MESSAGE = "/api/contact-message" + + private const val PENDIG_REQUESTS_V2 = "/api/v2/pendig-requests" + private const val ACCEPT_REQUEST_V2 = "/api/v2/accept-request" + private const val CANCEL_REQUEST_V2 = "/api/v2/cancel-request" + private const val BANNERS = "/api/banners" + + } + + /*POST APIS*/ + @FormUrlEncoded + @POST(LOGIN) + fun login(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(APP_VERSION) + fun appVersion(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(UPDATE_NUMBER) + fun updateNumber(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(VERIFY_OTP) + fun verifyOtp(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(RESEND_OTP) + fun resendOtp(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(REGISTER) + fun register(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(FORGOT_PASSWORD) + fun forgotPassword(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CHANGE_PASSWORD) + fun changePassword(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(PROFILE_UPDATE) + fun updateProfile(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(SEND_SMS) + fun sendSMS(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(SEND_EMAIL_OTP) + fun sendEmailOtp(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(EMAIL_VERIFY) + fun emailVerify(@FieldMap hashMap: HashMap): Call> + + @POST(UPDATE_SERVICES) + fun updateServices(@Body updateServices: UpdateServices): Call> + + @POST(LOGOUT) + fun logout(): Call> + + @FormUrlEncoded + @POST(SUBSCRIBE_SERVICE) + fun subscribeService(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(UPDATE_FCM_ID) + fun updateFcmId(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ACCEPT_REQUEST) + fun acceptRequest(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ACCEPT_REQUEST_V2) + fun acceptRequestV2(@FieldMap hashMap: HashMap): Call> + + + @FormUrlEncoded + @POST(START_REQUEST) + fun startRequest(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(START_CALL) + fun startCall(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(COMPLETE_CHAT) + fun completeChat(@FieldMap hashMap: HashMap): Call> + + @Multipart + @POST(UPLOAD_IMAGE) + fun uploadFile(@PartMap map: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_BANK) + fun addBank(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(FEEDS) + fun feeds(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_CLASS) + fun addClass(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CLASS_STATUS) + fun classStatus(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CANCEL_REQUEST) + fun cancelRequest(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CANCEL_REQUEST_V2) + fun cancelRequestV2(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CALL_STATUS) + fun callStatus(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_CARD) + fun addCard(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(UPDATE_CARD) + fun updateCard(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(DELETE_CARD) + fun deleteCard(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(ADD_MONEY) + fun addMoney(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(PAYOUTS) + fun payouts(@FieldMap hashMap: HashMap): Call> + + @POST(ADDITIONAL_DETAIL_DATA) + fun additionalDetailsUpdate(@Body updateDocument: UpdateDocument): Call> + + @FormUrlEncoded + @POST(ADD_FAVORITE) + fun addFavorite(@Path("feed_id") feed_id: String, + @FieldMap hashMap: HashMap): Call> + + @POST(PRE_SCREPTIONS) + fun prescreptions(@Body addPrescription: AddPrescription): Call> + + @FormUrlEncoded + @POST(RAZOR_PAY_WEBHOOK) + fun razorPayWebhook(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(REPLY_QUESTION) + fun replyQuestion(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(WATER_LIMIT) + fun setDailyLimit(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(PROTEIN_LIMIT) + fun setProteinDailyLimit(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(DRINK_WATER) + fun setWaterIntake(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(DRINK_PROTEIN) + fun setProteinIntake(@FieldMap hashMap: HashMap): Call> + + @POST(EXTRA_PAYMENT) + fun extraPayment(@Body extraPayment: Extra_payment): Call> + + @FormUrlEncoded + @POST(UPDATE_CARE_PLANS) + fun updateCarePlans(@FieldMap hashMap: HashMap): Call> + + @FormUrlEncoded + @POST(CREATE_MEDICAL_HISTORY) + fun createMedicalHistory(@FieldMap hashMap: HashMap): Call> + + @POST(ORDER_CREATE) + fun orderCreate(@FieldMap hashMap: HashMap): Call> + + @POST(CONTACT_ADD) + fun addContact(@Body contactList: ContactEmergency): Call> + + @FormUrlEncoded + @POST(CONTACT_DELETE) + fun deletContact(@FieldMap hashMap: HashMap): Call> + + @POST(CONTACT_MESSAGE) + fun sendMessage(): Call> + + + /*GET*/ + + @GET(PROFILE) + fun profile(): Call> + + @GET(CLIENT_DETAILS) + fun clientDetails(@QueryMap hashMap: Map): Call> + + @GET(COUNTRY_DATA) + fun countryData(@QueryMap hashMap: Map): Call> + + @GET(PREFERENCES) + fun preferences(@QueryMap hashMap: Map): Call> + + @GET(BANNERS) + fun banners(): Call> + + @GET(HOME) + fun home(): Call> + + @GET(REQUESTS) + fun request(@QueryMap hashMap: Map): Call> + + @GET(REQUEST_DETAIL) + fun requestDetail(@QueryMap hashMap: Map): Call> + + @GET(DOCTOR_DETAIL) + fun doctorDetails(@QueryMap hashMap: Map): Call> + + @GET(WALLET_HISTORY) + fun walletHistory(@QueryMap hashMap: Map): Call> + + @GET(WALLET) + fun wallet(@QueryMap hashMap: Map): Call> + + @GET(CHAT_LISTING) + fun getChatListing(@QueryMap hashMap: Map): Call> + + @GET(CHAT_MESSAGES) + fun getChatMessage(@QueryMap hashMap: Map): Call> + + @GET(BANK_ACCOUNTS) + fun bankAccounts(@QueryMap hashMap: Map): Call> + + @GET(REVENUE) + fun revenue(@QueryMap hashMap: Map): Call> + + @GET(NOTIFICATIONS) + fun notifications(@QueryMap hashMap: Map): Call> + + @GET(FEEDS) + fun getFeeds(@QueryMap hashMap: Map): Call> + + @GET(VIEW_FEEDS) + fun viewFeeds(@Path("feed_id") feed_id: String): Call> + + + @GET(CATEGORIES) + fun categories(@QueryMap hashMap: Map): Call> + + @GET(GET_SLOTS) + fun getSlots(@QueryMap hashMap: Map): Call> + + @GET(SERVICES) + fun services(@QueryMap hashMap: Map): Call> + + @GET(GET_FILTERS) + fun getFilters(@QueryMap hashMap: Map): Call> + + @GET(CLASSES) + fun classesList(@QueryMap hashMap: Map): Call> + + @GET(PAGES) + fun getPages(): Call> + + @GET(CARD_LISTING) + fun cardListing(@QueryMap hashMap: Map): Call> + + @GET(ADDITIONAL_DETAILS) + fun additionalDetails(@QueryMap hashMap: Map): Call> + + @GET(DIRECTIONS) + fun directions(@QueryMap hashMap: Map): Call + + @GET(ASK_QUESTIONS) + fun getQuestions(@QueryMap hashMap: Map): Call> + + @GET(ASK_QUESTIONS_DETAIL) + fun getQuestionsDetails(@QueryMap hashMap: Map): Call> + + @GET(REQUEST_CHECK) + fun requestCheck(@QueryMap hashMap: Map): Call> + + @GET(WATER_LIMIT) + fun getWaterLimit(@QueryMap hashMap: Map): Call> + + @GET(PROTEIN_LIMIT) + fun getProteinIntake(@QueryMap hashMap: Map): Call> + + @GET(GET_MEDICAL_HISTORY) + fun getMedicalHistory(@QueryMap hashMap: Map): Call> + + @GET(PENDIG_REQUESTS_V2) + fun pendingRequests(): Call> + + @GET(CONTACT_LIST) + fun contactList(@QueryMap hashMap: Map): Call> + + + /*PUT API*/ + @FormUrlEncoded + @PUT(WORKING_HOURS) + fun workingHours(@FieldMap hashMap: HashMap): Call> + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/PushData.kt b/app/src/main/java/com/consultantvendor/data/models/PushData.kt new file mode 100644 index 0000000..6a86cd0 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/PushData.kt @@ -0,0 +1,25 @@ +package com.consultantvendor.data.models + +import java.io.Serializable + +data class PushData( + val msg: String, + var title: String, + val sound: String, + val pushType: String, + val imageUrl: String, + val message: String, + val senderId: String, + val senderName: String, + val receiverId: String, + val messageType: String, + val request_id: String, + val call_id: String, + val service_type: String, + val main_service_type:String, + val sentAt: Long, + val request_time: String, + val sender_name: String, + val sender_image: String, + val vendor_category_name: String +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/AddPrescription.kt b/app/src/main/java/com/consultantvendor/data/models/requests/AddPrescription.kt new file mode 100644 index 0000000..dc7223b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/AddPrescription.kt @@ -0,0 +1,20 @@ +package com.consultantvendor.data.models.requests + +import java.io.Serializable + +class AddPrescription : Serializable { + var request_id: String? = null + var type: String? = null + + /*Manual*/ + var title: String? = null + var image: ArrayList? = null + + /*Digital*/ + var pre_scription_notes: String? = null + var pre_scriptions: ArrayList? = null + + /*get data*/ + var medicines: ArrayList? = null + var images: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/AppFeatures.kt b/app/src/main/java/com/consultantvendor/data/models/requests/AppFeatures.kt new file mode 100644 index 0000000..bb5a706 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/AppFeatures.kt @@ -0,0 +1,23 @@ +package com.consultantvendor.data.models.requests + +class AppFeatures { + var needUserDoctorScreen = false + var needSideDrawer = false + + var needLanguageScreen = false + var needClasses = false + var freeExpertAdvise=false + + var needWalkThrough = false + + var needLocation = false + + var needBlogs = false + var needArticles = false + + var needHealthTools = false + + var signUpAddition = false + var needInsurance = true + var needInviteCode = false +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/BookingRequest.kt b/app/src/main/java/com/consultantvendor/data/models/requests/BookingRequest.kt new file mode 100644 index 0000000..a847355 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/BookingRequest.kt @@ -0,0 +1,13 @@ +package com.consultantvendor.data.models.requests + +class BookingRequest { + var type: String? = null + var doctor: String? = null + var checkAvailability = false + var timeZone: String? = null + + /*Edit Appointment*/ + var appointmentId: String? = null + var updatedDate: String? = null + var userType: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/DatesAvailability.kt b/app/src/main/java/com/consultantvendor/data/models/requests/DatesAvailability.kt new file mode 100644 index 0000000..8cca376 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/DatesAvailability.kt @@ -0,0 +1,10 @@ +package com.consultantvendor.data.models.requests + +class DatesAvailability { + var displayName: String? = null + var date: Long? = null + var isSelected = false + + /*Water intake*/ + var intakeAmount: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/DigitalPrescription.kt b/app/src/main/java/com/consultantvendor/data/models/requests/DigitalPrescription.kt new file mode 100644 index 0000000..a0920ab --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/DigitalPrescription.kt @@ -0,0 +1,10 @@ +package com.consultantvendor.data.models.requests + +import java.io.Serializable + +class DigitalPrescription : Serializable { + var medicine_name: String? = null + var duration: String? = null + var dosage_timing: ArrayList? = null + var dosage_type: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/Doases.kt b/app/src/main/java/com/consultantvendor/data/models/requests/Doases.kt new file mode 100644 index 0000000..247cc93 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/Doases.kt @@ -0,0 +1,10 @@ +package com.consultantvendor.data.models.requests + +import java.io.Serializable + +class Doases : Serializable { + var time: String? = null + var checked: Boolean? = null + var with: String? = null + var dose_value: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/DocImage.kt b/app/src/main/java/com/consultantvendor/data/models/requests/DocImage.kt new file mode 100644 index 0000000..43db42b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/DocImage.kt @@ -0,0 +1,11 @@ +package com.consultantvendor.data.models.requests + +import java.io.File +import java.io.Serializable + +class DocImage : Serializable { + var imageFile: File? = null + var type: String? = null + + var image: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/Interval.kt b/app/src/main/java/com/consultantvendor/data/models/requests/Interval.kt new file mode 100644 index 0000000..e9d6072 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/Interval.kt @@ -0,0 +1,8 @@ +package com.consultantvendor.data.models.requests + +import java.io.Serializable + +data class Interval ( + var start_time: String? = null, + var end_time: String? = null +):Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/SaveAddress.kt b/app/src/main/java/com/consultantvendor/data/models/requests/SaveAddress.kt new file mode 100644 index 0000000..5f4cedb --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/SaveAddress.kt @@ -0,0 +1,14 @@ +package com.consultantvendor.data.models.requests + +import java.io.Serializable + +class SaveAddress : Serializable { + var locationName: String? = null + var houseNumber: String? = null + var isDefault = false + var _id: String? = null + var addressId: String? = null + + var lat: Double? = null + var long: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/SetAvailability.kt b/app/src/main/java/com/consultantvendor/data/models/requests/SetAvailability.kt new file mode 100644 index 0000000..5dd0181 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/SetAvailability.kt @@ -0,0 +1,10 @@ +package com.consultantvendor.data.models.requests + +import java.io.Serializable + +class SetAvailability : Serializable { + var days: ArrayList? = null + var slots: ArrayList? = null + var applyoption: String? = null + var date: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/SetFilter.kt b/app/src/main/java/com/consultantvendor/data/models/requests/SetFilter.kt new file mode 100644 index 0000000..4598d65 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/SetFilter.kt @@ -0,0 +1,11 @@ +package com.consultantvendor.data.models.requests + +import java.io.Serializable + +class SetFilter :Serializable{ + var filter_id: Int? = null + var filter_option_ids: ArrayList? = null + + var preference_id: Int? = null + var option_ids: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/SetService.kt b/app/src/main/java/com/consultantvendor/data/models/requests/SetService.kt new file mode 100644 index 0000000..8451ced --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/SetService.kt @@ -0,0 +1,12 @@ +package com.consultantvendor.data.models.requests + +class SetService { + var id: String? = null + var available = "1" + var price: Double? = null + var minimmum_heads_up = "5" + var isAvailabilityChanged = false + var availability: SetAvailability? = null + + var clinic_address: SaveAddress? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/UpdateDocument.kt b/app/src/main/java/com/consultantvendor/data/models/requests/UpdateDocument.kt new file mode 100644 index 0000000..c49228d --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/UpdateDocument.kt @@ -0,0 +1,8 @@ +package com.consultantvendor.data.models.requests + +import com.consultantvendor.data.models.responses.AdditionalField + +class UpdateDocument { + var sp_id: String? = null + var fields: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/requests/UpdateServices.kt b/app/src/main/java/com/consultantvendor/data/models/requests/UpdateServices.kt new file mode 100644 index 0000000..7ca8cc9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/requests/UpdateServices.kt @@ -0,0 +1,7 @@ +package com.consultantvendor.data.models.requests + +class UpdateServices { + var category_id: String? = null + var filters: ArrayList? = null + var category_services_type: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/AdditionalField.kt b/app/src/main/java/com/consultantvendor/data/models/responses/AdditionalField.kt new file mode 100644 index 0000000..40ab79e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/AdditionalField.kt @@ -0,0 +1,14 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class AdditionalField : Serializable { + var id: String? = null + var name: String? = null + var category_id: String? = null + var type: String? = null + var is_enable: String? = null + var documents = ArrayList() + var created_at: String? = null + var updated_at: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/AdditionalFieldDocument.kt b/app/src/main/java/com/consultantvendor/data/models/responses/AdditionalFieldDocument.kt new file mode 100644 index 0000000..20b9249 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/AdditionalFieldDocument.kt @@ -0,0 +1,10 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class AdditionalFieldDocument : Serializable { + var id: String? = null + var title: String? = null + var description: String? = null + var file_name: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Bank.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Bank.kt new file mode 100644 index 0000000..84e4aab --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Bank.kt @@ -0,0 +1,16 @@ +package com.consultantvendor.data.models.responses + +class Bank { + + var id: String? = null + var bank_name: String? = null + var last_four_digit: String? = null + var created_at: String? = null + + var name: String? = null + var ifc_code: String? = null + var account_holder_type: String? = null + var country: String? = null + var currency: String? = null + var account_number: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Banner.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Banner.kt new file mode 100644 index 0000000..c997768 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Banner.kt @@ -0,0 +1,27 @@ +package com.consultantvendor.data.models.responses + +class Banner { + var id: Int? = null + var image_web: Any? = null + var image_mobile: String? = null + var position: String? = null + var banner_type: String? = null + var start_date: String? = null + var end_date: String? = null + var category_id: String? = null + var category: Categories? = null + var sp_id: String? = null + var class_id: String? = null + var created_at: String? = null + var updated_at: String? = null + + /*Coupon*/ + var service_id: String? = null + var service :Service?=null + var minimum_value: String? = null + var limit: Int? = null + var coupon_code: String? = null + var maximum_discount_amount: String? = null + var discount_type: String? = null + var discount_value: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Categories.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Categories.kt new file mode 100644 index 0000000..7f355fe --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Categories.kt @@ -0,0 +1,18 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class Categories : Serializable { + var id: String? = null + var name: String? = null + var image: String? = null + var parent_id: String? = null + var created_at: String? = null + var color_code: String? = null + var description: String? = null + var image_icon: String? = null + var multi_select: String? = null + var is_subcategory: Boolean? = null + var is_additionals: Boolean? = null + var is_filters: Boolean? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/ClassData.kt b/app/src/main/java/com/consultantvendor/data/models/responses/ClassData.kt new file mode 100644 index 0000000..c009850 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/ClassData.kt @@ -0,0 +1,18 @@ +package com.consultantvendor.data.models.responses + +class ClassData { + var id: String? = null + var name: String? = null + var status: String? = null + var class_date: String? = null + var created_at: String? = null + var bookingDateUTC: String? = null + var price: String? = null + var category_id: Int? = null + var created_by: UserData? = null + var booking_date: String? = null + var time: String? = null + var category_data: Categories? = null + var totalAssignedUser:Int?=null + var enroll_users: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/CommonDataModel.kt b/app/src/main/java/com/consultantvendor/data/models/responses/CommonDataModel.kt new file mode 100644 index 0000000..40dd743 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/CommonDataModel.kt @@ -0,0 +1,100 @@ +package com.consultantvendor.data.models.responses + +import com.consultantvendor.data.models.requests.Interval +import com.consultantvendor.data.models.responses.chat.ChatList +import com.consultantvendor.data.models.responses.chat.ChatMessage + +class CommonDataModel { + var dcotor_detail: UserData? = null + var category: Categories? = null + var requests: List? = null + var payments: List? = null + var bank_accounts: List? = null + var lists: List? = null + var messages: List? = null + var notifications: List? = null + var classes_category: List? = null + var services: List? = null + var filters: List? = null + var classes: List? = null + var slots: List? = null + var banners: List? = null + + var balance: String? = null + var after: String? = null + var before: String? = null + var per_page: String? = null + var isOnline: Boolean? = null + var image_name: String? = null + var isAprroved: Boolean? = null + + var CALLING_TYPE: String? = null + var request_status: String? = null + var currentTimer: Long? = null + + var subscriptions: ArrayList? = null + + var isCallFrom: String? = null + + /*Twili*/ + var twilioToken: String? = null + + var action: String? = null + + /*Pages*/ + var pages: List? = null + + /*Add money stripe authentication*/ + var requires_source_action: Boolean? = null + var url: String? = null + var transaction_id: String? = null + var transactionCompleted: Boolean? = null + + + var order_id: String? = null + + var cards: List? = null + + /*Country*/ + var type: String? = null + var country: List? = null + var city: List? = null + var state: List? = null + + /*Additional Field*/ + var additional_details: List? = null + var additionals: List? = null + + + /*Caller id*/ + var call_id: String? = null + + /*Feeds*/ + var feeds: List? = null + var feed: Feed? = null + + /*Home*/ + var top_doctors: List? = null + var top_blogs: List? = null + var top_articles: List? = null + + /*SignUp*/ + var preferences: List? = null + + /*Request*/ + var request_detail: Request? = null + var status: String? = null + + /*Home*/ + var questions: List? = null + var question: Feed? = null + + var doctors: List? = null + var pending_requests: ArrayList? = null + //var pending_requests_new: ArrayList? = null + + var contacts: List? = null + + var contact_added: Boolean? = null + var notification_count: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/ContactEmergency.kt b/app/src/main/java/com/consultantvendor/data/models/responses/ContactEmergency.kt new file mode 100644 index 0000000..6abc105 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/ContactEmergency.kt @@ -0,0 +1,17 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +data class ContactEmergency( + var id: String? = null, + var contacts: ArrayList? = null, + + /*Contacts*/ + var name: String? = null, + var phone_numbers: ArrayList? = null, + + /*Phone number*/ + var phone: String? = null, + var type_label: String? = null + +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/CountryCity.kt b/app/src/main/java/com/consultantvendor/data/models/responses/CountryCity.kt new file mode 100644 index 0000000..aaac8fd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/CountryCity.kt @@ -0,0 +1,8 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class CountryCity : Serializable { + var id: String? = null + var name: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Extra_detail.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Extra_detail.kt new file mode 100644 index 0000000..a4b1c6f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Extra_detail.kt @@ -0,0 +1,24 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class Extra_detail :Serializable{ + var id: Int? = null + var request_id: Int? = null + var first_name: String? = null + var last_name: String? = null + var service_for: String? = null + var home_care_req: String? = null + var service_address: String? = null + var lat: String? = null + var long: String? = null + var reason_for_service: String? = null + var created_at: String? = null + var updated_at: String? = null + var start_time: String? = null + var end_time: String? = null + var working_dates: String? = null + var filter_id: String? = null + var filter_name: String? = null + var distance: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Extra_payment.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Extra_payment.kt new file mode 100644 index 0000000..be318eb --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Extra_payment.kt @@ -0,0 +1,11 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class Extra_payment :Serializable{ + var id: Int? = null + var request_id: String? = null + var balance: String? = null + var description: String? = null + var status: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Feed.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Feed.kt new file mode 100644 index 0000000..1e735f5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Feed.kt @@ -0,0 +1,25 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class Feed :Serializable{ + var id: String? = null + var title: String? = null + var image: String? = null + var description: String? = null + var like: Any? = null + var user_id: Int? = null + var created_at: String? = null + var user_data: UserData? = null + var favorite: String? = null + var views: String? = null + var is_favorite: Boolean? = null + + var user: UserData? = null + + /*Ask Question*/ + var answers: List? = null + var answer: String? = null + var created_by: UserData? = null + var you_answered:Boolean?=null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Filter.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Filter.kt new file mode 100644 index 0000000..38b8c71 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Filter.kt @@ -0,0 +1,26 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + + +data class Filter ( + var id: Int? = null, + var category_id: Int? = null, + var filter_name: String? = null, + var preference_name: String? = null, + var is_multi: String? = null, + var options: List? = null, + + /*Options*/ + var option_name: String? = null, + var filter_type_id: Int? = null, + var isSelected :Boolean= false, + + /*Symptom*/ + var name: String? = null, + + var title: String? = null, + var tier_options: List? = null, + var type: String? = null, + var status: String? = null +) :Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/FilterOption.kt b/app/src/main/java/com/consultantvendor/data/models/responses/FilterOption.kt new file mode 100644 index 0000000..eccc1d9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/FilterOption.kt @@ -0,0 +1,11 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class FilterOption :Serializable{ + var id: String? = null + var option_name: String? = null + var filter_type_id: Int? = null + + var isSelected = false +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/JitsiClass.kt b/app/src/main/java/com/consultantvendor/data/models/responses/JitsiClass.kt new file mode 100644 index 0000000..3556c6d --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/JitsiClass.kt @@ -0,0 +1,12 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class JitsiClass : Serializable { + + var id: String? = null + var call_id:String?=null + var name: String? = null + var callType: String? = null + var isClass = false +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/MedicalHistory.kt b/app/src/main/java/com/consultantvendor/data/models/responses/MedicalHistory.kt new file mode 100644 index 0000000..5bb8335 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/MedicalHistory.kt @@ -0,0 +1,13 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + + +data class MedicalHistory ( + var id: Int? = null, + var request_id: Int? = null, + var comment: String? = null, + var preference_name: String? = null, + var request: Request? = null, + +) :Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/MonthlyRevenue.kt b/app/src/main/java/com/consultantvendor/data/models/responses/MonthlyRevenue.kt new file mode 100644 index 0000000..b60a35b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/MonthlyRevenue.kt @@ -0,0 +1,9 @@ +package com.consultantvendor.data.models.responses + +class MonthlyRevenue { + + var revenue: Float? = null + var monthNumber: String? = null + var monthName: String? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Notification.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Notification.kt new file mode 100644 index 0000000..3ba7eba --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Notification.kt @@ -0,0 +1,14 @@ +package com.consultantvendor.data.models.responses + +class Notification { + + var id: String? = null + var pushType: String? = null + var message: String? = null + var module: String? = null + var module_id: String? = null + var created_at: String? = null + var read_status: String? = null + var form_user: UserData? = null + var to_user: UserData? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Page.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Page.kt new file mode 100644 index 0000000..eefed92 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Page.kt @@ -0,0 +1,20 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +data class Page( + var id: Int? = null, + var icon: Int? = null, + + var slug: String? = null, + var title: String? = null, + var app_type: String? = null, + + var desc: String? = null, + + var question: String? = null, + var answer: String? = null, + + var status: String? = null + +) : Serializable \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Profile.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Profile.kt new file mode 100644 index 0000000..4d8dc5f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Profile.kt @@ -0,0 +1,33 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class Profile :Serializable{ + + var id: Int? = null + var avatar: Any? = null + var title:String?=null + var dob: String? = null + var working_since: String? = null + var qualification: Any? = null + var rating: Any? = null + var bio: String? = null + var user_id: Int? = null + var created_at: String? = null + var updated_at: String? = null + + var experience: String? = null + var call_price: String? = null + var chat_price: String? = null + + var address: String? = null + var city: String? = null + var state: String? = null + var country: String? = null + + var country_id: String? = null + var state_id: String? = null + var city_id: String? = null + + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Request.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Request.kt new file mode 100644 index 0000000..c307a47 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Request.kt @@ -0,0 +1,44 @@ +package com.consultantvendor.data.models.responses + +import com.consultantvendor.data.models.requests.AddPrescription +import com.consultantvendor.data.models.requests.DocImage +import java.io.Serializable +import java.util.Locale.Category + +class Request : Serializable { + + var id: String? = null + var booking_date: String? = null + var from_user: UserData? = null + var to_user: UserData? = null + var time: String? = null + var service_type: String ? = null + var main_service_type: String? = null + var status: String? = null + var price: String? = null + var created_at: String? = null + var bookingDateUTC: String? = null + var end_date: String? = null + var booking_end_date: String? = null + var canReschedule = false + var canCancel = false + + var call_id: String? = null + var is_prescription: Boolean? = null + var extra_detail: Extra_detail? = null + + var symptoms: List? = null + var symptom_details: String? = null + var symptom_images: List? = null + + var pre_scription: AddPrescription? = null + var extra_payment: Extra_payment? = null + + var cancel_reason: String? = null + + var care_plans: List? = null + var question_answers: List? = null + var tier_detail: Filter? = null + var medical_history_added:Boolean?=null + var remain_second:Long?=null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Revenue.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Revenue.kt new file mode 100644 index 0000000..5464a16 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Revenue.kt @@ -0,0 +1,14 @@ +package com.consultantvendor.data.models.responses + +class Revenue { + + var id: String? = null + var totalChat: String? = null + var totalCall: String? = null + var totalRequest: String? = null + var completedRequest: String? = null + var unSuccesfullRequest: String? = null + var totalRevenue: String? = null + var services: ArrayList? = null + var monthlyRevenue: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Service.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Service.kt new file mode 100644 index 0000000..59f7455 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Service.kt @@ -0,0 +1,44 @@ +package com.consultantvendor.data.models.responses + +import com.consultantvendor.data.models.requests.SaveAddress +import com.consultantvendor.data.models.requests.SetAvailability +import java.io.Serializable + +class Service :Serializable{ + var id: String? = null + var category_id: String? = null + var service_id: String? = null + var is_active: String? = null + var price_minimum: Double? = null + var price_maximum: Double? = null + var price_fixed: Double? = null + var minimum_duration: Int? = null + var gap_duration: Int? = null + var created_at: String? = null + var updated_at: String? = null + var name: String? = null + var description: String? = null + var need_availability: String? = null + var price_type: String? = null + var unit_price: Double? = null + + var isSelected = false + var setAvailability: SetAvailability? = null + var clinic_address: SaveAddress? = null + var isAvailabilityChanged = false + var isAvailabilityLocal = false + var price: String? = null + var available:String?=null + + var sp_id: Int? = null + var category_service_id: Int? = null + var duration: String? = null + var minimmum_heads_up: String? = null + var deleted_at: Any? = null + var category_name: String? = null + var service_name: String? = null + var main_service_type: String? = null + var color_code: String? = null + + var count:String?=null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Subscription.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Subscription.kt new file mode 100644 index 0000000..4946447 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Subscription.kt @@ -0,0 +1,12 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class Subscription :Serializable{ + + var service_id: Int? = null + var charges: String? = null + var duration: Int? = null + var type: String? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/UserData.kt b/app/src/main/java/com/consultantvendor/data/models/responses/UserData.kt new file mode 100644 index 0000000..f72edbd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/UserData.kt @@ -0,0 +1,51 @@ +package com.consultantvendor.data.models.responses + +import com.consultantvendor.data.models.responses.appdetails.Insurance +import java.io.Serializable + +class UserData : Serializable { + var id: String? = null + var name: String? = null + var phone: String? = null + var country_code: String? = null + var profile_image: String? = null + var fcm_id: String? = null + var email: String? = null + var email_verified_at: Any? = null + var created_at: String? = null + var updated_at: String? = null + var token: String? = null + var provider_type: String? = null + var profile: Profile? = null + var account_step: String? = null + var reference_code: String? = null + + var subscriptions: ArrayList? = null + var categoryData: Categories? = null + var filters: ArrayList? = null + var services: ArrayList? = null + var additionals: ArrayList? = null + + //var roles: List? = null + var rating: String? = null + var reviews: String? = null + var patientCount: String? = null + var experience: String? = null + var speciality: String? = null + var call_price: String? = null + var chat_price: String? = null + var totalRating: String? = null + var reviewCount: String? = null + + /*Insurance*/ + var insurance_enable: String? = null + var insurances: ArrayList? = null + var custom_fields: ArrayList? = null + + /*Prefrences*/ + var master_preferences: ArrayList? = null + + var medical_history: ArrayList? = null + var category:String?=null + +} diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/Wallet.kt b/app/src/main/java/com/consultantvendor/data/models/responses/Wallet.kt new file mode 100644 index 0000000..f5ac440 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/Wallet.kt @@ -0,0 +1,27 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class Wallet :Serializable{ + + var id: String? = null + var from: UserData? = null + var to: UserData? = null + var transaction_id: Int? = null + var created_at: String? = null + var updated_at: String? = null + var type: String? = null + var closing_balance: String? = null + var amount: String? = null + var service_type: String? = null + var status: String? = null + + /*Cards*/ + var isSelected = false + var card_brand: String? = null + var last_four_digit: String? = null + + /*Payout*/ + var payout_message: String? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/WaterIntake.kt b/app/src/main/java/com/consultantvendor/data/models/responses/WaterIntake.kt new file mode 100644 index 0000000..adaf7bb --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/WaterIntake.kt @@ -0,0 +1,9 @@ +package com.consultantvendor.data.models.responses + +import java.io.Serializable + +class WaterIntake : Serializable { + var limit: Double? = null + var total_achieved_goal: String? = null + var today_intake: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/AppVersion.kt b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/AppVersion.kt new file mode 100644 index 0000000..474cec9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/AppVersion.kt @@ -0,0 +1,46 @@ +package com.consultantvendor.data.models.responses.appdetails + +import com.consultantvendor.data.models.responses.Page +import java.util.* + +class AppVersion { + + var update_type: Int? = null + var message: String? = null + var privateKey: String? = null + var publicKey: String? = null + + var version_name: String? = null + var current_version: Int? = null + var charges: String? = null + var audio_video: String? = null + var class_calling: String? = null + var unit_price: String? = null + var slot_duration: String? = null + var vendor_auto_approved: Boolean? = null + var currency: String? = null + var jitsi_id: String? = null + var applogo: String? = null + var domain = "" + /*Urls*/ + var domain_url: String? = null + var media_url: String? = null + var socket_url: String? = null + var jitsi_meet_url: String? = null + + var payment_type: String? = null + var gateway_key: String? = null + var insurance: Boolean? = null + var insurances: ArrayList? = null + var custom_fields: CustomFields? = null + var country_id: String? = null + var country_code: Int? = null + var country_name_code: String? = null + + var client_features: ArrayList? = null + var clientFeaturesKeys = ClientFeaturesKeys() + + /*Pages*/ + var pages: ArrayList? = null + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/ClientFeatures.kt b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/ClientFeatures.kt new file mode 100644 index 0000000..753539b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/ClientFeatures.kt @@ -0,0 +1,9 @@ +package com.consultantvendor.data.models.responses.appdetails + +class ClientFeatures { + var client_feature_id: String? = null + var client_id: String? = null + var feature_id: String? = null + //var feature_values: String? = null + var name: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/ClientFeaturesKeys.kt b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/ClientFeaturesKeys.kt new file mode 100644 index 0000000..8ee0f6a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/ClientFeaturesKeys.kt @@ -0,0 +1,6 @@ +package com.consultantvendor.data.models.responses.appdetails + +class ClientFeaturesKeys { + var isAddress: Boolean? = null + var isInsurance: Boolean? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/CustomFields.kt b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/CustomFields.kt new file mode 100644 index 0000000..8305f80 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/CustomFields.kt @@ -0,0 +1,8 @@ +package com.consultantvendor.data.models.responses.appdetails + +import java.util.* + +class CustomFields { + var service_provider: ArrayList? = null + var customer: ArrayList? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/Insurance.kt b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/Insurance.kt new file mode 100644 index 0000000..7a8a597 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/appdetails/Insurance.kt @@ -0,0 +1,22 @@ +package com.consultantvendor.data.models.responses.appdetails + +import java.io.Serializable + +class Insurance :Serializable{ + var id: String? = null + var category_id: String? = null + var name: String? = null + var company: String? = null + var enable: String? = null + var created_at: String? = null + var updated_at: String? = null + + var isSelected=false + + + /*Fields*/ + var field_name: String? = null + var field_value:String?=null + var field_type: String? = null + var required_sign_up: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/chat/ChatList.kt b/app/src/main/java/com/consultantvendor/data/models/responses/chat/ChatList.kt new file mode 100644 index 0000000..90686ab --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/chat/ChatList.kt @@ -0,0 +1,18 @@ +package com.consultantvendor.data.models.responses.chat + +import com.consultantvendor.data.models.responses.UserData + +data class ChatList( + var image: String? = null, + val isDelivered: Boolean? = null, + val from_user: UserData? = null, + val to_user: UserData? = null, + var messageType: String? = null, + val isRead: Boolean? = null, + val video: Any? = null, + var id: String? = null, + var last_message: ChatMessage? = null, + var unReadCount: Int, + val chatType: Any? = null, + val status:String?=null +) diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/chat/ChatMessage.kt b/app/src/main/java/com/consultantvendor/data/models/responses/chat/ChatMessage.kt new file mode 100644 index 0000000..6c1848f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/chat/ChatMessage.kt @@ -0,0 +1,24 @@ +package com.consultantvendor.data.models.responses.chat + +import com.consultantvendor.utils.MediaUploadStatus + +data class ChatMessage( + val imageUrl: String? = null, + val message: String? = null, + val senderId: String? = null, + val senderName: String? = null, + val receiverId: String? = null, + var messageType: String? = null, + val request_id: String? = null, + val sentAt: Long? = null, + var status: String? = null, + + var conversationId: String? = null, + //val deleteByList: List? = null, + var isActive: Boolean? = null, + var createAt: String? = null, + var __v: Int? = null, + var mediaUploadStatus: String = MediaUploadStatus.UPLOADED, + var id: String? = null, + var messageId: String? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/chat/Listing.kt b/app/src/main/java/com/consultantvendor/data/models/responses/chat/Listing.kt new file mode 100644 index 0000000..16f5eaf --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/chat/Listing.kt @@ -0,0 +1,7 @@ +package com.consultantvendor.data.models.responses.chat + +data class Listing( + val count: Int? = null, + val isOnline: Boolean? = null, + val listing: T? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Bounds.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Bounds.kt new file mode 100644 index 0000000..76ed5ca --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Bounds.kt @@ -0,0 +1,6 @@ +package com.consultantvendor.data.models.responses.directions + +class Bounds { + var northeast: End_location? = null + var southwest: End_location? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Direction.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Direction.kt new file mode 100644 index 0000000..0e69ef4 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Direction.kt @@ -0,0 +1,7 @@ +package com.consultantvendor.data.models.responses.directions + +class Direction { + var geocoded_waypoints: List? = null + var routes: List? = null + var status: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Distance.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Distance.kt new file mode 100644 index 0000000..183e1cb --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Distance.kt @@ -0,0 +1,6 @@ +package com.consultantvendor.data.models.responses.directions + +class Distance { + var text: String? = null + var value: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Duration.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Duration.kt new file mode 100644 index 0000000..e9facd8 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Duration.kt @@ -0,0 +1,6 @@ +package com.consultantvendor.data.models.responses.directions + +class Duration { + var text: String? = null + var value: Int? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/End_location.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/End_location.kt new file mode 100644 index 0000000..4b364f1 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/End_location.kt @@ -0,0 +1,6 @@ +package com.consultantvendor.data.models.responses.directions + +class End_location { + var lat: Double? = null + var lng: Double? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Geocoded_waypoint.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Geocoded_waypoint.kt new file mode 100644 index 0000000..8a944f3 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Geocoded_waypoint.kt @@ -0,0 +1,7 @@ +package com.consultantvendor.data.models.responses.directions + +class Geocoded_waypoint { + var geocoder_status: String? = null + var place_id: String? = null + var types: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Leg.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Leg.kt new file mode 100644 index 0000000..6213c8e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Leg.kt @@ -0,0 +1,13 @@ +package com.consultantvendor.data.models.responses.directions + +class Leg { + var distance: Distance? = null + var duration: Duration? = null + var end_address: String? = null + var end_location: End_location? = null + var start_address: String? = null + var start_location: End_location? = null + var steps: List? = null + var traffic_speed_entry: List? = null + var via_waypoint: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Overview_polyline.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Overview_polyline.kt new file mode 100644 index 0000000..2309d6f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Overview_polyline.kt @@ -0,0 +1,5 @@ +package com.consultantvendor.data.models.responses.directions + +class Overview_polyline { + var points: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Polyline.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Polyline.kt new file mode 100644 index 0000000..8d1a6a7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Polyline.kt @@ -0,0 +1,5 @@ +package com.consultantvendor.data.models.responses.directions + +class Polyline { + var points: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Route.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Route.kt new file mode 100644 index 0000000..62ca08e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Route.kt @@ -0,0 +1,11 @@ +package com.consultantvendor.data.models.responses.directions + +class Route { + var bounds: Bounds? = null + var copyrights: String? = null + var legs: List? = null + var overview_polyline: Overview_polyline? = null + var summary: String? = null + var warnings: List? = null + var waypoint_order: List? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/models/responses/directions/Step.kt b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Step.kt new file mode 100644 index 0000000..5ed3d4c --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/models/responses/directions/Step.kt @@ -0,0 +1,12 @@ +package com.consultantvendor.data.models.responses.directions + +class Step { + var distance: Distance? = null + var duration: Duration? = null + var end_location: End_location? = null + var html_instructions: String? = null + var polyline: Polyline? = null + var start_location: End_location? = null + var travel_mode: String? = null + var maneuver: String? = null +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/ApiConstants.kt b/app/src/main/java/com/consultantvendor/data/network/ApiConstants.kt new file mode 100644 index 0000000..f2355ec --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/ApiConstants.kt @@ -0,0 +1,61 @@ +package com.consultantvendor.data.network + +const val PER_PAGE_LOAD = 20 +const val PER_PAGE_LOAD_CHAT = 50 + + +object ApiKeys { + + /*facbook,google,email,phone*/ + const val PROVIDER_TYPE = "provider_type" + + /*optional only phone and email*/ + const val PROVIDER_ID = "provider_id" + + /*access_token or password or otp*/ + const val PROVIDER_VERIFICATION = "provider_verification" + const val USER_TYPE = "user_type" + + const val AFTER = "after" + const val BEFORE = "before" + const val PER_PAGE = "per_page" +} + +object ProviderType { + const val facebook = "facebook" + const val google = "google" + const val email = "email" + const val phone = "phone" +} + +object LoadingStatus { + const val ITEM = 0 + const val LOADING = 1 +} + + +object PushType { + const val PROFILE_APPROVED = "PROFILE_APPROVED" + const val CHAT = "chat" + const val NEW_REQUEST = "NEW_REQUEST" + const val BOOKING_REQUEST = "BOOKING_REQUEST" + const val REQUEST_FAILED = "REQUEST_FAILED" + const val CANCELED_REQUEST = "CANCELED_REQUEST" + const val RESCHEDULED_REQUEST = "RESCHEDULED_REQUEST" + const val UPCOMING_APPOINTMENT = "UPCOMING_APPOINTMENT" + const val REQUEST_COMPLETED = "REQUEST_COMPLETED" + const val PATIENT_ADDED_SYMPTOMS="PATIENT_ADDED_SYMPTOMS" + const val COMPLETED = "COMPLETED" + const val AMOUNT_RECEIVED = "AMOUNT_RECEIVED" + const val PAYOUT_PROCESSED = "PAYOUT_PROCESSED" + const val PAYOUT_FAILED="PAYOUT_FAILED" + const val ASSINGED_USER = "ASSINGED_USER" + const val BALANCE_ADDED = "BALANCE_ADDED" + const val BALANCE_FAILED="BALANCE_FAILED" + + const val CALL_RINGING = "CALL_RINGING" + const val CALL_ACCEPTED = "CALL_ACCEPTED" + const val CALL_CANCELED = "CALL_CANCELED" + const val FREE_EXPERT_ADVISE = "FREE_EXPERT_ADVISE" + const val PAID_EXTRA_PAYMENT="PAID_EXTRA_PAYMENT" +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/ApisRespHandler.kt b/app/src/main/java/com/consultantvendor/data/network/ApisRespHandler.kt new file mode 100644 index 0000000..1aa1487 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/ApisRespHandler.kt @@ -0,0 +1,99 @@ +package com.consultantvendor.data.network + +import android.app.Activity +import androidx.appcompat.app.AlertDialog +import com.consultantvendor.R +import com.consultantvendor.data.network.responseUtil.AppError +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.logoutUser + +object ApisRespHandler { + + private var alertDialog: AlertDialog.Builder? = null + + fun handleError(error: AppError?, activity: Activity, prefsManager: PrefsManager) { + error ?: return + + + when (error) { + is AppError.ApiError -> { + if (alertDialog == null) + errorMessage(activity, error.message) + } + + is AppError.ApiUnauthorized -> { + if (alertDialog == null) + sessionExpired(activity, error.message, prefsManager) + } + + is AppError.ApiAccountBlock -> { + if (alertDialog == null) + accountDeleted(activity, error.message, prefsManager) + } + + is AppError.ApiAccountRuleChanged -> { + if (alertDialog == null) + accountDeleted(activity, error.message, prefsManager) + } + + is AppError.ApiFailure -> { + if (alertDialog == null) { + if (error.message.contains("Failed to connect to",true) || + error.message.contains("Unable to resolve host",true) || + error.message.contains("No address associated with hostname",true)) + errorMessage(activity, activity.getString(R.string.check_internet)) + else + errorMessage(activity, error.message) + } + } + } + } + + + private fun sessionExpired(activity: Activity, message: String?, prefsManager: PrefsManager) { + try { + alertDialog = AlertDialog.Builder(activity) + alertDialog?.setCancelable(false) + alertDialog?.setTitle(activity.getString(R.string.alert)) + alertDialog?.setMessage(message) + alertDialog?.setPositiveButton(activity.getString(R.string.login)) { _, _ -> + logoutUser(activity, prefsManager) + alertDialog = null + } + alertDialog?.show() + } catch (ignored: Exception) { + } + } + + private fun accountDeleted(activity: Activity, message: String?, prefsManager: PrefsManager) { + try { + alertDialog = AlertDialog.Builder(activity) + alertDialog?.setCancelable(false) + alertDialog?.setTitle(activity.getString(R.string.alert)) + alertDialog?.setMessage(message) + alertDialog?.setPositiveButton(activity.getString(R.string.ok)) { _, _ -> + logoutUser(activity, prefsManager) + alertDialog = null + } + alertDialog?.show() + + } catch (ignored: Exception) { + } + } + + private fun errorMessage(activity: Activity, message: String?) { + try { + alertDialog = AlertDialog.Builder(activity) + alertDialog?.setCancelable(false) + alertDialog?.setTitle(activity.getString(R.string.alert)) + alertDialog?.setMessage(message) + alertDialog?.setPositiveButton(activity.getString(R.string.ok)) { _, _ -> + alertDialog = null + } + alertDialog?.show() + + } catch (ignored: Exception) { + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/Config.kt b/app/src/main/java/com/consultantvendor/data/network/Config.kt new file mode 100644 index 0000000..34469f7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/Config.kt @@ -0,0 +1,32 @@ +package com.consultantvendor.data.network + +import com.consultantvendor.BuildConfig + +object Config { + + var BASE_URL = "" + + private val appMode = AppMode.DEV + + val baseURL: String + get() { + init(appMode) + return BASE_URL + } + + private fun init(appMode: AppMode) { + + BASE_URL = when (appMode) { + AppMode.DEV -> { + BuildConfig.BASE_URL + } + AppMode.LIVE -> { + BuildConfig.BASE_URL + } + } + } + + private enum class AppMode { + DEV, LIVE + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/ApiResponse.kt b/app/src/main/java/com/consultantvendor/data/network/responseUtil/ApiResponse.kt new file mode 100644 index 0000000..60b3e79 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/ApiResponse.kt @@ -0,0 +1,6 @@ +package com.consultantvendor.data.network.responseUtil + +data class ApiResponse( + val message: String? = null, + val data: T? = null +) \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/ApiUtils.kt b/app/src/main/java/com/consultantvendor/data/network/responseUtil/ApiUtils.kt new file mode 100644 index 0000000..eaf16c5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/ApiUtils.kt @@ -0,0 +1,51 @@ +package com.consultantvendor.data.network.responseUtil + +import org.json.JSONObject +import retrofit2.Response + +object ApiUtils { + private fun getErrorMessage(errorJson: String?): String { + if (errorJson.isNullOrBlank()) { + return "" + } + + return try { + val errorJsonObject = JSONObject(errorJson) + errorJsonObject.getString("message") + } catch (exception: Exception) { + "" + } + } + + fun getError(statusCode: Int, errorJson: String?): AppError { + val message = getErrorMessage(errorJson) + return when (statusCode) { + 401 -> { + AppError.ApiUnauthorized(message) + } + 402 -> { + AppError.ApiAccountBlock(message) + } + 403 -> { + AppError.ApiAccountRuleChanged(message) + } + else -> { + AppError.ApiError(statusCode, message) + } + } + } + + fun failure(throwable: Throwable): AppError { + return AppError.ApiFailure(throwable.localizedMessage ?: "") + } + +// fun imageToRequestBody(imageFile: File): RequestBody = +// RequestBody.create(MediaType.parse("image/*"), imageFile) +// +// fun imageToRequestBodyKey(parameterName: String, fileName: String): String = +// "$parameterName\"; filename=\"$fileName" +} + +fun Response.getAppError(): AppError { + return ApiUtils.getError(code(), errorBody()?.string()) +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/AppError.kt b/app/src/main/java/com/consultantvendor/data/network/responseUtil/AppError.kt new file mode 100644 index 0000000..7e2bf0a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/AppError.kt @@ -0,0 +1,10 @@ +package com.consultantvendor.data.network.responseUtil + +sealed class AppError { + data class ApiError(val statusCode: Int, val message: String) : AppError() + data class ApiUnauthorized(val message: String) : AppError() + data class ApiAccountBlock(val message: String) : AppError() + data class ApiAccountRuleChanged(val message: String) : AppError() + data class ApiFailure(val message: String) : AppError() + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/Data.java b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Data.java new file mode 100644 index 0000000..21a793c --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Data.java @@ -0,0 +1,133 @@ +package com.consultantvendor.data.network.responseUtil; + +import java.util.List; + +public class Data { + private List image; + private String createdAt; + private String subject; + private int V; + private String tenantId; + private String description; + private String id; + private int type; + private String ownerId; + private String propertyId; + private int status; + private String updatedAt; + + public List getImage() { + return image; + } + + public void setImage(List image) { + this.image = image; + } + + public String getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(String createdAt) { + this.createdAt = createdAt; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public int getV() { + return V; + } + + public void setV(int V) { + this.V = V; + } + + public String getTenantId() { + return tenantId; + } + + public void setTenantId(String tenantId) { + this.tenantId = tenantId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getOwnerId() { + return ownerId; + } + + public void setOwnerId(String ownerId) { + this.ownerId = ownerId; + } + + public String getPropertyId() { + return propertyId; + } + + public void setPropertyId(String propertyId) { + this.propertyId = propertyId; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getUpdatedAt() { + return updatedAt; + } + + public void setUpdatedAt(String updatedAt) { + this.updatedAt = updatedAt; + } + + @Override + public String toString() { + return + "Template{" + + "image = '" + image + '\'' + + ",createdAt = '" + createdAt + '\'' + + ",subject = '" + subject + '\'' + + ",__v = '" + V + '\'' + + ",tenantId = '" + tenantId + '\'' + + ",description = '" + description + '\'' + + ",_id = '" + id + '\'' + + ",type = '" + type + '\'' + + ",ownerId = '" + ownerId + '\'' + + ",propertyId = '" + propertyId + '\'' + + ",request_status = '" + status + '\'' + + ",updatedAt = '" + updatedAt + '\'' + + "}"; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/ImageItem.kt b/app/src/main/java/com/consultantvendor/data/network/responseUtil/ImageItem.kt new file mode 100644 index 0000000..acd862c --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/ImageItem.kt @@ -0,0 +1,19 @@ +package com.consultantvendor.data.network.responseUtil + +internal class ImageItem { + var thumbnail: String? = null + var original: String? = null + var name: String? = null + var id: String? = null + var type: String? = null + + override fun toString(): String { + return "ImageItem{" + + "thumbnail = '" + thumbnail + '\''.toString() + + ",original = '" + original + '\''.toString() + + ",name = '" + name + '\''.toString() + + ",_id = '" + id + '\''.toString() + + ",type = '" + type + '\''.toString() + + "}" + } +} diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/Resource.kt b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Resource.kt new file mode 100644 index 0000000..7abe62a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Resource.kt @@ -0,0 +1,22 @@ +package com.consultantvendor.data.network.responseUtil + + +/** + * A generic class that holds a value with its loading request_status. + * @param + */ +data class Resource(val status: Status, val data: T?, val error: AppError?) { + companion object { + fun success(data: T? = null): Resource { + return Resource(Status.SUCCESS, data, null) + } + + fun error(error: AppError): Resource { + return Resource(Status.ERROR, null, error) + } + + fun loading(): Resource { + return Resource(Status.LOADING, null, null) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/Response.kt b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Response.kt new file mode 100644 index 0000000..7dc12c7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Response.kt @@ -0,0 +1,16 @@ +package com.consultantvendor.data.network.responseUtil + + +internal class Response { + var msg: String? = null + var data: Data? = null + var statusCode: Int = 0 + + override fun toString(): String { + return "Response{" + + "msg = '" + msg + '\''.toString() + + ",data = '" + data + '\''.toString() + + ",statusCode = '" + statusCode + '\''.toString() + + "}" + } +} diff --git a/app/src/main/java/com/consultantvendor/data/network/responseUtil/Status.kt b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Status.kt new file mode 100644 index 0000000..c3bb7d9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/network/responseUtil/Status.kt @@ -0,0 +1,14 @@ +package com.consultantvendor.data.network.responseUtil + +/** + * Status of a resource that is provided to the UI. + * + * + * These are usually created by the Repository classes where they return + * `LiveData>` to pass back the latest data to the UI with its fetch request_status. + */ +enum class Status { + SUCCESS, + ERROR, + LOADING +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/data/repos/UserRepository.kt b/app/src/main/java/com/consultantvendor/data/repos/UserRepository.kt new file mode 100644 index 0000000..f43195d --- /dev/null +++ b/app/src/main/java/com/consultantvendor/data/repos/UserRepository.kt @@ -0,0 +1,156 @@ +package com.consultantvendor.data.repos + +import android.util.Log +import androidx.lifecycle.MutableLiveData +import com.consultantvendor.ConsultantApplication +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.PushData +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.models.responses.appdetails.AppVersion +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.utils.* +import com.google.firebase.messaging.FirebaseMessaging +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject +import javax.inject.Singleton + + +@Singleton +class UserRepository @Inject constructor( + private val app: ConsultantApplication, + private val prefsManager: PrefsManager, private val webService: WebService +) { + + val groupCreatedCall = MutableLiveData() + val loginGuestUser = MutableLiveData() + val groupExitResponse = MutableLiveData>() + val pushData = MutableLiveData() + val isNewNotification = MutableLiveData() + + + fun isUserLoggedIn(): Boolean { + val user = getUser() + val appSetting = getAppSetting() + + return if (user?.id.isNullOrEmpty() || user?.name.isNullOrEmpty()) + false + else if (user?.categoryData == null) + false + else if (appSetting.insurance == true && user.insurance_enable == null) + false + else if (appSetting.clientFeaturesKeys.isAddress == true && user.profile?.address.isNullOrEmpty()) + false + else + true + } + + + fun getUser(): UserData? { + return prefsManager.getObject(USER_DATA, UserData::class.java) + } + + fun getAppSetting(): AppVersion { + return prefsManager.getObject(APP_DETAILS, AppVersion::class.java) ?: AppVersion() + } + + fun getUserLanguage(): String { + return prefsManager.getString(USER_LANGUAGE, "") + } + + fun getPushCallData(): PushData? { + return prefsManager.getObject(PUSH_DATA, PushData::class.java) + } + + fun pushTokenUpdate() { + if (isUserLoggedIn()) { + FirebaseMessaging.getInstance().token.addOnCompleteListener { + if (it.isComplete) { + + Log.d("FCMToken", it.result) + + val hashMap = HashMap() + hashMap["fcm_id"] = it.result + + webService.updateFcmId(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, response: Response>) { + if (response.isSuccessful) { + Log.e("fcmToken", "Success") + } else { + Log.e("fcmToken", "Faliure") + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + Log.e("fcmToken", "faliue 500") + } + }) + + + } + } + } + } + + fun callStatus(requestId: String, call_id: String, callStatus: String) { + val hashMap = HashMap() + hashMap["request_id"] = requestId + hashMap["call_id"] = call_id + hashMap["status"] = callStatus + + webService.callStatus(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + Log.e("fcmToken", "Success") + } else { + Log.e("fcmToken", "Faliure") + } + } + + override fun onFailure(call: Call>, + throwable: Throwable) { + Log.e("fcmToken", "faliue 500") + } + }) + } + + fun getPages() { + webService.getPages() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + val commonData = Resource.success(response.body()?.data) + + val appDetails = getAppSetting() + appDetails.pages = ArrayList() + appDetails.pages?.addAll(commonData.data?.pages ?: emptyList()) + + prefsManager.remove(APP_DETAILS) + prefsManager.save(APP_DETAILS, appDetails) + appClientDetails = getAppSetting() + } else { + Log.e("getPages", "Faliure") + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + Log.e("getPages", "faliue 500") + } + }) + + + } + +} + diff --git a/app/src/main/java/com/consultantvendor/di/AppComponent.kt b/app/src/main/java/com/consultantvendor/di/AppComponent.kt new file mode 100644 index 0000000..f47c4c1 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/AppComponent.kt @@ -0,0 +1,23 @@ +package com.consultantvendor.di + +import com.consultantvendor.ConsultantApplication +import dagger.Component +import dagger.android.AndroidInjector +import dagger.android.support.AndroidSupportInjectionModule +import javax.inject.Singleton + + +@Component(modules = [ + AndroidSupportInjectionModule::class, + AppModule::class, + BindingsModule::class, + ServiceBuilderModule::class, + NetworkModule::class, + ViewModelsModule::class +]) +@Singleton +interface AppComponent : AndroidInjector { + + @Component.Builder + abstract class Builder : AndroidInjector.Builder() +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/AppModule.kt b/app/src/main/java/com/consultantvendor/di/AppModule.kt new file mode 100644 index 0000000..3bfb662 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/AppModule.kt @@ -0,0 +1,44 @@ +package com.consultantvendor.di + +import android.content.Context +import android.content.SharedPreferences +import android.preference.PreferenceManager +import com.consultantvendor.ConsultantApplication +import com.consultantvendor.pushNotifications.MessagingService +import com.google.gson.FieldNamingPolicy +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import dagger.Module +import dagger.Provides +import javax.inject.Singleton + + +@Module +object AppModule { + + @Provides + @Singleton + @JvmStatic + fun provideContext(app: ConsultantApplication): Context = app.applicationContext + + @Provides + @Singleton + @JvmStatic + fun provideMessagingService(messagingService: MessagingService): MessagingService = MessagingService() + + @Provides + @Singleton + @JvmStatic + fun sharedPreferences(context: Context): SharedPreferences = PreferenceManager.getDefaultSharedPreferences(context) + + @Provides + @Singleton + @JvmStatic + fun provideGson(): Gson { + return GsonBuilder() + .setFieldNamingPolicy(FieldNamingPolicy.IDENTITY) + .setPrettyPrinting() + .setLenient() + .create() + } +} diff --git a/app/src/main/java/com/consultantvendor/di/BindingsModule.kt b/app/src/main/java/com/consultantvendor/di/BindingsModule.kt new file mode 100644 index 0000000..5ed0532 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/BindingsModule.kt @@ -0,0 +1,276 @@ +package com.consultantvendor.di + +import com.consultantvendor.ui.SplashActivity +import com.consultantvendor.ui.calling.CallingActivity +import com.consultantvendor.ui.chat.ChatFragment +import com.consultantvendor.ui.chat.chatdetail.ChatDetailActivity +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.ui.dashboard.feeds.AddFeedFragment +import com.consultantvendor.ui.dashboard.feeds.FeedDetailsFragment +import com.consultantvendor.ui.dashboard.feeds.FeedsFragment +import com.consultantvendor.ui.dashboard.home.AppointmentFragment +import com.consultantvendor.ui.dashboard.home.HomeBannerFragment +import com.consultantvendor.ui.dashboard.home.HomeFragment +import com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus.AppointmentStatusActivity +import com.consultantvendor.ui.dashboard.home.appointment.detail.AppointmentDetailsFragment +import com.consultantvendor.ui.dashboard.home.appointment.detail.BottomExtraChargesFragment +import com.consultantvendor.ui.dashboard.home.appointment.medicalhistory.MedicalHistoryFragment +import com.consultantvendor.ui.dashboard.home.appointment.requests.BottomServiceRequestFragment +import com.consultantvendor.ui.dashboard.home.appointment.requests.BottomServiceRequestNewFragment +import com.consultantvendor.ui.dashboard.home.healthtool.bmichecker.BmiCheckerFragment +import com.consultantvendor.ui.dashboard.home.healthtool.pregnancycalculator.BottomPregnancyFragment +import com.consultantvendor.ui.dashboard.home.healthtool.pregnancycalculator.PregnancyCalculatorFragment +import com.consultantvendor.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantvendor.ui.dashboard.home.healthtool.waterintake.BottomWaterLimitFragment +import com.consultantvendor.ui.dashboard.home.healthtool.waterintake.WaterIntakeFragment +import com.consultantvendor.ui.dashboard.home.prescription.BottomPrescriptionFragment +import com.consultantvendor.ui.dashboard.home.prescription.digital.DigitalPrescriptionFragment +import com.consultantvendor.ui.dashboard.home.prescription.manual.ManualPrescriptionFragment +import com.consultantvendor.ui.dashboard.home.questions.QuestionsFragment +import com.consultantvendor.ui.dashboard.home.questions.detail.QuestionDetailFragment +import com.consultantvendor.ui.dashboard.language.LanguageFragment +import com.consultantvendor.ui.dashboard.location.AddAddressActivity +import com.consultantvendor.ui.dashboard.location.LocationFragment +import com.consultantvendor.ui.dashboard.revenue.RevenueFragment +import com.consultantvendor.ui.dashboard.settings.SettingsFragment +import com.consultantvendor.ui.dashboard.settings.contactlist.ContactListFragment +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.ui.dashboard.success.SuccessFragment +import com.consultantvendor.ui.dashboard.wallet.PayoutFragment +import com.consultantvendor.ui.dashboard.wallet.WalletFragment +import com.consultantvendor.ui.dashboard.wallet.addmoney.AddCardFragment +import com.consultantvendor.ui.dashboard.wallet.addmoney.AddMoneyActivity +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.drawermenu.classes.ClassesFragment +import com.consultantvendor.ui.drawermenu.classes.addclass.AddClassFragment +import com.consultantvendor.ui.drawermenu.history.HistoryFragment +import com.consultantvendor.ui.drawermenu.notification.NotificationFragment +import com.consultantvendor.ui.drawermenu.profile.ProfileFragment +import com.consultantvendor.ui.jitsimeet.JitsiActivity +import com.consultantvendor.ui.loginSignUp.SignUpActivity +import com.consultantvendor.ui.loginSignUp.availability.SetAvailabilityFragment +import com.consultantvendor.ui.loginSignUp.category.CategoryFragment +import com.consultantvendor.ui.loginSignUp.changepassword.ChangePasswordFragment +import com.consultantvendor.ui.loginSignUp.document.DocumentsFragment +import com.consultantvendor.ui.loginSignUp.document.add.DialogAddDocumentFragment +import com.consultantvendor.ui.loginSignUp.forgotpassword.ForgotPasswordFragment +import com.consultantvendor.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantvendor.ui.loginSignUp.login.LoginFragment +import com.consultantvendor.ui.loginSignUp.loginemail.LoginEmailFragment +import com.consultantvendor.ui.loginSignUp.prefrence.PrefrenceFragment +import com.consultantvendor.ui.loginSignUp.service.ServiceFragment +import com.consultantvendor.ui.loginSignUp.signup.SignUpFragment +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment +import com.consultantvendor.ui.loginSignUp.verifyotp.VerifyOTPFragment +import com.consultantvendor.ui.loginSignUp.welcome.BannerFragment +import com.consultantvendor.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantvendor.ui.walkthrough.WalkThroughDetailFragment +import com.consultantvendor.ui.walkthrough.WalkThroughFragment +import com.consultantvendor.ui.webview.WebViewActivity +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class BindingsModule { + + @ContributesAndroidInjector + abstract fun splashActivity(): SplashActivity + + + @ContributesAndroidInjector + abstract fun homeActivity(): HomeActivity + + @ContributesAndroidInjector + abstract fun signUpActivity(): SignUpActivity + + @ContributesAndroidInjector + abstract fun welcomeFragment(): WelcomeFragment + + @ContributesAndroidInjector + abstract fun loginFragment(): LoginFragment + + @ContributesAndroidInjector + abstract fun verifyOTPFragment(): VerifyOTPFragment + + @ContributesAndroidInjector + abstract fun drawerActivity(): DrawerActivity + + @ContributesAndroidInjector + abstract fun signUpFragment(): SignUpFragment + + @ContributesAndroidInjector + abstract fun loginEmailFragment(): LoginEmailFragment + + @ContributesAndroidInjector + abstract fun historyFragment(): HistoryFragment + + @ContributesAndroidInjector + abstract fun homeFragment(): HomeFragment + + @ContributesAndroidInjector + abstract fun appointmentFragment(): AppointmentFragment + + @ContributesAndroidInjector + abstract fun appointmentDetailsFragment(): AppointmentDetailsFragment + + @ContributesAndroidInjector + abstract fun profileFragment(): ProfileFragment + + @ContributesAndroidInjector + abstract fun walletFragment(): WalletFragment + + @ContributesAndroidInjector + abstract fun notificationFragment(): NotificationFragment + + @ContributesAndroidInjector + abstract fun forgotPasswordFragment(): ForgotPasswordFragment + + @ContributesAndroidInjector + abstract fun changePasswordFragment(): ChangePasswordFragment + + @ContributesAndroidInjector + abstract fun chatFragment(): ChatFragment + + @ContributesAndroidInjector + abstract fun chatDetailActivity(): ChatDetailActivity + + @ContributesAndroidInjector + abstract fun payoutFragment(): PayoutFragment + + @ContributesAndroidInjector + abstract fun revenueFragment(): RevenueFragment + + @ContributesAndroidInjector + abstract fun classesFragment(): ClassesFragment + + @ContributesAndroidInjector + abstract fun addClassFragment(): AddClassFragment + + @ContributesAndroidInjector + abstract fun jitsiActivity(): JitsiActivity + + @ContributesAndroidInjector + abstract fun categoryFragment(): CategoryFragment + + @ContributesAndroidInjector + abstract fun subCategoryFragment(): SubCategoryFragment + + @ContributesAndroidInjector + abstract fun serviceFragment(): ServiceFragment + + @ContributesAndroidInjector + abstract fun prefrenceFragment(): PrefrenceFragment + + @ContributesAndroidInjector + abstract fun setAvailabilityFragment(): SetAvailabilityFragment + + @ContributesAndroidInjector + abstract fun settingsFragment(): SettingsFragment + + @ContributesAndroidInjector + abstract fun bannerFragment(): BannerFragment + + @ContributesAndroidInjector + abstract fun callingActivity(): CallingActivity + + @ContributesAndroidInjector + abstract fun webViewActivity(): WebViewActivity + + @ContributesAndroidInjector + abstract fun addMoneyActivity(): AddMoneyActivity + + @ContributesAndroidInjector + abstract fun addCardFragment(): AddCardFragment + + @ContributesAndroidInjector + abstract fun insuranceFragment(): InsuranceFragment + + @ContributesAndroidInjector + abstract fun documentsFragment(): DocumentsFragment + + @ContributesAndroidInjector + abstract fun dialogAddDocumentFragment(): DialogAddDocumentFragment + + @ContributesAndroidInjector + abstract fun feedsFragment(): FeedsFragment + + @ContributesAndroidInjector + abstract fun feedDetailsFragment(): FeedDetailsFragment + + @ContributesAndroidInjector + abstract fun addFeedFragment(): AddFeedFragment + + @ContributesAndroidInjector + abstract fun manualPrescriptionFragment(): ManualPrescriptionFragment + + @ContributesAndroidInjector + abstract fun digitalPrescriptionFragment(): DigitalPrescriptionFragment + + @ContributesAndroidInjector + abstract fun bottomPrescriptionFragment(): BottomPrescriptionFragment + + @ContributesAndroidInjector + abstract fun walkThroughFragment(): WalkThroughFragment + + @ContributesAndroidInjector + abstract fun walkThroughDetailFragment(): WalkThroughDetailFragment + + @ContributesAndroidInjector + abstract fun locationFragment(): LocationFragment + + @ContributesAndroidInjector + abstract fun appointmentStatusActivity(): AppointmentStatusActivity + + @ContributesAndroidInjector + abstract fun bmiCheckerFragment(): BmiCheckerFragment + + @ContributesAndroidInjector + abstract fun waterIntakeFragment(): WaterIntakeFragment + + @ContributesAndroidInjector + abstract fun proteinIntakeFragment(): ProteinIntakeFragment + + @ContributesAndroidInjector + abstract fun pregnancyCalculatorFragment(): PregnancyCalculatorFragment + + @ContributesAndroidInjector + abstract fun bottomPregnancyFragment(): BottomPregnancyFragment + + @ContributesAndroidInjector + abstract fun bottomWaterLimitFragment(): BottomWaterLimitFragment + + @ContributesAndroidInjector + abstract fun questionsFragment(): QuestionsFragment + + @ContributesAndroidInjector + abstract fun questionDetailFragment(): QuestionDetailFragment + + @ContributesAndroidInjector + abstract fun languageFragment(): LanguageFragment + + @ContributesAndroidInjector + abstract fun successFragment(): SuccessFragment + + @ContributesAndroidInjector + abstract fun networkIssueFragment(): NetworkIssueFragment + + @ContributesAndroidInjector + abstract fun addAddressActivity(): AddAddressActivity + + @ContributesAndroidInjector + abstract fun bottomExtraChargesFragment(): BottomExtraChargesFragment + + @ContributesAndroidInjector + abstract fun medicalHistoryFragment(): MedicalHistoryFragment + + @ContributesAndroidInjector + abstract fun bottomServiceRequestFragment(): BottomServiceRequestFragment + + @ContributesAndroidInjector + abstract fun bottomServiceRequestNewFragment(): BottomServiceRequestNewFragment + + @ContributesAndroidInjector + abstract fun contactListFragment(): ContactListFragment + @ContributesAndroidInjector + abstract fun homeBannerFragment(): HomeBannerFragment +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/DaggerBottomSheetDialogFragment.kt b/app/src/main/java/com/consultantvendor/di/DaggerBottomSheetDialogFragment.kt new file mode 100644 index 0000000..fa494e4 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/DaggerBottomSheetDialogFragment.kt @@ -0,0 +1,31 @@ +package com.consultantvendor.di + +import android.content.Context +import com.google.android.material.bottomsheet.BottomSheetDialogFragment +import dagger.android.AndroidInjector +import dagger.android.DispatchingAndroidInjector +import dagger.android.HasAndroidInjector +import dagger.android.support.AndroidSupportInjection +import javax.inject.Inject + + +/** + * A [BottomSheetDialogFragment] that injects its members in [onAttach] and can be used to inject + * child [BottomSheetDialogFragment]s attached to it. + * Note that when this fragment gets reattached, its members will be injected again. + * + * @author Ryan Amaral + */ +open class DaggerBottomSheetDialogFragment : BottomSheetDialogFragment(), HasAndroidInjector { + + @Inject lateinit var mChildFragmentInjector: DispatchingAndroidInjector + + override fun onAttach(context: Context) { + AndroidSupportInjection.inject(this) + super.onAttach(context) + } + + override fun androidInjector(): AndroidInjector { + return mChildFragmentInjector + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/NetworkModule.kt b/app/src/main/java/com/consultantvendor/di/NetworkModule.kt new file mode 100644 index 0000000..cf4ac3f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/NetworkModule.kt @@ -0,0 +1,92 @@ +package com.consultantvendor.di + +import android.util.Log +import com.consultantvendor.BuildConfig +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.Config +import com.consultantvendor.utils.* +import com.google.gson.Gson +import com.jakewharton.retrofit2.adapter.kotlin.coroutines.CoroutineCallAdapterFactory +import dagger.Module +import dagger.Provides +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.logging.HttpLoggingInterceptor +import retrofit2.Retrofit +import retrofit2.converter.gson.GsonConverterFactory +import retrofit2.converter.scalars.ScalarsConverterFactory +import java.util.* +import java.util.concurrent.TimeUnit +import javax.inject.Singleton + + +@Module +object NetworkModule { + + @Provides + @Singleton + @JvmStatic + fun okHttpClient(prefsManager: PrefsManager): OkHttpClient { + return OkHttpClient.Builder() + .connectTimeout(100, TimeUnit.SECONDS) + .readTimeout(100, TimeUnit.SECONDS) + .writeTimeout(100, TimeUnit.SECONDS) + .addInterceptor(getHttpLoggingInterceptor()) + .cache(null) + .addInterceptor(getNetworkInterceptor(prefsManager)) + .build() + } + + @Provides + @Singleton + @JvmStatic + fun retrofit(client: OkHttpClient, gson: Gson): Retrofit { + return Retrofit.Builder() + .baseUrl(Config.baseURL) + .client(client) + .addConverterFactory(GsonConverterFactory.create(gson)) + .addConverterFactory(ScalarsConverterFactory.create()) + .addCallAdapterFactory(CoroutineCallAdapterFactory()) + .build() + } + + private fun getNetworkInterceptor(prefsManager: PrefsManager): Interceptor { + return Interceptor { chain -> + var request = chain.request() + + /*Get App Id*/ + val app_id = BuildConfig.APP_UNIQUE_ID + + val requestBuilder = request.newBuilder() + requestBuilder.addHeader("Accept", "application/json") + .header("Connection", "close") + .addHeader("user-type", APP_TYPE) + .addHeader("language", prefsManager.getString(USER_LANGUAGE, "en")) + .addHeader("timezone", TimeZone.getDefault().id) + .addHeader("app-id", "c6b484d83fb21425453dcd0af6c1f01b15") + .addHeader("devicetype", ANDROID) + + val accessToken = prefsManager.getObject(USER_DATA, UserData::class.java)?.token + Log.e("accessToken", accessToken ?: "") + if (!accessToken.isNullOrEmpty()) + requestBuilder.addHeader("authorization", "Bearer $accessToken") + + request = requestBuilder.build() + + chain.proceed(request) + } + } + + + private fun getHttpLoggingInterceptor(): HttpLoggingInterceptor { + val httpLoggingInterceptor = HttpLoggingInterceptor() + httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY + return httpLoggingInterceptor + } + + @Provides + @Singleton + @JvmStatic + fun webService(retrofit: Retrofit): WebService = retrofit.create(WebService::class.java) +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/ResourceProvider.kt b/app/src/main/java/com/consultantvendor/di/ResourceProvider.kt new file mode 100644 index 0000000..9924445 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/ResourceProvider.kt @@ -0,0 +1,19 @@ +package com.consultantvendor.di + +import android.content.Context +import android.content.res.Resources +import com.consultantvendor.utils.LocaleHelper +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class ResourceProvider @Inject constructor(private val context: Context) { + + fun getStringResource(stringId: Int): String { + return LocaleHelper.onCreate(context).getString(stringId) + } + + fun getResources(): Resources { + return context.resources + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/ServiceBuilderModule.kt b/app/src/main/java/com/consultantvendor/di/ServiceBuilderModule.kt new file mode 100644 index 0000000..da1b81b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/ServiceBuilderModule.kt @@ -0,0 +1,13 @@ +package com.consultantvendor.di + +import com.consultantvendor.pushNotifications.MessagingService +import dagger.Module +import dagger.android.ContributesAndroidInjector + +@Module +abstract class ServiceBuilderModule { + + @ContributesAndroidInjector + abstract fun messagingService(): MessagingService + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/SingleLiveEvent.java b/app/src/main/java/com/consultantvendor/di/SingleLiveEvent.java new file mode 100644 index 0000000..e149a2a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/SingleLiveEvent.java @@ -0,0 +1,58 @@ +package com.consultantvendor.di; + + +import androidx.annotation.MainThread; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.Observer; + +import java.util.concurrent.atomic.AtomicBoolean; + +import timber.log.Timber; + + +/** + * A lifecycle-aware observable that sends only new updates after subscription, used for events USER_LIKE + * navigation and Snackbar messages. + *

+ * This avoids a common problem with events: on configuration change (USER_LIKE rotation) an update + * can be emitted if the observer is active. This LiveData only calls the observable if there's an + * explicit call to setValue() or call(). + *

+ * Note that only one observer is going to be notified of changes. + */ +public class SingleLiveEvent extends MutableLiveData { + private final AtomicBoolean pending = new AtomicBoolean(false); + + @MainThread + public void setObserver(@NonNull LifecycleOwner owner, @NonNull final Observer observer) { + + if (hasActiveObservers()) { + Timber.w("Multiple observers registered but only one will be notified of changes."); + } + + // Observe the internal MutableLiveData + super.observe(owner, t -> { + if (pending.compareAndSet(true, false)) { + observer.onChanged(t); + } + }); + + } + + @MainThread + public void setValue(@Nullable T t) { + pending.set(true); + super.setValue(t); + } + + /** + * Used for cases where T is Void, to make calls cleaner. + */ + @MainThread + public void call() { + setValue(null); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/ViewModelKey.java b/app/src/main/java/com/consultantvendor/di/ViewModelKey.java new file mode 100644 index 0000000..57b07df --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/ViewModelKey.java @@ -0,0 +1,20 @@ +package com.consultantvendor.di; + +import androidx.lifecycle.ViewModel; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import dagger.MapKey; + +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@MapKey +@Documented +@Target(METHOD) +@Retention(RUNTIME) +public @interface ViewModelKey { + Class value(); +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/ViewModelProviderFactory.java b/app/src/main/java/com/consultantvendor/di/ViewModelProviderFactory.java new file mode 100644 index 0000000..6c711cf --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/ViewModelProviderFactory.java @@ -0,0 +1,47 @@ +package com.consultantvendor.di; + + +import androidx.annotation.NonNull; +import androidx.lifecycle.ViewModel; +import androidx.lifecycle.ViewModelProvider; + +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Provider; +import javax.inject.Singleton; + +@Singleton +public class ViewModelProviderFactory implements ViewModelProvider.Factory { + private final Map, Provider> creators; + + @Inject + public ViewModelProviderFactory(Map, Provider> creators) { + this.creators = creators; + } + + @SuppressWarnings("unchecked") + @Override + @NonNull + public T create(@NonNull Class modelClass) { + Provider creator = creators.get(modelClass); + if (creator == null) { + for (Map.Entry, Provider> entry : creators.entrySet()) { + if (modelClass.isAssignableFrom(entry.getKey())) { + creator = entry.getValue(); + break; + } + } + } + if (creator == null) { + throw new IllegalArgumentException("unknown model class " + modelClass); + } + + + try { + return (T) creator.get(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/di/ViewModelsModule.kt b/app/src/main/java/com/consultantvendor/di/ViewModelsModule.kt new file mode 100644 index 0000000..df94aa5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/di/ViewModelsModule.kt @@ -0,0 +1,128 @@ +package com.consultantvendor.di + +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.ui.AppVersionViewModel +import com.consultantvendor.ui.chat.ChatViewModel +import com.consultantvendor.ui.chat.UploadFileViewModel +import com.consultantvendor.ui.dashboard.feeds.FeedViewModel +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.ui.dashboard.home.HomeViewModel +import com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus.DirectionViewModel +import com.consultantvendor.ui.dashboard.home.healthtool.waterintake.WaterIntakeViewModel +import com.consultantvendor.ui.dashboard.home.prescription.AddPrescriptionViewModel +import com.consultantvendor.ui.dashboard.home.questions.QuestionViewModel +import com.consultantvendor.ui.dashboard.revenue.RevenueViewModel +import com.consultantvendor.ui.dashboard.settings.contactlist.ContactViewModel +import com.consultantvendor.ui.dashboard.wallet.BankViewModel +import com.consultantvendor.ui.dashboard.wallet.WalletViewModel +import com.consultantvendor.ui.drawermenu.classes.ClassesViewModel +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.availability.GetSlotsViewModel +import dagger.Binds +import dagger.Module +import dagger.Provides +import dagger.multibindings.IntoMap +import javax.inject.Singleton + +@Module +abstract class ViewModelsModule { + + @Module + companion object { + + @Provides + @Singleton + @JvmStatic + fun viewModelProviderFactory(factory: ViewModelProviderFactory): ViewModelProvider.Factory = + factory + } + + @Binds + @IntoMap + @ViewModelKey(LoginViewModel::class) + abstract fun loginViewModel(viewModel: LoginViewModel): ViewModel + + + @Binds + @IntoMap + @ViewModelKey(AppointmentViewModel::class) + abstract fun appointmentViewModel(viewModel: AppointmentViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(WalletViewModel::class) + abstract fun walletViewModel(viewModel: WalletViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(ChatViewModel::class) + abstract fun chatViewModel(viewModel: ChatViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(UploadFileViewModel::class) + abstract fun uploadFileViewModel(viewModel: UploadFileViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(BankViewModel::class) + abstract fun bankViewModel(viewModel: BankViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(RevenueViewModel::class) + abstract fun revenueViewModel(viewModel: RevenueViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(FeedViewModel::class) + abstract fun feedViewModel(viewModel: FeedViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(ClassesViewModel::class) + abstract fun classesViewModel(viewModel: ClassesViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(GetSlotsViewModel::class) + abstract fun getSlotsViewModel(viewModel: GetSlotsViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(AppVersionViewModel::class) + abstract fun appVersionViewModel(viewModel: AppVersionViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(AddPrescriptionViewModel::class) + abstract fun addPrescriptionViewModel(viewModel: AddPrescriptionViewModel): ViewModel + + + @Binds + @IntoMap + @ViewModelKey(HomeViewModel::class) + abstract fun homeViewModel(viewModel: HomeViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(DirectionViewModel::class) + abstract fun directionViewModel(viewModel: DirectionViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(QuestionViewModel::class) + abstract fun questionViewModel(viewModel: QuestionViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(WaterIntakeViewModel::class) + abstract fun waterIntakeViewModel(viewModel: WaterIntakeViewModel): ViewModel + + @Binds + @IntoMap + @ViewModelKey(ContactViewModel::class) + abstract fun contactViewModel(viewModel: ContactViewModel): ViewModel + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/pushNotifications/MessagingService.kt b/app/src/main/java/com/consultantvendor/pushNotifications/MessagingService.kt new file mode 100644 index 0000000..d86c236 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/pushNotifications/MessagingService.kt @@ -0,0 +1,288 @@ +package com.consultantvendor.pushNotifications + +import android.Manifest.permission.POST_NOTIFICATIONS +import android.annotation.TargetApi +import android.app.* +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.BitmapFactory +import android.media.AudioAttributes +import android.os.Build +import android.os.PowerManager +import android.provider.Settings +import android.util.Log +import androidx.core.app.ActivityCompat +import androidx.core.app.NotificationCompat +import androidx.core.content.ContextCompat +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.data.models.PushData +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.ui.calling.Constants +import com.consultantvendor.ui.calling.IncomingCallNotificationService +import com.consultantvendor.ui.chat.chatdetail.ChatDetailActivity +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.drawermenu.DrawerActivity.Companion.CLASSES +import com.consultantvendor.utils.* +import com.google.firebase.messaging.FirebaseMessagingService +import com.google.firebase.messaging.RemoteMessage +import dagger.android.AndroidInjection +import org.json.JSONObject +import java.util.* + +import javax.inject.Inject + + +class MessagingService : FirebaseMessagingService() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + private val channelId = "Consultant user" + + + override fun onCreate() { + AndroidInjection.inject(this) + super.onCreate() + } + + override fun onNewToken(token: String) { + super.onNewToken(token) + if (userRepository.isUserLoggedIn()) { + userRepository.pushTokenUpdate() + } + //userRepository.pushTokenUpdate() + } + + override fun onMessageReceived(remoteMessage: RemoteMessage) { + val notificationData = JSONObject(remoteMessage.data as MutableMap) + + if (userRepository.isUserLoggedIn()) { + sendNotification(notificationData) + } + } + + + @TargetApi(Build.VERSION_CODES.O) + private fun sendNotification(notificationData: JSONObject) { + userRepository.isNewNotification.postValue(true) + + val pushData = PushData( + msg = notificationData.optString("msg"), + title = notificationData.optString("title"), + sound = notificationData.optString("sound"), + pushType = notificationData.optString("pushType"), + imageUrl = notificationData.optString("imageUrl"), + message = notificationData.optString("message"), + senderId = notificationData.optString("senderId"), + senderName = notificationData.optString("senderName"), + receiverId = notificationData.optString("receiverId"), + messageType = notificationData.optString("messageType"), + request_id = notificationData.optString("request_id"), + call_id = notificationData.optString("call_id"), + service_type = notificationData.optString("service_type"), + main_service_type = notificationData.optString("main_service_type"), + sentAt = notificationData.optLong("sentAt"), + request_time = notificationData.optString("request_time"), + sender_name = notificationData.optString("sender_name"), + sender_image = notificationData.optString("sender_image"), + vendor_category_name = notificationData.optString("vendor_category_name") + ) + + + val requestID = Calendar.getInstance().timeInMillis.toInt() + + /*Stack builder home activity*/ + val stackBuilder = TaskStackBuilder.create(this) + + stackBuilder.addParentStack(HomeActivity::class.java) + val homeIntent = Intent(this, HomeActivity::class.java) + //stackBuilder.addNextIntent(homeIntent) + + /*Final activity to open*/ + var intent: Intent? = null + + val titleString = pushData.pushType.replace("_", " ").toLowerCase() + var title = "" + + val lineScan = Scanner(titleString) + while (lineScan.hasNext()) { + val word: String = lineScan.next() + title += Character.toUpperCase(word[0]).toString() + word.substring(1) + " " + } + + val msg = pushData.message + + wakeDevice() + + when (pushData.pushType) { + PushType.CHAT -> { + title = pushData.senderName + intent = Intent(this, ChatDetailActivity::class.java) + .putExtra(USER_ID, pushData.senderId) + .putExtra(USER_NAME, pushData.senderName) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + } + PushType.FREE_EXPERT_ADVISE -> { + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.QUESTION_DETAILS) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + PushType.PROFILE_APPROVED -> { + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + PushType.NEW_REQUEST, PushType.REQUEST_FAILED, PushType.REQUEST_COMPLETED, PushType.PATIENT_ADDED_SYMPTOMS, + PushType.CANCELED_REQUEST, PushType.RESCHEDULED_REQUEST, PushType.UPCOMING_APPOINTMENT, + PushType.PAID_EXTRA_PAYMENT -> { + + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + + PushType.BOOKING_REQUEST -> { + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + PushType.AMOUNT_RECEIVED, PushType.PAYOUT_PROCESSED, PushType.PAYOUT_FAILED, + PushType.BALANCE_ADDED, PushType.BALANCE_FAILED -> { + homeIntent.putExtra(EXTRA_TAB, "1") + + val broadcastIntent = Intent() + broadcastIntent.action = pushData.pushType + broadcastIntent.putExtra(EXTRA_REQUEST_ID, pushData.request_id) + + LocalBroadcastManager.getInstance(this).sendBroadcast(broadcastIntent) + } + PushType.ASSINGED_USER -> { + intent = Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, CLASSES) + } + PushType.CALL_RINGING -> { + return + } + PushType.CALL_ACCEPTED -> { + val callIntent = Intent(this, IncomingCallNotificationService::class.java) + callIntent.action = Constants.ACTION_ACCEPT + callIntent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + + startService(callIntent) + return + } + PushType.CALL_CANCELED -> { + handleCanceledCallInvite(pushData) + return + } + } + + stackBuilder.addNextIntent(homeIntent) + if (intent != null) + stackBuilder.addNextIntent(intent) + /*val pendingIntent = PendingIntent.getActivity(this, requestID, + intent, PendingIntent.FLAG_UPDATE_CURRENT)*/ + + /*Flags*/ + homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + homeIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + homeIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) + homeIntent.action = System.currentTimeMillis().toString() + + val pendingIntent = + stackBuilder.getPendingIntent(requestID, PendingIntent.FLAG_MUTABLE /*PendingIntent.FLAG_IMMUTABLE*/) + + val notificationBuilder = NotificationCompat.Builder(this, channelId) + .setContentTitle(title) //Header + .setContentText(msg) //Content + .setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher)) + .setAutoCancel(true) + .setDefaults(Notification.DEFAULT_ALL) + .setContentIntent(pendingIntent) + .setSound(Settings.System.DEFAULT_NOTIFICATION_URI) + + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + notificationBuilder.setSmallIcon(R.drawable.ic_push) + notificationBuilder.color = ContextCompat.getColor(this, R.color.colorAccent) + } else { + notificationBuilder.setSmallIcon(R.mipmap.ic_launcher) + } + + val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val mChannel = NotificationChannel(channelId, getText(R.string.app_name), + NotificationManager.IMPORTANCE_HIGH) + + val attributes = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_NOTIFICATION) + .build() + + mChannel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,attributes) + + notificationManager.createNotificationChannel(mChannel) + } + + + if (pushData.pushType == PushType.CHAT && pushData.senderId == ChatDetailActivity.otherUserID && + pushData.request_id == ChatDetailActivity.requestId) { + /*Don't generate push*/ + Log.e("", "") + } else + notificationManager.notify(requestID, notificationBuilder.build()) + } + + private fun wakeDevice() { + val pm = getSystemService(Context.POWER_SERVICE) as PowerManager + val wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, + "Consultant:") + wl.acquire(25000) + } + + private fun handleInvite(pushData: PushData, notificationId: Int) { + val intent = Intent(this, IncomingCallNotificationService::class.java) + intent.action = Constants.ACTION_INCOMING_CALL + intent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, notificationId) + intent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + intent.putExtra(EXTRA_REQUEST_ID, pushData.call_id) + + startService(intent) + } + + private fun handleCanceledCallInvite(pushData: PushData) { + val intent = Intent(this, IncomingCallNotificationService::class.java) + intent.action = Constants.ACTION_CANCEL_CALL + intent.putExtra(Constants.INCOMING_CALL_INVITE, pushData) + intent.putExtra(EXTRA_REQUEST_ID, pushData.call_id) + + startService(intent) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/pushNotifications/UpdatePushTokenViewModel.kt b/app/src/main/java/com/consultantvendor/pushNotifications/UpdatePushTokenViewModel.kt new file mode 100644 index 0000000..5babb8a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/pushNotifications/UpdatePushTokenViewModel.kt @@ -0,0 +1,37 @@ +package com.consultantvendor.pushNotifications + +import android.service.autofill.UserData +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import javax.inject.Inject + +class UpdatePushTokenViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val updatePushToken by lazy { SingleLiveEvent>() } + + fun updatePushToken(hashMap: HashMap) { + updatePushToken.value = Resource.loading() + + /* webService.numberLogin(hashMap) + .enqueue(object : Callback> { + + override fun onResponse( + call: Call>, + response: Response>) { + if (response.isSuccessful) { + updatePushToken.value = Resource.success(response.body()?.data) + } else { + updatePushToken.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updatePushToken.value = Resource.error(ApiUtils.failure(throwable)) + } + })*/ + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/AppVersionViewModel.kt b/app/src/main/java/com/consultantvendor/ui/AppVersionViewModel.kt new file mode 100644 index 0000000..023a341 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/AppVersionViewModel.kt @@ -0,0 +1,117 @@ +package com.consultantvendor.ui + +import android.util.Log +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.models.responses.appdetails.AppVersion +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class AppVersionViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val checkAppVersion by lazy { SingleLiveEvent>() } + + val clientDetails by lazy { SingleLiveEvent>() } + + val countryCity by lazy { SingleLiveEvent>() } + + val preferences by lazy { SingleLiveEvent>() } + + fun checkAppVersion(hashMap: HashMap) { + checkAppVersion.value = Resource.loading() + + webService + .appVersion(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + checkAppVersion.value =Resource.success(response.body()?.data) + } else { + checkAppVersion.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + checkAppVersion.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } + + fun clientDetails(hashMap: HashMap) { + clientDetails.value = Resource.loading() + + webService.clientDetails(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + clientDetails.value =Resource.success(response.body()?.data) + } else { + clientDetails.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + + } + + override fun onFailure(call: Call>, throwable: Throwable) { + clientDetails.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } + + + fun countryCity(hashMap: HashMap) { + countryCity.value = Resource.loading() + + webService.countryData(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + countryCity.value =Resource.success(response.body()?.data) + } else { + countryCity.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + countryCity.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } + + fun preferences(hashMap: HashMap) { + preferences.value = Resource.loading() + + webService.preferences(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + preferences.value =Resource.success(response.body()?.data) + } else { + preferences.value = Resource.error( + ApiUtils.getError(response.code(), response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + preferences.value = Resource.error(ApiUtils.failure(throwable)) + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/SplashActivity.kt b/app/src/main/java/com/consultantvendor/ui/SplashActivity.kt new file mode 100644 index 0000000..4ef46b4 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/SplashActivity.kt @@ -0,0 +1,266 @@ +package com.consultantvendor.ui + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.Uri +import android.os.Bundle +import android.util.Log +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.* +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivitySplashBinding +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.loginSignUp.SignUpActivity +import com.consultantvendor.ui.walkthrough.WalkThroughFragment.Companion.WALK_THROUGH_SCREEN +import com.consultantvendor.utils.* +import dagger.android.support.DaggerAppCompatActivity +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + + +class SplashActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var viewModel: AppVersionViewModel + + lateinit var binding: ActivitySplashBinding + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_splash) + + initialise() + listeners() + bindObservers() + } + + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + viewModel = ViewModelProvider(this, viewModelFactory)[AppVersionViewModel::class.java] +// prefsManager.save(USER_LANGUAGE, "en") + hitApi() + } + + private fun hitApi() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["app_type"] = "2"/*APP_TYPE 1: User App, 2: Doctor App*/ + hashMap["device_type"] = "2"/*ANDROID*/ + viewModel.clientDetails(hashMap) + } + } + + private fun listeners() { + + binding.ivPatient.setOnClickListener { + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) { + val appPackageName = getString(R.string.app_application_id) + + try { + startActivity(packageManager.getLaunchIntentForPackage(appPackageName)) + } catch (e: Exception) { + try { + startActivity(Intent(Intent.ACTION_VIEW, + Uri.parse("market://details?id=$appPackageName"))) + } catch (anfe: android.content.ActivityNotFoundException) { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(PLAY_STORE + appPackageName))) + } + } + } + } + + binding.ivDoc.setOnClickListener { + prefsManager.save(USER_TYPE, true) + goNormalSteps() + } + } + + private fun bindObservers() { + viewModel.clientDetails.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + /*Convert features to boolean keys*/ + val appDetails = it.data + /*Handle feature keys*/ + appDetails?.client_features?.forEach { + when (it.name?.toLowerCase(Locale.getDefault())) { + ClientFeatures.ADDRESS.toLowerCase(Locale.getDefault()) -> + appDetails.clientFeaturesKeys.isAddress = true + } + } + + prefsManager.remove(APP_DETAILS) + prefsManager.save(APP_DETAILS, appDetails) + appClientDetails = userRepository.getAppSetting() + + /*Check App Version*/ + val hashMap = HashMap() + hashMap["app_type"] = "2"/*APP_TYPE 1: User App, 2: Doctor App*/ + hashMap["device_type"] = "2"/*ANDROID*/ + hashMap["current_version"] = getVersion(this).versionCode.toString() + + viewModel.checkAppVersion(hashMap) + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModel.checkAppVersion.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + when (it.data?.update_type) { + AppUpdateType.HARD_UPDATE -> hardUpdate() + AppUpdateType.SOFT_UPDATE -> softUpdate() + else -> goNormalSteps() + } + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + private fun hardUpdate() { + AlertDialog.Builder(this) + .setCancelable(false) + .setTitle(getString(R.string.update)) + .setMessage(getString(R.string.update_desc, getString(R.string.app_name))) + .setPositiveButton(getString(R.string.update)) { dialog, which -> + updatePlayStore() + hardUpdate() + }.show() + } + + private fun updatePlayStore() { + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) { + try { + startActivity(Intent(Intent.ACTION_VIEW, + Uri.parse("market://details?id=${BuildConfig.APPLICATION_ID}"))) + } catch (anfe: android.content.ActivityNotFoundException) { + startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(PLAY_STORE + BuildConfig.APPLICATION_ID))) + } + } + } + + private fun softUpdate() { + AlertDialog.Builder(this) + .setCancelable(false) + .setTitle(getString(R.string.update)) + .setMessage(getString(R.string.update_desc, getString(R.string.app_name))) + .setPositiveButton(getString(R.string.update)) { dialog, which -> + updatePlayStore() + softUpdate() + }.setNegativeButton(getString(R.string.skip)) { dialog, which -> + goNormalSteps() + }.show() + } + + object AppUpdateType { + const val HARD_UPDATE = 1 + const val SOFT_UPDATE = 2 + } + + private fun goNormalSteps() { + when { + appFeatures.needLanguageScreen && userRepository.getUserLanguage().isEmpty() -> { + registerActivityResult.launch(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.LANGUAGE_SCREEN)) + } + appFeatures.needUserDoctorScreen && !prefsManager.getBoolean(USER_TYPE, false) -> { + binding.clUserType.visible() + } + appFeatures.needWalkThrough && !prefsManager.getBoolean(WALK_THROUGH_SCREEN, false) -> { + binding.clUserType.gone() + registerActivityResult.launch(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, WALK_THROUGH_SCREEN)) + } + else -> { + if (userRepository.isUserLoggedIn()) { + startActivity(Intent(this, HomeActivity::class.java)) + } else { + startActivity(Intent(this, SignUpActivity::class.java)) + } + finish() + } + } + } + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + goNormalSteps() + } + } + + companion object { + const val USER_TYPE = "user type" + } + + override fun onResume() { + super.onResume() + unregisterReceiver() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + val intentFilter = IntentFilter() + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(this) + .registerReceiver(refreshData, intentFilter) + + } + + private fun unregisterReceiver() { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshData) + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + NetworkIssueFragment.NETWORK_ISSUE -> + hitApi() + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/adapter/CheckItemAdapter.kt b/app/src/main/java/com/consultantvendor/ui/adapter/CheckItemAdapter.kt new file mode 100644 index 0000000..4ba27c6 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/adapter/CheckItemAdapter.kt @@ -0,0 +1,66 @@ +package com.consultantvendor.ui.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Filter +import com.consultantvendor.databinding.RvItemCheckBinding +import com.consultantvendor.ui.dashboard.home.healthtool.pregnancycalculator.PregnancyCalculatorFragment + + +class CheckItemAdapter(private val fragment: Fragment, private val isMultiSelect: Boolean, + private val items: ArrayList) : RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_check, parent, false)) + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: RvItemCheckBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Filter) = with(binding) { + + tvName.text = item.option_name ?: item.name + + if (item.isSelected) { + tvName.setBackgroundResource(R.drawable.drawable_theme_60) + tvName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorWhite)) + } else { + tvName.setBackgroundResource(R.drawable.drawable_stroke_inactive) + tvName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorBlack)) + } + + clMain.setOnClickListener { + val pos = adapterPosition + + /*Fragment Listeners*/ + if (fragment is PregnancyCalculatorFragment) { + if (items.size == 4 && !items[pos].isSelected) + fragment.itemRelationClick(pos) + } + + if (isMultiSelect) + items[pos].isSelected = !items[pos].isSelected + else + items.forEachIndexed { index, filterOption -> + items[index].isSelected = pos == index + } + notifyDataSetChanged() + } + } + } +} + diff --git a/app/src/main/java/com/consultantvendor/ui/adapter/CommonFragmentPagerAdapter.kt b/app/src/main/java/com/consultantvendor/ui/adapter/CommonFragmentPagerAdapter.kt new file mode 100644 index 0000000..7e5e25b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/adapter/CommonFragmentPagerAdapter.kt @@ -0,0 +1,42 @@ +package com.consultantvendor.ui.adapter + +import android.os.Parcelable +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import androidx.fragment.app.FragmentStatePagerAdapter + + +class CommonFragmentPagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) { + + val fragments = mutableListOf() + private val titles = mutableListOf() + + + override fun getItem(position: Int): Fragment { + return fragments[position] + } + + override fun getCount(): Int { + return fragments.size + } + + override fun getPageTitle(position: Int): CharSequence { + return titles[position] + } + + fun addTab(title: String, fragment: Fragment): CommonFragmentPagerAdapter { + fragments.add(fragment) + titles.add(title) + + return this + } + + fun clear() { + fragments.clear() + titles.clear() + } + + override fun saveState(): Parcelable? { + return null + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/adapter/ImagesDocumentAdapter.kt b/app/src/main/java/com/consultantvendor/ui/adapter/ImagesDocumentAdapter.kt new file mode 100644 index 0000000..83e3a7a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/adapter/ImagesDocumentAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantvendor.ui.adapter + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DocImage +import com.consultantvendor.databinding.RvItemImageBinding +import com.consultantvendor.utils.* + + +class ImagesDocumentAdapter(private val fragment: Fragment, private val items: ArrayList) + : RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_image, parent, false)) + + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemImageBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + val heightOfImage = pxFromDp(fragment.requireContext(), 100f).toInt() + binding.ivImage.layoutParams.height = heightOfImage + binding.ivImage.layoutParams.width = heightOfImage + + binding.ivImage.setOnClickListener { + val item = items[bindingAdapterPosition] + when (item.type) { + DocType.IMAGE -> { + val itemImages = ArrayList() + itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS, item.image)) + viewImageFull(fragment.requireActivity(), itemImages, bindingAdapterPosition) + } + DocType.PDF -> { + val link = getImageBaseUrl(ImageFolder.PDF, item.image) + openPdf(fragment.requireActivity(), link) + } + } + } + } + + + fun bind(item: DocImage?) = with(binding) { + + if (item?.type == DocType.PDF) { + ivImage.setBackgroundResource(R.drawable.ic_pdf) + Glide.with(binding.root.context).load("").into(ivImage) + } else + loadImage("tag",binding.ivImage, item?.image, R.drawable.image_placeholder) + } + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/calling/CallingActivity.kt b/app/src/main/java/com/consultantvendor/ui/calling/CallingActivity.kt new file mode 100644 index 0000000..56bf206 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/calling/CallingActivity.kt @@ -0,0 +1,292 @@ +package com.consultantvendor.ui.calling + +import android.app.NotificationManager +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Color +import android.media.AudioAttributes +import android.media.AudioFocusRequest +import android.media.AudioManager +import android.os.Build +import android.os.Bundle +import android.os.Handler +import android.view.View +import android.view.WindowManager +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.data.models.PushData +import com.consultantvendor.data.models.responses.JitsiClass +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityCallingBinding +import com.consultantvendor.ui.calling.Constants.CALL_NOTIFICATION_ID +import com.consultantvendor.ui.jitsimeet.JitsiActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + + +class CallingActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + lateinit var binding: ActivityCallingBinding + + private lateinit var callInvite: PushData + + private var requestItem: Request? = null + + private var callId: String? = null + + private lateinit var progressDialog: ProgressDialog + + private var audioManager: AudioManager? = null + + private var savedAudioMode = AudioManager.MODE_INVALID + + private var isReceiverRegistered = false + + private val mHandler = Handler() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initialise() + listeners() + disconnectCall() + + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_STABLE or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + window.statusBarColor = Color.TRANSPARENT + } + + + override fun onNewIntent(intent: Intent?) { + super.onNewIntent(intent) + + if (intent?.action == Constants.ACTION_ACCEPT) { + + callInvite = intent.getSerializableExtra(Constants.INCOMING_CALL_INVITE) as PushData + + callId = callInvite.call_id + + /*Data for jitsi class*/ + val jitsiClass = JitsiClass() + jitsiClass.id = callInvite.request_id + jitsiClass.call_id = callInvite.call_id + jitsiClass.callType = callInvite.main_service_type + jitsiClass.name = "" + + val intentJitsi = Intent(this, JitsiActivity::class.java) + intentJitsi.putExtra(EXTRA_CALL_NAME, jitsiClass) + startActivity(intentJitsi) + clearNotification() + finish() + mHandler.removeCallbacksAndMessages(null) + } else if (intent?.action == Constants.ACTION_REJECT) { + finish() + mHandler.removeCallbacksAndMessages(null) + } + } + + private fun initialise() { + binding = DataBindingUtil.setContentView(this, R.layout.activity_calling) + + // These flags ensure that the activity can be launched when the screen is locked. + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + + progressDialog = ProgressDialog(this) + + if (intent.hasExtra(Constants.INCOMING_CALL_INVITE)) { + callInvite = intent.getSerializableExtra(Constants.INCOMING_CALL_INVITE) as PushData + callId = callInvite.call_id + } + + if (intent.hasExtra(EXTRA_REQUEST_ID)) { + requestItem = intent.getSerializableExtra(EXTRA_REQUEST_ID) as Request + callId = requestItem?.call_id + + binding.tvName.text = requestItem?.from_user?.name ?: "" + binding.tvDesc.text = requestItem?.from_user?.categoryData?.name ?: "" + loadImage("profile",binding.ivPic, requestItem?.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + binding.tvTime.text = "${DateUtils.dateTimeFormatFromUTC( + DateFormat.MON_DATE_YEAR, requestItem?.bookingDateUTC)} · " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, requestItem?.bookingDateUTC)}" + + binding.tvCallType.text = requestItem?.service_type + } + + + /* + * Needed for setting/abandoning audio focus during a call + */ + audioManager = getSystemService(Context.AUDIO_SERVICE) as AudioManager + audioManager?.isSpeakerphoneOn = true + + + /* + * Enable changing the volume using the up/down keys during a conversation + */ + volumeControlStream = AudioManager.STREAM_VOICE_CALL + + setAudioFocus(true) + + SoundPoolManager.getInstance(this)?.playRinging() + + + if (intent?.action == Constants.ACTION_ACCEPT) { + callInvite = intent.getSerializableExtra(Constants.INCOMING_CALL_INVITE) as PushData + callId = callInvite.call_id + + longToast(callInvite.call_id) + + /*Data for jitsi class*/ + val jitsiClass = JitsiClass() + jitsiClass.id = callInvite.request_id + jitsiClass.call_id = callInvite.call_id + jitsiClass.callType = callInvite.main_service_type + jitsiClass.name = "" + + val intent = Intent(this, JitsiActivity::class.java) + intent.putExtra(EXTRA_CALL_NAME, jitsiClass) + startActivity(intent) + clearNotification() + finish() + mHandler.removeCallbacksAndMessages(null) + } else if (intent?.action == Constants.ACTION_REJECT) { + finish() + mHandler.removeCallbacksAndMessages(null) + } + } + + private fun listeners() { + binding.ivSpeaker.setOnClickListener { + disableButton(binding.ivSpeaker) + if (audioManager?.isSpeakerphoneOn == true) { + audioManager?.mode = AudioManager.MODE_IN_COMMUNICATION + audioManager?.isSpeakerphoneOn = false + binding.ivSpeaker.setImageResource(R.drawable.ic_speaker_off) + } else { + audioManager?.mode = AudioManager.MODE_NORMAL + audioManager?.isSpeakerphoneOn = true + binding.ivSpeaker.setImageResource(R.drawable.ic_speaker) + } + } + + binding.ivRejectCall.setOnClickListener { + if (isConnectedToInternet(this, true)) { + userRepository.callStatus(requestItem?.id ?: "", requestItem?.call_id ?: "", + PushType.CALL_CANCELED) + finish() + } + } + } + + override fun onBackPressed() { + } + + private fun setAudioFocus(setFocus: Boolean) { + if (audioManager != null) { + if (setFocus) { + savedAudioMode = audioManager?.mode ?: AudioManager.MODE_INVALID + // Request audio focus before making any device switch. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + val playbackAttributes = AudioAttributes.Builder() + .setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) + .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) + .build() + val focusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT) + .setAudioAttributes(playbackAttributes) + .setAcceptsDelayedFocusGain(true) + .setOnAudioFocusChangeListener { i: Int -> } + .build() + audioManager?.requestAudioFocus(focusRequest) + } else { + audioManager?.requestAudioFocus( + { focusChange: Int -> }, + AudioManager.STREAM_VOICE_CALL, + AudioManager.AUDIOFOCUS_GAIN_TRANSIENT) + } + /* + * Start by setting MODE_IN_COMMUNICATION as default audio mode. It is + * required to be in this mode when playout and/or recording starts for + * best possible VoIP performance. Some devices have difficulties with speaker mode + * if this is not set. + */audioManager?.mode = AudioManager.MODE_IN_COMMUNICATION + } else { + audioManager?.mode = savedAudioMode + audioManager?.abandonAudioFocus(null) + } + } + } + + private fun clearNotification() { + val notificationManager = + getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.cancel(CALL_NOTIFICATION_ID) + } + + override fun onDestroy() { + SoundPoolManager.getInstance(this)?.release() + super.onDestroy() + unregisterReceiver() + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(Constants.ACTION_INCOMING_CALL) + intentFilter.addAction(Constants.ACTION_CANCEL_CALL) + LocalBroadcastManager.getInstance(this).registerReceiver( + callCancelledReceiver, intentFilter + ) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(callCancelledReceiver) + isReceiverRegistered = false + } + } + + private val callCancelledReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.action == Constants.ACTION_CANCEL_CALL) { + if (intent.hasExtra(EXTRA_REQUEST_ID) && intent.getStringExtra(EXTRA_REQUEST_ID) == callId) { + finish() + } + } + } + } + + private fun disconnectCall() { + mHandler.postDelayed({ + binding.ivRejectCall.performClick() + }, 45000) + + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/calling/Constants.java b/app/src/main/java/com/consultantvendor/ui/calling/Constants.java new file mode 100644 index 0000000..3df4fa8 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/calling/Constants.java @@ -0,0 +1,18 @@ +package com.consultantvendor.ui.calling; + +public class Constants { + public static final String CALL_SID_KEY = "CALL_SID"; + public static final String VOICE_CHANNEL_LOW_IMPORTANCE = "notification-channel-low-importance"; + public static final String VOICE_CHANNEL_HIGH_IMPORTANCE = "notification-channel-high-importance"; + public static final String INCOMING_CALL_INVITE = "INCOMING_CALL_INVITE"; + public static final String CANCELLED_CALL_INVITE = "CANCELLED_CALL_INVITE"; + public static final String INCOMING_CALL_NOTIFICATION_ID = "INCOMING_CALL_NOTIFICATION_ID"; + public static final String ACTION_ACCEPT = "ACTION_ACCEPT"; + public static final String ACTION_REJECT = "ACTION_REJECT"; + public static final String ACTION_INCOMING_CALL_NOTIFICATION = "ACTION_INCOMING_CALL_NOTIFICATION"; + public static final String ACTION_INCOMING_CALL = "ACTION_INCOMING_CALL"; + public static final String ACTION_CANCEL_CALL = "ACTION_CANCEL_CALL"; + public static final String ACTION_FCM_TOKEN = "ACTION_FCM_TOKEN"; + + public static final int CALL_NOTIFICATION_ID = 1000000; +} diff --git a/app/src/main/java/com/consultantvendor/ui/calling/IncomingCallNotificationService.kt b/app/src/main/java/com/consultantvendor/ui/calling/IncomingCallNotificationService.kt new file mode 100644 index 0000000..0d2895a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/calling/IncomingCallNotificationService.kt @@ -0,0 +1,208 @@ +package com.consultantvendor.ui.calling + +import android.annotation.TargetApi +import android.app.* +import android.content.Context +import android.content.Intent +import android.graphics.Color +import android.media.RingtoneManager +import android.os.Build +import android.os.Bundle +import android.os.IBinder +import android.util.Log +import androidx.core.app.NotificationCompat +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.ProcessLifecycleOwner +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.data.models.PushData + +class IncomingCallNotificationService : Service() { + override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + val action = intent.action + if (action != null) { + val callInvite= intent.getSerializableExtra(Constants.INCOMING_CALL_INVITE) as PushData + val notificationId = intent.getIntExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, 0) + when (action) { + Constants.ACTION_INCOMING_CALL -> handleIncomingCall(callInvite, notificationId) + Constants.ACTION_ACCEPT -> accept(callInvite, notificationId) + Constants.ACTION_REJECT -> reject(callInvite) + Constants.ACTION_CANCEL_CALL -> handleCancelledCall(intent) + else -> { + } + } + } + return START_NOT_STICKY + } + + override fun onBind(intent: Intent): IBinder? { + return null + } + + private fun createNotification(callInvite: PushData, notificationId: Int, channelImportance: Int): Notification { + val intent = Intent(this, CallingActivity::class.java) + intent.action = Constants.ACTION_INCOMING_CALL_NOTIFICATION + intent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, notificationId) + intent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) + val pendingIntent = PendingIntent.getActivity(this, notificationId, intent, /*PendingIntent.FLAG_UPDATE_CURRENT*/ PendingIntent.FLAG_IMMUTABLE) + /* + * Pass the notification id and call sid to use as an identifier to cancel the + * notification later + */ + val extras = Bundle() + extras.putString(Constants.CALL_SID_KEY, callInvite.request_id) + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + buildNotification(callInvite.sender_name + " is calling.", + pendingIntent, + extras, + callInvite, + notificationId, + createChannel(channelImportance)) + } else { + NotificationCompat.Builder(this) + .setSmallIcon(R.drawable.ic_call_end_white_24dp) + .setContentTitle(getString(R.string.app_name)) + .setContentText(callInvite.sender_name + " is calling.") + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE)) + .setAutoCancel(true) + .setExtras(extras) + .setContentIntent(pendingIntent) + .setGroup("test_app_notification") + .setColor(Color.rgb(214, 10, 37)).build() + } + } + + /** + * Build a notification. + * + * @param text the text of the notification + * @param pendingIntent the body, pending intent for the notification + * @param extras extras passed with the notification + * @return the builder + */ + @TargetApi(Build.VERSION_CODES.O) + private fun buildNotification(text: String, pendingIntent: PendingIntent, extras: Bundle, + callInvite: PushData, + notificationId: Int, + channelId: String): Notification { + val rejectIntent = Intent(applicationContext, IncomingCallNotificationService::class.java) + rejectIntent.action = Constants.ACTION_REJECT + rejectIntent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + rejectIntent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, notificationId) + val piRejectIntent = PendingIntent.getService(applicationContext, 0, rejectIntent, /*PendingIntent.FLAG_UPDATE_CURRENT*/ PendingIntent.FLAG_MUTABLE) + val acceptIntent = Intent(applicationContext, IncomingCallNotificationService::class.java) + acceptIntent.action = Constants.ACTION_ACCEPT + acceptIntent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + acceptIntent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, notificationId) + val piAcceptIntent = PendingIntent.getService(applicationContext, 0, acceptIntent, /*PendingIntent.FLAG_UPDATE_CURRENT*/ PendingIntent.FLAG_MUTABLE) + + //Define sound URI + val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION) + val builder = Notification.Builder(applicationContext, channelId) + .setSmallIcon(R.drawable.ic_call_end_white_24dp) + .setContentTitle(getString(R.string.app_name)) + .setContentText(text) + .setCategory(Notification.CATEGORY_CALL) + .setFullScreenIntent(pendingIntent, true) + .setExtras(extras) + .setPriority(Notification.PRIORITY_HIGH) + .setAutoCancel(true) + .setSound(soundUri) + .addAction(android.R.drawable.ic_menu_delete, getString(R.string.decline), piRejectIntent) + .addAction(android.R.drawable.ic_menu_call, getString(R.string.answer), piAcceptIntent) + .setFullScreenIntent(pendingIntent, true) + return builder.build() + } + + @TargetApi(Build.VERSION_CODES.O) + private fun createChannel(channelImportance: Int): String { + var callInviteChannel = NotificationChannel(Constants.VOICE_CHANNEL_HIGH_IMPORTANCE, + "Primary Voice Channel", NotificationManager.IMPORTANCE_HIGH) + var channelId = Constants.VOICE_CHANNEL_HIGH_IMPORTANCE + if (channelImportance == NotificationManager.IMPORTANCE_LOW) { + callInviteChannel = NotificationChannel(Constants.VOICE_CHANNEL_LOW_IMPORTANCE, + "Primary Voice Channel", NotificationManager.IMPORTANCE_LOW) + channelId = Constants.VOICE_CHANNEL_LOW_IMPORTANCE + } + callInviteChannel.lightColor = Color.GREEN + callInviteChannel.lockscreenVisibility = Notification.VISIBILITY_PRIVATE + val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.createNotificationChannel(callInviteChannel) + return channelId + } + + private fun accept(callInvite: PushData, notificationId: Int) { + endForeground() + val activeCallIntent = Intent(this, CallingActivity::class.java) + activeCallIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + activeCallIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + activeCallIntent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + activeCallIntent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, notificationId) + activeCallIntent.action = Constants.ACTION_ACCEPT + startActivity(activeCallIntent) + } + + private fun reject(callInvite: PushData) { + endForeground() + SoundPoolManager.getInstance(this)?.stopRinging() + //callInvite.reject(applicationContext) + } + + private fun handleCancelledCall(intent: Intent) { + endForeground() + SoundPoolManager.getInstance(this)?.stopRinging() + LocalBroadcastManager.getInstance(this).sendBroadcast(intent) + + } + + private fun handleIncomingCall(callInvite: PushData, notificationId: Int) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + setCallInProgressNotification(callInvite, notificationId) + } + sendCallInviteToActivity(callInvite, notificationId) + } + + private fun endForeground() { + stopForeground(true) + } + + @TargetApi(Build.VERSION_CODES.O) + private fun setCallInProgressNotification(callInvite: PushData, notificationId: Int) { + if (isAppVisible) { + Log.i(TAG, "setCallInProgressNotification - app is visible.") + startForeground(notificationId, createNotification(callInvite, notificationId, NotificationManager.IMPORTANCE_LOW)) + } else { + Log.i(TAG, "setCallInProgressNotification - app is NOT visible.") + startForeground(notificationId, createNotification(callInvite, notificationId, NotificationManager.IMPORTANCE_HIGH)) + } + } + + /* + * Send the CallInvite to the VoiceActivity. Start the activity if it is not running already. + */ + private fun sendCallInviteToActivity(callInvite: PushData, notificationId: Int) { + if (Build.VERSION.SDK_INT >= 29 && !isAppVisible) { + return + } + val intent = Intent(this, CallingActivity::class.java) + intent.action = Constants.ACTION_INCOMING_CALL + intent.putExtra(Constants.INCOMING_CALL_NOTIFICATION_ID, notificationId) + intent.putExtra(Constants.INCOMING_CALL_INVITE, callInvite) + intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + this.startActivity(intent) + } + + private val isAppVisible: Boolean + private get() = ProcessLifecycleOwner + .get() + .lifecycle + .currentState + .isAtLeast(Lifecycle.State.STARTED) + + companion object { + private val TAG = IncomingCallNotificationService::class.java.simpleName + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/calling/SoundPoolManager.kt b/app/src/main/java/com/consultantvendor/ui/calling/SoundPoolManager.kt new file mode 100644 index 0000000..839dde3 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/calling/SoundPoolManager.kt @@ -0,0 +1,87 @@ +package com.consultantvendor.ui.calling + +import android.content.Context +import android.media.AudioManager +import android.media.SoundPool +import android.os.Build +import com.consultantvendor.R + +class SoundPoolManager private constructor(context: Context) { + private var playing = false + private var loaded = false + private var playingCalled = false + private val volume: Float + private var soundPool: SoundPool? = null + private val ringingSoundId: Int + private var ringingStreamId = 0 + private val disconnectSoundId: Int + fun playRinging() { + if (loaded && !playing) { + ringingStreamId = soundPool?.play(ringingSoundId, volume, volume, 1, -1, 1f) ?:0 + playing = true + } else { + playingCalled = true + } + } + + fun stopRinging() { + if (playing) { + soundPool?.stop(ringingStreamId) + playing = false + } + } + + fun playDisconnect() { + if (loaded && !playing) { + soundPool?.play(disconnectSoundId, volume, volume, 1, 0, 1f) + playing = false + } + } + + fun release() { + if (soundPool != null) { + soundPool?.unload(ringingSoundId) + soundPool?.unload(disconnectSoundId) + soundPool?.release() + soundPool = null + } + instance = null + } + + companion object { + private var instance: SoundPoolManager? = null + fun getInstance(context: Context): SoundPoolManager? { + if (instance == null) { + instance = SoundPoolManager(context) + } + return instance + } + } + + init { + // AudioManager audio settings for adjusting the volume + val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager + val actualVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC).toFloat() + val maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC).toFloat() + volume = maxVolume + + // Load the sounds + val maxStreams = 1 + soundPool = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + SoundPool.Builder() + .setMaxStreams(maxStreams) + .build() + } else { + SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 0) + } + soundPool?.setOnLoadCompleteListener { soundPool: SoundPool?, sampleId: Int, status: Int -> + loaded = true + if (playingCalled) { + playRinging() + playingCalled = false + } + } + ringingSoundId = soundPool?.load(context, R.raw.default_ring, 1) ?:0 + disconnectSoundId = soundPool?.load(context, R.raw.disconnect, 1) ?:0 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/chat/ChatAdapter.kt b/app/src/main/java/com/consultantvendor/ui/chat/ChatAdapter.kt new file mode 100644 index 0000000..453ebc2 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/chat/ChatAdapter.kt @@ -0,0 +1,114 @@ +package com.consultantvendor.ui.chat + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.chat.ChatList +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemChatListingBinding +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.DateFormat.DATE_TIME_FORMAT + + +class ChatAdapter(private val fragment: ChatFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_chat_listing, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: ItemChatListingBinding) : + RecyclerView.ViewHolder(binding.root) { + val context: Context = binding.root.context + fun bind(item: ChatList) = with(binding) { + // slideRecyclerItem(binding.root, binding.root.context) + + when (item.last_message?.messageType) { + DocType.IMAGE -> { + tvTextMessage.gone() + ivCamera.visible() + tvPhoto.visible() + tvPhoto.text=context.getString(R.string.photo) + ivCamera.setImageResource(R.drawable.ic_camera) + } + DocType.PDF -> { + tvTextMessage.gone() + ivCamera.visible() + tvPhoto.visible() + + tvPhoto.text=context.getString(R.string.pdf) + ivCamera.setImageResource(R.drawable.ic_pdf) + } + DocType.AUDIO -> { + tvTextMessage.gone() + ivCamera.visible() + tvPhoto.visible() + + tvPhoto.text = context.getString(R.string.audio) + ivCamera.setImageResource(R.drawable.ic_mic) + } + else -> { + tvTextMessage.visible() + ivCamera.gone() + tvPhoto.gone() + } + } + loadImage("profile",ivUserImage, item.from_user?.profile_image, R.drawable.ic_profile_placeholder) + tvUserName.text = "${item.from_user?.name} (${item.status})" + tvTextMessage.text = item.last_message?.message + tvDate.text = DateUtils.dateFormatFromMillis(DATE_TIME_FORMAT, item.last_message?.sentAt) + + if (item.unReadCount > 0) { + tvUnreadCount.visible() + tvUnreadCount.text = getCountFormat(2, item.unReadCount) + } else { + tvUnreadCount.gone() + } + + itemView.setOnClickListener { + fragment.startActivity(item) + item.unReadCount = 0 + notifyItemChanged(adapterPosition) + } + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/chat/ChatFragment.kt b/app/src/main/java/com/consultantvendor/ui/chat/ChatFragment.kt new file mode 100644 index 0000000..70f122d --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/chat/ChatFragment.kt @@ -0,0 +1,345 @@ +package com.consultantvendor.ui.chat + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.net.ConnectivityManager +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.chat.ChatList +import com.consultantvendor.data.models.responses.chat.ChatMessage +import com.consultantvendor.data.network.ApiKeys +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentChatBinding +import com.consultantvendor.ui.chat.chatdetail.ChatDetailActivity +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.AppSocket.Events.Companion.DELIVERED_MESSAGE +import com.google.gson.Gson +import dagger.android.support.DaggerFragment +import io.socket.client.Ack +import kotlinx.android.synthetic.main.item_no_data.view.* +import org.json.JSONObject +import javax.inject.Inject + +class ChatFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + private lateinit var binding: FragmentChatBinding + + private var rootView: View? = null + + private lateinit var adapter: ChatAdapter + + private lateinit var llm: LinearLayoutManager + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private lateinit var viewModel: ChatViewModel + + private var items = ArrayList() + + private var isReceiverRegistered = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_chat, container, false) + rootView = binding.root + + viewModel = ViewModelProvider(this, viewModelFactory)[ChatViewModel::class.java] + bindObservers() + listeners() + setAdapter() + //getListing(true) + initialise() + + } + return rootView + } + + private fun initialise() { + appSocket.addOnMessageReceiver(messageReceiver) + LocalBroadcastManager.getInstance(activity as Context) + .registerReceiver(broadcastChat, IntentFilter(UPDATE_CHAT)) + + requireActivity().registerReceiver(broadcastReceiver, + IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_chat_empty) + binding.clNoData.tvNoData.text = getString(R.string.no_chat) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_chat_desc) + } + + private val messageReceiver = object : AppSocket.OnMessageReceiver { + override fun onMessageReceive(message: ChatMessage?) { + refreshChatLogs(message, message?.senderId, message?.request_id ?: "", unDeliveredCount = 1) + sendMessageDelivered(message) + } + } + + private fun sendMessageDelivered(message: ChatMessage?) { + val obj = JSONObject() + obj.put("messageId", message?.messageId) + obj.put("receiverId", message?.senderId) + obj.put("senderId", message?.receiverId) + appSocket.emit(DELIVERED_MESSAGE, obj, Ack { + + }) + } + + private fun refreshChatLogs(message: ChatMessage?, userId: String?, requestChatId: String = "", unDeliveredCount: Int = 0) { + requireActivity().runOnUiThread { + val index = items.indexOf(items.find { + it.from_user?.id == userId && it.id == requestChatId + }) + if (index == -1) { + getListing(true) + } else { + if (message?.request_id != null) + items[index].id = message.request_id + + items[index].last_message = message + items[index].image = message?.imageUrl + items[index].messageType = message?.messageType + + if (message?.senderId != ChatDetailActivity.otherUserID) + items[index].unReadCount = items[index].unReadCount.plus(unDeliveredCount) + + items.sortByDescending { + it.last_message?.sentAt + } + adapter.notifyDataSetChanged() + + } + } + } + + + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (ConnectivityManager.CONNECTIVITY_ACTION == intent.action) { + getListing(true) + } + } + } + + + override fun onDestroyView() { + super.onDestroyView() + appSocket.removeOnMessageReceiver(messageReceiver) + LocalBroadcastManager.getInstance(activity as Context).unregisterReceiver(broadcastChat) + requireActivity().unregisterReceiver(broadcastReceiver) + } + + + private fun getListing(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[ApiKeys.AFTER] = items[items.size - 1].id ?: "" + + hashMap[ApiKeys.PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.getChatListing(hashMap) + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + if (isConnectedToInternet(requireContext(), true)) { + getListing(true) + } else + binding.swipeRefresh.isRefreshing = false + } + + binding.rvChat.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvChat.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + getListing(false) + } + } + }) + + } + + private fun bindObservers() { + viewModel.chatListing.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.lists ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + /*Set Message delivered*/ + items.forEach { + if (it.last_message?.status != AppSocket.MessageStatus.SEEN && + it.last_message?.status != AppSocket.MessageStatus.DELIVERED) { + /*If message is not read*/ + sendMessageDelivered(it.last_message) + } + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + + Status.LOADING -> { + if (!binding.swipeRefresh.isRefreshing && !isLoadingMoreItems) + binding.clLoader.visible() + } + } + }) + } + + private fun setAdapter() { + llm = LinearLayoutManager(activity) + binding.rvChat.layoutManager = llm + + adapter = ChatAdapter(this, items) + binding.rvChat.adapter = adapter + binding.rvChat.itemAnimator = null + } + + + fun startActivity(item: ChatList) { + registerActivityResult.launch(Intent(context, ChatDetailActivity::class.java) + .putExtra(USER_ID, item.from_user?.id) + .putExtra(USER_NAME, item.from_user?.name) + .putExtra(EXTRA_REQUEST_ID, item.id) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + } + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + val data = result.data + if (data != null) { + val lastMsgData = + Gson().fromJson(data.getStringExtra(LAST_MESSAGE), ChatMessage::class.java) + val userId = data.getStringExtra(OTHER_USER_ID) + val requestChatId = data.getStringExtra(EXTRA_REQUEST_ID) + refreshChatLogs(lastMsgData, userId, requestChatId ?: "") + } + } + } + + private val broadcastChat = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + getListing(true) + } + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_COMPLETED, PushType.COMPLETED, NetworkIssueFragment.NETWORK_ISSUE -> { + getListing(true) + } + } + } + } + +} + diff --git a/app/src/main/java/com/consultantvendor/ui/chat/ChatViewModel.kt b/app/src/main/java/com/consultantvendor/ui/chat/ChatViewModel.kt new file mode 100644 index 0000000..8be6392 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/chat/ChatViewModel.kt @@ -0,0 +1,98 @@ +package com.consultantvendor.ui.chat + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class ChatViewModel @Inject constructor(private val webService: WebService): ViewModel() { + + val chatListing by lazy { SingleLiveEvent>() } + + val chatMessages by lazy { SingleLiveEvent>() } + + val notifications by lazy { SingleLiveEvent>() } + + + + fun getChatListing(hashMap: HashMap) { + chatListing.value = Resource.loading() + + webService.getChatListing(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + chatListing.value = Resource.success(response.body()?.data) + } else { + chatListing.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + chatListing.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun getChatMessage(hashmap: HashMap) { + chatMessages.value = Resource.loading() + webService.getChatMessage(hashmap) + .enqueue(object : Callback> { + override fun onFailure( + call: Call>, + throwable: Throwable) { + chatMessages.value = Resource.error(ApiUtils.failure(throwable)) + } + + override fun onResponse( + call: Call>, + response: Response>) { + if (response.isSuccessful) { + chatMessages.value = Resource.success(response.body()?.data) + } else { + chatMessages.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + }) + } + + fun notifications(hashMap: HashMap) { + notifications.value = Resource.loading() + + webService.notifications(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + notifications.value = Resource.success(response.body()?.data) + } else { + notifications.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + notifications.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/chat/UploadFileViewModel.kt b/app/src/main/java/com/consultantvendor/ui/chat/UploadFileViewModel.kt new file mode 100644 index 0000000..62609c3 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/chat/UploadFileViewModel.kt @@ -0,0 +1,44 @@ +package com.consultantvendor.ui.chat + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import okhttp3.RequestBody +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + + +class UploadFileViewModel @Inject constructor(private val webService: WebService): ViewModel() { + + val uploadFile by lazy { SingleLiveEvent>() } + + fun uploadFile(hashMap: HashMap) { + uploadFile.value = Resource.loading() + + webService.uploadFile(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + uploadFile.value = Resource.success(response.body()?.data) + } else { + uploadFile.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + uploadFile.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/chat/chatdetail/ChatDetailActivity.kt b/app/src/main/java/com/consultantvendor/ui/chat/chatdetail/ChatDetailActivity.kt new file mode 100644 index 0000000..a0460b6 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/chat/chatdetail/ChatDetailActivity.kt @@ -0,0 +1,1210 @@ +package com.consultantvendor.ui.chat.chatdetail + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.media.MediaPlayer +import android.media.MediaRecorder +import android.net.ConnectivityManager +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.CountDownTimer +import android.os.Environment +import android.provider.MediaStore +import android.text.Editable +import android.text.TextWatcher +import android.util.Log +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.core.net.toUri +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DocImage +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.models.responses.chat.ChatMessage +import com.consultantvendor.data.network.* +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityChatDetailBinding +import com.consultantvendor.ui.chat.ChatViewModel +import com.consultantvendor.ui.chat.UploadFileViewModel +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.AppSocket.Events.* +import com.consultantvendor.utils.AppSocket.Events.Companion.BROADCAST +import com.consultantvendor.utils.AppSocket.Events.Companion.DELIVERED_MESSAGE +import com.consultantvendor.utils.AppSocket.Events.Companion.READ_MESSAGE +import com.consultantvendor.utils.AppSocket.Events.Companion.SEND_MESSAGE +import com.consultantvendor.utils.AppSocket.Events.Companion.TYPING +import com.consultantvendor.utils.AppSocket.MessageStatus.Companion.DELIVERED +import com.consultantvendor.utils.AppSocket.MessageStatus.Companion.NOT_SENT +import com.consultantvendor.utils.AppSocket.MessageStatus.Companion.SEEN +import com.consultantvendor.utils.AppSocket.MessageStatus.Companion.SENT +import com.consultantvendor.utils.PermissionUtils +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.consultantvendor.utils.dialogs.ProgressDialogImage +import com.devlomi.record_view.OnRecordListener +import com.google.gson.Gson +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import io.socket.client.Ack +import io.socket.emitter.Emitter +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import okhttp3.internal.filterList +import org.json.JSONException +import org.json.JSONObject +import permissions.dispatcher.* +import timber.log.Timber +import java.io.BufferedOutputStream +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.util.* +import javax.inject.Inject +import kotlin.concurrent.fixedRateTimer +import kotlin.concurrent.schedule + +@RuntimePermissions +class ChatDetailActivity : BasePhotoUploadActivity(), AppSocket.OnMessageReceiver { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var userRepository: UserRepository + + + var uri : Uri? = null + companion object { + private const val REQUEST_CODE_RECORD_AUDIO = 1 + const val DELAY: Long = 2000 + var otherUserID = "-1" + var requestId = "-1" + var isActive = false + } + + lateinit var binding: ActivityChatDetailBinding + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private lateinit var adapter: ChatDetailAdapter + + private lateinit var viewModel: ChatViewModel + + private lateinit var viewModelCall: AppointmentViewModel + + private var userID = "" + + private var userName = "" + + private var hasMoreItems = false + + private lateinit var llm: LinearLayoutManager + + private var items = ArrayList() + + private lateinit var viewModelUpload: UploadFileViewModel + + private var isTyping = false + + private var timer = Timer() + + private var timerTyping = Timer() + + private var countDownTimer: CountDownTimer? = null + + private val TOTAL_TIME = 60000L + + private var isReceiverRegistered = false + + private var audioFileName = "" + + private var timerPendingMessage = Timer() + + private var pageBeforeAfter: String? = null + + private var isLoadingItems = false + + @RequiresApi(Build.VERSION_CODES.M) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //LocaleHelper.setLocale(this, getUserLanguage()) + binding = DataBindingUtil.setContentView(this, R.layout.activity_chat_detail) + + setAdapter() + initialise() + liveData() + + listeners() + setButtonMicSend() + checkNotSentMessage() + } + + /*override fun attachBaseContext(base: Context?) { + val locale = Locale(getUserLanguage()) + val contxt = ContextWrapper.wrap(base,locale) + super.attachBaseContext(contxt) + }*/ + + fun saveVideoToAppScopeStorage(videoUri: Uri?): File? { + if (videoUri == null) { + return null + } + + val fileName = "${Calendar.getInstance().time.time}_audio.wav" + + val inputStream = contentResolver.openInputStream(videoUri) + val file = File(getExternalFilesDir(Environment.DIRECTORY_DCIM), fileName) + file.deleteOnExit() + file.createNewFile() + val out = FileOutputStream(file) + val bos = BufferedOutputStream(out) + + val buf = ByteArray(1024) + inputStream?.read(buf) + do { + bos.write(buf) + } while (inputStream?.read(buf) !== -1) + + //out.close() + bos.close() + inputStream.close() + + return file + } + + private fun initialise() { + audioFileName = "${externalCacheDir?.absolutePath}/${System.currentTimeMillis()}_audio.wav" + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + progressDialog = ProgressDialog(this) + progressDialogImage = ProgressDialogImage(this) + viewModel = ViewModelProvider(this, viewModelFactory)[ChatViewModel::class.java] + viewModelCall = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + registerReceiver(broadcastReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) + + requestId = intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + + userID = userRepository.getUser()?.id ?: "" + userName = intent.getStringExtra(USER_NAME) ?: "" + binding.tvUserName.text = userName + + } + + + override fun onStart() { + super.onStart() + + socketEvents(makeOn = true) + } + + private fun socketEvents(makeOn: Boolean = true) { + appSocket.off(TYPING, listener) + appSocket.off(READ_MESSAGE, listenerRead) + appSocket.off(DELIVERED_MESSAGE, listenerDelivered) + appSocket.off(BROADCAST, listenerStatus) + appSocket.removeOnMessageReceiver(this) + + if (makeOn) { + if (!appSocket.isConnected) + appSocket.init() + + appSocket.addOnMessageReceiver(this) + appSocket.on(TYPING, listener) + appSocket.on(READ_MESSAGE, listenerRead) + appSocket.on(DELIVERED_MESSAGE, listenerDelivered) + appSocket.on(BROADCAST, listenerStatus) + } + } + + override fun onDestroy() { + super.onDestroy() + + socketEvents(makeOn = false) + unregisterReceiver(broadcastReceiver) + unregisterReceiver() + timerPendingMessage.cancel() + } + + override fun onBackPressed() { + if (items.isNotEmpty()) { + val intent = Intent() + intent.putExtra(LAST_MESSAGE, Gson().toJson(items[0])) + intent.putExtra(OTHER_USER_ID, otherUserID) + intent.putExtra(EXTRA_REQUEST_ID, requestId) + setResult(Activity.RESULT_OK, intent) + } + otherUserID = "-1" + super.onBackPressed() + } + + private fun getChatData() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + + when { + items.isNotEmpty() && pageBeforeAfter == ApiKeys.AFTER -> { + hashMap[ApiKeys.AFTER] = items[items.size - 1].messageId.toString() + hashMap[ApiKeys.PER_PAGE] = PER_PAGE_LOAD_CHAT.toString() + } + items.isNotEmpty() && pageBeforeAfter == ApiKeys.BEFORE -> { + hashMap[ApiKeys.BEFORE] = items[0].messageId.toString() + hashMap[ApiKeys.PER_PAGE] = "1000" + } + else -> hashMap[ApiKeys.PER_PAGE] = PER_PAGE_LOAD_CHAT.toString() + } + + hashMap["request_id"] = requestId + + if (!isLoadingItems) { + isLoadingItems = true + viewModel.getChatMessage(hashMap) + } + } + } + + private fun distinctList(messagesNew: List?) { + val tempList = ArrayList() + when { + pageBeforeAfter.isNullOrEmpty() -> { + /*If message added from socket*/ + if (items.isNotEmpty()) + tempList.addAll(items) + tempList.addAll(messagesNew ?: emptyList()) + + /*If message is not read*/ + if (items.isNotEmpty()) + sendMessageRead(items[0].messageId) + + } + pageBeforeAfter == ApiKeys.AFTER -> { + tempList.addAll(items) + tempList.addAll(messagesNew ?: emptyList()) + } + pageBeforeAfter == ApiKeys.BEFORE -> { + tempList.addAll(messagesNew ?: emptyList()) + tempList.addAll(items) + } + } + + items.clear() + items.addAll(tempList.distinctBy { it.messageId }) + adapter.notifyDataSetChanged() + + /*val tempList = ArrayList() + tempList.addAll(items.distinctBy { it.messageId }) + items.clear() + items.addAll(tempList) + + if (size == 0) { + adapter.notifyDataSetChanged() + } else { + adapter.notifyItemRangeInserted(size, items.size) + adapter.notifyItemRangeChanged(size - 1, items.size) + }*/ + } + + private fun liveData() { + viewModel.chatMessages.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + isLoadingItems = false + val data = it.data + + /*User status*/ + setStatus(data?.isOnline) + /*Has more data*/ + hasMoreItems = if (pageBeforeAfter.isNullOrEmpty() || pageBeforeAfter == ApiKeys.AFTER) + data?.messages?.size == PER_PAGE_LOAD_CHAT + else true + /*Check for distinct list*/ + distinctList(data?.messages) + /*Send chat start message*/ + if (intent.hasExtra(EXTRA_IS_FIRST)) { + generateNewMessage(getString(R.string.chat_first_message, userName)) + intent.removeExtra(EXTRA_IS_FIRST) + } + /*Show Timer if needed*/ + showTimer(data?.request_status == CallAction.INPROGRESS, data) + /*Hide Loader*/ + binding.clLoader.gone() + if(data?.request_status == CallAction.COMPLETED){ + binding.tvChatData.visible() + }else{ + binding.tvChatData.gone() + } + binding.clLoader.setBackgroundResource(0) + binding.pbLoaderBottom.gone() + } + + Status.ERROR -> { + isLoadingItems = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + if (pageBeforeAfter.isNullOrEmpty() || pageBeforeAfter == ApiKeys.BEFORE) { + if (items.isEmpty()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + binding.clLoader.visible() + } else + binding.pbLoaderBottom.visible() + } + } + }) + + viewModelUpload.uploadFile.observe(this, Observer { + resources ?: return@Observer + + when (it.status) { + + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + val docImage = DocImage() + docImage.type = it.data?.type + docImage.image = it.data?.image_name + if (isConnectedToInternet(this, false)) { + sendImage(docImage) + } else { + binding.etMessage.showSnackBar(getString(R.string.check_internet)) + } + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + } + } + }) + + viewModelCall.completeChat.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + showTimer(false, null) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + /*Show time and complete button*/ + private fun showTimer(show: Boolean, data: CommonDataModel?) { + if (show) { + binding.tvCompleteChat.visible() + binding.rlChatInput.visible() + + binding.tvTimer.visible() + startTimer(((data?.currentTimer ?: 0) * 1000)) + } else { + binding.tvCompleteChat.gone() + binding.rlChatInput.gone() + + binding.tvTimer.gone() + countDownTimer?.cancel() + binding.tvCompleteChat.hideKeyboard() + } + + } + + private fun startTimer(currentTimer: Long) { + countDownTimer?.cancel() + + val totalTimerToRun = (TOTAL_TIME * 1000) + currentTimer + countDownTimer = object : CountDownTimer(totalTimerToRun, 1000) { + override fun onTick(millisUntilFinished: Long) { + val newTimer = ((totalTimerToRun - millisUntilFinished) + currentTimer) / 1000 + binding.tvTimer.text = convertMiliSecondsToMinute(newTimer) + } + + override fun onFinish() {} + } + countDownTimer?.start() + } + + + private fun convertMiliSecondsToMinute(seconds: Long): String { + val s = seconds % 60 + val m = seconds / 60 % 60 + val h = seconds / 3600 + return String.format("%s : %02d : %02d", h.toString(), m, s) + } + + private fun setStatus(isOnline: Boolean?) { + runOnUiThread { + if (isOnline == true) + binding.tvUserStatus.text = getString(R.string.active_now) + else + binding.tvUserStatus.text = "" + } + } + + private fun sendImage(docImage: DocImage) { + + val msg = ChatMessage( + imageUrl = docImage.image, + message = "", + senderId = userID, + senderName = userRepository.getUser()?.name, + receiverId = otherUserID, + messageType = docImage.type, + request_id = requestId, + sentAt = System.currentTimeMillis(), + status = NOT_SENT) + sendMessage(msg) + } + + + @RequiresApi(Build.VERSION_CODES.M) + private fun listeners() { + binding.etMessage.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable) { + Log.e("TextChanged", "afterTextChanged") + } + + override fun beforeTextChanged(s: CharSequence, start: Int, + count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + Log.e("TextChanged", "onTextChanged") + setButtonMicSend() + + timer = Timer() + if (!isTyping) { + isTyping = true + startTyping() + } + timer.cancel() + timer = Timer() + timer.schedule(object : TimerTask() { + override fun run() { + isTyping = false + stopTypingSocket() + } + }, DELAY) + } + }) + + /*Start Recording*/ + binding.recordButton.setRecordView(binding.recordView) + binding.recordButton.isListenForRecord = checkIfPermission() + binding.recordView.setSoundEnabled(false) + binding.recordView.setLessThanSecondAllowed(false) + + binding.recordButton.setOnLongClickListener { + if (checkIfPermission()) { + binding.recordButton.isListenForRecord = true + binding.llChat.invisible() + binding.recordButton.setImageDrawable(getDrawable(R.drawable.ic_mic)) + true + } else { + binding.recordButton.isListenForRecord = false + if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU){ + getPermissionForRecordAudio13WithPermissionCheck() + }else{ + getAudioWithPermissionCheck() + } + true + } + } + + binding.recordView.setOnRecordListener(object : OnRecordListener { + @SuppressLint("LogNotTimber") + override fun onFinish(recordTime: Long, limitReached: Boolean) { + binding.llChat.visible() + setButtonMicSend() + stopRecording() + if (File(audioFileName).exists()) { + val docImage = DocImage() + docImage.imageFile = File(audioFileName) + docImage.type = DocType.AUDIO + uploadFileOnServer(docImage) + } + Log.e("RECORDER", "onFinish") + } + + override fun onLessThanSecond() { + binding.llChat.visible() + stopRecording() + setButtonMicSend() + Log.e("RECORDER", "Less than one second") + + } + + override fun onLock() { + TODO("Not yet implemented") + } + + override fun onCancel() { + stopRecording() + binding.llChat.visible() + Log.e("RECORDER", "On Cancel") + + } + + override fun onStart() { + if (checkIfPermission()) { + binding.llChat.invisible() + startRecording() + }else if(checkIfPermission13RecordAudio()){ + binding.llChat.invisible() + startRecording() + } + Log.e("RECORDER", "On Start") + } + }) + + binding.recordView.setOnBasketAnimationEndListener { + binding.llChat.visible() + setButtonMicSend() + } + + + binding.ivBack.setOnClickListener { + onBackPressed() + } + + binding.btnCamera.setOnClickListener { + binding.btnCamera.hideKeyboard() + // getStorageWithPermissionCheck() + val galleryPrem = true + showImageDialog(false,galleryPrem) + + } + + binding.ivSend.setOnClickListener { + if (binding.etMessage.text.toString().trim().isEmpty()) { + binding.etMessage.error = getString(R.string.enter_message) + return@setOnClickListener + } + + generateNewMessage(binding.etMessage.text.toString().trim()) + } + + binding.tvCompleteChat.setOnClickListener { + showCompleteRequestDialog() + } + + binding.rvChatData.addOnScrollListener(onScrollListener) + } + + private fun setButtonMicSend() { + runOnUiThread { + if (binding.etMessage.text.toString().trim().isEmpty()) { + binding.ivSend.gone() + binding.recordButton.visible() + } else { + binding.recordButton.gone() + binding.ivSend.visible() + } + } + } + + private fun generateNewMessage(message: String) { + if (isConnectedToInternet(this, false)) { + + val msg = ChatMessage( + imageUrl = String(), + message = message, + senderId = userID, + senderName = userRepository.getUser()?.name, + receiverId = otherUserID, + messageType = DocType.TEXT, + request_id = requestId, + sentAt = System.currentTimeMillis(), + status = NOT_SENT) + + sendMessage(msg) + } else { + binding.etMessage.showSnackBar(getString(R.string.check_internet)) + } + + } + + private var onScrollListener = object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvChatData.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (hasMoreItems && lastVisibleItemPosition >= totalItemCount) { + pageBeforeAfter = ApiKeys.AFTER + getChatData() + } + } + } + + private fun sendMessageRead(id: String?) { + val obj = JSONObject() + obj.put("messageId", id) + obj.put("receiverId", otherUserID) + obj.put("senderId", userID) + appSocket.emit(READ_MESSAGE, obj, Ack { + + }) + } + + /*-------- TYPING ----------*/ + private fun startTyping() { + val obj = JSONObject() + obj.put("isTyping", true.toString()) + obj.put("receiverId", otherUserID) + obj.put("senderId", userID) + appSocket.emit(TYPING, obj) + } + + private fun stopTypingSocket() { + val obj = JSONObject() + obj.put("isTyping", false.toString()) + obj.put("receiverId", otherUserID) + obj.put("senderId", userID) + appSocket.emit(TYPING, obj) + } + + private val listener = Emitter.Listener { + Timber.e("Typing $it") + val senderId = (it[0] as JSONObject).getString("senderId") + val isTyping = (it[0] as JSONObject).getBoolean("isTyping") + if (senderId == otherUserID) { + if (isTyping) { + runOnUiThread { + binding.tvUserStatus.visible() + binding.tvUserStatus.text = getString(R.string.typing) + } + timerTyping.cancel() + timerTyping.purge() + timerTyping = Timer() + timerTyping.schedule(4000) { + binding.tvUserStatus.invisible() + runOnUiThread { binding.tvUserStatus.text = getString(R.string.active_now) } + } + } /*else { + runOnUiThread { + binding.tvUserStatus.text = getString(R.string.active_now) + } + }*/ + } + } + + private val listenerRead = Emitter.Listener { + Timber.e("Read $it") + + val data = it[0] as JSONObject + val messageId = data.getString("messageId") + + runOnUiThread { + items.forEachIndexed { index, chatMessage -> + if (items[index].status == SENT || items[index].status == DELIVERED) { + items[index].status = SEEN + + adapter.notifyItemChanged(items.indexOf(chatMessage)) + } + } + } + } + + private val listenerDelivered = Emitter.Listener { + Timber.e("Delivered $it") + + val data = it[0] as JSONObject + val messageId = data.getString("messageId") + + runOnUiThread { + items.forEachIndexed { index, chatMessage -> + if (items[index].status == SENT) { + items[index].status = DELIVERED + + adapter.notifyItemChanged(items.indexOf(chatMessage)) + } + } + } + } + + private val listenerStatus = Emitter.Listener { + Timber.e("BroadCast $it") + val senderId = (it[0] as JSONObject).getString("userId") + val isOnline = (it[0] as JSONObject).getBoolean("isOnline") + if (senderId == otherUserID) + setStatus(isOnline) + } + + + private fun checkNotSentMessage() { + timerPendingMessage.cancel() + + val timeDelay = 15000L + timerPendingMessage = fixedRateTimer("timerMessage", true, timeDelay, timeDelay) { + if (isConnectedToInternet(this@ChatDetailActivity, false)) + sendNotSentMessage() + } + } + + private fun sendNotSentMessage() { + val currentTime = System.currentTimeMillis() + + val messagesNotSent = items.filterList { + this.status == NOT_SENT && this.senderId == userID && (currentTime - (this.sentAt ?: currentTime) > 8000) + } + + Log.e("messagesNotSent", Gson().toJson(messagesNotSent).toString()) + + messagesNotSent.forEach { + sendMessage(it, true) + } + } + + + private fun sendMessage(chatMessage: ChatMessage, notSentMessage: Boolean = false) { + if (appSocket.isConnected && isConnectedToInternet(this@ChatDetailActivity, false)) { + + /*Add Message to list*/ + if (!notSentMessage) { + binding.etMessage.setText("") + setButtonMicSend() + + items.add(0, chatMessage) + adapter.notifyItemInserted(0) + binding.rvChatData.scrollToPosition(0) + } + + /*Send event*/ + try { + val jsonObject = JSONObject(Gson().toJson(chatMessage)) + + appSocket.emit(SEND_MESSAGE, jsonObject, Ack { + val data = it[0] as JSONObject + Log.e("ack**", data.toString()) + + /*If request completed end chat*/ + if (data.optString("status") == PushType.REQUEST_COMPLETED) { + runOnUiThread { + showTimer(false, null) + longToast(getString(R.string.request_completed)) + } + } else if (!data.optString("messageId").isNullOrEmpty()) { + runOnUiThread { + Log.e("ack========", data.optString("messageId")) + + val indexOfMessage = items.indexOf(chatMessage) + if (items[indexOfMessage].status == NOT_SENT) { + items[indexOfMessage].status = SENT + if (items[indexOfMessage].messageId.isNullOrEmpty()) + items[indexOfMessage].messageId = data.optString("messageId") + adapter.notifyItemChanged(indexOfMessage) + } + + /*items.forEachIndexed { index, chatMessage -> + if (chatMessage.status == AppSocket.MessageStatus.NOT_SENT) { + *//*If message is not read*//* + items[index].status = AppSocket.MessageStatus.SENT + adapter.notifyItemChanged(items.indexOf(chatMessage)) + } + }*/ + } + } + + }) + } catch (e: JSONException) { + e.printStackTrace() + } + } else { + if (!notSentMessage && !isConnectedToInternet(this,false)) + longToast(getString(R.string.check_internet)) + socketEvents(makeOn = true) + } + + } + + private fun setAdapter() { + llm = LinearLayoutManager(this) + llm.reverseLayout = true + llm.orientation = LinearLayoutManager.VERTICAL + binding.rvChatData.layoutManager = llm + + adapter = ChatDetailAdapter(this, items) + binding.rvChatData.adapter = adapter + } + + + override fun onMessageReceive(message: ChatMessage?) { + runOnUiThread { + if (message?.senderId == otherUserID && message.request_id == requestId) { + sendMessageRead(message.messageId) + + message.let { items.add(0, it) } + + adapter.notifyItemInserted(0) + binding.rvChatData.scrollToPosition(0) + } + } + } + + + private val broadcastReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (ConnectivityManager.CONNECTIVITY_ACTION == intent.action) { + + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.IMAGE_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + val fileToUpload = compressImage(this, File(ContentUriUtils.getFilePath(this, docPaths[0]))) + + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = fileToUpload + + uploadFileOnServer(docImage)*/ + } + + AppRequestCode.DOC_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_DOCS) + ?: emptyList()) + + val fileToUpload = File(ContentUriUtils.getFilePath(this, docPaths[0])) + + val docImage = DocImage() + docImage.type = DocType.PDF + docImage.imageFile = fileToUpload + + uploadFileOnServer(docImage)*/ + + } + } + } + } + + override fun getPdf(uri: String?) { + + } + + override fun getVideo(uri: String?, i: Int) { + + } + + override fun getImage(uri: String?, data: Uri) { + val selectedImageUri: Uri? = data + selectedImageUri?.let { + val file: File? = uriToFile(applicationContext, it) + file?.let { + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = it + uploadFileOnServer(docImage) + } + } + } + + fun uriToFile(context: Context, uri: Uri): File? { + val path = getRealPathFromUri(context, uri) + return path?.let { File(it) } + } + + private fun getRealPathFromUri(context: Context, uri: Uri): String? { + var realPath: String? = null + // Depending on the URI scheme, use different query methods + if (uri.scheme == "content") { + // MediaStore (and general content provider) scheme + context.contentResolver.query(uri, null, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + realPath = cursor.getString(columnIndex) + } + } + } else if (uri.scheme == "file") { + // File scheme + realPath = uri.path + } + return realPath + } + + private fun uploadFileOnServer(docImage: DocImage?) { + val hashMap = HashMap() + hashMap["type"] = getRequestBody(docImage?.type) + + val body: RequestBody = docImage?.imageFile?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + docImage?.imageFile?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + askForOption(null, this, binding.btnCamera) + } + + @NeedsPermission(Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_MEDIA_AUDIO) + fun getPermissionForRecordAudio13() { + binding.recordButton.isListenForRecord = true + } + @NeedsPermission(Manifest.permission.READ_MEDIA_IMAGES,Manifest.permission.CAMERA,Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED) + fun getPermissionForImages13() { + askForOption(null, this, binding.btnCamera) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + this, R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + this, R.string.media_permission + ) + } + + @NeedsPermission(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getAudio() { + binding.recordButton.isListenForRecord = true + } + + @OnShowRationale(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showAudioRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.record_audio_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onAudioNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog(this, R.string.record_audio_permission) + } + + @OnPermissionDenied( + Manifest.permission.RECORD_AUDIO, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) + fun showAudioDeniedForStorage() { + PermissionUtils.showAppSettingsDialog(this, R.string.record_audio_permission) + } + + + + private fun showCompleteRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(this, R.string.end_chat, + + R.string.end_chat_desc, R.string.end_chat, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiAcceptRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun hitApiAcceptRequest() { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["request_id"] = requestId + + viewModelCall.completeChat(hashMap) + } + } + + + override fun onPause() { + super.onPause() + isActive = false + + otherUserID = "-1" + } + + override fun onResume() { + super.onResume() + isActive = true + registerReceiver() + + otherUserID = intent.getStringExtra(USER_ID) ?: "" + + pageBeforeAfter = if (pageBeforeAfter == null) "" else ApiKeys.BEFORE + getChatData() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(this).registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_COMPLETED, PushType.COMPLETED -> { + if (intent.getStringExtra(EXTRA_REQUEST_ID) == requestId) { + showTimer(false, null) + longToast(getString(R.string.request_completed)) + } + } + NetworkIssueFragment.NETWORK_ISSUE -> { + pageBeforeAfter = if (pageBeforeAfter == null) "" else ApiKeys.BEFORE + getChatData() + } + } + + } + } + + /*Audio Recoder*/ + private var recorder: MediaRecorder? = null + private var player: MediaPlayer? = null + + private fun startRecording() { + if (File(audioFileName).exists()) + File(audioFileName).delete() + + recorder = MediaRecorder().apply { + setAudioSource(MediaRecorder.AudioSource.MIC) + setOutputFormat(MediaRecorder.OutputFormat.MPEG_4) + setOutputFile(audioFileName) + setAudioEncoder(MediaRecorder.AudioEncoder.AAC) + + try { + prepare() + } catch (e: IOException) { + Log.e("audioFileName", "prepare() failed") + } + + start() + } + } + + private fun stopRecording() { + try { + recorder?.apply { + stop() + release() + } + recorder = null + } catch (ignored: RuntimeException) { + } + } + + fun startPlaying(link: String) { + /* val fragment = BottomAudioPlayerFragment(link) + fragment.show(supportFragmentManager, fragment.tag)*/ + + val viewMediaIntent = Intent() + viewMediaIntent.action = Intent.ACTION_VIEW + viewMediaIntent.setDataAndType(Uri.parse(link), "audio/*") + viewMediaIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_SINGLE_TOP) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(viewMediaIntent) + +// player = MediaPlayer().apply { +// try { +// setDataSource(this@ChatDetailActivity, Uri.parse(link)) +// prepare() +// start() +// } catch (e: IOException) { +// Log.e("MediaPlayer", "prepare() failed") +// } +// } + } + + private fun stopPlaying() { + player?.release() + player = null + + } + + private fun checkIfPermission(): Boolean { + return (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( + this, + Manifest.permission.WRITE_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED) + } + + private fun checkIfPermission13RecordAudio(): Boolean { + return (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission( + this, + Manifest.permission.READ_MEDIA_AUDIO + ) == PackageManager.PERMISSION_GRANTED) + } + private fun checkIfPermissionImages(): Boolean { + return (ContextCompat.checkSelfPermission( + this, + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/chat/chatdetail/ChatDetailAdapter.kt b/app/src/main/java/com/consultantvendor/ui/chat/chatdetail/ChatDetailAdapter.kt new file mode 100644 index 0000000..5d4df5e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/chat/chatdetail/ChatDetailAdapter.kt @@ -0,0 +1,260 @@ +package com.consultantvendor.ui.chat.chatdetail + + +import android.app.Activity +import android.text.format.DateUtils +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.chat.ChatMessage +import com.consultantvendor.databinding.ItemChatLeftBinding +import com.consultantvendor.databinding.ItemChatRightBinding +import com.consultantvendor.databinding.ItemChatTypingBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.DateUtils.dateFormatFromMillis +import java.util.* + +class ChatDetailAdapter(private var context: ChatDetailActivity, + private var data: ArrayList) : RecyclerView.Adapter() { + + companion object { + private const val UI_LEFT = 0 + private const val UI_RIGHT = 1 + private const val TYPING = 2 + } + + override fun getItemViewType(position: Int): Int { + return when { + data[position].messageType == DocType.MESSAGE_TYPING -> { + TYPING + } + data[position].receiverId == context.userRepository.getUser()?.id -> { + UI_LEFT + } + else -> { + UI_RIGHT + } + } + } + + override fun onCreateViewHolder(viewGroup: ViewGroup, position: Int): RecyclerView.ViewHolder { + return when (position) { + + UI_RIGHT -> { + ViewHolderRight(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_right, viewGroup, false)) + } + UI_LEFT -> { + ViewHolderLeft(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_left, viewGroup, false)) + } + TYPING -> { + ViewHolderType(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_typing, viewGroup, false)) + } + else -> ViewHolderRight(DataBindingUtil.inflate(LayoutInflater + .from(context), R.layout.item_chat_right, viewGroup, false)) + } + } + + inner class ViewHolderType(val binding:ItemChatTypingBinding) : RecyclerView.ViewHolder(binding.root) { + fun bind() { + + } + } + + + override fun getItemCount(): Int { + return data.size + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val showDateHeader: Boolean + if (position == data.size - 1) { + showDateHeader = true + } else { + val cal1 = Calendar.getInstance() + cal1.timeInMillis = data[position + 1].sentAt ?: 0 + val cal2 = Calendar.getInstance() + cal2.timeInMillis = data[position].sentAt ?: 0 + showDateHeader = !(cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && + cal1.get(Calendar.DAY_OF_YEAR) == cal2.get( + Calendar.DAY_OF_YEAR)) + } + when (holder) { + is ViewHolderRight -> holder.bind(data[position], showDateHeader) + is ViewHolderLeft -> holder.bind(data[position], showDateHeader) + is ViewHolderType -> holder.bind() + } + } + + + inner class ViewHolderRight(val binding: ItemChatRightBinding) : RecyclerView.ViewHolder(binding.root) { + + init { + /*Click*/ + binding.cvImageRight.setOnClickListener { + val chat=data[bindingAdapterPosition] + when (chat.messageType) { + DocType.IMAGE -> { + val itemImages = ArrayList() + // itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS, chat.imageUrl)) + itemImages.add(chat.imageUrl.toString()) + viewImageFull(context as Activity, itemImages, 0) + } + } + } + + binding.tvPdfRight.setOnClickListener { + val chat=data[bindingAdapterPosition] + when (chat.messageType) { + DocType.PDF -> { + val link = getImageBaseUrl(ImageFolder.PDF, chat.imageUrl) + openPdf(context, link) + } + } + } + + binding.tvAudioRight.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.AUDIO -> { + context.startPlaying(getImageBaseUrl(ImageFolder.AUDIO, chat.imageUrl)) + } + } + } + } + + fun bind(chat: ChatMessage, showDateHeader: Boolean) = with(binding) { + tvDateRight.gone() + tvTextRight.gone() + cvImageRight.gone() + tvPdfRight.gone() + tvAudioRight.gone() + + tvTimeRight.text = chat.sentAt?.let { DateUtils.formatDateTime(context, it, DateUtils.FORMAT_SHOW_TIME) } + if (showDateHeader) { + tvDateRight.visible() + tvDateRight.text = chat.sentAt?.let { getDateHeader(it) } + } + + when (chat.messageType) { + DocType.TEXT -> { + tvTextRight.visible() + tvTextRight.text = chat.message + } + DocType.IMAGE -> { + cvImageRight.visible() + loadImage("profile",ivImageRight, chat.imageUrl, R.drawable.image_placeholder) + } + DocType.PDF -> { + tvPdfRight.visible() + tvPdfRight.text=chat.imageUrl + } + DocType.AUDIO -> { + tvAudioRight.visible() + tvAudioRight.text = chat.imageUrl + } + } + ivTick.setImageResource(getTickValue(chat.status)) + } + } + + inner class ViewHolderLeft(val binding: ItemChatLeftBinding) : RecyclerView.ViewHolder(binding.root) { + init { + /*Click*/ + binding.cvImageLeft.setOnClickListener { + val chat=data[bindingAdapterPosition] + when (chat.messageType) { + DocType.IMAGE -> { + val itemImages = ArrayList() + //itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS, chat.imageUrl)) + itemImages.add(chat.imageUrl.toString()) + viewImageFull(context as Activity, itemImages, 0) + } + } + } + + binding.tvPdfLeft.setOnClickListener { + val chat=data[bindingAdapterPosition] + when (chat.messageType) { + DocType.PDF -> { + val link = getImageBaseUrl(ImageFolder.PDF, chat.imageUrl) + openPdf(context, link) + } + } + } + + binding.tvAudioLeft.setOnClickListener { + val chat = data[bindingAdapterPosition] + when (chat.messageType) { + DocType.AUDIO -> { + context.startPlaying(getImageBaseUrl(ImageFolder.AUDIO, chat.imageUrl)) + } + } + } + } + + fun bind(chat: ChatMessage, showDateHeader: Boolean) = with(binding) { + tvDateLeft.gone() + tvTextLeft.gone() + cvImageLeft.gone() + tvPdfLeft.gone() + tvAudioLeft.gone() + + tvTimeLeft.text = chat.sentAt?.let { DateUtils.formatDateTime(context, it, DateUtils.FORMAT_SHOW_TIME) } + if (showDateHeader) { + tvDateLeft.visible() + tvDateLeft.text = chat.sentAt?.let { getDateHeader(it) } + } + + + when (chat.messageType) { + DocType.TEXT -> { + tvTextLeft.visible() + tvTextLeft.text = chat.message + } + DocType.IMAGE -> { + cvImageLeft.visible() + loadImage("profile",ivImageLeft, chat.imageUrl, R.drawable.image_placeholder) + } + DocType.PDF -> { + tvPdfLeft.visible() + tvPdfLeft.text=chat.imageUrl + } + DocType.AUDIO -> { + tvAudioLeft.visible() + tvAudioLeft.text = chat.imageUrl + } + } + } + } + + private fun getDateHeader(millis: Long): String? { + val calendar = Calendar.getInstance() + calendar.timeInMillis = millis + val dateString: String? + dateString = when { + DateUtils.isToday(calendar.timeInMillis) -> context.getString(R.string.today) + isYesterday(calendar) -> String.format("%s", context.getString(R.string.yesterday)) + else -> dateFormatFromMillis(DateFormat.DATE_FORMAT, calendar.timeInMillis) + } + return dateString + } + + private fun getTickValue(status: String?): Int { + return when (status) { + AppSocket.MessageStatus.NOT_SENT -> R.drawable.ic_wait + AppSocket.MessageStatus.SENT -> R.drawable.ic_sent + AppSocket.MessageStatus.DELIVERED -> R.drawable.ic_delivered + AppSocket.MessageStatus.SEEN -> R.drawable.ic_seen + else -> R.drawable.ic_wait + } + } +} + + + diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/HomeActivity.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/HomeActivity.kt new file mode 100644 index 0000000..8a54a8f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/HomeActivity.kt @@ -0,0 +1,370 @@ +package com.consultantvendor.ui.dashboard + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.location.Geocoder +import android.location.Location +import android.location.LocationManager +import android.os.Bundle +import android.os.Looper +import android.provider.Settings +import android.util.Log +import android.widget.Toast +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.LiveData +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.navigation.NavController +import com.consultantvendor.* +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityHomeBinding +import com.consultantvendor.ui.dashboard.home.appointment.requests.BottomServiceRequestFragment +import com.consultantvendor.ui.dashboard.home.appointment.requests.BottomServiceRequestNewFragment +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.SignUpActivity +import com.consultantvendor.utils.* +import com.google.android.gms.location.* +import dagger.android.support.DaggerAppCompatActivity +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList +import kotlin.concurrent.fixedRateTimer + + +class HomeActivity : DaggerAppCompatActivity() { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var appSocket: AppSocket + + lateinit var binding: ActivityHomeBinding + + private lateinit var viewModel: LoginViewModel + + private var currentNavController: LiveData? = null + + lateinit var mFusedLocationClient: FusedLocationProviderClient + + private lateinit var geoCoder: Geocoder + + private var isReceiverRegistered = false + + private var isPendingApiProgressing = false + + private var timerPendingApi = Timer() + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = DataBindingUtil.setContentView(this, R.layout.activity_home) + + initialise() + + setNavigation() + listeners() + bindObservers() + getPendingRequest() + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + appSocket.init() + + + + val permissionState = + ContextCompat.checkSelfPermission( + this, Manifest.permission.POST_NOTIFICATIONS) + if (permissionState == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1) + + } + + /* Fetch Notification Token */ + userRepository.pushTokenUpdate() + + if (appFeatures.needLocation) { + /*Ask for location*/ + geoCoder = Geocoder(this, Locale.getDefault()) + mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + getLastLocation() + } + + /*Ask for phone number if not added*/ + if (BuildConfig.FLAVOR == "homeDoctor" && userRepository.getUser()?.phone.isNullOrEmpty()) { + startActivity(Intent(this, SignUpActivity::class.java) + .putExtra(UPDATE_NUMBER, true)) + } + } + + + private fun listeners() { + } + + private fun checkPendingRequest() { + val timeDelay = 60000L + + timerPendingApi = fixedRateTimer("timerMessage", true, 2000L, timeDelay) { + getPendingRequest() + } + } + + + private fun setNavigation() { + val navGraphIds = when (BuildConfig.FLAVOR) { + "homeDoctor", "airdoc", "nurseLynx","meetMd" -> + listOf(R.navigation.navigation_appointment, + R.navigation.navigation_wallet, + R.navigation.navigation_revenue, + R.navigation.navigation_profile) + else -> + listOf(R.navigation.navigation_home, + R.navigation.navigation_wallet, + R.navigation.navigation_revenue, + R.navigation.navigation_profile) + } + + // Setup the bottom navigation view with a list of navigation graphs + val controller = binding.bottomNav.setupWithNavController( + navGraphIds = navGraphIds, + fragmentManager = supportFragmentManager, + containerId = R.id.nav_host_fragment, + intent = intent + ) + + currentNavController = controller + + if (intent.hasExtra(EXTRA_TAB)) { + if (intent.getStringExtra(EXTRA_TAB) == "1") { + binding.bottomNav.selectedItemId = R.id.navigation_wallet + } + } + } + + override fun onSupportNavigateUp(): Boolean { + return currentNavController?.value?.navigateUp() ?: false + } + + @SuppressLint("MissingPermission") + private fun getLastLocation() { + if (checkPermissions()) { + if (isLocationEnabled()) { + mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task -> + val location: Location? = task.result + if (location != null) { + getLocationName(location.latitude, location.longitude) + } + } + requestNewLocationData() + + } else { + Toast.makeText(this, "Turn on location", Toast.LENGTH_LONG).show() + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(intent) + } + } else { + requestPermissions() + } + } + + @SuppressLint("MissingPermission") + private fun requestNewLocationData() { + runOnUiThread { + val mLocationRequest = LocationRequest.create().apply { + interval = 0 + fastestInterval = 0 + priority = LocationRequest.PRIORITY_HIGH_ACCURACY + numUpdates = 1 + } + + mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, + Looper.myLooper()) + } + } + + private val mLocationCallback = object : LocationCallback() { + override fun onLocationResult(locationResult: LocationResult) { + val mLastLocation: Location = locationResult.lastLocation + getLocationName(mLastLocation.latitude, mLastLocation.longitude) + } + } + + private fun isLocationEnabled(): Boolean { + val locationManager: LocationManager = + getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER + ) + } + + private fun checkPermissions(): Boolean { + if (ActivityCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission( + this, + Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + return true + } + return false + } + + private fun requestPermissions() { + registerActivityResult.launch(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.LOCATION)) + } + + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + getLastLocation() + } + } + + private fun getLocationName(lat: Double, lng: Double) { + runOnUiThread { + try { + var locationName = "" + + val addresses = geoCoder.getFromLocation(lat, lng, 1 + ) // Here 1 represent max location result to returned, by documents it recommended 1 to 5 + + if (addresses?.isNotEmpty()!!) { + locationName = when { + addresses[0].getAddressLine(1) != null -> addresses[0].getAddressLine( + 1) + addresses[0].featureName == null -> addresses[0].adminArea + else -> String.format("%s, %s", addresses[0].featureName, + addresses[0].locality) + } + } + // binding.itemMain.tvLocation.text = name + + val hashMap = HashMap() + hashMap["name"] = userRepository.getUser()?.name ?: "" + hashMap["location_name"] = locationName + hashMap["lat"] = lat + hashMap["long"] = lng + viewModel.updateProfile(hashMap) + } catch (e: Exception) { + } + } + } + + private fun bindObservers() { + viewModel.pendingRequests.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + isPendingApiProgressing = false + /*All Pending request*/ +// it.data?.pending_requests?.forEach { +// runOnUiThread { +// val fragment = BottomServiceRequestFragment(it) +// fragment.show(supportFragmentManager, fragment.tag) +// } +// } + + if(it.data?.pending_requests?.size!! >0){ + runOnUiThread { + val fragment = BottomServiceRequestNewFragment(it.data.pending_requests) + fragment.show(supportFragmentManager, fragment.tag) + } + } + + } + Status.ERROR -> { + isPendingApiProgressing = false + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + timerPendingApi.cancel() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.BOOKING_REQUEST) + LocalBroadcastManager.getInstance(this).registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.BOOKING_REQUEST -> { + try { + getPendingRequest() + } catch (e: Exception) { + } + } + } + } + } + + private fun getPendingRequest() { + runOnUiThread { + if (BuildConfig.FLAVOR == "nurseLynx" && isConnectedToInternet(this, false)) { + if (!isPendingApiProgressing) { + isPendingApiProgressing = true + viewModel.pendingRequests() + } + } + } + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/AddFeedFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/AddFeedFragment.kt new file mode 100644 index 0000000..a1055d7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/AddFeedFragment.kt @@ -0,0 +1,261 @@ +package com.consultantvendor.ui.dashboard.feeds + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.net.Uri +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.consultantvendor.R +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentAddFeedBinding +import com.consultantvendor.ui.chat.UploadFileViewModel +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.PermissionUtils +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.consultantvendor.utils.dialogs.ProgressDialogImage +import dagger.android.support.DaggerFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import javax.inject.Inject + +@RuntimePermissions +class AddFeedFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentAddFeedBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private lateinit var viewModel: FeedViewModel + + private lateinit var viewModelUpload: UploadFileViewModel + + private var fileToUpload: File? = null + + private var typeOfBlog = BlogType.BLOG + + + override fun onCreateView(inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_add_feed, container, false) + rootView = binding.root + + initialise() + listeners() + setEditInformation() + bindObservers() + } + return rootView + } + + + private fun initialise() { + editTextScroll(binding.etDesc) + + when (requireActivity().intent.getStringExtra(PAGE_TO_OPEN)) { + BlogType.BLOG, DrawerActivity.ADD_BLOG -> { + typeOfBlog = BlogType.BLOG + binding.tvHeader.text = getString(R.string.post_blog) + } + BlogType.ARTICLE, DrawerActivity.ADD_ARTICLE -> { + typeOfBlog = BlogType.ARTICLE + + binding.tvHeader.text = getString(R.string.post_article) + } + else -> { + typeOfBlog = BlogType.ARTICLE + binding.tvHeader.text = getString(R.string.latest_articles) + } + } + + viewModel = ViewModelProvider(this, viewModelFactory)[FeedViewModel::class.java] + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + progressDialogImage = ProgressDialogImage(requireActivity()) + } + + private fun setEditInformation() { + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivNext.setOnClickListener { + checkValidation() + } + + binding.ivPic.setOnClickListener { + getStorageWithPermissionCheck() + } + } + + + private fun checkValidation() { + when { + fileToUpload == null -> { + binding.etTitle.showSnackBar(getString(R.string.select_image)) + } + binding.etTitle.text.toString().isEmpty() -> { + binding.etTitle.showSnackBar(getString(R.string.title)) + } + binding.etDesc.text.toString().isEmpty() -> { + binding.etDesc.showSnackBar(getString(R.string.description)) + } + isConnectedToInternet(requireContext(), true) -> { + uploadFileOnServer() + } + } + } + + + private fun uploadFileOnServer() { + + val hashMap =HashMap() + + hashMap["type"] = getRequestBody(DocType.IMAGE) + + val body: RequestBody =fileToUpload?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + fileToUpload?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + private fun bindObservers() { + viewModelUpload.uploadFile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + /*Create Article*/ + val hashMap = HashMap() + hashMap["title"] = binding.etTitle.text.toString() + hashMap["description"] = binding.etDesc.text.toString() + hashMap["type"] = typeOfBlog + hashMap["image"] = it.data?.image_name ?: "" + + viewModel.feeds(hashMap) + + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + + viewModel.feeds.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + resultFragmentIntent(this, targetFragment ?: this, + AppRequestCode.ARTICLE_CHANGES, Intent()) + else { + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + + if (requestCode == AppRequestCode.IMAGE_PICKER) { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + Glide.with(requireContext()).load(fileToUpload).centerCrop().into(binding.ivPic) + binding.tvUploadBanner.gone()*/ + } + } + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + selectImages(this,requireActivity()) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedDetailsFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedDetailsFragment.kt new file mode 100644 index 0000000..206486c --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedDetailsFragment.kt @@ -0,0 +1,173 @@ +package com.consultantvendor.ui.dashboard.feeds + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentFeedDetailsBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.google.android.material.appbar.AppBarLayout +import dagger.android.support.DaggerFragment +import javax.inject.Inject +import kotlin.math.abs + + +class FeedDetailsFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentFeedDetailsBinding + + private var rootView: View? = null + + private var details: Feed? = null + + private lateinit var viewModel: FeedViewModel + + private lateinit var progressDialog: ProgressDialog + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_feed_details, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[FeedViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + details = arguments?.getSerializable(EXTRA_REQUEST_ID) as Feed + setData() + + if (isConnectedToInternet(requireContext(), true)) { + viewModel.viewFeeds(details?.id ?: "") + } + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.appBar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> + binding.toolbar.title = "" + + when { + abs(verticalOffset) == appBarLayout.totalScrollRange -> { + // Collapsed + binding.toolbar.title = details?.title + binding.tvName.invisible() + } + verticalOffset == 0 -> { + // Expanded + binding.tvName.visible() + } + else -> { + // Somewhere in between + binding.tvName.visible() + } + } + }) + + binding.ivFavourite.setOnClickListener { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["favorite"] = if (details?.is_favorite == true) "0" else "1" + viewModel.addFavorite(details?.id ?: "", hashMap) + } + } + } + + private fun setData() { + binding.tvName.text = getDoctorName(details?.user_data) + binding.tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, details?.created_at) + + binding.toolbarLayout.isTitleEnabled = false + loadImage("tag",binding.ivImage, details?.image, R.drawable.image_placeholder) + binding.tvTitle.text = details?.title + binding.tvDec.text = details?.description + + if (details?.is_favorite == true) + binding.ivFavourite.setImageResource(R.drawable.ic_like_red) + else + binding.ivFavourite.setImageResource(R.drawable.ic_like_white) + } + + private fun bindObservers() { + viewModel.viewFeeds.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + details = it.data?.feed + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + //binding.clLoader.visible() + } + } + }) + + viewModel.addFavorite.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (isConnectedToInternet(requireContext(), true)) { + viewModel.viewFeeds(details?.id ?: "") + } + + + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + resultFragmentIntentNoPop(this, targetFragment ?: this, + AppRequestCode.ARTICLE_CHANGES, Intent()) + else + requireActivity().setResult(Activity.RESULT_OK) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + } + + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedViewModel.kt new file mode 100644 index 0000000..88dfd0b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedViewModel.kt @@ -0,0 +1,122 @@ +package com.consultantvendor.ui.dashboard.feeds + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class FeedViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val feeds by lazy { SingleLiveEvent>() } + + val getFeeds by lazy { SingleLiveEvent>() } + + val viewFeeds by lazy { SingleLiveEvent>() } + + val addFavorite by lazy { SingleLiveEvent>() } + + fun feeds(hashMap: HashMap) { + feeds.value = Resource.loading() + + webService.feeds(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + feeds.value = Resource.success(response.body()?.data) + } else { + feeds.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + feeds.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getFeeds(hashMap: HashMap) { + getFeeds.value = Resource.loading() + + webService.getFeeds(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getFeeds.value = Resource.success(response.body()?.data) + } else { + getFeeds.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getFeeds.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun viewFeeds(feed_id: String) { + viewFeeds.value = Resource.loading() + + webService.viewFeeds(feed_id) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + viewFeeds.value = Resource.success(response.body()?.data) + } else { + viewFeeds.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + viewFeeds.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addFavorite(feed_id: String,hashMap: HashMap) { + addFavorite.value = Resource.loading() + + webService.addFavorite(feed_id,hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addFavorite.value = Resource.success(response.body()?.data) + } else { + addFavorite.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addFavorite.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedsAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedsAdapter.kt new file mode 100644 index 0000000..813f001 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedsAdapter.kt @@ -0,0 +1,79 @@ +package com.consultantvendor.ui.dashboard.feeds + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemArticleBinding +import com.consultantvendor.utils.* + + +class FeedsAdapter(private val fragment: FeedsFragment, private val items: ArrayList) + : RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_article, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemArticleBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.cvBlog.setOnClickListener { + val feedDetailsFragment = FeedDetailsFragment() + val bundle = Bundle() + bundle.putSerializable(EXTRA_REQUEST_ID, items[adapterPosition]) + feedDetailsFragment.arguments = bundle + replaceResultFragment(fragment, feedDetailsFragment, R.id.container, AppRequestCode.ARTICLE_CHANGES) + } + + binding.ivFavourite.setOnClickListener { + fragment.clickFavourite(items[adapterPosition]) + } + } + + fun bind(item: Feed) = with(binding) { + tvName.text = item.title + tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, item.created_at) + loadImage("tag",ivImage, item.image, R.drawable.image_placeholder) + + tvViews.text = binding.root.context.getString(R.string.s_views, item.views) + + if (item.is_favorite == true) + ivFavourite.setImageResource(R.drawable.ic_like_red) + else + ivFavourite.setImageResource(R.drawable.ic_like_white) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedsFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedsFragment.kt new file mode 100644 index 0000000..0a5a752 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/feeds/FeedsFragment.kt @@ -0,0 +1,255 @@ +package com.consultantvendor.ui.dashboard.feeds + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.GridLayoutManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityListingToolbarBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class FeedsFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: FeedViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: FeedsAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var typeOfBlog = BlogType.BLOG + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + when (requireActivity().intent.getStringExtra(PAGE_TO_OPEN)) { + BlogType.BLOG -> { + typeOfBlog = BlogType.BLOG + binding.tvHeader.text = getString(R.string.latest_blogs) + binding.tvAdd.text = getString(R.string.post_blog_plus) + } + BlogType.ARTICLE -> { + typeOfBlog = BlogType.ARTICLE + + binding.tvHeader.text = getString(R.string.latest_articles) + binding.tvAdd.text = getString(R.string.post_article_plus) + } + else -> { + typeOfBlog = BlogType.ARTICLE + binding.tvHeader.text = getString(R.string.latest_articles) + binding.tvAdd.text = getString(R.string.post_article_plus) + } + } + + if (requireActivity().intent.hasExtra(LIST_TYPE)) { + when (requireActivity().intent.getStringExtra(LIST_TYPE)) { + FAVOURITE_LIST -> + binding.tvHeader.text = getString(R.string.favourites) + OWN_LIST -> + binding.tvHeader.text = getString(R.string.my_articles) + } + } + + viewModel = ViewModelProvider(this, viewModelFactory)[FeedViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.tvAdd.visible() + } + + private fun setAdapter() { + adapter = FeedsAdapter(this, items) + binding.rvListing.layoutManager = GridLayoutManager(requireContext(), 2) + binding.rvListing.adapter = adapter + } + + fun clickFavourite(item: Feed) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = java.util.HashMap() + hashMap["favorite"] = if (item.is_favorite == true) "0" else "1" + viewModel.addFavorite(item.id ?: "", hashMap) + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvAdd.setOnClickListener { + replaceResultFragment(this, AddFeedFragment(), R.id.container, AppRequestCode.ARTICLE_CHANGES) + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["type"] = typeOfBlog + if (requireActivity().intent.hasExtra(LIST_TYPE)) { + when (requireActivity().intent.getStringExtra(LIST_TYPE)) { + FAVOURITE_LIST -> + hashMap["favorite"] = "1" + OWN_LIST -> + hashMap["consultant_id"] = userRepository.getUser()?.id ?:"" + } + + } + + viewModel.getFeeds(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.getFeeds.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.feeds ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModel.addFavorite.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (isConnectedToInternet(requireContext(), true)) { + hitApi(true) + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + if (requestCode == AppRequestCode.ARTICLE_CHANGES) { + hitApi(true) + } + } + } + + companion object { + const val LIST_TYPE = "LIST_TYPE" + const val FAVOURITE_LIST = "FAVOURITE_LIST" + const val OWN_LIST = "OWN_LIST" + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentAdapter.kt new file mode 100644 index 0000000..a1ec434 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentAdapter.kt @@ -0,0 +1,173 @@ +package com.consultantvendor.ui.dashboard.home + +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemAppointmentBinding +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* + + +class AppointmentAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_appointment, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemAppointmentBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvAccept.setOnClickListener { + checkRequest() + } + + binding.tvCancel.setOnClickListener { + if (fragment is AppointmentFragment) + fragment.cancelAppointment(items[bindingAdapterPosition]) + else if (fragment is HomeFragment) + fragment.cancelAppointment(items[bindingAdapterPosition]) + } + + binding.root.setOnClickListener { + if (fragment is AppointmentFragment) + fragment.registerActivityResult.launch(Intent(fragment.requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, items[bindingAdapterPosition].id)) + else if (fragment is HomeFragment) + fragment.startActivityForResult(Intent(fragment.requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, items[bindingAdapterPosition].id), AppRequestCode.APPOINTMENT_DETAILS) + + } + } + + /*Common method*/ + private fun checkRequest() { + if (fragment is AppointmentFragment) + fragment.proceedRequest(items[bindingAdapterPosition]) + else if (fragment is HomeFragment) + fragment.proceedRequest(items[bindingAdapterPosition]) + } + + fun bind(request: Request) = with(binding) { + val context = binding.root.context + + tvAccept.visible() + tvCancel.hideShowView(request.canCancel) + + tvName.text = request.from_user?.name + loadImage("profile",binding.ivPic, request.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + tvDateTime.text = "${DateUtils.dateTimeFormatFromUTC( + DateFormat.MON_DATE_YEAR, request.bookingDateUTC)} · " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC)}" + + tvRequestType.text = request.service_type + tvPrice.text = getCurrency(request.price) + + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorPrimary)) + + when (request.status) { + CallAction.PENDING -> { + tvStatus.text = context.getString(R.string.new_request) + tvAccept.text = context.getString(R.string.accept_request) + } + CallAction.ACCEPT -> { + tvStatus.text = context.getString(R.string.accepted) + tvAccept.text = context.getString(R.string.start_request) + tvCancel.gone() + } + CallAction.INPROGRESS -> { + tvStatus.text = context.getString(R.string.inprogess) + tvAccept.text = + context.getString(R.string.check_request) + tvCancel.gone() + tvAccept.gone() + } + CallAction.START -> { + tvStatus.text = context.getString(R.string.inprogess) + tvAccept.text = context.getString(R.string.track_status) + tvCancel.gone() + } + CallAction.REACHED -> { + tvStatus.text = context.getString(R.string.reached_destination) + tvAccept.text = context.getString(R.string.track_status) + tvCancel.gone() + } + CallAction.START_SERVICE -> { + tvStatus.text = context.getString(R.string.started) + tvAccept.text = context.getString(R.string.mark_complete) + tvCancel.gone() + } + CallAction.COMPLETED -> { + tvStatus.text = context.getString(R.string.completed) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.textColorGreen)) + tvAccept.gone() + tvCancel.gone() + } + CallAction.FAILED -> { + tvAccept.gone() + tvStatus.text = context.getString(R.string.no_show) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorCancel)) + tvCancel.gone() + } + CallAction.CANCELED -> { + tvStatus.text = context.getString(R.string.canceled) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorCancel)) + tvAccept.gone() + tvCancel.gone() + } + CallAction.CANCEL_SERVICE -> { + tvStatus.text = context.getString(R.string.canceled_service) + tvStatus.setTextColor(ContextCompat.getColor(context, R.color.colorCancel)) + tvCancel.gone() + tvAccept.gone() + } + else -> { + tvStatus.text = context.getString(R.string.new_request) + } + } + + /*Hide these button*/ + tvAccept.gone() + tvCancel.gone() + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentFragment.kt new file mode 100644 index 0000000..8401f8b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentFragment.kt @@ -0,0 +1,699 @@ +package com.consultantvendor.ui.dashboard.home + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.models.responses.Service +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentAppointmentBinding +import com.consultantvendor.ui.calling.CallingActivity +import com.consultantvendor.ui.chat.chatdetail.ChatDetailActivity +import com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus.AppointmentStatusActivity +import com.consultantvendor.ui.dashboard.settings.contactlist.ContactViewModel +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.drawermenu.DrawerActivity.Companion.NOTIFICATION +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import java.text.SimpleDateFormat +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList +import kotlin.collections.HashMap + +class AppointmentFragment : DaggerFragment(), OnDateSelected { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var appSocket: AppSocket + + private lateinit var binding: FragmentAppointmentBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var viewModelContact: ContactViewModel + + private var items = ArrayList() + + private var itemsService = ArrayList() + + private lateinit var adapter: AppointmentAdapter + + private lateinit var serviceAdapter: AppointmentServiceAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var requestItem: Request? = null + + private var isReceiverRegistered = false + + var selectedDate = "" + + private var serviceId = "" + + var calendar: Calendar? = null + + private var notification_count: Int? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_appointment, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + + hitApi(true) + } + return rootView + } + + + private fun initialise() { + binding.clLoader.setBackgroundResource(R.color.colorWhite) + /*Get today date*/ + calendar = Calendar.getInstance(Locale.getDefault()) + val sdf = SimpleDateFormat(DateFormat.MON_DATE_YEAR, Locale.ENGLISH) + binding.tvDate.text = sdf.format(calendar?.time) + selectedDate = binding.tvDate.text.toString() + + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + viewModelContact = ViewModelProvider(this, viewModelFactory)[ContactViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + if (!requireActivity().intent.hasExtra(PAGE_TO_OPEN)) { + binding.toolbar.navigationIcon = null + binding.toolbar.title = getString(R.string.home) + } else { + binding.toolbar.title = getString(R.string.appointments) + } + + binding.tvRequestType.hideShowView(BuildConfig.FLAVOR == "homeDoctor") + // binding.ivEmergency.hideShowView(BuildConfig.FLAVOR == "nurseLynx") + } + + private fun setAdapter() { + adapter = AppointmentAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + + + /*Services*/ + itemsService.clear() + val services = userRepository.getUser()?.services + if (services?.size ?: 0 > 1) { + val service = Service() + service.service_name = getString(R.string.all_requests) + service.service_id = "" + service.isSelected = true + itemsService.add(service) + + itemsService.addAll(services ?: emptyList()) + } + + serviceAdapter = AppointmentServiceAdapter(this, itemsService) + binding.rvServices.adapter = serviceAdapter + + binding.rvServices.hideShowView(itemsService.isNotEmpty()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvDate.setOnClickListener { + DateUtils.openDatePicker(requireActivity(), this, null, null) + } + + binding.ivRemoveDate.setOnClickListener { + if (selectedDate.isNotEmpty()) { + selectedDate = "" + binding.tvDate.text = selectedDate + hitApi(true) + } + } + + binding.ivEmergency.setOnClickListener { + if (isConnectedToInternet(requireContext(), true)) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.notify)) + .setMessage(getString(R.string.notifying_to_contacts)) + .setPositiveButton(getString(R.string.notify)) { dialog, which -> + viewModelContact.sendMessage() + }.setNegativeButton(getString(R.string.no)) { dialog, which -> + }.show() + } + } + + binding.swipeRefreshLayout.setOnRefreshListener { + hitApi(true) + } + + binding.ivNotification.setOnClickListener { + binding.tvUnreadCount.gone() + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, NOTIFICATION)) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLastPage && lastVisibleItemPosition >= totalItemCount) { + hitApi(false) + } + } + }) + + binding.tvRequestType.setOnClickListener { + binding.spnRequestType.performClick() + } + + binding.spnRequestType.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvRequestType.text = binding.spnRequestType.selectedItem.toString() + hitApi(true) + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true) && !isLoadingMoreItems) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + if (selectedDate.isNotEmpty()) { + val date = DateUtils.dateFormatForBackend(DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, selectedDate) + hashMap["date"] = date + } + + hashMap["service_type"] = CallType.ALL + + if (serviceId.isNotEmpty()) + hashMap["service_id"] = serviceId + + if (binding.spnRequestType.selectedItemPosition > 0) + hashMap["type"] = when (binding.spnRequestType.selectedItemPosition) { + 1 -> RequestStatus.NEW + 2 -> RequestStatus.COMPLETED + 3 -> RequestStatus.CANCELLED + else -> "" + } + + isLoadingMoreItems = true + viewModel.request(hashMap) + } else + binding.swipeRefreshLayout.isRefreshing = false + } + + + fun onServiceSelected(item: Service) { + serviceId = item.service_id ?: "" + + hitApi(true) + } + + private fun checkNotificationCount(count: Int?) { + if (BuildConfig.FLAVOR == "homeDoctor") { + notification_count = count + requireActivity().runOnUiThread { + binding.tvUnreadCount.hideShowView(notification_count != null && notification_count ?: 0 > 0) + binding.tvUnreadCount.text = getCountFormat(1, notification_count) + } + } + } + + private fun bindObservers() { + viewModel.pendingRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.swipeRefreshLayout.isRefreshing = false + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + + /*Check Notification count*/ + notification_count=it.data?.notification_count + checkNotificationCount(notification_count) + + isLoadingMoreItems = false + + val tempList = it.data?.requests ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + + /* if (it.data?.isAprroved == false) { + binding.clNoData.setBackgroundResource(R.color.colorWhite) + binding.clNoData.hideShowView(true) + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_profile_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.profile_unapproved) + binding.clNoData.tvNoDataDesc.text = getString(R.string.profile_unapproved_desc) + } else { + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_requests) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_requests_desc) + }*/ + + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.clLoader.gone() + binding.swipeRefreshLayout.isRefreshing = false + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!binding.swipeRefreshLayout.isRefreshing && isFirstPage) + binding.clLoader.visible() + } + } + }) + + viewModel.acceptRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.startRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + requireActivity().setResult(Activity.RESULT_OK) + hitApi(true) + + when (requestItem?.main_service_type) { + ConsultType.CHAT -> { + requireActivity().longToast(getString(R.string.starting_chat)) + + appSocket.init() + + startActivity(Intent(requireActivity(), ChatDetailActivity::class.java) + .putExtra(USER_ID, requestItem?.from_user?.id) + .putExtra(USER_NAME, requestItem?.from_user?.name) + .putExtra(EXTRA_REQUEST_ID, requestItem?.id) + .putExtra(EXTRA_IS_FIRST, true) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + } + ConsultType.AUDIO_CALL, ConsultType.VIDEO_CALL -> { + requireActivity().longToast(getString(R.string.starting_call)) + + startActivity(Intent(requireContext(), CallingActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(EXTRA_REQUEST_ID, requestItem)) + } + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.cancelRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + requireActivity().setResult(Activity.RESULT_OK) + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.callStatus.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + hitApi(true) + + if (requestItem?.status != CallAction.START_SERVICE) { + requestItem?.status = CallAction.START + registerActivityResult.launch(Intent(requireActivity(), AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, requestItem)) + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelContact.sendMessage.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + sentMessageHandle(it.data?.contact_added) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun sentMessageHandle(contactAdded: Boolean?) { + if (contactAdded == true) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.notified)) + .setMessage(getString(R.string.notified_contacts)) + .setPositiveButton(getString(R.string.ok)) { dialog, which -> + }.show() + } else if (contactAdded == false) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.alert)) + .setMessage(getString(R.string.no_contact)) + .setPositiveButton(getString(R.string.add_new)) { dialog, which -> + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.CONTACT_LIST)) + }.setNegativeButton(getString(R.string.no)) { dialog, which -> + }.show() + } + } + + + fun proceedRequest(request: Request) { + requestItem = request + when (request.status) { + CallAction.PENDING -> { + showAcceptRequestDialog() + } + CallAction.ACCEPT -> { + showInitiateRequestDialog() + } + CallAction.START, CallAction.REACHED -> { + registerActivityResult.launch(Intent(requireActivity(), AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, request)) + } + CallAction.START_SERVICE -> { + showMarkCompleteDialog() + } + } + } + + val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + hitApi(true) + } + } + + private fun showAcceptRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.accept_request, + R.string.accept_request_message, R.string.accept_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiAcceptRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun showMarkCompleteDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.mark_complete, + R.string.mark_complete_message, R.string.mark_complete, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiCompleteRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + + private fun showInitiateRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.start_request, + R.string.start_request_message, R.string.start_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiStartRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun hitApiAcceptRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + + viewModel.acceptRequest(hashMap) + } + } + + private fun hitApiCompleteRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = java.util.HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + hashMap["status"] = CallAction.COMPLETED + + viewModel.callStatus(hashMap) + } + } + + private fun hitApiStartRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + + when (requestItem?.main_service_type) { + ConsultType.HOME_VISIT -> { + val hashMap = HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + hashMap["status"] = CallAction.START + + viewModel.callStatus(hashMap) + } + else -> { + val hashMap = HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + + viewModel.startRequest(hashMap) + } + } + } + } + + fun cancelAppointment(item: Request) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), + R.string.cancel_appointment, + R.string.cancel_appointment_msg, + R.string.cancel_appointment, + R.string.cancel, + false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = item.id ?: "" + viewModel.cancelRequest(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + + companion object { + const val EXTRA_NUMBER = "extra number" + } + + override fun onResume() { + super.onResume() + registerReceiver() + + binding.ivNotification.hideShowView(userRepository.isUserLoggedIn() && BuildConfig.FLAVOR == "homeDoctor") + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(PushType.NEW_REQUEST) + intentFilter.addAction(PushType.CANCELED_REQUEST) + intentFilter.addAction(PushType.REQUEST_FAILED) + intentFilter.addAction(PushType.RESCHEDULED_REQUEST) + intentFilter.addAction(PushType.PROFILE_APPROVED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + + /*Notification count*/ + intentFilter.addAction(PushType.AMOUNT_RECEIVED) + intentFilter.addAction(PushType.PAYOUT_PROCESSED) + intentFilter.addAction(PushType.PAYOUT_FAILED) + intentFilter.addAction(PushType.BALANCE_ADDED) + intentFilter.addAction(PushType.BALANCE_FAILED) + intentFilter.addAction(PushType.PAID_EXTRA_PAYMENT) + intentFilter.addAction(PushType.FREE_EXPERT_ADVISE) + LocalBroadcastManager.getInstance(requireContext()).registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.NEW_REQUEST, PushType.CANCELED_REQUEST, + PushType.REQUEST_FAILED, PushType.RESCHEDULED_REQUEST, PushType.PROFILE_APPROVED, + NetworkIssueFragment.NETWORK_ISSUE -> { + hitApi(true) + } + PushType.AMOUNT_RECEIVED, PushType.PAYOUT_PROCESSED, PushType.PAYOUT_FAILED, PushType.BALANCE_ADDED, + PushType.BALANCE_FAILED, PushType.PAID_EXTRA_PAYMENT, PushType.FREE_EXPERT_ADVISE-> { + checkNotificationCount((notification_count ?: 0) + 1) + } + } + } + } + + override fun onDateSelected(date: String) { + binding.tvDate.text = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, + DateFormat.MON_DATE_YEAR, date) + + selectedDate = binding.tvDate.text.toString() + + /*Refresh pages*/ + hitApi(true) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentServiceAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentServiceAdapter.kt new file mode 100644 index 0000000..a1be113 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentServiceAdapter.kt @@ -0,0 +1,92 @@ +package com.consultantvendor.ui.dashboard.home + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Service +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemAppointmentServiceBinding +import com.consultantvendor.databinding.ItemPagingLoaderBinding + + +class AppointmentServiceAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_appointment_service, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: ItemAppointmentServiceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clService.setOnClickListener { + + } + } + + fun bind(item: Service) = with(binding) { + + cbName.text = item.service_name ?: "" + + cbName.isChecked = item.isSelected + if (item.isSelected) { + clService.setBackgroundResource(R.drawable.drawable_theme_60) + } else { + clService.setBackgroundResource(R.drawable.drawable_service_inactive) + } + + clService.setOnClickListener { + if (!item.isSelected) { + items.forEachIndexed { index, service -> + items[index].isSelected = index == adapterPosition + } + notifyDataSetChanged() + + if (fragment is AppointmentFragment) + fragment.onServiceSelected(item) + else if (fragment is HomeFragment) + fragment.onServiceSelected(item) + } + } + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentViewModel.kt new file mode 100644 index 0000000..f25ebd5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/AppointmentViewModel.kt @@ -0,0 +1,325 @@ +package com.consultantvendor.ui.dashboard.home + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.models.responses.Extra_payment +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class AppointmentViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val pendingRequest by lazy { SingleLiveEvent>() } + + val requestDetail by lazy { SingleLiveEvent>() } + + val callStatus by lazy { SingleLiveEvent>() } + + val acceptRequest by lazy { SingleLiveEvent>() } + + val startRequest by lazy { SingleLiveEvent>() } + + val startCall by lazy { SingleLiveEvent>() } + + val completeChat by lazy { SingleLiveEvent>() } + + val cancelRequest by lazy { SingleLiveEvent>() } + + val extraPayment by lazy { SingleLiveEvent>() } + + val updateCarePlan by lazy { SingleLiveEvent>() } + + fun request(hashMap: HashMap) { + pendingRequest.value = Resource.loading() + + webService.request(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + pendingRequest.value = Resource.success(response.body()?.data) + } else { + pendingRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + pendingRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun requestDetail(hashMap: HashMap) { + requestDetail.value = Resource.loading() + + webService.requestDetail(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + requestDetail.value = Resource.success(response.body()?.data) + } else { + requestDetail.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + requestDetail.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun callStatus(hashMap: HashMap) { + callStatus.value = Resource.loading() + + webService.callStatus(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + callStatus.value = Resource.success(response.body()?.data) + } else { + callStatus.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + callStatus.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun acceptRequest(hashMap: HashMap) { + acceptRequest.value = Resource.loading() + + webService.acceptRequest(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + acceptRequest.value = Resource.success(response.body()?.data) + } else { + acceptRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + acceptRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun acceptRequestV2(hashMap: HashMap) { + acceptRequest.value = Resource.loading() + + webService.acceptRequestV2(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + acceptRequest.value = Resource.success(response.body()?.data) + } else { + acceptRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + acceptRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun startRequest(hashMap: HashMap) { + startRequest.value = Resource.loading() + + webService.startRequest(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + startRequest.value = Resource.success(response.body()?.data) + } else { + startRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + startRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun startCall(hashMap: HashMap) { + startCall.value = Resource.loading() + + webService.startCall(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + startCall.value = Resource.success(response.body()?.data) + } else { + startCall.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + startCall.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun completeChat(hashMap: HashMap) { + completeChat.value = Resource.loading() + + webService.completeChat(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + completeChat.value = Resource.success(response.body()?.data) + } else { + completeChat.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + completeChat.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun cancelRequest(hashMap: HashMap) { + cancelRequest.value = Resource.loading() + + webService.cancelRequest(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + cancelRequest.value = Resource.success(response.body()?.data) + } else { + cancelRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + cancelRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun cancelRequestV2(hashMap: HashMap) { + cancelRequest.value = Resource.loading() + + webService.cancelRequestV2(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + cancelRequest.value = Resource.success(response.body()?.data) + } else { + cancelRequest.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + cancelRequest.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun extraPayment(extraPaymentModel: Extra_payment) { + extraPayment.value = Resource.loading() + + webService.extraPayment(extraPaymentModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + extraPayment.value = Resource.success(response.body()?.data) + } else { + extraPayment.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + extraPayment.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateCarePlan(hashMap: HashMap) { + updateCarePlan.value = Resource.loading() + + webService.updateCarePlans(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateCarePlan.value = Resource.success(response.body()?.data) + } else { + updateCarePlan.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateCarePlan.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeBannerFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeBannerFragment.kt new file mode 100644 index 0000000..149f627 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeBannerFragment.kt @@ -0,0 +1,108 @@ +package com.consultantvendor.ui.dashboard.home + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Banner +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentBannerBinding +import com.consultantvendor.databinding.FragmentHomeBannerBinding +import com.consultantvendor.utils.loadImage +import com.google.firebase.installations.BuildConfig +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class HomeBannerFragment(private val fragment: Fragment?, private val banner: Banner) : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentHomeBannerBinding + + private var rootView: View? = null + + + override fun onCreateView(inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home_banner, container, false) + rootView = binding.root + + initialise() + } + return rootView + } + + private fun initialise() { + if (fragment is HomeFragment) { + binding.clBanner.setBackgroundResource(0) + loadImage("tag",binding.ivImage, banner.image_mobile, R.drawable.drawable_alternate_button) + +// if(BuildConfig.FLAVOR != "taradoc") +// binding.ivImage.setOnClickListener { +// when (banner.banner_type) { +// BannerType.SERVICE_PROVIDER -> { +// startActivity(Intent(binding.root.context, DoctorDetailActivity::class.java) +// .putExtra(DOCTOR_ID, banner.sp_id)) +// } +// BannerType.CATEGORY -> { +// if (banner.category?.is_subcategory == true) { +// startActivity( +// Intent(requireContext(), DrawerActivity::class.java) +// .putExtra(PAGE_TO_OPEN, DrawerActivity.SUB_CATEGORY) +// .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, banner.category)) +// } else { +// startActivity( +// Intent(requireContext(), DoctorListActivity::class.java) +// .putExtra(SubCategoryFragment.CATEGORY_PARENT_ID, banner.category)) +// } +// } +// BannerType.CLASS_ -> { +// if (userRepository.getUser() == null) { +// val fragment = WelcomeFragment() +// fragment.show(requireActivity().supportFragmentManager, fragment.tag) +// } else { +// startActivity( +// Intent(requireContext(), DrawerActivity::class.java) +// .putExtra(PAGE_TO_OPEN, DrawerActivity.CLASSES_DETAILS) +// .putExtra(CLASS_ID, banner.class_id)) +// } +// } +// } +// } + } else { +// binding.clBanner.setBackgroundResource(R.drawable.drawable_theme_trans) +// binding.tvCode.visible() +// binding.tvText.visible() +// binding.tvUsers.visible() + +// val discount = if (banner.discount_type == "percentage") +// "${banner.discount_value}%" +// else +// banner.discount_value +// +// val service = when { +// banner.service != null -> banner.service?.name +// banner.category != null -> banner.category?.name +// else -> "" +// } +// +// binding.tvText.text = getHtmlText(getString(R.string.code_text, discount, +// service, banner.end_date)) +// binding.tvCode.text = getHtmlText(getString(R.string.use_code_s, banner.coupon_code)) +// binding.tvUsers.text = getHtmlText(getString(R.string.s_user_remaining, banner.limit.toString())) + } + } +} + +object BannerType { + const val SERVICE_PROVIDER = "service_provider" + const val CATEGORY = "category" + const val CLASS_ = "class" +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeFragment.kt new file mode 100644 index 0000000..78b5df7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeFragment.kt @@ -0,0 +1,724 @@ +package com.consultantvendor.ui.dashboard.home + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.view.GravityCompat +import androidx.databinding.DataBindingUtil +import androidx.drawerlayout.widget.DrawerLayout +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.appFeatures +import com.consultantvendor.data.models.responses.Banner +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.models.responses.Service +import com.consultantvendor.data.network.ApiKeys +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentHomeBinding +import com.consultantvendor.ui.adapter.CommonFragmentPagerAdapter +import com.consultantvendor.ui.calling.CallingActivity +import com.consultantvendor.ui.chat.chatdetail.ChatDetailActivity +import com.consultantvendor.ui.dashboard.feeds.FeedViewModel +import com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus.AppointmentStatusActivity +import com.consultantvendor.ui.dashboard.home.items.ArticleAdapter +import com.consultantvendor.ui.dashboard.home.items.HealthToolsAdapter +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.welcome.BannerFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import kotlinx.android.synthetic.main.nav_header_home.view.* +import java.util.* +import javax.inject.Inject + + +class HomeFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentHomeBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModelHome: HomeViewModel + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var viewModelLogin: LoginViewModel + + private lateinit var viewModelFeed: FeedViewModel + + private var items = ArrayList() + + private lateinit var adapter: AppointmentAdapter + + private var requestItem: Request? = null + + private var isReceiverRegistered = false + + private var itemsArticle = ArrayList() + + private var itemsBlogs = ArrayList() + + private lateinit var adapterArticle: ArticleAdapter + + private lateinit var adapterBlogs: ArticleAdapter + + private var itemsService = ArrayList() + + private lateinit var serviceAdapter: AppointmentServiceAdapter + + private var serviceId = "" + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + } + return rootView + } + + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModelHome = ViewModelProvider(this, viewModelFactory)[HomeViewModel::class.java] + viewModelLogin = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + viewModelFeed = ViewModelProvider(this, viewModelFactory)[FeedViewModel::class.java] + + //throw RuntimeException("Test Crash") // Force a crash + + /*Side Drawer*/ + if (appFeatures.needSideDrawer) { + binding.ivDrawer.visible() + binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED) + handleHeader() + } else { + binding.ivDrawer.gone() + binding.drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED) + } + } + + private fun handleHeader() { + val userData = userRepository.getUser() + val headerView = binding.navView.getHeaderView(0) +// set User Name + headerView.tvName.text = userData?.name + loadImage("profile",headerView.ivPic, userData?.profile_image, R.drawable.ic_profile_placeholder) + + headerView.ivPic.setOnClickListener { + binding.drawerLayout.closeDrawer(GravityCompat.START) + startActivity(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.PROFILE)) + } + } + + private fun setAdapter() { + adapter = AppointmentAdapter(this, items) + binding.rvListing.adapter = adapter + + binding.clLoader.setBackgroundResource(R.color.colorWhite) + hitApi() + + adapterArticle = ArticleAdapter(this, itemsArticle) + binding.rvArticle.adapter = adapterArticle + + adapterBlogs = ArticleAdapter(this, itemsBlogs) + binding.rvBlogs.adapter = adapterBlogs + + /*Services*/ + itemsService.clear() + val services = userRepository.getUser()?.services + if (services?.size ?: 0 > 1) { + val service = Service() + service.service_name = getString(R.string.all_requests) + service.service_id = "" + service.isSelected = true + itemsService.add(service) + + itemsService.addAll(services ?: emptyList()) + } + + serviceAdapter = AppointmentServiceAdapter(this, itemsService) + binding.rvServices.adapter = serviceAdapter + + binding.rvServices.hideShowView(itemsService.isNotEmpty()) + + /*Only if Health tools needed*/ + if (appFeatures.needHealthTools) { + binding.tvHealthTools.visible() + binding.rvHealthTools.visible() + + val itemsHealth = arrayListOf(getString(R.string.health_tool_1), getString(R.string.health_tool_2), + getString(R.string.health_tool_3), getString(R.string.health_tool_4)) + val adapterHealth = HealthToolsAdapter(this, itemsHealth) + binding.rvHealthTools.adapter = adapterHealth + } + } + + fun onServiceSelected(item: Service) { + serviceId = item.service_id ?: "" + binding.clLoader.visible() + + hitRequestApi() + } + + fun clickFavourite(item: Feed) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["favorite"] = if (item.is_favorite == true) "0" else "1" + viewModelFeed.addFavorite(item.id ?: "", hashMap) + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + /*Home*/ + viewModelHome.home() + + if (BuildConfig.FLAVOR=="taradoc"){ + viewModelHome.banners() + }else if (BuildConfig.FLAVOR=="nurseLynx"){ + viewModelHome.banners() + } + hitRequestApi() + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun hitRequestApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap[ApiKeys.PER_PAGE] = "5" + hashMap["service_type"] = CallType.ALL + + if (serviceId.isNotEmpty()) + hashMap["service_id"] = serviceId + viewModel.request(hashMap) + } + } + + private fun listeners() { + binding.ivDrawer.setOnClickListener { + binding.drawerLayout.openDrawer(GravityCompat.START) + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi() + } + + binding.tvMoreAppointment.setOnClickListener { + startActivityForResult(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT), AppRequestCode.APPOINTMENT_UPDATE) + } + + binding.tvMoreArticles.setOnClickListener { + startActivityForResult(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, BlogType.ARTICLE), AppRequestCode.ARTICLE_CHANGES) + } + + binding.tvMoreBlogs.setOnClickListener { + startActivityForResult(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, BlogType.BLOG), AppRequestCode.ARTICLE_CHANGES) + } + + binding.tvPostArticles.setOnClickListener { + startActivityForResult(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ADD_ARTICLE), AppRequestCode.ARTICLE_CHANGES) + } + + binding.tvPostBlogs.setOnClickListener { + startActivityForResult(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ADD_BLOG), AppRequestCode.ARTICLE_CHANGES) + } + + } + + private fun bindObservers() { + viewModel.pendingRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + + items.clear() + items.addAll(it.data?.requests ?: emptyList()) + + adapter.notifyDataSetChanged() + adapter.setAllItemsLoaded(true) + + binding.clNoData.hideShowView(items.isEmpty()) + binding.clLoader.setBackgroundResource(0) + + /* if (it.data?.isAprroved == false) { + if(it.data?.requests.isNullOrEmpty()){ + binding.clNoData.visible() + binding.clNoData.setBackgroundResource(R.color.colorWhite) + binding.clNoData.hideShowView(true) + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_profile_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.profile_unapproved) + binding.clNoData.tvNoDataDesc.text = getString(R.string.profile_unapproved_desc) + }else{ + binding.clNoData.gone() + } + + } else { + binding.clNoData.gone() + binding.clNoDataAppointment.hideShowView(items.isEmpty()) + binding.clNoDataAppointment.tvNoData.text = getString(R.string.no_requests) + binding.clNoDataAppointment.tvNoDataDesc.text = getString(R.string.no_requests_desc) + + binding.tvMoreAppointment.hideShowView(items.size >= 5) + }*/ + } + Status.ERROR -> { + adapter.setAllItemsLoaded(true) + + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModelHome.home.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (appFeatures.needArticles) { + binding.tvArticles.visible() + binding.tvMoreArticles.visible() + binding.tvPostArticles.visible() + itemsArticle.clear() + itemsArticle.addAll(it.data?.top_articles ?: emptyList()) + adapterArticle.notifyDataSetChanged() + + binding.tvMoreArticles.hideShowView(itemsArticle.size >= 4) + + binding.clNoArticle.tvNoData.text = getString(R.string.no_article) + binding.clNoArticle.tvNoDataDesc.text = getString(R.string.no_article_desc) + binding.clNoArticle.hideShowView(itemsArticle.isEmpty()) + } + + if (appFeatures.needBlogs) { + binding.tvBlogs.visible() + binding.tvMoreBlogs.visible() + binding.tvPostBlogs.visible() + + itemsBlogs.clear() + itemsBlogs.addAll(it.data?.top_blogs ?: emptyList()) + adapterBlogs.notifyDataSetChanged() + + binding.tvMoreBlogs.hideShowView(itemsBlogs.size >= 4) + + binding.clNoBlog.tvNoData.text = getString(R.string.no_blog) + binding.clNoBlog.tvNoDataDesc.text = getString(R.string.no_blog_desc) + binding.clNoBlog.hideShowView(itemsBlogs.isEmpty()) + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModel.acceptRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.startRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + hitApi() + + when (requestItem?.main_service_type) { + ConsultType.CHAT -> { + requireActivity().longToast(getString(R.string.starting_chat)) + + startActivity(Intent(requireActivity(), ChatDetailActivity::class.java) + .putExtra(USER_ID, requestItem?.from_user?.id) + .putExtra(USER_NAME, requestItem?.from_user?.name) + .putExtra(EXTRA_REQUEST_ID, requestItem?.id) + .putExtra(EXTRA_IS_FIRST, true) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + } + ConsultType.AUDIO_CALL, ConsultType.VIDEO_CALL -> { + requireActivity().longToast(getString(R.string.starting_call)) + + startActivity(Intent(requireContext(), CallingActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(EXTRA_REQUEST_ID, requestItem)) + } + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.cancelRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.callStatus.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + hitApi() + + if (requestItem?.status != CallAction.START_SERVICE) { + requestItem?.status = CallAction.START + startActivityForResult(Intent(requireActivity(), AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, requestItem), AppRequestCode.APPOINTMENT_DETAILS) + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelLogin.logout.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + logoutUser(requireActivity(), prefsManager) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelFeed.addFavorite.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + if (isConnectedToInternet(requireContext(), true)) { + progressDialog.setLoading(true) + viewModelHome.home() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + + viewModelHome.banners.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + val itemsBanner = ArrayList() + itemsBanner.addAll(it.data?.banners ?: emptyList()) + + val adapter = CommonFragmentPagerAdapter(childFragmentManager) + itemsBanner.forEach { + adapter.addTab("", HomeBannerFragment(this, it)) + } + binding.viewPagerBanner.adapter = adapter + binding.pageIndicatorView.setViewPager(binding.viewPagerBanner) + + binding.viewPagerBanner.hideShowView(itemsBanner.isNotEmpty()) + binding.pageIndicatorView.hideShowView(itemsBanner.size > 1) + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + } + + fun proceedRequest(request: Request) { + requestItem = request + when (request.status) { + CallAction.PENDING -> { + showAcceptRequestDialog() + } + CallAction.ACCEPT -> { + showInitiateRequestDialog() + } + CallAction.START, CallAction.REACHED -> { + startActivityForResult(Intent(requireActivity(), AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, request), AppRequestCode.APPOINTMENT_DETAILS) + } + CallAction.START_SERVICE -> { + showMarkCompleteDialog() + } + } + } + + private fun showAcceptRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.accept_request, + R.string.accept_request_message, R.string.accept_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiAcceptRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + + private fun showMarkCompleteDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.mark_complete, + R.string.mark_complete_message, R.string.mark_complete, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiCompleteRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + + private fun showInitiateRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.start_request, + R.string.start_request_message, R.string.start_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiStartRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun hitApiAcceptRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + viewModel.acceptRequest(hashMap) + } + } + + private fun hitApiCompleteRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + hashMap["status"] = CallAction.COMPLETED + + viewModel.callStatus(hashMap) + } + } + + private fun hitApiStartRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + when (requestItem?.main_service_type) { + ConsultType.HOME_VISIT -> { + val hashMap = HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + hashMap["status"] = CallAction.START + + viewModel.callStatus(hashMap) + } + else -> { + val hashMap = HashMap() + hashMap["request_id"] = requestItem?.id ?: "" + + viewModel.startRequest(hashMap) + } + } + + } + } + + fun cancelAppointment(item: Request) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), + R.string.cancel_appointment, + R.string.cancel_appointment_msg, + R.string.cancel_appointment, + R.string.cancel, + false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = item.id ?: "" + viewModel.cancelRequest(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(PushType.NEW_REQUEST) + intentFilter.addAction(PushType.CANCELED_REQUEST) + intentFilter.addAction(PushType.REQUEST_FAILED) + intentFilter.addAction(PushType.RESCHEDULED_REQUEST) + intentFilter.addAction(PushType.PROFILE_APPROVED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(requireContext()).registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.NEW_REQUEST, PushType.CANCELED_REQUEST, + PushType.REQUEST_FAILED, PushType.RESCHEDULED_REQUEST, PushType.PROFILE_APPROVED, + NetworkIssueFragment.NETWORK_ISSUE -> { + hitApi() + } + } + } + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.APPOINTMENT_UPDATE -> { + hitApi() + } + AppRequestCode.ARTICLE_CHANGES -> { + progressDialog.setLoading(true) + viewModelHome.home() + } + AppRequestCode.ADD_PRESCRIPTION -> { + hitApi() + } + AppRequestCode.APPOINTMENT_DETAILS -> { + hitRequestApi() + } + } + } + } +} + + + + diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeViewModel.kt new file mode 100644 index 0000000..884ac31 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/HomeViewModel.kt @@ -0,0 +1,68 @@ +package com.consultantvendor.ui.dashboard.home + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class HomeViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val home by lazy { SingleLiveEvent>() } + val banners by lazy { SingleLiveEvent>() } + + + fun banners() { + banners.value = Resource.loading() + + webService.banners().enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + banners.value = Resource.success(response.body()?.data) + } else { + banners.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + banners.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun home() { + home.value = Resource.loading() + + webService.home() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + home.value = Resource.success(response.body()?.data) + } else { + home.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + home.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/AppointmentStatusActivity.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/AppointmentStatusActivity.kt new file mode 100644 index 0000000..dff5d07 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/AppointmentStatusActivity.kt @@ -0,0 +1,644 @@ +package com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus + +import android.Manifest +import android.animation.ValueAnimator +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.location.Geocoder +import android.location.Location +import android.location.LocationManager +import android.net.Uri +import android.os.Bundle +import android.os.Looper +import android.provider.Settings +import android.util.Log +import android.view.WindowManager +import android.view.animation.LinearInterpolator +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.models.responses.directions.Overview_polyline +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityAppointmentStatusBinding +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.PermissionUtils +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.google.android.gms.location.* +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.* +import dagger.android.support.DaggerAppCompatActivity +import io.socket.client.Ack +import org.json.JSONObject +import permissions.dispatcher.* +import java.util.* +import javax.inject.Inject +import kotlin.concurrent.schedule +import kotlin.math.sign + + +@RuntimePermissions +class AppointmentStatusActivity : DaggerAppCompatActivity(), OnMapReadyCallback { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: ActivityAppointmentStatusBinding + + private lateinit var viewModelDirection: DirectionViewModel + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: AppointmentViewModel + + private var mapFragment: SupportMapFragment? = null + + private var mMap: GoogleMap? = null + + private lateinit var placeLatLng: LatLng + + private lateinit var finalLatLng: LatLng + + lateinit var mFusedLocationClient: FusedLocationProviderClient + + private lateinit var geoCoder: Geocoder + + private var request: Request? = null + + private var polyline: Polyline? = null + + private var markerToMove: Marker? = null + + private var markerToReach: Marker? = null + + private var timer: Timer? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_appointment_status) + + initialise() + setListeners() + bindObservers() + } + + private fun initialise() { + mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment + mapFragment?.getMapAsync(this) + viewModelDirection = ViewModelProvider(this, viewModelFactory)[DirectionViewModel::class.java] + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + progressDialog = ProgressDialog(this) + + /*Ask for location*/ + geoCoder = Geocoder(this, Locale.getDefault()) + mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + + // These flags ensure that the activity can be launched when the screen is locked. + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON) + + request = intent.getSerializableExtra(EXTRA_REQUEST_ID) as Request + } + + private fun setRequestData() { + finalLatLng = LatLng(request?.extra_detail?.lat?.toDouble() + ?: 0.0, request?.extra_detail?.long?.toDouble() ?: 0.0) + + if (markerToReach == null) { + markerToReach = mMap?.addMarker(MarkerOptions() + .position(finalLatLng) + .icon(bitmapDescriptorFromVector(this, R.drawable.ic_drop_location_mrkr)) + .anchor(0.5f, 0.5f) + .flat(true)) + } + + if (::placeLatLng.isInitialized) { + mMap?.moveCamera(CameraUpdateFactory.newLatLng(placeLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + } + + + binding.tvName.text = request?.from_user?.name + loadImage("profile",binding.ivPic, request?.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + binding.ivCall.hideShowView(!request?.from_user?.phone.isNullOrEmpty()) + when (request?.status) { + CallAction.START -> { + binding.tvReached.visible() + binding.groupOne.gone() + + if (markerToMove == null && ::placeLatLng.isInitialized) { + markerToMove = mMap?.addMarker(MarkerOptions() + .position(placeLatLng) + .icon(bitmapDescriptorFromVector(this, R.drawable.ic_location_arrow)) + .anchor(0.5f, 0.5f) + .flat(true)) + } + } + CallAction.REACHED -> { + binding.tvReached.gone() + binding.groupOne.visible() + binding.tvTime.gone() + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(finalLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + } + } + } + + + private fun setListeners() { + binding.toolbar.setNavigationOnClickListener { + onBackPressed() + } + + binding.tvReached.setOnClickListener { + hitApiRequestStatus(CallAction.REACHED) + } + + binding.tvStartService.setOnClickListener { + hitApiRequestStatus(CallAction.START_SERVICE) + } + + binding.tvCancelService.setOnClickListener { + hitApiRequestStatus(CallAction.CANCEL_SERVICE) + } + + binding.ivCall.setOnClickListener { + getCallWithPermissionCheck() + } + } + + private fun hitApiRequestStatus(status: String) { + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["request_id"] = request?.id ?: "" + hashMap["status"] = status + + viewModel.callStatus(hashMap) + + } + } + + + @SuppressLint("MissingPermission") + private fun getLastLocation() { + if (request?.status == CallAction.START) { + if (checkPermissions()) { + if (isLocationEnabled()) { + mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task -> + val mLastLocation: Location? = task.result + if (mLastLocation != null) { + placeLatLng = LatLng(mLastLocation.latitude, mLastLocation.longitude) + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(placeLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + drawPolyLineApi() + } else + requestNewLocationData() + } + } else if (this.packageName.equals(BuildConfig.APPLICATION_ID)) { + longToast("Turn on location") + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(intent) + } + } else { + getLocationWithPermissionCheck() + } + } else if (request?.status == CallAction.REACHED) { + runOnUiThread { + polyline?.remove() + markerToMove?.remove() + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(finalLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + } + } + } + + private fun checkPermissions(): Boolean { + if (ActivityCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + return true + } + return false + } + + + @SuppressLint("MissingPermission") + private fun requestNewLocationData() { + runOnUiThread { + val mLocationRequest = LocationRequest.create().apply { + interval = 0 + fastestInterval = 0 + priority = LocationRequest.PRIORITY_HIGH_ACCURACY + numUpdates = 1 + } + + //mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, + Looper.myLooper()) + + } + } + + private val mLocationCallback = object : LocationCallback() { + override fun onLocationResult(locationResult: LocationResult) { + val mLastLocation: Location = locationResult.lastLocation + placeLatLng = LatLng(mLastLocation.latitude, mLastLocation.longitude) + + //placeLatLng = LatLng(30.7457, 76.7332) + drawPolyLineApi() + + Log.e("Location", "Test") + } + } + + + private fun isLocationEnabled(): Boolean { + val locationManager: LocationManager = + getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || + locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER) + } + + private fun drawPolyLineApi() { + runOnUiThread { + if (isConnectedToInternet(this, true)) { + if (request?.status == CallAction.START && markerToMove == null) { + markerToMove = mMap?.addMarker(MarkerOptions() + .position(placeLatLng) + .icon(bitmapDescriptorFromVector(this, R.drawable.ic_location_arrow)) + .anchor(0.5f, 0.5f) + .flat(true)) + + } else + animateMarker() + + liveLocationUpdate() + + val hashMap = HashMap() + hashMap["origin"] = "${placeLatLng.latitude},${placeLatLng.longitude}" + hashMap["destination"] = "${finalLatLng.latitude},${finalLatLng.longitude}" + hashMap["key"] = getString(R.string.google_places_api_key) + viewModelDirection.directions(hashMap) + + Log.e("Location", "Api") + } + } + } + + private fun liveLocationUpdate() { + val obj = JSONObject() + obj.put("request_id", request?.id) + obj.put("senderId", request?.to_user?.id) + obj.put("receiverId", request?.from_user?.id) + obj.put("lat", placeLatLng.latitude) + obj.put("long", placeLatLng.longitude) + + appSocket.emit(AppSocket.Events.SEND_LIVE_LOCATION, obj, Ack { + + }) + } + + private fun delayTimeDirectionApi() { + if (request?.status == CallAction.START) { + if (timer == null) + timer = Timer() + + timer?.schedule(30000) { + + /* placeLatLng = LatLng(30.7512, 76.7584) + drawPolyLineApi()*/ + + requestNewLocationData() + } + } + } + + + override fun onMapReady(googleMap: GoogleMap) { + mMap = googleMap + mMap?.isTrafficEnabled = false + + /* if (BuildConfig.FLAVOR == "homeDoctor") { + *//*Default to Saudi Arabia*//* + val current = LatLng(23.8859, 45.0792) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(current)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(6f)) + }*/ + + // mMap?.isMyLocationEnabled = true + mMap?.uiSettings?.isMyLocationButtonEnabled = true + + setRequestData() + } + + private fun moveMarker() { + markerToMove?.position = placeLatLng + } + + private fun animateMarker() { + if (markerToMove != null) { + val locationStart = Location(LocationManager.GPS_PROVIDER) + locationStart.latitude = placeLatLng.latitude + locationStart.longitude = placeLatLng.longitude + + val startPosition = markerToMove?.position ?: LatLng(0.0, 0.0) + val endPosition = placeLatLng + val startRotation = markerToMove?.rotation ?: 0f + val latLngInterpolator: LatLngInterpolator = LatLngInterpolator.LinearFixed() + val valueAnimator = ValueAnimator.ofFloat(0f, 1f) + valueAnimator.duration = 1000 // duration 1 second + valueAnimator.interpolator = LinearInterpolator() + valueAnimator.addUpdateListener { animation -> + try { + val v = animation.animatedFraction + val newPosition = latLngInterpolator.interpolate(v, startPosition, endPosition) + ?: LatLng(0.0, 0.0) + markerToMove?.position = newPosition + markerToMove?.rotation = computeRotation(v, startRotation, locationStart.bearing) + } catch (ex: Exception) { + // I don't care atm.. + } + } + valueAnimator.start() + } + } + + private interface LatLngInterpolator { + fun interpolate(fraction: Float, a: LatLng, b: LatLng): LatLng? + class LinearFixed : LatLngInterpolator { + override fun interpolate(fraction: Float, a: LatLng, b: LatLng): LatLng { + val lat = (b.latitude - a.latitude) * fraction + a.latitude + var lngDelta = b.longitude - a.longitude + // Take the shortest path across the 180th meridian. + if (Math.abs(lngDelta) > 180) { + lngDelta -= sign(lngDelta) * 360 + } + val lng = lngDelta * fraction + a.longitude + return LatLng(lat, lng) + } + } + } + + private fun computeRotation(fraction: Float, start: Float, end: Float): Float { + val normalizeEnd = end - start // rotate start to 0 + val normalizedEndAbs = (normalizeEnd + 360) % 360 + val direction = if (normalizedEndAbs > 180) (-1).toFloat() else 1.toFloat() // -1 = anticlockwise, 1 = clockwise + val rotation: Float = if (direction > 0) { + normalizedEndAbs + } else { + normalizedEndAbs - 360 + } + val result = fraction * rotation + start + return (result + 360) % 360 + } + + + private fun bindObservers() { + viewModelDirection.directions.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + + if (request?.status == CallAction.START) { + try { + if (!it.data?.routes?.get(0)?.legs?.get(0)?.duration?.text.isNullOrEmpty()) { + binding.tvTime.visible() + binding.tvTime.text = getString(R.string.estimate_time_of_arrival_s, + it.data?.routes?.get(0)?.legs?.get(0)?.duration?.text) + } + drawDirectionToStop(it.data?.routes?.get(0)?.overview_polyline) + } catch (e: Exception) { + binding.tvTime.visible() + binding.tvTime.text = getString(R.string.estimate_time_of_arrival_s, + getString(R.string.na)) + } + } + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + + } + } + }) + + viewModel.callStatus.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + setResult(Activity.RESULT_OK) + + val intent = Intent() + intent.action = PushType.NEW_REQUEST + + LocalBroadcastManager.getInstance(this).sendBroadcast(intent) + + binding.ivCall.hideShowView(!request?.from_user?.phone.isNullOrEmpty()) + when (it.data?.status) { + + CallAction.REACHED -> { + request?.status = CallAction.REACHED + + polyline?.remove() + markerToMove?.remove() + mMap?.moveCamera(CameraUpdateFactory.newLatLng(finalLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + binding.tvReached.gone() + binding.tvTime.gone() + binding.groupOne.visible() + } + CallAction.START_SERVICE -> { + /* startActivity(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.UPDATE_SERVICE) + .putExtra(EXTRA_REQUEST_ID, request?.id))*/ + finish() + } + CallAction.CANCEL_SERVICE -> { + finish() + } + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onBackPressed() { + if (request?.status == CallAction.START) { + AlertDialogUtil.instance.createOkCancelDialog(this, R.string.quit, + R.string.quit_message, R.string.yes, R.string.no, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + finish() + } + + override fun onCancelButtonClicked() { + } + }).show() + } else + super.onBackPressed() + } + + private fun drawDirectionToStop(overviewPolyline: Overview_polyline?) { + if (overviewPolyline != null) { + val polyz = decodeOverviewPolyLinePonts(overviewPolyline.points) + if (polyz != null) { + val lineOptions = PolylineOptions() + lineOptions.addAll(polyz) + lineOptions.width(20f) + lineOptions.color(ContextCompat.getColor(this, R.color.colorBlack)) + + polyline?.remove() + + polyline = mMap?.addPolyline(lineOptions) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(placeLatLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + delayTimeDirectionApi() + } + } + } + + + //This function is to parse the value of "points" + private fun decodeOverviewPolyLinePonts(encoded: String?): List? { + val poly = ArrayList() + if (encoded != null && encoded.isNotEmpty() && encoded.trim { it <= ' ' }.isNotEmpty()) { + var index = 0 + val len = encoded.length + var lat = 0 + var lng = 0 + while (index < len) { + var b: Int + var shift = 0 + var result = 0 + do { + b = encoded[index++].toInt() - 63 + result = result or (b and 0x1f shl shift) + shift += 5 + } while (b >= 0x20) + val dlat = if (result and 1 != 0) (result shr 1).inv() else result shr 1 + lat += dlat + shift = 0 + result = 0 + do { + b = encoded[index++].toInt() - 63 + result = result or (b and 0x1f shl shift) + shift += 5 + } while (b >= 0x20) + val dlng = if (result and 1 != 0) (result shr 1).inv() else result shr 1 + lng += dlng + val p = LatLng(lat.toDouble() / 1E5, + lng.toDouble() / 1E5) + poly.add(p) + } + } + return poly + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun getLocation() { + getLastLocation() + } + + @OnShowRationale(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.we_will_need_your_location, request) + } + + @OnNeverAskAgain(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + this, + R.string.we_will_need_your_location) + } + + @OnPermissionDenied(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + this, R.string.we_will_need_your_location) + } + + @NeedsPermission(Manifest.permission.CALL_PHONE) + fun getCall() { + val user = request?.from_user + val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "${user?.country_code}${user?.phone}")) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(intent) + } + + @OnShowRationale(Manifest.permission.CALL_PHONE) + fun showCallRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.we_will_need_call, request) + } + + @OnNeverAskAgain(Manifest.permission.CALL_PHONE) + fun onNeverAskAgainCallRationale() { + PermissionUtils.showAppSettingsDialog( + this, + R.string.we_will_need_call) + } + + @OnPermissionDenied(Manifest.permission.CALL_PHONE) + fun showDeniedForCall() { + PermissionUtils.showAppSettingsDialog( + this, R.string.we_will_need_call) + } + + @SuppressLint("NoDelegateOnResumeDetector") + override fun onResume() { + super.onResume() + getLocationWithPermissionCheck() + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/DialogStatusFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/DialogStatusFragment.kt new file mode 100644 index 0000000..440e495 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/DialogStatusFragment.kt @@ -0,0 +1,79 @@ +package com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus + +/*import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.databinding.DialogStatusBinding +import com.consultantvendor.ui.chat.UploadFileViewModel +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.dialogs.ProgressDialogImage +import com.consultantvendor.utils.longToast +import com.consultantvendor.utils.showSnackBar +import dagger.android.support.DaggerDialogFragment +import javax.inject.Inject + + +class DialogStatusFragment(private val fragment: StatusUpdateFragment) : DaggerDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: DialogStatusBinding + + + private lateinit var viewModelUpload: UploadFileViewModel + + private lateinit var progressDialogImage: ProgressDialogImage + + + override fun setupDialog(dialog: Dialog, style: Int) { + super.setupDialog(dialog, style) + + dialog.setCanceledOnTouchOutside(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.dialog_status, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + progressDialogImage = ProgressDialogImage(requireActivity()) + } + + private fun listeners() { + binding.tvUpdate.setOnClickListener { + if (!binding.tvCompleted.isChecked) { + binding.tvCompleted.showSnackBar(getString(R.string.update_status)) + } else { + fragment.hitApiStartRequest() + dialog?.dismiss() + } + } + + binding.tvClear.setOnClickListener { + dialog?.dismiss() + } + } +}*/ diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/DirectionViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/DirectionViewModel.kt new file mode 100644 index 0000000..c6f4d9f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/DirectionViewModel.kt @@ -0,0 +1,41 @@ +package com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.directions.Direction +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class DirectionViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val directions by lazy { SingleLiveEvent>() } + + fun directions(hashMap: HashMap) { + directions.value = Resource.loading() + + webService.directions(hashMap) + .enqueue(object : Callback { + + override fun onResponse(call: Call, + response: Response) { + if (response.isSuccessful) { + directions.value = Resource.success(response.body()) + } else { + directions.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call, throwable: Throwable) { + directions.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/StatusUpdateFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/StatusUpdateFragment.kt new file mode 100644 index 0000000..5e3c056 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/appointmentStatus/StatusUpdateFragment.kt @@ -0,0 +1,160 @@ +package com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus + +/*import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentStatusUpdateBinding +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap +import kotlin.concurrent.schedule + + +class StatusUpdateFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentStatusUpdateBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var request: Request + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_status_update, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + hitApi() + } + return rootView + } + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.etStatus.setOnClickListener { + val fragment = DialogStatusFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + viewModel.requestDetail(hashMap) + } + } + + private fun setData() { + if (request.status == CallAction.COMPLETED) { + binding.tvComplete.isChecked = true + binding.viewComplete.alpha = 1f + binding.tvStatusUpdate.gone() + binding.etStatus.gone() + } + + } + + fun hitApiStartRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["status"] = CallAction.COMPLETED + + viewModel.callStatus(hashMap) + + } + } + + private fun bindObservers() { + viewModel.requestDetail.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + request = it.data?.request_detail ?: Request() + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + + viewModel.callStatus.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + + binding.clCompleted.visible() + + + Timer().schedule(3000) { + requireActivity().runOnUiThread { + binding.clCompleted.gone() + } + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + } + +}*/ diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/AppointmentDetailsFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/AppointmentDetailsFragment.kt new file mode 100644 index 0000000..b47c5d2 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/AppointmentDetailsFragment.kt @@ -0,0 +1,1006 @@ +package com.consultantvendor.ui.dashboard.home.appointment.detail + +import android.app.Activity +import android.app.AlertDialog +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Color +import android.os.Bundle +import android.os.CountDownTimer +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.EditText +import android.widget.TextView +import android.widget.Toast +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.widget.PopupMenu +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.GridLayoutManager +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DocImage +import com.consultantvendor.data.models.responses.Extra_payment +import com.consultantvendor.data.models.responses.Filter +import com.consultantvendor.data.models.responses.Page +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentAppointmentDetailsBinding +import com.consultantvendor.ui.adapter.CheckItemAdapter +import com.consultantvendor.ui.adapter.ImagesDocumentAdapter +import com.consultantvendor.ui.calling.CallingActivity +import com.consultantvendor.ui.chat.chatdetail.ChatDetailActivity +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.ui.dashboard.home.appointment.appointmentStatus.AppointmentStatusActivity +import com.consultantvendor.ui.dashboard.home.appointment.medicalhistory.MedicalHistoryFragment +import com.consultantvendor.ui.dashboard.home.prescription.BottomPrescriptionFragment +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.text.SimpleDateFormat +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap +import kotlin.collections.set + + +class AppointmentDetailsFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var appSocket: AppSocket + + private lateinit var binding: FragmentAppointmentDetailsBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var request: Request + + private var isReceiverRegistered = false + + private var alertDialog: AlertDialog? = null + private var statusRequest : Boolean = false + private var statusMarkComplete : Boolean = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_appointment_details, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + hitApi() + } + return rootView + } + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.tvMedicalHistory.hideShowView(BuildConfig.FLAVOR == "homeDoctor") + + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvAccept.setOnClickListener { + proceedRequest() + } + + binding.tvMedicalHistory.setOnClickListener { + val fragment = MedicalHistoryFragment() + val bundle = Bundle() + bundle.putSerializable(EXTRA_REQUEST_ID, request) + fragment.arguments = bundle + replaceResultFragment(this, fragment, R.id.container, AppRequestCode.ADD_CLASS) + } + + binding.tvCall.setOnClickListener { + + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["type"] = ConsultType.VIDEO_CALL + + viewModel.startCall(hashMap) + } + /* if(status){ + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["type"] = ConsultType.VIDEO_CALL + + viewModel.startCall(hashMap) + } + }else{ + Toast.makeText(requireContext(),"The call cannot begin before 10 minutes",Toast.LENGTH_LONG).show() + }*/ + + } + + binding.tvAddPrescription.setOnClickListener { + proceedRequest() + } + + binding.tvCancel.setOnClickListener { + cancelAppointment() + } + + binding.tvMarkComplete.setOnClickListener { + if(statusMarkComplete){ + showMarkCompleteDialog() + } else { + + Toast.makeText( + requireContext(), + "The shift cannot complete until 10 minutes prior to the shift", + Toast.LENGTH_LONG + ).show() + } + } + + binding.tvViewMap.setOnClickListener { + val address = request.extra_detail + mapIntent(requireActivity(), address?.service_address ?: "", + address?.lat?.toDouble() ?: 0.0, + address?.long?.toDouble() ?: 0.0) + } + + binding.tvAskPayment.setOnClickListener { + val fragment = BottomExtraChargesFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + } + + fun extraPayment(amount: String, description: String) { + if (isConnectedToInternet(requireContext(), true)) { + val extraPayment = Extra_payment() + extraPayment.request_id = request.id ?: "" + extraPayment.balance = amount + extraPayment.description = description + viewModel.extraPayment(extraPayment) + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = requireActivity().intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + viewModel.requestDetail(hashMap) + } + } + + private fun setData() { + binding.tvAccept.visible() + binding.tvCancel.hideShowView(request.canCancel) + binding.tvAddPrescription.gone() + binding.tvMarkComplete.gone() + binding.tvAskPayment.gone() + + binding.tvCall.hideShowView(BuildConfig.FLAVOR == "nurseLynx") + + binding.tvName.text = request.from_user?.name + loadImage("profile",binding.ivPic, request.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + binding.tvAge.text = "${getString(R.string.age)} ${getAge(request.from_user?.profile?.dob)} ${getString(R.string.years)}" + binding.tvCountry.text = "${getString(R.string.country)}: ${request.from_user?.profile?.country}" + binding.tvAge.hideShowView(!request.from_user?.profile?.dob.isNullOrEmpty()) + binding.tvCountry.hideShowView(!request.from_user?.profile?.country.isNullOrEmpty()) + + + binding.tvServiceTypeV.text = request.service_type + binding.tvDistanceV.text = request.extra_detail?.distance ?: "" + binding.tvLocation.text = request.extra_detail?.service_address + + if (BuildConfig.FLAVOR == "nurseLynx" && !request.booking_end_date.isNullOrEmpty()) { + val dateBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.booking_end_date)}" + binding.tvBookingDateV.text = dateBooking + + val timeBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.booking_end_date)}" + binding.tvBookingTimeV.text = timeBooking + } else { + binding.tvBookingDateV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC) + binding.tvBookingTimeV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC) + } + + binding.tvBookingPriceV.text = getCurrency(request.price) + + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) + + if (request.is_prescription == true) + binding.tvAddPrescription.text = getString(R.string.prescriptions) + else + binding.tvAddPrescription.text = getString(R.string.add_prescription) + + when (request.main_service_type) { + ConsultType.HOME_VISIT -> { + if (request.extra_detail?.service_address != null) { + binding.tvLocation.visible() + binding.tvViewMap.visible() + binding.tvLocation.text = request.extra_detail?.service_address + } + } + } + + /*Cancel reason*/ + binding.tvCancelReason.hideShowView(!request.cancel_reason.isNullOrEmpty()) + binding.tvCancelReason.text = getString(R.string.reason_of_cancel, request.cancel_reason + ?: "") + + when (request.status) { + CallAction.PENDING -> { + binding.tvStatus.text = getString(R.string.new_request) + binding.tvAccept.text = getString(R.string.accept_request) + } + CallAction.ACCEPT -> { + binding.tvStatus.text = getString(R.string.accepted) + binding.tvAccept.text = getString(R.string.start_request) + binding.tvAccept.setBackgroundDrawable(requireContext().resources.getDrawable(R.drawable.drawable_alternate_button_grey)) + binding.tvAccept.setTextColor(Color.BLACK) + binding.tvAccept.isClickable = true + statusRequest = false + + binding.tvCall.setBackgroundDrawable(requireContext().resources.getDrawable(R.drawable.drawable_alternate_button_grey)) + binding.tvCall.setTextColor(Color.BLACK) + + binding.tvCancel.gone() + + try { + val targetTimeInMillis = dateStringToMillis(request.booking_date.toString()) + val currentTimeInMillis = System.currentTimeMillis() + + val timeDifferenceInMillis = targetTimeInMillis - currentTimeInMillis + val timeDifferenceInMinutes = timeDifferenceInMillis / (1000 * 60) + + if (timeDifferenceInMinutes > 10) { + val timer = object : CountDownTimer(timeDifferenceInMillis - (10 * 60 * 1000), 1000) { + override fun onTick(millisUntilFinished: Long) { + // Do something when 10 minutes are left + binding.tvAccept.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button_grey)) + binding.tvAccept.setTextColor(Color.BLACK) + binding.tvCall.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvCall.setTextColor(Color.WHITE) + statusRequest = false + } + + override fun onFinish() { + // Enable the button when the target time is reached + binding.tvAccept.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvAccept.setTextColor(Color.WHITE) + binding.tvCall.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvCall.setTextColor(Color.WHITE) + binding.tvAccept.isClickable = true + statusRequest = true + } + } + timer.start() + } else { + // If the target time is less than 10 minutes from now, disable the button + binding.tvAccept.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvAccept.setTextColor(Color.WHITE) + + binding.tvCall.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvCall.setTextColor(Color.WHITE) + binding.tvAccept.isClickable = true + statusRequest = true + binding.tvCall.gone() + } + + }catch (ex: Exception){ + Log.e("exception",""+ex) + } + + + when (request.main_service_type) { + ConsultType.AUDIO_CALL, ConsultType.VIDEO_CALL -> { + binding.tvMarkComplete.visible() + binding.tvCall.gone() + } + } + extraPayment() + } + CallAction.INPROGRESS -> { + binding.tvStatus.text = getString(R.string.inprogess) + binding.tvCancel.gone() + binding.tvAccept.gone() + + binding.tvMarkComplete.visible() + + try { + val targetTimeInMilliss = dateStringToMillis(request.end_date.toString()) + val currentTimeInMilliss = System.currentTimeMillis() + + val timeDifferenceInMilliss = targetTimeInMilliss - currentTimeInMilliss + val timeDifferenceInMinutess = timeDifferenceInMilliss / (1000 * 60) + + if (timeDifferenceInMinutess > 10) { + val timer = object : CountDownTimer(timeDifferenceInMilliss - (10 * 60 * 1000), 1000) { + override fun onTick(millisUntilFinished: Long) { + // Do something when 10 minutes are left + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button_grey)) + binding.tvMarkComplete.setTextColor(Color.BLACK) + statusMarkComplete = false + } + + override fun onFinish() { + // Enable the button when the target time is reached + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvMarkComplete.setTextColor(Color.WHITE) + binding.tvMarkComplete.isClickable = true + statusMarkComplete = true + + } + } + timer.start() + } else { + // If the target time is less than 10 minutes from now, disable the button + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvMarkComplete.setTextColor(Color.WHITE) + + binding.tvMarkComplete.isClickable = true + statusMarkComplete = true + binding.tvCall.gone() + } + + }catch (ex: Exception){ + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button_grey)) + binding.tvMarkComplete.setTextColor(Color.BLACK) + statusMarkComplete = false + } + extraPayment() + } + CallAction.START -> { + binding.tvStatus.text = getString(R.string.inprogess) + binding.tvAccept.text = getString(R.string.track_status) + binding.tvCancel.gone() + extraPayment() + } + CallAction.REACHED -> { + binding.tvStatus.text = getString(R.string.reached_destination) + binding.tvAccept.text = getString(R.string.track_status) + binding.tvCancel.gone() + extraPayment() + } + CallAction.START_SERVICE -> { + binding.tvStatus.text = getString(R.string.started) + binding.tvAccept.gone() + binding.tvCancel.gone() + + binding.tvMarkComplete.visible() + + try { + val targetTimeInMilliss = dateStringToMillis(request.end_date.toString()) + val currentTimeInMilliss = System.currentTimeMillis() + + val timeDifferenceInMilliss = targetTimeInMilliss - currentTimeInMilliss + val timeDifferenceInMinutess = timeDifferenceInMilliss / (1000 * 60) + + if (timeDifferenceInMinutess > 10) { + val timer = object : CountDownTimer(timeDifferenceInMilliss - (10 * 60 * 1000), 1000) { + override fun onTick(millisUntilFinished: Long) { + // Do something when 10 minutes are left + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button_grey)) + binding.tvMarkComplete.setTextColor(Color.BLACK) + statusMarkComplete = false + } + + override fun onFinish() { + // Enable the button when the target time is reached + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvMarkComplete.setTextColor(Color.WHITE) + binding.tvMarkComplete.isClickable = true + statusMarkComplete = true + + } + } + timer.start() + } else { + // If the target time is less than 10 minutes from now, disable the button + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button)) + binding.tvMarkComplete.setTextColor(Color.WHITE) + + binding.tvMarkComplete.isClickable = true + statusMarkComplete = true + binding.tvCall.gone() + } + + }catch (ex: Exception){ + binding.tvMarkComplete.setBackgroundDrawable(binding.root.context.resources.getDrawable(R.drawable.drawable_alternate_button_grey)) + binding.tvMarkComplete.setTextColor(Color.BLACK) + statusMarkComplete = false + } + extraPayment() + } + CallAction.COMPLETED -> { + binding.tvStatus.text = getString(R.string.completed) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.textColorGreen)) + binding.tvAccept.gone() + binding.tvCancel.gone() + binding.tvCall.gone() + + binding.tvAddPrescription.visible() + extraPayment() + } + CallAction.FAILED -> { + binding.tvAccept.gone() + binding.tvStatus.text = getString(R.string.no_show) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorCancel)) + binding.tvCancel.gone() + binding.tvCall.gone() + } + CallAction.CANCELED -> { + binding.tvStatus.text = getString(R.string.canceled) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorCancel)) + binding.tvAccept.gone() + binding.tvCancel.gone() + binding.tvCall.gone() + } + CallAction.CANCEL_SERVICE -> { + binding.tvStatus.text = getString(R.string.canceled_service) + binding.tvStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorCancel)) + binding.tvCancel.gone() + binding.tvAccept.gone() + binding.tvCall.gone() + } + else -> { + binding.tvStatus.text = getString(R.string.new_request) + } + } + + /*Symptom*/ + binding.tvSymptomDec.text = request.symptom_details + binding.tvSymptomDec.hideShowView(binding.tvSymptomDec.text.isNotEmpty()) + + val symptomImages = ArrayList() + symptomImages.addAll(request.symptom_images ?: emptyList()) + val adapterSymptomImage = ImagesDocumentAdapter(this, symptomImages) + binding.rvSymptomDoc.adapter = adapterSymptomImage + binding.rvSymptomDoc.hideShowView(symptomImages.isNotEmpty()) + + binding.rvSymptomListing.layoutManager = GridLayoutManager(requireContext(), 3) + val items = ArrayList() + items.addAll(request.symptoms ?: emptyList()) + val adapterSymptom = CheckItemAdapter(this, true, items) + binding.rvSymptomListing.adapter = adapterSymptom + + binding.tvSymptom.hideShowView(binding.tvSymptomDec.text.isNotEmpty() || items.isNotEmpty()) + + /*CarePlan*/ + val itemsCarePlan = ArrayList() + if (request.tier_detail != null) { + request.tier_detail?.isSelected = true + itemsCarePlan.add(request.tier_detail ?: Filter()) + } + + binding.tvCarePlan.hideShowView(itemsCarePlan.isNotEmpty()) + binding.rvCatePlan.hideShowView(itemsCarePlan.isNotEmpty()) + val adapterCarePlan = CarePlanAdapter(this, CarePlanAdapter.PlanOption.MAIN, itemsCarePlan) + binding.rvCatePlan.adapter = adapterCarePlan + + /*Pre Assessment*/ + val itemsPreAssessment = ArrayList() + itemsPreAssessment.addAll(request.question_answers ?: emptyList()) + binding.tvPreAssessment.hideShowView(itemsPreAssessment.isNotEmpty()) + binding.tvPreAssessmentV.hideShowView(itemsPreAssessment.isNotEmpty()) + + var answers = "" + itemsPreAssessment.forEachIndexed { index, page -> + answers += when (index) { + 1 -> "${index + 1}. ${page.question}\nAns: ${page.answer} Kg\n\n" + 2 -> "${index + 1}. ${page.question}\nAns: ${page.answer} cm\n\n" + else -> "${index + 1}. ${page.question}\nAns: ${page.answer}\n\n" + } + } + binding.tvPreAssessmentV.text = answers + } + + fun updateCarePlan(item: Filter) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.mark_complete, + R.string.mark_complete_message, R.string.mark_complete, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["id"] = item.id ?: 0 + hashMap["request_id"] = request.id ?: "" + hashMap["status"] = CallAction.COMPLETED + viewModel.updateCarePlan(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun extraPayment() { + if (request.extra_payment == null) { + when (BuildConfig.FLAVOR) { + "homeDoctor" -> { + binding.tvAskPayment.visible() + } + else -> binding.tvAskPayment.gone() + } + } else { + binding.tvAskPayment.gone() + binding.tvExtraPayment.visible() + binding.tvExtraPaymentAmount.visible() + binding.tvExtraPaymentDesc.visible() + binding.tvExtraStatus.visible() + binding.tvExtraPaymentAmount.text = getString(R.string.amount_s, getCurrency(request.extra_payment?.balance)) + binding.tvExtraPaymentDesc.text = request.extra_payment?.description + binding.tvExtraStatus.text = "(${request.extra_payment?.status})" + + when (request.extra_payment?.status) { + CallAction.PENDING -> + binding.tvExtraStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.colorPending)) + CallAction.PAID -> + binding.tvExtraStatus.setTextColor(ContextCompat.getColor(requireContext(), R.color.textColorGreen)) + } + } + } + + private fun proceedRequest() { + when (request.status) { + CallAction.PENDING -> { + if(statusMarkComplete){ + showAcceptRequestDialog() + }else{ + Toast.makeText(requireContext(),"The shift cannot begin before 10 minutes",Toast.LENGTH_LONG).show() + } + } + CallAction.ACCEPT -> { + if(statusRequest){ + showInitiateRequestDialog() + }else{ + Toast.makeText(requireContext(),"The shift cannot begin before 10 minutes",Toast.LENGTH_LONG).show() + } + + } + CallAction.COMPLETED -> { + if (request.is_prescription == true) { + if (!request.pre_scription?.type.isNullOrEmpty()) { + val popup = PopupMenu(requireContext(), binding.tvAddPrescription) + popup.menuInflater.inflate(R.menu.menu_prescription, popup.menu) + + popup.setOnMenuItemClickListener { item -> + when (item.itemId) { + R.id.item_view -> { + val link = getString(R.string.pdf_link, BuildConfig.BASE_URL, request.id, BuildConfig.APP_UNIQUE_ID) + openPdf(requireActivity(), link, true) + } + R.id.item_edit -> { + registerActivityResult.launch(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, request.pre_scription?.type) + .putExtra(EXTRA_REQUEST_ID, request)) + } + } + true + } + + popup.show() + } + } else { + val fragment = BottomPrescriptionFragment(this, request) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + } + CallAction.START, CallAction.REACHED -> { + registerActivityResult.launch(Intent(requireActivity(), AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, request)) + } + CallAction.START_SERVICE -> { + showMarkCompleteDialog() + } + } + } + + private fun showAcceptRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.accept_request, + R.string.accept_request_message, R.string.accept_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiAcceptRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun showMarkCompleteDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.mark_complete, + R.string.mark_complete_message, R.string.mark_complete, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiCompleteRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun showInitiateRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.start_request, + R.string.start_request_message, R.string.start_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiStartRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun hitApiAcceptRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + + viewModel.acceptRequest(hashMap) + } + } + + + private fun hitApiCompleteRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = java.util.HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["status"] = CallAction.COMPLETED + + viewModel.callStatus(hashMap) + } + } + + private fun hitApiStartRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + when (request.main_service_type) { + ConsultType.HOME_VISIT -> { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["status"] = CallAction.START + + viewModel.callStatus(hashMap) + } + else -> { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + + viewModel.startRequest(hashMap) + } + } + } + } + + private fun cancelAppointment() { + val dialogBuilder = AlertDialog.Builder(requireContext()) + + val dialogView = layoutInflater.inflate(R.layout.alert_cancel_request, null) + dialogBuilder.setView(dialogView) + + val etReason: EditText = dialogView.findViewById(R.id.etReason) + val tvCancel: TextView = dialogView.findViewById(R.id.tvCancel) + val tvClose: TextView = dialogView.findViewById(R.id.tvClose) + + alertDialog = dialogBuilder.create() + alertDialog?.show() + + tvCancel.setOnClickListener { + if (etReason.text.toString().trim().isEmpty()) { + etReason.showSnackBar(getString(R.string.reason)) + } else { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["cancel_reason"] = etReason.text.toString().trim() + viewModel.cancelRequest(hashMap) + } + } + } + + tvClose.setOnClickListener { + alertDialog?.dismiss() + } + } + + private fun bindObservers() { + viewModel.requestDetail.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + request = it.data?.request_detail ?: Request() + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.updateCarePlan.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + hitApi() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.acceptRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.startRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + + when (request.main_service_type) { + ConsultType.CHAT -> { + requireActivity().longToast(getString(R.string.starting_chat)) + + if (!appSocket.isConnected) + appSocket.init() + + startActivity(Intent(requireActivity(), ChatDetailActivity::class.java) + .putExtra(USER_ID, request.from_user?.id) + .putExtra(USER_NAME, request.from_user?.name) + .putExtra(EXTRA_REQUEST_ID, request.id) + .putExtra(EXTRA_IS_FIRST, true) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + } + ConsultType.AUDIO_CALL, ConsultType.VIDEO_CALL -> { + requireActivity().longToast(getString(R.string.starting_call)) + + request.call_id = it.data?.call_id + startActivity(Intent(requireContext(), CallingActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(EXTRA_REQUEST_ID, request)) + } + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.startCall.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().longToast(getString(R.string.starting_call)) + + request.call_id = it.data?.call_id + startActivity(Intent(requireContext(), CallingActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) + .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + .putExtra(EXTRA_REQUEST_ID, request)) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.callStatus.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + + if (request.main_service_type == ConsultType.HOME_VISIT && request.status != CallAction.START_SERVICE) { + request.status = CallAction.START + registerActivityResult.launch(Intent(requireActivity(), AppointmentStatusActivity::class.java) + .putExtra(EXTRA_REQUEST_ID, request)) + } else if (it.data?.status == CallAction.COMPLETED) { + val broadcastIntent = Intent() + broadcastIntent.action = PushType.COMPLETED + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(broadcastIntent) + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.cancelRequest.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + alertDialog?.dismiss() + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.extraPayment.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + requireActivity().setResult(Activity.RESULT_OK) + hitApi() + } + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.CANCELED_REQUEST) + intentFilter.addAction(PushType.PATIENT_ADDED_SYMPTOMS) + intentFilter.addAction(PushType.REQUEST_FAILED) + intentFilter.addAction(PushType.COMPLETED) + intentFilter.addAction(PushType.PAID_EXTRA_PAYMENT) + intentFilter.addAction(MEDICAL_HISTORY) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.REQUEST_COMPLETED, PushType.COMPLETED, PushType.PATIENT_ADDED_SYMPTOMS, MEDICAL_HISTORY, + PushType.CANCELED_REQUEST, PushType.REQUEST_FAILED, PushType.PAID_EXTRA_PAYMENT -> { + if (request.id == intent.getStringExtra(EXTRA_REQUEST_ID)) + hitApi() + } + } + } + } + + companion object { + const val MEDICAL_HISTORY = "MEDICAL_HISTORY" + } + + fun dateStringToMillis(dateString: String): Long { + val formatter = SimpleDateFormat("dd MMMM yyyy, hh:mm:ss a", Locale.ENGLISH) + val date = formatter.parse(dateString) + return date?.time ?: 0 + } + /* "booking_end_date": "2024-07-04 13:00:00", + + "bookingDateUTC": "2024-07-04 07:00:00", + "booking_date": "4 July 2024, 12:30:00 pm",*/ + + /* fun dateStringToMillisNew(dateString: String): Long { + val formatter = SimpleDateFormat("yyyy-mm-dd hh:mm:ss", Locale.ENGLISH) + val date = formatter.parse(dateString) + return date?.time ?: 0 + }*/ +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/BottomExtraChargesFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/BottomExtraChargesFragment.kt new file mode 100644 index 0000000..38baf50 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/BottomExtraChargesFragment.kt @@ -0,0 +1,77 @@ +package com.consultantvendor.ui.dashboard.home.appointment.detail + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.databinding.BottomExtraChargesBinding +import com.consultantvendor.di.DaggerBottomSheetDialogFragment +import com.consultantvendor.utils.* +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomExtraChargesFragment(val fragment: AppointmentDetailsFragment) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomExtraChargesBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_extra_charges, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + editTextScroll(binding.etDescription) + binding.ilPayment.prefixText = getCurrencySymbol() + } + + private fun listeners() { + binding.tvPayment.setOnClickListener { + binding.etPayment.hideKeyboard() + when { + binding.etPayment.text.toString().isEmpty() || binding.etPayment.text.toString().toInt() < 1 -> { + requireActivity().longToast(getString(R.string.enter_amount)) + } + binding.etDescription.text.toString().isEmpty() -> { + requireActivity().longToast(getString(R.string.enter_description)) + } + isConnectedToInternet(requireContext(), true) -> { + dialog?.dismiss() + fragment.extraPayment(binding.etPayment.text.toString(), binding.etDescription.text.toString()) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/CarePlanAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/CarePlanAdapter.kt new file mode 100644 index 0000000..7c15bd5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/detail/CarePlanAdapter.kt @@ -0,0 +1,87 @@ +package com.consultantvendor.ui.dashboard.home.appointment.detail + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Filter +import com.consultantvendor.databinding.RvItemCarePlanBinding +import com.consultantvendor.databinding.RvItemCarePlanOptionBinding +import com.consultantvendor.utils.CallAction +import com.consultantvendor.utils.hideShowView + + +class CarePlanAdapter(private val fragment: Fragment,private val planOption: PlanOption, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (planOption) { + PlanOption.FIRST_OPTION -> + (holder as ViewHolderOption).bind(items[position]) + else -> + (holder as ViewHolder).bind(items[position]) + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (planOption) { + PlanOption.FIRST_OPTION -> + ViewHolderOption(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_care_plan_option, parent, false)) + else -> + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_care_plan, parent, false)) + } + + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemCarePlanBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + + } + + fun bind(item: Filter) = with(binding) { + tvPlan.text = item.title + + val listOptions = ArrayList() + listOptions.addAll(items[adapterPosition].tier_options ?: emptyList()) + val adapter = CarePlanAdapter(fragment, PlanOption.FIRST_OPTION, listOptions) + binding.rvListing.adapter = adapter + } + } + + inner class ViewHolderOption(val binding: RvItemCarePlanOptionBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvDone.setOnClickListener { + if (fragment is AppointmentDetailsFragment) + fragment.updateCarePlan(items[adapterPosition]) + } + } + + fun bind(item: Filter) = with(binding) { + val context = binding.root.context + + val help = if (item.type == "1") context.getString(R.string.need_some_help) + else context.getString(R.string.need_much_help) + + tvPlan.text = "${item.title} ($help)" + + cbDone.hideShowView(item.status != CallAction.PENDING) + tvDone.hideShowView(item.status == CallAction.PENDING) + + } + } + + enum class PlanOption { + MAIN, FIRST_OPTION + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryAdapter.kt new file mode 100644 index 0000000..54d11cd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryAdapter.kt @@ -0,0 +1,65 @@ +package com.consultantvendor.ui.dashboard.home.appointment.medicalhistory + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.MedicalHistory +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemMedicalHistoryBinding +import com.consultantvendor.utils.getDoctorName +import com.consultantvendor.utils.loadImage + + +class MedicalHistoryAdapter(private val fragmentMain: MedicalHistoryFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_medical_history, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemMedicalHistoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: UserData) = with(binding) { + tvName.text = getDoctorName(item) + tvDesc.text = item.category ?: fragmentMain.getString(R.string.na) + loadImage("tag",binding.ivPic, item.profile_image, + R.drawable.image_placeholder) + + val medical_history = ArrayList() + medical_history.addAll(item.medical_history ?: emptyList()) + val adapter = MedicalHistoryItemAdapter(fragmentMain, medical_history) + rvListingItems.adapter = adapter + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryFragment.kt new file mode 100644 index 0000000..23983b5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryFragment.kt @@ -0,0 +1,245 @@ +package com.consultantvendor.ui.dashboard.home.appointment.medicalhistory + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentMedicalHistoryBinding +import com.consultantvendor.ui.dashboard.home.appointment.detail.AppointmentDetailsFragment.Companion.MEDICAL_HISTORY +import com.consultantvendor.ui.dashboard.home.questions.QuestionViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class MedicalHistoryFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentMedicalHistoryBinding + + private var rootView: View? = null + + private lateinit var viewModel: QuestionViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: MedicalHistoryAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private lateinit var request: Request + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_medical_history, + container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[QuestionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + editTextScroll(binding.etComment) + request = arguments?.getSerializable(EXTRA_REQUEST_ID) as Request + + /*Id appointment accepted or */ + val canAddComment = (request.status != CallAction.PENDING && request.status != CallAction.CANCELED && + request.status != CallAction.FAILED) + binding.tvAdd.hideShowView(request.medical_history_added == false && canAddComment) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_medical_history) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_medical_history_desc) + + } + + private fun setAdapter() { + adapter = MedicalHistoryAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.tvAdd.setOnClickListener { + showAddHistory(true) + binding.tvAdd.gone() + } + + binding.tvCancel.setOnClickListener { + binding.tvAdd.visible() + showAddHistory(false) + } + + binding.tvSubmit.setOnClickListener { + if (binding.etComment.text.toString().isEmpty()) { + binding.etComment.showSnackBar(getString(R.string.write_patient_medical_condition)) + } else if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["request_id"] = request.id ?: "" + hashMap["comment"] = binding.etComment.text.toString() + viewModel.createMedicalHistory(hashMap) + } + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun showAddHistory(show: Boolean) { + binding.etComment.hideShowView(show) + binding.tvSubmit.hideShowView(show) + binding.tvCancel.hideShowView(show) + } + + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + hashMap["request_id"] = request.id ?: "" + viewModel.getMedicalHistory(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.getMedicalHistory.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.doctors ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModel.createMedicalHistory.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + showAddHistory(false) + hitApi(true) + + val broadcastIntent = Intent() + broadcastIntent.action = MEDICAL_HISTORY + + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(broadcastIntent) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryItemAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryItemAdapter.kt new file mode 100644 index 0000000..64f7189 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/medicalhistory/MedicalHistoryItemAdapter.kt @@ -0,0 +1,82 @@ +package com.consultantvendor.ui.dashboard.home.appointment.medicalhistory + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.MedicalHistory +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemMedicalHistoryItemBinding +import com.consultantvendor.utils.* + + +class MedicalHistoryItemAdapter(private val fragmentMain: MedicalHistoryFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_medical_history_item, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemMedicalHistoryItemBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvPrescription.setOnClickListener { + val link = fragmentMain.getString(R.string.pdf_link, BuildConfig.BASE_URL, items[bindingAdapterPosition].request?.id, BuildConfig.APP_UNIQUE_ID) + openPdf(fragmentMain.requireActivity(), link, true) + } + } + + fun bind(item: MedicalHistory) = with(binding) { + tvDate.text = fragmentMain.getString(R.string.appointment_date_s, DateUtils.dateTimeFormatFromUTC( + DateFormat.MON_DATE_YEAR, item.request?.booking_date)) + + tvComment.hideShowView(!item.comment.isNullOrEmpty()) + tvComment.text = item.comment ?: fragmentMain.getString(R.string.na) + + if (item.request?.extra_payment != null) { + tvServices.visible() + + val extraPayment = item.request?.extra_payment + + val services = "${fragmentMain.getString(R.string.extra_payment)} (${extraPayment?.status})" + + "\n${fragmentMain.getString(R.string.amount_s, getCurrency(extraPayment?.balance))}" + + "\n${extraPayment?.description}" + + binding.tvServices.text = services + } else + tvServices.gone() + + tvPrescription.hideShowView(item.request?.is_prescription == true) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/BottomServiceRequestFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/BottomServiceRequestFragment.kt new file mode 100644 index 0000000..82188ed --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/BottomServiceRequestFragment.kt @@ -0,0 +1,241 @@ +package com.consultantvendor.ui.dashboard.home.appointment.requests + +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentServiceRequestBinding +import com.consultantvendor.di.DaggerBottomSheetDialogFragment +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomServiceRequestFragment(private val request: Request) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentServiceRequestBinding + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var progressDialog: ProgressDialog + + private var timeLimit = 60000L + + private var timer: CountDownTimer? = null + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(false) + dialog.behavior.isDraggable = false + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_service_request, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + setData() + setTimer() + bindObservers() + } + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + } + + private fun setTimer() { + requireActivity().runOnUiThread { + timeLimit = (request.remain_second ?: 45) * 1000 + binding.progressBar.max = timeLimit.toInt() + timer = object : CountDownTimer(timeLimit, 16) { + override fun onFinish() { + try { + dismiss() + }catch (e:Exception){} + //onAcceptRequest.onOrderTimeoutOrError() + } + + override fun onTick(millisUntilFinished: Long) { + binding.progressBar.progress = timeLimit.toInt() - millisUntilFinished.toInt() + } + } + } + + binding.progressBar.visibility = View.VISIBLE + startTimer() + } + + private fun setData() { + binding.tvName.text = request.from_user?.name + loadImage("profile",binding.ivPic, request.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + binding.tvServiceTypeV.text = request.service_type + + if (request.booking_end_date.isNullOrEmpty()) { + binding.tvBookingDateV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC) + binding.tvBookingTimeV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC) + } else { + val dateBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.booking_end_date)}" + binding.tvBookingDateV.text = dateBooking + + val timeBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.booking_end_date)}" + binding.tvBookingTimeV.text = timeBooking + } + + binding.tvBookingPriceV.text = getCurrency(request.price) + + when (request.main_service_type) { + ConsultType.HOME_VISIT -> { + if (request.extra_detail?.service_address != null) { + binding.tvLocation.visible() + binding.tvViewMap.visible() + binding.tvLocation.text = request.extra_detail?.service_address + } + } + } + } + + private fun listeners() { + binding.tvCancel.setOnClickListener { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["booking_id"] = request.id ?: "" + hashMap["vendor_id"] = prefsManager.getObject(USER_DATA, UserData::class.java)?.id.toString() + + viewModel.cancelRequestV2(hashMap) + } + } + + binding.tvAccept.setOnClickListener { + showAcceptRequestDialog() + } + + binding.tvViewMap.setOnClickListener { + val address = request.extra_detail + mapIntent(requireActivity(), address?.service_address ?: "", + address?.lat?.toDouble() ?: 0.0, + address?.long?.toDouble() ?: 0.0) + } + } + + private fun showAcceptRequestDialog() { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.accept_request, + R.string.accept_request_message, R.string.accept_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiAcceptRequest() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun hitApiAcceptRequest() { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["id"] = request.id ?: "" + + viewModel.acceptRequestV2(hashMap) + } + } + + private fun bindObservers() { + viewModel.acceptRequest.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + dismiss() + timer?.cancel() + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, it.data?.request_detail?.id)) + + val broadcastIntent = Intent() + broadcastIntent.action = PushType.NEW_REQUEST + broadcastIntent.putExtra(EXTRA_REQUEST_ID, it.data?.request_detail?.id) + + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(broadcastIntent) + + } + Status.ERROR -> { + dismiss() + timer?.cancel() + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.cancelRequest.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + dismiss() + timer?.cancel() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun startTimer() { + timer?.start() + } + + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/BottomServiceRequestNewFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/BottomServiceRequestNewFragment.kt new file mode 100644 index 0000000..502e4a9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/BottomServiceRequestNewFragment.kt @@ -0,0 +1,273 @@ +package com.consultantvendor.ui.dashboard.home.appointment.requests + +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentBottomServiceRequestNewBinding +import com.consultantvendor.di.DaggerBottomSheetDialogFragment +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.models.responses.UserData + + +class BottomServiceRequestNewFragment(private var request: ArrayList?) : DaggerBottomSheetDialogFragment(),PendingRequestAdapter.ButtonClickListener { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentBottomServiceRequestNewBinding + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var progressDialog: ProgressDialog + + private var timeLimit = 60000L + + private var timer: CountDownTimer? = null + private lateinit var adapter: PendingRequestAdapter + + +/* override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(false) + dialog.behavior.isDraggable = false + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + }*/ + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) // Allow dismiss on outside click + dialog.behavior.isDraggable = true // Allow drag to dismiss + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_bottom_service_request_new, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + setAdapter() +// setData() +// setTimer() + + bindObservers() + } + private fun setAdapter() { + adapter = request?.let { PendingRequestAdapter(this, it,this) }!! + binding.rvPendingRequest.adapter = adapter + } + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + } + + private fun setTimer() { + requireActivity().runOnUiThread { + timeLimit = ((15 ?: 45) * 1000).toLong() + + binding.progressBar.max = timeLimit.toInt() + timer = object : CountDownTimer(timeLimit, 16) { + override fun onFinish() { + try { + dismiss() + }catch (e:Exception){} + //onAcceptRequest.onOrderTimeoutOrError() + } + + override fun onTick(millisUntilFinished: Long) { + binding.progressBar.progress = timeLimit.toInt() - millisUntilFinished.toInt() + } + } + } + + binding.progressBar.visibility = View.VISIBLE + startTimer() + } + +/* private fun setData() { + binding.tvName.text = request.from_user?.name + loadImage("profile",binding.ivPic, request.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + binding.tvServiceTypeV.text = request.service_type + + if (request.booking_end_date.isNullOrEmpty()) { + binding.tvBookingDateV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC) + binding.tvBookingTimeV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC) + } else { + val dateBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.booking_end_date)}" + binding.tvBookingDateV.text = dateBooking + + val timeBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.booking_end_date)}" + binding.tvBookingTimeV.text = timeBooking + } + + binding.tvBookingPriceV.text = getCurrency(request.price) + + when (request.main_service_type) { + ConsultType.HOME_VISIT -> { + if (request.extra_detail?.service_address != null) { + binding.tvLocation.visible() + binding.tvViewMap.visible() + binding.tvLocation.text = request.extra_detail?.service_address + } + } + } + }*/ + + private fun listeners() { + /* binding.tvCancel.setOnClickListener { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["booking_id"] = request.id ?: "" + hashMap["vendor_id"] = prefsManager.getObject(USER_DATA, UserData::class.java)?.id.toString() + + viewModel.cancelRequestV2(hashMap) + } + } + + binding.tvAccept.setOnClickListener { + showAcceptRequestDialog() + } + + binding.tvViewMap.setOnClickListener { + val address = request.extra_detail + mapIntent(requireActivity(), address?.service_address ?: "", + address?.lat?.toDouble() ?: 0.0, + address?.long?.toDouble() ?: 0.0) + }*/ + } + + private fun showAcceptRequestDialog(id: String?) { + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.accept_request, + R.string.accept_request_message, R.string.accept_request, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + hitApiAcceptRequest(id) + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun hitApiAcceptRequest(id: String?) { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["id"] = id ?: "" + + viewModel.acceptRequestV2(hashMap) + } + } + + private fun bindObservers() { + viewModel.acceptRequest.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + dismiss() + timer?.cancel() + startActivity(Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) + .putExtra(EXTRA_REQUEST_ID, it.data?.request_detail?.id)) + + val broadcastIntent = Intent() + broadcastIntent.action = PushType.NEW_REQUEST + broadcastIntent.putExtra(EXTRA_REQUEST_ID, it.data?.request_detail?.id) + + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(broadcastIntent) + + } + Status.ERROR -> { + dismiss() + timer?.cancel() + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.cancelRequest.observe(viewLifecycleOwner, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + dismiss() + timer?.cancel() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun startTimer() { + timer?.start() + } + + override fun onButtonAcceptClick(position: Int) { + showAcceptRequestDialog(request?.get(position)?.id) + } + + override fun onButtonCancelClick(position: Int) { + if (isConnectedToInternet(requireActivity(), true)) { + val hashMap = HashMap() + hashMap["booking_id"] = request?.get(position)?.id ?: "" + hashMap["vendor_id"] = prefsManager.getObject(USER_DATA, UserData::class.java)?.id.toString() + + + viewModel.cancelRequestV2(hashMap) + } + } + + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/PendingRequestAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/PendingRequestAdapter.kt new file mode 100644 index 0000000..1b84bbb --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/appointment/requests/PendingRequestAdapter.kt @@ -0,0 +1,141 @@ +package com.consultantvendor.ui.dashboard.home.appointment.requests + + +import android.content.Intent +import android.os.CountDownTimer +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemPendingAppointmentBinding +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* +import com.facebook.react.bridge.UiThreadUtil.runOnUiThread + +private var timeLimit = 60000L + + +class PendingRequestAdapter(private val fragment: Fragment, private val items: ArrayList,private val listener: ButtonClickListener) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + interface ButtonClickListener { + fun onButtonAcceptClick(position: Int) + fun onButtonCancelClick(position: Int) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_pending_appointment, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemPendingAppointmentBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvAccept.setOnClickListener { + listener.onButtonAcceptClick(position) + } + + binding.tvCancel.setOnClickListener { + listener.onButtonCancelClick(position) + } + + binding.root.setOnClickListener { +// if (fragment is AppointmentFragment) +// fragment.registerActivityResult.launch(Intent(fragment.requireContext(), DrawerActivity::class.java) +// .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) +// .putExtra(EXTRA_REQUEST_ID, items[bindingAdapterPosition].id)) +// else if (fragment is HomeFragment) +// fragment.startActivityForResult(Intent(fragment.requireContext(), DrawerActivity::class.java) +// .putExtra(PAGE_TO_OPEN, DrawerActivity.APPOINTMENT_DETAILS) +// .putExtra(EXTRA_REQUEST_ID, items[bindingAdapterPosition].id), AppRequestCode.APPOINTMENT_DETAILS) + + } + } + + /*Common method*/ +// private fun checkRequest() { +// if (fragment is AppointmentFragment) +// fragment.proceedRequest(items[bindingAdapterPosition]) +// else if (fragment is HomeFragment) +// fragment.proceedRequest(items[bindingAdapterPosition]) +// } + + fun bind(request: Request) = with(binding) { + val context = binding.root.context + + tvAccept.visible() + // tvCancel.hideShowView(request.canCancel) + + tvName.text = request.from_user?.name + // tvAge.text = request.category!!.name + loadImage("profile",binding.ivPic, request.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + if (request.booking_end_date.isNullOrEmpty()) { + binding.tvBookingDateV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC) + binding.tvBookingTimeV.text = DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC) + } else { + val dateBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request.booking_end_date)}" + binding.tvBookingDateV.text = dateBooking + + val timeBooking = "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.bookingDateUTC)} - " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request.booking_end_date)}" + binding.tvBookingTimeV.text = timeBooking + } + + tvServiceTypeV.text = request.service_type + tvBookingPriceV.text = getCurrency(request.price) + + + timeLimit = (request.remain_second ?: 45) * 1000 + progressBar.max = timeLimit.toInt() + object : CountDownTimer(timeLimit, 16) { + override fun onTick(millisUntilFinished: Long) { + // Update progress and text + binding.progressBar.progress = timeLimit.toInt() - millisUntilFinished.toInt() + } + + override fun onFinish() { + progressBar.progress = 100 + } + }.start() + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } + + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/bmichecker/BmiCheckerFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/bmichecker/BmiCheckerFragment.kt new file mode 100644 index 0000000..c0ccb95 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/bmichecker/BmiCheckerFragment.kt @@ -0,0 +1,175 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.bmichecker + +import android.graphics.Color +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentBmiCheckerBinding +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.consultantvendor.utils.hideKeyboard +import com.consultantvendor.utils.showSnackBar +import com.ekn.gruzer.gaugelibrary.Range +import dagger.android.support.DaggerFragment +import java.text.DecimalFormat +import javax.inject.Inject + +class BmiCheckerFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentBmiCheckerBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private val decimalFormat = DecimalFormat("0.00") + + private var selectedGender = "" + + private lateinit var viewModel: LoginViewModel + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_bmi_checker, container, false) + rootView = binding.root + + initialise() + listeners() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + selectedGender = getString(R.string.male) + setSpinnerGender() + setGauge() + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivCalculateBmi.setOnClickListener { + + binding.ivCalculateBmi.hideKeyboard() + val weight = binding.etWeight.text.toString().trim() + val height = binding.etHeight.text.toString().trim() + if (weight.isEmpty() || weight.toInt() <= 0) { + binding.etWeight.showSnackBar(getString(R.string.error_empty_weight)) + return@setOnClickListener + } else if (height.isEmpty() || height.toInt() <= 0) { + binding.etHeight.showSnackBar(getString(R.string.height_empty_validation)) + return@setOnClickListener + } + val bmi: Double = calculateBmi(weight.toDouble(), height.toDouble()) ?: 0.0 + binding.tvBmi.text = decimalFormat.format(bmi) + binding.halfGauge.value = decimalFormat.format(bmi).toDouble() + + if (bmi > 0 && bmi < 18.5) { + binding.tvBmiStatus.text = getString(R.string.underweight) + binding.tvRange.text = getString(R.string.range0to18) + binding.tvBmiStatus.setTextColor(Color.parseColor("#FF52C1F6")) + setGaugeValue(bmi, 10.0, 18.4) + + } else if (bmi >= 18.5 && bmi < 25) { + binding.tvBmiStatus.text = getString(R.string.normal) + binding.tvRange.text = getString(R.string.range18to25) + binding.tvBmiStatus.setTextColor(Color.parseColor("#FF48D3B3")) + setGaugeValue(bmi, 20.0, 24.9) + + + } else if (bmi >= 25) { + binding.tvBmiStatus.text = getString(R.string.overweight) + binding.tvRange.text = getString(R.string.range_above25) + binding.tvBmiStatus.setTextColor(Color.parseColor("#FFFD5E5E")) + // setGaugeValue(bmi,3.0,40.0) + val perc = (100 * bmi) / 40.0 + binding.halfGauge.value = perc / 3 + } + } + } + + private fun setGauge() { + val range = Range() + range.color = Color.parseColor("#FF52C1F6") + range.from = 0.0 + range.to = 10.0 + + val range2 = Range() + range2.color = Color.parseColor("#FF48D3B3") + range2.from = 10.0 + range2.to = 20.0 + + val range3 = Range() + range3.color = Color.parseColor("#FFFD5E5E") + range3.from = 20.0 + range3.to = 30.0 + + binding.halfGauge.addRange(range) + binding.halfGauge.addRange(range2) + binding.halfGauge.addRange(range3) + + binding.halfGauge.minValue = 0.0 + binding.halfGauge.maxValue = 30.0 + binding.halfGauge.value = 0.0 + } + + private fun calculateBmi(weight: Double, height: Double): Double? { + val bmi: Double? = (weight / (height * height)) * 10000 + return bmi + } + + private fun setGaugeValue(bmi: Double, blockValue: Double, range: Double) { + val perc = (100 * bmi) / range + binding.halfGauge.value = (blockValue * perc) / 100 + } + + private fun setSpinnerGender() { + val genders = arrayOf(getString(R.string.male), getString(R.string.female)) + val adapter = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, genders) + adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line) + binding.spinnerGender.adapter = adapter + + binding.spinnerGender.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>, + view: View, + position: Int, + id: Long + ) { + selectedGender = genders[position] + } + + override fun onNothingSelected(parent: AdapterView<*>) { + // Another interface callback + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/pregnancycalculator/BottomPregnancyFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/pregnancycalculator/BottomPregnancyFragment.kt new file mode 100644 index 0000000..12ef51a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/pregnancycalculator/BottomPregnancyFragment.kt @@ -0,0 +1,158 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.pregnancycalculator + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.databinding.BottomPregnancyBinding +import com.consultantvendor.di.DaggerBottomSheetDialogFragment +import com.consultantvendor.utils.DateFormat +import com.consultantvendor.utils.DateUtils +import com.consultantvendor.utils.PrefsManager +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import java.util.* +import javax.inject.Inject + + +class BottomPregnancyFragment(private val dueDate: Long) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomPregnancyBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_pregnancy, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + dataSetup() + } + + private fun initialise() { + + } + + private fun listeners() { + + } + + private fun dataSetup() { + val pregnancyDays = 280 + val date = DateUtils.dateFormatFromMillis(DateFormat.MON_DATE_YEAR, dueDate) + binding.tvDueDate.text = getString(R.string.your_due_date_is_s, date) + + val pregnancyStartDate = calculateDate(-pregnancyDays) + + val calendarCurrent = Calendar.getInstance(Locale.ENGLISH) + val diff: Long = calendarCurrent.timeInMillis - pregnancyStartDate + val dayCount = diff.toFloat() / (24 * 60 * 60 * 1000) + + val weeks = (dayCount / 7).toInt() + val days = (dayCount % 7).toInt() + binding.tvPregnancyDate.text = getString(R.string.your_are_s_s_pregnant, weeks.toString(), days.toString()) + + val trimesterDifference = pregnancyDays / 3 + val trimester1StartDate = pregnancyStartDate + val trimester1EndDate = calculateDateSetTime(pregnancyStartDate, trimesterDifference - 3) + val trimester2StartDate = calculateDateSetTime(trimester1EndDate, 1) + val trimester2EndDate = calculateDateSetTime(trimester2StartDate, trimesterDifference + 4) + val trimester3StartDate = calculateDateSetTime(trimester2EndDate, 1) + val trimester3EndDate = calculateDateSetTime(trimester3StartDate, trimesterDifference - 2) + + binding.tvTimeline1Date.text = "${DateUtils.dateFormatFromMillis(DateFormat.MON_DATE, trimester1StartDate)} ${getString(R.string.to)} ${DateUtils.dateFormatFromMillis(DateFormat.MON_DATE, trimester1EndDate)}" + binding.tvTimeline2Date.text = "${DateUtils.dateFormatFromMillis(DateFormat.MON_DATE, trimester2StartDate)} ${getString(R.string.to)} ${DateUtils.dateFormatFromMillis(DateFormat.MON_DATE, trimester2EndDate)}" + binding.tvTimeline3Date.text = "${DateUtils.dateFormatFromMillis(DateFormat.MON_DATE, trimester3StartDate)} ${getString(R.string.to)} ${DateUtils.dateFormatFromMillis(DateFormat.MON_DATE, trimester3EndDate)}" + + when { + calendarCurrent.timeInMillis < trimester1EndDate -> { //Lies in 1st Trimester + val percentage = (calendarCurrent.timeInMillis - trimester1StartDate) * 100 / (trimester1EndDate - trimester1StartDate) + binding.progress1st.progress = percentage.toInt() + binding.progress2nd.progress = 0 + binding.progress3rd.progress = 0 + } + calendarCurrent.timeInMillis < trimester2EndDate -> { //Lies in 2nd Trimester + binding.progress1st.progress = 100 + val percentage = (calendarCurrent.timeInMillis - trimester2StartDate) * 100 / (trimester2EndDate - trimester2StartDate) + binding.progress2nd.progress = percentage.toInt() + binding.progress3rd.progress = 0 + } + else -> { //Lies in 3rd Trimester + binding.progress1st.progress = 100 + binding.progress2nd.progress = 100 + val percentage = (calendarCurrent.timeInMillis - trimester3StartDate) * 100 / (trimester3EndDate - trimester3StartDate) + binding.progress3rd.progress = percentage.toInt() + } + } + + binding.tvYourBaby.text = getString(R.string.your_baby_will_be_a_s, getZodiacSign()) + } + + private fun calculateDate(days: Int): Long { + val calendar = Calendar.getInstance(Locale.ENGLISH) + val dateSelected = DateUtils.dateFormatFromMillis(DateFormat.MON_DATE_YEAR, dueDate) + val date = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.DATE, dateSelected).toInt() + val month = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.MONTH, dateSelected).toInt() + val year = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.YEAR, dateSelected).toInt() + calendar.set(year, (month - 1), date) + + calendar.add(Calendar.DAY_OF_MONTH, days) + return calendar.timeInMillis + } + + private fun calculateDateSetTime(timeInMilis: Long, days: Int): Long { + val calendar = Calendar.getInstance(Locale.ENGLISH) + calendar.timeInMillis = timeInMilis + calendar.add(Calendar.DAY_OF_MONTH, days) + return calendar.timeInMillis + } + + private fun getZodiacSign(): String { + val calendar = Calendar.getInstance(Locale.ENGLISH) + calendar.timeInMillis = dueDate + val day = calendar.get(Calendar.DATE) + val month = calendar.get(Calendar.MONTH) + 1 + + return when { + day in 22..30 && month == 1 || day in 1..19 && month == 2 -> getString(R.string.aquarius) + day in 20..29 && month == 2 || day in 1..20 && month == 3 -> getString(R.string.pisces) + day in 21..31 && month == 3 || day in 1..20 && month == 4 -> getString(R.string.aries) + day in 21..30 && month == 4 || day in 1..21 && month == 5 -> getString(R.string.taurus) + day in 22..31 && month == 5 || day in 1..21 && month == 6 -> getString(R.string.gemini) + day in 22..30 && month == 6 || day in 1..22 && month == 7 -> getString(R.string.cancer_) + day in 23..31 && month == 7 || day in 1..22 && month == 8 -> getString(R.string.leo) + day in 23..31 && month == 8 || day in 1..23 && month == 9 -> getString(R.string.virgo) + day in 24..30 && month == 9 || day in 1..23 && month == 10 -> getString(R.string.libra) + day in 24..31 && month == 10 || day in 1..22 && month == 11 -> getString(R.string.scorpio) + day in 23..30 && month == 11 || day in 1..21 && month == 12 -> getString(R.string.sagittarius) + else -> getString(R.string.capricorn) + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/pregnancycalculator/PregnancyCalculatorFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/pregnancycalculator/PregnancyCalculatorFragment.kt new file mode 100644 index 0000000..7b3430a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/pregnancycalculator/PregnancyCalculatorFragment.kt @@ -0,0 +1,326 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.pregnancycalculator + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Filter +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentPregnancyCalculatorBinding +import com.consultantvendor.ui.adapter.CheckItemAdapter +import com.consultantvendor.utils.* +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList + + +class PregnancyCalculatorFragment : DaggerFragment(), OnDateSelected { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private var rootView: View? = null + + private lateinit var binding: FragmentPregnancyCalculatorBinding + + private lateinit var adapterCalMethod: CheckItemAdapter + + private var itemsCalMethod = ArrayList() + + private lateinit var adapterIvf: CheckItemAdapter + + private var itemsIvf = ArrayList() + + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_pregnancy_calculator, container, false) + rootView = binding.root + + initialisation() + listeners() + setAdapter() + } + return rootView + } + + private fun initialisation() { + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvDate.setOnClickListener { + var calendar = Calendar.getInstance() + calendar.set(Calendar.MONTH, -3) + val min = calendar.timeInMillis + calendar = Calendar.getInstance() + calendar.set(Calendar.MONTH, +3) + val max = calendar.timeInMillis + DateUtils.openDatePicker(requireActivity(), this, null, null) + } + + binding.tvCycle.setOnClickListener { + binding.spnCycleLength.performClick() + } + + binding.spnCycleLength.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvCycle.text = binding.spnCycleLength.selectedItem.toString() + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + + binding.tvWeek.setOnClickListener { + binding.spnWeek.performClick() + } + + binding.spnWeek.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvWeek.text = binding.spnWeek.selectedItem.toString() + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + + binding.tvDay.setOnClickListener { + binding.spnDays.performClick() + } + + binding.spnDays.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.tvDay.text = binding.spnDays.selectedItem.toString() + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + + binding.tvCalculate.setOnClickListener { + if (binding.tvDate.text.toString().isEmpty()) { + itemsCalMethod.forEachIndexed { index, filter -> + when (filter.isSelected) { + index == 0 -> binding.tvDate.showSnackBar(getString(R.string.the_first_day_of_your_last_period)) + index == 1 -> binding.tvDate.showSnackBar(getString(R.string.date_of_conception)) + index == 2 -> binding.tvDate.showSnackBar(getString(R.string.date_of_transfer)) + index == 3 -> binding.tvDate.showSnackBar(getString(R.string.date_of_ultrasound)) + else -> {} + } + } + return@setOnClickListener + } else { + var dateTime = 0L + itemsCalMethod.forEachIndexed { index, filter -> + if (filter.isSelected) { + when (index) { + 0 -> dateTime = calculateViaLastPeriod() + 1 -> dateTime = calculateViaConceptionDate() + 2 -> dateTime = calculateViaIVF() + 3 -> dateTime = calculateViaUltrasound() + } + return@forEachIndexed + } + } + + val fragment = BottomPregnancyFragment(dateTime) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + + } + } + } + + private fun calculateViaLastPeriod(): Long { + val pregnancyDays = 280 + + when (binding.spnCycleLength.selectedItemPosition) { + 0 -> { + //Period cycle not known + return calculateDate(pregnancyDays) + } + 1 -> { + //Default menstural cycle 21 days then subtract 7 days + return calculateDate(pregnancyDays - 7) + } + else -> { + //Period Cycle Range 22 to 35 days + //if mestural cycle is more than 21 days than subtract your menstural cycle days count by 21 (default menstural cycle) + //And add it to date generated by adding 280 days + + val daysToAdd = (binding.spnCycleLength.selectedItemPosition + 20) - 21 + return calculateDate(pregnancyDays + daysToAdd - 7) + } + } + } + + private fun calculateViaConceptionDate(): Long { + //Add 266 days to conception date + return calculateDate(266) + } + + private fun calculateViaIVF(): Long { + if (itemsIvf[0].isSelected) + return calculateDate((266 - 3)) + else if (itemsIvf[1].isSelected) + return calculateDate((266 - 5)) + else + return calculateDate((266 - 3)) + } + + private fun calculateViaUltrasound(): Long { + val pregnancyDays = 280 + val embryoAge = ((binding.spnWeek.selectedItemPosition + 1) * 7) + binding.spnDays.selectedItemPosition + val daysToAdd = pregnancyDays - embryoAge + return calculateDate(daysToAdd) + } + + private fun calculateDate(days: Int): Long { + val calendar = Calendar.getInstance(Locale.ENGLISH) + val dateSelected = binding.tvDate.text.toString() + val date = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.DATE, dateSelected).toInt() + val month = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.MONTH, dateSelected).toInt() + val year = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, DateFormat.YEAR, dateSelected).toInt() + calendar.set(year, (month - 1), date) + + calendar.add(Calendar.DAY_OF_MONTH, days) + return calendar.timeInMillis + } + + private fun setAdapter() { + val list = resources.getStringArray(R.array.calculationMethod) + itemsCalMethod.clear() + list.forEachIndexed { index, s -> + val item = Filter() + if (index == 0) + item.isSelected = true + item.option_name = s + itemsCalMethod.add(item) + } + + adapterCalMethod = CheckItemAdapter(this, false, itemsCalMethod) + binding.rvList.adapter = adapterCalMethod + + /*ivf list*/ + itemsIvf.clear() + for (i in 0..1) { + val item = Filter() + if (i == 0) { + item.isSelected = true + item.option_name = "3 ${getString(R.string.days)}" + } else if (i == 1) { + item.option_name = "5 ${getString(R.string.days)}" + } + itemsIvf.add(item) + } + + adapterIvf = CheckItemAdapter(this, false, itemsIvf) + binding.rvListIVF.adapter = adapterIvf + + /*Cycle Length*/ + val itemCycle = ArrayList() + for (i in 20..35) { + if (i == 20) itemCycle.add(getString(R.string.i_dont_know)) + else itemCycle.add("$i ${getString(R.string.days)}") + } + + val adapterCycle = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, itemCycle) + binding.spnCycleLength.adapter = adapterCycle + + /*Days*/ + val itemDays = ArrayList() + for (i in 0..6) { + if (i == 1) itemDays.add("$i ${getString(R.string.day)}") + else itemDays.add("$i ${getString(R.string.days)}") + } + + val adapterDays = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, itemDays) + binding.spnDays.adapter = adapterDays + + /*Weeks*/ + val itemWeeks = ArrayList() + for (i in 1..24) { + if (i == 1) itemWeeks.add("$i ${getString(R.string.week)}") + else itemWeeks.add("$i ${getString(R.string.weeks)}") + } + + val adapterWeek = ArrayAdapter(requireContext(), android.R.layout.simple_spinner_dropdown_item, itemWeeks) + binding.spnWeek.adapter = adapterWeek + } + + + fun itemRelationClick(pos: Int) { + binding.rvListIVF.gone() + binding.tvTitle2.gone() + binding.tvCycle.gone() + binding.tvWeek.gone() + binding.tvDay.gone() + + binding.tvDate.text = "" + binding.spnCycleLength.setSelection(0) + binding.spnWeek.setSelection(0) + binding.spnDays.setSelection(0) + + when (pos) { + 0 -> { + binding.tvTitle2.visible() + binding.tvCycle.visible() + + binding.tvTitleDate.text = getString(R.string.the_first_day_of_your_last_period) + binding.tvTitle2.text = getString(R.string.cycle_length) + + } + 1 -> { + binding.tvTitleDate.text = getString(R.string.date_of_conception) + } + 2 -> { + binding.tvTitle2.visible() + binding.rvListIVF.visible() + + binding.tvTitleDate.text = getString(R.string.date_of_transfer) + binding.tvTitle2.text = getString(R.string.ivf_transfer_date) + + } + 3 -> { + binding.tvTitleDate.text = getString(R.string.date_of_ultrasound) + binding.tvWeek.visible() + binding.tvDay.visible() + + } + } + } + + override fun onDateSelected(date: String) { + binding.tvDate.text = DateUtils.dateFormatChange(DateFormat.MON_DATE_YEAR, + DateFormat.MON_DATE_YEAR, date) + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/protienintake/ProteinIntakeFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/protienintake/ProteinIntakeFragment.kt new file mode 100644 index 0000000..f261355 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/protienintake/ProteinIntakeFragment.kt @@ -0,0 +1,241 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.protienintake + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DatesAvailability +import com.consultantvendor.data.models.responses.WaterIntake +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentProteinIntakeBinding +import com.consultantvendor.ui.dashboard.home.healthtool.waterintake.BottomWaterLimitFragment +import com.consultantvendor.ui.dashboard.home.healthtool.waterintake.WaterIntakeAdapter +import com.consultantvendor.ui.dashboard.home.healthtool.waterintake.WaterIntakeViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + +class ProteinIntakeFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentProteinIntakeBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var adapterIntake: WaterIntakeAdapter + + private var itemsIntake = ArrayList() + + private var intakeSelected = 0 + + private lateinit var viewModel: WaterIntakeViewModel + + var waterIntake: WaterIntake? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate( + inflater, + R.layout.fragment_protein_intake, + container, + false + ) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + hitApi() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WaterIntakeViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvTakeProtein.setOnClickListener { + when { + waterIntake?.limit == null -> { + bottomDailyLimit() + } + intakeSelected == 0 -> { + binding.tvTakeProtein.showSnackBar(getString(R.string.select_amount_protein)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["quantity"] = intakeSelected + + viewModel.setProteinIntake(hashMap) + } + } + } + + binding.tvSet.setOnClickListener { + bottomDailyLimit() + } + } + + private fun bottomDailyLimit() { + val fragment = BottomWaterLimitFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + + private fun setAdapter() { + itemsIntake.clear() + var date: DatesAvailability + var waterIntake = 0 + for (i in 0..4) { + date = DatesAvailability() + waterIntake += 25 + date.intakeAmount = waterIntake + + itemsIntake.add(date) + } + + adapterIntake = WaterIntakeAdapter(this, itemsIntake) + binding.rvProteinIntake.adapter = adapterIntake + + } + + fun onWaterSelected(item: DatesAvailability) { + binding.rvProteinIntake.smoothScrollToPosition(itemsIntake.indexOf(item)) + intakeSelected = item.intakeAmount ?: 0 + } + + fun setDailyLimit(limit: String) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["limit"] = limit + + viewModel.setProteinDailyLimit(hashMap) + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + viewModel.getProteinIntake(HashMap()) + } + } + + private fun bindObservers() { + viewModel.getProteinIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.setProteinIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + itemsIntake.forEachIndexed { index, datesAvailability -> + itemsIntake[index].isSelected = false + } + adapterIntake.notifyDataSetChanged() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.setProteinDailyLimit.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setData() { + binding.tvSet.visible() + binding.tvDailyLimitV.text = + getProteinUnit(requireActivity(), waterIntake?.limit?.toInt() ?: 0, true) + binding.tvIntakeV.text = + getProteinUnit(requireActivity(), waterIntake?.today_intake?.toInt() ?: 0, true) + + binding.tvDaysCompletedV.text = waterIntake?.total_achieved_goal ?: getString(R.string.na) + + val todayIntake = waterIntake?.today_intake ?: 0.0 + val dailyLimit = waterIntake?.limit ?: 0.0 + + val percentage = ((todayIntake / dailyLimit) * 100).toInt() + binding.progress.progress = if (percentage > 100) 100 else percentage + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/BottomWaterLimitFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/BottomWaterLimitFragment.kt new file mode 100644 index 0000000..a0d760e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/BottomWaterLimitFragment.kt @@ -0,0 +1,92 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.waterintake + +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.databinding.BottomWaterLimitBinding +import com.consultantvendor.di.DaggerBottomSheetDialogFragment +import com.consultantvendor.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.hideKeyboard +import com.consultantvendor.utils.showSnackBar +import javax.inject.Inject + + +class BottomWaterLimitFragment(private val fragment: Fragment) : + DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomWaterLimitBinding + + + override fun setupDialog(dialog: Dialog, style: Int) { + super.setupDialog(dialog, style) + + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + //dialog.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_water_limit, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + if (fragment is WaterIntakeFragment) { + if (fragment.waterIntake?.limit != null) + binding.etWaterIntake.setText(fragment.waterIntake?.limit.toString()) + } else if (fragment is ProteinIntakeFragment) { + binding.tvDailyLimit.text = getString(R.string.set_you_protein_limit) + binding.ilWaterIntake.hint = getString(R.string.protein_intake_grams) + binding.tvSymbol.text = getString(R.string.g) + + if (fragment.waterIntake?.limit != null) + binding.etWaterIntake.setText(fragment.waterIntake?.limit.toString()) + } + + } + + private fun listeners() { + binding.tvSetLimit.setOnClickListener { + binding.etWaterIntake.hideKeyboard() + if (binding.etWaterIntake.text.toString().isEmpty()) { + binding.etWaterIntake.showSnackBar(getString(R.string.set_daily_limit)) + } else { + if (fragment is WaterIntakeFragment) + fragment.setDailyLimit(binding.etWaterIntake.text.toString()) + else if (fragment is ProteinIntakeFragment) + fragment.setDailyLimit(binding.etWaterIntake.text.toString()) + + dialog?.dismiss() + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeAdapter.kt new file mode 100644 index 0000000..98dc9c0 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeAdapter.kt @@ -0,0 +1,71 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.waterintake + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DatesAvailability +import com.consultantvendor.databinding.ItemWaterIntakeBinding +import com.consultantvendor.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantvendor.utils.getProteinUnit +import com.consultantvendor.utils.getWaterLiters +import java.util.* + +class WaterIntakeAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_water_intake, parent, false)) + } + + inner class ViewHolder(val binding: ItemWaterIntakeBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: DatesAvailability) = with(binding) { + + if (fragment is WaterIntakeFragment) + cbName.text = getWaterLiters(fragment.requireActivity(), item.intakeAmount + ?: 0, true) + else + cbName.text = getProteinUnit(fragment.requireActivity(), item.intakeAmount + ?: 0, true) + + cbName.isChecked = item.isSelected + + if (item.isSelected) { + cbName.setBackgroundResource(R.drawable.drawable_theme_60) + cbName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorWhite)) + } else { + cbName.setBackgroundResource(R.drawable.drawable_stroke_inactive) + cbName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorBlack)) + } + + + clWater.setOnClickListener { + if (!item.isSelected) { + for (count: Int in 0 until items.size) { + items[count].isSelected = count == adapterPosition + notifyItemChanged(count) + } + + if (fragment is WaterIntakeFragment) + fragment.onWaterSelected(item) + else if (fragment is ProteinIntakeFragment) + fragment.onWaterSelected(item) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeFragment.kt new file mode 100644 index 0000000..fbba8c5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeFragment.kt @@ -0,0 +1,240 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.waterintake + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DatesAvailability +import com.consultantvendor.data.models.responses.WaterIntake +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentWaterIntakeBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + +class WaterIntakeFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentWaterIntakeBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var adapterIntake: WaterIntakeAdapter + + private var itemsIntake = ArrayList() + + private var intakeSelected = 0 + + private lateinit var viewModel: WaterIntakeViewModel + + var waterIntake: WaterIntake? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_water_intake, container, false) + rootView = binding.root + + initialise() + listeners() + setAdapter() + bindObservers() + hitApi() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WaterIntakeViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvDrink.setOnClickListener { + when { + waterIntake?.limit == null -> { + bottomDailyLimit() + } + intakeSelected == 0 -> { + binding.tvDrink.showSnackBar(getString(R.string.select_amount)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["quantity"] = + getWaterLiters(requireActivity(), intakeSelected, false) + + viewModel.setWaterIntake(hashMap) + } + } + } + + binding.tvSet.setOnClickListener { + bottomDailyLimit() + } + } + + private fun bottomDailyLimit() { + val fragment = BottomWaterLimitFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + + private fun setAdapter() { + itemsIntake.clear() + var date: DatesAvailability + var waterIntake = 0 + for (i in 0..4) { + date = DatesAvailability() + if (i == 0) + date.intakeAmount = 100 + else { + waterIntake += 250 + date.intakeAmount = waterIntake + } + itemsIntake.add(date) + } + + adapterIntake = WaterIntakeAdapter(this, itemsIntake) + binding.rvWaterIntake.adapter = adapterIntake + + } + + fun onWaterSelected(item: DatesAvailability) { + binding.rvWaterIntake.smoothScrollToPosition(itemsIntake.indexOf(item)) + intakeSelected = item.intakeAmount ?: 0 + } + + fun setDailyLimit(limit: String) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["limit"] = limit + + viewModel.setDailyLimit(hashMap) + } + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + viewModel.getWaterIntake(HashMap()) + } + } + + private fun bindObservers() { + viewModel.getWaterIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.setWaterIntake.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + itemsIntake.forEachIndexed { index, datesAvailability -> + itemsIntake[index].isSelected = false + } + adapterIntake.notifyDataSetChanged() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.setDailyLimit.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + waterIntake = it.data + setData() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + private fun setData() { + binding.tvSet.visible() + binding.tvDailyLimitV.text = + getWaterUnit(requireActivity(), waterIntake?.limit ?: 0.0, true) + binding.tvIntakeV.text = + getWaterUnit(requireActivity(), waterIntake?.today_intake ?: 0.0, true) + + binding.tvDaysCompletedV.text = waterIntake?.total_achieved_goal ?: getString(R.string.na) + + val todayIntake = waterIntake?.today_intake ?: 0.0 + val dailyLimit = waterIntake?.limit ?: 0.0 + + var percentage = todayIntake / dailyLimit + if (percentage > 1) + percentage = 1.0 + binding.animationView.setMinAndMaxProgress(0.0f, percentage.toFloat()) + binding.animationView.playAnimation() + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeViewModel.kt new file mode 100644 index 0000000..84fdf2e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/healthtool/waterintake/WaterIntakeViewModel.kt @@ -0,0 +1,168 @@ +package com.consultantvendor.ui.dashboard.home.healthtool.waterintake + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.WaterIntake +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class WaterIntakeViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val setDailyLimit by lazy { SingleLiveEvent>() } + + val getWaterIntake by lazy { SingleLiveEvent>() } + + val setWaterIntake by lazy { SingleLiveEvent>() } + + val setProteinDailyLimit by lazy { SingleLiveEvent>() } + + val getProteinIntake by lazy { SingleLiveEvent>() } + + val setProteinIntake by lazy { SingleLiveEvent>() } + + + fun setDailyLimit(hashMap: HashMap) { + setDailyLimit.value = Resource.loading() + + webService.setDailyLimit(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setDailyLimit.value = Resource.success(response.body()?.data) + } else { + setDailyLimit.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setDailyLimit.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun setWaterIntake(hashMap: HashMap) { + setWaterIntake.value = Resource.loading() + + webService.setWaterIntake(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setWaterIntake.value = Resource.success(response.body()?.data) + } else { + setWaterIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setWaterIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun getWaterIntake(hashMap: HashMap) { + getWaterIntake.value = Resource.loading() + + webService.getWaterLimit(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getWaterIntake.value = Resource.success(response.body()?.data) + } else { + getWaterIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getWaterIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun setProteinDailyLimit(hashMap: HashMap) { + setProteinDailyLimit.value = Resource.loading() + + webService.setProteinDailyLimit(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setProteinDailyLimit.value = Resource.success(response.body()?.data) + } else { + setProteinDailyLimit.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setProteinDailyLimit.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun setProteinIntake(hashMap: HashMap) { + setProteinIntake.value = Resource.loading() + + webService.setProteinIntake(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + setProteinIntake.value = Resource.success(response.body()?.data) + } else { + setProteinIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + setProteinIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getProteinIntake(hashMap: HashMap) { + getProteinIntake.value = Resource.loading() + + webService.getProteinIntake(hashMap).enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getProteinIntake.value = Resource.success(response.body()?.data) + } else { + getProteinIntake.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getProteinIntake.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/items/ArticleAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/items/ArticleAdapter.kt new file mode 100644 index 0000000..48ce706 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/items/ArticleAdapter.kt @@ -0,0 +1,88 @@ +package com.consultantvendor.ui.dashboard.home.items + +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemArticleHomeBinding +import com.consultantvendor.ui.dashboard.home.HomeFragment +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* + + +class ArticleAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_article_home, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemArticleHomeBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.cvBlog.setOnClickListener { + fragment.startActivityForResult(Intent(fragment.requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.BLOGS_DETAILS) + .putExtra(EXTRA_REQUEST_ID, items[adapterPosition]), AppRequestCode.ARTICLE_CHANGES) + } + + binding.ivFavourite.setOnClickListener { + (fragment as HomeFragment).clickFavourite(items[adapterPosition]) + } + } + + fun bind(item: Feed) = with(binding) { + tvName.text = item.title + tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, item.created_at) + loadImage("tag",ivImage, item.image, R.drawable.image_placeholder) + + tvViews.text = binding.root.context.getString(R.string.s_views, item.views) + + if (item.is_favorite == true) + ivFavourite.setImageResource(R.drawable.ic_like_red) + else + ivFavourite.setImageResource(R.drawable.ic_like_white) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/items/HealthToolsAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/items/HealthToolsAdapter.kt new file mode 100644 index 0000000..f67422b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/items/HealthToolsAdapter.kt @@ -0,0 +1,75 @@ +package com.consultantvendor.ui.dashboard.home.items + +import android.content.Intent +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.databinding.RvItemHealthToolsBinding +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.PAGE_TO_OPEN + + +class HealthToolsAdapter(private val fragmentMain: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_health_tools, parent, false)) + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: RvItemHealthToolsBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clHealthTools.setOnClickListener { + when (adapterPosition) { + 0 -> openPage(DrawerActivity.BMI_CHECKER) + 1 -> openPage(DrawerActivity.WATER_INTAKE) + 2 -> openPage(DrawerActivity.PROTEIN_INTAKE) + 3 -> openPage(DrawerActivity.PREGNANCY_CALCULATOR) + } + } + } + + private fun openPage(page: String) { + fragmentMain.startActivity(Intent(fragmentMain.requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, page)) + } + + fun bind(item: String) = with(binding) { + val context = binding.root.context + tvName.text = item + + when (adapterPosition) { + 0 -> { + tvDesc.text = context.getString(R.string.health_tool_1_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_1) + } + 1 -> { + tvDesc.text = context.getString(R.string.health_tool_2_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_2) + } + 2 -> { + tvDesc.text = context.getString(R.string.health_tool_3_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_3) + } + 3 -> { + tvDesc.text = context.getString(R.string.health_tool_4_desc) + ivImage.setImageResource(R.drawable.ic_health_tool_4) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/AddPrescriptionViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/AddPrescriptionViewModel.kt new file mode 100644 index 0000000..dff7f18 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/AddPrescriptionViewModel.kt @@ -0,0 +1,43 @@ +package com.consultantvendor.ui.dashboard.home.prescription + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.requests.AddPrescription +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class AddPrescriptionViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val prescreptions by lazy { SingleLiveEvent>() } + + fun prescreptions(addPrescription: AddPrescription) { + prescreptions.value = Resource.loading() + + webService.prescreptions(addPrescription) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + prescreptions.value = Resource.success(response.body()?.data) + } else { + prescreptions.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + prescreptions.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/BottomPrescriptionFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/BottomPrescriptionFragment.kt new file mode 100644 index 0000000..dfcdaec --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/BottomPrescriptionFragment.kt @@ -0,0 +1,87 @@ +package com.consultantvendor.ui.dashboard.home.prescription + +import android.app.Dialog +import android.content.Intent +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.DialogFragment +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.databinding.BottomPrescriptionBinding +import com.consultantvendor.di.DaggerBottomSheetDialogFragment +import com.consultantvendor.ui.dashboard.home.appointment.detail.AppointmentDetailsFragment +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.EXTRA_REQUEST_ID +import com.consultantvendor.utils.PAGE_TO_OPEN +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.PrescriptionType +import com.google.android.material.bottomsheet.BottomSheetBehavior +import com.google.android.material.bottomsheet.BottomSheetDialog +import javax.inject.Inject + + +class BottomPrescriptionFragment(private val fragment: AppointmentDetailsFragment, private val request: Request) : DaggerBottomSheetDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: BottomPrescriptionBinding + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val dialog = super.onCreateDialog(savedInstanceState) as BottomSheetDialog + dialog.behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog.setCanceledOnTouchOutside(true) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.bottom_prescription, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + } + + private fun initialise() { + + + } + + private fun listeners() { + + binding.tvManual.setOnClickListener { + fragment.registerActivityResult.launch(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, PrescriptionType.MANUAL) + .putExtra(EXTRA_REQUEST_ID, request)) + dialog?.dismiss() + } + + binding.tvDigital.setOnClickListener { + fragment.registerActivityResult.launch(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, PrescriptionType.DIGITAL) + .putExtra(EXTRA_REQUEST_ID, request)) + dialog?.dismiss() + } + + binding.tvCancel.setOnClickListener { + dialog?.dismiss() + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/DigitalPrescriptionFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/DigitalPrescriptionFragment.kt new file mode 100644 index 0000000..7fda43a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/DigitalPrescriptionFragment.kt @@ -0,0 +1,317 @@ +package com.consultantvendor.ui.dashboard.home.prescription.digital + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.AddPrescription +import com.consultantvendor.data.models.requests.DigitalPrescription +import com.consultantvendor.data.models.requests.Doases +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentDigitalPrescriptionBinding +import com.consultantvendor.ui.dashboard.home.prescription.AddPrescriptionViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class DigitalPrescriptionFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + lateinit var binding: FragmentDigitalPrescriptionBinding + + private var rootView: View? = null + + private lateinit var addPrescriptionViewModel: AddPrescriptionViewModel + + private lateinit var progressDialog: ProgressDialog + + private var doseadAdapter: ItemDoasesAdapter? = null + + private var itemDoases = ArrayList() + + private var itemPrescription = ArrayList() + + private var prescriptionAdapter: ItemPrescriptionAdapter? = null + + private var request: Request? = null + + private var addPrescription: AddPrescription? = null + + private var editPosition = -1 + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_digital_prescription, container, false) + rootView = binding.root + + initialise() + setAdapter() + setEditPrescriptionData() + listeners() + bindObservers() + } + return rootView + } + + + private fun initialise() { + addPrescriptionViewModel = ViewModelProvider(this, viewModelFactory)[AddPrescriptionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + editTextScroll(binding.etPrescriptionNotes) + request = requireActivity().intent.getSerializableExtra(EXTRA_REQUEST_ID) as Request + + binding.tvName.text = request?.from_user?.name + binding.tvAge.text = "${getAge(request?.from_user?.profile?.dob)} ${getString(R.string.years_old)}" + loadImage("profile",binding.ivPic, request?.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + binding.tvAppointmentV.text = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request?.bookingDateUTC)} · " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request?.bookingDateUTC)}" + } + + private fun setEditPrescriptionData() { + if (request?.pre_scription != null) { + val prescription = request?.pre_scription + binding.etPrescriptionNotes.setText(prescription?.pre_scription_notes) + + itemPrescription.clear() + itemPrescription.addAll(prescription?.medicines ?: emptyList()) + prescriptionAdapter?.notifyDataSetChanged() + + if (itemPrescription.isNotEmpty()) { + binding.tvPrescriptions.visible() + binding.rvPrescriptions.visible() + } + } + } + + private fun setAdapter() { + + itemDoases = ArrayList() + var doase = Doases() + doase.time = getString(R.string.breakfast) + doase.checked = true + itemDoases.add(doase) + + doase = Doases() + doase.time = getString(R.string.lunch) + itemDoases.add(doase) + + doase = Doases() + doase.time = getString(R.string.dinner) + itemDoases.add(doase) + + doseadAdapter = ItemDoasesAdapter(this, itemDoases) + binding.rvDoasesTiming.adapter = doseadAdapter + + prescriptionAdapter = ItemPrescriptionAdapter(this, itemPrescription) + binding.rvPrescriptions.adapter = prescriptionAdapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.spnDosagesType.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + doseadAdapter?.notifyDataSetChanged() + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + } + } + + binding.tvAdd.setOnClickListener { + binding.tvAdd.hideKeyboard() + when { + binding.etMedicineName.text.toString().trim().isEmpty() -> { + binding.etMedicineName.showSnackBar(getString(R.string.medicine_name)) + } + binding.spnDuration.selectedItemPosition == 0 -> { + binding.tvDuration.showSnackBar(getString(R.string.duration)) + } + binding.spnDosagesType.selectedItemPosition == 0 -> { + binding.tvDosagesType.showSnackBar(getString(R.string.dosage_type)) + } + else -> { + var addItem = false + itemDoases.forEachIndexed { index, doases -> + if (doases.checked == true) { + addItem = true + if (doases.dose_value.isNullOrEmpty()) { + addItem = false + binding.etMedicineName.showSnackBar(getString(R.string.select_doasages_for, doases.time)) + return@setOnClickListener + } + } + } + + if (addItem) { + val prescription = DigitalPrescription() + prescription.medicine_name = binding.etMedicineName.text.toString().trim() + prescription.duration = binding.spnDuration.selectedItem.toString() + prescription.dosage_type = binding.spnDosagesType.selectedItem.toString() + prescription.dosage_timing = ArrayList() + + itemDoases.forEach { + val digitalDose: Doases + if (it.checked == true) { + digitalDose = Doases() + digitalDose.time = it.time + digitalDose.with = it.with + digitalDose.dose_value = it.dose_value + digitalDose.checked = null + + prescription.dosage_timing?.add(digitalDose) + } + } + + /*If edit item*/ + if (binding.tvAdd.text == getString(R.string.edit)) + itemPrescription.set(editPosition, prescription) + else + itemPrescription.add(prescription) + prescriptionAdapter?.notifyDataSetChanged() + + editPosition = -1 + requireActivity().longToast(getString(R.string.prescription_added)) + + if (itemPrescription.size == 1) { + binding.tvPrescriptions.visible() + binding.rvPrescriptions.visible() + } + + /*Clear item*/ + binding.tvReset.performClick() + + } else { + binding.etMedicineName.showSnackBar(getString(R.string.select_dosage_timings)) + } + } + } + } + + binding.tvReset.setOnClickListener { + binding.tvAdd.hideKeyboard() + editPosition = -1 + + binding.tvAdd.text = getString(R.string.add) + binding.etMedicineName.setText("") + binding.spnDuration.setSelection(0) + binding.spnDosagesType.setSelection(0) + + itemDoases.forEachIndexed { index, doases -> + itemDoases[index].checked = index == 0 + itemDoases[index].with = getString(R.string.before) + itemDoases[index].dose_value = "" + } + doseadAdapter?.notifyDataSetChanged() + } + + binding.tvDone.setOnClickListener { + binding.tvAdd.hideKeyboard() + when { + itemPrescription.isEmpty() -> { + binding.etMedicineName.showSnackBar(getString(R.string.add_digital_prescription)) + } + binding.etPrescriptionNotes.text.toString().trim().isEmpty() -> { + binding.tvDosagesType.showSnackBar(getString(R.string.add_notes)) + } + isConnectedToInternet(requireContext(), true) -> { + addPrescription = AddPrescription() + addPrescription?.request_id = request?.id + addPrescription?.type = PrescriptionType.DIGITAL + + addPrescription?.pre_scription_notes = binding.etPrescriptionNotes.text.toString().trim() + addPrescription?.pre_scriptions = ArrayList() + addPrescription?.pre_scriptions?.addAll(itemPrescription) + + addPrescriptionViewModel.prescreptions(addPrescription ?: AddPrescription()) + } + } + } + } + + fun deletePrescription(pos: Int) { + itemPrescription.removeAt(pos) + prescriptionAdapter?.notifyDataSetChanged() + + if (editPosition == pos) { + binding.tvReset.performClick() + } + + if (itemPrescription.isEmpty()) + binding.tvPrescriptions.gone() + } + + fun editPrescription(pos: Int) { + binding.tvAdd.hideKeyboard() + + editPosition = pos + + binding.tvAdd.text = getString(R.string.edit) + + val item = itemPrescription[editPosition] + binding.etMedicineName.setText(item.medicine_name) + + val duration = resources.getStringArray(R.array.duration) + binding.spnDuration.setSelection(duration.indexOf(item.duration)) + + val dose_type = resources.getStringArray(R.array.dose_type) + binding.spnDosagesType.setSelection(dose_type.indexOf(item.dosage_type)) + + item.dosage_timing?.forEachIndexed { index, doases -> + itemDoases.forEachIndexed { indexInternal, doasesInternal -> + if (doases.time == doasesInternal.time) { + itemDoases[indexInternal].checked = true + itemDoases[indexInternal].with = doases.with + itemDoases[indexInternal].dose_value = doases.dose_value + + return@forEachIndexed + } + } + } + doseadAdapter?.notifyDataSetChanged() + + } + + private fun bindObservers() { + addPrescriptionViewModel.prescreptions.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/ItemDoasesAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/ItemDoasesAdapter.kt new file mode 100644 index 0000000..f0e2adc --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/ItemDoasesAdapter.kt @@ -0,0 +1,128 @@ +package com.consultantvendor.ui.dashboard.home.prescription.digital + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.Doases +import com.consultantvendor.databinding.RvItemDoasesBinding +import com.consultantvendor.utils.hideShowView + + +class ItemDoasesAdapter(private val fragment: DigitalPrescriptionFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_doases, parent, false)) + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: RvItemDoasesBinding) : + RecyclerView.ViewHolder(binding.root) { + + val context = binding.root.context + val doases = context.resources.getStringArray(R.array.doases) + + init { + binding.cbBreakfast.setOnCheckedChangeListener { compoundButton, b -> + binding.group.hideShowView(b) + items[adapterPosition].checked = b + } + + binding.spnDosage.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>?, selectedItemView: View?, position: Int, id: Long) { + if (position == 0) + items[adapterPosition].dose_value = "" + else + items[adapterPosition].dose_value = binding.spnDosage.selectedItem.toString() + } + + override fun onNothingSelected(parentView: AdapterView<*>?) { + // your code here + } + } + + binding.tvBreakfastSave.setOnClickListener { + binding.group.hideShowView(false) + } + + binding.tvBefore.setOnClickListener { + makeActiveInactive(binding.tvBefore.text.toString()) + } + + binding.tvAfter.setOnClickListener { + makeActiveInactive(binding.tvAfter.text.toString()) + } + + binding.tvWith.setOnClickListener { + makeActiveInactive(binding.tvWith.text.toString()) + } + + } + + private fun makeActiveInactive(text: String) { + items[adapterPosition].with = text + when (text) { + context.getString(R.string.before), "" -> { + binding.tvBefore.setBackgroundResource(R.drawable.drawable_doase_left_s) + binding.tvBefore.setTextColor(ContextCompat.getColor(context, R.color.colorWhite)) + binding.tvAfter.setBackgroundResource(R.drawable.drawable_doase_midle) + binding.tvAfter.setTextColor(ContextCompat.getColor(context, R.color.colorBlack)) + binding.tvWith.setBackgroundResource(R.drawable.drawable_doase_right) + binding.tvWith.setTextColor(ContextCompat.getColor(context, R.color.colorBlack)) + } + context.getString(R.string.after) -> { + binding.tvBefore.setBackgroundResource(R.drawable.drawable_doase_left) + binding.tvBefore.setTextColor(ContextCompat.getColor(context, R.color.colorBlack)) + binding.tvAfter.setBackgroundResource(R.drawable.drawable_doase_midle_s) + binding.tvAfter.setTextColor(ContextCompat.getColor(context, R.color.colorWhite)) + binding.tvWith.setBackgroundResource(R.drawable.drawable_doase_right) + binding.tvWith.setTextColor(ContextCompat.getColor(context, R.color.colorBlack)) + } + context.getString(R.string.with) -> { + binding.tvBefore.setBackgroundResource(R.drawable.drawable_doase_left) + binding.tvBefore.setTextColor(ContextCompat.getColor(context, R.color.colorBlack)) + binding.tvAfter.setBackgroundResource(R.drawable.drawable_doase_midle) + binding.tvAfter.setTextColor(ContextCompat.getColor(context, R.color.colorBlack)) + binding.tvWith.setBackgroundResource(R.drawable.drawable_doase_right_s) + binding.tvWith.setTextColor(ContextCompat.getColor(context, R.color.colorWhite)) + } + } + } + + fun bind(item: Doases) = with(binding) { + binding.tvDosage.text = fragment.binding.spnDosagesType.selectedItem.toString() + + cbBreakfast.text = item.time + + cbBreakfast.isChecked = item.checked ?: false + group.hideShowView(item.checked == true) + + if (item.checked == true) { + if (item.dose_value.isNullOrEmpty()) { + spnDosage.setSelection(0) + makeActiveInactive(context.getString(R.string.before)) + } else { + makeActiveInactive(item.with ?: "") + binding.spnDosage.setSelection(doases.indexOf(item.dose_value)) + } + } else { + makeActiveInactive(context.getString(R.string.before)) + spnDosage.setSelection(0) + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/ItemPrescriptionAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/ItemPrescriptionAdapter.kt new file mode 100644 index 0000000..351a6bb --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/digital/ItemPrescriptionAdapter.kt @@ -0,0 +1,47 @@ +package com.consultantvendor.ui.dashboard.home.prescription.digital + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DigitalPrescription +import com.consultantvendor.databinding.RvItemPrescriptionBinding + + +class ItemPrescriptionAdapter(private val fragment: DigitalPrescriptionFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_prescription, parent, false)) + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemPrescriptionBinding) : + RecyclerView.ViewHolder(binding.root) { + + val context = binding.root.context + + init { + binding.tvEdit.setOnClickListener { + fragment.editPrescription(adapterPosition) + } + + binding.tvDelete.setOnClickListener { + fragment.deletePrescription(adapterPosition) + } + } + + fun bind(item: DigitalPrescription) = with(binding) { + tvName.text = "${item.medicine_name}\n(${item.duration}) (${item.dosage_type})" + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/manual/ImagesAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/manual/ImagesAdapter.kt new file mode 100644 index 0000000..41b54fd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/manual/ImagesAdapter.kt @@ -0,0 +1,87 @@ +package com.consultantvendor.ui.dashboard.home.prescription.manual + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DocImage +import com.consultantvendor.databinding.RvItemImageBinding +import com.consultantvendor.utils.gone +import com.consultantvendor.utils.loadImage +import com.consultantvendor.utils.visible + + +class ImagesAdapter(private val fragment: ManualPrescriptionFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + val MAX_ITEM = 3 + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + if (items.isEmpty() || (position == 0 && items.size < MAX_ITEM)) + holder.bind(null) + else if (items.size == MAX_ITEM) + holder.bind(items[position]) + else + holder.bind(items[position - 1]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_image, parent, false)) + + } + + override fun getItemCount(): Int = if (items.size == MAX_ITEM) items.size else items.size + 1 + + inner class ViewHolder(val binding: RvItemImageBinding) : + RecyclerView.ViewHolder(binding.root) { + + val context = binding.root.context + + init { + binding.ivImage.setOnClickListener { + if (items.size < MAX_ITEM && bindingAdapterPosition == 0) { + fragment.clickItem() + } + } + + binding.ivDelete.setOnClickListener { + if (items.size == MAX_ITEM) + items.removeAt(bindingAdapterPosition) + else + items.removeAt(bindingAdapterPosition - 1) + + notifyDataSetChanged() + } + } + + + fun bind(item: DocImage?) = with(binding) { + ivImage.setBackgroundResource(R.drawable.drawable_grey_stroke) + if (items.size < MAX_ITEM && bindingAdapterPosition == 0) { + ivImage.setImageResource(R.drawable.ic_camera) + ivDelete.gone() + } else { + when { + item?.imageFile!=null -> { + Glide.with(context).load(item.imageFile).into(ivImage) + ivDelete.visible() + } + !item?.image.isNullOrEmpty() -> { + Glide.with(context).load(item).into(ivImage) + loadImage("tag",binding.ivImage, item?.image, R.drawable.image_placeholder) + ivDelete.visible() + } + else -> { + ivImage.setImageResource(R.drawable.ic_camera) + ivDelete.gone() + } + } + } + } + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/manual/ManualPrescriptionFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/manual/ManualPrescriptionFragment.kt new file mode 100644 index 0000000..f1f4136 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/prescription/manual/ManualPrescriptionFragment.kt @@ -0,0 +1,384 @@ +package com.consultantvendor.ui.dashboard.home.prescription.manual + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.app.AlertDialog +import android.app.Dialog +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.provider.MediaStore +import android.provider.Settings +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.Window +import android.widget.Toast +import androidx.annotation.RequiresApi +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.AddPrescription +import com.consultantvendor.data.models.requests.DocImage +import com.consultantvendor.data.models.responses.Request +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentManualPrescriptionBinding +import com.consultantvendor.databinding.ItemDialogImageBinding +import com.consultantvendor.ui.chat.UploadFileViewModel +import com.consultantvendor.ui.dashboard.home.prescription.AddPrescriptionViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.PermissionUtils +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.consultantvendor.utils.dialogs.ProgressDialogImage +import com.facebook.common.util.UriUtil.getRealPathFromUri +import com.karumi.dexter.Dexter +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionDeniedResponse +import com.karumi.dexter.listener.PermissionGrantedResponse +import com.karumi.dexter.listener.single.PermissionListener +import dagger.android.support.DaggerFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import javax.inject.Inject + +@RuntimePermissions +class ManualPrescriptionFragment : BasePhotoUplaodFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentManualPrescriptionBinding + + private var rootView: View? = null + + private lateinit var viewModelUpload: UploadFileViewModel + + private lateinit var addPrescriptionViewModel: AddPrescriptionViewModel + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private var imagesAdapter: ImagesAdapter? = null + + private var itemImages = ArrayList() + + private var request: Request? = null + + private var addPrescription: AddPrescription? = null + private var fileToUpload: File? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_manual_prescription, container, false) + rootView = binding.root + + initialise() + setAdapter() + setEditPrescriptionData() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + + private fun initialise() { + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + addPrescriptionViewModel = ViewModelProvider(this, viewModelFactory)[AddPrescriptionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + progressDialogImage = ProgressDialogImage(requireActivity()) + + request = requireActivity().intent.getSerializableExtra(EXTRA_REQUEST_ID) as Request + + binding.tvName.text = request?.from_user?.name + binding.tvAge.text = "${getAge(request?.from_user?.profile?.dob)} ${getString(R.string.years_old)}" + loadImage("profile",binding.ivPic, request?.from_user?.profile_image, + R.drawable.ic_profile_placeholder) + + binding.tvAppointmentV.text = "${DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, request?.bookingDateUTC)} · " + + "${DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, request?.bookingDateUTC)}" + } + + private fun setEditPrescriptionData() { + if (request?.pre_scription != null) { + val prescription = request?.pre_scription + binding.etRecordDetails.setText(prescription?.title) + + itemImages.clear() + var docImage: DocImage + prescription?.images?.forEach { + docImage = DocImage() + docImage.image = it + itemImages.add(docImage) + } + + imagesAdapter?.notifyDataSetChanged() + } + } + + private fun setAdapter() { + imagesAdapter = ImagesAdapter(this, itemImages) + binding.rvImages.adapter = imagesAdapter + } + + @SuppressLint("NewApi") + private fun listeners() { + binding.ivImage.setOnClickListener{ + showImageDialog(false) + } + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvDone.setOnClickListener { + when { + binding.etRecordDetails.text.toString().trim().isEmpty() -> { + binding.etRecordDetails.showSnackBar(getString(R.string.record_title)) + } + /* itemImages.isEmpty() -> { + binding.etRecordDetails.showSnackBar(getString(R.string.select_image)) + }*/ + isConnectedToInternet(requireContext(), true) -> { + addPrescription = AddPrescription() + addPrescription?.request_id = request?.id + addPrescription?.type = PrescriptionType.MANUAL + addPrescription?.title = binding.etRecordDetails.text.toString().trim() + + addPrescription?.image = ArrayList() + + itemImages.forEach { + if (it.imageFile != null) { + uploadFileOnServer(it) + return@forEach + } else if (!it.image.isNullOrEmpty()) { + addPrescription?.image?.add(it.image ?: "") + } + } + + if (addPrescription?.image?.size ?: 0 == itemImages.size) + addPrescriptionViewModel.prescreptions(addPrescription + ?: AddPrescription()) + //uploadFileOnServer(itemImages[0]) + } + } + } + } + + private fun hitApi(firstHit: Boolean) { + + } + + private fun uploadFileOnServer(docImage: DocImage?) { + + val hashMap = java.util.HashMap() + hashMap["type"] = getRequestBody(docImage?.type) + + val body: RequestBody = docImage?.imageFile?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + docImage?.imageFile?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + private fun bindObservers() { + viewModelUpload.uploadFile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + addPrescription?.image?.add(it.data?.image_name ?: "") + + if (addPrescription?.image?.size ?: 0 < itemImages.size) { + for (i in (addPrescription?.image?.size ?: 0)..itemImages.size) { + val docImage = itemImages[addPrescription?.image?.size ?: 0] + + if (docImage.imageFile != null) { + uploadFileOnServer(docImage) + break + } else if (!docImage.image.isNullOrEmpty()) { + addPrescription?.image?.add(docImage.image ?: "") + } + //uploadFileOnServer(itemImages[addPrescription?.image?.size ?: 0]) + } + + if (addPrescription?.image?.size ?: 0 == itemImages.size) + addPrescriptionViewModel.prescreptions(addPrescription + ?: AddPrescription()) + } else { + addPrescriptionViewModel.prescreptions(addPrescription ?: AddPrescription()) + } + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + + addPrescriptionViewModel.prescreptions.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + /*Adapter item click*/ + + @SuppressLint("NewApi") + fun clickItem() { + // getStorageWithPermissionCheck() + showImageDialog(false) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.IMAGE_PICKER -> { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + val fileToUpload = compressImage(requireActivity(),File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + // fileToUpload => /data/user/0/com.nurseLynx.expert/cache/images/Screenshot_20240622-122521.jpg + val docImage = DocImage() + docImage.type = DocType.IMAGE + // type= "IMAGE" + docImage.imageFile = fileToUpload + + itemImages.add(docImage) + imagesAdapter?.notifyDataSetChanged()*/ + } + } + + /* if (requestCode == AppRequestCode.IMAGE_PICKER) { + val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + val fileToUpload = File(getPathUri(requireContext(), docPaths[0])) + + itemImages.add(fileToUpload) + imagesAdapter?.notifyDataSetChanged() + }*/ + } + } + + override fun getPdf(uri: String?) { + + } + + override fun getImage(uri: String?, data: Uri/*, fileToUpload: File*/) { + /* Glide.with(requireContext()).load(uri).into(binding.ivImage) + + + val selectedImageUri: Uri? = data + selectedImageUri?.let { + val file: File? = uriToFile(requireContext(), it) + file?.let { + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = it + fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(),data))) + itemImages.add(docImage) + imagesAdapter?.notifyDataSetChanged() + } + }*/ + } + fun uriToFile(context: Context, uri: Uri): File? { + val path = getRealPathFromUri(context, uri) + return path?.let { File(it) } + } + + private fun getRealPathFromUri(context: Context, uri: Uri): String? { + var realPath: String? = null + // Depending on the URI scheme, use different query methods + if (uri.scheme == "content") { + // MediaStore (and general content provider) scheme + context.contentResolver.query(uri, null, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + realPath = cursor.getString(columnIndex) + } + } + } else if (uri.scheme == "file") { + // File scheme + realPath = uri.path + } + return realPath + } + + override fun getVideo(uri: String?, i: Int) { + TODO("Not yet implemented") + } + + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + selectImages(this, requireActivity()) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionViewModel.kt new file mode 100644 index 0000000..d7ea80e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionViewModel.kt @@ -0,0 +1,151 @@ +package com.consultantvendor.ui.dashboard.home.questions + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class QuestionViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val getQuestions by lazy { SingleLiveEvent>() } + + val getQuestionsDetails by lazy { SingleLiveEvent>() } + + val replyQuestion by lazy { SingleLiveEvent>() } + + val getMedicalHistory by lazy { SingleLiveEvent>() } + + val createMedicalHistory by lazy { SingleLiveEvent>() } + + + + fun getQuestions(hashMap: HashMap) { + getQuestions.value = Resource.loading() + + webService.getQuestions(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getQuestions.value = Resource.success(response.body()?.data) + } else { + getQuestions.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getQuestions.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getQuestionsDetails(hashMap: HashMap) { + getQuestionsDetails.value = Resource.loading() + + webService.getQuestionsDetails(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getQuestionsDetails.value = Resource.success(response.body()?.data) + } else { + getQuestionsDetails.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getQuestionsDetails.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun replyQuestion(hashMap: HashMap) { + replyQuestion.value = Resource.loading() + + webService.replyQuestion(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + replyQuestion.value = Resource.success(response.body()?.data) + } else { + replyQuestion.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + replyQuestion.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun createMedicalHistory(hashMap: HashMap) { + createMedicalHistory.value = Resource.loading() + + webService.createMedicalHistory(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + createMedicalHistory.value = Resource.success(response.body()?.data) + } else { + createMedicalHistory.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + createMedicalHistory.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getMedicalHistory(hashMap: HashMap) { + getMedicalHistory.value = Resource.loading() + + webService.getMedicalHistory(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getMedicalHistory.value = Resource.success(response.body()?.data) + } else { + getMedicalHistory.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getMedicalHistory.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionsAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionsAdapter.kt new file mode 100644 index 0000000..4c21653 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionsAdapter.kt @@ -0,0 +1,77 @@ +package com.consultantvendor.ui.dashboard.home.questions + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemQuestionBinding +import com.consultantvendor.ui.dashboard.home.questions.detail.QuestionDetailFragment +import com.consultantvendor.utils.EXTRA_REQUEST_ID +import com.consultantvendor.utils.getDoctorName +import com.consultantvendor.utils.loadImage +import com.consultantvendor.utils.replaceFragment + + +class QuestionsAdapter(private val fragmentMain: QuestionsFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_question, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemQuestionBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + val fragment = QuestionDetailFragment() + val bundle = Bundle() + bundle.putString(EXTRA_REQUEST_ID, items[adapterPosition].id) + fragment.arguments = bundle + replaceFragment(fragmentMain.requireActivity().supportFragmentManager, + fragment, R.id.container) + } + } + + fun bind(item: Feed) = with(binding) { + binding.tvName.text = getDoctorName(item.created_by) + loadImage("profile",binding.ivPic, item.created_by?.profile_image, + R.drawable.image_placeholder) + + tvTitle.text = item.title + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionsFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionsFragment.kt new file mode 100644 index 0000000..7770a60 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/QuestionsFragment.kt @@ -0,0 +1,229 @@ +package com.consultantvendor.ui.dashboard.home.questions + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.ActivityListingToolbarBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class QuestionsFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: QuestionViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: QuestionsAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var isReceiverRegistered = false + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate( + inflater, R.layout.activity_listing_toolbar, + container, false + ) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[QuestionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvHeader.text = getString(R.string.free_expert_advice) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_question) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_question_desc) + + } + + private fun setAdapter() { + adapter = QuestionsAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + hashMap["service_type"] = CallType.ALL + viewModel.getQuestions(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.getQuestions.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.questions ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onPause() { + super.onPause() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.FREE_EXPERT_ADVISE) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.FREE_EXPERT_ADVISE -> { + hitApi(true) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/detail/AnswersAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/detail/AnswersAdapter.kt new file mode 100644 index 0000000..ec36d5f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/detail/AnswersAdapter.kt @@ -0,0 +1,67 @@ +package com.consultantvendor.ui.dashboard.home.questions.detail + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemAnswerBinding +import com.consultantvendor.utils.DateUtils +import com.consultantvendor.utils.getDoctorName +import com.consultantvendor.utils.loadImage + + +class AnswersAdapter(private val fragment: Fragment, private val items: List) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_answer, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemAnswerBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + } + + fun bind(item: Feed) = with(binding) { + loadImage("tag",binding.ivPic, item.user?.profile_image, R.drawable.ic_profile_placeholder) + tvName.text = getDoctorName(item.user) + + tvComment.text = item.answer + tvTime.text= DateUtils.getTimeAgo(item.created_at) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/detail/QuestionDetailFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/detail/QuestionDetailFragment.kt new file mode 100644 index 0000000..152ffd4 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/home/questions/detail/QuestionDetailFragment.kt @@ -0,0 +1,216 @@ +package com.consultantvendor.ui.dashboard.home.questions.detail + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Feed +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentQuestionDetailBinding +import com.consultantvendor.ui.dashboard.home.questions.QuestionViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + + +class QuestionDetailFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentQuestionDetailBinding + + private var rootView: View? = null + + private var questionId: String? = null + + private var details: Feed? = null + + private var items = ArrayList() + + private lateinit var adapter: AnswersAdapter + + private lateinit var viewModel: QuestionViewModel + + private lateinit var progressDialog: ProgressDialog + + private var isReceiverRegistered = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_question_detail, + container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[QuestionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_answer) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_answer_desc) + + questionId = arguments?.getString(EXTRA_REQUEST_ID) + hitApi() + } + + private fun hitApi() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["question_id"] = questionId ?: "" + + viewModel.getQuestionsDetails(hashMap) + } + } + + private fun setAdapter() { + adapter = AnswersAdapter(this, items) + binding.rvAnswer.adapter = adapter + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivSend.setOnClickListener { + binding.etMessage.hideKeyboard() + when { + binding.etMessage.text.toString().trim().isEmpty() -> { + binding.etMessage.showSnackBar(getString(R.string.enter_message)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["question_id"] = questionId ?: "" + hashMap["answer"] = binding.etMessage.text.toString().trim() + viewModel.replyQuestion(hashMap) + } + } + } + } + + private fun setData() { + binding.rlMessage.hideShowView(details?.you_answered == false) + + binding.tvName.text = getDoctorName(details?.created_by) + loadImage("profile",binding.ivPic, details?.created_by?.profile_image, + R.drawable.image_placeholder) + + binding.tvTitle.text = details?.title + binding.tvDec.text = details?.description + + items.clear() + items.addAll(details?.answers ?: emptyList()) + adapter.notifyDataSetChanged() + + binding.clNoData.hideShowView(items.isEmpty()) + } + + private fun bindObservers() { + viewModel.getQuestionsDetails.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.clLoader.setBackgroundResource(0) + + details = it.data?.question + setData() + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.replyQuestion.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + hitApi() + binding.rlMessage.gone() + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onPause() { + super.onPause() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.FREE_EXPERT_ADVISE) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.FREE_EXPERT_ADVISE -> { + hitApi() + } + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/language/LanguageFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/language/LanguageFragment.kt new file mode 100644 index 0000000..0f8ab6b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/language/LanguageFragment.kt @@ -0,0 +1,101 @@ +package com.consultantvendor.ui.dashboard.language + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.app.ActivityCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentLanguageBinding +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class LanguageFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentLanguageBinding + + private var rootView: View? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_language, container, false) + rootView = binding.root + + initialise() + listeners() + } + return rootView + } + + private fun initialise() { + requireActivity().setResult(Activity.RESULT_OK) + + if (userRepository.isUserLoggedIn()) { + binding.toolbar.visible() + + val lan = userRepository.getUserLanguage() + if (lan == "en") + binding.rbEnglish.isChecked = true + else if (lan == "es") + binding.rbArabic.isChecked = true + } else { + binding.toolbar.gone() + } + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.rbLanguage.setOnCheckedChangeListener { radioGroup, i -> + if (isConnectedToInternet(requireContext(), true)) { + if (i == R.id.rbEnglish) { + prefsManager.save(USER_LANGUAGE, "en") + LocaleHelper.setLocale(requireActivity(), "en", prefsManager) + } else { + prefsManager.save(USER_LANGUAGE, "es") + LocaleHelper.setLocale(requireActivity(), "es", prefsManager) + } + + /*prefsManager.save(USER_LANGUAGE, "en") + LocaleHelper.setLocale(requireActivity(), "en", prefsManager)*/ + + /*get updated pages*/ + if (BuildConfig.FLAVOR == "homeDoctor") + userRepository.getPages() + + if (userRepository.isUserLoggedIn()) { + requireActivity().setResult(Activity.RESULT_CANCELED) + ActivityCompat.finishAffinity(requireActivity()) + + startActivity(Intent(activity, HomeActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + } else + requireActivity().finish() + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/location/AddAddressActivity.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/location/AddAddressActivity.kt new file mode 100644 index 0000000..f2aae28 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/location/AddAddressActivity.kt @@ -0,0 +1,347 @@ +package com.consultantvendor.ui.dashboard.location + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.location.Address +import android.location.Geocoder +import android.location.Location +import android.location.LocationManager +import android.os.Bundle +import android.os.Looper +import android.provider.Settings +import android.util.Log +import android.view.MotionEvent +import android.widget.Toast +import androidx.core.app.ActivityCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.SaveAddress +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityAddAddressBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.PermissionUtils +import com.google.android.gms.location.* +import com.google.android.gms.maps.CameraUpdateFactory +import com.google.android.gms.maps.GoogleMap +import com.google.android.gms.maps.OnMapReadyCallback +import com.google.android.gms.maps.SupportMapFragment +import com.google.android.gms.maps.model.CameraPosition +import com.google.android.gms.maps.model.LatLng +import com.google.android.libraries.places.widget.Autocomplete +import dagger.android.support.DaggerAppCompatActivity +import permissions.dispatcher.* +import java.util.* +import javax.inject.Inject + + +@RuntimePermissions +class AddAddressActivity : DaggerAppCompatActivity(), GoogleMap.OnCameraChangeListener, OnMapReadyCallback { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: ActivityAddAddressBinding + + private var saveAddress = SaveAddress() + + private var mapFragment: SupportMapFragment? = null + + private var isPlacePicker = false + + private var mMap: GoogleMap? = null + + private lateinit var geoCoder: Geocoder + + lateinit var mFusedLocationClient: FusedLocationProviderClient + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_add_address) + + setEditAddress() + initialise() + setListeners() + } + + private fun initialise() { + mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment + mapFragment?.getMapAsync(this) + + geoCoder = Geocoder(this, Locale.getDefault()) + mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + + getLocationWithPermissionCheck() + } + + private fun setEditAddress() { + if (intent.hasExtra(EXTRA_ADDRESS)) { + saveAddress = intent.getSerializableExtra(EXTRA_ADDRESS) as SaveAddress + saveAddress.addressId = saveAddress._id + binding.etLocation.setText(saveAddress.locationName) + isPlacePicker = true + } + } + + private fun setListeners() { + binding.toolbar.setNavigationOnClickListener { + onBackPressed() + } + + binding.tvChange.setOnClickListener { + placePicker(null, this) + } + + binding.btnSave.setOnClickListener { + checkValidations() + } + + binding.transparentImage.setOnTouchListener { v, event -> + when (event.action) { + MotionEvent.ACTION_DOWN -> { + // Disallow ScrollView to intercept touch events. + binding.scrollMap.requestDisallowInterceptTouchEvent(true) + // Disable touch on transparent view + false + } + + MotionEvent.ACTION_UP -> { + // Allow ScrollView to intercept touch events. + binding.scrollMap.requestDisallowInterceptTouchEvent(false) + true + } + + MotionEvent.ACTION_MOVE -> { + binding.scrollMap.requestDisallowInterceptTouchEvent(true) + false + } + + else -> true + } + } + } + + private fun checkValidations() { + binding.btnSave.hideKeyboard() + when { + binding.etLocation.text.toString().isEmpty() -> { + binding.etLocation.showSnackBar(getString(R.string.address)) + } + else -> { + val intent = Intent() + intent.putExtra(EXTRA_ADDRESS, saveAddress) + setResult(Activity.RESULT_OK, intent) + finish() + } + } + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + try { + if (resultCode == Activity.RESULT_OK) { + if (requestCode == AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) { + val place = Autocomplete.getPlaceFromIntent(data!!) + binding.etLocation.setText(getAddress(place)) + + saveAddress.locationName = binding.etLocation.text.toString() + + saveAddress.long = place.latLng?.longitude ?: 0.0 + saveAddress.lat = place.latLng?.latitude ?: 0.0 + + isPlacePicker = true + mMap?.moveCamera(CameraUpdateFactory.newLatLng(place.latLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(15f)) + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + } + } else if(resultCode == Activity.RESULT_CANCELED) { + // Handle the canceled case + Toast.makeText(this, "Activity canceled!", Toast.LENGTH_SHORT).show() + } + }catch (ex: Exception){ + Toast.makeText(this, ""+ex, Toast.LENGTH_SHORT).show() + ex.printStackTrace() + } + + } + + + override fun onCameraChange(cameraPosition: CameraPosition) { + if (!isPlacePicker) { + val latLng = mMap?.cameraPosition?.target + + saveAddress.long = latLng?.longitude ?: 0.0 + saveAddress.lat = latLng?.latitude ?: 0.0 + saveAddress.locationName = getAddress() + + binding.etLocation.setText(saveAddress.locationName) + } + isPlacePicker = false + } + + override fun onMapReady(googleMap: GoogleMap) { + mMap = googleMap + mMap?.isTrafficEnabled = false + mMap?.setOnCameraChangeListener(this) + + // mMap?.isMyLocationEnabled = true + mMap?.uiSettings?.isMyLocationButtonEnabled = true + + if (saveAddress.lat != null) { + binding.etLocation.setText(saveAddress.locationName) + val current = LatLng(saveAddress.lat ?: 0.0, saveAddress.long ?: 0.0) + mMap?.moveCamera(CameraUpdateFactory.newLatLng(current)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(15f)) + } + } + + @SuppressLint("MissingPermission") + private fun getLastLocation() { + if (checkPermissions()) { + if (isLocationEnabled()) { + mFusedLocationClient.lastLocation.addOnCompleteListener(this) { task -> + val mLastLocation: Location? = task.result + if (mLastLocation != null) { + val latLng = LatLng(mLastLocation.latitude, mLastLocation.longitude) + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(latLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + saveAddress.long = latLng.longitude + saveAddress.lat = latLng.latitude + saveAddress.locationName = getAddress() + + binding.etLocation.setText(saveAddress.locationName) + } + } + requestNewLocationData() + } else { + Toast.makeText(this, R.string.we_will_need_your_location, Toast.LENGTH_LONG).show() + val intent = Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + startActivity(intent) + } + } else { + getLocationWithPermissionCheck() + } + } + + private fun checkPermissions(): Boolean { + if (ActivityCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission(this, + Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + return true + } + return false + } + + + @SuppressLint("MissingPermission") + private fun requestNewLocationData() { + runOnUiThread { + val mLocationRequest = LocationRequest.create().apply { + interval = 0 + fastestInterval = 0 + priority = LocationRequest.PRIORITY_HIGH_ACCURACY + numUpdates = 1 + } + + //mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this) + mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, + Looper.myLooper()) + + } + } + + private val mLocationCallback = object : LocationCallback() { + override fun onLocationResult(locationResult: LocationResult) { + val mLastLocation: Location = locationResult.lastLocation + val latLng = LatLng(mLastLocation.latitude, mLastLocation.longitude) + + mMap?.moveCamera(CameraUpdateFactory.newLatLng(latLng)) + mMap?.animateCamera(CameraUpdateFactory.zoomTo(14f)) + + saveAddress.long = latLng.longitude + saveAddress.lat = latLng.latitude + saveAddress.locationName = getAddress() + + binding.etLocation.setText(saveAddress.locationName) + //placeLatLng = LatLng(30.7457, 76.7332) + } + } + + private fun isLocationEnabled(): Boolean { + val locationManager: LocationManager = + getSystemService(Context.LOCATION_SERVICE) as LocationManager + return locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) || locationManager.isProviderEnabled( + LocationManager.NETWORK_PROVIDER) + } + + + private fun getAddress(): String { + var locationName = "" + val addresses: MutableList

? = geoCoder.getFromLocation(saveAddress.lat ?: 0.0, + saveAddress.long + ?: 0.0, 1) // Here 1 represent max location result to returned, by documents it recommended 1 to 5 + + if (addresses?.isNotEmpty()!!) { + locationName = when { + addresses[0].getAddressLine(0) != null -> addresses[0].getAddressLine(0) + addresses[0].featureName != null -> addresses[0].featureName + addresses[0].locality != null -> addresses[0].locality + else -> addresses[0].adminArea + } + } + + return locationName + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.ACCESS_FINE_LOCATION) + fun getLocation() { + if (saveAddress.lat == null) + getLastLocation() + } + + @OnShowRationale(Manifest.permission.ACCESS_FINE_LOCATION) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(this, R.string.we_will_need_your_location, request) + } + + @OnNeverAskAgain(Manifest.permission.ACCESS_FINE_LOCATION) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + this, + R.string.we_will_need_your_location) + } + + @OnPermissionDenied(Manifest.permission.ACCESS_FINE_LOCATION) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + this, R.string.we_will_need_your_location) + } + + companion object { + const val EXTRA_ADDRESS = "EXTRA_ADDRESS" + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/location/LocationFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/location/LocationFragment.kt new file mode 100644 index 0000000..3c11170 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/location/LocationFragment.kt @@ -0,0 +1,104 @@ +package com.consultantvendor.ui.dashboard.location + +import android.Manifest +import android.app.Activity +import android.content.pm.PackageManager +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.app.ActivityCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.databinding.FragmentLocationBinding +import com.consultantvendor.utils.PermissionUtils +import com.consultantvendor.utils.PrefsManager +import dagger.android.support.DaggerFragment +import permissions.dispatcher.* +import javax.inject.Inject + +@RuntimePermissions +class LocationFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentLocationBinding + + private var rootView: View? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_location, container, false) + rootView = binding.root + + initialise() + listeners() + } + return rootView + } + + private fun initialise() { + + + } + + + private fun listeners() { + binding.tvSkip.setOnClickListener { + requireActivity().finish() + } + + binding.tvUseLocation.setOnClickListener { + getLocationWithPermissionCheck() + } + + } + + private fun checkPermissions() { + if (ActivityCompat.checkSelfPermission(requireContext(), + Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED && + ActivityCompat.checkSelfPermission( + requireContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + + } else { + getLocationWithPermissionCheck() + } + } + + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun getLocation() { + checkPermissions() + } + + @OnShowRationale(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.we_will_need_your_location, request) + } + + @OnNeverAskAgain(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.we_will_need_your_location) + } + + @OnPermissionDenied(Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.we_will_need_your_location) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/RevenueFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/RevenueFragment.kt new file mode 100644 index 0000000..3e36eab --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/RevenueFragment.kt @@ -0,0 +1,247 @@ +package com.consultantvendor.ui.dashboard.revenue + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.MonthlyRevenue +import com.consultantvendor.data.models.responses.Service +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentRevenueBinding +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.utils.* +import com.github.mikephil.charting.components.XAxis +import com.github.mikephil.charting.data.Entry +import com.github.mikephil.charting.data.LineData +import com.github.mikephil.charting.data.LineDataSet +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet +import dagger.android.support.DaggerFragment +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList +import kotlin.collections.HashMap + +class RevenueFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentRevenueBinding + + private var rootView: View? = null + + private lateinit var viewModel: RevenueViewModel + + private var isReceiverRegistered = false + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_revenue, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + + if (isConnectedToInternet(requireContext(), true)) + viewModel.revenue(HashMap()) + } + return rootView + } + + private fun initialise() { + binding.lineChart.isDoubleTapToZoomEnabled = false + binding.lineChart.setPinchZoom(false) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + viewModel = ViewModelProvider(this, viewModelFactory)[RevenueViewModel::class.java] + } + + private fun listeners() { + + } + + private fun bindObservers() { + viewModel.revenue.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + val revenueData = it.data + + /*Services selected*/ + val serviceList = ArrayList() + serviceList.addAll(revenueData?.services ?: emptyList()) + val adapter = ServicesAdapter(serviceList) + binding.rvServices.adapter = adapter + + binding.tvAppointmentV.text = revenueData?.totalRequest + binding.tvCompleted.text = getString(R.string.s_completed, revenueData?.completedRequest) + binding.tvUnsuccessful.text = getString(R.string.unsuccessful, revenueData?.unSuccesfullRequest) + binding.tvTotalRevenueV.text = getCurrency(revenueData?.totalRevenue) + + if ((revenueData?.totalRequest?.toInt() ?: 0) > 0) { + val completeProgress = ((revenueData?.completedRequest?.toInt()?.times(100))?.div(revenueData.totalRequest?.toInt() + ?: 0)) + binding.progressCompleted.progress = completeProgress ?: 0 + } else + binding.progressCompleted.progress = 0 + + if ((revenueData?.totalRequest?.toInt() ?: 0) > 0) { + val unsuccefullProgress = ((revenueData?.unSuccesfullRequest?.toInt()?.times(100))?.div(revenueData.totalRequest?.toInt() + ?: 0)) + binding.progressUnsuccessful.progress = unsuccefullProgress ?: 0 + } else + binding.progressUnsuccessful.progress = 0 + + setData(revenueData?.monthlyRevenue) + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + } + + private fun setData(monthlyRevenue: List?) { + if (monthlyRevenue?.size != 0) { + binding.lineChart.zoomOut() + + val lines = ArrayList() +// val xAxis = arrayOf("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") + + val xAxis = ArrayList() + val entriesC = ArrayList() + + if (monthlyRevenue?.size == 1) { + xAxis.add("") + entriesC.add(Entry(0.0f, 0)) + } + + monthlyRevenue?.forEachIndexed { index, revenueItem -> + + xAxis.add(revenueItem.monthName ?: "") + + val indexNew = if (monthlyRevenue.size == 1) index + 1 else index + entriesC.add(Entry(revenueItem.revenue ?: 0.0f, indexNew)) + } + + val lDataSet = LineDataSet(entriesC, null) + lDataSet.setDrawFilled(true) + lDataSet.valueTextSize = resources.getDimension(R.dimen.sp_0) + lDataSet.circleRadius = 0f + + val drawable = ContextCompat.getDrawable(requireContext(), R.drawable.drawable_map_transparent) + lDataSet.fillDrawable = drawable + lDataSet.lineWidth = resources.getDimension(R.dimen.dp_1) + lDataSet.setCircleColors(intArrayOf(R.color.graph), requireContext()) + lDataSet.setColors(intArrayOf(R.color.graph), requireContext()) + lines.add(lDataSet) + + + //Set y axis + binding.lineChart.axisLeft.setValueFormatter { value, yAxis -> + when { + value > 99999 -> "${String.format(Locale.ENGLISH, "%.1f", (value / 100000))}m" + value > 999 -> "${String.format(Locale.ENGLISH, "%.1f", (value / 1000))}k" + value < 0 -> "0" + else -> value.toInt().toString() + } + } + + //Set final Chart values + binding.lineChart.data = LineData(xAxis, lines) + + binding.lineChart.xAxis.setDrawAxisLine(false) + binding.lineChart.xAxis.setDrawGridLines(true) + binding.lineChart.xAxis.enableGridDashedLine(30f, 20f, 0f) + binding.lineChart.xAxis.textColor = ContextCompat.getColor(requireContext(), R.color.textColor) + binding.lineChart.xAxis.textSize = resources.getDimension(R.dimen.sp_4) + binding.lineChart.xAxis.position = XAxis.XAxisPosition.BOTTOM + + binding.lineChart.axisLeft.setDrawAxisLine(false) + binding.lineChart.axisLeft.setDrawGridLines(true) + binding.lineChart.axisLeft.enableGridDashedLine(30f, 20f, 0f) + binding.lineChart.axisLeft.textColor = ContextCompat.getColor(requireContext(), R.color.textColor) + binding.lineChart.axisLeft.textSize = resources.getDimension(R.dimen.sp_4) + binding.lineChart.axisLeft.setLabelCount(6, false) + //binding.lineChart.axisLeft.setStartAtZero(true) + //binding.lineChart.axisLeft.setAxisMinValue(0f) + + binding.lineChart.axisRight.setDrawAxisLine(false) + binding.lineChart.axisRight.setDrawGridLines(false) + binding.lineChart.axisRight.textColor = ContextCompat.getColor(requireContext(), android.R.color.white) + //binding.lineChart.axisRight.setAxisMinValue(0f) + //binding.lineChart.axisRight.setStartAtZero(true) + + binding.lineChart.animateXY(0, 1500) + binding.lineChart.legend.isEnabled = false + binding.lineChart.setDescription("") + binding.lineChart.setExtraOffsets(0f, 5f, 0f, 8f) + } + } + + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + intentFilter.addAction(PushType.REQUEST_COMPLETED) + intentFilter.addAction(PushType.COMPLETED) + LocalBroadcastManager.getInstance(requireContext()) + .registerReceiver(refreshData, intentFilter) + isReceiverRegistered = true + } + + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshData) + isReceiverRegistered = false + } + } + + private val refreshData = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + NetworkIssueFragment.NETWORK_ISSUE, PushType.REQUEST_COMPLETED, PushType.COMPLETED -> + if (isConnectedToInternet(requireContext(), true)) + viewModel.revenue(HashMap()) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/RevenueViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/RevenueViewModel.kt new file mode 100644 index 0000000..1318312 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/RevenueViewModel.kt @@ -0,0 +1,44 @@ +package com.consultantvendor.ui.dashboard.revenue + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.Revenue +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class RevenueViewModel @Inject constructor(private val webService: WebService): ViewModel() { + + val revenue by lazy { SingleLiveEvent>() } + + + fun revenue(hashmap: HashMap) { + revenue.value = Resource.loading() + webService.revenue(hashmap) + .enqueue(object : Callback> { + override fun onFailure( + call: Call>, + throwable: Throwable) { + revenue.value = Resource.error(ApiUtils.failure(throwable)) + } + + override fun onResponse( + call: Call>, + response: Response>) { + if (response.isSuccessful) { + revenue.value = Resource.success(response.body()?.data) + } else { + revenue.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + }) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/ServicesAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/ServicesAdapter.kt new file mode 100644 index 0000000..84ffba3 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/revenue/ServicesAdapter.kt @@ -0,0 +1,45 @@ +package com.consultantvendor.ui.dashboard.revenue + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Service +import com.consultantvendor.databinding.RvItemServiceRevenueBinding + + +class ServicesAdapter( private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ServicesAdapter.ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ServicesAdapter.ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_service_revenue, parent, false)) + } + + override fun getItemCount(): Int = items.size + + inner class ViewHolder(val binding: RvItemServiceRevenueBinding) : + RecyclerView.ViewHolder(binding.root) { + + + fun bind(item: Service) = with(binding) { + + try { + clService.setBackgroundColor(Color.parseColor(item.color_code)) + } catch (e: Exception) { + clService.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + } + + tvName.text = item.service_name + tvCount.text = item.count + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/settings/PagesAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/PagesAdapter.kt new file mode 100644 index 0000000..49a5879 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/PagesAdapter.kt @@ -0,0 +1,60 @@ +package com.consultantvendor.ui.dashboard.settings + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Page +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagesTitleBinding +import com.consultantvendor.databinding.ItemPagingLoaderBinding + + +class PagesAdapter(private val fragment: SettingsFragment, private val items: List) : RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_pages_title, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: ItemPagesTitleBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.itemClicked(bindingAdapterPosition) + } + } + + fun bind(item: Page) = with(binding) { + ivIcon.setImageResource(item.icon ?: R.drawable.ic_info) + tvPage.text = item.title + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/settings/SettingsFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/SettingsFragment.kt new file mode 100644 index 0000000..5492706 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/SettingsFragment.kt @@ -0,0 +1,292 @@ +package com.consultantvendor.ui.dashboard.settings + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.appFeatures +import com.consultantvendor.data.models.responses.Page +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.ProviderType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentSettingsBinding +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class SettingsFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentSettingsBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private var items = ArrayList() + + private lateinit var adapter: PagesAdapter + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_settings, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + setUserProfile() + + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + } + + private fun setAdapter() { + items.clear() + + items.add( + Page( + title = getString(R.string.account_setting), + icon = R.drawable.ic_profile_setting + ) + ) + if (BuildConfig.FLAVOR == "homeDoctor") + items.add(Page(title = getString(R.string.bank_info), icon = R.drawable.ic_bank)) + else if (BuildConfig.FLAVOR == "nurseLynx") + items.add(Page(title = getString(R.string.contacts), icon = R.drawable.ic_contacts)) + + if (userRepository.getUser()?.provider_type == ProviderType.email) + items.add( + Page( + title = getString(R.string.change_password), + icon = R.drawable.ic_password + ) + ) + //if (appFeatures.needLanguageScreen) + // items.add(Page(title = getString(R.string.language), icon = R.drawable.ic_language)) + + items.add(Page(title = getString(R.string.chat), icon = R.drawable.ic_chat_profile)) + items.add(Page(title = getString(R.string.history), icon = R.drawable.ic_history)) + if (appFeatures.freeExpertAdvise) + items.add( + Page( + title = getString(R.string.free_expert_advice), + icon = R.drawable.ic_class_profile + ) + ) + //if (appFeatures.needClasses) + if (BuildConfig.FLAVOR == "taradoc") + items.add(Page(title = getString(R.string.broadcasts), icon = R.drawable.ic_class_profile)) + else + // items.add(Page(title = getString(R.string.classes), icon = R.drawable.ic_class_profile)) + items.add(Page(title = getString(R.string.notification), icon = R.drawable.ic_notification_drawer)) + items.add(Page(title = getString(R.string.invite_people), icon = R.drawable.ic_invite)) + + if (BuildConfig.FLAVOR != "taradoc") { + /* appClientDetails.pages?.forEach { + items.add( + Page( + title = it.title, + slug = it.slug, + app_type = it.app_type, + icon = R.drawable.ic_info + ) + ) + }*/ + } + + items.add(Page(title = getString(R.string.logout), icon = R.drawable.ic_logout)) + + adapter = PagesAdapter(this, items) + binding.rvPages.adapter = adapter + } + + private fun setUserProfile() { + val userData = userRepository.getUser() + + binding.tvName.text = getDoctorName(userData) + binding.tvAge.text = "${getString(R.string.age)} ${getAge(userData?.profile?.dob)}" + loadImage("profile",binding.ivPic, userData?.profile_image, R.drawable.ic_profile_placeholder) + + binding.tvVersion.text = + getString(R.string.version, getVersion(requireActivity()).versionName) + } + + private fun listeners() { + binding.ivPic.setOnClickListener { + val itemImages = java.util.ArrayList() + itemImages.add( userRepository.getUser()?.profile_image.toString()) + /* itemImages.add( + getImageBaseUrl( + ImageFolder.UPLOADS, + userRepository.getUser()?.profile_image + ) + )*/ + viewImageFull(requireActivity(), itemImages, 0) + } + + binding.tvName.setOnClickListener { + goToProfile() + } + + + } + + fun itemClicked(pos: Int) { + when (items[pos].title) { + getString(R.string.account_setting) -> { + goToProfile() + } + getString(R.string.bank_info) -> { + openScreen(DrawerActivity.BANK_INFO) + } + getString(R.string.change_password) -> { + openScreen(DrawerActivity.CHANGE_PASSWORD) + } + getString(R.string.language) -> { + openScreen(DrawerActivity.LANGUAGE_SCREEN) + } + getString(R.string.chat) -> { + openScreen(DrawerActivity.USER_CHAT) + } + getString(R.string.history) -> { + openScreen(DrawerActivity.HISTORY) + } + getString(R.string.free_expert_advice) -> { + openScreen(DrawerActivity.MY_QUESTION) + } + getString(R.string.classes) -> { + openScreen(DrawerActivity.CLASSES) + } + getString(R.string.notification) -> { + openScreen(DrawerActivity.NOTIFICATION) + } + getString(R.string.invite_people) -> { + // shareDeepLink(DeepLink.INVITE, requireActivity(), userRepository.getUser()) + shareContent("Check out this NurseLynx Expert App: ", "https://play.google.com/store/apps/details?id=com.nurseLynx.expert") + } + getString(R.string.contacts) -> { + openScreen(DrawerActivity.CONTACT_LIST) + } + getString(R.string.logout) -> { + showLogoutDialog() + } + else -> { + openPageLink( + requireContext(), + items[pos].title, + items[pos].slug, + items[pos].app_type + ) + } + } + } + + private fun shareContent(text: String, url: String) { + val shareIntent = Intent(Intent.ACTION_SEND).apply { + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, "$text\n$url") + } + + try { + startActivity(Intent.createChooser(shareIntent, "Share via")) + } catch (e: Exception) { + Toast.makeText(requireContext(), "No apps available to share.", Toast.LENGTH_SHORT).show() + } + } + + private fun goToProfile() { + startActivityForResult( + Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.PROFILE), AppRequestCode.PROFILE_UPDATE + ) + + } + + private fun openScreen(page: String) { + startActivity( + Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, page) + ) + } + + + private fun showLogoutDialog() { + AlertDialogUtil.instance.createOkCancelDialog( + requireContext(), R.string.logout, + R.string.logout_dialog_message, R.string.yes, R.string.no, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + viewModel.logout() + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun bindObservers() { + viewModel.logout.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + logoutUser(requireActivity(), prefsManager) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + setUserProfile() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactListAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactListAdapter.kt new file mode 100644 index 0000000..38eaaf9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactListAdapter.kt @@ -0,0 +1,71 @@ +package com.consultantvendor.ui.dashboard.settings.contactlist + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.ContactEmergency +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemContactBinding + + +class ContactListAdapter(private val fragment: ContactListFragment, private val items: ArrayList) : RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_contact, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemContactBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + + binding.contactList.setOnClickListener { + fragment.callContact(items[bindingAdapterPosition]) + } + + binding.ivDelete.setOnClickListener { + fragment.deleteContact(items[bindingAdapterPosition]) + } + } + + fun bind(item: ContactEmergency) = with(binding) { + tvName.text = item.name + + var phoneNumbers = "" + item.phone_numbers?.forEach { + phoneNumbers += "${it.type_label} ${it.phone}\n" + } + + tvPhoneNumberV.text = phoneNumbers.removeSuffix("\n") + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactListFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactListFragment.kt new file mode 100644 index 0000000..cad4a06 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactListFragment.kt @@ -0,0 +1,391 @@ +package com.consultantvendor.ui.dashboard.settings.contactlist + +import android.Manifest +import android.app.Activity +import android.content.Intent +import android.content.pm.PackageManager +import android.graphics.Color +import android.net.Uri +import android.os.Bundle +import android.provider.ContactsContract +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.appcompat.app.AlertDialog +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.ContactEmergency +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.ActivityListingToolbarBinding +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.google.gson.Gson +import com.onegravity.contactpicker.contact.Contact +import com.onegravity.contactpicker.contact.ContactDescription +import com.onegravity.contactpicker.contact.ContactSortOrder +import com.onegravity.contactpicker.core.ContactPickerActivity +import com.onegravity.contactpicker.picture.ContactPictureType +//import com.wafflecopter.multicontactpicker.ContactResult +//import com.wafflecopter.multicontactpicker.LimitColumn +//import com.wafflecopter.multicontactpicker.MultiContactPicker +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class ContactListFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: ContactViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: ContactListAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + private val REQUEST_CALL_PERMISSION : Int = 121 + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ContactViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.tvHeader.text = getString(R.string.contacts) + binding.tvAdd.visible() + + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_contact) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_contact_desc) + } + + private fun setAdapter() { + adapter = ContactListAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvAdd.setOnClickListener { + if (checkContactPermission()) + pickContact() + else + requestContactPermission() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.contactList(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.contactList.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.contacts ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModel.addContact.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.deletContact.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + +/* override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.SELECT_CONTACT -> { + *//* val results: List = MultiContactPicker.obtainResult(data) + Log.d("MyTag", Gson().toJson(results).toString()) + + hitApiContacts(results)*//* + } + } + } + }*/ + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == AppRequestCode.REQUEST_CONTACT && resultCode == Activity.RESULT_OK && + data != null && data.hasExtra(ContactPickerActivity.RESULT_CONTACT_DATA)) { + + // Process contacts + val contacts = data.getSerializableExtra(ContactPickerActivity.RESULT_CONTACT_DATA) as? List + contacts?.forEach { contact -> + // Process each contact + hitApiContacts(contacts) + } + +// // Process groups +// val groups = data.getSerializableExtra(ContactPickerActivity.RESULT_GROUP_DATA) as? List +// groups?.forEach { group -> +// // Process each group +// } + } + } + + private fun hitApiContacts(contacts: List) { + if (isConnectedToInternet(requireContext(), true)) { + val contactList = ContactEmergency() + contactList.contacts = ArrayList() + contacts.forEach { + val contact = ContactEmergency() + contact.name = it.displayName + contact.phone_numbers = ArrayList() + it.mapPhone.forEach { + contact.phone_numbers?.add(ContactEmergency(phone = it.toString().replace("2=",""), type_label = it.toString().replace("2=",""))) + } + + contactList.contacts?.add(contact) + + } + viewModel.addContact(contactList) + } + } + + fun deleteContact(contact: ContactEmergency) { + if (isConnectedToInternet(requireContext(), true)) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.delete)) + .setMessage(getString(R.string.delete_contact, contact.name)) + .setPositiveButton(getString(R.string.delete)) { dialog, which -> + val hashMap = HashMap() + hashMap["id"] = contact.id ?: "" + viewModel.deletContact(hashMap) + }.setNegativeButton(getString(R.string.no)) { dialog, which -> + }.show() + } + } + + private fun checkContactPermission(): Boolean { + //check if permission was granted/allowed or not, returns true if granted/allowed, false if not + return ContextCompat.checkSelfPermission(requireContext(), + android.Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED + } + + private fun requestContactPermission() { + //request the READ_CONTACTS permission + val permission = arrayOf(android.Manifest.permission.READ_CONTACTS) + ActivityCompat.requestPermissions(requireActivity(), permission, 100) + } + + private fun pickContact() { + //intent ti pick contact + /* MultiContactPicker.Builder(this) //Activity/fragment context + .theme(R.style.AppTheme) //Optional - default: MultiContactPicker.Azure + .hideScrollbar(false) //Optional - default: false + .showTrack(true) //Optional - default: true + .searchIconColor(Color.WHITE) //Option - default: White + .setChoiceMode(MultiContactPicker.CHOICE_MODE_MULTIPLE) //Optional - default: CHOICE_MODE_MULTIPLE + .handleColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) //Optional - default: Azure Blue + .bubbleColor(ContextCompat.getColor(requireContext(), R.color.colorPrimary)) //Optional - default: Azure Blue + .bubbleTextColor(Color.WHITE) //Optional - default: White + .setTitleText(getString(R.string.select_contacts)) //Optional - default: Select Contacts + .setSelectedContacts("10", "5") //Optional - will pre-select contacts of your choice. String... or List + .setLoadingType(MultiContactPicker.LOAD_ASYNC) //Optional - default LOAD_ASYNC (wait till all loaded vs stream results) + .limitToColumn(LimitColumn.NONE) //Optional - default NONE (Include phone + email, limiting to one can improve loading time) + .setActivityAnimations(android.R.anim.fade_in, android.R.anim.fade_out, + android.R.anim.fade_in, + android.R.anim.fade_out) //Optional - default: No animation overrides + .showPickerForResult(AppRequestCode.SELECT_CONTACT)*/ + + + val intent: Intent = Intent(requireActivity(), ContactPickerActivity::class.java) +// .putExtra( +// ContactPickerActivity.EXTRA_THEME, +// if (mDarkTheme) R.style.Theme_Dark else com.consultantapp.R.style.Theme_Light +// ) + .putExtra(ContactPickerActivity.EXTRA_WITH_GROUP_TAB, false) + .putExtra(ContactPickerActivity.EXTRA_CONTACT_BADGE_TYPE, ContactPictureType.ROUND.name) + .putExtra(ContactPickerActivity.EXTRA_SHOW_CHECK_ALL, true) + .putExtra( + ContactPickerActivity.EXTRA_CONTACT_DESCRIPTION, + ContactDescription.ADDRESS.name + ) + .putExtra( + ContactPickerActivity.EXTRA_CONTACT_DESCRIPTION_TYPE, + ContactsContract.CommonDataKinds.Email.TYPE_WORK + ) + .putExtra( + ContactPickerActivity.EXTRA_CONTACT_SORT_ORDER, + ContactSortOrder.AUTOMATIC.name + ) + startActivityForResult(intent, AppRequestCode.REQUEST_CONTACT) + } + + fun callContact(contact: ContactEmergency) { + if (isConnectedToInternet(requireContext(), true)) { + AlertDialog.Builder(requireContext()) + .setCancelable(false) + .setTitle(getString(R.string.call)) + .setMessage(getString(R.string.call_contact, contact.name)) + .setPositiveButton(getString(R.string.yes)) { dialog, which -> + val phoneNumber = "tel:"+contact.phone_numbers?.get(0)?.phone.toString() + val callIntent = Intent(Intent.ACTION_CALL).apply { + data = Uri.parse(phoneNumber) + } + + if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { + startActivity(callIntent) + } else { + ActivityCompat.requestPermissions(requireActivity(), arrayOf(Manifest.permission.CALL_PHONE), REQUEST_CALL_PERMISSION) + } + }.setNegativeButton(getString(R.string.no)) { dialog, which -> + }.show() + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (requestCode == REQUEST_CALL_PERMISSION) { + if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) { + // Permission granted, retry the call + } else { + Toast.makeText(requireContext(), "Permission denied to make calls", Toast.LENGTH_SHORT).show() + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactViewModel.kt new file mode 100644 index 0000000..4be2e6f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/settings/contactlist/ContactViewModel.kt @@ -0,0 +1,120 @@ +package com.consultantvendor.ui.dashboard.settings.contactlist + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.models.responses.ContactEmergency +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class ContactViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val contactList by lazy { SingleLiveEvent>() } + + val sendMessage by lazy { SingleLiveEvent>() } + + val addContact by lazy { SingleLiveEvent>() } + + val deletContact by lazy { SingleLiveEvent>() } + + fun contactList(hashMap: HashMap) { + contactList.value = Resource.loading() + + webService.contactList(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + contactList.value = Resource.success(response.body()?.data) + } else { + contactList.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + contactList.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addContact(contactList: ContactEmergency) { + addContact.value = Resource.loading() + + webService.addContact(contactList) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addContact.value = Resource.success(response.body()?.data) + } else { + addContact.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addContact.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun sendMessage() { + sendMessage.value = Resource.loading() + + webService.sendMessage() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + sendMessage.value = Resource.success(response.body()?.data) + } else { + sendMessage.value = Resource.error(ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + sendMessage.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun deletContact(hashMap: HashMap) { + deletContact.value = Resource.loading() + + webService.deletContact(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + deletContact.value = Resource.success(response.body()?.data) + } else { + deletContact.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + deletContact.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/success/NetworkIssueFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/success/NetworkIssueFragment.kt new file mode 100644 index 0000000..68ae686 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/success/NetworkIssueFragment.kt @@ -0,0 +1,53 @@ +package com.consultantvendor.ui.dashboard.success + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.databinding.ItemNoInternetBinding +import com.consultantvendor.utils.isConnectedToInternet +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class NetworkIssueFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ItemNoInternetBinding + + private var rootView: View? = null + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.item_no_internet, container, false) + rootView = binding.root + + initialise() + } + return rootView + } + + + private fun initialise() { + binding.tvRetry.setOnClickListener { + if (isConnectedToInternet(requireContext(), false)) { + val intent = Intent() + intent.action = NETWORK_ISSUE + LocalBroadcastManager.getInstance(requireContext()).sendBroadcast(intent) + + requireActivity().finish() + } + } + } + + + companion object { + const val NETWORK_ISSUE = "NETWORK_ISSUE" + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/success/SuccessFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/success/SuccessFragment.kt new file mode 100644 index 0000000..c65ef74 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/success/SuccessFragment.kt @@ -0,0 +1,81 @@ +package com.consultantvendor.ui.dashboard.success + +import android.app.Activity +import android.app.Dialog +import android.graphics.Color +import android.graphics.drawable.ColorDrawable +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.databinding.FragmentSuccessBinding +import com.consultantvendor.ui.loginSignUp.changepassword.ChangePasswordFragment +import dagger.android.support.DaggerDialogFragment +import java.util.* +import javax.inject.Inject +import kotlin.concurrent.schedule + + +class SuccessFragment(private val fragment: Fragment) : DaggerDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentSuccessBinding + + + override fun setupDialog(dialog: Dialog, style: Int) { + super.setupDialog(dialog, style) + + dialog.setCanceledOnTouchOutside(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + } + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_success, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + setTextForMessage() + initialise() + } + + private fun setTextForMessage() { + when (fragment) { + is ChangePasswordFragment -> { + binding.tvTitle.text = getString(R.string.password_changed_successfully) + } + else -> { + binding.tvTitle.text = getString(R.string.success) + } + } + } + + private fun initialise() { + binding.animationView.speed = 1.5f + + requireActivity().setResult(Activity.RESULT_OK) + + Timer().schedule(3000) { + when (fragment) { + is ChangePasswordFragment -> { + requireActivity().finish() + } + } + dialog?.dismiss() + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/BankViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/BankViewModel.kt new file mode 100644 index 0000000..885a2dd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/BankViewModel.kt @@ -0,0 +1,94 @@ +package com.consultantvendor.ui.dashboard.wallet + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class BankViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val addBank by lazy { SingleLiveEvent>() } + + val bankAccounts by lazy { SingleLiveEvent>() } + + val payout by lazy { SingleLiveEvent>() } + + fun addBank(hashMap: HashMap) { + addBank.value = Resource.loading() + + webService.addBank(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addBank.value = Resource.success(response.body()?.data) + } else { + addBank.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addBank.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun bankAccounts(hashMap: HashMap) { + bankAccounts.value = Resource.loading() + + webService.bankAccounts(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + bankAccounts.value = Resource.success(response.body()?.data) + } else { + bankAccounts.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + bankAccounts.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun payouts(hashMap: HashMap) { + payout.value = Resource.loading() + + webService.payouts(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + payout.value = Resource.success(response.body()?.data) + } else { + payout.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + payout.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/PayoutFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/PayoutFragment.kt new file mode 100644 index 0000000..5a0b9bf --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/PayoutFragment.kt @@ -0,0 +1,232 @@ +package com.consultantvendor.ui.dashboard.wallet + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Bank +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentPayoutBinding +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class PayoutFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + + private lateinit var binding: FragmentPayoutBinding + + private var rootView: View? = null + + private lateinit var viewModel: BankViewModel + + private lateinit var viewModelWallet: WalletViewModel + + private lateinit var progressDialog: ProgressDialog + + private var bank: Bank? = null + + private var moneyToTransfer = "" + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_payout, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + progressDialog = ProgressDialog(requireActivity()) + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + viewModel = ViewModelProvider(this, viewModelFactory)[BankViewModel::class.java] + viewModelWallet = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + + viewModelWallet.wallet(HashMap()) + viewModel.bankAccounts(HashMap()) + + if (requireActivity().intent.getStringExtra(PAGE_TO_OPEN) == DrawerActivity.BANK_INFO) { + binding.tvHeader.text = getString(R.string.bank_info) + binding.tvTitle.gone() + binding.tvAmount.gone() + binding.btnPayout.gone() + } + + if (BuildConfig.FLAVOR == "homeDoctor") + binding.ilIFSCCode.gone() + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.btnPayout.setOnClickListener { + if (binding.clBank.visibility == View.VISIBLE) { + binding.btnPayout.showSnackBar(getString(R.string.add_bank)) + } else { + val hashMap = HashMap() + + hashMap["bank_id"] = bank?.id ?: "" + hashMap["amount"] = moneyToTransfer + + viewModel.payouts(hashMap) + } + } + + binding.tvEditBank.setOnClickListener { + binding.clBank.visible() + binding.btnAddBank.text = getString(R.string.edit_bank) + + binding.etAccountNumber.setText(bank?.account_number ?: "") + binding.etAccountName.setText(bank?.name ?: "") + binding.etBankName.setText(bank?.bank_name ?: "") + binding.etIFSCCode.setText(bank?.ifc_code ?: "") + + } + + binding.btnAddBank.setOnClickListener { + + when { + binding.etAccountNumber.text.toString().trim().isEmpty() -> { + binding.etAccountNumber.showSnackBar(getString(R.string.account_number)) + } + binding.etAccountName.text.toString().trim().isEmpty() -> { + binding.etAccountName.showSnackBar(getString(R.string.account_name)) + } + binding.etBankName.text.toString().trim().isEmpty() -> { + binding.etBankName.showSnackBar(getString(R.string.bank_name)) + } + /*binding.etIFSCCode.text.toString().trim().isEmpty() -> { + binding.etIFSCCode.showSnackBar(getString(R.string.ifsc_code)) + }*/ + else -> { + + val hashMap = HashMap() + + if (bank != null) + hashMap["bank_id"] = bank?.id ?: "" + + hashMap["account_number"] = binding.etAccountNumber.text.toString() + hashMap["account_holder_name"] = binding.etAccountName.text.toString() + hashMap["bank_name"] = binding.etBankName.text.toString() + hashMap["ifc_code"] = binding.etIFSCCode.text.toString() + hashMap["account_holder_type"] = "individual" + viewModel.addBank(hashMap) + + } + } + + } + } + + private fun bindObservers() { + viewModelWallet.wallet.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + moneyToTransfer = it.data?.balance ?: "" + binding.tvAmount.text = getCurrency(it.data?.balance) + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + + } + } + }) + + viewModel.bankAccounts.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + if (it.data?.bank_accounts.isNullOrEmpty()) { + binding.tvBankAccount.text = getString(R.string.add_bank) + binding.tvBankAccountV.invisible() + binding.clBank.visible() + } else { + binding.tvBankAccount.visible() + binding.tvBankAccountV.visible() + binding.tvBankAccount.text = getString(R.string.bank_account) + binding.tvEditBank.visible() + binding.clBank.gone() + + bank = it.data?.bank_accounts?.get(0) + binding.tvBankAccountV.text = "${bank?.name}\n${bank?.bank_name} (${bank?.account_number})" + } + + } + Status.ERROR -> { + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.addBank.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + viewModel.bankAccounts(HashMap()) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.payout.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletAdapter.kt new file mode 100644 index 0000000..014efb6 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletAdapter.kt @@ -0,0 +1,105 @@ +package com.consultantvendor.ui.dashboard.wallet + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Wallet +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemWalletBinding +import com.consultantvendor.utils.* + + +class WalletAdapter(private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_wallet, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemWalletBinding) : + RecyclerView.ViewHolder(binding.root) { + + val context = binding.root.context + + fun bind(wallet: Wallet) = with(binding) { + slideRecyclerItem(binding.root, binding.root.context) + + when (wallet.type) { + WalletMoney.DEPOSIT -> { + tvMoneyFrom.text = context.getString(R.string.money_received_from, + wallet.from?.name) + tvMoneyAmount.text = "+${getCurrency(wallet.amount)}" + } + WalletMoney.ADD_MONEY -> { + if (wallet.status == WalletMoney.FAILED) { + tvMoneyFrom.text = context.getString(R.string.failed_transaction) + tvMoneyAmount.text = "${getCurrency(wallet.amount)}" + } else { + tvMoneyFrom.text = context.getString(R.string.added_to_wallet) + tvMoneyAmount.text = "+${getCurrency(wallet.amount)}" + } + } + WalletMoney.PAYOUTS -> { + when (wallet.status) { + WalletMoney.FAILED -> { + tvMoneyFrom.setTextColor(ContextCompat.getColor(context, R.color.colorCancel)) + tvMoneyFrom.text = "${context.getString(R.string.money_sent_account, wallet.status)}\n${wallet.payout_message}" + } + else -> { + tvMoneyFrom.text = context.getString(R.string.money_sent_account, wallet.status) + } + } + + tvMoneyAmount.text = "-${getCurrency(wallet.amount)}" + + } + else -> { + tvMoneyFrom.text = context.getString(R.string.na) + tvMoneyAmount.text = "${getCurrency(wallet.amount)}" + } + } + + tvDate.text = DateUtils.dateTimeFormatFromUTC(DateFormat.MON_DATE_YEAR, wallet.created_at) + tvTime.text = DateUtils.dateTimeFormatFromUTC(DateFormat.TIME_FORMAT, wallet.created_at) + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletFragment.kt new file mode 100644 index 0000000..696dac8 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletFragment.kt @@ -0,0 +1,268 @@ +package com.consultantvendor.ui.dashboard.wallet + +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Wallet +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentWalletBinding +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.ui.dashboard.wallet.addmoney.AddMoneyActivity +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.drawermenu.DrawerActivity.Companion.PAYOUT +import com.consultantvendor.utils.* +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + + +class WalletFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + + private lateinit var binding: FragmentWalletBinding + + private var rootView: View? = null + + private lateinit var viewModel: WalletViewModel + + private var items = ArrayList() + + private lateinit var adapter: WalletAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var isReceiverRegistered = false + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_wallet, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + binding.clLoader.setBackgroundResource(R.color.colorWhite) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_wallet_empty) + binding.clNoData.tvNoData.text = getString(R.string.no_transaction) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_transaction_desc) + } + + private fun setAdapter() { + adapter = WalletAdapter(items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + + private fun listeners() { + binding.btnPayout.setOnClickListener { + + startActivityForResult(Intent(requireActivity(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, PAYOUT), AppRequestCode.PAYOUT_MONEY) + } + + binding.tvAddMoney.setOnClickListener { + disableButton(binding.tvAddMoney) + startActivityForResult(Intent(requireContext(), AddMoneyActivity::class.java), AppRequestCode.ADD_MONEY) + } + + binding.swipeRefreshLayout.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + viewModel.wallet(HashMap()) + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + viewModel.walletHistory(hashMap) + } else + binding.swipeRefreshLayout.isRefreshing = false + } + + private fun bindObservers() { + viewModel.wallet.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.tvAmount.text = getCurrency(it.data?.balance) + //binding.tvAddMoney.visible() + + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + + } + } + }) + + viewModel.walletHistory.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.swipeRefreshLayout.isRefreshing = false + binding.clLoader.setBackgroundResource(0) + binding.clLoader.gone() + + isLoadingMoreItems = false + + val tempList = it.data?.payments ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.clLoader.gone() + binding.swipeRefreshLayout.isRefreshing = false + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!binding.swipeRefreshLayout.isRefreshing && !isLoadingMoreItems) + binding.clLoader.visible() + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + if (requestCode == AppRequestCode.PAYOUT_MONEY) { + hitApi(true) + } else if (requestCode == AppRequestCode.ADD_MONEY) { + requireActivity().runOnUiThread { + hitApi(true) + } + } + } + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.AMOUNT_RECEIVED) + intentFilter.addAction(PushType.PAYOUT_PROCESSED) + intentFilter.addAction(PushType.PAYOUT_FAILED) + intentFilter.addAction(PushType.BALANCE_ADDED) + intentFilter.addAction(PushType.BALANCE_FAILED) + intentFilter.addAction(NetworkIssueFragment.NETWORK_ISSUE) + LocalBroadcastManager.getInstance(requireContext()).registerReceiver(refreshRequests, intentFilter) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(requireContext()).unregisterReceiver(refreshRequests) + isReceiverRegistered = false + } + } + + private val refreshRequests = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + when (intent.action) { + PushType.AMOUNT_RECEIVED, PushType.PAYOUT_PROCESSED, PushType.PAYOUT_FAILED, PushType.BALANCE_ADDED, + PushType.BALANCE_FAILED, NetworkIssueFragment.NETWORK_ISSUE -> { + hitApi(true) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletViewModel.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletViewModel.kt new file mode 100644 index 0000000..50a6499 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/WalletViewModel.kt @@ -0,0 +1,276 @@ +package com.consultantvendor.ui.dashboard.wallet + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class WalletViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val walletHistory by lazy { SingleLiveEvent>() } + + val wallet by lazy { SingleLiveEvent>() } + + val orderCreate by lazy { SingleLiveEvent>() } + + val addMoney by lazy { SingleLiveEvent>() } + + val addCard by lazy { SingleLiveEvent>() } + + val updateCard by lazy { SingleLiveEvent>() } + + val deleteCard by lazy { SingleLiveEvent>() } + + val cardListing by lazy { SingleLiveEvent>() } + + val razorPayWebhook by lazy { SingleLiveEvent>() } + + val requestCheck by lazy { SingleLiveEvent>() } + + fun walletHistory(hashMap: HashMap) { + walletHistory.value = Resource.loading() + + webService.walletHistory(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + walletHistory.value = Resource.success(response.body()?.data) + } else { + walletHistory.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + walletHistory.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun razorPayCreateOrder(hashMap: HashMap) { + orderCreate.value = Resource.loading() + + webService.orderCreate(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + orderCreate.value = Resource.success(response.body()?.data) + } else { + orderCreate.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + orderCreate.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun wallet(hashMap: HashMap) { + wallet.value = Resource.loading() + + webService.wallet(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + wallet.value = Resource.success(response.body()?.data) + } else { + wallet.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + wallet.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addCard(hashMap: HashMap) { + addCard.value = Resource.loading() + + webService.addCard(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addCard.value = Resource.success(response.body()?.data) + } else { + addCard.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addCard.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateCard(hashMap: HashMap) { + updateCard.value = Resource.loading() + + webService.updateCard(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateCard.value = Resource.success(response.body()?.data) + } else { + updateCard.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateCard.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun deleteCard(hashMap: HashMap) { + deleteCard.value = Resource.loading() + + webService.deleteCard(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + deleteCard.value = Resource.success(response.body()?.data) + } else { + deleteCard.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + deleteCard.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun addMoney(hashMap: HashMap) { + addMoney.value = Resource.loading() + + webService.addMoney(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addMoney.value = Resource.success(response.body()?.data) + } else { + addMoney.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addMoney.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun cardListing(hashMap: HashMap) { + cardListing.value = Resource.loading() + + webService.cardListing(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + cardListing.value = Resource.success(response.body()?.data) + } else { + cardListing.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + cardListing.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun razorPayWebhook(hashMap: HashMap) { + razorPayWebhook.value = Resource.loading() + + webService.razorPayWebhook(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + razorPayWebhook.value = Resource.success(response.body()?.data) + } else { + razorPayWebhook.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + razorPayWebhook.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun requestCheck(hashMap: HashMap) { + requestCheck.value = Resource.loading() + + webService.requestCheck(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + requestCheck.value = Resource.success(response.body()?.data) + } else { + requestCheck.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + requestCheck.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/AddCardFragment.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/AddCardFragment.kt new file mode 100644 index 0000000..3fbac86 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/AddCardFragment.kt @@ -0,0 +1,157 @@ +package com.consultantvendor.ui.dashboard.wallet.addmoney + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.app.AppCompatActivity +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Wallet +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentAddCardBinding +import com.consultantvendor.ui.dashboard.wallet.WalletViewModel +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class AddCardFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentAddCardBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: WalletViewModel + + private var cardDetails: Wallet? = null + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_add_card, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + val card = binding.cardForm + + if (requireActivity().intent?.hasExtra(CARD_DETAILS) == true) { + binding.tvHeader.text = getString(R.string.edit_card) + cardDetails = requireActivity().intent?.getSerializableExtra(CARD_DETAILS) as Wallet + card.cardRequired(false) + .cvvRequired(false) + + binding.tvCardDetails.visible() + binding.tvCardDetails.text = getString(R.string.card_ending_with, + cardDetails?.card_brand, cardDetails?.last_four_digit) + binding.btnAddCard.text = getString(R.string.update) + } else { + card.cardRequired(true) + .cvvRequired(true) + } + + card.expirationRequired(true) + .setup(requireActivity() as AppCompatActivity) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.btnAddCard.setOnClickListener { + if (binding.cardForm.isValid) { + disableButton(binding.btnAddCard) + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + + hashMap["exp_month"] = binding.cardForm.expirationMonth + hashMap["exp_year"] = binding.cardForm.expirationYear + + if (arguments?.containsKey(CARD_DETAILS) == true) { + hashMap["card_id"] = cardDetails?.id ?: "" + viewModel.updateCard(hashMap) + } else { + hashMap["card_number"] = binding.cardForm.cardNumber + hashMap["cvc"] = binding.cardForm.cvv + viewModel.addCard(hashMap) + } + + + } + } + } + } + + + private fun bindObservers() { + viewModel.addCard.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.updateCard.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + resultFragmentIntent(this, targetFragment ?: this, + AppRequestCode.ADD_MONEY, null) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + companion object { + const val CARD_DETAILS = "CARD_DETAILS" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/AddMoneyActivity.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/AddMoneyActivity.kt new file mode 100644 index 0000000..5e35eec --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/AddMoneyActivity.kt @@ -0,0 +1,419 @@ +package com.consultantvendor.ui.dashboard.wallet.addmoney + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.util.Log +import android.widget.Toast +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.models.responses.Wallet +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentAddMoenyBinding +import com.consultantvendor.ui.dashboard.wallet.WalletViewModel +import com.consultantvendor.ui.dashboard.wallet.addmoney.AddCardFragment.Companion.CARD_DETAILS +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.webview.WebViewActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.razorpay.Checkout +import com.razorpay.PaymentResultListener +import dagger.android.support.DaggerAppCompatActivity +import org.json.JSONObject +import javax.inject.Inject + +class AddMoneyActivity : DaggerAppCompatActivity(), PaymentResultListener { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentAddMoenyBinding + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: WalletViewModel + + private lateinit var adapter: CardsAdapter + + private var items = ArrayList() + + var selectedCardId = "" + + private var order_id: String? = null + + private var paymentFrom = PaymentFrom.STRIPE + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.fragment_add_moeny) + initialise() + listeners() + bindObservers() + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + progressDialog = ProgressDialog(this) + binding.ilPayment.prefixText = getCurrencySymbol() + + binding.tvMoney1.text = "+ ${getCurrency("500")}" + binding.tvMoney2.text = "+ ${getCurrency("1000")}" + binding.tvMoney3.text = "+ ${getCurrency("1500")}" + + /*Get from details*/ + paymentFrom = appClientDetails.payment_type ?: PaymentFrom.STRIPE + + when (paymentFrom) { + PaymentFrom.STRIPE -> { + binding.tvAddCard.visible() + binding.tvSelectCard.visible() + binding.rvListing.visible() + setAdapter() + if (isConnectedToInternet(this, true)) + viewModel.cardListing(HashMap()) + } + PaymentFrom.RAZOR_PAY -> { + binding.tvAddCard.gone() + loadRazorPay() + } + PaymentFrom.CCA_VENUE -> { + binding.tvAddCard.gone() + } + PaymentFrom.AL_RAJHI_BANK -> { + binding.tvAddCard.gone() + } + } + } + + private fun setAdapter() { + adapter = CardsAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + finish() + } + + binding.tvAddCard.setOnClickListener { + disableButton(binding.tvAddCard) + + startActivityForResult(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ADD_CARD), AppRequestCode.ADD_CARD) + + } + + binding.tvPay.setOnClickListener { + disableButton(binding.tvPay) + if (binding.etAmount.text.toString().isEmpty() || binding.etAmount.text.toString() + .toInt() == 0 + ) { + binding.etAmount.showSnackBar(getString(R.string.enter_amount)) + } else if (paymentFrom == PaymentFrom.STRIPE && selectedCardId.isEmpty()) { + binding.etAmount.showSnackBar(getString(R.string.select_card)) + } else { + if (isConnectedToInternet(this, true)) { + when (paymentFrom) { + PaymentFrom.STRIPE -> { + val hashMap = HashMap() + + hashMap["balance"] = binding.etAmount.text.toString() + hashMap["card_id"] = selectedCardId + viewModel.addMoney(hashMap) + } + PaymentFrom.AL_RAJHI_BANK -> { + val hashMap = HashMap() + + hashMap["balance"] = binding.etAmount.text.toString() + viewModel.addMoney(hashMap) + } + PaymentFrom.RAZOR_PAY -> { + val hashMap = HashMap() + + val amount = (binding.etAmount.text.toString().toInt()) * 100 + hashMap["balance"] = amount.toString() + viewModel.razorPayCreateOrder(hashMap) + } + + PaymentFrom.CCA_VENUE -> { + //startActivity(Intent(this, InitialScreenActivity::class.java)) + } + } + } + } + } + + binding.tvMoney1.setOnClickListener { + updateMoney(500) + } + + binding.tvMoney2.setOnClickListener { + updateMoney(1000) + } + + binding.tvMoney3.setOnClickListener { + updateMoney(1500) + } + + } + + private fun updateMoney(amount: Int) { + val newAmount = if (binding.etAmount.text.toString().isEmpty()) + amount + else + binding.etAmount.text.toString().toInt() + amount + + if (newAmount.toString().length < 5) { + binding.etAmount.setText(newAmount.toString()) + } + } + + + private fun bindObservers() { + viewModel.addMoney.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + /*If need authontication*/ + if (it.data?.requires_source_action == true) { + startActivityForResult(Intent(this, WebViewActivity::class.java) + .putExtra(WebViewActivity.LINK_TITLE, getString(R.string.payment)) + .putExtra(WebViewActivity.PAYMENT_URL, it.data.url) + .putExtra(EXTRA_REQUEST_ID, it.data.transaction_id), AppRequestCode.ADD_MONEY) + } else { + setResult(Activity.RESULT_OK) + finish() + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.cardListing.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + + items.clear() + items.addAll(it.data?.cards ?: emptyList()) + if (items.isNotEmpty()) { + items[0].isSelected = true + selectedCardId = items[0].id ?: "" + } + + adapter.notifyDataSetChanged() + + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + adapter.setAllItemsLoaded(true) + + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + + viewModel.orderCreate.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + order_id = it.data?.order_id + + if (order_id?.isNotEmpty() == true) + startRazorPayPayment(binding.etAmount.text.toString(), order_id + ?: "") + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.deleteCard.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + viewModel.cardListing(HashMap()) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.razorPayWebhook.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + setResult(Activity.RESULT_OK) + finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + fun editCard(item: Wallet) { + startActivityForResult(Intent(this, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.ADD_CARD) + .putExtra(CARD_DETAILS, item), AppRequestCode.ADD_MONEY) + } + + fun deleteCard(item: Wallet) { + AlertDialogUtil.instance.createOkCancelDialog( + this, R.string.delete, + R.string.delete_message, R.string.delete, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(this@AddMoneyActivity, true)) { + val hashMap = HashMap() + + hashMap["card_id"] = item.id ?: "" + viewModel.deleteCard(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (resultCode == Activity.RESULT_OK) { + if (requestCode == AppRequestCode.ADD_CARD) { + viewModel.cardListing(HashMap()) + } else if (requestCode == AppRequestCode.ADD_MONEY) { + setResult(Activity.RESULT_OK) + finish() + } + } + } + + + val TAG: String = AddMoneyActivity::class.toString() + + private fun loadRazorPay() { + /* + * To ensure faster loading of the Checkout form, + * call this method as early as possible in your checkout flow + * */ + Checkout.preload(this) + } + + private fun startRazorPayPayment(amount: String, orderId: String) { + /* + * You need to pass current activity in order to let Razorpay create CheckoutActivity + * */ + + val activity: Activity = this + val co = Checkout() + co.setKeyID(appClientDetails.gateway_key ?: "") + + try { + val userData = userRepository.getUser() + + val options = JSONObject() + options.put("name", getString(R.string.app_name)) + options.put("description", "Charges") + //You can omit the image option to fetch the image from dashboard + options.put("image", getImageBaseUrl(ImageFolder.UPLOADS, appClientDetails.applogo)) + options.put("currency", "INR") + val colorTheme = "#" + Integer.toHexString(ContextCompat.getColor(this, R.color.colorPrimary) and 0x00ffffff) + options.put("theme.color", colorTheme) + options.put("order_id", orderId) + options.put("amount", (amount.toInt() * 100)) + + options.put("user_id", userData?.id) + val prefill = JSONObject() + prefill.put("email", userData?.email) + prefill.put("contact", "${userData?.country_code}${userData?.phone}") + + options.put("prefill", prefill) + + if (this.packageName.equals(BuildConfig.APPLICATION_ID)) + co.open(activity, options) + } catch (e: Exception) { + Toast.makeText(activity, "Error in payment: " + e.message, Toast.LENGTH_LONG).show() + e.printStackTrace() + } + } + + override fun onPaymentError(errorCode: Int, response: String?) { + try { + Toast.makeText(this, + "Payment failed $errorCode \n $response", Toast.LENGTH_LONG).show() + } catch (e: Exception) { + Log.e(TAG, "Exception in onPaymentSuccess", e) + } + } + + override fun onPaymentSuccess(razorpayPaymentId: String?) { + try { + Toast.makeText(this, "Payment Successful $razorpayPaymentId", + Toast.LENGTH_LONG).show() + + val hashMap = HashMap() + hashMap["razorpayPaymentId"] = razorpayPaymentId ?: "" + hashMap["order_id"] = order_id ?: "" + viewModel.razorPayWebhook(hashMap) + + /*setResult(Activity.RESULT_OK) + finish()*/ + } catch (e: Exception) { + Log.e(TAG, "Exception in onPaymentSuccess", e) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/CardsAdapter.kt b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/CardsAdapter.kt new file mode 100644 index 0000000..4c982e0 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/dashboard/wallet/addmoney/CardsAdapter.kt @@ -0,0 +1,87 @@ +package com.consultantvendor.ui.dashboard.wallet.addmoney + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Wallet +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemCardsBinding + + +class CardsAdapter(private val activity: AddMoneyActivity, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_cards, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemCardsBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clCard.setOnClickListener { + val clickedPosition = adapterPosition + if (!items[clickedPosition].isSelected) { + activity.selectedCardId = items[clickedPosition].id ?: "" + items.forEachIndexed { index, wallet -> + items[index].isSelected = index == clickedPosition + notifyDataSetChanged() + } + } + } + + binding.tvEdit.setOnClickListener { + activity.editCard(items[adapterPosition]) + } + + binding.tvDelete.setOnClickListener { + activity.deleteCard(items[adapterPosition]) + } + } + + fun bind(wallet: Wallet) = with(binding) { + + binding.rbSelect.isChecked = wallet.isSelected + binding.tvCardName.text = binding.root.context.getString(R.string.card_ending_with, + wallet.card_brand, wallet.last_four_digit) + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/DrawerActivity.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/DrawerActivity.kt new file mode 100644 index 0000000..6cdbc5e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/DrawerActivity.kt @@ -0,0 +1,150 @@ +package com.consultantvendor.ui.drawermenu + +import android.Manifest +import android.content.pm.PackageManager +import android.os.Bundle +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import com.consultantvendor.R +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityContainerBinding +import com.consultantvendor.ui.chat.ChatFragment +import com.consultantvendor.ui.dashboard.feeds.AddFeedFragment +import com.consultantvendor.ui.dashboard.feeds.FeedDetailsFragment +import com.consultantvendor.ui.dashboard.feeds.FeedsFragment +import com.consultantvendor.ui.dashboard.home.AppointmentFragment +import com.consultantvendor.ui.dashboard.home.appointment.detail.AppointmentDetailsFragment +import com.consultantvendor.ui.dashboard.home.healthtool.bmichecker.BmiCheckerFragment +import com.consultantvendor.ui.dashboard.home.healthtool.pregnancycalculator.PregnancyCalculatorFragment +import com.consultantvendor.ui.dashboard.home.healthtool.protienintake.ProteinIntakeFragment +import com.consultantvendor.ui.dashboard.home.healthtool.waterintake.WaterIntakeFragment +import com.consultantvendor.ui.dashboard.home.prescription.digital.DigitalPrescriptionFragment +import com.consultantvendor.ui.dashboard.home.prescription.manual.ManualPrescriptionFragment +import com.consultantvendor.ui.dashboard.home.questions.QuestionsFragment +import com.consultantvendor.ui.dashboard.home.questions.detail.QuestionDetailFragment +import com.consultantvendor.ui.dashboard.language.LanguageFragment +import com.consultantvendor.ui.dashboard.location.LocationFragment +import com.consultantvendor.ui.dashboard.settings.contactlist.ContactListFragment +import com.consultantvendor.ui.dashboard.success.NetworkIssueFragment +import com.consultantvendor.ui.dashboard.wallet.PayoutFragment +import com.consultantvendor.ui.dashboard.wallet.WalletFragment +import com.consultantvendor.ui.dashboard.wallet.addmoney.AddCardFragment +import com.consultantvendor.ui.drawermenu.classes.ClassesFragment +import com.consultantvendor.ui.drawermenu.history.HistoryFragment +import com.consultantvendor.ui.drawermenu.notification.NotificationFragment +import com.consultantvendor.ui.drawermenu.profile.ProfileFragment +import com.consultantvendor.ui.loginSignUp.changepassword.ChangePasswordFragment +import com.consultantvendor.ui.walkthrough.WalkThroughFragment +import com.consultantvendor.utils.* +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + +class DrawerActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + lateinit var binding: ActivityContainerBinding + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initialise() + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + binding = DataBindingUtil.setContentView(this, R.layout.activity_container) + + + val permissionState = + ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) + if (permissionState == PackageManager.PERMISSION_DENIED) { + ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1) + + } + + when (intent.getStringExtra(PAGE_TO_OPEN)) { + NETWORK_ERROR -> addFragment(NetworkIssueFragment()) + HISTORY -> addFragment(HistoryFragment()) + CHANGE_PASSWORD -> addFragment(ChangePasswordFragment()) + LANGUAGE_SCREEN -> addFragment(LanguageFragment()) + PROFILE -> addFragment(ProfileFragment()) + NOTIFICATION -> addFragment(NotificationFragment()) + USER_CHAT -> addFragment(ChatFragment()) + PAYOUT, BANK_INFO -> addFragment(PayoutFragment()) + WALLET -> addFragment(WalletFragment()) + CLASSES -> addFragment(ClassesFragment()) + ADD_CARD -> addFragment(AddCardFragment()) + APPOINTMENT -> addFragment(AppointmentFragment()) + APPOINTMENT_DETAILS -> addFragment(AppointmentDetailsFragment()) + BlogType.BLOG, BlogType.ARTICLE -> addFragment(FeedsFragment()) + ADD_ARTICLE, ADD_BLOG -> addFragment(AddFeedFragment()) + BLOGS_DETAILS -> { + val fragment = FeedDetailsFragment() + val bundle = Bundle() + bundle.putSerializable(EXTRA_REQUEST_ID, intent.getSerializableExtra(EXTRA_REQUEST_ID)) + fragment.arguments = bundle + addFragment(fragment) + } + PrescriptionType.MANUAL -> addFragment(ManualPrescriptionFragment()) + PrescriptionType.DIGITAL -> addFragment(DigitalPrescriptionFragment()) + WalkThroughFragment.WALK_THROUGH_SCREEN -> addFragment(WalkThroughFragment()) + LOCATION -> addFragment(LocationFragment()) + MY_QUESTION -> addFragment(QuestionsFragment()) + QUESTION_DETAILS -> { + val fragment = QuestionDetailFragment() + val bundle = Bundle() + bundle.putString(EXTRA_REQUEST_ID, intent.getStringExtra(EXTRA_REQUEST_ID)) + fragment.arguments = bundle + + addFragment(fragment) + } + BMI_CHECKER -> addFragment(BmiCheckerFragment()) + WATER_INTAKE -> addFragment(WaterIntakeFragment()) + PROTEIN_INTAKE -> addFragment(ProteinIntakeFragment()) + PREGNANCY_CALCULATOR -> addFragment(PregnancyCalculatorFragment()) + CONTACT_LIST -> addFragment(ContactListFragment()) + } + } + + private fun addFragment(fragment: Fragment) { + addFragment(supportFragmentManager, fragment, R.id.container) + } + + companion object { + const val NETWORK_ERROR = "NETWORK_ERROR" + const val HISTORY = "HISTORY" + const val CHANGE_PASSWORD = "CHANGE_PASSWORD" + const val LANGUAGE_SCREEN = "LANGUAGE_SCREEN" + const val PROFILE = "PROFILE" + const val NOTIFICATION = "NOTIFICATION" + const val USER_CHAT = "USER_CHAT" + const val PAYOUT = "PAYOUT" + const val WALLET="WALLET" + const val CLASSES = "CLASSES" + const val ADD_CARD = "ADD_CARD" + const val APPOINTMENT = "APPOINTMENT" + const val APPOINTMENT_DETAILS="APPOINTMENT_DETAILS" + const val ADD_ARTICLE = "ADD_ARTICLE" + const val ADD_BLOG = "ADD_BLOG" + const val BLOGS_DETAILS = "BLOGS_DETAILS" + const val LOCATION = "LOCATION" + const val MY_QUESTION = "MY_QUESTION" + const val QUESTION_DETAILS = "QUESTION_DETAILS" + const val BMI_CHECKER = "BMI_CHECKER" + const val WATER_INTAKE = "WATER_INTAKE" + const val PROTEIN_INTAKE = "PROTEIN_INTAKE" + const val PREGNANCY_CALCULATOR = "PREGNANCY_CALCULATOR" + const val BANK_INFO = "BANK_INFO" + const val CONTACT_LIST = "CONTACT_LIST" + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesAdapter.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesAdapter.kt new file mode 100644 index 0000000..d41beb7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesAdapter.kt @@ -0,0 +1,101 @@ +package com.consultantvendor.ui.drawermenu.classes + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.ClassData +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemClassBinding +import com.consultantvendor.utils.* + + +class ClassesAdapter(private val fragment: ClassesFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_class, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemClassBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvStartClass.setOnClickListener { + fragment.startClass(adapterPosition) + } + + binding.tvCompleteClass.setOnClickListener { + fragment.completeClass(adapterPosition) + } + } + + fun bind(item: ClassData) = with(binding) { + val context = binding.root.context + slideRecyclerItem(binding.root, context) + + tvName.text = item.created_by?.name + tvDesc.text = item.created_by?.categoryData?.name ?: context.getString(R.string.na) + + loadImage("profile",binding.ivPic, item.created_by?.profile_image, R.drawable.ic_profile_placeholder) + + tvClassName.text = item.name + + val classTime = DateUtils.dateTimeFormatFromUTC(DateFormat.DATE_TIME_FORMAT, item.bookingDateUTC) + tvClassTime.text = classTime + tvClassPrice.text = getCurrency(item.price) + tvUsers.text = "${context.getString(R.string.user_joined)} : ${item.totalAssignedUser}" + + when (item.status) { + ClassType.STARTED -> { + tvCompleteClass.visible() + tvStartClass.visible() + } + ClassType.COMPLETED -> { + tvCompleteClass.gone() + tvStartClass.gone() + } + ClassType.ADDED -> { + tvCompleteClass.gone() + tvStartClass.visible() + } + } + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesFragment.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesFragment.kt new file mode 100644 index 0000000..f29e64a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesFragment.kt @@ -0,0 +1,277 @@ +package com.consultantvendor.ui.drawermenu.classes + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.ClassData +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.models.responses.JitsiClass +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityListingToolbarBinding +import com.consultantvendor.ui.drawermenu.classes.addclass.AddClassFragment +import com.consultantvendor.ui.jitsimeet.JitsiActivity +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class ClassesFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: ClassesAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var classSelectedData: ClassData? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + binding.tvHeader.text = getString(R.string.classes) + binding.tvAdd.visible() + + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_classes) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_classes_desc) + } + + private fun setAdapter() { + adapter = ClassesAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvAdd.setOnClickListener { + replaceResultFragment(this, AddClassFragment(), R.id.container, AppRequestCode.ADD_CLASS) + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["type"] = "VENDOR_ADDED" + + viewModel.classesList(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.classes.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.classes ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModel.classStatus.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + startClassAction(it.data) + hitApi(true) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (resultCode == Activity.RESULT_OK) { + if (requestCode == AppRequestCode.ADD_CLASS) { + hitApi(true) + } + } + } + + fun startClass(pos: Int) { + classSelectedData = items[pos] + + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.start_class, + R.string.start_class_message, R.string.start_class, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["class_id"] = classSelectedData?.id ?: "" + hashMap["status"] = ClassType.STARTED + viewModel.classStatus(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + fun completeClass(pos: Int) { + classSelectedData = items[pos] + + AlertDialogUtil.instance.createOkCancelDialog(requireActivity(), R.string.complete_class, + R.string.complete_class_message, R.string.complete_class, R.string.cancel, false, + object : AlertDialogUtil.OnOkCancelDialogListener { + override fun onOkButtonClicked() { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["class_id"] = classSelectedData?.id ?: "" + hashMap["status"] = ClassType.COMPLETED + viewModel.classStatus(hashMap) + } + } + + override fun onCancelButtonClicked() { + } + }).show() + } + + private fun startClassAction(data: CommonDataModel?) { + /*Data for jitsi class*/ + val jitsiClass = JitsiClass() + jitsiClass.id = classSelectedData?.id + jitsiClass.name = classSelectedData?.name + jitsiClass.isClass = true + + if (classSelectedData?.status != ClassType.COMPLETED) { + startActivity(Intent(requireActivity(), JitsiActivity::class.java) + .putExtra(EXTRA_CALL_NAME, jitsiClass)) + } + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesViewModel.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesViewModel.kt new file mode 100644 index 0000000..d2dfd26 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/ClassesViewModel.kt @@ -0,0 +1,173 @@ +package com.consultantvendor.ui.drawermenu.classes + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class ClassesViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val addClass by lazy { SingleLiveEvent>() } + + val classStatus by lazy { SingleLiveEvent>() } + + val categories by lazy { SingleLiveEvent>() } + + val classes by lazy { SingleLiveEvent>() } + + val services by lazy { SingleLiveEvent>() } + + val getFilters by lazy { SingleLiveEvent>() } + + + fun addClass(hashMap: HashMap) { + addClass.value = Resource.loading() + + webService.addClass(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + addClass.value = Resource.success(response.body()?.data) + } else { + addClass.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + addClass.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun classStatus(hashMap: HashMap) { + classStatus.value = Resource.loading() + + webService.classStatus(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + classStatus.value = Resource.success(response.body()?.data) + } else { + classStatus.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + classStatus.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun classesList(hashMap: HashMap) { + classes.value = Resource.loading() + + webService.classesList(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + classes.value = Resource.success(response.body()?.data) + } else { + classes.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + classes.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun categories(hashMap: HashMap) { + categories.value = Resource.loading() + + webService.categories(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + categories.value = Resource.success(response.body()?.data) + } else { + categories.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + categories.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun services(hashMap: HashMap) { + services.value = Resource.loading() + + webService.services(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + services.value = Resource.success(response.body()?.data) + } else { + services.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + services.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getFilters(hashMap: HashMap) { + getFilters.value = Resource.loading() + + webService.getFilters(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getFilters.value = Resource.success(response.body()?.data) + } else { + getFilters.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getFilters.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/addclass/AddClassFragment.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/addclass/AddClassFragment.kt new file mode 100644 index 0000000..54e17ab --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/classes/addclass/AddClassFragment.kt @@ -0,0 +1,144 @@ +package com.consultantvendor.ui.drawermenu.classes.addclass + +import android.app.TimePickerDialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentAddClassBinding +import com.consultantvendor.ui.drawermenu.classes.ClassesViewModel +import com.consultantvendor.ui.loginSignUp.availability.OnTimeSelected +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import java.text.SimpleDateFormat +import java.util.* +import javax.inject.Inject +import kotlin.collections.HashMap + +class AddClassFragment : DaggerFragment(), OnDateSelected, OnTimeSelected { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentAddClassBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: ClassesViewModel + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_add_class, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.ilPrice.prefixText = getCurrencySymbol() + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.tvAddClass.setOnClickListener { + checkValidation() + } + + binding.etDate.setOnClickListener { + DateUtils.openDatePicker(requireActivity(), this, null, (System.currentTimeMillis() - 36000)) + } + + binding.etTime.setOnClickListener { + DateUtils.getTime(requireContext(), listener = this) + } + } + + + private fun checkValidation() { + when { + binding.etTitle.text.toString().trim().isEmpty() -> { + binding.etTitle.showSnackBar(getString(R.string.class_name)) + } + binding.etDate.text.toString().trim().isEmpty() -> { + binding.etDate.showSnackBar(getString(R.string.select_date)) + } + binding.etTime.text.toString().trim().isEmpty() -> { + binding.etTime.showSnackBar(getString(R.string.select_time)) + } + binding.etPrice.text.toString().trim().isEmpty() -> { + binding.etPrice.showSnackBar(getString(R.string.price_of_class)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["category_id"] = userRepository.getUser()?.categoryData?.id ?: "" + hashMap["name"] = binding.etTitle.text.toString().trim() + hashMap["date"] = DateUtils.dateFormatForBackend(DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, binding.etDate.text.toString()) + hashMap["time"] = DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT_24, binding.etTime.text.toString()) + hashMap["price"] = binding.etPrice.text.toString().trim() + viewModel.addClass(hashMap) + } + } + } + + + private fun bindObservers() { + + viewModel.addClass.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + resultFragmentIntent(this, targetFragment ?: this, + AppRequestCode.ADD_CLASS, null) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onDateSelected(date: String) { + binding.etDate.setText(date) + } + + override fun onTimeSelected(time: Triple) { + binding.etTime.setText(time.first) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/history/HistoryAdapter.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/history/HistoryAdapter.kt new file mode 100644 index 0000000..d39afd9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/history/HistoryAdapter.kt @@ -0,0 +1,81 @@ +package com.consultantvendor.ui.drawermenu.history + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Wallet +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemHistoryBinding +import com.consultantvendor.utils.DateFormat +import com.consultantvendor.utils.DateUtils +import com.consultantvendor.utils.getCurrency +import com.consultantvendor.utils.loadImage + + +class HistoryAdapter(private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.rv_item_history, parent, false + ) + ) + } else { + ViewHolderLoader( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false + ) + ) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemHistoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Wallet) = with(binding) { + tvName.text = item.from?.name + if(item.from?.profile_image.isNullOrBlank()) + loadImage("profile",binding.ivPic, "https://nurselynx.netsolutionindia.com/default/user.jpg",0) + else + loadImage("profile",binding.ivPic, item.from?.profile_image, R.drawable.ic_profile_placeholder) + + tvPrice.text = "+${getCurrency(item.amount)}" + tvCallTime.text = DateUtils.dateTimeFormatFromUTC(DateFormat.DATE_TIME_FORMAT, item.created_at) + + tvRequestType.text = item.service_type + } + } + + private fun convertSecondsToMinute(seconds: Long): String { + val s = seconds % 60 + val m = seconds / 60 % 60 + return String.format("%02d:%02d min.", m, s) + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/history/HistoryFragment.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/history/HistoryFragment.kt new file mode 100644 index 0000000..07251e2 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/history/HistoryFragment.kt @@ -0,0 +1,165 @@ +package com.consultantvendor.ui.drawermenu.history + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Wallet +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.ActivityListingToolbarBinding +import com.consultantvendor.ui.dashboard.wallet.WalletViewModel +import com.consultantvendor.utils.* +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class HistoryFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: WalletViewModel + + private var items = ArrayList() + + private lateinit var adapter: HistoryAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + binding.tvHeader.text = getString(R.string.history) + + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_requests_empty_state) + binding.clNoData.tvNoData.text = getString(R.string.no_transaction) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_transaction_desc) + } + + private fun setAdapter() { + adapter = HistoryAdapter(items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["transaction_type"] = WalletMoney.DEPOSIT + + viewModel.walletHistory(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.walletHistory.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.payments ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/notification/NotificationAdapter.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/notification/NotificationAdapter.kt new file mode 100644 index 0000000..6a222b4 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/notification/NotificationAdapter.kt @@ -0,0 +1,72 @@ +package com.consultantvendor.ui.drawermenu.notification + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Notification +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemNotificationBinding +import com.consultantvendor.utils.DateUtils.getTimeAgo +import com.consultantvendor.utils.loadImage +import com.consultantvendor.utils.slideRecyclerItem + + +class NotificationAdapter(private val fragment: NotificationFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_notification, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemNotificationBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clMain.setOnClickListener { + fragment.clickItem(bindingAdapterPosition) + } + } + + + fun bind(item: Notification) = with(binding) { + slideRecyclerItem(binding.root, binding.root.context) + + tvName.text = item.message + + loadImage("profile",binding.ivPic, item.form_user?.profile_image, + R.drawable.ic_profile_placeholder) + + tvCallDuration.text = getTimeAgo(item.created_at).replace("-","") + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + + diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/notification/NotificationFragment.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/notification/NotificationFragment.kt new file mode 100644 index 0000000..5f64a2d --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/notification/NotificationFragment.kt @@ -0,0 +1,196 @@ +package com.consultantvendor.ui.drawermenu.notification + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Notification +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.ActivityListingToolbarBinding +import com.consultantvendor.ui.chat.ChatViewModel +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.utils.* +import dagger.android.support.DaggerFragment +import kotlinx.android.synthetic.main.item_no_data.view.* +import javax.inject.Inject + +class NotificationFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityListingToolbarBinding + + private var rootView: View? = null + + private lateinit var viewModel: ChatViewModel + + private var items = ArrayList() + + private lateinit var adapter: NotificationAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.activity_listing_toolbar, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + binding.tvHeader.text = getString(R.string.notification) + + viewModel = ViewModelProvider(this, viewModelFactory)[ChatViewModel::class.java] + + binding.clNoData.ivNoData.setImageResource(R.drawable.ic_notifications_empty) + binding.clNoData.tvNoData.text = getString(R.string.no_notification) + binding.clNoData.tvNoDataDesc.text = getString(R.string.no_notification_desc) + + } + + private fun setAdapter() { + adapter = NotificationAdapter(this, items) + binding.rvListing.adapter = adapter + binding.rvListing.itemAnimator = null + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.notifications(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.notifications.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.notifications ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + items.addAll(tempList) + + adapter.notifyDataSetChanged() + } else { + val oldSize = items.size + items.addAll(tempList) + + adapter.notifyItemRangeInserted(oldSize, items.size) + } + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.clNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + + binding.swipeRefresh.isRefreshing = false + binding.clLoader.gone() + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!isLoadingMoreItems && !binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + } + + fun clickItem(pos: Int) { + val item = items[pos] + + when (item.pushType) { + PushType.NEW_REQUEST, PushType.REQUEST_FAILED, PushType.REQUEST_COMPLETED, PushType.PATIENT_ADDED_SYMPTOMS, + PushType.CANCELED_REQUEST, PushType.RESCHEDULED_REQUEST, PushType.UPCOMING_APPOINTMENT, + PushType.PAID_EXTRA_PAYMENT -> { + openScreen(DrawerActivity.APPOINTMENT_DETAILS, item.module_id ?: "") + } + } + } + + private fun openScreen(page: String, id: String = "") { + val intent = Intent(requireContext(), DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, page) + + if (id.isNotEmpty()) + intent.putExtra(EXTRA_REQUEST_ID, id) + + startActivity(intent) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/drawermenu/profile/ProfileFragment.kt b/app/src/main/java/com/consultantvendor/ui/drawermenu/profile/ProfileFragment.kt new file mode 100644 index 0000000..22b2500 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/drawermenu/profile/ProfileFragment.kt @@ -0,0 +1,192 @@ +package com.consultantvendor.ui.drawermenu.profile + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.activity.result.ActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentProfileBinding +import com.consultantvendor.ui.dashboard.home.AppointmentViewModel +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.SignUpActivity +import com.consultantvendor.ui.loginSignUp.document.DocumentsFragment +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import permissions.dispatcher.* +import javax.inject.Inject + +class ProfileFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentProfileBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: AppointmentViewModel + + private lateinit var viewModelLogin: LoginViewModel + + private var userData: UserData? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_profile, container, false) + rootView = binding.root + + initialise() + setUserProfile() + hiApiDoctorDetail() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[AppointmentViewModel::class.java] + viewModelLogin = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun hiApiDoctorDetail() { + if (isConnectedToInternet(requireContext(), true)) { + viewModelLogin.profile() + } + } + + private fun setUserProfile() { + userData = userRepository.getUser() + + binding.tvName.text = getDoctorName(userData) + loadImage("profile",binding.ivPic, userData?.profile_image, R.drawable.ic_profile_placeholder) + binding.tvBioV.text = userData?.profile?.bio ?: getString(R.string.na) + binding.tvEmailV.text = userData?.email ?: getString(R.string.na) + binding.tvPhoneV.text = "${userData?.country_code ?: ""} ${userData?.phone ?: ""}" + binding.tvDOBV.text = userData?.profile?.dob ?: getString(R.string.na) + binding.tvDesc.text = userData?.categoryData?.name ?: getString(R.string.na) + + binding.tvRating.text = getString(R.string.s_s_reviews, + getUserRating(userData?.totalRating), userData?.reviewCount) + + binding.tvPatientV.text = userData?.patientCount ?: getString(R.string.na) + binding.tvExperienceV.text = + "${getAge(userData?.profile?.working_since)} ${getString(R.string.years)}" + binding.tvReviewsV.text = userData?.reviewCount ?: getString(R.string.na) + + if (!userData?.profile?.dob.isNullOrEmpty()) + binding.tvDOBV.text = DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.dob ?: "") + + binding.tvSetPrefrences.hideShowView(userData?.filters?.isNotEmpty() == true) + binding.tvDocuments.hideShowView(userData?.categoryData?.is_additionals == true) + + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().finish() + } + + binding.tvEdit.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(UPDATE_PROFILE, true)) + } + + binding.tvPhoneUpdate.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(UPDATE_NUMBER, true)) + } + + binding.tvSetAvailability.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(CATEGORY_PARENT_ID, userData?.categoryData) + .putExtra(UPDATE_AVAILABILITY, true)) + } + + binding.tvSetPrefrences.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(CATEGORY_PARENT_ID, userData?.categoryData) + .putExtra(UPDATE_PREFRENCES, true)) + + } + + binding.tvDocuments.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(CATEGORY_PARENT_ID, userData?.categoryData) + .putExtra(DocumentsFragment.UPDATE_DOCUMENTS, true)) + + } + + binding.tvUpdateCategory.setOnClickListener { + registerActivityResult.launch(Intent(requireActivity(), SignUpActivity::class.java) + .putExtra(UPDATE_CATEGORY, true)) + + } + + + binding.ivPic.setOnClickListener { + val itemImages = java.util.ArrayList() + //itemImages.add(getImageBaseUrl(ImageFolder.UPLOADS,userRepository.getUser()?.profile_image)) + itemImages.add( userRepository.getUser()?.profile_image.toString()) + viewImageFull(requireActivity(), itemImages, 0) + } + } + + private val registerActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + //val intent = result.data + setUserProfile() + requireActivity().setResult(Activity.RESULT_OK) + } + } + + + + private fun bindObservers() { + + viewModelLogin.profile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + setUserProfile() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(false) + } + } + }) + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/jitsimeet/JitsiActivity.kt b/app/src/main/java/com/consultantvendor/ui/jitsimeet/JitsiActivity.kt new file mode 100644 index 0000000..13e5a85 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/jitsimeet/JitsiActivity.kt @@ -0,0 +1,235 @@ +package com.consultantvendor.ui.jitsimeet + +import android.Manifest +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.content.pm.PackageManager +import android.os.Bundle +import android.view.WindowManager +import androidx.core.app.ActivityCompat +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.models.responses.JitsiClass +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.ui.calling.Constants +import com.consultantvendor.ui.calling.SoundPoolManager +import com.consultantvendor.utils.* +import com.facebook.react.modules.core.PermissionListener +import dagger.android.support.DaggerAppCompatActivity +import org.jitsi.meet.sdk.* +import org.jitsi.meet.sdk.log.JitsiMeetLogger +import java.net.MalformedURLException +import java.net.URL +import javax.inject.Inject + + +class JitsiActivity : DaggerAppCompatActivity(), JitsiMeetActivityInterface, JitsiMeetViewListener { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + private var isReceiverRegistered = false + + private var jitsiMeetView: JitsiMeetView? = null + + private var jitsiClass: JitsiClass? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + //setContentView(R.layout.activity_jitsi) + + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or + WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED) + + checkPermission() + jitsiMeetView = JitsiMeetView(this) + + jitsiClass = intent.getSerializableExtra(EXTRA_CALL_NAME) as JitsiClass + val roomName: String + val subjectName: String + + if (jitsiClass?.isClass == false) { + roomName = "Call_${appClientDetails.jitsi_id}_${jitsiClass?.id}" + subjectName = "Call" + } else { + roomName = "Class_${appClientDetails.jitsi_id}_${jitsiClass?.id}" + subjectName = jitsiClass?.name ?: "" + } + + //longToast("$roomName,$subjectName") + + + // Initialize default options for Jitsi Meet conferences. + val serverURL: URL = try { + URL(appClientDetails.jitsi_meet_url) + } catch (e: MalformedURLException) { + e.printStackTrace() + throw RuntimeException("Invalid server URL!") + } + val defaultOptions = JitsiMeetConferenceOptions.Builder() + .setServerURL(serverURL) + // .setWelcomePageEnabled(false) + .setFeatureFlag("invite.enabled", false) + .setFeatureFlag("chat.enabled", false) + .setFeatureFlag("calendar.enabled", false) + .setFeatureFlag("call-integration.enabled", false) + .setFeatureFlag("live-streaming.enabled", false) + .setFeatureFlag("recording.enabled", false) + .setFeatureFlag("tile-view.enabled", false) + .setFeatureFlag("meeting-password.enabled", false) + .setFeatureFlag("pip.enabled", true) + .setFeatureFlag("close-captions.enabled", false) + .build() + JitsiMeet.setDefaultConferenceOptions(defaultOptions) + + if (roomName.isNotEmpty()) { + // Build options object for joining the conference. The SDK will merge the default + // one we set earlier and this one when joining. + val userInfo = JitsiMeetUserInfo() + val userData = userRepository.getUser() + userInfo.displayName = userData?.name + userInfo.avatar = URL(getImageBaseUrl(ImageFolder.UPLOADS, userData?.profile_image)) + + val setAudioOnly = jitsiClass?.callType?.toLowerCase() == ConsultType.AUDIO_CALL + + val options = JitsiMeetConferenceOptions.Builder() + .setUserInfo(userInfo) + .setRoom(roomName) + .setSubject(subjectName) + .setAudioOnly(setAudioOnly) + .build() + // Launch the new activity with the given options. The launch() method takes care + // of creating the required Intent and passing the options. + /* JitsiMeetActivity.launch(this, options) + finish()*/ + + jitsiMeetView?.join(options) + + setContentView(jitsiMeetView) + jitsiMeetView?.listener = this + + SoundPoolManager.getInstance(this)?.stopRinging() + } + } + + override fun onBackPressed() { + } + + + override fun requestPermissions(p0: Array?, p1: Int, p2: PermissionListener?) { + JitsiMeetActivityDelegate.requestPermissions(this, p0, p1, p2) + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + JitsiMeetActivityDelegate.onRequestPermissionsResult(requestCode, permissions, grantResults) + } + + override fun onConferenceJoined(data: Map) { + JitsiMeetLogger.i("Conference joined: $data") + // Launch the service for the ongoing notification. + // JitsiMeetOngoingConferenceService.launch(this); + } + + override fun onConferenceTerminated(data: Map) { + JitsiMeetLogger.i("Conference terminated: $data") + + if (isConnectedToInternet(this, true) && jitsiClass?.isClass == false) { + userRepository.callStatus(jitsiClass?.id ?: "", jitsiClass?.call_id ?: "", + PushType.CALL_CANCELED) + + longToast(getString(R.string.disconnecting)) + } + + jitsiMeetView?.listener = null + jitsiMeetView?.leave() + finish() + } + + override fun onConferenceWillJoin(data: Map) { + JitsiMeetLogger.i("Conference will join: $data") + } + + + private fun checkPermission() { + val PERMISSIONS = arrayOf(Manifest.permission.RECORD_AUDIO, Manifest.permission.CAMERA) + if (!hasPermissions(*PERMISSIONS)) { + ActivityCompat.requestPermissions(this, PERMISSIONS, 100) + } + } + + fun hasPermissions(vararg permissions: String?): Boolean { + if (permissions != null) { + for (permission in permissions) { + if (ActivityCompat.checkSelfPermission(this, permission!!) != PackageManager.PERMISSION_GRANTED) { + return false + } + } + } + return true + } + + override fun onResume() { + super.onResume() + registerReceiver() + try { + JitsiMeetActivityDelegate.onHostResume(this) + } catch (e: Exception){} + } + + + override fun onStop() { + super.onStop() + JitsiMeetActivityDelegate.onHostPause(this) + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + JitsiMeetActivityDelegate.onHostDestroy(this) + jitsiMeetView?.leave() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(Constants.ACTION_INCOMING_CALL) + intentFilter.addAction(Constants.ACTION_CANCEL_CALL) + intentFilter.addAction(PushType.REQUEST_COMPLETED) + LocalBroadcastManager.getInstance(this).registerReceiver( + callCancelledReceiver, intentFilter + ) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(callCancelledReceiver) + isReceiverRegistered = false + + } + } + + private val callCancelledReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.getStringExtra(EXTRA_REQUEST_ID) == jitsiClass?.call_id) { + if (intent.action == Constants.ACTION_CANCEL_CALL || intent.action == PushType.REQUEST_COMPLETED) { + jitsiMeetView?.listener = null + jitsiMeetView?.leave() + finish() + } + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/LoginViewModel.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/LoginViewModel.kt new file mode 100644 index 0000000..0ad4739 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/LoginViewModel.kt @@ -0,0 +1,438 @@ +package com.consultantvendor.ui.loginSignUp + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.requests.UpdateDocument +import com.consultantvendor.data.models.requests.UpdateServices +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class LoginViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val login by lazy { SingleLiveEvent>() } + + val profile by lazy { SingleLiveEvent>() } + + val updateNumber by lazy { SingleLiveEvent>() } + + val register by lazy { SingleLiveEvent>() } + + val forgotPassword by lazy { SingleLiveEvent>() } + + val changePassword by lazy { SingleLiveEvent>() } + + val updateProfile by lazy { SingleLiveEvent>() } + + val logout by lazy { SingleLiveEvent>() } + + val sendSMS by lazy { SingleLiveEvent>() } + + val updateServices by lazy { SingleLiveEvent>() } + + val pagesLink by lazy { SingleLiveEvent>() } + + val additionalDetails by lazy { SingleLiveEvent>() } + + val additionalDetailsUpdate by lazy { SingleLiveEvent>() } + + val sendEmailOtp by lazy { SingleLiveEvent>() } + + val emailVerify by lazy { SingleLiveEvent>() } + + val pendingRequests by lazy { SingleLiveEvent>() } + + + fun login(hashMap: HashMap) { + login.value = Resource.loading() + + webService.login(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + login.value = Resource.success(response.body()?.data) + } else { + login.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + login.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun profile() { + profile.value = Resource.loading() + + webService.profile() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + profile.value = Resource.success(response.body()?.data) + } else { + profile.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + profile.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateNumber(hashMap: HashMap) { + updateNumber.value = Resource.loading() + + webService.updateNumber(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateNumber.value = Resource.success(response.body()?.data) + } else { + updateNumber.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateNumber.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun register(hashMap: HashMap) { + register.value = Resource.loading() + + webService.register(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + register.value = Resource.success(response.body()?.data) + } else { + register.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + register.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun forgotPassword(hashMap: HashMap) { + forgotPassword.value = Resource.loading() + + webService.forgotPassword(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + forgotPassword.value = Resource.success(response.body()?.data) + } else { + forgotPassword.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + forgotPassword.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun changePassword(hashMap: HashMap) { + changePassword.value = Resource.loading() + + webService.changePassword(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + changePassword.value = Resource.success(response.body()?.data) + } else { + changePassword.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + changePassword.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateProfile(hashMap: HashMap) { + updateProfile.value = Resource.loading() + + webService.updateProfile(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateProfile.value = Resource.success(response.body()?.data) + } else { + updateProfile.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateProfile.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun logout() { + logout.value = Resource.loading() + + webService.logout() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + logout.value = Resource.success(response.body()?.data) + } else { + logout.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + logout.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun sendSms(hashMap: HashMap) { + sendSMS.value = Resource.loading() + + webService.sendSMS(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + sendSMS.value = Resource.success(response.body()?.data) + } else { + sendSMS.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + sendSMS.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun updateServices(updateServiceModel: UpdateServices) { + updateServices.value = Resource.loading() + + webService.updateServices(updateServiceModel) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + updateServices.value = Resource.success(response.body()?.data) + } else { + updateServices.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + updateServices.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun getPages() { + pagesLink.value = Resource.loading() + + webService.getPages() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + pagesLink.value = Resource.success(response.body()?.data) + } else { + pagesLink.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + pagesLink.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun additionalDetails(hashMap: HashMap) { + additionalDetails.value = Resource.loading() + + webService.additionalDetails(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + additionalDetails.value = Resource.success(response.body()?.data) + } else { + additionalDetails.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + additionalDetails.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + + fun additionalDetailsUpdate(updateDocument: UpdateDocument) { + additionalDetailsUpdate.value = Resource.loading() + + webService.additionalDetailsUpdate(updateDocument) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + additionalDetailsUpdate.value = Resource.success(response.body()?.data) + } else { + additionalDetailsUpdate.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + additionalDetailsUpdate.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun sendEmailOtp(hashMap: HashMap) { + sendEmailOtp.value = Resource.loading() + + webService.sendEmailOtp(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + sendEmailOtp.value = Resource.success(response.body()?.data) + } else { + sendEmailOtp.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + sendEmailOtp.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun emailVerify(hashMap: HashMap) { + emailVerify.value = Resource.loading() + + webService.emailVerify(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + emailVerify.value = Resource.success(response.body()?.data) + } else { + emailVerify.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + emailVerify.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } + + fun pendingRequests() { + pendingRequests.value = Resource.loading() + + webService.pendingRequests() + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + pendingRequests.value = Resource.success(response.body()?.data) + } else { + pendingRequests.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + pendingRequests.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/SignUpActivity.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/SignUpActivity.kt new file mode 100644 index 0000000..0cf085c --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/SignUpActivity.kt @@ -0,0 +1,109 @@ +package com.consultantvendor.ui.loginSignUp + +import android.os.Bundle +import androidx.appcompat.app.AlertDialog +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import com.consultantvendor.R +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityContainerBinding +import com.consultantvendor.ui.loginSignUp.category.CategoryFragment +import com.consultantvendor.ui.loginSignUp.document.DocumentsFragment +import com.consultantvendor.ui.loginSignUp.document.DocumentsFragment.Companion.UPDATE_DOCUMENTS +import com.consultantvendor.ui.loginSignUp.login.LoginFragment +import com.consultantvendor.ui.loginSignUp.prefrence.PrefrenceFragment +import com.consultantvendor.ui.loginSignUp.service.ServiceFragment +import com.consultantvendor.ui.loginSignUp.signup.SignUpFragment +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantvendor.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantvendor.utils.* +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + +class SignUpActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + lateinit var binding: ActivityContainerBinding + + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + initialise() + //makeFullScreen(this) + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + + binding = DataBindingUtil.setContentView(this, R.layout.activity_container) + + val fragment: Fragment + val bundle = Bundle() + when { + intent.hasExtra(UPDATE_PROFILE) -> { + fragment = SignUpFragment() + bundle.putBoolean(UPDATE_PROFILE, true) + } + intent.hasExtra(UPDATE_NUMBER) -> { + fragment = LoginFragment() + bundle.putBoolean(UPDATE_NUMBER, true) + } + intent.hasExtra(UPDATE_DOCUMENTS) -> { + fragment = DocumentsFragment() + bundle.putBoolean(UPDATE_DOCUMENTS, true) + bundle.putSerializable(CATEGORY_PARENT_ID, intent.getSerializableExtra(CATEGORY_PARENT_ID)) + } + intent.hasExtra(UPDATE_AVAILABILITY) -> { + fragment = ServiceFragment() + bundle.putSerializable(CATEGORY_PARENT_ID, intent.getSerializableExtra(CATEGORY_PARENT_ID)) + } + intent.hasExtra(UPDATE_CATEGORY) -> { + fragment = CategoryFragment() + } + intent.hasExtra(UPDATE_PREFRENCES) -> { + fragment = PrefrenceFragment() + bundle.putSerializable(CATEGORY_PARENT_ID, intent.getSerializableExtra(CATEGORY_PARENT_ID)) + } + else -> { + fragment = WelcomeFragment() + } + } + + fragment.arguments = bundle + addFragment(supportFragmentManager, fragment, R.id.container) + + } + + override fun onBackPressed() { + val currentFragment = supportFragmentManager.findFragmentById(R.id.container) + var alertDialog: AlertDialog.Builder? = null + if (currentFragment is SignUpFragment && !intent.hasExtra(UPDATE_PROFILE)) { + try { + alertDialog = AlertDialog.Builder(this) + alertDialog.setCancelable(false) + alertDialog.setTitle(this.getString(R.string.alert)) + alertDialog.setMessage(this.getString(R.string.alert_message)) + alertDialog.setPositiveButton(this.getString(R.string.yes)) { _, _ -> + this.finish() + alertDialog = null + } + alertDialog!!.setNegativeButton(this.getString(R.string.no)) { _, _ -> + alertDialog = null + } + alertDialog?.show() + } catch (ignored: Exception) { + this.finish() + } + + } else { + super.onBackPressed() + } + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/DatesAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/DatesAdapter.kt new file mode 100644 index 0000000..b1aa0dd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/DatesAdapter.kt @@ -0,0 +1,64 @@ +package com.consultantvendor.ui.loginSignUp.availability + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DatesAvailability +import com.consultantvendor.databinding.ItemDatesBinding +import com.consultantvendor.utils.DateFormat.MON_DATE_YEAR +import com.consultantvendor.utils.DateUtils.dateFormatFromMillis +import java.util.* + +class DatesAdapter(private val fragment: SetAvailabilityFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_dates, parent, false)) + } + + inner class ViewHolder(val binding: ItemDatesBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(item: DatesAvailability) = with(binding) { + + cbName.text = when (absoluteAdapterPosition) { + 0 -> fragment.getString(R.string.today) + 1 -> fragment.getString(R.string.tomorrow) + else -> item.displayName + } + + cbDate.text = dateFormatFromMillis(MON_DATE_YEAR, item.date ?: 0) + + cbName.isChecked = item.isSelected + cbDate.isChecked = item.isSelected + + if (item.isSelected) { + clDate.setBackgroundResource(R.drawable.drawable_theme_stroke_4) + } else { + clDate.setBackgroundResource(R.drawable.drawable_bg_button) + } + + + clDate.setOnClickListener { + if (!item.isSelected) { + for (count: Int in 0 until items.size) { + items[count].isSelected = count == adapterPosition + notifyItemChanged(count) + } + fragment.onDateSelected(item) + } + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/GetSlotsViewModel.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/GetSlotsViewModel.kt new file mode 100644 index 0000000..d61713f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/GetSlotsViewModel.kt @@ -0,0 +1,42 @@ +package com.consultantvendor.ui.loginSignUp.availability + +import androidx.lifecycle.ViewModel +import com.consultantvendor.data.apis.WebService +import com.consultantvendor.data.models.responses.CommonDataModel +import com.consultantvendor.data.network.responseUtil.ApiResponse +import com.consultantvendor.data.network.responseUtil.ApiUtils +import com.consultantvendor.data.network.responseUtil.Resource +import com.consultantvendor.di.SingleLiveEvent +import retrofit2.Call +import retrofit2.Callback +import retrofit2.Response +import javax.inject.Inject + +class GetSlotsViewModel @Inject constructor(private val webService: WebService) : ViewModel() { + + val getSlots by lazy { SingleLiveEvent>() } + + fun getSlots(hashMap: HashMap) { + getSlots.value = Resource.loading() + + webService.getSlots(hashMap) + .enqueue(object : Callback> { + + override fun onResponse(call: Call>, + response: Response>) { + if (response.isSuccessful) { + getSlots.value = Resource.success(response.body()?.data) + } else { + getSlots.value = Resource.error( + ApiUtils.getError(response.code(), + response.errorBody()?.string())) + } + } + + override fun onFailure(call: Call>, throwable: Throwable) { + getSlots.value = Resource.error(ApiUtils.failure(throwable)) + } + + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/IntervalAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/IntervalAdapter.kt new file mode 100644 index 0000000..3a07d08 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/IntervalAdapter.kt @@ -0,0 +1,104 @@ +package com.consultantvendor.ui.loginSignUp.availability + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.Interval +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemAddIntervalBinding +import com.consultantvendor.databinding.RvItemIntervalBinding +import com.consultantvendor.utils.DateFormat +import com.consultantvendor.utils.DateUtils +import com.consultantvendor.utils.gone +import com.consultantvendor.utils.visible + + +class IntervalAdapter(private val fragment: SetAvailabilityFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + private val numberOfInterval = 2 + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType == LOADING) + (holder as ViewHolderLoader).bind() + else + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_interval, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_add_interval, parent, false)) + } + } + + override fun getItemCount(): Int = items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemIntervalBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvFromV.setOnClickListener { + fragment.selectTime(true, absoluteAdapterPosition) + } + + binding.tvToV.setOnClickListener { + fragment.selectTime(false, absoluteAdapterPosition) + } + } + + fun bind(item: Interval) = with(binding) { + if (!item.start_time.isNullOrEmpty()) + tvFromV.setText(DateUtils.dateFormatChange(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT, item.start_time ?: "")) + if (!item.end_time.isNullOrEmpty()) + tvToV.setText(DateUtils.dateFormatChange(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT, item.end_time ?: "")) + + ivDelete.setOnClickListener { + if (items.size > 1) { + items.removeAt(absoluteAdapterPosition) + notifyDataSetChanged() + } + } + } + } + + inner class ViewHolderLoader(val binding: ItemAddIntervalBinding) : + RecyclerView.ViewHolder(binding.root) { + init { + binding.tvNewInterval.setOnClickListener { + if (items.size < numberOfInterval) { + if (items[items.size - 1].start_time != null && items[items.size - 1].end_time != null) { + items.add(Interval()) + notifyDataSetChanged() + } + } + } + } + + fun bind() = with(binding) { + if (items.size < numberOfInterval) { + tvNewInterval.visible() + } else { + tvNewInterval.gone() + } + } + + } + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/SetAvailabilityFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/SetAvailabilityFragment.kt new file mode 100644 index 0000000..0cb3d84 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/SetAvailabilityFragment.kt @@ -0,0 +1,382 @@ +package com.consultantvendor.ui.loginSignUp.availability + +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DatesAvailability +import com.consultantvendor.data.models.requests.Interval +import com.consultantvendor.data.models.requests.SetAvailability +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentSetAvailabilityBinding +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.SERVICE_ID +import com.consultantvendor.utils.* +import com.consultantvendor.utils.DateUtils.dateFormatFromMillis +import com.consultantvendor.utils.DateUtils.dateFormatFromMillisBackend +import dagger.android.support.DaggerFragment +import java.text.SimpleDateFormat +import java.util.* +import javax.inject.Inject +import kotlin.collections.ArrayList +import kotlin.collections.HashMap + +class SetAvailabilityFragment : DaggerFragment(), OnTimeSelected { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentSetAvailabilityBinding + + private var rootView: View? = null + + private lateinit var viewModel: GetSlotsViewModel + + private var itemsInterval = ArrayList() + + private var itemWeekDays = ArrayList() + + private var itemDays = ArrayList() + + private lateinit var adapter: IntervalAdapter + + private lateinit var weekDaysAdapter: WeekDaysAdapter + + private lateinit var datesAdapter: DatesAdapter + + private var timePositionSelected = 0 + + private var setAvailability = SetAvailability() + + private var dateSelected = DatesAvailability() + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_set_availability, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + + if (requireActivity().intent.hasExtra(UPDATE_CATEGORY) || + requireActivity().intent.hasExtra(UPDATE_AVAILABILITY)) { + setDatesAdapter() + binding.tvWeekDays.text = getString(R.string.select_date) + } else + setWeekAdapter() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[GetSlotsViewModel::class.java] + + if (arguments?.getSerializable(WORKING_TIME) != null) + setAvailability = arguments?.getSerializable(WORKING_TIME) as SetAvailability + } + + private fun setWeekAdapter() { + itemWeekDays.clear() + + if (setAvailability.days == null) { + itemWeekDays.add(false) + itemWeekDays.add(false) + itemWeekDays.add(false) + itemWeekDays.add(false) + itemWeekDays.add(false) + itemWeekDays.add(false) + itemWeekDays.add(false) + } else { + itemWeekDays.addAll(setAvailability.days ?: emptyList()) + checkWeekDaySelected() + } + + weekDaysAdapter = WeekDaysAdapter(this, itemWeekDays) + binding.rvWeek.adapter = weekDaysAdapter + } + + private fun setDatesAdapter() { + itemDays.clear() + var calendar: Calendar + var date: DatesAvailability + for (i in 0..100) { + calendar = Calendar.getInstance() + calendar.add(Calendar.DAY_OF_MONTH, i) + + date = DatesAvailability() + date.displayName = calendar.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.LONG, Locale.getDefault()) + date.date = calendar.timeInMillis + itemDays.add(date) + } + + /*Make 1st item selected*/ + val selectedPos = 0 + if (itemDays.size >= selectedPos) { + itemDays[selectedPos].isSelected = true + dateSelected = itemDays[selectedPos] + + onDateSelected(dateSelected) + } + + datesAdapter = DatesAdapter(this, itemDays) + binding.rvWeek.adapter = datesAdapter + } + + private fun setAdapter() { + itemsInterval.clear() + if (setAvailability.slots == null) { + itemsInterval.add(Interval()) + } else { + itemsInterval.addAll(setAvailability.slots ?: emptyList()) + } + adapter = IntervalAdapter(this, itemsInterval) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.tvNext.setOnClickListener { + val setAvailability = SetAvailability() + + var daysSelected = false + itemWeekDays.forEach { + if (it) { + daysSelected = true + return@forEach + } + } + + if (daysSelected) { + setAvailability.days = ArrayList() + setAvailability.days?.addAll(itemWeekDays) + } else { + binding.tvNext.showSnackBar(getString(R.string.select_working_days)) + return@setOnClickListener + } + + if (itemsInterval[itemsInterval.size - 1].start_time == null) { + binding.tvNext.showSnackBar(getString(R.string.select_time)) + return@setOnClickListener + } else { + setAvailability.slots = ArrayList() + setAvailability.slots?.addAll(itemsInterval) + } + setAvailability.applyoption = AvailabilityType.WEEK_WISE + + val intent = Intent() + intent.putExtra(WORKING_TIME, setAvailability) + resultFragmentIntent( + this, targetFragment ?: this, + AppRequestCode.ADD_AVAILABILITY, intent + ) + } + + binding.tvDate.setOnClickListener { + makeActionAvailability(AvailabilityType.SPECIFIC_DATE) + } + + binding.tvDays.setOnClickListener { + makeActionAvailability(AvailabilityType.SPECIFIC_DAY) + } + + binding.tvAllWeekDays.setOnClickListener { + makeActionAvailability(AvailabilityType.WEEKDAYS) + } + } + + private fun makeActionAvailability(applyOption: String) { + val setAvailability = SetAvailability() + + setAvailability.date = dateFormatFromMillisBackend(DateFormat.DATE_FORMAT, dateSelected.date + ?: 0) + + if (itemsInterval[itemsInterval.size - 1].start_time == null) { + binding.tvNext.showSnackBar(getString(R.string.select_time)) + return + } else { + setAvailability.slots = ArrayList() + setAvailability.slots?.addAll(itemsInterval) + } + setAvailability.applyoption = applyOption + + val intent = Intent() + intent.putExtra(WORKING_TIME, setAvailability) + resultFragmentIntent(this, targetFragment ?: this, + AppRequestCode.ADD_AVAILABILITY, intent) + + } + + private fun hitApi(date: String) { + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["doctor_id"] = userRepository.getUser()?.id ?: "" + hashMap["date"] = date + hashMap["service_id"] = arguments?.getString(SERVICE_ID, "") ?: "" + hashMap["category_id"] = arguments?.getString(CATEGORY_PARENT_ID, "") ?: "" + + viewModel.getSlots(hashMap) + } + } + + private fun bindObservers() { + viewModel.getSlots.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + itemsInterval.clear() + if (it.data?.slots.isNullOrEmpty()) { + itemsInterval.add(Interval()) + } else { + itemsInterval.addAll(it.data?.slots ?: emptyList()) + } + adapter.notifyDataSetChanged() + + } + Status.ERROR -> { + binding.clLoader.gone() + adapter.setAllItemsLoaded(true) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.setBackgroundResource(R.color.colorWhite) + binding.clLoader.visible() + } + } + }) + } + + fun checkWeekDaySelected() { + var enable = false + itemWeekDays.forEach { + if (it) { + enable = true + return@forEach + } + } + + if (enable) { + binding.tvAddAvailability.visible() + binding.rvListing.visible() + binding.tvNext.visible() + } else { + binding.tvAddAvailability.gone() + binding.rvListing.gone() + binding.tvNext.invisible() + } + } + + fun clickItem(item: Interval?) { + + } + + fun selectTime(start: Boolean, position: Int) { + timePositionSelected = position + + val item = itemsInterval[position] + + DateUtils.getTime(requireContext(), item.start_time ?: "", item.end_time ?: "", isStart = start, listener = this) + } + + + override fun onTimeSelected(time: Triple) { + if (!time.third) { + var addInterval = true + + val sdf = SimpleDateFormat(DateFormat.TIME_FORMAT, Locale.ENGLISH) + + val intervalTime = sdf.parse(time.first) + + /*Check if new interval is not in between of old interval*/ + itemsInterval.forEachIndexed { index, interval -> + if (index != timePositionSelected && interval.start_time != null && interval.end_time != null) { + val timeStart = sdf.parse(interval.start_time) + val timeEnd = sdf.parse(interval.end_time) + + val indexPos = itemsInterval.size - 1 + val timeStartCurrent = if (itemsInterval[indexPos].start_time == null) null else sdf.parse(itemsInterval[indexPos].start_time) + val timeEndCurrent = if (itemsInterval[indexPos].end_time == null) null else sdf.parse(itemsInterval[indexPos].end_time) + + if (intervalTime.after(timeStart) && intervalTime.before(timeEnd)) { + addInterval = false + } else if ((time.second && timeEndCurrent != null) && + ((intervalTime == timeStart && timeEndCurrent == timeEnd) + || (intervalTime.before(timeStart) && timeEndCurrent.after(timeEnd)) + || (intervalTime.before(timeStart) && timeEndCurrent == timeEnd) + || (intervalTime == timeStart && timeEndCurrent.after(timeEnd)))) { + addInterval = false + } else if (timeStartCurrent != null && + ((intervalTime == timeEnd && timeStartCurrent == timeStart) + || (intervalTime.after(timeEnd) && timeStartCurrent.before(timeStart)) + || (intervalTime.after(timeEnd) && timeStartCurrent == timeStart) + || (intervalTime == timeEnd && timeStartCurrent.before(timeStart)))) { + addInterval = false + } + + if (!addInterval) { + binding.tvWeekDays.showSnackBar(getString(R.string.error_in_between_interval)) + return + } + } + } + + if (addInterval) { + if (time.second) + itemsInterval[timePositionSelected].start_time = time.first + else + itemsInterval[timePositionSelected].end_time = time.first + + adapter.notifyDataSetChanged() + } + } else { + binding.tvWeekDays.showSnackBar(getString(R.string.greater_time)) + } + } + + fun onDateSelected(item: DatesAvailability) { + binding.rvWeek.smoothScrollToPosition(itemDays.indexOf(item)) + + dateSelected = item + + binding.tvAddAvailability.visible() + binding.rvListing.visible() + + val date = dateFormatFromMillis(DateFormat.MON_DATE_YEAR, item.date ?: 0) + binding.tvDate.visible() + binding.tvDate.text = getString(R.string.for_s, date) + binding.tvDays.visible() + binding.tvDays.text = getString(R.string.all_s, item.displayName) + binding.tvAllWeekDays.visible() + + hitApi(dateFormatFromMillisBackend(DateFormat.DATE_FORMAT, item.date ?: 0)) + } + + companion object { + const val WORKING_TIME = "WORKING_TIME" + } + + +} + +interface OnTimeSelected { + fun onTimeSelected(time: Triple) +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/WeekDaysAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/WeekDaysAdapter.kt new file mode 100644 index 0000000..aaa18fc --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/availability/WeekDaysAdapter.kt @@ -0,0 +1,58 @@ +package com.consultantvendor.ui.loginSignUp.availability + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.databinding.ItemWeekDaysBinding + +class WeekDaysAdapter(private val fragment: SetAvailabilityFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + override fun getItemCount(): Int { + return items.size + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_week_days, parent, false)) + } + + inner class ViewHolder(val binding: ItemWeekDaysBinding) : RecyclerView.ViewHolder(binding.root) { + + fun bind(weekDays: Boolean) = with(binding) { + + tvName.text = when (adapterPosition) { + 0 -> fragment.getString(R.string.sunday_w) + 1 -> fragment.getString(R.string.monday_w) + 2 -> fragment.getString(R.string.tuesday_w) + 3 -> fragment.getString(R.string.wednesday_w) + 4 -> fragment.getString(R.string.thursday_w) + 5 -> fragment.getString(R.string.friday_w) + 6 -> fragment.getString(R.string.saturday_w) + else -> fragment.getString(R.string.sunday_w) + } + + if (weekDays) { + tvName.setBackgroundResource(R.drawable.drawable_week_selected) + tvName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorWhite)) + } else { + tvName.setBackgroundResource(R.drawable.drawable_week_un_selected) + tvName.setTextColor(ContextCompat.getColor(fragment.requireContext(), R.color.colorBlack)) + } + + binding.clWeekDays.setOnClickListener { + items[adapterPosition] = !items[adapterPosition] + notifyItemChanged(adapterPosition) + fragment.checkWeekDaySelected() + } + } + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/category/CategoriesAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/category/CategoriesAdapter.kt new file mode 100644 index 0000000..b0344b6 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/category/CategoriesAdapter.kt @@ -0,0 +1,135 @@ +package com.consultantvendor.ui.loginSignUp.category + +import android.graphics.Color +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Categories +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemCategoryBinding +import com.consultantvendor.databinding.RvItemCategoryReverseBinding +import com.consultantvendor.utils.gone +import com.consultantvendor.utils.loadImage +import com.consultantvendor.utils.visible + + +class CategoriesAdapter(private val fragment: CategoryFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) { + when (BuildConfig.FLAVOR) { + "heal" -> + (holder as ViewHolderReverse).bind(items[position]) + else -> + (holder as ViewHolder).bind(items[position]) + } + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + when (BuildConfig.FLAVOR) { + "heal" -> + ViewHolderReverse(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_category_reverse, parent, false)) + else -> + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_category, parent, false)) + } + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemCategoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + if (fragment.userRepository.getUserLanguage() == "ar") + binding.ivCategory.rotationY = 180f + + if (BuildConfig.FLAVOR == "taradoc") + binding.tvName.setTextColor(Color.parseColor("#1b1616")) + + if (BuildConfig.FLAVOR == "nurseLynx") + binding.ivInfo.visible() + else + binding.ivInfo.gone() + + binding.clMain.setOnClickListener { + fragment.clickItem(items[bindingAdapterPosition]) + } + + binding.ivInfo.setOnClickListener { + fragment.showInformationDialog(items[bindingAdapterPosition]) + } + + } + + fun bind(item: Categories) = with(binding) { + if (item.color_code.isNullOrEmpty()) + clCategory.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + else + clCategory.setBackgroundColor(Color.parseColor(item.color_code)) + + tvName.text = item.name + loadImage("tag",binding.ivCategory, item.image, 0) + } + } + + inner class ViewHolderReverse(val binding: RvItemCategoryReverseBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + if (fragment.userRepository.getUserLanguage() == "ar") + binding.ivCategory.rotationY = 180f + + if (BuildConfig.FLAVOR == "nurseLynx") + binding.ivInfo.visible() + else + binding.ivInfo.gone() + + binding.clMain.setOnClickListener { + fragment.clickItem(items[bindingAdapterPosition]) + } + + binding.ivInfo.setOnClickListener { + fragment.showInformationDialog(items[bindingAdapterPosition]) + } + + } + + fun bind(item: Categories) = with(binding) { + if (item.color_code.isNullOrEmpty()) + clCategory.setBackgroundColor(ContextCompat.getColor(binding.root.context, R.color.colorPrimary)) + else + clCategory.setBackgroundColor(Color.parseColor(item.color_code)) + + tvName.text = item.name + + loadImage("tag",binding.ivCategory, item.image, 0) + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/category/CategoryFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/category/CategoryFragment.kt new file mode 100644 index 0000000..29d2964 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/category/CategoryFragment.kt @@ -0,0 +1,219 @@ +package com.consultantvendor.ui.loginSignUp.category + +import android.app.AlertDialog +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Categories +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentCategoryBinding +import com.consultantvendor.ui.drawermenu.DrawerActivity +import com.consultantvendor.ui.drawermenu.classes.ClassesViewModel +import com.consultantvendor.ui.loginSignUp.document.DocumentsFragment +import com.consultantvendor.ui.loginSignUp.prefrence.PrefrenceFragment +import com.consultantvendor.ui.loginSignUp.service.ServiceFragment +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantvendor.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class CategoryFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentCategoryBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private var items = ArrayList() + + private lateinit var adapter: CategoriesAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_category, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + + if (requireActivity().intent.hasExtra(PAGE_TO_OPEN) && + requireActivity().intent.getStringExtra(PAGE_TO_OPEN) == DrawerActivity.CLASSES) { + binding.tvDesc.gone() + } + } + + private fun setAdapter() { + /* val layoutManager = GridLayoutManager(activity, 6) + layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() { + override fun getSpanSize(position: Int): Int { + return if (items.size % 2 != 0) { + when (position) { + items.size - 3, items.size - 2, items.size - 1 -> + 2 + else -> 3 + } + } else 3 + } + } + binding.rvListing.layoutManager = layoutManager*/ + + adapter = CategoriesAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + + } + + private fun hitApi(firstHit: Boolean) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (isConnectedToInternet(requireContext(), true)) { + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + + viewModel.categories(hashMap) + } + } + + private fun bindObservers() { + viewModel.categories.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + isLoadingMoreItems = false + + val tempList = it.data?.classes_category ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + binding.clLoader.gone() + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + } + + + fun clickItem(item: Categories?) { + val fragment = when { + item?.is_subcategory == true -> { + SubCategoryFragment() + } + item?.is_additionals == true -> { + DocumentsFragment() + } + item?.is_filters == true -> { + PrefrenceFragment() + } + else -> { + ServiceFragment() + } + } + + val bundle = Bundle() + bundle.putSerializable(CATEGORY_PARENT_ID, item) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + + + fun showInformationDialog(item: Categories?) { + AlertDialog.Builder(context) + .setTitle(item?.name) + .setMessage(item?.description) + .setPositiveButton(R.string.ok) { dialog, which -> + dialog.dismiss() + } + .setCancelable(true) + .show() + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/changepassword/ChangePasswordFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/changepassword/ChangePasswordFragment.kt new file mode 100644 index 0000000..f85f894 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/changepassword/ChangePasswordFragment.kt @@ -0,0 +1,115 @@ +package com.consultantvendor.ui.loginSignUp.changepassword + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentChangePasswordBinding +import com.consultantvendor.ui.dashboard.success.SuccessFragment +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.consultantvendor.utils.isConnectedToInternet +import com.consultantvendor.utils.showSnackBar +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ChangePasswordFragment : DaggerFragment() { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentChangePasswordBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_change_password, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.ivNext.setOnClickListener { + when { + binding.etOldPassword.text.toString().trim().isEmpty() -> { + binding.etOldPassword.showSnackBar(getString(R.string.old_password)) + } + binding.etNewPassword.text.toString().trim().isEmpty() -> { + binding.etNewPassword.showSnackBar(getString(R.string.new_password)) + } + binding.etConfirmPassword.text.toString().trim().isEmpty() -> { + binding.etConfirmPassword.showSnackBar(getString(R.string.confirm_password)) + } + binding.etConfirmPassword.text.toString().trim() != binding.etNewPassword.text.toString().trim() -> { + binding.etConfirmPassword.showSnackBar(getString(R.string.confirm_password)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["current_password"] = binding.etOldPassword.text.toString() + hashMap["new_password"] = binding.etNewPassword.text.toString() + + viewModel.changePassword(hashMap) + } + } + } + } + + private fun bindObservers() { + viewModel.changePassword.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + val fragment = SuccessFragment(this) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsAdapter.kt new file mode 100644 index 0000000..8829e2f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsAdapter.kt @@ -0,0 +1,74 @@ +package com.consultantvendor.ui.loginSignUp.document + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.AdditionalField +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemDocumentsBinding +import com.consultantvendor.utils.hideShowView + + +class DocumentsAdapter(private val fragment: DocumentsFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + private var addOption = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_documents, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemDocumentsBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + //binding.tvAdd.hideShowView(addOption) + binding.tvAdd.setOnClickListener { + fragment.addDocument(adapterPosition,null) + } + } + + fun bind(item: AdditionalField) = with(binding) { + binding.tvAdd.hideShowView(item.documents.size < 2) + + tvName.text = item.name + + val adapterItem = DocumentsItemAdapter(fragment, adapterPosition, item.documents) + rvDocuments.adapter = adapterItem + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } + + fun setAddOption(allLoaded: Boolean) { + addOption = allLoaded + } +} + diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsFragment.kt new file mode 100644 index 0000000..bd7865d --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsFragment.kt @@ -0,0 +1,237 @@ +package com.consultantvendor.ui.loginSignUp.document + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.UpdateDocument +import com.consultantvendor.data.models.responses.AdditionalField +import com.consultantvendor.data.models.responses.AdditionalFieldDocument +import com.consultantvendor.data.models.responses.Categories +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentServiceBinding +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.document.add.DialogAddDocumentFragment +import com.consultantvendor.ui.loginSignUp.prefrence.PrefrenceFragment +import com.consultantvendor.ui.loginSignUp.service.ServiceFragment +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class DocumentsFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentServiceBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private var items = ArrayList() + + private lateinit var adapter: DocumentsAdapter + + private var categoryData: Categories? = null + + private var userData: UserData? = null + + private var selectedPos = -1 + + private var editSelectedPos: Int? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_service, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + setAdapter() + } + return rootView + } + + private fun initialise() { + binding.swipeRefresh.isEnabled = false + + binding.tvHeader.text = getString(R.string.upload_documents) + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + categoryData = arguments?.getSerializable(SubCategoryFragment.CATEGORY_PARENT_ID) as Categories + userData = userRepository.getUser() + } + + private fun setAdapter() { + adapter = DocumentsAdapter(this, items) + binding.rvListing.adapter = adapter + + /*If document already there*/ + if (arguments?.containsKey(UPDATE_DOCUMENTS) == true && !userData?.additionals.isNullOrEmpty()) { + items.addAll(userData?.additionals ?: emptyList()) + adapter.notifyDataSetChanged() + + adapter.setAddOption(false) + binding.tvNext.text = getString(R.string.update) + //binding.tvNext.gone() + } else if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["category_id"] = categoryData?.id ?: "" + + viewModel.additionalDetails(hashMap) + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvNext.setOnClickListener { + binding.tvNext.hideKeyboard() + + if (items.isNotEmpty()) { + items.forEach { + if (it.documents.isEmpty()) { + binding.tvNext.showSnackBar("${getString(R.string.please_add)} ${it.name}") + return@setOnClickListener + } + } + + if (isConnectedToInternet(requireContext(), true)) { + val updateDocument = UpdateDocument() + if (arguments?.containsKey(UPDATE_DOCUMENTS) == true) + updateDocument.sp_id = userData?.id + + updateDocument.fields = ArrayList() + updateDocument.fields?.addAll(items) + + viewModel.additionalDetailsUpdate(updateDocument) + } + } + } + } + + + private fun bindObservers() { + viewModel.additionalDetails.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + items.clear() + items.addAll(it.data?.additional_details ?: emptyList()) + + adapter.notifyDataSetChanged() + + adapter.setAllItemsLoaded(true) + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.additionalDetailsUpdate.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + userData?.additionals = ArrayList() + userData?.additionals?.addAll(it.data?.additionals ?: emptyList()) + + prefsManager.save(USER_DATA, userData) + + if (arguments?.containsKey(UPDATE_DOCUMENTS) == true) { + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } else { + val fragment = when (categoryData?.is_filters) { + true -> PrefrenceFragment() + else -> ServiceFragment() + } + + val bundle = Bundle() + bundle.putSerializable(SubCategoryFragment.CATEGORY_PARENT_ID, categoryData) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, fragment, R.id.container) + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + fun addDocument(pos: Int, editPos: Int?) { + selectedPos = pos + editSelectedPos = editPos + if (editSelectedPos != null) { + + val documentMain: AdditionalFieldDocument? = if (editSelectedPos != -1) + items[selectedPos].documents[editSelectedPos ?: 0] + else null + + val fragment = DialogAddDocumentFragment(this, documentMain) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } else if (items[selectedPos].documents.size < 2) { + val fragment = DialogAddDocumentFragment(this, null) + fragment.show(requireActivity().supportFragmentManager, fragment.tag) + } + } + + fun deleteDocument() { + adapter.notifyDataSetChanged() + } + + fun addedDocument(document: AdditionalFieldDocument) { + if (editSelectedPos != null) + items[selectedPos].documents[editSelectedPos ?: 0] = document + else + items[selectedPos].documents.add(document) + + adapter.notifyDataSetChanged() + } + + companion object { + const val UPDATE_DOCUMENTS = "UPDATE_DOCUMENTS" + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsItemAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsItemAdapter.kt new file mode 100644 index 0000000..e0e8a38 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/DocumentsItemAdapter.kt @@ -0,0 +1,84 @@ +package com.consultantvendor.ui.loginSignUp.document + +import android.util.Log +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.bumptech.glide.Glide +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.AdditionalFieldDocument +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemDocumentItemBinding +import com.consultantvendor.utils.ImageFolder +import com.consultantvendor.utils.getImageBaseUrl +import com.consultantvendor.utils.loadImage +import com.consultantvendor.utils.requestOptions + + +class DocumentsItemAdapter(private val fragment: DocumentsFragment, private val positionMain: Int, + private val items: ArrayList) : RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_document_item, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemDocumentItemBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.ivEdit.setOnClickListener { + fragment.addDocument(positionMain, adapterPosition) + } + + binding.ivDelete.setOnClickListener { + items.removeAt(adapterPosition) + fragment.deleteDocument() + notifyDataSetChanged() + } + } + + fun bind(item: AdditionalFieldDocument) = with(binding) { + tvName.text = item.title + tvDesc.text = item.description + if(item.file_name?.contains(".pdf") == true) { + val glide = Glide.with(ivImage.context) + glide.load(R.drawable.ic_pdf) + .apply(requestOptions) + .placeholder(R.drawable.image_placeholder) + .into(ivImage) + }else { + loadImage("profile",ivImage, item.file_name, R.drawable.image_placeholder) + } + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/add/DialogAddDocumentFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/add/DialogAddDocumentFragment.kt new file mode 100644 index 0000000..784d6c9 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/document/add/DialogAddDocumentFragment.kt @@ -0,0 +1,876 @@ +package com.consultantvendor.ui.loginSignUp.document.add + +import android.Manifest +import android.app.Activity +import android.app.AlertDialog +import android.app.Dialog +import android.content.ContentUris +import android.content.Context +import android.content.Intent +import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.Matrix +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.media.ExifInterface +import android.net.Uri +import android.os.Build +import android.os.Bundle +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.provider.Settings +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.view.Window +import android.widget.Toast +import androidx.annotation.Nullable +import androidx.annotation.RequiresApi +import androidx.core.content.FileProvider +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.target.CustomTarget +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.DocImage +import com.consultantvendor.data.models.responses.AdditionalFieldDocument +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.ItemAddDocumentBinding +import com.consultantvendor.databinding.ItemDialogImageBinding +import com.consultantvendor.ui.chat.UploadFileViewModel +import com.consultantvendor.ui.loginSignUp.document.DocumentsFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.PermissionUtils +import com.consultantvendor.utils.dialogs.ProgressDialogImage +import com.karumi.dexter.Dexter +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionDeniedResponse +import com.karumi.dexter.listener.PermissionGrantedResponse +import com.karumi.dexter.listener.single.PermissionListener +import dagger.android.support.DaggerDialogFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import java.io.FileOutputStream +import java.io.IOException +import java.util.HashMap +import javax.inject.Inject + + +@RuntimePermissions + class DialogAddDocumentFragment(private val fragment: DocumentsFragment, + private var documentMain: AdditionalFieldDocument?) : DaggerDialogFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: ItemAddDocumentBinding + + private var fileToUpload: File? = null + + private lateinit var viewModelUpload: UploadFileViewModel + + private lateinit var progressDialogImage: ProgressDialogImage + var docImage = DocImage() + + var is_video = false + private val JPEG_FILE_PREFIX = "IMG_" + private val JPEG_FILE_SUFFIX = ".jpg" + + + var mPicturePath: String? = null + var mIsGallery: Boolean? = null + var bitmap: Bitmap? = null + var reqcode = 0 + var triescamera = 0 + var triesgallary = 0 + + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + + val dialog = super.onCreateDialog(savedInstanceState) + dialog.setCanceledOnTouchOutside(false) + dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + + return dialog + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + + binding = DataBindingUtil.inflate(inflater, R.layout.item_add_document, container, false) + return binding.root + } + + @RequiresApi(Build.VERSION_CODES.M) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setStyle(STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen) + + initialise() + listeners() + binObservers() + } + + private fun initialise() { + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + progressDialogImage = ProgressDialogImage(requireActivity()) + + if (documentMain != null) { + binding.etName.setText(documentMain?.title) + binding.etDesc.setText(documentMain?.description) + if(documentMain?.file_name?.contains(".pdf") == true) { + val glide = Glide.with(binding.ivImage.context) + glide.load(R.drawable.ic_pdf) + .apply(requestOptions) + .placeholder(R.drawable.image_placeholder) + .into(binding.ivImage) + }else { + loadImage("tag",binding.ivImage, documentMain?.file_name, R.drawable.image_placeholder) + } + } + + if(BuildConfig.FLAVOR=="nurseLynx"){ + binding.ilName.gone() + binding.ilDesc.gone() + } + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun listeners() { + binding.ivBack.setOnClickListener { + dialog?.dismiss() + } + + binding.ivImage.setOnClickListener { + // getStorageWithPermissionCheck() + showImageDialog(false) + } + + binding.tvAdd.setOnClickListener { + binding.tvAdd.hideKeyboard() + when { + fileToUpload == null && documentMain == null -> { + binding.etName.showSnackBar(getString(R.string.select_image)) + } + binding.ilName.visibility==View.VISIBLE && binding.etName.text.toString().trim().isEmpty() -> { + binding.etName.showSnackBar(getString(R.string.enter_name)) + } + binding.ilDesc.visibility==View.VISIBLE && binding.etDesc.text.toString().trim().isEmpty() -> { + binding.etDesc.showSnackBar(getString(R.string.description)) + } + isConnectedToInternet(requireContext(), true) -> { + /* if (fileToUpload != null) + uploadFileOnServer()*/ + + if (fileToUpload != null && fileToUpload?.exists() == true) + uploadFileOnServer(fileToUpload) + else if (documentMain != null) { + val document = AdditionalFieldDocument() + document.title = binding.etName.text.toString().trim() + document.description = binding.etDesc.text.toString().trim() + document.file_name = documentMain?.file_name ?: "" + + fragment.addedDocument(document) + dialog?.dismiss() + } + } + } + } + } + +// private fun uploadFileOnServer() { +// val hashMap = HashMap() +// hashMap["type"] = getRequestBody(docImage.type) +// +// val body: RequestBody = docImage.imageFile?.asRequestBody("image/*".toMediaType())!! +// hashMap["image\"; fileName=\"" + docImage.imageFile?.name] = body +// +// viewModelUpload.uploadFile(hashMap) +// } + + + private fun uploadFileOnServer(fileToUpload: File?) { + val hashMap = HashMap() + + hashMap["type"] = getRequestBody(DocType.IMAGE) + + val body: RequestBody = fileToUpload?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + fileToUpload?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + + private fun binObservers() { + viewModelUpload.uploadFile.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + val document = AdditionalFieldDocument() + document.title = binding.etName.text.toString().trim() + document.description = binding.etDesc.text.toString().trim() + document.file_name = it.data?.image_name ?: "" + + fragment.addedDocument(document) + dialog?.dismiss() + + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + } + + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + + if (requestCode == 1) { + if (data != null) { + if (getRealPath(data.data!!, requireActivity()) != null) { + getImage(getRealPath(data.data!!, requireActivity()), data.data!!) + + + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + fileToUpload = compressImage(requireActivity(),File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + Glide.with(requireContext()).load(fileToUpload).into(binding.ivImage) + + docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = fileToUpload +*/ + } else { + Glide.with(this) + .asBitmap() + .load(data.data) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .into(object : CustomTarget() { + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} + override fun onResourceReady( + resource: Bitmap, + transition: com.bumptech.glide.request.transition.Transition? + ) { + val file: String = getRealPath( + Uri.fromFile(saveImageToExternalStorage(resource)), + requireActivity() + )!! + getImage(file, Uri.fromFile(saveImageToExternalStorage(resource))) + + } + }) + } + } + } else if (requestCode == 2 && resultCode == -1) { + try{ + val file: String = getRealPath( + Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath, requireActivity())!! + + ) + ), requireActivity() + )!! + getImage(file, Uri.fromFile(saveImageToExternalStorage(getFile(mPicturePath, requireActivity())!!))) + + }catch (ex: Exception){ + Toast.makeText(requireContext(),"This functionality is under development", Toast.LENGTH_LONG).show() + } + + + } else { + Log.e("gndnfkfnkn", "onActivityResult: " + data?.data) + } + + if (requestCode == AppRequestCode.IMAGE_PICKER) { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + fileToUpload = compressImage(requireActivity(),File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + Glide.with(requireContext()).load(fileToUpload).into(binding.ivImage) + + docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = fileToUpload*/ + + }else if (requestCode == AppRequestCode.DOC_PICKER) { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_DOCS) + ?: emptyList()) + + fileToUpload = compressImage(requireActivity(),File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + Glide.with(requireContext()).load(R.drawable.ic_pdf).into(binding.ivImage) + + //val fileToUpload = File(ContentUriUtils.getFilePath(this, docPaths[0])) + + docImage = DocImage() + docImage.type = DocType.PDF + docImage.imageFile = fileToUpload*/ + + + } + } + } + + override fun onRequestPermissionsResult(requestCode: Int, permissions: Array, grantResults: IntArray) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + //selectImages(this,requireActivity()) + askForOption(this, requireActivity(), binding.ivImage) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + + @RequiresApi(Build.VERSION_CODES.M) + fun showImageDialog(b: Boolean) { + is_video = b + + + val dialog: Dialog = Dialog(requireActivity()) + var view = ItemDialogImageBinding.inflate(layoutInflater) + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + dialog.setContentView(view.root) + + view.tvGallery.setOnClickListener { + mIsGallery = true + if (!is_video) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditongallary() + + } else { + + checkgallry() + + + } + } + + dialog.dismiss() + } + + view.ivClose.setOnClickListener { dialog.dismiss() } + + view.tvCamera.setOnClickListener { + mIsGallery = false + + if (!is_video) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditioncamera() + + } else { + + checkcamera() + + } + } + + + + dialog.dismiss() + } + dialog.show() + } + + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun checkconditongallary() { + reqcode = 3 + + requestPermissionsFOR(Manifest.permission.READ_MEDIA_IMAGES) + + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun checkgallry() { + reqcode = 1 + + requestPermissionsFOR(Manifest.permission.READ_EXTERNAL_STORAGE) + } + + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + private fun checkconditioncamera() { + + reqcode = 4 + + requestPermissionsFOR(Manifest.permission.CAMERA) + + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun checkcamera() { + + reqcode = 2 + requestPermissionsFOR(Manifest.permission.CAMERA) + } + + private fun requestPermissionsFOR(readMediaImages: String) { + Dexter.withContext(requireContext()) + .withPermission(readMediaImages) + .withListener(object : PermissionListener { + override fun onPermissionGranted(response: PermissionGrantedResponse) { + + when (reqcode) { + 1 -> { + + openGallery() + } + + 2 -> { + startCameraIntent(requireActivity()) + } + + 3 -> { + + openGallery() + + } + + 4 -> { + startCameraIntent(requireActivity()) + + } + } + } + + override fun onPermissionDenied(response: PermissionDeniedResponse) { + if (response.isPermanentlyDenied) { + showAlert() + } else { + Toast.makeText(requireContext(), "permission denied", Toast.LENGTH_SHORT) + .show() + } + } + + override fun onPermissionRationaleShouldBeShown( + permission: com.karumi.dexter.listener.PermissionRequest?, + token: PermissionToken? + ) { + Toast.makeText( + requireContext(), + "permission is needed to use this feature", + Toast.LENGTH_SHORT + ).show() + token?.continuePermissionRequest() + } + }).check() + } + + fun openGallery() { + val i = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(i, 1) + } + + open fun startCameraIntent(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + var f: File? = null + try { + val LOCAL_STORAGE_BASE_PATH_FOR_MEDIA = context.getExternalFilesDir("") + .toString() + "/" + "consultantvendor" + val LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES: String = + LOCAL_STORAGE_BASE_PATH_FOR_MEDIA + "/User/Images/" + f = setUpImageFile(LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES) + mPicturePath = f!!.absolutePath + /* add provider in xml and + * manifest then add following code for Nougat devices + * to overcome file uri exposed app crash + */if (isNougatDevice()) { + takePictureIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + val contentUri: Uri = FileProvider.getUriForFile( + requireActivity(), "com.consultantvendor", f + ) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri) + } else { + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)) + } + } catch (e: Exception) { + e.printStackTrace() + f = null + mPicturePath = null + } + startActivityForResult(takePictureIntent, 2) + } + + private fun showAlert() { + // we are displaying an alert dialog for permissions + val builder = AlertDialog.Builder(requireContext()) + + // below line is the title for our alert dialog. + builder.setTitle("Need Permissions") + + // below line is our message for our dialog + builder.setMessage("This app needs permission to use this feature. You can grant them in app settings.") + + builder.setPositiveButton("GOTO SETTINGS") { dialog, which -> + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + val uri = Uri.fromParts("package", activity?.packageName, null) + intent.data = uri + } else { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:" + activity?.packageName) + } + + startActivity(intent) + } + + builder.setNegativeButton("Cancel") { dialog, which -> + // this method is called when user clicks on the negative button. + dialog.cancel() + } + + // below line is used to display our dialog + builder.show() + } + + fun setUpImageFile(imageDirectory: String?): File? { + var imageFile: File? = null + if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) { + val storageDir = File(imageDirectory) + if (null != storageDir) { + if (!storageDir.mkdirs()) { + if (!storageDir.exists()) { + Log.d("CameraSample", "failed to create directory") + return null + } + } + } + imageFile = File.createTempFile( + JPEG_FILE_PREFIX + + System.currentTimeMillis() + "_", + JPEG_FILE_SUFFIX, storageDir + ) + } + return imageFile + } + + open fun isNougatDevice(): Boolean { + return Build.VERSION.SDK_INT >= 24 + } + + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + fun getRealPath(uri: Uri, context: Context): String? { + val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + if ("primary".equals(type, ignoreCase = true)) { + return (Environment.getExternalStorageDirectory() + .toString() + "/" + split[1]) + } else { + val splitIndex = docId.indexOf(':', 1) + val tag = docId.substring(0, splitIndex) + val path = docId.substring(splitIndex + 1) + val nonPrimaryVolume = + getPathToNonPrimaryVolume(context, tag) + if (nonPrimaryVolume != null) { + val result = "$nonPrimaryVolume/$path" + val file = File(result) + if (file.exists() && file.canRead()) { + return result + } + } + } + } else if (isDownloadsDocument(uri)) { + val id = DocumentsContract.getDocumentId(uri) + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(id) + + ) + return getDataColumn(context, contentUri, null, null) + } else if (isMediaDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + var contentUri: Uri? = null + if ("image" == type) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } else if ("video" == type) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } else if ("audio" == type) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + } + val selection = "_id=?" + val selectionArgs = + arrayOf(split[1]) + return getDataColumn(context, contentUri, selection, selectionArgs) + } + } else if ("content".equals(uri.scheme, ignoreCase = true)) { + return getDataColumn(context, uri, null, null) + } else if ("file".equals(uri.scheme, ignoreCase = true)) { + return uri.path + } + return null + } + + private fun isExternalStorageDocument(uri: Uri): Boolean { + return "com.android.externalstorage.documents" == uri.authority + } + + private fun isDownloadsDocument(uri: Uri): Boolean { + return "com.android.providers.downloads.documents" == uri.authority + } + + private fun isMediaDocument(uri: Uri): Boolean { + return "com.android.providers.media.documents" == uri.authority + } + + private fun getDataColumn( + context: Context, uri: Uri?, selection: String?, selectionArgs: + Array? + ): String? { + var cursor: Cursor? = null + val column = "_data" + val projection = arrayOf(column) + try { + cursor = context.contentResolver.query( + uri!!, projection, + selection, selectionArgs, null + ) + if (cursor != null && cursor.moveToFirst()) { + val column_index = cursor.getColumnIndexOrThrow(column) + return cursor.getString(column_index) + } + } finally { + cursor?.close() + } + return null + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + fun getPathToNonPrimaryVolume(context: Context, tag: String): String? { + val volumes = context.externalCacheDirs + if (volumes != null) { + for (volume in volumes) { + if (volume != null) { + val path = volume.absolutePath + if (path != null) { + val index = path.indexOf(tag) + if (index != -1) { + return path.substring(0, index) + tag + } + } + } + } + } + return null + } + + fun saveImageToExternalStorage(finalBitmap: Bitmap): File? { + val file: File + val root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + .toString() + val myDir = File("$root/Mojo") + myDir.mkdirs() + val fname = (JPEG_FILE_PREFIX + System.currentTimeMillis() + "_" + JPEG_FILE_SUFFIX) + + file = File(myDir, fname) + if (file.exists()) file.delete() + try { + val out = FileOutputStream(file) + finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) + out.flush() + out.close() + return file + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + return file + } + + + fun getFile(imgPath: String?, mContext: Context?): Bitmap? { + val mOrientation: Int + var bMapRotate: Bitmap? = null + try { + if (imgPath != null) { + val exif = ExifInterface(imgPath) + mOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1) + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeFile(imgPath, options) + options.inSampleSize = calculateInSampleSize(options, 400, 400) + options.inJustDecodeBounds = false + bMapRotate = BitmapFactory.decodeFile(imgPath, options) + when (mOrientation) { + 6 -> { + val matrix = Matrix() + matrix.postRotate(90f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 8 -> { + val matrix = Matrix() + matrix.postRotate(270f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 3 -> { + val matrix = Matrix() + matrix.postRotate(180f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + } + } else { + + } + } catch (e: OutOfMemoryError) { + bMapRotate = null + e.printStackTrace() + } catch (e: IOException) { + e.printStackTrace() + } catch (e: java.lang.Exception) { + bMapRotate = null + e.printStackTrace() + } + return bMapRotate + } + + fun calculateInSampleSize( + options: BitmapFactory.Options, + reqWidth: Int, + reqHeight: Int + ): Int { + try { + val height = options.outHeight + val width = options.outWidth + var inSampleSize = 1 + if (height > reqHeight || width > reqWidth) { + val halfHeight = height / 2 + val halfWidth = width / 2 + while (halfHeight / inSampleSize > reqHeight + && halfWidth / inSampleSize > reqWidth + ) { + inSampleSize *= 2 + } + } + return inSampleSize + } catch (e: Exception) { + e.printStackTrace() + } + return 0 + } + + fun getImage(uri: String?, data: Uri) { + Glide.with(requireContext()).load(uri).into(binding.ivImage) + + val selectedImageUri: Uri? = data + selectedImageUri?.let { + // Log.e("selectedImageUri",it.toString()) + val file: File? = uriToFile(requireContext(), it) + // Log.e("selectedImageUriFile",file.toString()) + file?.let { + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = it + /* Log.e("selectedImageUriFile2",file.toString()+"//"+docImage.imageFile) + try { + fileToUpload = compressImage(activity, File(ContentUriUtils.getFilePath(requireContext(),data))) + Log.e("selectedImageUriFile3",fileToUpload.toString()) + }catch (ex: Exception){ + Log.e("selectedImageUriFile3",ex.message.toString()) + }*/ + + fileToUpload = uri?.let { it1 -> File(it1) } + Glide.with(requireContext()).load(fileToUpload).into(binding.ivImage) + + + /* fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(),data))) + Glide.with(requireContext()).load(fileToUpload).into(binding.ivImage)*/ + } + } + } + + fun uriToFile(context: Context, uri: Uri): File? { + val path = getRealPathFromUri(context, uri) + return path?.let { File(it) } + } + + private fun getRealPathFromUri(context: Context, uri: Uri): String? { + var realPath: String? = null + // Depending on the URI scheme, use different query methods + if (uri.scheme == "content") { + // MediaStore (and general content provider) scheme + context.contentResolver.query(uri, null, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + realPath = cursor.getString(columnIndex) + } + } + } else if (uri.scheme == "file") { + // File scheme + realPath = uri.path + } + return realPath + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/forgotpassword/ForgotPasswordFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/forgotpassword/ForgotPasswordFragment.kt new file mode 100644 index 0000000..1480c06 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/forgotpassword/ForgotPasswordFragment.kt @@ -0,0 +1,109 @@ +package com.consultantvendor.ui.loginSignUp.forgotpassword + +import android.os.Bundle +import android.util.Patterns +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentForgotPasswordBinding +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.consultantvendor.utils.isConnectedToInternet +import com.consultantvendor.utils.longToast +import com.consultantvendor.utils.showSnackBar +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ForgotPasswordFragment : DaggerFragment() { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentForgotPasswordBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_forgot_password, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.ivNext.setOnClickListener { + when { + binding.etEmail.text.toString().isEmpty() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_email)) + } + !Patterns.EMAIL_ADDRESS.matcher(binding.etEmail.text.toString()).matches() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_correct_email)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["email"] = binding.etEmail.text.toString() + + viewModel.forgotPassword(hashMap) + } + } + } + } + + + private fun bindObservers() { + + viewModel.forgotPassword.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireActivity().longToast(getString(R.string.sent_password)) + requireActivity().supportFragmentManager.popBackStack() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/CustomSpinnerAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/CustomSpinnerAdapter.kt new file mode 100644 index 0000000..1a0bb20 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/CustomSpinnerAdapter.kt @@ -0,0 +1,45 @@ +package com.consultantvendor.ui.loginSignUp.insurance + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.BaseAdapter +import android.widget.TextView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.CountryCity + +class CustomSpinnerAdapter(private val context: Context, private var items: List) : BaseAdapter() { + + override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { + val view: View + val vh: ViewHolder + if (convertView == null) { + view = LayoutInflater.from(context).inflate(R.layout.item_spinner, parent, false) + vh = ViewHolder(view) + view?.tag = vh + } else { + view = convertView + vh = view.tag as ViewHolder + } + vh.tvTitle.text = items[position].name + return view + } + + override fun getItem(position: Int): Any? { + return null + } + + override fun getItemId(position: Int): Long { + return 0 + } + + override fun getCount(): Int { + return items.size + } + + private class ViewHolder(view: View?) { + val tvTitle: TextView = view?.findViewById(R.id.tvSpinner) as TextView + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/InsuranceAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/InsuranceAdapter.kt new file mode 100644 index 0000000..17a4db7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/InsuranceAdapter.kt @@ -0,0 +1,64 @@ +package com.consultantvendor.ui.loginSignUp.insurance + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.appdetails.Insurance +import com.consultantvendor.databinding.ItemInsuranceBinding +import com.consultantvendor.ui.loginSignUp.signup.SignUpFragment + + +class InsuranceAdapter(private val fragment: Fragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + holder.bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return ViewHolder( + DataBindingUtil.inflate( + LayoutInflater.from(parent.context), + R.layout.item_insurance, parent, false) + ) + + } + + override fun getItemCount(): Int = items.size + + + inner class ViewHolder(val binding: ItemInsuranceBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: Insurance) = with(binding) { + + cbName.text = item.name ?: "" + cbName.isChecked = item.isSelected + if (item.isSelected) { + clInsurance.setBackgroundResource(R.color.colorPrimary) + } else { + clInsurance.setBackgroundResource(R.color.colorWhite) + } + + clInsurance.setOnClickListener { + /*Single Selection*/ + /*items.forEachIndexed { index, service -> + items[index].isSelected = index == adapterPosition + }*/ + + /*Multiple Selection*/ + items[adapterPosition].isSelected = !items[adapterPosition].isSelected + notifyDataSetChanged() + + if(fragment is SignUpFragment) + fragment.setLanguageNames() + } + + } + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/InsuranceFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/InsuranceFragment.kt new file mode 100644 index 0000000..af9a3cf --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/insurance/InsuranceFragment.kt @@ -0,0 +1,487 @@ +package com.consultantvendor.ui.loginSignUp.insurance + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.models.responses.CountryCity +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.models.responses.appdetails.AppVersion +import com.consultantvendor.data.models.responses.appdetails.Insurance +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentInsauranceBinding +import com.consultantvendor.ui.AppVersionViewModel +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.category.CategoryFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.google.gson.Gson +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class InsuranceFragment : DaggerFragment() { + + @Inject + lateinit var appSocket: AppSocket + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentInsauranceBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private lateinit var viewModelVersion: AppVersionViewModel + + private val items = ArrayList() + + private var userData: UserData? = null + + private var spinnerCountryAdapter: CustomSpinnerAdapter? = null + + private var spinnerStateAdapter: CustomSpinnerAdapter? = null + + private var spinnerCityAdapter: CustomSpinnerAdapter? = null + + private val itemsCountry = ArrayList() + + private val itemsState = ArrayList() + + private val itemsCity = ArrayList() + + private var openFirstCountry = true + + private var openFirstState = true + + private var openFirstCity = true + + private var needCountry = false + + private var countryId = "" + + private var stateId = "" + + private var cityId = "" + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_insaurance, container, false) + rootView = binding.root + + initialise() + setUpdateInsurance() + listeners() + bindObservers() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModelVersion = ViewModelProvider(this, viewModelFactory)[AppVersionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + userData = userRepository.getUser() + /*If need country List*/ + if (appClientDetails.country_id == null) { + needCountry = true + binding.ilCountry.visible() + } else countryId = appClientDetails.country_id ?: "" + } + + private fun setAdapters() { + spinnerCountryAdapter = CustomSpinnerAdapter(requireContext(), itemsCountry) + binding.spnCountry.adapter = spinnerCountryAdapter + + spinnerStateAdapter = CustomSpinnerAdapter(requireContext(), itemsState) + binding.spnState.adapter = spinnerStateAdapter + + spinnerCityAdapter = CustomSpinnerAdapter(requireContext(), itemsCity) + binding.spnCity.adapter = spinnerCityAdapter + + if (isConnectedToInternet(requireContext(), true)) { + var hashMap = HashMap() + /*If need country list*/ + if (needCountry) { + hashMap["type"] = CountryListType.COUNTRY + viewModelVersion.countryCity(hashMap) + } + + if (!needCountry || !userData?.profile?.country_id.isNullOrEmpty()) { + if (needCountry) + countryId = userData?.profile?.country_id ?: "" + + hashMap = HashMap() + hashMap["type"] = CountryListType.STATE + hashMap["country_id"] = countryId + + viewModelVersion.countryCity(hashMap) + } + + if (!userData?.profile?.state_id.isNullOrEmpty()) { + stateId = userData?.profile?.state_id ?: "" + + hashMap = HashMap() + hashMap["type"] = CountryListType.CITY + hashMap["state_id"] = stateId + + viewModelVersion.countryCity(hashMap) + } + } + } + + /*Get and update address insurance*/ + private fun setUpdateInsurance() { + if (appClientDetails.clientFeaturesKeys.isAddress == true) { + setAdapters() + binding.groupAddress.visible() + + binding.etAddress.setText(userData?.profile?.address ?: "") + binding.etCountry.setText(userData?.profile?.country ?: "") + binding.etState.setText(userData?.profile?.state ?: "") + binding.etCity.setText(userData?.profile?.city ?: "") + + userData?.custom_fields?.forEach { + if (it.field_name == CustomFields.ZIP_CODE) { + binding.etZipCode.setText(it.field_value ?: "") + return@forEach + } + } + + } else { + binding.groupAddress.gone() + } + + items.addAll(appClientDetails.insurances ?: emptyList()) + + if (appClientDetails.insurance == true) { + binding.groupInsurance.visible() + + /*Check Selected Insurance*/ + if (userData?.insurance_enable == "1") { + binding.cbYes.isChecked = true + + items.forEachIndexed { index, item -> + userData?.insurances?.forEachIndexed { _, insurance -> + if (item.id == insurance.id) { + items[index].isSelected = true + return@forEachIndexed + } + } + } + } else if (userData?.insurance_enable != null) { + binding.cbNo.isChecked = true + binding.groupInsurance.gone() + } + } else { + binding.tvHaveInsurance.gone() + binding.cbYes.gone() + binding.cbNo.gone() + binding.groupInsurance.gone() + } + + val adapter = InsuranceAdapter(this, items) + binding.rvInsurance.adapter = adapter + } + + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.btnSubmit.setOnClickListener { + binding.btnSubmit.hideKeyboard() + + checkValidations() + } + + binding.etCountry.setOnClickListener { + binding.etCountry.hideKeyboard() + binding.spnCountry.performClick() + } + + binding.spnCountry.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + if (openFirstCountry) + openFirstCountry = false + else { + binding.etState.setText("") + binding.etCity.setText("") + if (position == 0) { + binding.etCountry.setText("") + } else { + binding.etCountry.setText(itemsCountry[position].name) + countryId = itemsCountry[position].id ?: "" + + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["type"] = CountryListType.STATE + hashMap["country_id"] = countryId + viewModelVersion.countryCity(hashMap) + } + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.etState.setOnClickListener { + binding.etState.hideKeyboard() + binding.spnState.performClick() + } + + binding.spnState.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>, + view: View?, + position: Int, + id: Long) { + if (openFirstState) + openFirstState = false + else { + binding.etCity.setText("") + if (position == 0) { + binding.etState.setText("") + } else { + binding.etState.setText(itemsState.get(position).name) + stateId = itemsState[position].id ?: "" + + if (isConnectedToInternet(requireContext(), true)) { + val hashMap = HashMap() + hashMap["type"] = CountryListType.CITY + hashMap["state_id"] = stateId + + viewModelVersion.countryCity(hashMap) + } + } + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.etCity.setOnClickListener { + binding.etCity.hideKeyboard() + binding.spnCity.performClick() + } + + binding.spnCity.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected( + parent: AdapterView<*>, + view: View?, + position: Int, + id: Long + ) { + if (openFirstCity) + openFirstCity = false + else { + if (position == 0) + binding.etCity.setText("") + else { + cityId = itemsCity[position].id ?: "" + binding.etCity.setText(itemsCity.get(position).name) + } + } + } + + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.cbYes.setOnCheckedChangeListener { compoundButton, b -> + if (b) { + binding.cbNo.isChecked = false + binding.groupInsurance.visible() + } else { + binding.groupInsurance.gone() + } + } + + binding.cbNo.setOnCheckedChangeListener { compoundButton, b -> + if (b) { + binding.cbYes.isChecked = false + binding.groupInsurance.gone() + } + } + } + + private fun checkValidations() { + /*Get if insurance selected*/ + var idsInsurance = "" + items.forEach { + if (it.isSelected) + idsInsurance += it.id + "," + } + + when { + appClientDetails.clientFeaturesKeys.isAddress == true && binding.etAddress.text.toString().isEmpty() -> { + binding.etAddress.showSnackBar(getString(R.string.address)) + } + needCountry && appClientDetails.clientFeaturesKeys.isAddress == true && binding.etCountry.text.toString().isEmpty() -> { + binding.etCountry.showSnackBar(getString(R.string.select_country)) + } + appClientDetails.clientFeaturesKeys.isAddress == true && binding.etState.text.toString().isEmpty() -> { + binding.etState.showSnackBar(getString(R.string.select_state)) + } + appClientDetails.clientFeaturesKeys.isAddress == true && binding.etCity.text.toString().isEmpty() -> { + binding.etCity.showSnackBar(getString(R.string.select_city)) + } + appClientDetails.clientFeaturesKeys.isAddress == true && binding.etZipCode.text.toString().isEmpty() -> { + binding.etZipCode.showSnackBar(getString(R.string.zip)) + } + appClientDetails.insurance == true && (!binding.cbYes.isChecked && !binding.cbNo.isChecked) -> { + binding.etCity.showSnackBar(getString(R.string.do_you_have_insurance)) + } + appClientDetails.insurance == true && (binding.cbYes.isChecked && idsInsurance.isEmpty()) -> { + binding.etCity.showSnackBar(getString(R.string.select_insurance)) + } + appClientDetails.insurance == true && (!binding.cbTerm1.isChecked || !binding.cbTerm3.isChecked + || !binding.cbTerm3.isChecked) -> { + binding.etCity.showSnackBar(getString(R.string.check_all_terms)) + binding.nsvInsurance.fullScroll(View.FOCUS_DOWN) + } + else -> { + + val hashMap = HashMap() + hashMap["name"] = userRepository.getUser()?.name ?:"" + hashMap["address"] = binding.etAddress.text.toString() + hashMap["country"] = countryId + hashMap["state"] = stateId + hashMap["city"] = cityId + hashMap["insurance_enable"] = if (binding.cbYes.isChecked) "1" else "0" + + /*Get selected insurance*/ + if (binding.cbYes.isChecked) { + hashMap["insurances"] = idsInsurance.removeSuffix(",") + } + + /*Check if zip id is there in custom fields*/ + + appClientDetails.custom_fields?.service_provider?.forEach { + if (it.field_name == CustomFields.ZIP_CODE) { + val customer = ArrayList() + val item = it + item.field_value = binding.etZipCode.text.toString() + + customer.add(item) + + hashMap["custom_fields"] = Gson().toJson(customer) + return@forEach + } + } + + viewModel.updateProfile(hashMap) + } + } + } + + + private fun bindObservers() { + viewModel.updateProfile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + requireActivity().setResult(Activity.RESULT_OK) + + if (arguments?.containsKey(UPDATE_PROFILE) == true) { + requireActivity().finish() + } else + replaceFragment(requireActivity().supportFragmentManager, + CategoryFragment(), R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelVersion.countryCity.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + when (it.data?.type) { + CountryListType.COUNTRY -> { + itemsCountry.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_country) + itemsCountry.add(countryCity) + + itemsCountry.addAll(it.data.country ?: emptyList()) + spinnerCountryAdapter?.notifyDataSetChanged() + + } + CountryListType.STATE -> { + itemsState.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_state) + itemsState.add(countryCity) + + itemsState.addAll(it.data.state ?: emptyList()) + spinnerStateAdapter?.notifyDataSetChanged() + + } + CountryListType.CITY -> { + itemsCity.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_city) + itemsCity.add(countryCity) + + itemsCity.addAll(it.data.city ?: emptyList()) + spinnerCityAdapter?.notifyDataSetChanged() + } + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/login/LoginFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/login/LoginFragment.kt new file mode 100644 index 0000000..76c1e04 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/login/LoginFragment.kt @@ -0,0 +1,133 @@ +package com.consultantvendor.ui.loginSignUp.login + +import android.os.Bundle +import android.text.method.LinkMovementMethod +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentLoginBinding +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.loginemail.LoginEmailFragment +import com.consultantvendor.ui.loginSignUp.verifyotp.VerifyOTPFragment +import com.consultantvendor.ui.loginSignUp.welcome.WelcomeFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class LoginFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + private lateinit var binding: FragmentLoginBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_login, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + binding.ccpCountryCode.setCountryForNameCode(appClientDetails.country_name_code ?: "IN") + + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setAcceptTerms(requireActivity()), TextView.BufferType.SPANNABLE) + + if (arguments?.containsKey(WelcomeFragment.EXTRA_SIGNUP) == true) { + binding.tvLoginScreen.gone() + binding.tvLoginTitle.gone() + binding.tvTerms.visible() + binding.cbTerms.visible() + } else if (arguments?.containsKey(UPDATE_NUMBER) == true) { + binding.tvTitle.text = getString(R.string.update) + binding.tvLoginScreen.gone() + binding.tvLoginTitle.gone() + binding.tvTerms.gone() + binding.cbTerms.gone() + } + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.tvLoginScreen.setOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + replaceFragment(requireActivity().supportFragmentManager, LoginEmailFragment(), R.id.container) + } + + binding.ivNext.setOnClickListener { + when { + binding.etMobileNumber.text.toString().isEmpty() || binding.etMobileNumber.text.toString().length < 6 -> { + binding.etMobileNumber.showSnackBar(getString(R.string.enter_phone_number)) + } + binding.tvTerms.visibility==View.VISIBLE && !binding.cbTerms.isChecked -> { + binding.tvTerms.showSnackBar(getString(R.string.agree_to_terms)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap["country_code"] = binding.ccpCountryCode.selectedCountryCodeWithPlus + hashMap["phone"] = binding.etMobileNumber.text.toString() + viewModel.sendSms(hashMap) + } + } + } + } + + private fun bindObservers() { + viewModel.sendSMS.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + val fragment = VerifyOTPFragment() + val bundle = Bundle() + bundle.putString(COUNTRY_CODE, binding.ccpCountryCode.selectedCountryCodeWithPlus) + bundle.putString(PHONE_NUMBER, binding.etMobileNumber.text.toString()) + if (arguments?.containsKey(UPDATE_NUMBER) == true) + bundle.putBoolean(UPDATE_NUMBER, true) + fragment.arguments = bundle + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/loginemail/LoginEmailFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/loginemail/LoginEmailFragment.kt new file mode 100644 index 0000000..e5d58ef --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/loginemail/LoginEmailFragment.kt @@ -0,0 +1,146 @@ +package com.consultantvendor.ui.loginSignUp.loginemail + +import android.content.Intent +import android.os.Bundle +import android.util.Patterns +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.network.ApiKeys +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.ProviderType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentLoginEmailBinding +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.category.CategoryFragment +import com.consultantvendor.ui.loginSignUp.forgotpassword.ForgotPasswordFragment +import com.consultantvendor.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantvendor.ui.loginSignUp.login.LoginFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +// +//jhjh jh + +class LoginEmailFragment : DaggerFragment() { + + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentLoginEmailBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_login_email, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.ivNext.setOnClickListener { + when { + binding.etEmail.text.toString().isEmpty() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_email)) + } + !Patterns.EMAIL_ADDRESS.matcher(binding.etEmail.text.toString()).matches() -> { + binding.etEmail.showSnackBar(getString(R.string.enter_correct_email)) + } + binding.etPassword.text.toString().length < 8 -> { + binding.etPassword.showSnackBar(getString(R.string.enter_password)) + } + isConnectedToInternet(requireContext(), true) -> { + val hashMap = HashMap() + hashMap[ApiKeys.PROVIDER_TYPE] = ProviderType.email + hashMap["provider_id"] = binding.etEmail.text.toString() + hashMap[ApiKeys.PROVIDER_VERIFICATION] = binding.etPassword.text.toString() + hashMap[ApiKeys.USER_TYPE] = APP_TYPE + + viewModel.login(hashMap) + } + } + } + + binding.tvForgetPass.setOnClickListener { + replaceFragment(requireActivity().supportFragmentManager, + ForgotPasswordFragment(), R.id.container) + } + + binding.tvLoginScreen.setOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + replaceFragment(requireActivity().supportFragmentManager, LoginFragment(), R.id.container) + } + } + + + private fun bindObservers() { + viewModel.login.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + when { + userRepository.isUserLoggedIn() -> { + startActivity(Intent(requireActivity(), HomeActivity::class.java)) + requireActivity().finish() + } + appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true -> { + replaceFragment(requireActivity().supportFragmentManager, + InsuranceFragment(), R.id.container) + } + else -> replaceFragment(requireActivity().supportFragmentManager, + CategoryFragment(), R.id.container) + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceAdapter.kt new file mode 100644 index 0000000..37a180f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceAdapter.kt @@ -0,0 +1,69 @@ +package com.consultantvendor.ui.loginSignUp.prefrence + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Filter +import com.consultantvendor.data.models.responses.FilterOption +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemPrefrenceBinding + + +class PrefrenceAdapter(private val fragment: PrefrenceFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_prefrence, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemPrefrenceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.root.setOnClickListener { + fragment.clickItem(items[bindingAdapterPosition]) + } + + } + + fun bind(item: Filter) = with(binding) { + tvName.text = item.preference_name + + val listOptions = ArrayList() + listOptions.addAll(item.options ?: emptyList()) + val prefrenceItemAdapter = PrefrenceItemAdapter(item.is_multi == "1", listOptions) + rvListing.adapter = prefrenceItemAdapter + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceFragment.kt new file mode 100644 index 0000000..21e635d --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceFragment.kt @@ -0,0 +1,269 @@ +package com.consultantvendor.ui.loginSignUp.prefrence + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.SetFilter +import com.consultantvendor.data.models.requests.UpdateServices +import com.consultantvendor.data.models.responses.Categories +import com.consultantvendor.data.models.responses.Filter +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentServiceBinding +import com.consultantvendor.ui.drawermenu.classes.ClassesViewModel +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.service.ServiceFragment +import com.consultantvendor.ui.loginSignUp.service.ServiceFragment.Companion.FILTER_DATA +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class PrefrenceFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentServiceBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var viewModelLogin: LoginViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: PrefrenceAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var categoryData: Categories? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_service, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + viewModelLogin = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvHeader.text = getString(R.string.set_preferences) + categoryData = arguments?.getSerializable(CATEGORY_PARENT_ID) as Categories + + if (requireActivity().intent.hasExtra(UPDATE_PREFRENCES)) + binding.tvNext.text = getString(R.string.update) + } + + private fun setAdapter() { + adapter = PrefrenceAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + + binding.tvNext.setOnClickListener { + /*Check selected Filter*/ + val filterArray = ArrayList() + + var setFilter: SetFilter + + items.forEachIndexed { index, filter -> + setFilter = SetFilter() + + /*Set filter Id*/ + setFilter.filter_id = filter.id + setFilter.filter_option_ids = ArrayList() + + var selectedOption = false + filter.options?.forEach { + if (it.isSelected) { + selectedOption = true + + setFilter.filter_option_ids?.add(it.id ?: "") + } + } + + if (selectedOption) { + filterArray.add(setFilter) + } else { + binding.toolbar.showSnackBar("Please select any "+filter.preference_name+ " preferences") + return@setOnClickListener + } + } + + /*If Need to update*/ + if (requireActivity().intent.hasExtra(UPDATE_PREFRENCES)) { + val updateServices = UpdateServices() + updateServices.category_id = categoryData?.id + + updateServices.filters = ArrayList() + updateServices.filters?.addAll(filterArray) + + if (isConnectedToInternet(requireContext(), true)) { + viewModelLogin.updateServices(updateServices) + } + } else { + + val fragment = ServiceFragment() + val bundle = Bundle() + bundle.putSerializable(CATEGORY_PARENT_ID, categoryData) + bundle.putSerializable(FILTER_DATA, filterArray) + + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + } + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + hashMap["category_id"] = categoryData?.id ?: "" + if (requireActivity().intent.hasExtra(UPDATE_PREFRENCES)) + hashMap["user_id"] = userRepository.getUser()?.id ?: "" + + viewModel.getFilters(hashMap) + }else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.getFilters.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + isLoadingMoreItems = false + + val tempList = it.data?.filters ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + if (items.isNotEmpty()) + binding.tvNext.visible() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + binding.swipeRefresh.isRefreshing = false + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + binding.clLoader.gone() + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + binding.tvNext.gone() + } + } + }) + + viewModelLogin.updateServices.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + + } + } + }) + } + + + fun clickItem(item: Filter?) { + + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceItemAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceItemAdapter.kt new file mode 100644 index 0000000..543aea5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/prefrence/PrefrenceItemAdapter.kt @@ -0,0 +1,81 @@ +package com.consultantvendor.ui.loginSignUp.prefrence + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.FilterOption +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemPrefrenceOptionBinding +import com.consultantvendor.utils.gone +import com.consultantvendor.utils.visible + + +class PrefrenceItemAdapter(private val multiSelect: Boolean, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_prefrence_option, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemPrefrenceOptionBinding) : + RecyclerView.ViewHolder(binding.root) { + + fun bind(item: FilterOption) = with(binding) { + if (multiSelect) { + cbName.visible() + rbName.gone() + } else { + cbName.gone() + rbName.visible() + } + + cbName.text = item.option_name + rbName.text = item.option_name + + rbName.isChecked = item.isSelected + cbName.isChecked = item.isSelected + + clMain.setOnClickListener { + if (multiSelect) { + items[adapterPosition].isSelected = !items[adapterPosition].isSelected + notifyDataSetChanged() + } else { + items.forEachIndexed { index, filterOption -> + items[index].isSelected = adapterPosition == index + } + notifyDataSetChanged() + } + } + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/service/ServiceAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/service/ServiceAdapter.kt new file mode 100644 index 0000000..aa38315 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/service/ServiceAdapter.kt @@ -0,0 +1,133 @@ +package com.consultantvendor.ui.loginSignUp.service + +import android.graphics.Color +import android.text.Editable +import android.text.InputType +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Service +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemServiceBinding +import com.consultantvendor.utils.* + + +class ServiceAdapter(private val fragment: ServiceFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_service, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemServiceBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.tvSymbol.text = getCurrencySymbol() + if (BuildConfig.FLAVOR == "taradoc") { + binding.tvAddAvailability.setTextColor(Color.parseColor("#E7D27C")) + } + binding.tvAddAvailability.setOnClickListener { + fragment.clickAddAvailability(bindingAdapterPosition) + } + + binding.etAddress.setOnClickListener { + fragment.clinicAddress(bindingAdapterPosition) + } + } + + fun bind(item: Service) = with(binding) { + switchActive.setOnCheckedChangeListener(null) + + val context = binding.root.context + + tvName.text = item.name + switchActive.isChecked = item.isSelected + + if (item.isSelected) { + groupConsultation.visible() + tvAddAvailability.visible() + + if (item.price_type == PriceType.PRICE_RANGE) { + etConsultationFeeV.isFocusable = true + etConsultationFeeV.isFocusableInTouchMode = true + tvPrice.text = context.getString(R.string.price_btw, + getCurrency(item.price_minimum.toString()), getCurrency(item.price_maximum.toString())) + etConsultationFeeV.setText((item.price ?: "").toString()) + } else { + tvPrice.text = context.getString(R.string.fixed_price) + etConsultationFeeV.isFocusable = false + etConsultationFeeV.isFocusableInTouchMode = false + etConsultationFeeV.setText((item.price_fixed ?: 0).toString()) + } + + tvAddAvailability.hideShowView(item.need_availability == "1") + + tvAddAvailability.text = if (item.isAvailabilityLocal) + context.getString(R.string.edit_availability) + else context.getString(R.string.add_availability) + + + tvConsultationUnitV.setText("${getCurrencySymbol()} / ${getUnitPrice(item.unit_price, binding.root.context)}") + + ilAddress.hideShowView(item.main_service_type == ConsultType.CLINIC_VISIT || item.main_service_type == ConsultType.HOME_VISIT) + ilAddress.hint = context.getString(R.string.clinic_address, item.name) + etAddress.setText(item.clinic_address?.locationName ?: "") + } else { + groupConsultation.gone() + tvAddAvailability.gone() + binding.ilAddress.gone() + } + + switchActive.setOnCheckedChangeListener { buttonView, isChecked -> + items[bindingAdapterPosition].isSelected = isChecked + notifyDataSetChanged() + } + + etConsultationFeeV.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(s: Editable) {} + override fun beforeTextChanged(s: CharSequence, start: Int, + count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence, start: Int, + before: Int, count: Int) { + items[bindingAdapterPosition].price = etConsultationFeeV.text.toString() + } + }) + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} + diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/service/ServiceFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/service/ServiceFragment.kt new file mode 100644 index 0000000..827c085 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/service/ServiceFragment.kt @@ -0,0 +1,376 @@ +package com.consultantvendor.ui.loginSignUp.service + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.requests.* +import com.consultantvendor.data.models.responses.Categories +import com.consultantvendor.data.models.responses.Service +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentServiceBinding +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.ui.dashboard.location.AddAddressActivity +import com.consultantvendor.ui.drawermenu.classes.ClassesViewModel +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.availability.SetAvailabilityFragment +import com.consultantvendor.ui.loginSignUp.availability.SetAvailabilityFragment.Companion.WORKING_TIME +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.CATEGORY_PARENT_ID +import com.consultantvendor.ui.loginSignUp.subcategory.SubCategoryFragment.Companion.SERVICE_ID +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class ServiceFragment : DaggerFragment() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentServiceBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var viewModelLogin: LoginViewModel + + private lateinit var progressDialog: ProgressDialog + + private var items = ArrayList() + + private lateinit var adapter: ServiceAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var categoryData: Categories? = null + + private var availabilityPos = 0 + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_service, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + viewModelLogin = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + binding.tvHeader.text = getString(R.string.service_type) + categoryData = arguments?.getSerializable(CATEGORY_PARENT_ID) as Categories + } + + private fun setAdapter() { + adapter = ServiceAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + if (requireActivity().supportFragmentManager.backStackEntryCount > 0) + requireActivity().supportFragmentManager.popBackStack() + else + requireActivity().finish() + } + + binding.swipeRefresh.setOnRefreshListener { + hitApi(true) + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + + binding.tvNext.setOnClickListener { + val updateServices = UpdateServices() + updateServices.category_services_type = ArrayList() + + var serviceSelected = false + items.forEach { + if (it.isSelected) { + serviceSelected = true + + /*Set Services*/ + val setService = SetService() + setService.id = it.id + setService.available = "1" + setService.isAvailabilityChanged = it.isAvailabilityChanged + if (it.price_type == PriceType.PRICE_RANGE) { + if (it.price.isNullOrEmpty()) { + binding.tvNext.showSnackBar(getString(R.string.add_price_for, it.name)) + return@setOnClickListener + } else { + val price = it.price?.toDoubleOrNull() + if (((price ?: 0.0) < (it?.price_minimum?: 0.0)) || ((price ?: 0.0) > (it.price_maximum ?: 0.0))) { + binding.tvNext.showSnackBar( + getString( + R.string.add_price__in_s, it.price_minimum.toString(), + it.price_maximum.toString(), it.name + ) + ) + return@setOnClickListener + } + } + + /*Set price*/ + setService.price = it.price?.toDouble() + } else { + setService.price = it.price_fixed + } + + if (it.need_availability == "1" && !it.isAvailabilityLocal) { + binding.tvNext.showSnackBar(getString(R.string.add_availability_s, it.name)) + return@setOnClickListener + } + + if ((it.main_service_type == ConsultType.CLINIC_VISIT || it.main_service_type == ConsultType.HOME_VISIT) && it.clinic_address == null) { + binding.tvNext.showSnackBar(getString(R.string.select_clinic_address, it.name)) + return@setOnClickListener + } else { + setService.clinic_address = SaveAddress() + setService.clinic_address = it.clinic_address + } + + /*Set Availability*/ +// convert time to 24 hours format + val setAvailability = SetAvailability() + setAvailability.applyoption = it.setAvailability?.applyoption + setAvailability.days = it.setAvailability?.days + setAvailability.date = it.setAvailability?.date + setAvailability.slots = ArrayList() + + it.setAvailability?.slots?.forEach { + val interval = Interval() + interval.start_time = DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT_24, it.start_time ?: "") + interval.end_time = DateUtils.dateFormatForBackend(DateFormat.TIME_FORMAT, + DateFormat.TIME_FORMAT_24, it.end_time ?: "") + setAvailability.slots?.add(interval) + } + + setService.availability = setAvailability + updateServices.category_services_type?.add(setService) + } else { + val setService = SetService() + setService.id = it.id + setService.available = "0" + + if (it.price_type == PriceType.PRICE_RANGE) { + setService.price = if (it.price.isNullOrEmpty()) 0.0 else it.price?.toDouble() + } else { + setService.price = it.price_fixed + } + + updateServices.category_services_type?.add(setService) + } + } + + /*Set final data*/ + if (serviceSelected) { + updateServices.category_id = categoryData?.id + if (arguments?.containsKey(FILTER_DATA) == true) { + updateServices.filters = ArrayList() + updateServices.filters?.addAll(arguments?.getSerializable(FILTER_DATA) as ArrayList) + } + + if (isConnectedToInternet(requireContext(), true)) { + viewModelLogin.updateServices(updateServices) + } + + } else { + binding.tvNext.showSnackBar(getString(R.string.select_service)) + return@setOnClickListener + } + } + } + + private fun hitApi(firstHit: Boolean) { + if (isConnectedToInternet(requireContext(), true)) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + hashMap["category_id"] = categoryData?.id ?: "" + + viewModel.services(hashMap) + } else + binding.swipeRefresh.isRefreshing = false + } + + private fun bindObservers() { + viewModel.services.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + isLoadingMoreItems = false + + val tempList = it.data?.services ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + + /*If Update*/ + if (requireActivity().intent.hasExtra(UPDATE_AVAILABILITY)) { + val selectedService = userRepository.getUser()?.services + items.forEachIndexed { index, service -> + selectedService?.forEachIndexed { indexSelected, serviceSelected -> + if (service.service_id == serviceSelected.service_id) { + items[index].price = serviceSelected.price + items[index].clinic_address = serviceSelected.clinic_address + if (serviceSelected.available == "1") { + items[index].isSelected = true + items[index].isAvailabilityLocal = true + return@forEachIndexed + } + } + } + } + } + + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + binding.clLoader.gone() + binding.swipeRefresh.isRefreshing = false + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + if (!binding.swipeRefresh.isRefreshing) + binding.clLoader.visible() + } + } + }) + + viewModelLogin.updateServices.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + if (requireActivity().intent.hasExtra(UPDATE_AVAILABILITY) || + requireActivity().intent.hasExtra(UPDATE_CATEGORY)) { + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } else { + startActivity(Intent(requireContext(), HomeActivity::class.java)) + requireActivity().finish() + } + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + + } + } + }) + } + + fun clickAddAvailability(position: Int) { + availabilityPos = position + val fragment = SetAvailabilityFragment() + val bundle = Bundle() + bundle.putSerializable(WORKING_TIME, items[position].setAvailability) + bundle.putString(SERVICE_ID, items[position].service_id) + bundle.putString(CATEGORY_PARENT_ID, categoryData?.id) + fragment.arguments = bundle + + replaceResultFragment(this, fragment, R.id.container, AppRequestCode.ADD_AVAILABILITY) + } + + fun clinicAddress(position: Int) { + availabilityPos = position + + val intent = Intent(requireContext(), AddAddressActivity::class.java) + if (items[availabilityPos].clinic_address?.lat != null) + intent.putExtra(AddAddressActivity.EXTRA_ADDRESS, items[availabilityPos].clinic_address) + startActivityForResult(intent, AppRequestCode.ASK_FOR_LOCATION) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + when (requestCode) { + AppRequestCode.ADD_AVAILABILITY -> { + val setAvailability = data?.getSerializableExtra(WORKING_TIME) as SetAvailability + items[availabilityPos].setAvailability = setAvailability + items[availabilityPos].isAvailabilityChanged = true + items[availabilityPos].isAvailabilityLocal = true + adapter.notifyDataSetChanged() + } + + AppRequestCode.ASK_FOR_LOCATION -> { + items[availabilityPos].clinic_address = SaveAddress() + items[availabilityPos].clinic_address = data?.getSerializableExtra(AddAddressActivity.EXTRA_ADDRESS) as SaveAddress + adapter.notifyItemChanged(availabilityPos) + } + } + } + } + + companion object { + const val FILTER_DATA = "FILTER_DATA" + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/signup/SignUpFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/signup/SignUpFragment.kt new file mode 100644 index 0000000..5eef059 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/signup/SignUpFragment.kt @@ -0,0 +1,1058 @@ +package com.consultantvendor.ui.loginSignUp.signup + +import android.Manifest +import android.annotation.SuppressLint +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Matrix +import android.media.ExifInterface +import android.net.Uri +import android.os.Bundle +import android.provider.MediaStore +import android.text.method.LinkMovementMethod +import android.util.Log +import android.util.Patterns +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.AdapterView +import android.widget.ArrayAdapter +import android.widget.TextView +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.RequestOptions +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.appFeatures +import com.consultantvendor.data.models.requests.DocImage +import com.consultantvendor.data.models.requests.SaveAddress +import com.consultantvendor.data.models.requests.SetFilter +import com.consultantvendor.data.models.responses.CountryCity +import com.consultantvendor.data.models.responses.Filter +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.models.responses.appdetails.Insurance +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.ProviderType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentSignupBinding +import com.consultantvendor.ui.AppVersionViewModel +import com.consultantvendor.ui.chat.UploadFileViewModel +import com.consultantvendor.ui.drawermenu.classes.ClassesViewModel +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.category.CategoryFragment +import com.consultantvendor.ui.loginSignUp.insurance.CustomSpinnerAdapter +import com.consultantvendor.ui.loginSignUp.insurance.InsuranceAdapter +import com.consultantvendor.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantvendor.ui.loginSignUp.verifyotp.VerifyOTPFragment +import com.consultantvendor.ui.loginSignUp.welcome.WelcomeFragment.Companion.EXTRA_SOCIAL +import com.consultantvendor.utils.* +import com.consultantvendor.utils.PermissionUtils +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.consultantvendor.utils.dialogs.ProgressDialogImage +import com.google.android.libraries.places.widget.Autocomplete +import com.google.gson.Gson +import dagger.android.support.DaggerFragment +//import droidninja.filepicker.FilePickerConst +//import droidninja.filepicker.utils.ContentUriUtils +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.asRequestBody +import permissions.dispatcher.* +import java.io.File +import java.io.FileOutputStream +import javax.inject.Inject + + +@RuntimePermissions +class SignUpFragment : BasePhotoUplaodFragment(), OnDateSelected { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentSignupBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var progressDialogImage: ProgressDialogImage + + private lateinit var viewModel: LoginViewModel + + private lateinit var viewModelUpload: UploadFileViewModel + + private lateinit var viewModelClass: ClassesViewModel + + private lateinit var viewModelVersion: AppVersionViewModel + + private var userData: UserData? = null + + private var isUpdate = false + + private var fileToUpload: File? = null + + private var selectedDob = true + + private var openFirstCountry = true + + private var countryId = "" + + private var spinnerCountryAdapter: CustomSpinnerAdapter? = null + + private val itemsCountry = ArrayList() + + private var openFirstGender = true + + private var spinnerGenderAdapter: CustomSpinnerAdapter? = null + + private val itemsGender = ArrayList() + + private var openFirstSignUpAs = true + + private var spinnerSignUpAsAdapter: CustomSpinnerAdapter? = null + + private val itemsSignUpAs = ArrayList() + + private var prefrences: ArrayList? = null + + private val itemsLanguage = ArrayList() + + private var hashMap = HashMap() + + private var saveAddress = SaveAddress() + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_signup, container, false) + rootView = binding.root + + initialise() + listeners() + setEditInformation() + bindObservers() + } + return rootView + } + + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + viewModelUpload = ViewModelProvider(this, viewModelFactory)[UploadFileViewModel::class.java] + viewModelClass = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + viewModelVersion = ViewModelProvider(this, viewModelFactory)[AppVersionViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + progressDialogImage = ProgressDialogImage(requireActivity()) + + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setAcceptTerms(requireActivity()), TextView.BufferType.SPANNABLE) +// if (BuildConfig.FLAVOR=="taradoc") +// binding.etYears.setHint(R.string.practicing_since) +// else +// binding.etYears.setHint(R.string.since_working) + + binding.ilLocation.hideShowView(BuildConfig.FLAVOR =="taradoc") + binding.clPhone.hideShowView(BuildConfig.FLAVOR =="taradoc") + binding.ccpCountryCode.setCountryForNameCode(appClientDetails.country_name_code ?: "IN") + + /*If need country list*/ + if (appFeatures.signUpAddition) { + binding.ilCountry.visible() + binding.ilGender.visible() + binding.ilSignUpAs.visible() + binding.ilLanguages.visible() + binding.rvLanguages.visible() + binding.tvEmergency.visible() + binding.rgEmergency.visible() + + spinnerCountryAdapter = CustomSpinnerAdapter(requireContext(), itemsCountry) + binding.spnCountry.adapter = spinnerCountryAdapter + var hashMap = HashMap() + hashMap["type"] = CountryListType.COUNTRY + viewModelVersion.countryCity(hashMap) + + spinnerGenderAdapter = CustomSpinnerAdapter(requireContext(), itemsGender) + binding.spnGender.adapter = spinnerGenderAdapter + spinnerSignUpAsAdapter = CustomSpinnerAdapter(requireContext(), itemsSignUpAs) + binding.spnSignUpAs.adapter = spinnerSignUpAsAdapter + hashMap = HashMap() + hashMap["type"] = PreferencesType.ALL + viewModelVersion.preferences(hashMap) + } + + if (BuildConfig.FLAVOR=="taradoc") { + val list = resources.getStringArray(R.array.dr_title) + val arrayAdapter: ArrayAdapter = + ArrayAdapter(requireContext(), android.R.layout.simple_spinner_item, list) + arrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) + binding.spnTitle.setAdapter(arrayAdapter) + + binding.tvHeader.text= getString(R.string.join_community) + + } +// else +// resources.getStringArray(R.array.dr_title) + + + } + + private fun setEditInformation() { + editTextScroll(binding.etBio) + userData = userRepository.getUser() + val list = if (BuildConfig.FLAVOR=="taradoc") + resources.getStringArray(R.array.dr_title) + else + resources.getStringArray(R.array.dr_title) + binding.ilInviteCode.hideShowView(appFeatures.needInviteCode) + if (arguments?.containsKey(UPDATE_PROFILE) == true) { + binding.tvNext.text = getString(R.string.update) + binding.tvHeader.text = getString(R.string.update) + + val title = userData?.profile?.title ?: getString(R.string.title) +// val list = if (BuildConfig.FLAVOR=="taradoc") +// resources.getStringArray(R.array.dr_female_title) +// else +// resources.getStringArray(R.array.dr_title) + binding.spnTitle.setSelection(list.indexOf(title)) + + binding.etName.setText(userData?.name ?: "") + binding.etBio.setText(userData?.profile?.bio ?: "") + binding.etEmail.setText(userData?.email ?: "") + + if (!userData?.profile?.dob.isNullOrEmpty()) + binding.etDob.setText(DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.dob ?: "")) + + if (!userData?.profile?.working_since.isNullOrEmpty()) + binding.etYears.setText(DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.working_since ?: "")) + + loadImage("profile",binding.ivPic, userData?.profile_image, R.drawable.ic_profile_placeholder) + + if (appFeatures.signUpAddition) { + binding.etCountry.setText(userData?.profile?.country ?: "") + countryId = userData?.profile?.country_id ?: "" + + userData?.master_preferences?.forEach { + when (it.preference_name) { + PreferencesType.GENDER -> { + it.options?.forEachIndexed { index, filterOption -> + if (filterOption.isSelected) + binding.etGender.setText(filterOption.option_name) + } + } + PreferencesType.SIGNUP_AS -> { + it.options?.forEachIndexed { index, filterOption -> + if (filterOption.isSelected) + binding.etSignUpAs.setText(filterOption.option_name) + } + } + } + } + } + + userData?.custom_fields?.forEach { + if (it.field_name == ConsultType.EMERGENCY_CONSULTATION) { + binding.rbYes.isChecked = it.field_value == "1" + return@forEach + } + } + + /*If Social login email not editable*/ + if (binding.etEmail.text.toString().isNotEmpty() && (userData?.provider_type == ProviderType.facebook || + userData?.provider_type == ProviderType.google)) { + binding.ilEmail.isEnabled = false + } + + binding.ilPassword.gone() + binding.ilConfirmPassword.gone() + binding.ilInviteCode.gone() + binding.tvTerms.gone() + binding.cbTerms.gone() + + isUpdate = true + } else if (arguments?.containsKey(UPDATE_NUMBER) == true) { + binding.ilPassword.gone() + binding.ilConfirmPassword.gone() + binding.tvTerms.hideShowView(arguments?.containsKey(EXTRA_SOCIAL) == true) + binding.cbTerms.hideShowView(arguments?.containsKey(EXTRA_SOCIAL) == true) + + val title = userData?.profile?.title ?: getString(R.string.title) + val list = resources.getStringArray(R.array.dr_title) + binding.spnTitle.setSelection(list.indexOf(title)) + + binding.etName.setText(userData?.name ?: "") + binding.etEmail.setText(userData?.email ?: "") + binding.etBio.setText(userData?.profile?.bio ?: "") + + if (!userData?.profile?.dob.isNullOrEmpty()) + binding.etDob.setText(DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.dob ?: "")) + + if (!userData?.profile?.working_since.isNullOrEmpty()) + binding.etYears.setText(DateUtils.dateFormatChange(DateFormat.DATE_FORMAT, + DateFormat.MON_DATE_YEAR, userData?.profile?.working_since ?: "")) + + loadImage("profile",binding.ivPic, userData?.profile_image, R.drawable.ic_profile_placeholder) + + /*If Social login email not editable*/ + if (binding.etEmail.text.toString().isNotEmpty() && (userData?.provider_type == ProviderType.facebook || + userData?.provider_type == ProviderType.google)) { + binding.ilEmail.isEnabled = false + } + + isUpdate = true + } + } + + @SuppressLint("NewApi") + private fun listeners() { + binding.tvLocation.setOnClickListener { + placePicker(this, requireActivity()) + } + + binding.toolbar.setNavigationOnClickListener { + if (arguments?.containsKey(UPDATE_PROFILE) == true) + requireActivity().finish() + else + requireActivity().supportFragmentManager.popBackStack() + } + + binding.etDob.setOnClickListener { + selectedDob = true + binding.etDob.hideKeyboard() + DateUtils.openDatePicker(requireActivity(), this, (System.currentTimeMillis() - 36000), null) + } + binding.etYears.setOnClickListener { + selectedDob = false + binding.etDob.hideKeyboard() + DateUtils.openDatePicker(requireActivity(), this, (System.currentTimeMillis() - 36000), null) + } + + binding.tvNext.setOnClickListener { + checkValidation() + } + + binding.etTitle.setOnClickListener { + binding.spnTitle.performClick() + } + + binding.ivPic.setOnClickListener { + // getStorageWithPermissionCheck() + showImageDialog(false) + } + + binding.spnTitle.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parentView: AdapterView<*>, + selectedItemView: View?, position: Int, id: Long) { + binding.etTitle.setText(binding.spnTitle.selectedItem.toString()) + } + + override fun onNothingSelected(parentView: AdapterView<*>) { + + } + } + + binding.etGender.setOnClickListener { + binding.etGender.hideKeyboard() + binding.spnGender.performClick() + } + + binding.spnGender.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + when { + openFirstGender -> openFirstGender = false + position == 0 -> binding.etGender.setText("") + else -> binding.etGender.setText(itemsGender[position].name) + } + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.etSignUpAs.setOnClickListener { + binding.etSignUpAs.hideKeyboard() + binding.spnSignUpAs.performClick() + } + + binding.spnSignUpAs.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + when { + openFirstSignUpAs -> openFirstSignUpAs = false + position == 0 -> binding.etSignUpAs.setText("") + else -> binding.etSignUpAs.setText(itemsSignUpAs[position].name) + } + + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + + binding.etCountry.setOnClickListener { + binding.etCountry.hideKeyboard() + binding.spnCountry.performClick() + } + + binding.spnCountry.onItemSelectedListener = (object : AdapterView.OnItemSelectedListener { + override fun onItemSelected(parent: AdapterView<*>, view: View?, position: Int, id: Long) { + when { + openFirstCountry -> openFirstCountry = false + position == 0 -> binding.etCountry.setText("") + else -> { + binding.etCountry.setText(itemsCountry[position].name) + countryId = itemsCountry[position].id ?: "" + } + } + + } + + override fun onNothingSelected(parent: AdapterView<*>?) { + } + }) + } + + private fun checkValidation() { + when { + binding.spnTitle.selectedItemPosition == 0 -> { + binding.etTitle.showSnackBar(getString(R.string.enter_title)) + } + binding.etName.text.toString().trim().isEmpty() -> { + binding.etName.showSnackBar(getString(R.string.enter_name)) + } + (!isUpdate && binding.etEmail.text.toString().trim().isEmpty()) -> { + binding.etEmail.showSnackBar(getString(R.string.enter_email)) + } + (binding.etEmail.text.toString().trim().isNotEmpty() && + !Patterns.EMAIL_ADDRESS.matcher(binding.etEmail.text.toString().trim()).matches()) -> { + binding.etEmail.showSnackBar(getString(R.string.enter_correct_email)) + } + (!isUpdate && binding.etPassword.text.toString().trim().length < 8) -> { + binding.etPassword.showSnackBar(getString(R.string.enter_password)) + } + binding.tvLocation.text.toString().trim().isEmpty() && BuildConfig.FLAVOR== "taradoc"-> { + binding.tvLocation.showSnackBar(getString(R.string.select_city)) + } + binding.etDob.text.toString().trim().isEmpty() -> { + binding.etDob.showSnackBar(getString(R.string.select_dob)) + } + + binding.clPhone.visibility==View.VISIBLE &&( binding.etMobileNumber.text.toString().isEmpty() || binding.etMobileNumber.text.toString().length < 6 )-> { + binding.etMobileNumber.showSnackBar(getString(R.string.enter_phone_number)) + } + + binding.etYears.text.toString().trim().isEmpty() -> { + binding.etYears.showSnackBar(getString(R.string.since_working)) + } + appFeatures.signUpAddition && binding.etGender.text.toString().trim().isEmpty() -> { + binding.etGender.showSnackBar(getString(R.string.select_gender)) + } + appFeatures.signUpAddition && binding.etSignUpAs.text.toString().trim().isEmpty() -> { + binding.etSignUpAs.showSnackBar(getString(R.string.sign_up_as)) + } + appFeatures.signUpAddition && binding.etCountry.text.toString().trim().trim().isEmpty() -> { + binding.etCountry.showSnackBar(getString(R.string.select_country)) + } + appFeatures.signUpAddition && binding.etLanguages.text.toString().trim().isEmpty() -> { + binding.etLanguages.showSnackBar(getString(R.string.choose_language)) + } + binding.etBio.text.toString().trim().isEmpty() -> { + binding.etBio.showSnackBar(getString(R.string.enter_bio)) + } + binding.tvTerms.visibility == View.VISIBLE && !binding.cbTerms.isChecked -> { + binding.tvTerms.showSnackBar(getString(R.string.agree_to_terms)) + } + isConnectedToInternet(requireContext(), true) -> { + if (fileToUpload != null && fileToUpload?.exists() == true) { + uploadFileOnServer(fileToUpload) + } else { + hitApi(null) + } + } + } + } + + private fun hitApi(image: String?) { + hashMap = HashMap() + hashMap["title"] = binding.etTitle.text.toString().trim() + hashMap["name"] = binding.etName.text.toString().trim() + + try { + hashMap["dob"] = DateUtils.dateFormatForBackend(DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, binding.etDob.text.toString().trim()) + hashMap["working_since"] = DateUtils.dateFormatForBackend(DateFormat.MON_DATE_YEAR, + DateFormat.DATE_FORMAT, binding.etYears.text.toString().trim()) + } catch (e: Exception) { + } + hashMap["bio"] = binding.etBio.text.toString().trim() + + if (binding.etInviteCode.text.toString().trim().isNotEmpty()) + hashMap["referral_code"] = binding.etInviteCode.text.toString().trim() + + if (binding.ilLocation.visibility==View.VISIBLE && binding.tvLocation.text.toString().trim().isNotEmpty()) + hashMap["city"] = binding.tvLocation.text.toString().trim() + + if(binding.clPhone.visibility==View.VISIBLE){ + hashMap["country_code"] = binding.ccpCountryCode.selectedCountryCodeWithPlus + hashMap["phone"] = binding.etMobileNumber.text.toString() + } + + appClientDetails.custom_fields?.service_provider?.forEach { + if (it.field_name == ConsultType.EMERGENCY_CONSULTATION) { + val customer = ArrayList() + val item = it + item.field_value = if (binding.rbYes.isChecked) "1" else "0" + + customer.add(item) + + hashMap["custom_fields"] = Gson().toJson(customer) + return@forEach + } + } + + if (appFeatures.signUpAddition) { + hashMap["country"] = countryId + + val filterArray = ArrayList() + + var setFilter: SetFilter + prefrences?.forEach { + setFilter = SetFilter() + setFilter.preference_id = it.id + + when (it.preference_name) { + PreferencesType.GENDER -> { + if (binding.spnGender.selectedItemPosition != 0) { + setFilter.option_ids = ArrayList() + setFilter.option_ids?.add(itemsGender[binding.spnGender.selectedItemPosition].id + ?: "") + filterArray.add(setFilter) + } + } + PreferencesType.SIGNUP_AS -> { + if (binding.spnSignUpAs.selectedItemPosition != 0) { + setFilter.option_ids = ArrayList() + setFilter.option_ids?.add(itemsSignUpAs[binding.spnSignUpAs.selectedItemPosition].id + ?: "") + filterArray.add(setFilter) + } + } + PreferencesType.LANGUAGES -> { + setFilter.option_ids = ArrayList() + itemsLanguage.forEach { + if (it.isSelected) + setFilter.option_ids?.add(it.id ?: "") + + } + filterArray.add(setFilter) + } + } + } + + hashMap["master_preferences"] = Gson().toJson(filterArray) + } + + if (image != null) + hashMap["profile_image"] = image + + if (binding.etEmail.text.toString().trim().isNotEmpty()) + hashMap["email"] = binding.etEmail.text.toString().trim() + + /*Update profile or register*/ + when { + arguments?.containsKey(UPDATE_NUMBER) == true -> { + viewModel.updateProfile(hashMap) + } + arguments?.containsKey(UPDATE_PROFILE) == true -> { + viewModel.updateProfile(hashMap) + } + BuildConfig.FLAVOR == "nurseLynx" || BuildConfig.FLAVOR == "homeDoctor" -> { + val hashMapOtp = HashMap() + hashMapOtp["email"] = binding.etEmail.text.toString().trim() + viewModel.sendEmailOtp(hashMapOtp) + } + else -> { + hashMap["password"] = binding.etPassword.text.toString().trim() + hashMap["user_type"] = APP_TYPE + viewModel.register(hashMap) + } + } + } + + + private fun uploadFileOnServer(fileToUpload: File?) { + val hashMap = HashMap() + + hashMap["type"] = getRequestBody(DocType.IMAGE) + + val body: RequestBody = fileToUpload?.asRequestBody("image/*".toMediaType())!! + hashMap["image\"; fileName=\"" + fileToUpload?.name] = body + + viewModelUpload.uploadFile(hashMap) + } + + + private fun bindObservers() { + viewModel.sendEmailOtp.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + hashMap["password"] = binding.etPassword.text.toString().trim() + hashMap["user_type"] = APP_TYPE + + val fragment = VerifyOTPFragment() + val bundle = Bundle() + bundle.putString(VerifyOTPFragment.EXTRA_EMAIL, binding.etEmail.text.toString().trim()) + bundle.putSerializable(VerifyOTPFragment.EXTRA_EMAIL_DATA, hashMap) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.register.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + /*If need to move to phone number*/ + + requireActivity().setResult(Activity.RESULT_OK) + + if (appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true) { + val fragment = InsuranceFragment() + val bundle = Bundle() + if (arguments?.containsKey(UPDATE_PROFILE) == true) + bundle.putBoolean(UPDATE_PROFILE, true) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } else if (arguments?.containsKey(UPDATE_PROFILE) == true) { + requireActivity().finish() + } else + replaceFragment(requireActivity().supportFragmentManager, + CategoryFragment(), R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelUpload.uploadFile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialogImage.setLoading(false) + + hitApi(it.data?.image_name ?: "") + } + Status.ERROR -> { + progressDialogImage.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialogImage.setLoading(true) + + } + } + }) + + viewModel.updateProfile.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + requireActivity().setResult(Activity.RESULT_OK) + + if (appFeatures.needInsurance && (appClientDetails.insurance == true + || appClientDetails.clientFeaturesKeys.isAddress == true)) { + val fragment = InsuranceFragment() + val bundle = Bundle() + if (arguments?.containsKey(UPDATE_PROFILE) == true) + bundle.putBoolean(UPDATE_PROFILE, true) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } else if (arguments?.containsKey(UPDATE_PROFILE) == true) { + requireActivity().finish() + } else + replaceFragment(requireActivity().supportFragmentManager, + CategoryFragment(), R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModelVersion.countryCity.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + when (it.data?.type) { + CountryListType.COUNTRY -> { + itemsCountry.clear() + + val countryCity = CountryCity() + countryCity.name = getString(R.string.select_country) + itemsCountry.add(countryCity) + + itemsCountry.addAll(it.data.country ?: emptyList()) + spinnerCountryAdapter?.notifyDataSetChanged() + + } + } + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + + viewModelVersion.preferences.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + prefrences = ArrayList() + prefrences?.addAll(it.data?.preferences ?: emptyList()) + + prefrences?.forEach { + when (it.preference_name) { + PreferencesType.GENDER -> { + itemsGender.clear() + + var countryCity = CountryCity() + countryCity.name = getString(R.string.select_gender) + itemsGender.add(countryCity) + + it.options?.forEach { + countryCity = CountryCity() + countryCity.id = it.id + countryCity.name = it.option_name + + itemsGender.add(countryCity) + } + + spinnerGenderAdapter?.notifyDataSetChanged() + + } + PreferencesType.SIGNUP_AS -> { + itemsSignUpAs.clear() + + var countryCity = CountryCity() + countryCity.name = getString(R.string.sign_up_as) + itemsSignUpAs.add(countryCity) + + it.options?.forEach { + countryCity = CountryCity() + countryCity.id = it.id + countryCity.name = it.option_name + + itemsSignUpAs.add(countryCity) + } + + spinnerSignUpAsAdapter?.notifyDataSetChanged() + + } + PreferencesType.LANGUAGES -> { + itemsLanguage.clear() + + var item: Insurance + it.options?.forEach { + item = Insurance() + item.id = it.id + item.name = it.option_name + + itemsLanguage.add(item) + } + + itemsLanguage.forEachIndexed { indexInsurance, insurance -> + userData?.master_preferences?.forEach { + if (it.preference_name == PreferencesType.LANGUAGES) { + it.options?.forEachIndexed { index, filterOption -> + if (filterOption.isSelected && insurance.id == filterOption.id) + itemsLanguage[indexInsurance].isSelected = true + } + } + } + } + setLanguageNames() + val adapter = InsuranceAdapter(this, itemsLanguage) + binding.rvLanguages.adapter = adapter + + } + } + } + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + fun setLanguageNames() { + var name = "" + itemsLanguage.forEach { + if (it.isSelected) + name += it.name + ", " + } + binding.etLanguages.setText(name.removeSuffix(", ")) + } + + + override fun onDateSelected(date: String) { + if (selectedDob) { + /* val age = getAgeSelected(date) + if (age < 16) { + binding.etDob.showSnackBar(getString(R.string.age_atleast_16)) + return + }*/ + + binding.etDob.setText(date) + } else + binding.etYears.setText(date) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (resultCode == Activity.RESULT_OK) { + + if (requestCode == AppRequestCode.IMAGE_PICKER) { + /* val docPaths = ArrayList() + docPaths.addAll(data?.getParcelableArrayListExtra(FilePickerConst.KEY_SELECTED_MEDIA) + ?: emptyList()) + + fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(), docPaths[0]))) + Glide.with(requireContext()).load(fileToUpload).into(binding.ivPic)*/ + + }else if (requestCode == AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) { + val place = Autocomplete.getPlaceFromIntent(data!!) + binding.tvLocation.setText(getCity(place,requireContext())) + + saveAddress.locationName = binding.tvLocation.text.toString() + saveAddress.long = place.latLng?.longitude + saveAddress.lat = place.latLng?.latitude + + } + } + } + + override fun getPdf(uri: String?) { + + } + override fun getImage(uri: String?, data: Uri) { + val selectedImageUri: Uri? = data + selectedImageUri?.let { it2 -> + val file = uriToFile(requireContext(), it2) + file?.let { originalFile -> + val compressedFile = compressImage(requireContext(), originalFile) + compressedFile?.let { + fileToUpload = it + Glide.with(requireContext()) + .load(it) + .into(binding.ivPic) + } ?: run { + Log.e("ImageError", "Unable to compress image.") + } + } ?: run { + Log.e("ImageError", "Unable to convert Uri to File.") + } + } + } + + fun uriToFile(context: Context, uri: Uri): File? { + return try { + val inputStream = context.contentResolver.openInputStream(uri) ?: return null + val tempFile = File.createTempFile("temp_image", ".jpg", context.cacheDir) + tempFile.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + tempFile + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + fun compressImage(context: Context, originalFile: File): File? { + return try { + // Decode the image file + val options = BitmapFactory.Options().apply { + inJustDecodeBounds = true + } + BitmapFactory.decodeFile(originalFile.absolutePath, options) + + // Calculate inSampleSize + options.inSampleSize = calculateInSampleSize(options, 800, 800) // target dimensions + options.inJustDecodeBounds = false + + // Create scaled Bitmap + val bitmap = BitmapFactory.decodeFile(originalFile.absolutePath, options) + + // Check and handle image orientation + val rotatedBitmap = handleImageOrientation(originalFile, bitmap) + + // Save compressed image to a temporary file + val compressedFile = File.createTempFile("compressed_image", ".jpg", context.cacheDir) + compressedFile.outputStream().use { outputStream -> + rotatedBitmap?.compress(Bitmap.CompressFormat.JPEG, 40, outputStream) + } + compressedFile + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + fun handleImageOrientation(file: File, bitmap: Bitmap?): Bitmap? { + return try { + val exif = androidx.exifinterface.media.ExifInterface(file.absolutePath) + val orientation = exif.getAttributeInt( + androidx.exifinterface.media.ExifInterface.TAG_ORIENTATION, + androidx.exifinterface.media.ExifInterface.ORIENTATION_UNDEFINED + ) + + val matrix = Matrix() + when (orientation) { + androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_90 -> matrix.postRotate(90f) + androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_180 -> matrix.postRotate(180f) + androidx.exifinterface.media.ExifInterface.ORIENTATION_ROTATE_270 -> matrix.postRotate(270f) + } + + // Create a new bitmap with the correct orientation + Bitmap.createBitmap(bitmap!!, 0, 0, bitmap.width, bitmap.height, matrix, true) + } catch (e: Exception) { + e.printStackTrace() + bitmap + } + } + /*override fun getImage(uri: String?, data: Uri) { + + val selectedImageUri: Uri? = data + selectedImageUri?.let { + val file: File? = uriToFile(requireContext(), it) + file?.let { + val docImage = DocImage() + docImage.type = DocType.IMAGE + docImage.imageFile = it + +// fileToUpload = compressImage(requireActivity(), File(ContentUriUtils.getFilePath(requireContext(),data))) +// Glide.with(requireContext()).load(fileToUpload).into(binding.ivPic) + + fileToUpload = uri?.let { it1 -> File(it1) } + Glide.with(requireContext()).load(fileToUpload).into(binding.ivPic) + } + } + } + + + fun uriToFile(context: Context, uri: Uri): File? { + val path = getRealPathFromUri(context, uri) + return path?.let { File(it) } + } + + private fun getRealPathFromUri(context: Context, uri: Uri): String? { + var realPath: String? = null + // Depending on the URI scheme, use different query methods + if (uri.scheme == "content") { + // MediaStore (and general content provider) scheme + context.contentResolver.query(uri, null, null, null, null)?.use { cursor -> + if (cursor.moveToFirst()) { + val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + realPath = cursor.getString(columnIndex) + } + } + } else if (uri.scheme == "file") { + // File scheme + realPath = uri.path + } + return realPath + }*/ + + override fun getVideo(uri: String?, i: Int) { + + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults) + onRequestPermissionsResult(requestCode, grantResults) + } + + @NeedsPermission(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun getStorage() { + selectImages(this, requireActivity()) + } + + @OnShowRationale(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showLocationRationale(request: PermissionRequest) { + PermissionUtils.showRationalDialog(requireContext(), R.string.media_permission, request) + } + + @OnNeverAskAgain(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun onNeverAskAgainRationale() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } + + @OnPermissionDenied(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE) + fun showDeniedForStorage() { + PermissionUtils.showAppSettingsDialog( + requireContext(), R.string.media_permission + ) + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/subcategory/SubCategoryAdapter.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/subcategory/SubCategoryAdapter.kt new file mode 100644 index 0000000..c7b7fec --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/subcategory/SubCategoryAdapter.kt @@ -0,0 +1,64 @@ +package com.consultantvendor.ui.loginSignUp.subcategory + +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Categories +import com.consultantvendor.data.network.LoadingStatus.ITEM +import com.consultantvendor.data.network.LoadingStatus.LOADING +import com.consultantvendor.databinding.ItemPagingLoaderBinding +import com.consultantvendor.databinding.RvItemSubcategoryBinding +import com.consultantvendor.utils.loadImage + + +class SubCategoryAdapter(private val fragment: SubCategoryFragment, private val items: ArrayList) : + RecyclerView.Adapter() { + + private var allItemsLoaded = true + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder.itemViewType != LOADING) + (holder as ViewHolder).bind(items[position]) + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return if (viewType == ITEM) { + ViewHolder(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.rv_item_subcategory, parent, false)) + } else { + ViewHolderLoader(DataBindingUtil.inflate(LayoutInflater.from(parent.context), + R.layout.item_paging_loader, parent, false)) + } + } + + override fun getItemCount(): Int = if (allItemsLoaded) items.size else items.size + 1 + + override fun getItemViewType(position: Int) = if (position >= items.size) LOADING else ITEM + + inner class ViewHolder(val binding: RvItemSubcategoryBinding) : + RecyclerView.ViewHolder(binding.root) { + + init { + binding.clCategory.setOnClickListener { + fragment.clickItem(items[bindingAdapterPosition]) + } + } + + fun bind(item: Categories) = with(binding) { + tvName.text = item.name + + loadImage("tag",binding.ivCategory, item.image, R.drawable.ic_img_empty_state) + + } + } + + inner class ViewHolderLoader(val binding: ItemPagingLoaderBinding) : + RecyclerView.ViewHolder(binding.root) + + fun setAllItemsLoaded(allLoaded: Boolean) { + allItemsLoaded = allLoaded + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/subcategory/SubCategoryFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/subcategory/SubCategoryFragment.kt new file mode 100644 index 0000000..9a36952 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/subcategory/SubCategoryFragment.kt @@ -0,0 +1,190 @@ +package com.consultantvendor.ui.loginSignUp.subcategory + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Categories +import com.consultantvendor.data.network.ApiKeys.AFTER +import com.consultantvendor.data.network.ApiKeys.PER_PAGE +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PER_PAGE_LOAD +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.databinding.FragmentCategoryBinding +import com.consultantvendor.ui.drawermenu.classes.ClassesViewModel +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.document.DocumentsFragment +import com.consultantvendor.ui.loginSignUp.prefrence.PrefrenceFragment +import com.consultantvendor.ui.loginSignUp.service.ServiceFragment +import com.consultantvendor.utils.* +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class SubCategoryFragment : DaggerFragment() { + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: FragmentCategoryBinding + + private var rootView: View? = null + + private lateinit var viewModel: ClassesViewModel + + private lateinit var viewModelLogin: LoginViewModel + + private var items = ArrayList() + + private lateinit var adapter: SubCategoryAdapter + + private var isLastPage = false + + private var isFirstPage = true + + private var isLoadingMoreItems = false + + private var categoryData: Categories? = null + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_category, container, false) + rootView = binding.root + + initialise() + setAdapter() + listeners() + bindObservers() + hitApi(true) + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[ClassesViewModel::class.java] + + binding.rvListing.layoutManager = LinearLayoutManager(requireContext()) + categoryData = arguments?.getSerializable(CATEGORY_PARENT_ID) as Categories + + binding.tvTitle.text = getString(R.string.select_sub_category) + } + + private fun setAdapter() { + adapter = SubCategoryAdapter(this, items) + binding.rvListing.adapter = adapter + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.rvListing.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + + val layoutManager = binding.rvListing.layoutManager as LinearLayoutManager + val totalItemCount = layoutManager.itemCount - 1 + val lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition() + + if (!isLoadingMoreItems && !isLastPage && lastVisibleItemPosition >= totalItemCount) { + isLoadingMoreItems = true + hitApi(false) + } + } + }) + } + + private fun hitApi(firstHit: Boolean) { + if (firstHit) { + isFirstPage = true + isLastPage = false + } + + val hashMap = HashMap() + if (isConnectedToInternet(requireContext(), true)) { + if (!isFirstPage && items.isNotEmpty()) + hashMap[AFTER] = items[items.size - 1].id ?: "" + + hashMap[PER_PAGE] = PER_PAGE_LOAD.toString() + hashMap["parent_id"] = categoryData?.id ?: "" + + viewModel.categories(hashMap) + } + } + + private fun bindObservers() { + viewModel.categories.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + binding.clLoader.gone() + isLoadingMoreItems = false + + val tempList = it.data?.classes_category ?: emptyList() + if (isFirstPage) { + isFirstPage = false + items.clear() + } + + items.addAll(tempList) + adapter.notifyDataSetChanged() + + isLastPage = tempList.size < PER_PAGE_LOAD + adapter.setAllItemsLoaded(isLastPage) + + binding.tvNoData.hideShowView(items.isEmpty()) + } + Status.ERROR -> { + isLoadingMoreItems = false + adapter.setAllItemsLoaded(true) + binding.clLoader.gone() + + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + binding.clLoader.visible() + } + } + }) + } + + + fun clickItem(item: Categories?) { + val fragment = when { + item?.is_subcategory == true -> { + SubCategoryFragment() + } + item?.is_additionals == true -> { + DocumentsFragment() + } + item?.is_filters == true -> { + PrefrenceFragment() + } + else -> { + ServiceFragment() + } + } + + val bundle = Bundle() + bundle.putSerializable(CATEGORY_PARENT_ID, item) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + companion object { + const val CATEGORY_PARENT_ID = "CATEGORY_PARENT_ID" + const val SERVICE_ID = "SERVICE_ID" + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/verifyotp/VerifyOTPFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/verifyotp/VerifyOTPFragment.kt new file mode 100644 index 0000000..f44aaf5 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/verifyotp/VerifyOTPFragment.kt @@ -0,0 +1,299 @@ +package com.consultantvendor.ui.loginSignUp.verifyotp + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.appFeatures +import com.consultantvendor.data.network.ApiKeys +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.ProviderType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentVerifyOtpBinding +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.category.CategoryFragment +import com.consultantvendor.ui.loginSignUp.insurance.InsuranceFragment +import com.consultantvendor.ui.loginSignUp.signup.SignUpFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import dagger.android.support.DaggerFragment +import javax.inject.Inject + +class VerifyOTPFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + + private lateinit var binding: FragmentVerifyOtpBinding + + private var rootView: View? = null + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + private var phoneNumber = "" + + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = + DataBindingUtil.inflate(inflater, R.layout.fragment_verify_otp, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + } + return rootView + } + + private fun initialise() { + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + phoneNumber = when { + arguments?.containsKey(EXTRA_EMAIL) == true -> { + arguments?.getString(EXTRA_EMAIL) ?: "" + } + arguments?.containsKey(COUNTRY_CODE) == true -> { + arguments?.getString(COUNTRY_CODE).toString() + arguments?.getString(PHONE_NUMBER).toString() + } + else -> "" + } + binding.tvMsg.text = getString(R.string.we_sent_you_a_code, phoneNumber) + } + + private fun listeners() { + binding.toolbar.setNavigationOnClickListener { + requireActivity().supportFragmentManager.popBackStack() + } + + binding.ivNext.setOnClickListener { + when { + binding.pvOtp.text.toString().length < 4 -> { + binding.pvOtp.showSnackBar(getString(R.string.enter_otp)) + } + binding.pvOtp.text.toString().length == 4 -> { + if (isConnectedToInternet(requireContext(), true)) { + + val hashMap = HashMap() + hashMap["country_code"] = arguments?.getString(COUNTRY_CODE).toString() + + when { + arguments?.containsKey(EXTRA_EMAIL) == true -> { + hashMap["email"] = arguments?.getString(EXTRA_EMAIL).toString() + hashMap["otp"] = binding.pvOtp.text.toString() + viewModel.emailVerify(hashMap) + } + arguments?.containsKey(UPDATE_NUMBER) == true -> { + hashMap["phone"] = arguments?.getString(PHONE_NUMBER).toString() + hashMap["otp"] = binding.pvOtp.text.toString() + viewModel.updateNumber(hashMap) + } + else -> { + hashMap["provider_id"] = arguments?.getString(PHONE_NUMBER).toString() + hashMap[ApiKeys.PROVIDER_TYPE] = ProviderType.phone + hashMap[ApiKeys.PROVIDER_VERIFICATION] = binding.pvOtp.text.toString() + hashMap[ApiKeys.USER_TYPE] = APP_TYPE + + viewModel.login(hashMap) + } + } + } + } + } + } + + binding.tvResentOTP.setOnClickListener { + val hashMap = HashMap() + if (arguments?.containsKey(EXTRA_EMAIL) == true) { + hashMap["email"] = arguments?.getString(EXTRA_EMAIL).toString() + viewModel.sendEmailOtp(hashMap) + } else { + hashMap["country_code"] = arguments?.getString(COUNTRY_CODE).toString() + hashMap["phone"] = arguments?.getString(PHONE_NUMBER).toString() + + viewModel.sendSms(hashMap) + } + } + } + + private fun bindObservers() { + viewModel.emailVerify.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + viewModel.register(arguments?.getSerializable(EXTRA_EMAIL_DATA) as HashMap) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.sendEmailOtp.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireContext().longToast(getString(R.string.code_sent_to, phoneNumber)) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.register.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + requireActivity().supportFragmentManager.popBackStack() + + if (appClientDetails.insurance == true || appClientDetails.clientFeaturesKeys.isAddress == true) { + replaceFragment(requireActivity().supportFragmentManager, + InsuranceFragment(), R.id.container) + } else + replaceFragment(requireActivity().supportFragmentManager, + CategoryFragment(), R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + + viewModel.login.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + if (userRepository.isUserLoggedIn()) { + startActivity(Intent(requireActivity(), HomeActivity::class.java)) + requireActivity().finish() + } else { + val fragment = SignUpFragment() + val bundle = Bundle() + bundle.putBoolean(UPDATE_NUMBER, true) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.sendSMS.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + requireContext().longToast(getString(R.string.code_sent_to, phoneNumber)) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + + viewModel.updateNumber.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + if (userRepository.isUserLoggedIn()) { + + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } else if (appFeatures.needInsurance && (appClientDetails.insurance == true || + appClientDetails.clientFeaturesKeys.isAddress == true)) { + val fragment = InsuranceFragment() + val bundle = Bundle() + if (arguments?.containsKey(UPDATE_PROFILE) == true) + bundle.putBoolean(UPDATE_PROFILE, true) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } else + replaceFragment(requireActivity().supportFragmentManager, + CategoryFragment(), R.id.container) + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + companion object { + const val EXTRA_EMAIL = "EXTRA_EMAIL" + const val EXTRA_EMAIL_DATA = "EXTRA_EMAIL_DATA" + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/welcome/BannerFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/welcome/BannerFragment.kt new file mode 100644 index 0000000..394645a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/welcome/BannerFragment.kt @@ -0,0 +1,34 @@ +package com.consultantvendor.ui.loginSignUp.welcome + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import com.consultantvendor.R +import com.consultantvendor.databinding.FragmentBannerBinding +import com.consultantvendor.utils.getCurrencySymbol +import dagger.android.support.DaggerFragment + + +class BannerFragment : DaggerFragment() { + + private lateinit var binding: FragmentBannerBinding + + private var rootView: View? = null + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_banner, container, false) + rootView = binding.root + + binding.tvTitleDesc.text = getString(R.string.at_20, getCurrencySymbol()) + + } + return rootView + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/loginSignUp/welcome/WelcomeFragment.kt b/app/src/main/java/com/consultantvendor/ui/loginSignUp/welcome/WelcomeFragment.kt new file mode 100644 index 0000000..d0d88b7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/loginSignUp/welcome/WelcomeFragment.kt @@ -0,0 +1,254 @@ +package com.consultantvendor.ui.loginSignUp.welcome + +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.text.SpannableString +import android.text.method.LinkMovementMethod +import android.text.style.ForegroundColorSpan +import android.util.Log +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.network.ApiKeys +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.ProviderType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentWelcomeBinding +import com.consultantvendor.ui.adapter.CommonFragmentPagerAdapter +import com.consultantvendor.ui.dashboard.HomeActivity +import com.consultantvendor.ui.loginSignUp.LoginViewModel +import com.consultantvendor.ui.loginSignUp.login.LoginFragment +import com.consultantvendor.ui.loginSignUp.signup.SignUpFragment +import com.consultantvendor.utils.* +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInClient +import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import com.google.android.gms.common.api.ApiException +import com.snapchat.kit.sdk.SnapKit +import com.snapchat.kit.sdk.SnapLogin +import com.snapchat.kit.sdk.core.controller.LoginStateController +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class WelcomeFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentWelcomeBinding + + private var rootView: View? = null + + + lateinit var mGoogleSignInClient: GoogleSignInClient + + lateinit var gso: GoogleSignInOptions + + private val RC_SIGN_IN = 111 + + private lateinit var progressDialog: ProgressDialog + + private lateinit var viewModel: LoginViewModel + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_welcome, container, false) + rootView = binding.root + + initialise() + listeners() + bindObservers() + setBanners() + } + return rootView + } + + private fun initialise() { + binding.tvTitle.text = formatString() + + //initial google sign in + gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestIdToken(getString(R.string.server_client_id)) + .requestEmail() + .build() + mGoogleSignInClient = GoogleSignIn.getClient(requireActivity(), gso) + + viewModel = ViewModelProvider(this, viewModelFactory)[LoginViewModel::class.java] + progressDialog = ProgressDialog(requireActivity()) + + if (BuildConfig.FLAVOR == "taradoc"){ + binding.viewPager.invisible() + binding.pageIndicatorView.invisible() + binding.ivBanner.visible() +// binding.tvTitle.text= getString(R.string.join_community) + }else{ + + } + + binding.tvTerms.hideKeyboard() + binding.tvTerms.movementMethod = LinkMovementMethod.getInstance() + binding.tvTerms.setText(setAcceptTerms(requireActivity()), TextView.BufferType.SPANNABLE) + } + + private fun formatString(): SpannableString { + val appName = if (BuildConfig.FLAVOR == "homeDoctor") "" + else getString(R.string.app_name) + + val createAccount = getString(R.string.create_a_account, appName) + val stringFinal = SpannableString.valueOf(createAccount) + stringFinal.setSpan(ForegroundColorSpan(ContextCompat.getColor(requireContext(), R.color.colorPrimary)), + createAccount.indexOf(appName), + (createAccount.indexOf(appName) + appName.length), 0) + + return stringFinal + } + + private fun setBanners() { + val adapter = CommonFragmentPagerAdapter(requireActivity().supportFragmentManager) + adapter.addTab("", BannerFragment()) + binding.viewPager.adapter = adapter + + binding.pageIndicatorView.setViewPager(binding.viewPager) + binding.pageIndicatorView.hideShowView(adapter.fragments.count() > 1) + } + + private fun listeners() { + binding.tvMobile.setOnClickListener { + val fragment = LoginFragment() + val bundle = Bundle() + bundle.putBoolean(EXTRA_SIGNUP, true) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + binding.tvLogin.setOnClickListener { + replaceFragment(requireActivity().supportFragmentManager, + LoginFragment(), R.id.container) + } + + binding.tvEmail.setOnClickListener { + replaceFragment(requireActivity().supportFragmentManager, + SignUpFragment(), R.id.container) + } + + binding.tvFacebook.setOnClickListener { + } + + binding.tvGoogle.setOnClickListener { + loginGoogle() + } + } + + private fun loginGoogle() { + mGoogleSignInClient.signOut() + mGoogleSignInClient.revokeAccess() + val signInIntent = mGoogleSignInClient.signInIntent + startActivityForResult(signInIntent, RC_SIGN_IN) + } + + private fun snapKitLogin(){ + SnapLogin.getAuthTokenManager(requireContext()).startTokenGrant(); + + SnapLogin.getLoginStateController(getContext()).addOnLoginStateChangedListener(object : LoginStateController.OnLoginStateChangedListener{ + override fun onLoginSucceeded() { + Log.d("SnapKit Login", "Successful") + } + + override fun onLoginFailed() { + Log.e("SnapKit Login", "Failed") +// TODO("Not yet implemented") + } + + override fun onLogout() { + Log.d("SnapKit Login", "Logout") +// TODO("Not yet implemented") + } + }); + } + + private fun bindObservers() { + viewModel.login.observe(requireActivity(), Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + progressDialog.setLoading(false) + + prefsManager.save(USER_DATA, it.data) + + if (userRepository.isUserLoggedIn()) { + startActivity(Intent(requireActivity(), HomeActivity::class.java)) + requireActivity().finish() + } else { + + val fragment = SignUpFragment() + val bundle = Bundle() + bundle.putBoolean(UPDATE_NUMBER, true) + bundle.putBoolean(EXTRA_SOCIAL, true) + fragment.arguments = bundle + + replaceFragment(requireActivity().supportFragmentManager, + fragment, R.id.container) + } + + } + Status.ERROR -> { + progressDialog.setLoading(false) + ApisRespHandler.handleError(it.error, requireActivity(), prefsManager) + } + Status.LOADING -> { + progressDialog.setLoading(true) + } + } + }) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + + if (requestCode == RC_SIGN_IN) { + + val task = GoogleSignIn.getSignedInAccountFromIntent(data) + try { + val account = task.getResult(ApiException::class.java) + + if (isConnectedToInternet(requireActivity(), true)) { + + val hashMap = HashMap() + hashMap[ApiKeys.PROVIDER_TYPE] = ProviderType.google + hashMap[ApiKeys.PROVIDER_VERIFICATION] = account?.idToken ?: "" + hashMap[ApiKeys.USER_TYPE] = APP_TYPE + + viewModel.login(hashMap) + } + + } catch (e: ApiException) { + Log.e("Google_FAILD", "ERROR", e) + } + } + } + + companion object { + const val EXTRA_SIGNUP = "EXTRA_SIGNUP" + const val EXTRA_SOCIAL = "EXTRA_SOCIAL" + } +} + diff --git a/app/src/main/java/com/consultantvendor/ui/walkthrough/WalkThroughDetailFragment.kt b/app/src/main/java/com/consultantvendor/ui/walkthrough/WalkThroughDetailFragment.kt new file mode 100644 index 0000000..f5fd07e --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/walkthrough/WalkThroughDetailFragment.kt @@ -0,0 +1,42 @@ +package com.consultantvendor.ui.walkthrough + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Page +import com.consultantvendor.databinding.FragmentWalkthroughDetailBinding +import com.consultantvendor.utils.POSITION +import dagger.android.support.DaggerFragment + + +class WalkThroughDetailFragment : DaggerFragment() { + + private lateinit var binding: FragmentWalkthroughDetailBinding + + private var rootView: View? = null + + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle?): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_walkthrough_detail, container, false) + rootView = binding.root + + initialise() + } + return rootView + } + + private fun initialise() { + val data = arguments?.getSerializable(POSITION) as Page + + binding.ivImage.setImageResource(data.icon ?: R.drawable.ic_1) + binding.tvTitle.text = data.title + binding.tvDesc.text = data.desc + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/walkthrough/WalkThroughFragment.kt b/app/src/main/java/com/consultantvendor/ui/walkthrough/WalkThroughFragment.kt new file mode 100644 index 0000000..75b99db --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/walkthrough/WalkThroughFragment.kt @@ -0,0 +1,128 @@ +package com.consultantvendor.ui.walkthrough + +import android.app.Activity +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import androidx.viewpager.widget.ViewPager +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.data.models.responses.Page +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.FragmentWalkthroughBinding +import com.consultantvendor.ui.adapter.CommonFragmentPagerAdapter +import com.consultantvendor.utils.POSITION +import com.consultantvendor.utils.PrefsManager +import com.consultantvendor.utils.hideShowView +import dagger.android.support.DaggerFragment +import javax.inject.Inject + + +class WalkThroughFragment : DaggerFragment() { + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var userRepository: UserRepository + + private lateinit var binding: FragmentWalkthroughBinding + + private var rootView: View? = null + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + if (rootView == null) { + binding = DataBindingUtil.inflate(inflater, R.layout.fragment_walkthrough, container, false) + rootView = binding.root + + initialise() + listeners() + setBanners() + } + return rootView + } + + private fun initialise() { + requireActivity().setResult(Activity.RESULT_OK) + } + + private fun setBanners() { + val adapter = CommonFragmentPagerAdapter(requireActivity().supportFragmentManager) + + val items = ArrayList() + + when (BuildConfig.FLAVOR) { + "consult", "edu", "marketplace", "healthcare" -> { + items.add(Page(icon = R.drawable.ic_1, title = getString(R.string.walkthrough_1), desc = getString(R.string.walk_through_desc_1))) + items.add(Page(icon = R.drawable.ic_2, title = getString(R.string.walkthrough_2), desc = getString(R.string.walk_through_desc_2))) + items.add(Page(icon = R.drawable.ic_3, title = getString(R.string.walkthrough_3), desc = getString(R.string.walk_through_desc_3))) + items.add(Page(icon = R.drawable.ic_4, title = getString(R.string.walkthrough_4), desc = getString(R.string.walk_through_desc_4))) + } + "heal" -> { + items.add(Page(icon = R.drawable.ic_6, title = getString(R.string.walkthrough_6), desc = getString(R.string.walk_through_desc_6))) + items.add(Page(icon = R.drawable.ic_2, title = getString(R.string.walkthrough_2), desc = getString(R.string.walk_through_desc_2))) + items.add(Page(icon = R.drawable.ic_1, title = getString(R.string.walkthrough_1), desc = getString(R.string.walk_through_desc_1))) + items.add(Page(icon = R.drawable.ic_4, title = getString(R.string.walkthrough_4), desc = getString(R.string.walk_through_desc_4))) + items.add(Page(icon = R.drawable.ic_5, title = getString(R.string.walkthrough_5), desc = getString(R.string.walk_through_desc_5))) + } + } + + items.forEach { + val fragment = WalkThroughDetailFragment() + val bundle = Bundle() + bundle.putSerializable(POSITION, it) + fragment.arguments = bundle + adapter.addTab("", fragment) + } + + binding.viewPager.adapter = adapter + + binding.pageIndicatorView.setViewPager(binding.viewPager) + } + + private fun listeners() { + binding.viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { + + override fun onPageScrollStateChanged(state: Int) { + } + + override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + } + + override fun onPageSelected(position: Int) { + val show = position == binding.viewPager.adapter?.count?.minus(1) + + binding.tvSkip.hideShowView(!show) + binding.tvGetStarted.hideShowView(show) + } + }) + + binding.tvGetStarted.setOnClickListener { + doneWalkThrough() + } + + binding.tvSkip.setOnClickListener { + doneWalkThrough() + } + } + + private fun doneWalkThrough() { + prefsManager.save(WALK_THROUGH_SCREEN, true) + requireActivity().setResult(Activity.RESULT_OK) + requireActivity().finish() + } + + companion object { + const val WALK_THROUGH_SCREEN = "WALK_THROUGH_SCREEN" + } +} diff --git a/app/src/main/java/com/consultantvendor/ui/webview/WebViewActivity.kt b/app/src/main/java/com/consultantvendor/ui/webview/WebViewActivity.kt new file mode 100644 index 0000000..6db4732 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/ui/webview/WebViewActivity.kt @@ -0,0 +1,223 @@ +package com.consultantvendor.ui.webview + +import android.annotation.SuppressLint +import android.app.Activity +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Color +import android.os.Bundle +import android.os.Handler +import android.webkit.* +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProvider +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.network.ApisRespHandler +import com.consultantvendor.data.network.PushType +import com.consultantvendor.data.network.responseUtil.Status +import com.consultantvendor.data.repos.UserRepository +import com.consultantvendor.databinding.ActivityWebViewBinding +import com.consultantvendor.ui.dashboard.wallet.WalletViewModel +import com.consultantvendor.utils.* +import dagger.android.support.DaggerAppCompatActivity +import javax.inject.Inject + + +class WebViewActivity : DaggerAppCompatActivity() { + + @Inject + lateinit var userRepository: UserRepository + + @Inject + lateinit var prefsManager: PrefsManager + + @Inject + lateinit var viewModelFactory: ViewModelProvider.Factory + + private lateinit var binding: ActivityWebViewBinding + + private lateinit var viewModel: WalletViewModel + + private var isReceiverRegistered = false + + private var transactionId = "" + + private var loadUrl = "" + + private val mHandler = Handler() + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + binding = DataBindingUtil.setContentView(this, R.layout.activity_web_view) + + initialise() + bindViews() + setListeners() + bindObservers() + } + + private fun initialise() { + LocaleHelper.setLocale(this, userRepository.getUserLanguage(), prefsManager) + viewModel = ViewModelProvider(this, viewModelFactory)[WalletViewModel::class.java] + + binding.tvHeader.text = intent.getStringExtra(LINK_TITLE) + when { + intent.hasExtra(PAYMENT_URL) -> { + transactionId = intent.getStringExtra(EXTRA_REQUEST_ID) ?: "" + loadUrl = intent.getStringExtra(PAYMENT_URL) ?: "" + } + intent.hasExtra(PDF_LINK) -> { + loadUrl = intent.getStringExtra(PDF_LINK) ?: "" + } + else -> { + loadUrl = "${appClientDetails.domain_url}/${intent.getStringExtra(LINK_URL)}" + } + } + } + + @SuppressLint("SetJavaScriptEnabled") + private fun bindViews() { + + if (android.os.Build.VERSION.SDK_INT >= 21) { + CookieManager.getInstance().setAcceptThirdPartyCookies(binding.webView, true) + } else { + CookieManager.getInstance().setAcceptCookie(true) + } + + binding.webView.setBackgroundColor(Color.TRANSPARENT) + binding.webView.settings.setSupportZoom(true) + binding.webView.settings.javaScriptEnabled = true + binding.webView.webViewClient = object : WebViewClient() { + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + + /*If Payment success*/ + if (url?.contains(PaymentFrom.AL_RAJHI_BANK_SUCCESS) == true) { + setResult(RESULT_OK) + finish() +// keepCheckingRequestStatus() + } + } + } + + + //binding.webView.settings.setAppCacheEnabled(true) + binding.webView.settings.javaScriptEnabled = true + binding.webView.settings.domStorageEnabled = true + binding.webView.settings.loadWithOverviewMode = true + binding.webView.settings.useWideViewPort = true + binding.webView.setInitialScale(100) + binding.webView.webChromeClient = WebChromeClient() + + + // Return the app name after finish loading + + /*Ser headers*/ + val map = HashMap() + map["language"] = prefsManager.getString(USER_LANGUAGE, "en") + binding.webView.loadUrl(loadUrl, map) + + binding.webView.webChromeClient = object : WebChromeClient() { + override fun onProgressChanged(view: WebView, progress: Int) { + + // Return the app name after finish loading + if (progress == 100) { + binding.clLoader.gone() + } + } + } + } + + private fun setListeners() { + binding.toolbar.setNavigationOnClickListener { finish() } + + } + + companion object { + const val LINK_TITLE = "LINK_TITLE" + const val LINK_URL = "LINK_URL" + const val PAYMENT_URL = "PAYMENT_URL" + const val PDF_LINK = "PDF_LINK" + } + + override fun onResume() { + super.onResume() + registerReceiver() + } + + override fun onDestroy() { + super.onDestroy() + unregisterReceiver() + } + + private fun registerReceiver() { + if (!isReceiverRegistered) { + val intentFilter = IntentFilter() + intentFilter.addAction(PushType.BALANCE_ADDED) + intentFilter.addAction(PushType.BALANCE_FAILED) + LocalBroadcastManager.getInstance(this).registerReceiver( + callCancelledReceiver, intentFilter + ) + isReceiverRegistered = true + } + } + + private fun unregisterReceiver() { + if (isReceiverRegistered) { + LocalBroadcastManager.getInstance(this).unregisterReceiver(callCancelledReceiver) + isReceiverRegistered = false + } + } + + private val callCancelledReceiver = object : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { + if (intent.getStringExtra(EXTRA_REQUEST_ID) == transactionId) { + if (intent.action == PushType.BALANCE_ADDED) { + longToast(getString(R.string.transaction_success)) + setResult(Activity.RESULT_OK) + finish() + } else if (intent.action == PushType.BALANCE_FAILED) { + longToast(getString(R.string.transaction_failed)) + finish() + } + } + } + } + + private fun bindObservers() { + viewModel.requestCheck.observe(this, Observer { + it ?: return@Observer + when (it.status) { + Status.SUCCESS -> { + if (it.data?.transactionCompleted == true) { + mHandler.removeCallbacksAndMessages(null) + setResult(RESULT_OK) + finish() + } else + keepCheckingRequestStatus() + } + Status.ERROR -> { + ApisRespHandler.handleError(it.error, this, prefsManager) + } + Status.LOADING -> { + } + } + }) + } + + private fun keepCheckingRequestStatus() { + mHandler.removeCallbacksAndMessages(null) + mHandler.postDelayed({ + if (isConnectedToInternet(this, true)) { + val hashMap = HashMap() + hashMap["transaction_id"] = transactionId + hashMap["transaction_type"] = "wallet" + viewModel.requestCheck(hashMap) + } + }, 5000) + } +} diff --git a/app/src/main/java/com/consultantvendor/utils/AlertDialogUtil.kt b/app/src/main/java/com/consultantvendor/utils/AlertDialogUtil.kt new file mode 100644 index 0000000..9603089 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/AlertDialogUtil.kt @@ -0,0 +1,64 @@ +package com.consultantvendor.utils + +import android.content.Context +import android.content.DialogInterface +import androidx.annotation.StringRes +import androidx.appcompat.app.AlertDialog +import androidx.core.content.ContextCompat +import com.consultantvendor.R + + +class AlertDialogUtil { + + fun createOkCancelDialog(context: Context, @StringRes titleResourceId: Int, @StringRes messageResourceId: Int, + @StringRes positiveResourceId: Int, @StringRes negativeResourceId: Int, cancelable: Boolean, + listener: OnOkCancelDialogListener?): AlertDialog { + val alertDialog = AlertDialog.Builder(context) + if (titleResourceId != 0) { + alertDialog.setTitle(titleResourceId) + } + if (titleResourceId != 0) { + alertDialog.setMessage(messageResourceId) + } + alertDialog.setCancelable(cancelable) + alertDialog.setPositiveButton(positiveResourceId + ) { dialog, which -> + listener?.onOkButtonClicked() + dialog.dismiss() + } + if (negativeResourceId != 0) { + alertDialog.setNegativeButton(negativeResourceId) { dialog, which -> + listener?.onCancelButtonClicked() + dialog.dismiss() + } + } + val dialog = alertDialog.create() + dialog.setOnShowListener { dialogInterface -> + dialog.getButton(DialogInterface.BUTTON_POSITIVE).setTextColor(ContextCompat + .getColor(context, R.color.colorPrimary)) + dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setTextColor(ContextCompat + .getColor(context, R.color.colorPrimary)) + } + return dialog + } + + + interface OnOkCancelDialogListener { + fun onOkButtonClicked() + + fun onCancelButtonClicked() + } + + companion object { + + private var mInstance: AlertDialogUtil? = null + + val instance: AlertDialogUtil + get() { + if (null == mInstance) { + mInstance = AlertDialogUtil() + } + return mInstance ?: AlertDialogUtil() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/AppConstant.kt b/app/src/main/java/com/consultantvendor/utils/AppConstant.kt new file mode 100644 index 0000000..bacfcf6 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/AppConstant.kt @@ -0,0 +1,201 @@ +package com.consultantvendor.utils + +/*Links*/ +const val PLAY_STORE = "https://play.google.com/store/apps/details?id=" + +const val FILE_PATH_DIRECTORY = "file://" + +const val ANDROID = "ANDROID" +const val APP_TYPE = "service_provider" + +const val USER_DATA = "user data" +const val APP_DETAILS = "APP_DETAILS" +const val USER_LANGUAGE = "user language" +const val POSITION = "POSITION" +const val COUNTRY_CODE = "COUNTRY_CODE" +const val PHONE_NUMBER = "PHONE_NUMBER" +const val UPDATE_NUMBER = "UPDATE_NUMBER" +const val UPDATE_PROFILE = "UPDATE_PROFILE" +const val UPDATE_AVAILABILITY = "UPDATE_AVAILABILITY" +const val UPDATE_CATEGORY = "UPDATE_CATEGORY" +const val UPDATE_PREFRENCES = "UPDATE_PREFRENCES" + +const val PUSH_DATA = "PUSH_DATA" +const val PAGE_TO_OPEN = "PAGE_TO_OPEN" + +const val LAST_MESSAGE = "last message" +const val USER_ID = "user id" +const val USER_NAME = "user name" +const val OTHER_USER_ID = "other user id" +const val UPDATE_CHAT = "updateChat" +const val EXTRA_REQUEST_ID = "EXTRA_REQUEST_ID" +const val EXTRA_IS_FIRST = "EXTRA_IS_FIRST" +const val EXTRA_CALL_NAME = "extra call name" +const val EXTRA_TAB = "extra tab" + + +object CallType { + const val CALL = "call" + const val CHAT = "chat" + const val FEED = "feed" + const val ALL = "all" +} + +object ClassType { + const val ADDED = "added" + const val STARTED = "started" + const val COMPLETED = "completed" +} + +object ConsultType { + const val AUDIO_CALL = "audio_call" + const val CHAT = "chat" + const val VIDEO_CALL = "video_call" + const val HOME_VISIT = "home_visit" + const val CLINIC_VISIT = "clinic_visit" + const val OTHER = "other" + const val EMERGENCY_CONSULTATION = "Emergency" +} + +object RequestStatus { + const val COMPLETED = "completed" + const val CANCELLED = "cancelled" + const val NEW = "new" +} + +object WalletMoney { + const val DEPOSIT = "deposit" + const val WITHDRAWAL = "withdrawal" + const val ALL = "all" + const val PAYOUTS = "payouts" + const val ADD_MONEY = "add_money" + const val FAILED = "failed" + const val SUCCESS="success" +} + +object CallAction { + const val PENDING = "pending" + const val ACCEPT = "accept" + const val REJECT = "reject" + const val INPROGRESS = "in-progress" + const val COMPLETED = "completed" + const val FAILED = "failed" + const val CANCELED = "canceled" + + const val START = "start" + const val REACHED = "reached" + const val START_SERVICE = "start_service" + const val CANCEL_SERVICE = "cancel_service" + + const val PAID = "paid" +} + +object PriceType { + const val PRICE_RANGE = "price_range" +} + +object AvailabilityType { + const val WEEK_WISE = "weekwise" + const val SPECIFIC_DATE = "specific_date" + const val SPECIFIC_DAY = "specific_day" + const val WEEKDAYS = "weekdays" +} + +object AppRequestCode { + const val AUTOCOMPLETE_REQUEST_CODE: Int = 99 + const val IMAGE_PICKER: Int = 100 + const val ADD_MONEY: Int = 101 + const val PROFILE_UPDATE: Int = 102 + const val APPOINTMENT_UPDATE: Int = 103 + const val ARTICLE_CHANGES = 104 + const val LOCATION_PERMISSION_ID = 105 + const val REQ_CHAT = 106 + const val ASK_FOR_LOCATION: Int = 107 + const val ADD_CLASS = 108 + const val ADD_AVAILABILITY = 109 + const val ADD_CARD: Int = 110 + const val PAYOUT_MONEY: Int = 111 + const val ADD_PRESCRIPTION: Int = 112 + const val WALK_THROUGH_SCREENS: Int = 113 + const val APPOINTMENT_DETAILS: Int = 114 + const val LANGUAGE_SCREENS: Int = 115 + const val DOC_PICKER: Int = 116 + const val SELECT_CONTACT: Int = 117 + const val REQUEST_CONTACT: Int = 119 +} + +object DocType { + const val TEXT = "TEXT" + const val IMAGE = "IMAGE" + const val PDF = "PDF" + const val AUDIO = "AUDIO" + const val MESSAGE_TYPING = "TYPING" +} + +object ImageFolder{ + const val ORIGINAL = "original/" + const val ASSETS = "assets/" + const val UPLOADS = "uploads/" + const val THUMBS = "thumbs/" + const val PDF = "pdf/" + const val AUDIO = "audio/" +} + +object MediaUploadStatus { + const val NOT_UPLOADED = "not_uploaded" + const val UPLOADING = "uploading" + const val CANCELED = "canceled" + const val UPLOADED = "unloaded" + +} + +object DeepLink { + const val USER_PROFILE = "userProfile" + const val INVITE = "Invite" +} + +object PageLink { + const val TERMS_CONDITIONS = "term-conditions" + const val PRIVACY_POLICY = "privacy-policy" +} + +object PaymentFrom { + const val STRIPE = "stripe" + const val RAZOR_PAY = "razor pay" + const val CCA_VENUE = "cca venue" + const val AL_RAJHI_BANK = "al_rajhi_bank" + + /*Success*/ + const val AL_RAJHI_BANK_SUCCESS="https://calladmin.inhomed.com/al_rajhi_bank/webhook" +} + +object CustomFields { + const val ZIP_CODE = "Zip Code" +} + +object ClientFeatures { + const val ADDRESS = "Address Required" +} + +object CountryListType { + const val COUNTRY = "country" + const val STATE = "state" + const val CITY = "city" +} + +object BlogType { + const val BLOG = "blog" + const val ARTICLE = "article" +} + +object PreferencesType { + const val LANGUAGES = "Languages" + const val GENDER = "Gender" + const val SIGNUP_AS = "Signup As" + const val ALL = "All" +} + +object PrescriptionType { + const val MANUAL = "manual" + const val DIGITAL = "digital" +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/AppSocket.kt b/app/src/main/java/com/consultantvendor/utils/AppSocket.kt new file mode 100644 index 0000000..a12e5ed --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/AppSocket.kt @@ -0,0 +1,251 @@ +package com.consultantvendor.utils + +import android.os.Handler +import android.os.Looper +import com.consultantvendor.appClientDetails +import com.consultantvendor.data.models.responses.chat.ChatMessage +import com.consultantvendor.data.repos.UserRepository +import com.google.gson.Gson +import io.socket.client.Ack +import io.socket.client.IO +import io.socket.client.Socket +import io.socket.emitter.Emitter +import org.json.JSONException +import org.json.JSONObject +import timber.log.Timber +import java.net.URISyntaxException +import java.util.* +import javax.inject.Inject +import javax.inject.Singleton + +/** + * Created by Rishi Sharma on 9/8/17. + */ +@Singleton +class AppSocket @Inject internal constructor(private val userRepository: UserRepository, gson: Gson?) { + private var mSocket: Socket? = null + private var manualReconnectTimer = Timer() + private val onMessageReceiverList: MutableList = ArrayList() + private val onConnectionListeners: MutableList = ArrayList() + private val onConnect = Emitter.Listener { args: Array? -> + manualReconnectTimer.cancel() + Timber.e("AppSocket - onConnect called") + notifyConnectionListeners(Socket.EVENT_CONNECT) + } + private val onDisconnect = Emitter.Listener { args: Array? -> + Timber.e("AppSocket - onDisconnect called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_DISCONNECT) + } + private val onError = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onError called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_ERROR) + } + private val onTimeOut = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onTimeOut called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_CONNECT_TIMEOUT) + } + private val onReconnecting = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onReconnecting called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_RECONNECTING) + } + private val onReconnectError = Emitter.Listener { args: Array? -> + Timber.e("AppSocket -onReconnectError called") + restartManualReconnection() + notifyConnectionListeners(Socket.EVENT_RECONNECT_ERROR) + } + + fun init(): Boolean { + onMessageReceiverList.clear() + onConnectionListeners.clear() + return try { + if (mSocket != null) { + mSocket?.off() + mSocket?.close() + } + if (userRepository.isUserLoggedIn()) { + Timber.e("Socket${appClientDetails.socket_url.toString()}${userRepository.getUser()?.id}".trimIndent()) + val options = IO.Options() + options.forceNew = false + options.reconnection = true + options.query = "user_id=" + userRepository.getUser()?.id + "&domain=" + userRepository.getAppSetting().domain + mSocket = IO.socket(appClientDetails.socket_url?:"", options) + connect() + mSocket?.on(Socket.EVENT_CONNECT, onConnect) + mSocket?.on(Socket.EVENT_DISCONNECT, onDisconnect) + mSocket?.on(Socket.EVENT_CONNECT_ERROR, onError) + mSocket?.on(Socket.EVENT_ERROR, onError) + mSocket?.on(Socket.EVENT_CONNECT_TIMEOUT, onTimeOut) + mSocket?.on(Socket.EVENT_RECONNECTING, onReconnecting) + mSocket?.on(Socket.EVENT_RECONNECT_ERROR, onReconnectError) + mSocket?.on(Socket.EVENT_RECONNECT_FAILED, onReconnectError) + true + } else { + false + } + } catch (e: URISyntaxException) { + e.printStackTrace() + false + } + } + + val isConnected: Boolean + get() = (mSocket?.connected()==true) + + private fun restartManualReconnection() { + manualReconnectTimer.cancel() + manualReconnectTimer = Timer() + val MANUAL_RECONNECT_INTERVAL = 10000 + manualReconnectTimer.schedule(object : TimerTask() { + override fun run() { + mSocket?.io()?.reconnection(true) + connect() + Timber.e("AppSocket --> ManualReconnection Timer Task Called") + } + }, MANUAL_RECONNECT_INTERVAL.toLong()) + } + + val socket: Socket? + get() { + if (mSocket?.connected()==false) connect() + return mSocket + } + + fun connect() { + if (mSocket?.connected()==false) mSocket?.connect() + } + + fun disconnect() { + mSocket?.disconnect() + } + + fun emit(event: String?, vararg args: Any?) { + mSocket?.emit(event, *args) + } + + fun on(event: String?, fn: Emitter.Listener?) { + mSocket?.on(event, fn) + } + + fun off() { + mSocket?.off() + } + + fun off(event: String?) { + mSocket?.off(event) + } + + fun off(event: String?, fn: Emitter.Listener?) { + mSocket?.off(event, fn) + } + + fun sendMessage(message: ChatMessage?, msgAck: OnMessageReceiver) { + var jsonObject: JSONObject? = null + try { + jsonObject = JSONObject(Gson().toJson(message)) + } catch (e: JSONException) { + e.printStackTrace() + } + mSocket?.emit(Events.SEND_MESSAGE, jsonObject, Ack { args: Array -> Handler(Looper.getMainLooper()).post { msgAck.onMessageReceive(Gson().fromJson(args[0].toString(), ChatMessage::class.java)) } }) + } + + fun sendMessageDelivery(id: String?, receiverID: String?) { + try { + val jsonObject = JSONObject() + jsonObject.put("messageId", id) + jsonObject.put("receiverId", receiverID) + mSocket?.emit(Events.DELIVERED_MESSAGE, jsonObject) + } catch (e: JSONException) { + e.printStackTrace() + } + } + + fun addConnectionListener(listener: ConnectionListener) { + onConnectionListeners.add(listener) + } + + fun removeConnectionListener(listener: ConnectionListener) { + onConnectionListeners.remove(listener) + } + + fun removeAllConnectionListeners() { + onConnectionListeners.clear() + } + + private fun notifyConnectionListeners(status: String) { + for (listener in onConnectionListeners) { + Handler(Looper.getMainLooper()).post { listener.onConnectionStatusChanged(status) } + } + } + + fun addOnMessageReceiver(receiver: OnMessageReceiver) { + if (onMessageReceiverList.isEmpty()) { + onReceiveMessageEvent() + } + onMessageReceiverList.add(receiver) + } + + fun removeOnMessageReceiver(receiver: OnMessageReceiver) { + onMessageReceiverList.remove(receiver) + if (onMessageReceiverList.isEmpty()) { + mSocket?.off(Events.RECEIVE_MESSAGE) + } + } + + fun removeAllMessageReceivers() { + onMessageReceiverList.clear() + mSocket?.off(Events.RECEIVE_MESSAGE) + } + + private fun onReceiveMessageEvent() { + mSocket?.on(Events.RECEIVE_MESSAGE) { args: Array -> + val chat: ChatMessage + chat = Gson().fromJson(args[0].toString(), ChatMessage::class.java) + notifyMessageReceivers(chat) + } + } + + private fun notifyMessageReceivers(message: ChatMessage) { + for (receiver in onMessageReceiverList) { + Handler(Looper.getMainLooper()).post { receiver.onMessageReceive(message) } + } + } + + interface Events { + companion object { + const val SEND_MESSAGE = "sendMessage" + const val RECEIVE_MESSAGE = "messageFromServer" + const val TYPING = "typing" + const val BROADCAST = "broadcast" + const val ACKNOWLEDGE_MESSAGE = "acknowledgeMessage" + const val READ_MESSAGE = "readMessage" + const val DELIVERED_MESSAGE = "deliveredMessage" + const val SEND_LIVE_LOCATION = "sendlivelocation" + } + } + + interface MessageStatus { + companion object { + const val NOT_SENT = "NOT_SENT" + const val SENDING = "SENDING" + const val SENT = "SENT" + const val DELIVERED = "DELIVERED" + const val SEEN = "SEEN" + } + } + + interface OnMessageReceiver { + fun onMessageReceive(message: ChatMessage?) + } + + interface ConnectionListener { + fun onConnectionStatusChanged(status: String?) + } + + init { + init() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/BasePhotoUplaodFragment.kt b/app/src/main/java/com/consultantvendor/utils/BasePhotoUplaodFragment.kt new file mode 100644 index 0000000..3d760c7 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/BasePhotoUplaodFragment.kt @@ -0,0 +1,794 @@ +package com.consultantvendor.utils + +import android.Manifest +import android.app.AlertDialog +import android.app.Dialog +import android.content.ContentUris +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.Matrix +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.media.ExifInterface +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.provider.OpenableColumns +import android.provider.Settings +import android.util.Log +import android.view.Window +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.Nullable +import androidx.core.app.ActivityCompat +import androidx.core.content.FileProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.target.CustomTarget +import com.consultantvendor.databinding.ItemDialogImageBinding +import com.karumi.dexter.Dexter +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionDeniedResponse +import com.karumi.dexter.listener.PermissionGrantedResponse +import com.karumi.dexter.listener.PermissionRequest +import com.karumi.dexter.listener.single.PermissionListener + +import dagger.android.support.DaggerFragment +import java.io.File +import java.text.SimpleDateFormat +import java.util.* + + +import java.io.* +import java.util.Calendar + + +abstract class BasePhotoUplaodFragment : DaggerFragment() { + + var is_video = false + private val JPEG_FILE_PREFIX = "IMG_" + private val JPEG_FILE_SUFFIX = ".jpg" + + + var mPicturePath: String? = null + var mIsGallery: Boolean? = null + var bitmap: Bitmap? = null + var reqcode = 0 + var triescamera = 0 + var triesgallary = 0 + + private val REQUEST_IMAGE_CAPTURE = 2 + private lateinit var photoFile: File + + + fun showImageDialog(b: Boolean) { + is_video = b + + + val dialog: Dialog = Dialog(requireActivity()) + var view = ItemDialogImageBinding.inflate(layoutInflater) + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + dialog.setContentView(view.root) + + view.tvGallery.setOnClickListener { + mIsGallery = true + if (!is_video) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditongallary() + + } else { + + checkgallry() + + + } + } else { + openVideoGallery() + } + + dialog.dismiss() + } + + view.ivClose.setOnClickListener { dialog.dismiss() } + + view.tvCamera.setOnClickListener { + mIsGallery = false + + if (!is_video) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditioncamera() + + } else { + + checkcamera() + + } + } else { + startCameraIntentVideo(requireActivity()) + } + + + + dialog.dismiss() + } + dialog.show() + } + + open fun startCameraIntentVideo(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_VIDEO_CAPTURE) + takePictureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); + + cameraIntentVideo.launch(takePictureIntent) + } + + open fun openVideoGallery() { + val intent = Intent() + intent.type = "video/*" + intent.action = Intent.ACTION_GET_CONTENT + cameraIntentVideo.launch(intent) + } + + var cameraIntentVideo = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val videoUri = it!!.data?.data + if (it!!.data?.data != null) { + + val mimeType: String = + requireActivity().contentResolver.getType(videoUri!!)!! //Save file to upload on server + val file = saveVideoToAppScopeStorage(requireActivity(), videoUri, mimeType) + getVideo(file.toString(), 2) + } + } + + fun saveVideoToAppScopeStorage(context: Context, videoUri: Uri?, mimeType: String?): File? { + if (videoUri == null || mimeType == null) { + return null + } + + val fileName = "capturedVideo${Calendar.getInstance().time.time}.mp4" + + val inputStream = context.contentResolver.openInputStream(videoUri) + val file = File(context.getExternalFilesDir(Environment.DIRECTORY_DCIM), fileName) + file.deleteOnExit() + file.createNewFile() + val out = FileOutputStream(file) + val bos = BufferedOutputStream(out) + + val buf = ByteArray(1024) + inputStream?.read(buf) + do { + bos.write(buf) + } while (inputStream?.read(buf) !== -1) + + //out.close() + bos.close() + inputStream.close() + + return file + } + + abstract fun getVideo(uri: String?, i: Int) + + private fun checkcamera() { + reqcode = 2 + requestPermissionsFOR(Manifest.permission.CAMERA) + } + + private fun checkgallry() { + reqcode = 1 + + requestPermissionsFOR(Manifest.permission.READ_EXTERNAL_STORAGE) + } + + private fun checkconditioncamera() { + reqcode = 4 + requestPermissionsFOR(Manifest.permission.CAMERA) + + + } + + private fun checkconditongallary() { + reqcode = 3 + requestPermissionsFOR(Manifest.permission.READ_MEDIA_IMAGES) + + } + + + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + + when (requestCode) { + 1 -> { + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkgallry() + } + } + + } + } + + + 2 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkcamera() + } + } + + } + } + + 3 -> { + + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary() + } + } + + } + + } + + 4 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + requireActivity(), + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary() + } + } + } + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == 1) { + if (data != null) { + if (getRealPath(data.data!!, requireActivity()) != null) { + getImage(getRealPath(data.data!!, requireActivity()), data.data!!) + } else { + Glide.with(this) + .asBitmap() + .load(data.data) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .into(object : CustomTarget() { + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} + override fun onResourceReady( + resource: Bitmap, + transition: com.bumptech.glide.request.transition.Transition? + ) { + val file: String = getRealPath( + Uri.fromFile(saveImageToExternalStorage(resource)), + requireActivity() + )!! + getImage( + file, + Uri.fromFile(saveImageToExternalStorage(resource)) + ) + } + }) + } + } + } else if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == -1) { + try{ + val bitmap = BitmapFactory.decodeFile(photoFile.absolutePath) + val bitmapUri = bitmapToUri(requireContext(), bitmap) + + if (bitmapUri != null) { + getImage(bitmapUri.path, bitmapUri) + } + /* val file: String = getRealPath( + Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath, requireActivity())!! + + ) + ), requireActivity() + )!! + getImage( + file, Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath, requireActivity())!! + ) + ) + )*/ + }catch (ex: Exception){ + Toast.makeText(requireContext(),"This functionality is under development", Toast.LENGTH_LONG).show() + } + + + } else if (requestCode == 3 && resultCode == -1) { + val uri: Uri = data?.data!! + val a = getPDFPath(uri); + getPdf(a) + } else { + Log.e("gndnfkfnkn", "onActivityResult: " + data?.data) + } + + + } + + fun bitmapToUri(context: Context, bitmap: Bitmap): Uri? { + val file = File(context.cacheDir, "temp_image.jpg") // Temporary file in cache directory + return try { + val outputStream = FileOutputStream(file) + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) + outputStream.flush() + outputStream.close() + Uri.fromFile(file) // Return the Uri of the saved file + } catch (e: IOException) { + e.printStackTrace() + null + } + } + + abstract fun getPdf(uri: String?) + abstract fun getImage(uri: String?, data: Uri) + fun getPDFPath(uri: Uri?): String? { + var absolutePath = "" + try { + val inputStream = requireActivity()!!.contentResolver.openInputStream( + uri!! + ) + val pdfInBytes = ByteArray(inputStream!!.available()) + inputStream.read(pdfInBytes) + var offset = 0 + var numRead = 0 + while (offset < pdfInBytes.size && inputStream.read( + pdfInBytes, + offset, + pdfInBytes.size - offset + ).also { + numRead = it + } >= 0 + ) { + offset += numRead + } + val returnCursor: Cursor? = + requireActivity().contentResolver.query(uri, null, null, null, null) + val nameIndex = returnCursor?.getColumnIndex(OpenableColumns.DISPLAY_NAME) + returnCursor?.moveToFirst() + var mPath = "" + mPath = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1) { + requireActivity()!!.getExternalFilesDir(Environment.DIRECTORY_DCIM) + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } else { + Environment.getExternalStorageDirectory() + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } + val pdfFile = File(mPath) + val op: OutputStream = FileOutputStream(pdfFile) + op.write(pdfInBytes) + absolutePath = pdfFile.path + } catch (ae: Exception) { + ae.printStackTrace() + } + return absolutePath + } + + fun openGallery() { + val i = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(i, 1) + } + + open fun isNougatDevice(): Boolean { + return Build.VERSION.SDK_INT >= 24 + } + + open fun startCameraIntent(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + try { + if (takePictureIntent.resolveActivity(context.packageManager) != null) { + photoFile = createImageFile() + val photoURI: Uri = FileProvider.getUriForFile( + requireContext(), + "com.consultantvendor", + photoFile + ) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) + startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) + } + } catch (e: Exception) { + e.printStackTrace() + } + + /* val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + var f: File? = null + try { + val LOCAL_STORAGE_BASE_PATH_FOR_MEDIA = context.getExternalFilesDir("") + .toString() + "/" + "consultantvendor" + val LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES: String = + LOCAL_STORAGE_BASE_PATH_FOR_MEDIA + "/User/Images/" + f = setUpImageFile(LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES) + mPicturePath = f!!.absolutePath + if (isNougatDevice()) { + takePictureIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + val contentUri: Uri = FileProvider.getUriForFile( + requireActivity(), "com.consultantvendor", f + ) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri) + } else { + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)) + } + } catch (e: Exception) { + e.printStackTrace() + f = null + mPicturePath = null + } + startActivityForResult(takePictureIntent, 2)*/ + } + + private fun createImageFile(): File { + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) + val storageDir = requireContext().getExternalFilesDir(null) + return File.createTempFile("JPEG_${timestamp}_", ".jpg", storageDir) + } + + private fun showAlert() { + val builder = AlertDialog.Builder(requireContext()) + builder.setTitle("Need Permissions") + builder.setMessage("This app needs permission to use this feature. You can grant them in app settings.") + + builder.setPositiveButton("GOTO SETTINGS") { dialog, which -> + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + val uri = Uri.fromParts("package", activity?.packageName, null) + intent.data = uri + } else { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:" + activity?.packageName) + } + + startActivity(intent) + } + + builder.setNegativeButton("Cancel") { dialog, which -> + dialog.cancel() + } + builder.show() + } + + fun getRealPath(uri: Uri, context: Context): String? { + val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + if ("primary".equals(type, ignoreCase = true)) { + return (Environment.getExternalStorageDirectory() + .toString() + "/" + split[1]) + } else { + val splitIndex = docId.indexOf(':', 1) + val tag = docId.substring(0, splitIndex) + val path = docId.substring(splitIndex + 1) + val nonPrimaryVolume = + getPathToNonPrimaryVolume(context, tag) + if (nonPrimaryVolume != null) { + val result = "$nonPrimaryVolume/$path" + val file = File(result) + if (file.exists() && file.canRead()) { + return result + } + } + } + } else if (isDownloadsDocument(uri)) { + val id = DocumentsContract.getDocumentId(uri) + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(id) + + ) + return getDataColumn(context, contentUri, null, null) + } else if (isMediaDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + var contentUri: Uri? = null + if ("image" == type) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } else if ("video" == type) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } else if ("audio" == type) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + } + val selection = "_id=?" + val selectionArgs = + arrayOf(split[1]) + return getDataColumn(context, contentUri, selection, selectionArgs) + } + } else if ("content".equals(uri.scheme, ignoreCase = true)) { + return getDataColumn(context, uri, null, null) + } else if ("file".equals(uri.scheme, ignoreCase = true)) { + return uri.path + } + return null + } + + private fun isExternalStorageDocument(uri: Uri): Boolean { + return "com.android.externalstorage.documents" == uri.authority + } + + private fun isDownloadsDocument(uri: Uri): Boolean { + return "com.android.providers.downloads.documents" == uri.authority + } + + private fun isMediaDocument(uri: Uri): Boolean { + return "com.android.providers.media.documents" == uri.authority + } + + fun getPathToNonPrimaryVolume(context: Context, tag: String): String? { + val volumes = context.externalCacheDirs + if (volumes != null) { + for (volume in volumes) { + if (volume != null) { + val path = volume.absolutePath + if (path != null) { + val index = path.indexOf(tag) + if (index != -1) { + return path.substring(0, index) + tag + } + } + } + } + } + return null + } + + private fun getDataColumn( + context: Context, uri: Uri?, selection: String?, selectionArgs: + Array? + ): String? { + var cursor: Cursor? = null + val column = "_data" + val projection = arrayOf(column) + try { + cursor = context.contentResolver.query( + uri!!, projection, + selection, selectionArgs, null + ) + if (cursor != null && cursor.moveToFirst()) { + val column_index = cursor.getColumnIndexOrThrow(column) + return cursor.getString(column_index) + } + } finally { + cursor?.close() + } + return null + } + + fun setUpImageFile(imageDirectory: String?): File? { + var imageFile: File? = null + if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) { + val storageDir = File(imageDirectory) + if (null != storageDir) { + if (!storageDir.mkdirs()) { + if (!storageDir.exists()) { + Log.d("CameraSample", "failed to create directory") + return null + } + } + } + imageFile = File.createTempFile( + JPEG_FILE_PREFIX + + System.currentTimeMillis() + "_", + JPEG_FILE_SUFFIX, storageDir + ) + } + return imageFile + } + + fun saveImageToExternalStorage(finalBitmap: Bitmap): File? { + val file: File + val root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + .toString() + val myDir = File("$root/Mojo") + myDir.mkdirs() + val fname = (JPEG_FILE_PREFIX + System.currentTimeMillis() + "_" + JPEG_FILE_SUFFIX) + + file = File(myDir, fname) + if (file.exists()) file.delete() + try { + val out = FileOutputStream(file) + finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) + out.flush() + out.close() + return file + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + return file + } + + fun getFile(imgPath: String?, mContext: Context?): Bitmap? { + val mOrientation: Int + var bMapRotate: Bitmap? = null + try { + if (imgPath != null) { + val exif = ExifInterface(imgPath) + mOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1) + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeFile(imgPath, options) + options.inSampleSize = calculateInSampleSize(options, 400, 400) + options.inJustDecodeBounds = false + bMapRotate = BitmapFactory.decodeFile(imgPath, options) + when (mOrientation) { + 6 -> { + val matrix = Matrix() + matrix.postRotate(90f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 8 -> { + val matrix = Matrix() + matrix.postRotate(270f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 3 -> { + val matrix = Matrix() + matrix.postRotate(180f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + } + } else { + + } + } catch (e: OutOfMemoryError) { + bMapRotate = null + e.printStackTrace() + } catch (e: IOException) { + e.printStackTrace() + } catch (e: java.lang.Exception) { + bMapRotate = null + e.printStackTrace() + } + return bMapRotate + } + + fun calculateInSampleSize( + options: BitmapFactory.Options, + reqWidth: Int, + reqHeight: Int + ): Int { + try { + val height = options.outHeight + val width = options.outWidth + var inSampleSize = 1 + if (height > reqHeight || width > reqWidth) { + val halfHeight = height / 2 + val halfWidth = width / 2 + while (halfHeight / inSampleSize > reqHeight + && halfWidth / inSampleSize > reqWidth + ) { + inSampleSize *= 2 + } + } + return inSampleSize + } catch (e: Exception) { + e.printStackTrace() + } + return 0 + } + + + private fun requestPermissionsFOR(readMediaImages: String) { + Dexter.withContext(requireContext()) + .withPermission(readMediaImages) + .withListener(object : PermissionListener { + override fun onPermissionGranted(response: PermissionGrantedResponse) { + when (reqcode) { + 1 -> { + + openGallery() + } + + 2 -> { + startCameraIntent(requireActivity()) + } + + 3 -> { + + openGallery() + + } + + 4 -> { + startCameraIntent(requireActivity()) + + } + } + } + + override fun onPermissionDenied(response: PermissionDeniedResponse) { + if (response.isPermanentlyDenied) { + showAlert() + } else { + Toast.makeText(requireContext(), "permission denied", Toast.LENGTH_SHORT) + .show() + } + } + + override fun onPermissionRationaleShouldBeShown( + permission: PermissionRequest?, + token: PermissionToken? + ) { + Toast.makeText( + requireContext(), + "permission is needed to use this feature", + Toast.LENGTH_SHORT + ).show() + token?.continuePermissionRequest() + } + }).check() + } +} + + + diff --git a/app/src/main/java/com/consultantvendor/utils/BasePhotoUploadActivity.kt b/app/src/main/java/com/consultantvendor/utils/BasePhotoUploadActivity.kt new file mode 100644 index 0000000..e21792f --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/BasePhotoUploadActivity.kt @@ -0,0 +1,800 @@ +package com.consultantvendor.utils + +import android.Manifest +import android.app.AlertDialog +import android.app.Dialog +import android.content.ContentUris +import android.content.Context +import android.content.Intent +import android.content.pm.PackageManager +import android.database.Cursor +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.Matrix +import android.graphics.drawable.ColorDrawable +import android.graphics.drawable.Drawable +import android.media.ExifInterface +import android.net.Uri +import android.os.Build +import android.os.Environment +import android.provider.DocumentsContract +import android.provider.MediaStore +import android.provider.OpenableColumns +import android.provider.Settings +import android.util.Log +import android.view.Window +import android.widget.Toast +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.Nullable +import androidx.annotation.RequiresApi +import androidx.core.app.ActivityCompat +import androidx.core.content.FileProvider +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.target.CustomTarget +import com.consultantvendor.databinding.ItemDialogImageBinding +import com.karumi.dexter.Dexter +import com.karumi.dexter.PermissionToken +import com.karumi.dexter.listener.PermissionDeniedResponse +import com.karumi.dexter.listener.PermissionGrantedResponse +import com.karumi.dexter.listener.PermissionRequest +import com.karumi.dexter.listener.single.PermissionListener +import dagger.android.support.DaggerAppCompatActivity +import java.io.* +import java.text.SimpleDateFormat +import java.util.* + +abstract class BasePhotoUploadActivity : DaggerAppCompatActivity() { + var is_video = false + private val JPEG_FILE_PREFIX = "IMG_" + private val JPEG_FILE_SUFFIX = ".jpg" + var galleryPrem = false + + var mPicturePath: String? = null + var mIsGallery: Boolean? = null + var bitmap: Bitmap? = null + var reqcode = 0 + var triescamera = 0 + var triesgallary = 0 + + private val REQUEST_IMAGE_CAPTURE = 2 + private lateinit var photoFile: File + + + fun showImageDialog(b: Boolean,galleryPrem: Boolean) { + is_video = b + val dialog: Dialog = Dialog(this) + var view = ItemDialogImageBinding.inflate(layoutInflater) + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) + dialog.window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + dialog.setContentView(view.root) + + view.tvGallery.setOnClickListener { + mIsGallery = true + if (!is_video) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditongallary(galleryPrem) + + } else { + + checkgallry(galleryPrem) + + + } + } else { + openVideoGallery() + } + + dialog.dismiss() + } + + view.ivClose.setOnClickListener { dialog.dismiss() } + + view.tvCamera.setOnClickListener { + mIsGallery = false + + if (!is_video) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + + checkconditioncamera() + + } else { + + checkcamera() + + } + } else { + startCameraIntentVideo(this) + } + + + + dialog.dismiss() + } + dialog.show() + } + + open fun startCameraIntentVideo(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_VIDEO_CAPTURE) + takePictureIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); + + cameraIntentVideo.launch(takePictureIntent) + } + + open fun openVideoGallery() { + val intent = Intent() + intent.type = "video/*" + intent.action = Intent.ACTION_GET_CONTENT + cameraIntentVideo.launch(intent) + } + + var cameraIntentVideo = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { + val videoUri = it!!.data?.data + if (it!!.data?.data != null) { + + val mimeType: String = this.contentResolver.getType(videoUri!!)!! //Save file to upload on server + val file = saveVideoToAppScopeStorage(this, videoUri, mimeType) + getVideo(file.toString(), 2) + } + } + + fun saveVideoToAppScopeStorage(context: Context, videoUri: Uri?, mimeType: String?): File? { + if (videoUri == null || mimeType == null) { + return null + } + + val fileName = "capturedVideo${Calendar.getInstance().time.time}.mp4" + + val inputStream = context.contentResolver.openInputStream(videoUri) + val file = File(context.getExternalFilesDir(Environment.DIRECTORY_DCIM), fileName) + file.deleteOnExit() + file.createNewFile() + val out = FileOutputStream(file) + val bos = BufferedOutputStream(out) + + val buf = ByteArray(1024) + inputStream?.read(buf) + do { + bos.write(buf) + } while (inputStream?.read(buf) !== -1) + + //out.close() + bos.close() + inputStream.close() + + return file + } + + abstract fun getVideo(uri: String?, i: Int) + + + private fun checkcamera() { + reqcode = 2 + requestPermissionsFOR(Manifest.permission.CAMERA,galleryPrem) + } + + private fun checkgallry(galleryPrem : Boolean) { + reqcode = 1 + requestPermissionsFOR(Manifest.permission.READ_EXTERNAL_STORAGE,galleryPrem) + } + + private fun checkconditioncamera() { + reqcode = 4 + requestPermissionsFOR(Manifest.permission.CAMERA,galleryPrem) + } + + private fun checkconditongallary(galleryPrem : Boolean) { + reqcode = 3 + requestPermissionsFOR(Manifest.permission.READ_MEDIA_IMAGES,galleryPrem) + } + + + override fun onRequestPermissionsResult( + requestCode: Int, permissions: Array, + grantResults: IntArray + ) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + when (requestCode) { + 1 -> { + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.READ_EXTERNAL_STORAGE + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkgallry(galleryPrem) + } + } + + } + } + + + 2 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + checkcamera() + } + } + + } + + } + + 3 -> { + + + if (triesgallary < 2) { + triesgallary++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.READ_MEDIA_IMAGES + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary(galleryPrem) + } + } + + } + + } + + 4 -> { + if (triescamera < 2) { + triescamera++ + + if (ActivityCompat.checkSelfPermission( + this, + Manifest.permission.CAMERA + ) == PackageManager.PERMISSION_GRANTED + ) { + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + checkconditongallary(galleryPrem) + } + } + + } + } + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == 1) { + if (data != null) { + if (getRealPath(data.data!!, this) != null) { + getImage(getRealPath(data.data!!, this), data.data!!) + } else { + Glide.with(this) + .asBitmap() + .load(data.data) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .into(object : CustomTarget() { + + override fun onLoadCleared(@Nullable placeholder: Drawable?) {} + override fun onResourceReady( + resource: Bitmap, + transition: com.bumptech.glide.request.transition.Transition? + ) { + val file: String = getRealPath( + Uri.fromFile(saveImageToExternalStorage(resource)), + this@BasePhotoUploadActivity + )!! + getImage( + file, + Uri.fromFile(saveImageToExternalStorage(resource)) + ) + } + }) + } + } + } else if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == -1) { + try{ + val bitmap = BitmapFactory.decodeFile(photoFile.absolutePath) + val bitmapUri = bitmapToUri(this, bitmap) + + if (bitmapUri != null) { + getImage(bitmapUri.path, bitmapUri) + } + /* val file: String = getRealPath( + Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath, this)!! + + ) + ), this + )!! + getImage( + file, Uri.fromFile( + saveImageToExternalStorage( + getFile(mPicturePath,this)!! + ) + ) + )*/ + }catch (ex: Exception){ + Toast.makeText(this,"This functionality is under development", Toast.LENGTH_LONG).show() + } + + + } else if (requestCode == 3 && resultCode == -1) { + val uri: Uri = data?.data!! + val a = getPDFPath(uri); + + getPdf(a) + } else { + Log.e("gndnfkfnkn", "onActivityResult: " + data?.data) + } + + + } + + fun bitmapToUri(context: Context, bitmap: Bitmap): Uri? { + val file = File(cacheDir, "temp_image.jpg") // Temporary file in cache directory + return try { + val outputStream = FileOutputStream(file) + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) + outputStream.flush() + outputStream.close() + Uri.fromFile(file) // Return the Uri of the saved file + } catch (e: IOException) { + e.printStackTrace() + null + } + } + + abstract fun getPdf(uri: String?) + abstract fun getImage(uri: String?, data: Uri) + fun getPDFPath(uri: Uri?): String? { + var absolutePath = "" + try { + val inputStream = this.contentResolver.openInputStream( + uri!! + ) + val pdfInBytes = ByteArray(inputStream!!.available()) + inputStream.read(pdfInBytes) + var offset = 0 + var numRead = 0 + while (offset < pdfInBytes.size && inputStream.read( + pdfInBytes, + offset, + pdfInBytes.size - offset + ).also { + numRead = it + } >= 0 + ) { + offset += numRead + } + val returnCursor: Cursor? = + this.contentResolver.query(uri, null, null, null, null) + val nameIndex = returnCursor?.getColumnIndex(OpenableColumns.DISPLAY_NAME) + returnCursor?.moveToFirst() + var mPath = "" + mPath = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD_MR1) { + this.getExternalFilesDir(Environment.DIRECTORY_DCIM) + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } else { + Environment.getExternalStorageDirectory() + .toString() + "/" + returnCursor?.getString(nameIndex!!) + } + val pdfFile = File(mPath) + val op: OutputStream = FileOutputStream(pdfFile) + op.write(pdfInBytes) + absolutePath = pdfFile.path + } catch (ae: Exception) { + ae.printStackTrace() + } + return absolutePath + } + + fun openGallery(galleryPrem: Boolean) { + if(galleryPrem){ + val i = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) + startActivityForResult(i, 1) + } + } + + open fun isNougatDevice(): Boolean { + return Build.VERSION.SDK_INT >= 24 + } + + open fun startCameraIntent(context: Context) { + val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + try { + if (takePictureIntent.resolveActivity(packageManager) != null) { + photoFile = createImageFile() + val photoURI: Uri = FileProvider.getUriForFile( + this, + "com.consultantvendor", + photoFile + ) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI) + startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE) + } + } catch (e: Exception) { + e.printStackTrace() + } + /* val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + var f: File? = null + try { + val LOCAL_STORAGE_BASE_PATH_FOR_MEDIA = context.getExternalFilesDir("") + .toString() + "/" + "consultantvendor" + val LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES: String = + LOCAL_STORAGE_BASE_PATH_FOR_MEDIA + "/User/Images/" + f = setUpImageFile(LOCAL_STORAGE_BASE_PATH_FOR_POSTED_IMAGES) + mPicturePath = f!!.absolutePath + *//* add provider in xml and + * manifest then add following code for Nougat devices + * to overcome file uri exposed app crash + *//*if (isNougatDevice()) { + takePictureIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION + val contentUri: Uri = FileProvider.getUriForFile( + this, "com.consultantvendor", f + ) + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri) + } else { + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)) + } + } catch (e: Exception) { + e.printStackTrace() + f = null + mPicturePath = null + } + startActivityForResult(takePictureIntent, 2)*/ + } + + private fun createImageFile(): File { + val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) + val storageDir = getExternalFilesDir(null) + return File.createTempFile("JPEG_${timestamp}_", ".jpg", storageDir) + } + + private fun showAlert() { + // we are displaying an alert dialog for permissions + val builder = AlertDialog.Builder(this) + + // below line is the title for our alert dialog. + builder.setTitle("Need Permissions") + + // below line is our message for our dialog + builder.setMessage("This app needs permission to use this feature. You can grant them in app settings.") + + builder.setPositiveButton("GOTO SETTINGS") { dialog, which -> + val intent = Intent() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + val uri = Uri.fromParts("package", this.packageName, null) + intent.data = uri + } else { + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.addCategory(Intent.CATEGORY_DEFAULT) + intent.data = Uri.parse("package:" + this.packageName) + } + + startActivity(intent) + } + + builder.setNegativeButton("Cancel") { dialog, which -> + // this method is called when user clicks on the negative button. + dialog.cancel() + } + + // below line is used to display our dialog + builder.show() + } + + fun getRealPath(uri: Uri, context: Context): String? { + val isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT + // DocumentProvider + if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + if ("primary".equals(type, ignoreCase = true)) { + return (Environment.getExternalStorageDirectory() + .toString() + "/" + split[1]) + } else { + val splitIndex = docId.indexOf(':', 1) + val tag = docId.substring(0, splitIndex) + val path = docId.substring(splitIndex + 1) + val nonPrimaryVolume = + getPathToNonPrimaryVolume(context, tag) + if (nonPrimaryVolume != null) { + val result = "$nonPrimaryVolume/$path" + val file = File(result) + if (file.exists() && file.canRead()) { + return result + } + } + } + } else if (isDownloadsDocument(uri)) { + val id = DocumentsContract.getDocumentId(uri) + val contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), + java.lang.Long.valueOf(id) + + ) + return getDataColumn(context, contentUri, null, null) + } else if (isMediaDocument(uri)) { + val docId = DocumentsContract.getDocumentId(uri) + val split = docId.split(":").toTypedArray() + val type = split[0] + var contentUri: Uri? = null + if ("image" == type) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI + } else if ("video" == type) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI + } else if ("audio" == type) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI + } + val selection = "_id=?" + val selectionArgs = + arrayOf(split[1]) + return getDataColumn(context, contentUri, selection, selectionArgs) + } + } else if ("content".equals(uri.scheme, ignoreCase = true)) { + return getDataColumn(context, uri, null, null) + } else if ("file".equals(uri.scheme, ignoreCase = true)) { + return uri.path + } + return null + } + + private fun isExternalStorageDocument(uri: Uri): Boolean { + return "com.android.externalstorage.documents" == uri.authority + } + + private fun isDownloadsDocument(uri: Uri): Boolean { + return "com.android.providers.downloads.documents" == uri.authority + } + + private fun isMediaDocument(uri: Uri): Boolean { + return "com.android.providers.media.documents" == uri.authority + } + + @RequiresApi(api = Build.VERSION_CODES.KITKAT) + fun getPathToNonPrimaryVolume(context: Context, tag: String): String? { + val volumes = context.externalCacheDirs + if (volumes != null) { + for (volume in volumes) { + if (volume != null) { + val path = volume.absolutePath + if (path != null) { + val index = path.indexOf(tag) + if (index != -1) { + return path.substring(0, index) + tag + } + } + } + } + } + return null + } + + private fun getDataColumn( + context: Context, uri: Uri?, selection: String?, selectionArgs: + Array? + ): String? { + var cursor: Cursor? = null + val column = "_data" + val projection = arrayOf(column) + try { + cursor = context.contentResolver.query( + uri!!, projection, + selection, selectionArgs, null + ) + if (cursor != null && cursor.moveToFirst()) { + val column_index = cursor.getColumnIndexOrThrow(column) + return cursor.getString(column_index) + } + } finally { + cursor?.close() + } + return null + } + + fun setUpImageFile(imageDirectory: String?): File? { + var imageFile: File? = null + if (Environment.MEDIA_MOUNTED == Environment.getExternalStorageState()) { + val storageDir = File(imageDirectory) + if (null != storageDir) { + if (!storageDir.mkdirs()) { + if (!storageDir.exists()) { + Log.d("CameraSample", "failed to create directory") + return null + } + } + } + imageFile = File.createTempFile( + JPEG_FILE_PREFIX + + System.currentTimeMillis() + "_", + JPEG_FILE_SUFFIX, storageDir + ) + } + return imageFile + } + + fun saveImageToExternalStorage(finalBitmap: Bitmap): File? { + val file: File + val root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + .toString() + val myDir = File("$root/Mojo") + myDir.mkdirs() + val fname = (JPEG_FILE_PREFIX + System.currentTimeMillis() + "_" + JPEG_FILE_SUFFIX) + + file = File(myDir, fname) + if (file.exists()) file.delete() + try { + val out = FileOutputStream(file) + finalBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) + out.flush() + out.close() + return file + } catch (e: java.lang.Exception) { + e.printStackTrace() + } + return file + } + + fun getFile(imgPath: String?, mContext: Context?): Bitmap? { + val mOrientation: Int + var bMapRotate: Bitmap? = null + try { + if (imgPath != null) { + val exif = ExifInterface(imgPath) + mOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1) + val options = BitmapFactory.Options() + options.inJustDecodeBounds = true + BitmapFactory.decodeFile(imgPath, options) + options.inSampleSize = calculateInSampleSize(options, 400, 400) + options.inJustDecodeBounds = false + bMapRotate = BitmapFactory.decodeFile(imgPath, options) + when (mOrientation) { + 6 -> { + val matrix = Matrix() + matrix.postRotate(90f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 8 -> { + val matrix = Matrix() + matrix.postRotate(270f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + + 3 -> { + val matrix = Matrix() + matrix.postRotate(180f) + bMapRotate = Bitmap.createBitmap( + bMapRotate, 0, 0, + bMapRotate.width, bMapRotate.height, matrix, true + ) + } + } + } else { + + } + } catch (e: OutOfMemoryError) { + bMapRotate = null + e.printStackTrace() + } catch (e: IOException) { + e.printStackTrace() + } catch (e: java.lang.Exception) { + bMapRotate = null + e.printStackTrace() + } + return bMapRotate + } + + fun calculateInSampleSize( + options: BitmapFactory.Options, + reqWidth: Int, + reqHeight: Int + ): Int { + try { + val height = options.outHeight + val width = options.outWidth + var inSampleSize = 1 + if (height > reqHeight || width > reqWidth) { + val halfHeight = height / 2 + val halfWidth = width / 2 + while (halfHeight / inSampleSize > reqHeight + && halfWidth / inSampleSize > reqWidth + ) { + inSampleSize *= 2 + } + } + return inSampleSize + } catch (e: Exception) { + e.printStackTrace() + } + return 0 + } + + + private fun requestPermissionsFOR(readMediaImages: String,galleryPrem : Boolean) { + Dexter.withContext(this) + .withPermission(readMediaImages) + .withListener(object : PermissionListener { + override fun onPermissionGranted(response: PermissionGrantedResponse) { +// Toast.makeText(requireContext(), "Camera permission granted", Toast.LENGTH_SHORT).show() +// // Reset the denial count +// // Proceed with camera access + + + when (reqcode) { + 1 -> { + + openGallery(galleryPrem) + } + + 2 -> { + + startCameraIntent(this@BasePhotoUploadActivity) + } + + 3 -> { + + openGallery(galleryPrem) + + } + + 4 -> { + startCameraIntent(this@BasePhotoUploadActivity) + + } + } + } + + override fun onPermissionDenied(response: PermissionDeniedResponse) { + if (response.isPermanentlyDenied) { + showAlert() + } else { + Toast.makeText(applicationContext, "permission denied", Toast.LENGTH_SHORT) + .show() + } + } + + override fun onPermissionRationaleShouldBeShown( + permission: PermissionRequest?, + token: PermissionToken? + ) { + Toast.makeText( + applicationContext, + "permission is needed to use this feature", + Toast.LENGTH_SHORT + ).show() + token?.continuePermissionRequest() + } + }).check() + } +} diff --git a/app/src/main/java/com/consultantvendor/utils/ConnectionDetector.kt b/app/src/main/java/com/consultantvendor/utils/ConnectionDetector.kt new file mode 100644 index 0000000..34f6a90 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/ConnectionDetector.kt @@ -0,0 +1,62 @@ +package com.consultantvendor.utils + +import android.content.Context +import android.content.Intent +import android.net.ConnectivityManager +import android.net.NetworkCapabilities +import android.os.Build +import com.consultantvendor.ui.drawermenu.DrawerActivity + +private fun showNoInternetDialog(context: Context?) { + /* AlertDialog.Builder(context) + .setCancelable(false) + .setTitle(context.getString(R.string.internet)) + .setMessage(context.getString(R.string.check_internet)) + .setPositiveButton(context.getString(R.string.ok)) { _, _ -> + val intent = Intent(Settings.ACTION_SETTINGS) + context.startActivity(intent) + }.show()*/ + + context?.startActivity(Intent(context, DrawerActivity::class.java) + .putExtra(PAGE_TO_OPEN, DrawerActivity.NETWORK_ERROR)) +} + +/* fun showRetrofitErrorToast() { + Toast.makeText(context, context.getString(R.string.might_problem), Toast.LENGTH_LONG).show() + }*/ + +fun isConnectedToInternet(context: Context?, showAlert: Boolean): Boolean { + val isConnected = isConnectedToInternet(context) + + return when { + isConnected -> true + showAlert -> { + showNoInternetDialog(context) + false + } + else -> false + } +} + + +private fun isConnectedToInternet(context: Context?): Boolean { + val connectivityManager = context?.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + + val activeNetwork = connectivityManager.activeNetwork ?: return false + val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) + ?: return false + return when { + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> true + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> true + //for other device how are able to connect with Ethernet + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> true + //for check internet over Bluetooth + networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> true + else -> false + } + } else { + val nwInfo = connectivityManager.activeNetworkInfo ?: return false + return nwInfo.isConnected + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/CustomTimePickerDialog.kt b/app/src/main/java/com/consultantvendor/utils/CustomTimePickerDialog.kt new file mode 100644 index 0000000..1d1cfbd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/CustomTimePickerDialog.kt @@ -0,0 +1,88 @@ +package com.consultantvendor.utils + +import android.app.TimePickerDialog +import android.content.Context +import android.content.DialogInterface +import android.util.Log +import android.view.View +import android.widget.NumberPicker +import android.widget.TimePicker +import java.util.* + +class CustomTimePickerDialog(context: Context, private val mTimeSetListener: OnTimeSetListener?, + hourOfDay: Int, minute: Int, is24HourView: Boolean) : + TimePickerDialog(context, mTimeSetListener, hourOfDay, minute , is24HourView) { + private var mTimePicker: TimePicker? = null + private var mIgnoreEvent = false + + var savedHour = 0 + var savedMinute = 0 + + init { + savedHour = hourOfDay + savedMinute = minute / TIME_PICKER_INTERVAL + } + + override fun updateTime(hourOfDay: Int, minuteOfHour: Int) { + mTimePicker?.currentHour = hourOfDay + mTimePicker?.currentMinute = minuteOfHour / TIME_PICKER_INTERVAL + } + + override fun onTimeChanged(view: TimePicker?, hourOfDay: Int, minute: Int) { + + if (savedHour != 0) { + if (savedMinute != minute && savedHour != hourOfDay) { + mTimePicker?.currentHour = savedHour + }else{ + savedMinute = minute + savedHour = hourOfDay + } + }else{ + savedHour = hourOfDay + savedMinute = minute + } + super.onTimeChanged(view, savedHour, savedMinute) + } + + + override fun onClick(dialog: DialogInterface, which: Int) { + when (which) { + DialogInterface.BUTTON_POSITIVE -> mTimeSetListener?.onTimeSet( + mTimePicker, (mTimePicker?.currentHour ?: 0), + (mTimePicker?.currentMinute ?: 0) * TIME_PICKER_INTERVAL + ) + DialogInterface.BUTTON_NEGATIVE -> cancel() + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + try { + val classForid = Class.forName("com.android.internal.R\$id") + val timePickerField = classForid.getField("timePicker") + mTimePicker = findViewById(timePickerField.getInt(null)) as TimePicker? + val field = classForid.getField("minute") + + val minuteSpinner = mTimePicker?.findViewById(field.getInt(null)) as NumberPicker + minuteSpinner.minValue = 0 + minuteSpinner.maxValue = 60 / TIME_PICKER_INTERVAL - 1 + val displayedValues = ArrayList() + var i = 0 + while (i < 60) { + displayedValues.add(String.format("%02d", i)) + i += TIME_PICKER_INTERVAL + } + minuteSpinner.displayedValues = displayedValues + .toTypedArray() + } catch (e: Exception) { + e.printStackTrace() + Log.e("Error===", e.toString()) + } + + } + + companion object { + + private val TIME_PICKER_INTERVAL = 30 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/DateUtils.kt b/app/src/main/java/com/consultantvendor/utils/DateUtils.kt new file mode 100644 index 0000000..cec60fb --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/DateUtils.kt @@ -0,0 +1,338 @@ +package com.consultantvendor.utils + +import android.app.Activity +import android.content.Context +import android.graphics.Color +import android.text.format.DateUtils +import androidx.core.content.ContextCompat +import com.consultantvendor.R +import com.consultantvendor.ui.loginSignUp.availability.OnTimeSelected +import com.github.florent37.singledateandtimepicker.dialog.SingleDateAndTimePickerDialog +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.* + + +object DateUtils { + + val utcFormat = SimpleDateFormat(DateFormat.UTC_FORMAT_NORMAL, Locale.ENGLISH) + + /*fun openDatePicker(activity: Activity, listener: OnDateSelected, max: Boolean, min: Boolean) { + val c = Calendar.getInstance() + val year = c.get(Calendar.YEAR) + val month = c.get(Calendar.MONTH) + val day = c.get(Calendar.DAY_OF_MONTH) + + val dpd = DatePickerDialog(activity, + DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth -> + var selectedDate = "$dayOfMonth/${monthOfYear.plus(1)}/$year" + + selectedDate = + dateFormatChange(DateFormat.DATE_FORMAT_SLASH_YEAR, DateFormat.DATE_FORMAT_SLASH, selectedDate) + listener.onDateSelected(selectedDate) + + }, year, month, day + ) + + if (max) + dpd.datePicker.maxDate = System.currentTimeMillis() - 36000 + if (min) + dpd.datePicker.minDate = System.currentTimeMillis() - 36000 + + dpd.show() + }*/ + + fun openDatePicker(activity: Activity, listener: OnDateSelected, max: Long?, min: Long?) { + + val picker = SingleDateAndTimePickerDialog.Builder(activity) + .customLocale(Locale.ENGLISH) + .bottomSheet() + .focusable() + .backgroundColor(Color.BLACK) + .displayHours(false) + .displayMinutes(false) + .displayDays(false) + .displayMonth(true) + .displayYears(true) + .titleTextSize(16) + .displayDaysOfMonth(true) + .title(activity.getString(R.string.select_date)) + .mainColor(ContextCompat.getColor(activity, R.color.colorWhite)) + .titleTextColor(ContextCompat.getColor(activity, R.color.colorWhite)) + .listener { + //Toast.makeText(activity, it.toString(), Toast.LENGTH_SHORT).show() + when { + (min == null || it.time > min) && (max == null || it.time < max) -> { + var selectedDate = dateFormatFromMillis(DateFormat.DATE_FORMAT, it.time) + selectedDate = dateFormatChange(DateFormat.DATE_FORMAT, DateFormat.MON_DATE_YEAR, selectedDate) + listener.onDateSelected(selectedDate) + } + min != null && it.time < min -> { + activity.longToast(activity.getString(R.string.select_future_date)) + } + max != null && it.time > max -> { + activity.longToast(activity.getString(R.string.select_previos_date)) + } + } + } + + if (max != null) { + picker.maxDateRange(Date(max)) + picker.defaultDate(Date((max - 86400000))) + } + if (min != null) { + picker.minDateRange(Date(min)) + picker.defaultDate(Date((min + 86400000))) + } + picker.display() + } + + + fun dateFormatFromMillis(format: String, timeInMillis: Long?): String { + val fmt = SimpleDateFormat(format, Locale.ENGLISH) + return if (timeInMillis == null || timeInMillis == 0L) + "" + else + fmt.format(timeInMillis) + } + + fun dateFormatFromMillisBackend(format: String, timeInMillis: Long?): String { + val fmt = SimpleDateFormat(format, Locale.ENGLISH) + return if (timeInMillis == null || timeInMillis == 0L) + "" + else + fmt.format(timeInMillis) + } + + fun dateFormatChange(formatFrom: String, formatTo: String, value: String): String { + val originalFormat = SimpleDateFormat(formatFrom, Locale.ENGLISH) + val originalFormatDefault = SimpleDateFormat(formatFrom, Locale.ENGLISH) + + val targetFormat = SimpleDateFormat(formatTo, Locale.ENGLISH) + + val date = try { + originalFormat.parse(value) + } catch (e: Exception) { + originalFormatDefault.parse(value) + } + return targetFormat.format(date) + } + + fun dateFormatForBackend(formatFrom: String, formatTo: String, value: String): String { + val originalFormat = SimpleDateFormat(formatFrom, Locale.ENGLISH) + val originalFormatDefault = SimpleDateFormat(formatFrom, Locale.ENGLISH) + + val targetFormat = SimpleDateFormat(formatTo, Locale.ENGLISH) + + val date = try { + originalFormat.parse(value) + } catch (e: Exception) { + originalFormatDefault.parse(value) + } + + return targetFormat.format(date) + } + + /* fun dateFormatForBackend(formatFrom: String, formatTo: String, value: String): String { + val originalFormat = SimpleDateFormat(formatFrom, Locale.ENGLISH).apply { + timeZone = TimeZone.getDefault() // Input time zone (local time zone) + } + + val targetFormat = SimpleDateFormat(formatTo, Locale.ENGLISH).apply { + timeZone = TimeZone.getTimeZone("UTC") // Output time zone (UTC) + } + + val date = try { + originalFormat.parse(value) + } catch (e: Exception) { + null // Handle parse error gracefully + } + + return date?.let { targetFormat.format(it) } ?: "" + }*/ + + fun localToUTC(dateFormat: String, datesToConvert: String): String { + + var dateToReturn = datesToConvert + + val sdf = SimpleDateFormat(dateFormat) + sdf.timeZone = TimeZone.getDefault() + var gmt: Date? = null + + val sdfOutPutToSend = SimpleDateFormat(DateFormat.DATE_FORMAT) + sdfOutPutToSend.timeZone = TimeZone.getTimeZone("UTC") + + try { + + gmt = sdf.parse(datesToConvert) + dateToReturn = sdfOutPutToSend.format(gmt) + + } catch (e: ParseException) { + e.printStackTrace() + } + + return dateToReturn + } + + + fun getTimeAgo(createdAt: String?): String { + val agoString: String + + if (createdAt == null) { + return "" + } + + utcFormat.timeZone = TimeZone.getTimeZone("Etc/UTC") + val time = utcFormat.parse(createdAt).time + val now = System.currentTimeMillis() + + val ago = DateUtils.getRelativeTimeSpanString( + time, now, DateUtils.SECOND_IN_MILLIS, DateUtils.FORMAT_ABBREV_RELATIVE + ) + + return ago.toString() + } + + fun getTimeAgoForMillis(millis: Long): String { + + val now = System.currentTimeMillis() + + return DateUtils.getRelativeTimeSpanString( + millis, now, DateUtils.SECOND_IN_MILLIS, + DateUtils.FORMAT_ABBREV_RELATIVE + ).toString() + } + + fun getLocalTimeAgo(timeString: Long?, removeAgo: String): String { + var agoString = "" + + timeString?.let { + val now = System.currentTimeMillis() + + val ago = DateUtils.getRelativeTimeSpanString( + timeString, + now, + DateUtils.SECOND_IN_MILLIS, + DateUtils.FORMAT_SHOW_TIME + ) + + agoString = ago.toString() + } + + return agoString + } + + fun dateTimeFormatFromUTC(format: String, createdDate: String?): String { + return if (createdDate == null || createdDate.isEmpty()) + "" + else { + utcFormat.timeZone = TimeZone.getTimeZone("Etc/UTC") + + val fmt = SimpleDateFormat(format, Locale.ENGLISH) + fmt.format(utcFormat.parse(createdDate)) + } + } + + + fun getTime(context: Context, startTime: String="", endTime: String?=null, + isStart: Boolean=true, listener: OnTimeSelected) { + var compareDate = true + if (endTime == null) + compareDate = false + else if (isStart && endTime.isEmpty()) { + compareDate = false + } else if (startTime.isEmpty()) { + compareDate = false + } + + val sdf = SimpleDateFormat(DateFormat.TIME_FORMAT, Locale.ENGLISH) + + val endTime = if (endTime != null && endTime.isNotEmpty()) + sdf.parse(endTime) + else Date() + + val startTime = if (startTime.isNotEmpty()) + sdf.parse(startTime) + else Date() + + val cal = Calendar.getInstance() + var selectedTime = "" + var isError = false + + val picker = SingleDateAndTimePickerDialog.Builder(context) + .customLocale(Locale.ENGLISH) + .bottomSheet() + .focusable() + .curved() + .backgroundColor(Color.BLACK) + .displayHours(true) + .displayMinutes(true) + .displayDays(false) + .displayMonth(false) + .displayYears(false) + .titleTextSize(16) + .minutesStep(30) + .displayDaysOfMonth(false) + .title(context.getString(R.string.select_time)) + .mainColor(ContextCompat.getColor(context, R.color.colorWhite)) + .titleTextColor(ContextCompat.getColor(context, R.color.colorWhite)) + .listener { + //Toast.makeText(activity, it.toString(), Toast.LENGTH_SHORT).show() + cal.set(Calendar.HOUR_OF_DAY, dateFormatFromMillisBackend(DateFormat.HH_24, it.time).toInt()) + cal.set(Calendar.MINUTE, dateFormatFromMillisBackend(DateFormat.MM, it.time).toInt()) + + val newTime = sdf.parse(sdf.format(cal.time)) + val time = sdf.format(cal.time) + + /* val different = if (isStart) newTime.time - endTime.time + else + newTime.time - startTime.time*/ + + if (isStart) { + if (!compareDate || newTime.before(endTime)) { + selectedTime = time + } else { + isError = true + } + + } else { + if (!compareDate || startTime.before(newTime)) { + selectedTime = sdf.format(cal.time) + } else { + isError = true + } + } + + listener.onTimeSelected(Triple(selectedTime, isStart, isError)) + } + picker.display() + } +} + +/*On Date selected listener*/ +interface OnDateSelected { + fun onDateSelected(date: String) +} + +fun isYesterday(calendar: Calendar): Boolean { + val tempCal = Calendar.getInstance() + tempCal.add(Calendar.DAY_OF_MONTH, -1) + return calendar.get(Calendar.DAY_OF_MONTH) == tempCal.get(Calendar.DAY_OF_MONTH) +} + +object DateFormat { + const val DATE_FORMAT = "yyyy-MM-dd" + const val DATE_TIME_FORMAT = "MMM dd, yyyy · hh:mm a" + const val TIME_FORMAT = "hh:mm a" + const val TIME_FORMAT_24 = "HH:mm" + const val MON_DATE = "MMM dd" + const val MON_DATE_YEAR = "MMM dd, yyyy" + const val UTC_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" + const val UTC_FORMAT_NORMAL = "yyyy-MM-dd HH:mm:ss" + + const val DATE = "dd" + const val MONTH = "MM" + const val YEAR = "yyyy" + const val HH_24 = "HH" + const val MM = "mm" +} diff --git a/app/src/main/java/com/consultantvendor/utils/GeneralFunction.kt b/app/src/main/java/com/consultantvendor/utils/GeneralFunction.kt new file mode 100644 index 0000000..e03f6bd --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/GeneralFunction.kt @@ -0,0 +1,797 @@ +package com.consultantvendor.utils + +import android.annotation.SuppressLint +import android.app.Activity +import android.app.Activity.RESULT_OK +import android.app.NotificationManager +import android.content.Context +import android.content.Intent +import android.content.pm.ActivityInfo +import android.content.pm.PackageInfo +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Typeface +import android.location.Address +import android.location.Geocoder +import android.net.Uri +import android.os.Handler +import android.provider.MediaStore +import android.text.SpannableString +import android.text.Spanned +import android.text.TextPaint +import android.text.style.ClickableSpan +import android.text.style.ForegroundColorSpan +import android.text.style.StyleSpan +import android.util.Log +import android.view.MotionEvent +import android.view.View +import android.view.animation.Animation +import android.view.animation.AnimationUtils +import android.view.inputmethod.InputMethodManager +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import android.widget.Toast +import androidx.appcompat.widget.PopupMenu +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentManager +import com.bumptech.glide.Glide +import com.bumptech.glide.request.RequestOptions +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import com.consultantvendor.appClientDetails +import com.consultantvendor.appFeatures +import com.consultantvendor.data.models.responses.UserData +import com.consultantvendor.data.network.Config +import com.consultantvendor.ui.loginSignUp.SignUpActivity +import com.consultantvendor.ui.webview.WebViewActivity +import com.consultantvendor.utils.DateUtils.dateFormatForBackend +import com.consultantvendor.utils.dialogs.ProgressDialog +import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder +import com.google.android.gms.maps.model.BitmapDescriptor +import com.google.android.gms.maps.model.BitmapDescriptorFactory +import com.google.android.libraries.places.api.model.Place +import com.google.android.libraries.places.widget.Autocomplete +import com.google.android.libraries.places.widget.model.AutocompleteActivityMode +import com.google.android.material.snackbar.Snackbar +import com.google.firebase.dynamiclinks.ktx.* +import com.google.firebase.ktx.Firebase +//import com.stfalcon.frescoimageviewer.ImageViewer +//import droidninja.filepicker.FilePickerBuilder +//import droidninja.filepicker.models.sort.SortingTypes +import id.zelory.compressor.Compressor +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody +import java.io.File +import java.text.NumberFormat +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.* + +fun View.gone() { + visibility = View.GONE +} + +fun View.visible() { + visibility = View.VISIBLE +} + +fun View.invisible() { + visibility = View.INVISIBLE +} + +fun View.hideShowView(listIsEmpty: Boolean) { + visibility = if (listIsEmpty) View.VISIBLE + else View.GONE +} + +fun getRequestBody(string: String?): RequestBody { + return RequestBody.create("text/plain".toMediaTypeOrNull(), string ?: "") +} + +fun View.showSnackBar(msg: String) { + try { + val snackBar = Snackbar.make(this, msg, Snackbar.LENGTH_LONG) + val snackBarView = snackBar.view + val textView = + snackBarView.findViewById(R.id.snackbar_text) as TextView + textView.maxLines = 3 + snackBar.setAction(R.string.ok) { snackBar.dismiss() } + snackBarView.setBackgroundColor(ContextCompat.getColor(context, R.color.colorPrimary)) + snackBar.setActionTextColor(ContextCompat.getColor(context, R.color.colorPrimary)) + snackBar.show() + } catch (e: Exception) { + e.printStackTrace() + } +} + +fun logoutUser(activity: Activity?, prefsManager: PrefsManager) { + val notificationManager = + activity?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + notificationManager.cancelAll() + + + prefsManager.remove(USER_DATA) + prefsManager.remove("token") + + activity.setResult(Activity.RESULT_CANCELED) + ActivityCompat.finishAffinity(activity) + + activity.startActivity(Intent(activity, SignUpActivity::class.java) + .addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)) + +} + + +/*Digits should be 0,1,2,3*/ +fun getCountFormat(digits: Int, count: Int?): String { + when (digits) { + 1 -> return if (count ?: 0 <= 9) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 9) + 2 -> return if (count ?: 0 <= 99) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 99) + 3 -> return if (count ?: 0 <= 999) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 999) + else -> return if (count ?: 0 <= 9999) + count.toString() + else + String.format(Locale.ENGLISH, "%d+", 9999) + } +} + + +fun Context.longToast(text: CharSequence) { + Toast.makeText(this, text, Toast.LENGTH_LONG).show() +} + +fun addFragment(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction() + ?.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out) + ?.add(id, fragment)?.commit() +} + +fun addFragmentAnim(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction() + ?.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + ?.add(id, fragment)?.commit() +} + +fun addFragmentToBackStack(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction()?.setCustomAnimations(0, 0, 0, 0) + ?.add(id, fragment)?.addToBackStack("")?.commit() +} + +fun replaceFragmentNoBackStack(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction()?.replace(id, fragment)?.commit() +} + +fun replaceFragment(fragmentManager: FragmentManager?, fragment: Fragment, id: Int) { + fragmentManager?.beginTransaction()?.replace(id, fragment, fragment::class.simpleName) + ?.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out) + ?.addToBackStack(null)?.commit() +} + + +fun replaceResultFragment( + fragment: Fragment, + targetFragment: Fragment, + container: Int, + requestCode: Int +) { + val ft = fragment.requireActivity().supportFragmentManager.beginTransaction() + targetFragment.setTargetFragment(fragment, requestCode) + ft.addToBackStack("") + ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out) + ft.replace(container, targetFragment, fragment.tag) + ft.commit() +} + +fun resultFragmentIntent( + fragment: Fragment, + fragmentTarget: Fragment, + requestCode: Int, + intent: Intent? +) { + val intentMain = intent ?: Intent(fragment.requireContext(), fragmentTarget::class.java) + fragmentTarget.onActivityResult(requestCode, RESULT_OK, intentMain) + fragment.activity?.supportFragmentManager?.popBackStack() +} + + +fun resultFragmentIntentNoPop( + fragment: Fragment, + fragmentTarget: Fragment, + requestCode: Int, + intent: Intent? +) { + val intentMain = intent ?: Intent(fragment.requireContext(), fragmentTarget::class.java) + fragmentTarget.onActivityResult(requestCode, RESULT_OK, intentMain) +} + + +fun View.hideKeyboard() { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.hideSoftInputFromWindow(windowToken, 0) +} + +fun View.showKeyboard() { + val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + imm.toggleSoftInputFromWindow( + applicationWindowToken, + InputMethodManager.SHOW_FORCED, 0 + ) +} + +fun getAge(date: String?): String { + if (date == null) + return "NA" + else { + val dob = Calendar.getInstance() + val today = Calendar.getInstance() + + val dateChange = dateFormatForBackend(DateFormat.DATE_FORMAT, DateFormat.MON_DATE_YEAR, date) + val formatter = SimpleDateFormat(DateFormat.MON_DATE_YEAR, Locale.ENGLISH) + try { + dob.time = formatter.parse(dateChange) + } catch (e: ParseException) { + e.printStackTrace() + } + + var age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR) + + if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) { + age-- + } + + val ageInt = age + + return ageInt.toString() + } +} + +fun getAgeSelected(date: String?): Int { + if (date == null) + return 0 + else { + val dob = Calendar.getInstance() + val today = Calendar.getInstance() + + val formatter = SimpleDateFormat(DateFormat.MON_DATE_YEAR, Locale.ENGLISH) + try { + dob.time = formatter.parse(date) + } catch (e: ParseException) { + e.printStackTrace() + } + + var age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR) + + if (today.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) { + age-- + } + + val ageInt = age + + return ageInt + } +} + + +val requestOptions = RequestOptions() + .dontAnimate() + .dontTransform() + +fun loadImage(tag:String,ivImage: ImageView, image: String?, placeholder: Int) { +/* val imageLink = getImageBaseUrl(ImageFolder.UPLOADS, image) + val imageThumbnail = getImageBaseUrl(ImageFolder.THUMBS, image) + + val glide = Glide.with(ivImage.context) + + glide.load(imageLink) + .apply(requestOptions) + .placeholder(placeholder) + .thumbnail(glide.load(imageThumbnail)) + .into(ivImage)*/ + + + if(tag.equals("profile")){ + val imageLink = image + val imageThumbnail = image + + val glide = Glide.with(ivImage.context) + + glide.load(imageLink) + .apply(requestOptions) + .placeholder(placeholder) + .thumbnail(glide.load(imageThumbnail)) + .dontAnimate() + .into(ivImage) + + }else{ + val imageLink = getImageBaseUrl(ImageFolder.ASSETS+ImageFolder.ORIGINAL, image) + val imageThumbnail = getImageBaseUrl(ImageFolder.ASSETS+ImageFolder.ORIGINAL, image) + + val glide = Glide.with(ivImage.context) + + glide.load(imageLink) + .apply(requestOptions) + + .placeholder(placeholder) + .thumbnail(glide.load(imageThumbnail)) + .dontAnimate() + .into(ivImage) + } +} + +fun getImageBaseUrl(folderType: String, image: String?): String { + return "${appClientDetails.media_url}$folderType$image" + //return "https://consultants3assets.blob.core.windows.net/assets/consultants3assets/"+"$folderType$image" +} + +fun pxFromDp(context: Context, dp: Float): Float { + return dp * context.resources.displayMetrics.density +} + +fun getVersion(activity: Activity): PackageInfo { + return activity.packageManager.getPackageInfo(activity.packageName, 0) +} + +fun disableButton(btn: View?) { + btn?.isEnabled = false + + Handler().postDelayed({ + btn?.isEnabled = true + }, 1500)// set time as per your requirement +} + +fun getDoctorName(userData: UserData?): String { + return if (userData?.profile?.title.isNullOrEmpty()) + userData?.name ?: "" + else + "${userData?.profile?.title ?: ""} ${userData?.name}" +} + +fun getCurrency(amount: String?): String { + val format = NumberFormat.getCurrencyInstance(Locale.ENGLISH) + format.maximumFractionDigits = 2 + format.currency = Currency.getInstance(appClientDetails.currency) + + return if (amount.isNullOrEmpty()) + format.format(0).replace("0.00", " NA") + else { + format.format(amount.toDouble()).replace(".00", "") + } +} + +fun getCurrencySymbol(): String { + val format = NumberFormat.getCurrencyInstance() + format.currency = Currency.getInstance(appClientDetails.currency) + + return format.currency.symbol +} + +fun getUnitPrice(unit: Double?, context: Context): String { + return when { + unit == null -> "NA" + unit >= 3600 -> "${(unit / 3600)} ${context.getString(R.string.hr)}" + else -> "${(unit / 60)} ${context.getString(R.string.min)}" + } +} + +@SuppressLint("ClickableViewAccessibility") +fun editTextScroll(editText: EditText) { + editText.setOnTouchListener { v, event -> + v.parent.requestDisallowInterceptTouchEvent(true) + if ((event.action and MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) { + v.parent.requestDisallowInterceptTouchEvent(false) + } + false + } +} + +fun getUserRating(rating: String?): String { + val ratingNew = rating ?: "0.0" + + return String.format(Locale.ENGLISH, "%.1f", ratingNew.toFloat()) +} + +fun compressImage(activity: Activity?, actualImageFile: File?): File { + /* Log.e("File Size", actualImageFile?.length().toString()) + + *//*mb approximate*//* + val resultFile: File? = when { + actualImageFile?.length() ?: 0 < (1 * 1024 * 1024) -> actualImageFile + actualImageFile?.length() ?: 0 < (3 * 1024 * 1024) -> { + Compressor(activity) + .setQuality(70) + .setCompressFormat(Bitmap.CompressFormat.JPEG) + .compressToFile(actualImageFile) + } + else -> { + Compressor(activity) + .setQuality(50) + .setCompressFormat(Bitmap.CompressFormat.JPEG) + .compressToFile(actualImageFile) + } + } + + Log.e("File Size New", resultFile?.length().toString()) +*/ + return /*resultFile ?:*/ File("") +} + +fun viewImageFull(activity: Activity, itemsImage: ArrayList, pos: Int) { + +/* val hierarchyBuilder = GenericDraweeHierarchyBuilder + .newInstance(activity.resources) + .setFailureImage(R.drawable.image_placeholder) + .setProgressBarImage(R.drawable.image_placeholder) + .setPlaceholderImage(R.drawable.image_placeholder) + + ImageViewer.Builder(activity, itemsImage) + .setStartPosition(pos) + .hideStatusBar(false) + .setCustomDraweeHierarchyBuilder(hierarchyBuilder) + .show()*/ +} + +fun placePicker(fragment: Fragment?, activityMain: Activity) { + val activity: Activity = if (fragment != null) + fragment.activity as Activity + else + activityMain + + val fields = + listOf(Place.Field.ID, Place.Field.NAME, Place.Field.LAT_LNG, Place.Field.ADDRESS) + val intent = Autocomplete.IntentBuilder(AutocompleteActivityMode.FULLSCREEN, fields) + .build(activity) + + if (activityMain.packageName.equals(BuildConfig.APPLICATION_ID)) { + if (fragment == null) + activity.startActivityForResult(intent, AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) + else + fragment.startActivityForResult(intent, AppRequestCode.AUTOCOMPLETE_REQUEST_CODE) + } +} + +fun getPathUri(context: Context, uri: Uri): String? { + val projection = + arrayOf(MediaStore.Images.Media.DATA) + val cursor = context.contentResolver.query(uri, projection, null, null, null) + ?: return "" + val column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA) + cursor.moveToFirst() + val result = cursor.getString(column_index) + cursor.close() + return result +} + +fun setAcceptTerms(activity: Activity): SpannableString { + val termText= if (BuildConfig.FLAVOR=="taradoc"){ + activity.getString(R.string.terms2) + }else + activity.getString(R.string.terms) + + val term = String.format("%s%s %s %s", activity.getString(R.string.you_agree_to_our_terms), + termText, activity.getString(R.string.and), activity.getString(R.string.privacy)) + + val string = SpannableString.valueOf(term) + /*Color*/ + string.setSpan(ForegroundColorSpan(ContextCompat.getColor(activity, R.color.colorPrimary)), + term.indexOf(termText), term.indexOf(" " + activity.getString(R.string.and) + " "), 0) + string.setSpan(ForegroundColorSpan(ContextCompat.getColor(activity, R.color.colorPrimary)), + term.indexOf(activity.getString(R.string.privacy)), term.length, 0) + /*Bold*/ +// string.setSpan(StyleSpan(Typeface.BOLD), term.indexOf(termText), +// term.indexOf(" " + activity.getString(R.string.and) + " "), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) +// string.setSpan(StyleSpan(Typeface.BOLD), term.indexOf(activity.getString(R.string.privacy)), +// term.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + /*Click*/ + string.setSpan(Terms(), term.indexOf(termText), + term.indexOf(" " + activity.getString(R.string.and) + " "), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + string.setSpan(Privacy(), term.indexOf(activity.getString(R.string.privacy)), + term.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + + return string +} + +fun openPageLink(context: Context, name: String?, link: String?, app_type: String?) { + val intentLink = Intent(context, WebViewActivity::class.java) + .putExtra(WebViewActivity.LINK_TITLE, name) + + if (app_type != null) + intentLink.putExtra(WebViewActivity.LINK_URL, "$link?app_type=$app_type") + else + intentLink.putExtra(WebViewActivity.LINK_URL, link) + + context.startActivity(intentLink) +} + +class Privacy : ClickableSpan() { + + override fun onClick(tv: View) { + //tv.context.longToast("Clicked") + appClientDetails.pages?.forEach { + if (it.slug == PageLink.PRIVACY_POLICY) { + openPageLink(tv.context, tv.context.getString(R.string.privacy), + it.slug, it.app_type) + } + } + } + + override fun updateDrawState(ds: TextPaint) {// override updateDrawState + ds.isUnderlineText = false // set to false to remove underline + } +} + +class Terms : ClickableSpan() { + + override fun onClick(tv: View) { + //viewPage(PageLink.TERMS) + openPageLink(tv.context, tv.context.getString(R.string.terms2),"","") + /* appClientDetails.pages?.forEach { + if (it.slug == PageLink.TERMS_CONDITIONS) { + if(BuildConfig.FLAVOR=="taradoc") + openPageLink(tv.context, tv.context.getString(R.string.terms2), + it.slug, it.app_type) + else + openPageLink(tv.context, tv.context.getString(R.string.terms_and_conditions), + it.slug, it.app_type) + } + }*/ + } + + override fun updateDrawState(ds: TextPaint) {// override updateDrawState + ds.isUnderlineText = false // set to false to remove underline + } +} + + +fun getAddress(place: Place): String { + val finalAddress: String + val name = place.name.toString() + val placeAddress = place.address.toString() + + if (place.address?.contains(name) == true) { + finalAddress = placeAddress + } else { + finalAddress = "$name, $placeAddress" + } + return finalAddress +} + +fun getCity(place: Place,context: Context): String { + var finalAddress: String = "" + + try { + + val geocoder = Geocoder(context, Locale.getDefault()) + var addresses: List
= ArrayList() + addresses = geocoder.getFromLocation(place.latLng!!.latitude, place.latLng!!.longitude, 1)!! + finalAddress = addresses[0].locality + + }catch (e: Exception){ + + } + return finalAddress +} + + +fun slideRecyclerItem(viewToAnimate: View, context: Context) { + val animation: Animation = AnimationUtils.loadAnimation(context, R.anim.slide_out_bottom) + viewToAnimate.startAnimation(animation) +} + +/*Share*/ +fun shareDeepLink(deepLink: String, activity: Activity, userData: UserData?) { + val progressDialog = ProgressDialog(activity) + progressDialog.setLoading(true) + + val longLink = "${Config.baseURL}${deepLink}" + Log.e("longLink",longLink) + + val shortLinkTask = Firebase.dynamicLinks.shortLinkAsync { + link = Uri.parse(longLink) + domainUriPrefix = "https://${activity.getString(R.string.deep_link_url)}" + // Open links with this app on Android + androidParameters(BuildConfig.APPLICATION_ID) { } + // Open links with com.example.ios on iOS + iosParameters(activity.getString(R.string.deep_link_ios_bundle)) { } + + socialMetaTagParameters { + title = activity.getString(R.string.app_name) + description = activity.getString(R.string.invite_text) + imageUrl = Uri.parse(getImageBaseUrl(ImageFolder.UPLOADS, appClientDetails.applogo)) + } + }.addOnSuccessListener { result -> + progressDialog.setLoading(false) + + // Short link created + val shortLink = result.shortLink + + /*Share Intent*/ + val shareIntent = Intent() + shareIntent.action = Intent.ACTION_SEND + shareIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.share)) + + val completeMsg = if (appFeatures.needInviteCode) + "${activity.getString(R.string.app_name)}\n$shortLink\n" + + "${activity.getString(R.string.use_code, userData?.reference_code)}" + else + "${activity.getString(R.string.app_name)}\n$shortLink" + + shareIntent.putExtra(Intent.EXTRA_TEXT, completeMsg) + + shareIntent.type = "text/plain" + shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) + activity.startActivity(Intent.createChooser(shareIntent, activity.getString(R.string.share))) + + }.addOnFailureListener { + // Error + //ivShare.showSnackBar(getString(R.string.error)) + Log.e("errorInviteLink",it.toString()) + progressDialog.setLoading(false) + } +} + + +fun askForOption(fragment: Fragment?, activity: Activity, view: View) { + val context: Context = fragment?.requireContext() ?: activity + + val popup = PopupMenu(context, view) + popup.menuInflater.inflate(R.menu.menu_attach, popup.menu) + + popup.setOnMenuItemClickListener { item -> + when (item.itemId) { + R.id.item_image -> { + selectImages(fragment, activity) + } + R.id.item_pdf -> { + selectDocument(fragment, activity) + } + } + true + } + + popup.show() +} + + +fun askForImageOption(fragment: Fragment?, activity: Activity, view: View) { + val context: Context = fragment?.requireContext() ?: activity + + val popup = PopupMenu(context, view) + popup.menuInflater.inflate(R.menu.menu_image_attach, popup.menu) + + popup.setOnMenuItemClickListener { item -> + when (item.itemId) { + R.id.item_image -> { + selectImages(fragment, activity) + } + R.id.item_camera -> { + selectDocument(fragment, activity) + } + } + true + } + + popup.show() +} + +fun selectImages(fragment: Fragment?, activity: Activity) { + /* val filePickerBuilder = FilePickerBuilder.instance + .setMaxCount(1) + .setActivityTheme(R.style.LibAppTheme) + .setActivityTitle(activity.getString(R.string.select_image)) + .enableVideoPicker(false) + .enableCameraSupport(false) + .showGifs(false) + .showFolderView(true) + .enableSelectAll(false) + .enableImagePicker(true) + .setCameraPlaceholder(R.drawable.ic_camera) + .withOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) + + if (fragment != null) + filePickerBuilder.pickPhoto(fragment, AppRequestCode.IMAGE_PICKER) + else + filePickerBuilder.pickPhoto(activity, AppRequestCode.IMAGE_PICKER)*/ +} + +fun selectDocument(fragment: Fragment?, activity: Activity) { + /* val pdfs = arrayOf("pdf") + + val filePickerBuilder = FilePickerBuilder.Companion.instance + .setMaxCount(1) + .setActivityTheme(R.style.LibAppTheme) + .sortDocumentsBy(SortingTypes.NAME) + .setActivityTitle(activity.getString(R.string.select_document)) + .addFileSupport(activity.getString(R.string.pdf), pdfs, R.drawable.ic_pdf) + .showFolderView(true) + .enableDocSupport(false) + .withOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) + + if (fragment != null) + filePickerBuilder.pickFile(fragment, AppRequestCode.DOC_PICKER) + else + filePickerBuilder.pickFile(activity, AppRequestCode.DOC_PICKER)*/ +} + +fun mapIntent(activity: Activity, name: String, lat: Double, lng: Double) { + try { + val url = "http://maps.google.com/maps?daddr=$lat,$lng($name)" + val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url)) + intent.setPackage("com.google.android.apps.maps") + + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) + activity.startActivity(intent) + } catch (e: Exception) { + + activity.longToast(activity.getString(R.string.map_not_found)) + } +} + + +fun getWaterLiters(activity: Activity, value: Int, unitNeeded: Boolean): String { + val valueInLiters = String.format(Locale.ENGLISH, "%.3f", value / 1000.0) + + return if (unitNeeded) { + if (value < 1000) + "$value ${activity.getString(R.string.ml)}" + else + "${valueInLiters.removeSuffix(".000")} ${activity.getString(R.string.lt)}" + } else valueInLiters.removeSuffix(".000") +} + +fun getWaterUnit(activity: Activity, value: Double, unitNeeded: Boolean): String { + val valueInLiters = String.format(Locale.ENGLISH, "%.3f", value) + + return if (unitNeeded) { + if (value < 1) + "$value ${activity.getString(R.string.ml)}" + else + "${valueInLiters.removeSuffix(".000")} ${activity.getString(R.string.lt)}" + } else valueInLiters.removeSuffix(".000") +} + +fun getProteinUnit(activity: Activity, value: Int, unitNeeded: Boolean): String { + val valueUnit = String.format(Locale.ENGLISH, "%.2f", value / 1000.0) + + return if (unitNeeded) { + if (value < 1000) + "$value ${activity.getString(R.string.g)}" + else + "${valueUnit.removeSuffix(".000")} ${activity.getString(R.string.kg)}" + } else valueUnit.removeSuffix(".000") +} + + +fun openPdf(activity: Activity, link: String, prescription: Boolean = false) { + + if (prescription) + activity.startActivity(Intent(activity, WebViewActivity::class.java) + .putExtra(WebViewActivity.LINK_TITLE, activity.getString(R.string.prescription_details)) + .putExtra(WebViewActivity.PDF_LINK, link)) + else { + val browserIntent = Intent(Intent.ACTION_VIEW, Uri.parse(link)) + if (activity.packageName.equals(BuildConfig.APPLICATION_ID)) + activity.startActivity(browserIntent) + } +} + +fun bitmapDescriptorFromVector(context: Context, vectorResId: Int): BitmapDescriptor? { + return ContextCompat.getDrawable(context, vectorResId)?.run { + setBounds(0, 0, intrinsicWidth, intrinsicHeight) + val bitmap = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888) + draw(Canvas(bitmap)) + BitmapDescriptorFactory.fromBitmap(bitmap) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/InputFilterDecimal.kt b/app/src/main/java/com/consultantvendor/utils/InputFilterDecimal.kt new file mode 100644 index 0000000..423e12b --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/InputFilterDecimal.kt @@ -0,0 +1,36 @@ +package com.consultantvendor.utils + +import android.text.Spanned +import android.text.method.DigitsKeyListener + +class InputFilterDecimal : DigitsKeyListener(java.lang.Boolean.FALSE, java.lang.Boolean.TRUE) { + + private val beforeDecimal: Int + private val afterDecimal: Int + + init { + this.beforeDecimal = 10 + this.afterDecimal = 3 + } + + override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence { + val builder = StringBuilder(dest) + builder.insert(dstart, source) + val temp = builder.toString() + + if (temp.trim { it <= ' ' } == " ") { + return "" + } else if (temp.indexOf('.') == -1) { + if (temp.length > beforeDecimal) { + return "" + } + } else { + if (temp.substring(0, temp.indexOf('.')).length > beforeDecimal || temp.substring(temp.indexOf('.') + 1, temp.length).length > afterDecimal) { + return "" + } + } + + return super.filter(source, start, end, dest, dstart, dend) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/InputFilterMinMax.kt b/app/src/main/java/com/consultantvendor/utils/InputFilterMinMax.kt new file mode 100644 index 0000000..d08b090 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/InputFilterMinMax.kt @@ -0,0 +1,36 @@ +package com.consultantvendor.utils + +import android.text.InputFilter +import android.text.Spanned + +class InputFilterMinMax : InputFilter { + private var min: Int + private var max: Int + + constructor(min: Int, max: Int) { + this.min = min + this.max = max + } + + constructor(min: String, max: String) { + this.min = min.toInt() + this.max = max.toInt() + } + + override fun filter(source: CharSequence, start: Int, end: Int, dest: Spanned, dstart: Int, dend: Int): CharSequence? { + try { + // Remove the string out of destination that is to be replaced + var newVal = dest.toString().substring(0, dstart) + dest.toString().substring(dend, dest.toString().length) + // Add the new string in + newVal = newVal.substring(0, dstart) + source.toString() + newVal.substring(dstart, newVal.length) + val input = newVal.toInt() + if (isInRange(min, max, input)) return null + } catch (nfe: java.lang.NumberFormatException) { + } + return "" + } + + private fun isInRange(a: Int, b: Int, c: Int): Boolean { + return if (b > a) c in a..b else c in b..a + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/LocaleHelper.kt b/app/src/main/java/com/consultantvendor/utils/LocaleHelper.kt new file mode 100644 index 0000000..ae9f16a --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/LocaleHelper.kt @@ -0,0 +1,55 @@ +package com.consultantvendor.utils + +import android.content.Context +import android.preference.PreferenceManager +import java.util.* + + +/** + * Created by cbl29 on 22/2/17. + */ +object LocaleHelper { + + fun onCreate(context: Context): Context { + val lang = PreferenceManager.getDefaultSharedPreferences(context).getString(USER_LANGUAGE, "")?:"" + return updateResources(context, lang) + } + + fun onCreate(context: Context, defaultLanguage: String) { + val lang = getPersistedData(context, defaultLanguage) + //setLocale(context, lang) + } + + fun getLanguage(context: Context): String { + return getPersistedData( + context, + Locale.getDefault().language + ) + } + + fun setLocale(context: Context, language: String, prefsManager: PrefsManager) { + persist(context, language, prefsManager) + updateResources(context, language) + } + + private fun getPersistedData(context: Context, defaultLanguage: String): String { + //return PrefsManager.get().getString(USER_LANGUAGE, "en") + return "" + } + + private fun persist(context: Context, language: String, prefsManager: PrefsManager) { + prefsManager.save(language, USER_LANGUAGE) + } + + private fun updateResources(context: Context, language: String): Context { + val locale = Locale(language) + Locale.setDefault(locale) + val resources = context.resources + val configuration = resources.configuration + configuration.setLocale(locale) + configuration.setLayoutDirection(locale) + resources.updateConfiguration(configuration, resources.displayMetrics) + return context.createConfigurationContext(configuration) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/NavigationExtensions.kt b/app/src/main/java/com/consultantvendor/utils/NavigationExtensions.kt new file mode 100644 index 0000000..d668830 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/NavigationExtensions.kt @@ -0,0 +1,222 @@ +/* + * Copyright 2019, The Android Open Source Project + * + * 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. + */ + +package com.consultantvendor.utils + +import android.content.Intent +import android.util.SparseArray +import androidx.fragment.app.FragmentManager +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import androidx.navigation.NavController +import androidx.navigation.fragment.NavHostFragment +import com.consultantvendor.R +import com.google.android.material.bottomnavigation.BottomNavigationView + +/** + * Manages the various graphs needed for a [BottomNavigationView]. + * + * This sample is a workaround until the Navigation Component supports multiple back stacks. + */ +fun BottomNavigationView.setupWithNavController( + navGraphIds: List, + fragmentManager: FragmentManager, + containerId: Int, + intent: Intent): LiveData { + + // Map of tags + val graphIdToTagMap = SparseArray() + // Result. Mutable live data with the selected controlled + val selectedNavController = MutableLiveData() + + var firstFragmentGraphId = 0 + + // First create a NavHostFragment for each NavGraph ID + navGraphIds.forEachIndexed { index, navGraphId -> + val fragmentTag = getFragmentTag(index) + + // Find or create the Navigation host fragment + val navHostFragment = obtainNavHostFragment( + fragmentManager, + fragmentTag, + navGraphId, + containerId + ) + + // Obtain its id + val graphId = navHostFragment.navController.graph.id + + if (index == 0) { + firstFragmentGraphId = graphId + } + + // Save to the map + graphIdToTagMap.put(graphId, fragmentTag) + + // Attach or detach nav host fragment depending on whether it's the selected item. + if (this.selectedItemId == graphId) { + // Update livedata with the selected graph + selectedNavController.value = navHostFragment.navController + attachNavHostFragment(fragmentManager, navHostFragment, index == 0) + } else { + detachNavHostFragment(fragmentManager, navHostFragment) + } + } + + // Now connect selecting an item with swapping Fragments + var selectedItemTag = graphIdToTagMap[this.selectedItemId] + val firstFragmentTag = graphIdToTagMap[firstFragmentGraphId] + var isOnFirstFragment = selectedItemTag == firstFragmentTag + + // For the navigation item that is selected... + setOnNavigationItemSelectedListener { item -> + // Don't do anything if the state is state has already been saved. + if (fragmentManager.isStateSaved) { + false + } else { + val newlySelectedItemTag = graphIdToTagMap[item.itemId] + if (selectedItemTag != newlySelectedItemTag) { + // Pop everything above the first fragment (the "fixed start destination") + fragmentManager.popBackStack( + firstFragmentTag, + FragmentManager.POP_BACK_STACK_INCLUSIVE + ) + val selectedFragment = fragmentManager.findFragmentByTag(newlySelectedItemTag) + as NavHostFragment + + // Exclude the first fragment tag because it's always in the back stack. + if (firstFragmentTag != newlySelectedItemTag) { + // Commit a transaction that cleans the back stack and adds the first fragment + // to it, creating the fixed started destination. + fragmentManager.beginTransaction() + .attach(selectedFragment) + .setPrimaryNavigationFragment(selectedFragment) + .apply { + // Detach all other Fragments + for (i in 0 until graphIdToTagMap.size()) { + if (graphIdToTagMap.get(i) != newlySelectedItemTag) { + detach(fragmentManager.findFragmentByTag(firstFragmentTag)!!) + } + } + } + .addToBackStack(firstFragmentTag) + .setCustomAnimations( + R.anim.nav_default_enter_anim, + R.anim.nav_default_exit_anim, + R.anim.nav_default_pop_enter_anim, + R.anim.nav_default_pop_exit_anim + ) + .setReorderingAllowed(true) + .commit() + } + selectedItemTag = newlySelectedItemTag + isOnFirstFragment = selectedItemTag == firstFragmentTag + selectedNavController.value = selectedFragment.navController + true + } else { + false + } + } + } + + // handle deep link + navGraphIds.forEachIndexed { index, navGraphId -> + val fragmentTag = getFragmentTag(index) + + // Find or create the Navigation host fragment + val navHostFragment = obtainNavHostFragment( + fragmentManager, + fragmentTag, + navGraphId, + containerId + ) + // Handle Intent + if (navHostFragment.navController.handleDeepLink(intent)) { + this.selectedItemId = navHostFragment.navController.graph.id + } + } + + // Finally, ensure that we update our BottomNavigationView when the back stack changes + fragmentManager.addOnBackStackChangedListener { + if (!isOnFirstFragment && !fragmentManager.isOnBackStack(firstFragmentTag)) { + this.selectedItemId = firstFragmentGraphId + } + + // Reset the graph if the currentDestination is not valid (happens when the back + // stack is popped after using the back button). + selectedNavController.value?.let { controller -> + if (controller.currentDestination == null) { + controller.navigate(controller.graph.id) + } + } + } + return selectedNavController +} + +private fun detachNavHostFragment( + fragmentManager: FragmentManager, + navHostFragment: NavHostFragment +) { + fragmentManager.beginTransaction() + .detach(navHostFragment) + .commitNow() +} + +private fun attachNavHostFragment( + fragmentManager: FragmentManager, + navHostFragment: NavHostFragment, + isPrimaryNavFragment: Boolean +) { + fragmentManager.beginTransaction() + .attach(navHostFragment) + .apply { + if (isPrimaryNavFragment) { + setPrimaryNavigationFragment(navHostFragment) + } + } + .commitNow() + +} + +private fun obtainNavHostFragment( + fragmentManager: FragmentManager, + fragmentTag: String, + navGraphId: Int, + containerId: Int +): NavHostFragment { + // If the Nav Host fragment exists, return it + val existingFragment = fragmentManager.findFragmentByTag(fragmentTag) as NavHostFragment? + existingFragment?.let { return it } + + // Otherwise, create it and return it. + val navHostFragment = NavHostFragment.create(navGraphId) + fragmentManager.beginTransaction() + .add(containerId, navHostFragment, fragmentTag) + .commitNow() + return navHostFragment +} + +private fun FragmentManager.isOnBackStack(backStackName: String): Boolean { + val backStackCount = backStackEntryCount + for (index in 0 until backStackCount) { + if (getBackStackEntryAt(index).name == backStackName) { + return true + } + } + return false +} + +private fun getFragmentTag(index: Int) = "bottomNavigation#$index" diff --git a/app/src/main/java/com/consultantvendor/utils/PermissionUtils.kt b/app/src/main/java/com/consultantvendor/utils/PermissionUtils.kt new file mode 100644 index 0000000..ab36393 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/PermissionUtils.kt @@ -0,0 +1,38 @@ +package com.consultantvendor.utils + +import android.content.Context +import android.content.Intent +import android.net.Uri +import android.provider.Settings +import androidx.annotation.StringRes +import androidx.appcompat.app.AlertDialog +import com.consultantvendor.BuildConfig +import com.consultantvendor.R +import permissions.dispatcher.PermissionRequest + +object PermissionUtils { + fun showRationalDialog(context: Context, @StringRes messageResId: Int, request: PermissionRequest) { + AlertDialog.Builder(context) + .setPositiveButton(context.getString(R.string.allow), { _, _ -> request.proceed() }) + .setNegativeButton(context.getString(R.string.deny), { _, _ -> request.cancel() }) + .setCancelable(false) + .setMessage(messageResId) + .show() + } + + fun showAppSettingsDialog(context: Context, @StringRes messageResId: Int) { + AlertDialog.Builder(context) + .setPositiveButton(context.getString(R.string.settings)) { _, _ -> + val intent = Intent() + intent.action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS + intent.data = Uri.fromParts("package", context.packageName, null) + + if (context.packageName.equals(BuildConfig.APPLICATION_ID)) + context.startActivity(intent) + } + .setNegativeButton(android.R.string.cancel) { dialog, which -> dialog?.dismiss() } + .setCancelable(false) + .setMessage(messageResId) + .show() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/PrefsManager.kt b/app/src/main/java/com/consultantvendor/utils/PrefsManager.kt new file mode 100644 index 0000000..75daef8 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/PrefsManager.kt @@ -0,0 +1,139 @@ +package com.consultantvendor.utils + +import android.content.SharedPreferences +import androidx.annotation.StringDef +import com.google.gson.Gson +import java.util.concurrent.atomic.AtomicBoolean +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class PrefsManager @Inject constructor(private val preferences: SharedPreferences, private val gson: Gson) { + private val sharedPrefName = "ArabLife" + companion object { + const val PREF_PROFILE = "PREF_PROFILE" + const val PREF_API_TOKEN = "PREF_API_TOKEN" + const val NOTIFICATION_SOUND = "notification_sound_enabled" + const val KEY_CHANGE_FLAG = "is_notification_channel_needed" + @StringDef(PREF_PROFILE, PREF_API_TOKEN) + @Retention(AnnotationRetention.SOURCE) + annotation class PrefKey + private lateinit var instance: PrefsManager + private val isInitialized = + AtomicBoolean() // To check if instance was previously initialized or not + fun get(): PrefsManager = instance } + + fun save(@PrefKey key: String, value: String) { + preferences.edit().putString(key, value).apply() + } + + fun save(@PrefKey key: String, value: Int) { + preferences.edit().putInt(key, value).apply() + } + + fun save(@PrefKey key: String, value: Boolean) { + preferences.edit().putBoolean(key, value).apply() + } + + fun save(@PrefKey key: String, `object`: Any?) { + if (`object` == null) { + throw IllegalArgumentException("object is null") + } + + // Convert the provided object to JSON string + save(key, gson.toJson(`object`)) + } + + fun getString(@PrefKey key: String, defValue: String): String = + preferences.getString(key, defValue) ?:"" + + fun getInt(@PrefKey key: String, defValue: Int): Int = preferences.getInt(key, defValue) + + fun getFloat(@PrefKey key: String, defValue: Float): Float = preferences.getFloat(key, defValue) + + fun getBoolean(@PrefKey key: String, defValue: Boolean): Boolean = + preferences.getBoolean(key, defValue) + + fun getObject(@PrefKey key: String, objectClass: Class): T? { + val jsonString = preferences.getString(key, null) + return if (jsonString == null) { + null + } else { + try { + gson.fromJson(jsonString, objectClass) + } catch (e: Exception) { + throw IllegalArgumentException("Object stored with key $key is instance of other class") + } + } + } + + fun removeAll() { + preferences.edit().clear().apply() + } + + fun remove(key: String) { + preferences.edit().remove(key).apply() + } + + /** + * Store boolean in preference. + * + * @param key the key + * @param value the value + */ + fun storeBooleanInPreference(key: String, value: Boolean) { + save(key, value) + } + + /** + * Gets the boolean from preference. + * + * @param key the key + * @return boolean Value from preference + */ + fun getBooleanFromPreference(key: String): Boolean { + return getBoolean(key, false) + } + + /** + * Gets the int from preference. + * + * @param key the key + * @return String Value from preference + */ + fun getIntFromPreference(key: String): Int { + return getInt(key, 0) + } + + + /** + * Clear all preference. + */ + fun clearAllPreference() { + clearAllPreference() + } + + /** + * Store string in preference. + * + * @param key the key + * @param value the value + */ + fun storeStringInPreference(key: String, value: String?) { + save(key, value) + } + + /** + * Store int in preference. + * + * @param key the key + * @param value the value + */ + fun storeIntInPreference(key: String, value: Int) { + save(key, value) + } + + fun getBooleanFromPreferenceDefaultTrueValue(key: String): Boolean { + return getBoolean(key, true) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/dialogs/ProgressDialog.kt b/app/src/main/java/com/consultantvendor/utils/dialogs/ProgressDialog.kt new file mode 100644 index 0000000..8247963 --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/dialogs/ProgressDialog.kt @@ -0,0 +1,37 @@ +package com.consultantvendor.utils.dialogs + +import android.app.Activity +import android.app.Dialog +import android.view.View +import android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND +import com.consultantvendor.R + +class ProgressDialog() { + + private lateinit var dialog: Dialog + + constructor(context: Activity) : this() { + val dialogView = View.inflate(context, R.layout.dialog_progress, null) + dialog = Dialog(context, R.style.CustomDialog) + dialog.window?.clearFlags(FLAG_DIM_BEHIND) + dialog.setContentView(dialogView) + dialog.setCancelable(false) + } + + private fun show() { + if (!dialog.isShowing) + dialog.show() + } + + private fun dismiss() { + if (dialog.isShowing) + dialog.dismiss() + } + + fun setLoading(isLoading: Boolean) { + if (isLoading) + show() + else + dismiss() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/consultantvendor/utils/dialogs/ProgressDialogImage.kt b/app/src/main/java/com/consultantvendor/utils/dialogs/ProgressDialogImage.kt new file mode 100644 index 0000000..2072fda --- /dev/null +++ b/app/src/main/java/com/consultantvendor/utils/dialogs/ProgressDialogImage.kt @@ -0,0 +1,37 @@ +package com.consultantvendor.utils.dialogs + +import android.app.Activity +import android.app.Dialog +import android.view.View +import android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND +import com.consultantvendor.R + +class ProgressDialogImage() { + + private lateinit var dialog: Dialog + + constructor(context: Activity) : this() { + val dialogView = View.inflate(context, R.layout.dialog_progress_image, null) + dialog = Dialog(context, R.style.CustomDialog) + dialog.window?.clearFlags(FLAG_DIM_BEHIND) + dialog.setContentView(dialogView) + dialog.setCancelable(false) + } + + private fun show() { + if (!dialog.isShowing) + dialog.show() + } + + private fun dismiss() { + if (dialog.isShowing) + dialog.dismiss() + } + + fun setLoading(isLoading: Boolean) { + if (isLoading) + show() + else + dismiss() + } +} \ No newline at end of file diff --git a/app/src/main/res/anim/slide_out_bottom.xml b/app/src/main/res/anim/slide_out_bottom.xml new file mode 100644 index 0000000..0b81b64 --- /dev/null +++ b/app/src/main/res/anim/slide_out_bottom.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/anim/up_to_down.xml b/app/src/main/res/anim/up_to_down.xml new file mode 100644 index 0000000..789aa21 --- /dev/null +++ b/app/src/main/res/anim/up_to_down.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_date_text_color.xml b/app/src/main/res/color/selector_date_text_color.xml new file mode 100644 index 0000000..6af49a1 --- /dev/null +++ b/app/src/main/res/color/selector_date_text_color.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_language_text_color.xml b/app/src/main/res/color/selector_language_text_color.xml new file mode 100644 index 0000000..889bb07 --- /dev/null +++ b/app/src/main/res/color/selector_language_text_color.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_date_color.xml b/app/src/main/res/color/selector_text_date_color.xml new file mode 100644 index 0000000..a584b93 --- /dev/null +++ b/app/src/main/res/color/selector_text_date_color.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_service.xml b/app/src/main/res/color/selector_text_service.xml new file mode 100644 index 0000000..869a1b5 --- /dev/null +++ b/app/src/main/res/color/selector_text_service.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_white_black.xml b/app/src/main/res/color/selector_text_white_black.xml new file mode 100644 index 0000000..c49f523 --- /dev/null +++ b/app/src/main/res/color/selector_text_white_black.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/color/selector_text_white_theme.xml b/app/src/main/res/color/selector_text_white_theme.xml new file mode 100644 index 0000000..889bb07 --- /dev/null +++ b/app/src/main/res/color/selector_text_white_theme.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/checked.png b/app/src/main/res/drawable-hdpi/checked.png new file mode 100644 index 0000000..5fc98fe Binary files /dev/null and b/app/src/main/res/drawable-hdpi/checked.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_account.png b/app/src/main/res/drawable-hdpi/ic_account.png new file mode 100644 index 0000000..4b3b20d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_account_active.png b/app/src/main/res/drawable-hdpi/ic_account_active.png new file mode 100644 index 0000000..fb011c2 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_banner.png b/app/src/main/res/drawable-hdpi/ic_banner.png new file mode 100644 index 0000000..c8ec536 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_banner.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-hdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..8177487 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_chat_empty.png b/app/src/main/res/drawable-hdpi/ic_chat_empty.png new file mode 100644 index 0000000..c8a8e2f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_digital.png b/app/src/main/res/drawable-hdpi/ic_digital.png new file mode 100644 index 0000000..1a2470e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_digital.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_doctor.png b/app/src/main/res/drawable-hdpi/ic_doctor.png new file mode 100644 index 0000000..d9646f7 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_facebbok.png b/app/src/main/res/drawable-hdpi/ic_facebbok.png new file mode 100644 index 0000000..adf8fc1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_google.png b/app/src/main/res/drawable-hdpi/ic_google.png new file mode 100644 index 0000000..37eaa95 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_home.png b/app/src/main/res/drawable-hdpi/ic_home.png new file mode 100644 index 0000000..03439e4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_home_active.png b/app/src/main/res/drawable-hdpi/ic_home_active.png new file mode 100644 index 0000000..66b5380 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_img_empty_state.png b/app/src/main/res/drawable-hdpi/ic_img_empty_state.png new file mode 100644 index 0000000..fd08620 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_like_red.png b/app/src/main/res/drawable-hdpi/ic_like_red.png new file mode 100644 index 0000000..47c21b9 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_like_white.png b/app/src/main/res/drawable-hdpi/ic_like_white.png new file mode 100644 index 0000000..cc04b95 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_manual.png b/app/src/main/res/drawable-hdpi/ic_manual.png new file mode 100644 index 0000000..eec1437 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_manual.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_more.png b/app/src/main/res/drawable-hdpi/ic_more.png new file mode 100644 index 0000000..abad534 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_notifications_empty.png b/app/src/main/res/drawable-hdpi/ic_notifications_empty.png new file mode 100644 index 0000000..31c003e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_patient.png b/app/src/main/res/drawable-hdpi/ic_patient.png new file mode 100644 index 0000000..f3e5b25 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_payments.png b/app/src/main/res/drawable-hdpi/ic_payments.png new file mode 100644 index 0000000..ccbb9e0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_payments.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-hdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..bcc82ed Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-hdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..b5c7353 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-hdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..cd68a5d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_revenue.png b/app/src/main/res/drawable-hdpi/ic_revenue.png new file mode 100644 index 0000000..0328ea4 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_revenue.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_revenue_active.png b/app/src/main/res/drawable-hdpi/ic_revenue_active.png new file mode 100644 index 0000000..c1c6327 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_revenue_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_search.png b/app/src/main/res/drawable-hdpi/ic_search.png new file mode 100644 index 0000000..5318e31 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_speaker.png b/app/src/main/res/drawable-hdpi/ic_speaker.png new file mode 100644 index 0000000..264bd5a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_speaker.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_speaker_off.png b/app/src/main/res/drawable-hdpi/ic_speaker_off.png new file mode 100644 index 0000000..d603e58 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_speaker_off.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_star.png b/app/src/main/res/drawable-hdpi/ic_star.png new file mode 100644 index 0000000..ff62d75 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_wallet_active.png b/app/src/main/res/drawable-hdpi/ic_wallet_active.png new file mode 100644 index 0000000..8077ac6 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_wallet_active.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_wallet_empty.png b/app/src/main/res/drawable-hdpi/ic_wallet_empty.png new file mode 100644 index 0000000..86d382e Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-mdpi/checked.png b/app/src/main/res/drawable-mdpi/checked.png new file mode 100644 index 0000000..76657c0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/checked.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_account.png b/app/src/main/res/drawable-mdpi/ic_account.png new file mode 100644 index 0000000..480e31b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_account_active.png b/app/src/main/res/drawable-mdpi/ic_account_active.png new file mode 100644 index 0000000..55f228a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_banner.png b/app/src/main/res/drawable-mdpi/ic_banner.png new file mode 100644 index 0000000..e6b43b1 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_banner.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-mdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..61d68bd Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_chat_empty.png b/app/src/main/res/drawable-mdpi/ic_chat_empty.png new file mode 100644 index 0000000..6d81412 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_digital.png b/app/src/main/res/drawable-mdpi/ic_digital.png new file mode 100644 index 0000000..48b766a Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_digital.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_doctor.png b/app/src/main/res/drawable-mdpi/ic_doctor.png new file mode 100644 index 0000000..30659bc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_facebbok.png b/app/src/main/res/drawable-mdpi/ic_facebbok.png new file mode 100644 index 0000000..d59cb54 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_google.png b/app/src/main/res/drawable-mdpi/ic_google.png new file mode 100644 index 0000000..18fbf89 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_home.png b/app/src/main/res/drawable-mdpi/ic_home.png new file mode 100644 index 0000000..f659430 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_home_active.png b/app/src/main/res/drawable-mdpi/ic_home_active.png new file mode 100644 index 0000000..0de6529 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_img_empty_state.png b/app/src/main/res/drawable-mdpi/ic_img_empty_state.png new file mode 100644 index 0000000..ad7ce31 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_like_red.png b/app/src/main/res/drawable-mdpi/ic_like_red.png new file mode 100644 index 0000000..97723d3 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_like_white.png b/app/src/main/res/drawable-mdpi/ic_like_white.png new file mode 100644 index 0000000..3d4e455 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_manual.png b/app/src/main/res/drawable-mdpi/ic_manual.png new file mode 100644 index 0000000..a851be7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_manual.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_more.png b/app/src/main/res/drawable-mdpi/ic_more.png new file mode 100644 index 0000000..effb085 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_notifications_empty.png b/app/src/main/res/drawable-mdpi/ic_notifications_empty.png new file mode 100644 index 0000000..12f20e0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_patient.png b/app/src/main/res/drawable-mdpi/ic_patient.png new file mode 100644 index 0000000..0d00bfc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_payments.png b/app/src/main/res/drawable-mdpi/ic_payments.png new file mode 100644 index 0000000..fb2f5e7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_payments.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-mdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..f6768d7 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-mdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..9d9ebf0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-mdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..95ca5c2 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_revenue.png b/app/src/main/res/drawable-mdpi/ic_revenue.png new file mode 100644 index 0000000..1e43fb9 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_revenue.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_revenue_active.png b/app/src/main/res/drawable-mdpi/ic_revenue_active.png new file mode 100644 index 0000000..21fa43f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_revenue_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_search.png b/app/src/main/res/drawable-mdpi/ic_search.png new file mode 100644 index 0000000..316501b Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_speaker.png b/app/src/main/res/drawable-mdpi/ic_speaker.png new file mode 100644 index 0000000..e9c8395 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_speaker.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_speaker_off.png b/app/src/main/res/drawable-mdpi/ic_speaker_off.png new file mode 100644 index 0000000..0c192c5 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_speaker_off.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_star.png b/app/src/main/res/drawable-mdpi/ic_star.png new file mode 100644 index 0000000..b758b1f Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_wallet_active.png b/app/src/main/res/drawable-mdpi/ic_wallet_active.png new file mode 100644 index 0000000..f91fa24 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_wallet_active.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_wallet_empty.png b/app/src/main/res/drawable-mdpi/ic_wallet_empty.png new file mode 100644 index 0000000..633e2b8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable-xhdpi/checked.png b/app/src/main/res/drawable-xhdpi/checked.png new file mode 100644 index 0000000..4025be3 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/checked.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_account.png b/app/src/main/res/drawable-xhdpi/ic_account.png new file mode 100644 index 0000000..e284cb2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_account_active.png b/app/src/main/res/drawable-xhdpi/ic_account_active.png new file mode 100644 index 0000000..95009c2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_banner.png b/app/src/main/res/drawable-xhdpi/ic_banner.png new file mode 100644 index 0000000..d0b98d9 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_banner.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-xhdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..7432195 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_chat_empty.png b/app/src/main/res/drawable-xhdpi/ic_chat_empty.png new file mode 100644 index 0000000..699f942 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_digital.png b/app/src/main/res/drawable-xhdpi/ic_digital.png new file mode 100644 index 0000000..80f70e2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_digital.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_doctor.png b/app/src/main/res/drawable-xhdpi/ic_doctor.png new file mode 100644 index 0000000..8915fe7 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_facebbok.png b/app/src/main/res/drawable-xhdpi/ic_facebbok.png new file mode 100644 index 0000000..dc13920 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_google.png b/app/src/main/res/drawable-xhdpi/ic_google.png new file mode 100644 index 0000000..91854f0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_home.png b/app/src/main/res/drawable-xhdpi/ic_home.png new file mode 100644 index 0000000..a01702f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_home_active.png b/app/src/main/res/drawable-xhdpi/ic_home_active.png new file mode 100644 index 0000000..c0d4156 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_img_empty_state.png b/app/src/main/res/drawable-xhdpi/ic_img_empty_state.png new file mode 100644 index 0000000..e17c1b5 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_like_red.png b/app/src/main/res/drawable-xhdpi/ic_like_red.png new file mode 100644 index 0000000..87ebd62 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_like_white.png b/app/src/main/res/drawable-xhdpi/ic_like_white.png new file mode 100644 index 0000000..4a6eebb Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_manual.png b/app/src/main/res/drawable-xhdpi/ic_manual.png new file mode 100644 index 0000000..d260a83 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_manual.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_more.png b/app/src/main/res/drawable-xhdpi/ic_more.png new file mode 100644 index 0000000..9e6eb1f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_notifications_empty.png b/app/src/main/res/drawable-xhdpi/ic_notifications_empty.png new file mode 100644 index 0000000..77ebb26 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_patient.png b/app/src/main/res/drawable-xhdpi/ic_patient.png new file mode 100644 index 0000000..f6b1e91 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_payments.png b/app/src/main/res/drawable-xhdpi/ic_payments.png new file mode 100644 index 0000000..18eaa84 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_payments.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-xhdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..fdf59d6 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-xhdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..0f1b290 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-xhdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..7f6c222 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_revenue.png b/app/src/main/res/drawable-xhdpi/ic_revenue.png new file mode 100644 index 0000000..7b53bfd Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_revenue.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_revenue_active.png b/app/src/main/res/drawable-xhdpi/ic_revenue_active.png new file mode 100644 index 0000000..9e9e144 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_revenue_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_search.png b/app/src/main/res/drawable-xhdpi/ic_search.png new file mode 100644 index 0000000..c53ac0a Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_speaker.png b/app/src/main/res/drawable-xhdpi/ic_speaker.png new file mode 100644 index 0000000..589a2a2 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_speaker.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_speaker_off.png b/app/src/main/res/drawable-xhdpi/ic_speaker_off.png new file mode 100644 index 0000000..a06984f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_speaker_off.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_star.png b/app/src/main/res/drawable-xhdpi/ic_star.png new file mode 100644 index 0000000..0877289 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_active.png b/app/src/main/res/drawable-xhdpi/ic_wallet_active.png new file mode 100644 index 0000000..71c73ac Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_wallet_active.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_wallet_empty.png b/app/src/main/res/drawable-xhdpi/ic_wallet_empty.png new file mode 100644 index 0000000..082143b Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/checked.png b/app/src/main/res/drawable-xxhdpi/checked.png new file mode 100644 index 0000000..58b8296 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/checked.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_account.png b/app/src/main/res/drawable-xxhdpi/ic_account.png new file mode 100644 index 0000000..1257234 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_account_active.png b/app/src/main/res/drawable-xxhdpi/ic_account_active.png new file mode 100644 index 0000000..f36a98a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_banner.png b/app/src/main/res/drawable-xxhdpi/ic_banner.png new file mode 100644 index 0000000..ae2965d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_banner.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-xxhdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..b7e1b47 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_chat_empty.png b/app/src/main/res/drawable-xxhdpi/ic_chat_empty.png new file mode 100644 index 0000000..3cbfcf5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_digital.png b/app/src/main/res/drawable-xxhdpi/ic_digital.png new file mode 100644 index 0000000..fc4001e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_digital.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_doctor.png b/app/src/main/res/drawable-xxhdpi/ic_doctor.png new file mode 100644 index 0000000..e7ef48b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_facebbok.png b/app/src/main/res/drawable-xxhdpi/ic_facebbok.png new file mode 100644 index 0000000..b08d8fb Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_google.png b/app/src/main/res/drawable-xxhdpi/ic_google.png new file mode 100644 index 0000000..de103ec Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_home.png b/app/src/main/res/drawable-xxhdpi/ic_home.png new file mode 100644 index 0000000..5a659a5 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_home_active.png b/app/src/main/res/drawable-xxhdpi/ic_home_active.png new file mode 100644 index 0000000..7d73713 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_img_empty_state.png b/app/src/main/res/drawable-xxhdpi/ic_img_empty_state.png new file mode 100644 index 0000000..64e02b3 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_like_red.png b/app/src/main/res/drawable-xxhdpi/ic_like_red.png new file mode 100644 index 0000000..142eed8 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_like_white.png b/app/src/main/res/drawable-xxhdpi/ic_like_white.png new file mode 100644 index 0000000..2ab6dbe Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_manual.png b/app/src/main/res/drawable-xxhdpi/ic_manual.png new file mode 100644 index 0000000..bb0940d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_manual.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_more.png b/app/src/main/res/drawable-xxhdpi/ic_more.png new file mode 100644 index 0000000..92c4364 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_notifications_empty.png b/app/src/main/res/drawable-xxhdpi/ic_notifications_empty.png new file mode 100644 index 0000000..c771408 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_patient.png b/app/src/main/res/drawable-xxhdpi/ic_patient.png new file mode 100644 index 0000000..c427760 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_payments.png b/app/src/main/res/drawable-xxhdpi/ic_payments.png new file mode 100644 index 0000000..a9f0300 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_payments.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-xxhdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..d49590e Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-xxhdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..de5d8fd Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-xxhdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..a056a6a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_revenue.png b/app/src/main/res/drawable-xxhdpi/ic_revenue.png new file mode 100644 index 0000000..c93c750 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_revenue.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_revenue_active.png b/app/src/main/res/drawable-xxhdpi/ic_revenue_active.png new file mode 100644 index 0000000..fd68776 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_revenue_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_search.png b/app/src/main/res/drawable-xxhdpi/ic_search.png new file mode 100644 index 0000000..4bf277b Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_speaker.png b/app/src/main/res/drawable-xxhdpi/ic_speaker.png new file mode 100644 index 0000000..cb521db Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_speaker.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_speaker_off.png b/app/src/main/res/drawable-xxhdpi/ic_speaker_off.png new file mode 100644 index 0000000..a10d754 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_speaker_off.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_star.png b/app/src/main/res/drawable-xxhdpi/ic_star.png new file mode 100644 index 0000000..98d673a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_active.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_active.png new file mode 100644 index 0000000..9b67f2d Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_wallet_active.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_wallet_empty.png b/app/src/main/res/drawable-xxhdpi/ic_wallet_empty.png new file mode 100644 index 0000000..20c0bd1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/checked.png b/app/src/main/res/drawable-xxxhdpi/checked.png new file mode 100644 index 0000000..98ee4b2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/checked.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_account.png b/app/src/main/res/drawable-xxxhdpi/ic_account.png new file mode 100644 index 0000000..ebefe76 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_account.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_account_active.png b/app/src/main/res/drawable-xxxhdpi/ic_account_active.png new file mode 100644 index 0000000..e4c7c7d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_account_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_banner.png b/app/src/main/res/drawable-xxxhdpi/ic_banner.png new file mode 100644 index 0000000..2bd62cc Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_banner.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_cancel_call_red.png b/app/src/main/res/drawable-xxxhdpi/ic_cancel_call_red.png new file mode 100644 index 0000000..1bbc0ab Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_cancel_call_red.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_chat_empty.png b/app/src/main/res/drawable-xxxhdpi/ic_chat_empty.png new file mode 100644 index 0000000..22f0769 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_chat_empty.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_digital.png b/app/src/main/res/drawable-xxxhdpi/ic_digital.png new file mode 100644 index 0000000..18d9b44 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_digital.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_doctor.png b/app/src/main/res/drawable-xxxhdpi/ic_doctor.png new file mode 100644 index 0000000..cd27d9d Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_doctor.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_facebbok.png b/app/src/main/res/drawable-xxxhdpi/ic_facebbok.png new file mode 100644 index 0000000..7013eaf Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_facebbok.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_google.png b/app/src/main/res/drawable-xxxhdpi/ic_google.png new file mode 100644 index 0000000..1892a7a Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_google.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home.png b/app/src/main/res/drawable-xxxhdpi/ic_home.png new file mode 100644 index 0000000..360b654 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_home_active.png b/app/src/main/res/drawable-xxxhdpi/ic_home_active.png new file mode 100644 index 0000000..138ba08 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_home_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_img_empty_state.png b/app/src/main/res/drawable-xxxhdpi/ic_img_empty_state.png new file mode 100644 index 0000000..71f0aa6 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_img_empty_state.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_like_red.png b/app/src/main/res/drawable-xxxhdpi/ic_like_red.png new file mode 100644 index 0000000..d94dcb5 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_like_red.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_like_white.png b/app/src/main/res/drawable-xxxhdpi/ic_like_white.png new file mode 100644 index 0000000..20cbab6 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_like_white.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_manual.png b/app/src/main/res/drawable-xxxhdpi/ic_manual.png new file mode 100644 index 0000000..7c2c430 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_manual.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_more.png b/app/src/main/res/drawable-xxxhdpi/ic_more.png new file mode 100644 index 0000000..012dae5 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_more.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_notifications_empty.png b/app/src/main/res/drawable-xxxhdpi/ic_notifications_empty.png new file mode 100644 index 0000000..9497b2b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_notifications_empty.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_patient.png b/app/src/main/res/drawable-xxxhdpi/ic_patient.png new file mode 100644 index 0000000..80a05d7 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_patient.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_payments.png b/app/src/main/res/drawable-xxxhdpi/ic_payments.png new file mode 100644 index 0000000..d391e26 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_payments.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_profile_empty_state.png b/app/src/main/res/drawable-xxxhdpi/ic_profile_empty_state.png new file mode 100644 index 0000000..f3cadf8 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_profile_empty_state.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_profile_placeholder.png b/app/src/main/res/drawable-xxxhdpi/ic_profile_placeholder.png new file mode 100644 index 0000000..29f17ea Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_profile_placeholder.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_requests_empty_state.png b/app/src/main/res/drawable-xxxhdpi/ic_requests_empty_state.png new file mode 100644 index 0000000..ee9e2b2 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_requests_empty_state.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_revenue.png b/app/src/main/res/drawable-xxxhdpi/ic_revenue.png new file mode 100644 index 0000000..b648654 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_revenue.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_revenue_active.png b/app/src/main/res/drawable-xxxhdpi/ic_revenue_active.png new file mode 100644 index 0000000..22a9571 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_revenue_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_search.png b/app/src/main/res/drawable-xxxhdpi/ic_search.png new file mode 100644 index 0000000..fac9e8e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_search.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_speaker.png b/app/src/main/res/drawable-xxxhdpi/ic_speaker.png new file mode 100644 index 0000000..68c5eca Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_speaker.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_speaker_off.png b/app/src/main/res/drawable-xxxhdpi/ic_speaker_off.png new file mode 100644 index 0000000..11c767e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_speaker_off.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_star.png b/app/src/main/res/drawable-xxxhdpi/ic_star.png new file mode 100644 index 0000000..d51335c Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_star.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_active.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_active.png new file mode 100644 index 0000000..f34d35e Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_wallet_active.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_wallet_empty.png b/app/src/main/res/drawable-xxxhdpi/ic_wallet_empty.png new file mode 100644 index 0000000..7509904 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_wallet_empty.png differ diff --git a/app/src/main/res/drawable/drawabl_white_6.xml b/app/src/main/res/drawable/drawabl_white_6.xml new file mode 100644 index 0000000..b7a6586 --- /dev/null +++ b/app/src/main/res/drawable/drawabl_white_6.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_alternate_button.xml b/app/src/main/res/drawable/drawable_alternate_button.xml new file mode 100644 index 0000000..415e89c --- /dev/null +++ b/app/src/main/res/drawable/drawable_alternate_button.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_bg_button.xml b/app/src/main/res/drawable/drawable_bg_button.xml new file mode 100644 index 0000000..62eb068 --- /dev/null +++ b/app/src/main/res/drawable/drawable_bg_button.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_bg_button_wallet.xml b/app/src/main/res/drawable/drawable_bg_button_wallet.xml new file mode 100644 index 0000000..c75b56b --- /dev/null +++ b/app/src/main/res/drawable/drawable_bg_button_wallet.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_call_image.xml b/app/src/main/res/drawable/drawable_call_image.xml new file mode 100644 index 0000000..05d99ee --- /dev/null +++ b/app/src/main/res/drawable/drawable_call_image.xml @@ -0,0 +1,12 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_chat_left.xml b/app/src/main/res/drawable/drawable_chat_left.xml new file mode 100644 index 0000000..c2e8444 --- /dev/null +++ b/app/src/main/res/drawable/drawable_chat_left.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_chat_right.xml b/app/src/main/res/drawable/drawable_chat_right.xml new file mode 100644 index 0000000..ad09149 --- /dev/null +++ b/app/src/main/res/drawable/drawable_chat_right.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_chat_text.xml b/app/src/main/res/drawable/drawable_chat_text.xml new file mode 100644 index 0000000..890b883 --- /dev/null +++ b/app/src/main/res/drawable/drawable_chat_text.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_doase_left.xml b/app/src/main/res/drawable/drawable_doase_left.xml new file mode 100644 index 0000000..90be241 --- /dev/null +++ b/app/src/main/res/drawable/drawable_doase_left.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_doase_left_s.xml b/app/src/main/res/drawable/drawable_doase_left_s.xml new file mode 100644 index 0000000..f4df3ed --- /dev/null +++ b/app/src/main/res/drawable/drawable_doase_left_s.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_doase_midle.xml b/app/src/main/res/drawable/drawable_doase_midle.xml new file mode 100644 index 0000000..5513d8e --- /dev/null +++ b/app/src/main/res/drawable/drawable_doase_midle.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_doase_midle_s.xml b/app/src/main/res/drawable/drawable_doase_midle_s.xml new file mode 100644 index 0000000..06bf0aa --- /dev/null +++ b/app/src/main/res/drawable/drawable_doase_midle_s.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_doase_right.xml b/app/src/main/res/drawable/drawable_doase_right.xml new file mode 100644 index 0000000..33e87a1 --- /dev/null +++ b/app/src/main/res/drawable/drawable_doase_right.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_doase_right_s.xml b/app/src/main/res/drawable/drawable_doase_right_s.xml new file mode 100644 index 0000000..e2fefb1 --- /dev/null +++ b/app/src/main/res/drawable/drawable_doase_right_s.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_grey_stroke.xml b/app/src/main/res/drawable/drawable_grey_stroke.xml new file mode 100644 index 0000000..9e4f95a --- /dev/null +++ b/app/src/main/res/drawable/drawable_grey_stroke.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_language_selected.xml b/app/src/main/res/drawable/drawable_language_selected.xml new file mode 100644 index 0000000..f6c6707 --- /dev/null +++ b/app/src/main/res/drawable/drawable_language_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_language_unselected.xml b/app/src/main/res/drawable/drawable_language_unselected.xml new file mode 100644 index 0000000..70027d8 --- /dev/null +++ b/app/src/main/res/drawable/drawable_language_unselected.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_like_gredint.xml b/app/src/main/res/drawable/drawable_like_gredint.xml new file mode 100644 index 0000000..603c343 --- /dev/null +++ b/app/src/main/res/drawable/drawable_like_gredint.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_map_transparent.xml b/app/src/main/res/drawable/drawable_map_transparent.xml new file mode 100644 index 0000000..a5c60d5 --- /dev/null +++ b/app/src/main/res/drawable/drawable_map_transparent.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_notification.xml b/app/src/main/res/drawable/drawable_notification.xml new file mode 100644 index 0000000..4cba675 --- /dev/null +++ b/app/src/main/res/drawable/drawable_notification.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_notification_red.xml b/app/src/main/res/drawable/drawable_notification_red.xml new file mode 100644 index 0000000..7410e00 --- /dev/null +++ b/app/src/main/res/drawable/drawable_notification_red.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_rounded_top.xml b/app/src/main/res/drawable/drawable_rounded_top.xml new file mode 100644 index 0000000..839fd96 --- /dev/null +++ b/app/src/main/res/drawable/drawable_rounded_top.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_service_inactive.xml b/app/src/main/res/drawable/drawable_service_inactive.xml new file mode 100644 index 0000000..dca96e3 --- /dev/null +++ b/app/src/main/res/drawable/drawable_service_inactive.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_stroke_grey.xml b/app/src/main/res/drawable/drawable_stroke_grey.xml new file mode 100644 index 0000000..764b35c --- /dev/null +++ b/app/src/main/res/drawable/drawable_stroke_grey.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_stroke_inactive.xml b/app/src/main/res/drawable/drawable_stroke_inactive.xml new file mode 100644 index 0000000..9031c3d --- /dev/null +++ b/app/src/main/res/drawable/drawable_stroke_inactive.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_stroke_red_8.xml b/app/src/main/res/drawable/drawable_stroke_red_8.xml new file mode 100644 index 0000000..5250a63 --- /dev/null +++ b/app/src/main/res/drawable/drawable_stroke_red_8.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_stroke_reset.xml b/app/src/main/res/drawable/drawable_stroke_reset.xml new file mode 100644 index 0000000..d95651a --- /dev/null +++ b/app/src/main/res/drawable/drawable_stroke_reset.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme.xml b/app/src/main/res/drawable/drawable_theme.xml new file mode 100644 index 0000000..797ad75 --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_60.xml b/app/src/main/res/drawable/drawable_theme_60.xml new file mode 100644 index 0000000..a93b599 --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_60.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_8.xml b/app/src/main/res/drawable/drawable_theme_8.xml new file mode 100644 index 0000000..0863b9b --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_8.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_stroke.xml b/app/src/main/res/drawable/drawable_theme_stroke.xml new file mode 100644 index 0000000..9251c3a --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_stroke.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_stroke_4.xml b/app/src/main/res/drawable/drawable_theme_stroke_4.xml new file mode 100644 index 0000000..d73034c --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_stroke_4.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_stroke_60.xml b/app/src/main/res/drawable/drawable_theme_stroke_60.xml new file mode 100644 index 0000000..dd383bd --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_stroke_60.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_theme_trans_8.xml b/app/src/main/res/drawable/drawable_theme_trans_8.xml new file mode 100644 index 0000000..22438df --- /dev/null +++ b/app/src/main/res/drawable/drawable_theme_trans_8.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_walkthrough_selected.xml b/app/src/main/res/drawable/drawable_walkthrough_selected.xml new file mode 100644 index 0000000..a9475e1 --- /dev/null +++ b/app/src/main/res/drawable/drawable_walkthrough_selected.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_walkthrough_unselected.xml b/app/src/main/res/drawable/drawable_walkthrough_unselected.xml new file mode 100644 index 0000000..96a7dd0 --- /dev/null +++ b/app/src/main/res/drawable/drawable_walkthrough_unselected.xml @@ -0,0 +1,10 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_week_selected.xml b/app/src/main/res/drawable/drawable_week_selected.xml new file mode 100644 index 0000000..4ae62ad --- /dev/null +++ b/app/src/main/res/drawable/drawable_week_selected.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_week_un_selected.xml b/app/src/main/res/drawable/drawable_week_un_selected.xml new file mode 100644 index 0000000..629cc86 --- /dev/null +++ b/app/src/main/res/drawable/drawable_week_un_selected.xml @@ -0,0 +1,13 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_4.xml b/app/src/main/res/drawable/drawable_white_4.xml new file mode 100644 index 0000000..a0c1e14 --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_4.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_8.xml b/app/src/main/res/drawable/drawable_white_8.xml new file mode 100644 index 0000000..fa12e8e --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_8.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/drawable_white_rounded.xml b/app/src/main/res/drawable/drawable_white_rounded.xml new file mode 100644 index 0000000..a9c2fd5 --- /dev/null +++ b/app/src/main/res/drawable/drawable_white_rounded.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_1.xml b/app/src/main/res/drawable/ic_1.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_1.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_2.xml b/app/src/main/res/drawable/ic_2.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_2.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_3.xml b/app/src/main/res/drawable/ic_3.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_3.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_4.xml b/app/src/main/res/drawable/ic_4.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_4.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_5.xml b/app/src/main/res/drawable/ic_5.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_5.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_6.xml b/app/src/main/res/drawable/ic_6.xml new file mode 100644 index 0000000..f156edc --- /dev/null +++ b/app/src/main/res/drawable/ic_6.xml @@ -0,0 +1,4 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_add_post.xml b/app/src/main/res/drawable/ic_add_post.xml new file mode 100644 index 0000000..ed95ec9 --- /dev/null +++ b/app/src/main/res/drawable/ic_add_post.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_ask_location.xml b/app/src/main/res/drawable/ic_ask_location.xml new file mode 100644 index 0000000..6feb20c --- /dev/null +++ b/app/src/main/res/drawable/ic_ask_location.xml @@ -0,0 +1,51 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_attach.xml b/app/src/main/res/drawable/ic_attach.xml new file mode 100644 index 0000000..cc4d9df --- /dev/null +++ b/app/src/main/res/drawable/ic_attach.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_back_white.xml b/app/src/main/res/drawable/ic_back_white.xml new file mode 100644 index 0000000..d8628b6 --- /dev/null +++ b/app/src/main/res/drawable/ic_back_white.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_bank.xml b/app/src/main/res/drawable/ic_bank.xml new file mode 100644 index 0000000..4d82274 --- /dev/null +++ b/app/src/main/res/drawable/ic_bank.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_calender_pressed.xml b/app/src/main/res/drawable/ic_calender_pressed.xml new file mode 100644 index 0000000..5bc9912 --- /dev/null +++ b/app/src/main/res/drawable/ic_calender_pressed.xml @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_call_black_24dp.xml b/app/src/main/res/drawable/ic_call_black_24dp.xml new file mode 100644 index 0000000..ce16182 --- /dev/null +++ b/app/src/main/res/drawable/ic_call_black_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_call_end_white_24dp.xml b/app/src/main/res/drawable/ic_call_end_white_24dp.xml new file mode 100644 index 0000000..cd2552d --- /dev/null +++ b/app/src/main/res/drawable/ic_call_end_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_call_end_white_24px.xml b/app/src/main/res/drawable/ic_call_end_white_24px.xml new file mode 100644 index 0000000..cd2552d --- /dev/null +++ b/app/src/main/res/drawable/ic_call_end_white_24px.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_call_white_24dp.xml b/app/src/main/res/drawable/ic_call_white_24dp.xml new file mode 100644 index 0000000..57b8d12 --- /dev/null +++ b/app/src/main/res/drawable/ic_call_white_24dp.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_calling.xml b/app/src/main/res/drawable/ic_calling.xml new file mode 100644 index 0000000..335bdfd --- /dev/null +++ b/app/src/main/res/drawable/ic_calling.xml @@ -0,0 +1,6776 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_camera.xml b/app/src/main/res/drawable/ic_camera.xml new file mode 100644 index 0000000..a93975e --- /dev/null +++ b/app/src/main/res/drawable/ic_camera.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_chat_profile.xml b/app/src/main/res/drawable/ic_chat_profile.xml new file mode 100644 index 0000000..dd3b2e0 --- /dev/null +++ b/app/src/main/res/drawable/ic_chat_profile.xml @@ -0,0 +1,32 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_class_profile.xml b/app/src/main/res/drawable/ic_class_profile.xml new file mode 100644 index 0000000..7511b1e --- /dev/null +++ b/app/src/main/res/drawable/ic_class_profile.xml @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_clear.xml b/app/src/main/res/drawable/ic_clear.xml new file mode 100644 index 0000000..f8ca0c6 --- /dev/null +++ b/app/src/main/res/drawable/ic_clear.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_contacts.xml b/app/src/main/res/drawable/ic_contacts.xml new file mode 100644 index 0000000..33c8f0e --- /dev/null +++ b/app/src/main/res/drawable/ic_contacts.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_cross.xml b/app/src/main/res/drawable/ic_cross.xml new file mode 100644 index 0000000..4074dc5 --- /dev/null +++ b/app/src/main/res/drawable/ic_cross.xml @@ -0,0 +1,23 @@ + + + + diff --git a/app/src/main/res/drawable/ic_delete.xml b/app/src/main/res/drawable/ic_delete.xml new file mode 100644 index 0000000..f24780a --- /dev/null +++ b/app/src/main/res/drawable/ic_delete.xml @@ -0,0 +1,20 @@ + + + + + + + diff --git a/app/src/main/res/drawable/ic_delivered.xml b/app/src/main/res/drawable/ic_delivered.xml new file mode 100644 index 0000000..5f34211 --- /dev/null +++ b/app/src/main/res/drawable/ic_delivered.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_drawer.xml b/app/src/main/res/drawable/ic_drawer.xml new file mode 100644 index 0000000..88fe5b4 --- /dev/null +++ b/app/src/main/res/drawable/ic_drawer.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_drop_location_mrkr.xml b/app/src/main/res/drawable/ic_drop_location_mrkr.xml new file mode 100644 index 0000000..d84acc6 --- /dev/null +++ b/app/src/main/res/drawable/ic_drop_location_mrkr.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_dropdown.xml b/app/src/main/res/drawable/ic_dropdown.xml new file mode 100644 index 0000000..dbecda9 --- /dev/null +++ b/app/src/main/res/drawable/ic_dropdown.xml @@ -0,0 +1,14 @@ + + + diff --git a/app/src/main/res/drawable/ic_dropdown_number.xml b/app/src/main/res/drawable/ic_dropdown_number.xml new file mode 100644 index 0000000..aeae454 --- /dev/null +++ b/app/src/main/res/drawable/ic_dropdown_number.xml @@ -0,0 +1,12 @@ + + + diff --git a/app/src/main/res/drawable/ic_edit.xml b/app/src/main/res/drawable/ic_edit.xml new file mode 100644 index 0000000..77e8f32 --- /dev/null +++ b/app/src/main/res/drawable/ic_edit.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_emergancy.xml b/app/src/main/res/drawable/ic_emergancy.xml new file mode 100644 index 0000000..c79f271 --- /dev/null +++ b/app/src/main/res/drawable/ic_emergancy.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_fab_next.xml b/app/src/main/res/drawable/ic_fab_next.xml new file mode 100644 index 0000000..6a8a5f2 --- /dev/null +++ b/app/src/main/res/drawable/ic_fab_next.xml @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/app/src/main/res/drawable/ic_health_tool_1.xml b/app/src/main/res/drawable/ic_health_tool_1.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_1.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_health_tool_2.xml b/app/src/main/res/drawable/ic_health_tool_2.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_2.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_health_tool_3.xml b/app/src/main/res/drawable/ic_health_tool_3.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_3.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_health_tool_4.xml b/app/src/main/res/drawable/ic_health_tool_4.xml new file mode 100644 index 0000000..635d645 --- /dev/null +++ b/app/src/main/res/drawable/ic_health_tool_4.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_history.xml b/app/src/main/res/drawable/ic_history.xml new file mode 100644 index 0000000..6d4ef90 --- /dev/null +++ b/app/src/main/res/drawable/ic_history.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_info.xml b/app/src/main/res/drawable/ic_info.xml new file mode 100644 index 0000000..6222cba --- /dev/null +++ b/app/src/main/res/drawable/ic_info.xml @@ -0,0 +1,27 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_invite.xml b/app/src/main/res/drawable/ic_invite.xml new file mode 100644 index 0000000..8dd63f4 --- /dev/null +++ b/app/src/main/res/drawable/ic_invite.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_language.xml b/app/src/main/res/drawable/ic_language.xml new file mode 100644 index 0000000..0c6257b --- /dev/null +++ b/app/src/main/res/drawable/ic_language.xml @@ -0,0 +1,24 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..ca3826a --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_location.xml b/app/src/main/res/drawable/ic_location.xml new file mode 100644 index 0000000..4463e55 --- /dev/null +++ b/app/src/main/res/drawable/ic_location.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_location_arrow.xml b/app/src/main/res/drawable/ic_location_arrow.xml new file mode 100644 index 0000000..5749f22 --- /dev/null +++ b/app/src/main/res/drawable/ic_location_arrow.xml @@ -0,0 +1,20 @@ + + + + diff --git a/app/src/main/res/drawable/ic_logout.xml b/app/src/main/res/drawable/ic_logout.xml new file mode 100644 index 0000000..d7821a0 --- /dev/null +++ b/app/src/main/res/drawable/ic_logout.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_mic.xml b/app/src/main/res/drawable/ic_mic.xml new file mode 100644 index 0000000..45cef60 --- /dev/null +++ b/app/src/main/res/drawable/ic_mic.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_next.xml b/app/src/main/res/drawable/ic_next.xml new file mode 100644 index 0000000..4c43dfe --- /dev/null +++ b/app/src/main/res/drawable/ic_next.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_notification_drawer.xml b/app/src/main/res/drawable/ic_notification_drawer.xml new file mode 100644 index 0000000..0a0bcc0 --- /dev/null +++ b/app/src/main/res/drawable/ic_notification_drawer.xml @@ -0,0 +1,26 @@ + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_password.xml b/app/src/main/res/drawable/ic_password.xml new file mode 100644 index 0000000..5c13507 --- /dev/null +++ b/app/src/main/res/drawable/ic_password.xml @@ -0,0 +1,30 @@ + + + + + + diff --git a/app/src/main/res/drawable/ic_pdf.xml b/app/src/main/res/drawable/ic_pdf.xml new file mode 100644 index 0000000..f7b7a87 --- /dev/null +++ b/app/src/main/res/drawable/ic_pdf.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_play_icon.xml b/app/src/main/res/drawable/ic_play_icon.xml new file mode 100644 index 0000000..b1bdebf --- /dev/null +++ b/app/src/main/res/drawable/ic_play_icon.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_profile_setting.xml b/app/src/main/res/drawable/ic_profile_setting.xml new file mode 100644 index 0000000..7d77916 --- /dev/null +++ b/app/src/main/res/drawable/ic_profile_setting.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_seen.xml b/app/src/main/res/drawable/ic_seen.xml new file mode 100644 index 0000000..dc04e65 --- /dev/null +++ b/app/src/main/res/drawable/ic_seen.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_sent.xml b/app/src/main/res/drawable/ic_sent.xml new file mode 100644 index 0000000..60689a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_sent.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_skip_location.xml b/app/src/main/res/drawable/ic_skip_location.xml new file mode 100644 index 0000000..1a063ce --- /dev/null +++ b/app/src/main/res/drawable/ic_skip_location.xml @@ -0,0 +1,12 @@ + + + + diff --git a/app/src/main/res/drawable/ic_wait.xml b/app/src/main/res/drawable/ic_wait.xml new file mode 100644 index 0000000..e74230f --- /dev/null +++ b/app/src/main/res/drawable/ic_wait.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/image_placeholder.xml b/app/src/main/res/drawable/image_placeholder.xml new file mode 100644 index 0000000..fd890ce --- /dev/null +++ b/app/src/main/res/drawable/image_placeholder.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/progress_completed.xml b/app/src/main/res/drawable/progress_completed.xml new file mode 100644 index 0000000..67b9521 --- /dev/null +++ b/app/src/main/res/drawable/progress_completed.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/progress_unsucessfull.xml b/app/src/main/res/drawable/progress_unsucessfull.xml new file mode 100644 index 0000000..3c76613 --- /dev/null +++ b/app/src/main/res/drawable/progress_unsucessfull.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_emergency.xml b/app/src/main/res/drawable/selector_emergency.xml new file mode 100644 index 0000000..a3a6cb9 --- /dev/null +++ b/app/src/main/res/drawable/selector_emergency.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_home.xml b/app/src/main/res/drawable/selector_home.xml new file mode 100644 index 0000000..aa136d4 --- /dev/null +++ b/app/src/main/res/drawable/selector_home.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_language.xml b/app/src/main/res/drawable/selector_language.xml new file mode 100644 index 0000000..3663cff --- /dev/null +++ b/app/src/main/res/drawable/selector_language.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_profile.xml b/app/src/main/res/drawable/selector_profile.xml new file mode 100644 index 0000000..76b0f16 --- /dev/null +++ b/app/src/main/res/drawable/selector_profile.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_revenue.xml b/app/src/main/res/drawable/selector_revenue.xml new file mode 100644 index 0000000..102ecd0 --- /dev/null +++ b/app/src/main/res/drawable/selector_revenue.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_wallet.xml b/app/src/main/res/drawable/selector_wallet.xml new file mode 100644 index 0000000..17c90ef --- /dev/null +++ b/app/src/main/res/drawable/selector_wallet.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/taradoc_image.png b/app/src/main/res/drawable/taradoc_image.png new file mode 100644 index 0000000..26e7e8d Binary files /dev/null and b/app/src/main/res/drawable/taradoc_image.png differ diff --git a/app/src/main/res/font/campton_book.ttf b/app/src/main/res/font/campton_book.ttf new file mode 100644 index 0000000..212d224 Binary files /dev/null and b/app/src/main/res/font/campton_book.ttf differ diff --git a/app/src/main/res/font/campton_medium.ttf b/app/src/main/res/font/campton_medium.ttf new file mode 100644 index 0000000..739bdb6 Binary files /dev/null and b/app/src/main/res/font/campton_medium.ttf differ diff --git a/app/src/main/res/font/campton_semibold.ttf b/app/src/main/res/font/campton_semibold.ttf new file mode 100644 index 0000000..99ff39a Binary files /dev/null and b/app/src/main/res/font/campton_semibold.ttf differ diff --git a/app/src/main/res/layout/activity_add_address.xml b/app/src/main/res/layout/activity_add_address.xml new file mode 100644 index 0000000..d1d5389 --- /dev/null +++ b/app/src/main/res/layout/activity_add_address.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +