Merge "Hide toggle to Turn on Wi-Fi automatically preference in Search settings"
diff --git a/Android.bp b/Android.bp
index 5bf5514..4af8d09 100644
--- a/Android.bp
+++ b/Android.bp
@@ -51,6 +51,7 @@
     defaults: [
         "SettingsLibDefaults",
         "SettingsLib-search-defaults",
+        "SpaPrivilegedLib-defaults",
     ],
 
     srcs: ["src/**/*.java", "src/**/*.kt"],
@@ -63,6 +64,7 @@
         "androidx.core_core",
         "androidx.appcompat_appcompat",
         "androidx.cardview_cardview",
+        "androidx.compose.runtime_runtime-livedata",
         "androidx.preference_preference",
         "androidx.recyclerview_recyclerview",
         "androidx.window_window",
@@ -103,7 +105,10 @@
 
 android_app {
     name: "Settings",
-    defaults: ["platform_app_defaults"],
+    defaults: [
+        "platform_app_defaults",
+        "SpaPrivilegedLib-defaults",
+    ],
     platform_apis: true,
     certificate: "platform",
     system_ext_specific: true,
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 3581d48..e14cba7 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -4584,6 +4584,11 @@
             </intent-filter>
         </activity>
 
+        <activity
+            android:name="com.android.settings.spa.SpaActivity"
+            android:exported="false">
+        </activity>
+
         <!-- This is the longest AndroidManifest.xml ever. -->
     </application>
 </manifest>
diff --git a/res/drawable-night/sfps_enroll_finish.xml b/res/drawable-night/sfps_enroll_finish.xml
new file mode 100644
index 0000000..7161ad0
--- /dev/null
+++ b/res/drawable-night/sfps_enroll_finish.xml
@@ -0,0 +1,66 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="300dp"
+    android:height="300dp"
+    android:viewportWidth="300"
+    android:viewportHeight="300">
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M272,300H28c-15.5,0 -28,-12.5 -28,-28V28C0,12.5 12.5,0 28,0h244c15.5,0 28,12.5 28,28v244C300,287.5 287.5,300 272,300z"/>
+  <path
+      android:pathData="M251.9,199c-26.1,-49.5 -62.4,-112.1 -101.7,-121.9c-3.3,-1.1 -6.8,-1.8 -10.2,-2.1h-0.3c-0.4,0 -0.9,-0.1 -1.3,-0.1c-6,-0.3 -11.9,0.7 -17.5,2.9h-0.1c-0.8,0.3 -1.6,0.7 -2.4,1c-18.6,8.4 -23,19.2 -23,19.2c-3.6,6.5 -5.9,13.5 -6.8,20.8c-4.5,32 27.6,100.6 52,143.7c3.1,0.3 6.2,0.4 9.4,0.4C194.9,263.1 233.7,236.9 251.9,199z"
+      android:fillColor="#AD674E"/>
+  <path
+      android:pathData="M175.9,132.6c-0.4,0.2 -0.9,0.4 -1.4,0.4c-0.5,0 -1,-0.1 -1.4,-0.3c-8.1,-4.3 -19.9,-3.3 -30.1,2.5c-10.2,5.8 -17.1,15.5 -17.5,24.6c0,0.4 -0.1,0.7 -0.3,1.1c-0.2,0.3 -0.4,0.6 -0.7,0.9c-0.3,0.3 -0.6,0.4 -1,0.6c-0.4,0.1 -0.7,0.2 -1.1,0.2c-0.4,0 -0.7,-0.1 -1.1,-0.3c-0.3,-0.2 -0.7,-0.4 -0.9,-0.7s-0.4,-0.6 -0.6,-1c-0.1,-0.4 -0.2,-0.7 -0.2,-1.1c0.6,-11.2 8.4,-22.5 20.4,-29.3c12,-6.8 25.7,-7.8 35.6,-2.6c0.3,0.2 0.6,0.4 0.9,0.7c0.2,0.3 0.4,0.6 0.5,1c0.1,0.4 0.2,0.7 0.1,1.1c0,0.4 -0.1,0.7 -0.3,1.1C176.8,132 176.4,132.4 175.9,132.6z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M170.3,184.2c-0.2,0.1 -0.5,0.2 -0.7,0.3c-8.4,2.1 -19.1,-6 -22.4,-14.1c-2.4,-6.1 -0.5,-11.6 5.1,-14.8c2.4,-1.4 5.2,-1.8 7.8,-1.3c2.7,0.5 5.1,1.9 6.8,4.1l3.8,4.6c1,1.3 2.5,2.1 4.2,2.4c1.6,0.2 3.3,-0.2 4.7,-1.1c1.4,-0.9 2.3,-2.4 2.7,-4c0.4,-1.6 0.1,-3.3 -0.7,-4.8l-0.5,-0.9c-0.2,-0.3 -0.3,-0.7 -0.4,-1.1c0,-0.4 0,-0.8 0.1,-1.1c0.1,-0.4 0.3,-0.7 0.5,-1s0.5,-0.5 0.9,-0.7c0.3,-0.2 0.7,-0.3 1.1,-0.4c0.4,0 0.8,0 1.1,0.1c0.4,0.1 0.7,0.3 1,0.5c0.3,0.2 0.6,0.5 0.7,0.8l0.5,0.9c1.5,2.7 2,5.9 1.3,8.9s-2.5,5.7 -5.1,7.4c-2.6,1.8 -5.7,2.5 -8.7,2.1c-3.1,-0.4 -5.9,-2 -7.8,-4.4l-3.8,-4.6c-0.9,-1.1 -2.1,-1.8 -3.4,-2c-1.3,-0.3 -2.8,0 -3.9,0.7c-3.1,1.8 -3.9,4.3 -2.6,7.7c2.4,6.2 10.8,11.8 15.6,10.6c0.7,-0.2 1.4,-0.1 2,0.2c0.6,0.3 1.1,0.8 1.4,1.5c0.2,0.6 0.3,1.4 0,2C171.3,183.3 170.9,183.9 170.3,184.2L170.3,184.2z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M146.2,190c-0.5,0.3 -1.1,0.4 -1.7,0.4c-0.6,0 -1.1,-0.3 -1.6,-0.6c-3,-2.6 -5.6,-5.6 -7.6,-9c-7.6,-13.4 -2.4,-30.2 11.8,-38.3c14.2,-8.1 31.3,-4 38.9,9.4c0.2,0.3 0.3,0.7 0.4,1.1c0,0.4 0,0.8 -0.1,1.1c-0.1,0.4 -0.3,0.7 -0.5,1c-0.2,0.3 -0.5,0.5 -0.9,0.7c-0.3,0.2 -0.7,0.3 -1.1,0.4c-0.4,0 -0.8,0 -1.1,-0.1c-0.4,-0.1 -0.7,-0.3 -1,-0.5c-0.3,-0.2 -0.5,-0.5 -0.7,-0.8c-6,-10.6 -19.7,-13.8 -31.1,-7.2c-11.4,6.5 -15.6,19.9 -9.6,30.5c1.7,2.8 3.8,5.2 6.2,7.4c0.6,0.5 1,1.2 1,1.9c0.1,0.8 -0.2,1.5 -0.6,2.1C146.8,189.5 146.5,189.8 146.2,190z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M177.8,196.2c-5.7,3.3 -12.3,4.7 -18.9,3.9c-0.8,-0.1 -1.4,-0.5 -1.9,-1.1c-0.5,-0.6 -0.7,-1.4 -0.6,-2.1c0.1,-0.8 0.5,-1.4 1.1,-1.9c0.6,-0.5 1.4,-0.7 2.1,-0.6c5.6,0.6 11.2,-0.7 16,-3.6c4.8,-2.9 8.5,-7.4 10.5,-12.6c0.1,-0.4 0.3,-0.7 0.6,-1c0.2,-0.3 0.6,-0.5 0.9,-0.7c0.3,-0.2 0.7,-0.3 1.1,-0.3c0.4,0 0.8,0 1.1,0.2c0.4,0.1 0.7,0.3 1,0.6c0.3,0.3 0.5,0.6 0.7,0.9c0.2,0.3 0.3,0.7 0.3,1.1c0,0.4 0,0.8 -0.2,1.1C189,187 184.1,192.7 177.8,196.2z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M121.5,136.4c-0.6,0.3 -1.2,0.4 -1.9,0.3c-0.6,-0.1 -1.2,-0.4 -1.7,-0.9c-0.4,-0.5 -0.7,-1.1 -0.8,-1.7c-0.1,-0.6 0.1,-1.3 0.5,-1.8c4,-5.9 9.3,-10.8 15.5,-14.3c6.2,-3.5 13.1,-5.6 20.2,-6.1c0.4,0 0.8,0 1.1,0.2c0.4,0.1 0.7,0.3 1,0.6c0.3,0.3 0.5,0.6 0.7,0.9c0.2,0.3 0.3,0.7 0.3,1.1s0,0.8 -0.2,1.1c-0.1,0.4 -0.3,0.7 -0.6,1c-0.2,0.3 -0.6,0.5 -0.9,0.7c-0.3,0.2 -0.7,0.3 -1.1,0.3c-6.2,0.4 -12.3,2.2 -17.7,5.3c-5.4,3.1 -10.1,7.4 -13.6,12.6C122.2,135.9 121.9,136.2 121.5,136.4z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M135.4,106.5c-1.1,0 -2.2,-0.6 -2.7,-1.7c-0.7,-1.5 -0.1,-3.3 1.4,-4c13.8,-6.6 25.7,-3.2 26.2,-3c1.6,0.5 2.5,2.1 2,3.7c-0.5,1.6 -2.1,2.5 -3.7,2c-0.1,0 -10.2,-2.8 -21.9,2.7C136.3,106.4 135.8,106.5 135.4,106.5z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M101.5,136.6c-0.3,0 -0.5,0 -0.8,-0.1c-1.6,-0.4 -2.5,-2.1 -2.1,-3.6c0.2,-0.6 4.1,-15.1 25.3,-27.2c1.4,-0.8 3.3,-0.3 4.1,1.1c0.8,1.4 0.3,3.3 -1.1,4.1c-18.8,10.7 -22.5,23.4 -22.5,23.5C104,135.8 102.8,136.6 101.5,136.6z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M102.7,111.3c-0.6,0 -1.2,-0.2 -1.7,-0.5c-1.4,-0.9 -1.7,-2.8 -0.8,-4.2c0.2,-0.3 5.7,-8.2 21.9,-16.4c6.6,-3.3 13.6,-5.3 21,-5.8c1.7,-0.1 3.1,1.1 3.2,2.8s-1.1,3.1 -2.8,3.2c-6.5,0.5 -12.8,2.3 -18.7,5.2c-14.6,7.4 -19.6,14.3 -19.6,14.4C104.7,110.8 103.7,111.3 102.7,111.3z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M137.4,219.7c-0.4,0 -0.8,-0.1 -1.2,-0.3c-0.3,-0.1 -7.2,-3.3 -14.8,-11.8c-1.1,-1.2 -1,-3.1 0.2,-4.2c1.2,-1.1 3.1,-1 4.2,0.2c6.8,7.6 12.7,10.3 12.8,10.3c1.5,0.7 2.2,2.4 1.5,4C139.6,219 138.5,219.7 137.4,219.7z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M118,201.4c-1,0 -1.9,-0.5 -2.5,-1.3c-1.4,-2.2 -2.8,-4.4 -4,-6.7c-12.5,-24.1 -7.9,-36.3 -7.7,-36.8c0.6,-1.5 2.4,-2.3 3.9,-1.7c1.5,0.6 2.3,2.3 1.7,3.9c-0.1,0.3 -3.6,10.7 7.4,31.8c1.1,2.1 2.3,4.2 3.6,6.2c0.9,1.4 0.5,3.2 -0.8,4.2C119.1,201.2 118.6,201.4 118,201.4z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M156.8,212.4C156.7,212.4 156.7,212.4 156.8,212.4c-0.5,0 -12.2,-0.2 -23.9,-12.4c-6.1,-6.4 -10.4,-14.4 -12.5,-23c-0.4,-1.6 0.6,-3.2 2.2,-3.6c1.6,-0.4 3.2,0.6 3.6,2.2c1.9,7.6 5.7,14.6 11.1,20.3c9.8,10.3 19.2,10.5 19.6,10.5c1.6,0 3,1.4 3,3S158.4,212.4 156.8,212.4z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M216,174.9c-0.1,0 -0.2,0 -0.3,0c-1.6,-0.2 -2.8,-1.7 -2.6,-3.3c0,-0.1 0.7,-6.7 -2.4,-16.2c-0.5,-1.6 0.4,-3.3 2,-3.8c1.6,-0.5 3.3,0.4 3.8,2c3.4,10.9 2.6,18.4 2.6,18.7C218.8,173.8 217.5,174.9 216,174.9z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M210.1,148.9c-1.1,0 -2.2,-0.6 -2.7,-1.7c-1.1,-2.2 -2.3,-4.3 -3.5,-6.3c-12.7,-20.4 -23.5,-22.6 -23.6,-22.6c-1.6,-0.3 -2.7,-1.8 -2.4,-3.5c0.3,-1.6 1.8,-2.7 3.4,-2.5c0.5,0.1 13.4,2.3 27.7,25.4c1.3,2.1 2.6,4.4 3.8,6.8c0.7,1.5 0.1,3.3 -1.4,4C211,148.8 210.6,148.9 210.1,148.9z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M199.8,187.8c-0.5,0 -1,-0.1 -1.5,-0.4c-1.4,-0.8 -1.9,-2.7 -1.1,-4.1c0.2,-0.3 4.8,-8.5 0.9,-22.2c-2.1,-7.5 -6.2,-14.4 -11.8,-19.8c-1.2,-1.2 -1.2,-3.1 0,-4.2s3.1,-1.2 4.2,0c6.3,6.2 10.9,14 13.3,22.5c4.6,16.3 -1.3,26.5 -1.5,26.9C201.8,187.3 200.8,187.8 199.8,187.8z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:fillColor="#FF000000"
+      android:pathData="M248,228.2m-40,0a40,40 0,1 1,80 0a40,40 0,1 1,-80 0"/>
+  <path
+      android:pathData="M261.4,214.1l-18.3,18.3l-8.6,-8.5l-4.9,4.9l13.5,13.6l23.3,-23.4z"
+      android:fillColor="#669DF6"/>
+  <path
+      android:pathData="M150,260.1c-60.7,0 -110.1,-49.4 -110.1,-110.1C39.9,89.3 89.3,39.9 150,39.9S260.1,89.3 260.1,150c0,13.5 -2.5,26.5 -7,38.5c2,0.3 4,0.7 5.9,1.2c4.5,-12.4 7,-25.8 7,-39.8C266.1,86 214,33.9 150,33.9S33.9,86 33.9,150S86,266.1 150,266.1c23.2,0 44.8,-6.8 62.9,-18.6c-1,-1.8 -1.8,-3.6 -2.5,-5.5C193.1,253.4 172.3,260.1 150,260.1z"
+      android:fillColor="#669DF6"/>
+  <path
+      android:pathData="M248,271.2c-23.7,0 -43,-19.3 -43,-43s19.3,-43 43,-43s43,19.3 43,43S271.7,271.2 248,271.2zM248,191.2c-20.4,0 -37,16.6 -37,37s16.6,37 37,37s37,-16.6 37,-37S268.4,191.2 248,191.2z"
+      android:fillColor="#669DF6"/>
+</vector>
diff --git a/res/drawable/sfps_enroll_finish.xml b/res/drawable/sfps_enroll_finish.xml
new file mode 100644
index 0000000..6d11e68
--- /dev/null
+++ b/res/drawable/sfps_enroll_finish.xml
@@ -0,0 +1,71 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="300dp"
+    android:height="300dp"
+    android:viewportWidth="300"
+    android:viewportHeight="300">
+  <path
+      android:pathData="M272,300H28c-15.5,0 -28,-12.5 -28,-28V28C0,12.5 12.5,0 28,0h244c15.5,0 28,12.5 28,28v244C300,287.5 287.5,300 272,300z"
+      android:fillColor="#FFFFFF"/>
+  <path
+      android:pathData="M243.1,240.2l-11.4,-11.4l2.9,-2.9l8.6,8.6l18.4,-18.3l2.8,2.8L243.1,240.2z"
+      android:strokeWidth="3"
+      android:fillColor="#669DF6"
+      android:strokeColor="#669DF6"/>
+  <path
+      android:pathData="M251.9,199c-26.1,-49.5 -62.4,-112.1 -101.7,-121.9c-3.3,-1.1 -6.8,-1.8 -10.2,-2.1h-0.3c-0.4,0 -0.9,-0.1 -1.3,-0.1c-6,-0.3 -11.9,0.7 -17.5,2.9h-0.1c-0.8,0.3 -1.6,0.7 -2.4,1c-18.6,8.4 -23,19.2 -23,19.2c-3.6,6.5 -5.9,13.5 -6.8,20.8c-4.5,32 27.6,100.6 52,143.7c3.1,0.3 6.2,0.4 9.4,0.4C194.9,263.1 233.7,236.9 251.9,199z"
+      android:fillColor="#AD674E"/>
+  <path
+      android:pathData="M175.9,132.6c-0.4,0.2 -0.9,0.4 -1.4,0.4c-0.5,0 -1,-0.1 -1.4,-0.3c-8.1,-4.3 -19.9,-3.3 -30.1,2.5c-10.2,5.8 -17.1,15.5 -17.5,24.6c0,0.4 -0.1,0.7 -0.3,1.1c-0.2,0.3 -0.4,0.6 -0.7,0.9c-0.3,0.3 -0.6,0.4 -1,0.6c-0.4,0.1 -0.7,0.2 -1.1,0.2c-0.4,0 -0.7,-0.1 -1.1,-0.3c-0.3,-0.2 -0.7,-0.4 -0.9,-0.7s-0.4,-0.6 -0.6,-1c-0.1,-0.4 -0.2,-0.7 -0.2,-1.1c0.6,-11.2 8.4,-22.5 20.4,-29.3c12,-6.8 25.7,-7.8 35.6,-2.6c0.3,0.2 0.6,0.4 0.9,0.7c0.2,0.3 0.4,0.6 0.5,1c0.1,0.4 0.2,0.7 0.1,1.1c0,0.4 -0.1,0.7 -0.3,1.1C176.8,132 176.4,132.4 175.9,132.6z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M170.3,184.2c-0.2,0.1 -0.5,0.2 -0.7,0.3c-8.4,2.1 -19.1,-6 -22.4,-14.1c-2.4,-6.1 -0.5,-11.6 5.1,-14.8c2.4,-1.4 5.2,-1.8 7.8,-1.3c2.7,0.5 5.1,1.9 6.8,4.1l3.8,4.6c1,1.3 2.5,2.1 4.2,2.4c1.6,0.2 3.3,-0.2 4.7,-1.1c1.4,-0.9 2.3,-2.4 2.7,-4c0.4,-1.6 0.1,-3.3 -0.7,-4.8l-0.5,-0.9c-0.2,-0.3 -0.3,-0.7 -0.4,-1.1c0,-0.4 0,-0.8 0.1,-1.1c0.1,-0.4 0.3,-0.7 0.5,-1s0.5,-0.5 0.9,-0.7c0.3,-0.2 0.7,-0.3 1.1,-0.4c0.4,0 0.8,0 1.1,0.1c0.4,0.1 0.7,0.3 1,0.5c0.3,0.2 0.6,0.5 0.7,0.8l0.5,0.9c1.5,2.7 2,5.9 1.3,8.9s-2.5,5.7 -5.1,7.4c-2.6,1.8 -5.7,2.5 -8.7,2.1c-3.1,-0.4 -5.9,-2 -7.8,-4.4l-3.8,-4.6c-0.9,-1.1 -2.1,-1.8 -3.4,-2c-1.3,-0.3 -2.8,0 -3.9,0.7c-3.1,1.8 -3.9,4.3 -2.6,7.7c2.4,6.2 10.8,11.8 15.6,10.6c0.7,-0.2 1.4,-0.1 2,0.2c0.6,0.3 1.1,0.8 1.4,1.5c0.2,0.6 0.3,1.4 0,2C171.3,183.3 170.9,183.9 170.3,184.2L170.3,184.2z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M146.2,190c-0.5,0.3 -1.1,0.4 -1.7,0.4c-0.6,0 -1.1,-0.3 -1.6,-0.6c-3,-2.6 -5.6,-5.6 -7.6,-9c-7.6,-13.4 -2.4,-30.2 11.8,-38.3c14.2,-8.1 31.3,-4 38.9,9.4c0.2,0.3 0.3,0.7 0.4,1.1c0,0.4 0,0.8 -0.1,1.1c-0.1,0.4 -0.3,0.7 -0.5,1c-0.2,0.3 -0.5,0.5 -0.9,0.7c-0.3,0.2 -0.7,0.3 -1.1,0.4c-0.4,0 -0.8,0 -1.1,-0.1c-0.4,-0.1 -0.7,-0.3 -1,-0.5c-0.3,-0.2 -0.5,-0.5 -0.7,-0.8c-6,-10.6 -19.7,-13.8 -31.1,-7.2c-11.4,6.5 -15.6,19.9 -9.6,30.5c1.7,2.8 3.8,5.2 6.2,7.4c0.6,0.5 1,1.2 1,1.9c0.1,0.8 -0.2,1.5 -0.6,2.1C146.8,189.5 146.5,189.8 146.2,190z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M177.8,196.2c-5.7,3.3 -12.3,4.7 -18.9,3.9c-0.8,-0.1 -1.4,-0.5 -1.9,-1.1c-0.5,-0.6 -0.7,-1.4 -0.6,-2.1c0.1,-0.8 0.5,-1.4 1.1,-1.9c0.6,-0.5 1.4,-0.7 2.1,-0.6c5.6,0.6 11.2,-0.7 16,-3.6c4.8,-2.9 8.5,-7.4 10.5,-12.6c0.1,-0.4 0.3,-0.7 0.6,-1c0.2,-0.3 0.6,-0.5 0.9,-0.7c0.3,-0.2 0.7,-0.3 1.1,-0.3c0.4,0 0.8,0 1.1,0.2c0.4,0.1 0.7,0.3 1,0.6c0.3,0.3 0.5,0.6 0.7,0.9c0.2,0.3 0.3,0.7 0.3,1.1c0,0.4 0,0.8 -0.2,1.1C189,187 184.1,192.7 177.8,196.2z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M121.5,136.4c-0.6,0.3 -1.2,0.4 -1.9,0.3c-0.6,-0.1 -1.2,-0.4 -1.7,-0.9c-0.4,-0.5 -0.7,-1.1 -0.8,-1.7c-0.1,-0.6 0.1,-1.3 0.5,-1.8c4,-5.9 9.3,-10.8 15.5,-14.3c6.2,-3.5 13.1,-5.6 20.2,-6.1c0.4,0 0.8,0 1.1,0.2c0.4,0.1 0.7,0.3 1,0.6c0.3,0.3 0.5,0.6 0.7,0.9c0.2,0.3 0.3,0.7 0.3,1.1s0,0.8 -0.2,1.1c-0.1,0.4 -0.3,0.7 -0.6,1c-0.2,0.3 -0.6,0.5 -0.9,0.7c-0.3,0.2 -0.7,0.3 -1.1,0.3c-6.2,0.4 -12.3,2.2 -17.7,5.3c-5.4,3.1 -10.1,7.4 -13.6,12.6C122.2,135.9 121.9,136.2 121.5,136.4z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M135.4,106.5c-1.1,0 -2.2,-0.6 -2.7,-1.7c-0.7,-1.5 -0.1,-3.3 1.4,-4c13.8,-6.6 25.7,-3.2 26.2,-3c1.6,0.5 2.5,2.1 2,3.7c-0.5,1.6 -2.1,2.5 -3.7,2c-0.1,0 -10.2,-2.8 -21.9,2.7C136.3,106.4 135.8,106.5 135.4,106.5z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M101.5,136.6c-0.3,0 -0.5,0 -0.8,-0.1c-1.6,-0.4 -2.5,-2.1 -2.1,-3.6c0.2,-0.6 4.1,-15.1 25.3,-27.2c1.4,-0.8 3.3,-0.3 4.1,1.1c0.8,1.4 0.3,3.3 -1.1,4.1c-18.8,10.7 -22.5,23.4 -22.5,23.5C104,135.8 102.8,136.6 101.5,136.6z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M102.7,111.3c-0.6,0 -1.2,-0.2 -1.7,-0.5c-1.4,-0.9 -1.7,-2.8 -0.8,-4.2c0.2,-0.3 5.7,-8.2 21.9,-16.4c6.6,-3.3 13.6,-5.3 21,-5.8c1.7,-0.1 3.1,1.1 3.2,2.8s-1.1,3.1 -2.8,3.2c-6.5,0.5 -12.8,2.3 -18.7,5.2c-14.6,7.4 -19.6,14.3 -19.6,14.4C104.7,110.8 103.7,111.3 102.7,111.3z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M137.4,219.7c-0.4,0 -0.8,-0.1 -1.2,-0.3c-0.3,-0.1 -7.2,-3.3 -14.8,-11.8c-1.1,-1.2 -1,-3.1 0.2,-4.2c1.2,-1.1 3.1,-1 4.2,0.2c6.8,7.6 12.7,10.3 12.8,10.3c1.5,0.7 2.2,2.4 1.5,4C139.6,219 138.5,219.7 137.4,219.7z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M118,201.4c-1,0 -1.9,-0.5 -2.5,-1.3c-1.4,-2.2 -2.8,-4.4 -4,-6.7c-12.5,-24.1 -7.9,-36.3 -7.7,-36.8c0.6,-1.5 2.4,-2.3 3.9,-1.7c1.5,0.6 2.3,2.3 1.7,3.9c-0.1,0.3 -3.6,10.7 7.4,31.8c1.1,2.1 2.3,4.2 3.6,6.2c0.9,1.4 0.5,3.2 -0.8,4.2C119.1,201.2 118.6,201.4 118,201.4z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M156.8,212.4C156.8,212.4 156.7,212.4 156.8,212.4c-0.5,0 -12.2,-0.2 -23.9,-12.4c-6.1,-6.4 -10.4,-14.4 -12.5,-23c-0.4,-1.6 0.6,-3.2 2.2,-3.6c1.6,-0.4 3.2,0.6 3.6,2.2c1.9,7.6 5.7,14.6 11.1,20.3c9.8,10.3 19.2,10.5 19.6,10.5c1.6,0 3,1.4 3,3S158.4,212.4 156.8,212.4z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M216,174.9c-0.1,0 -0.2,0 -0.3,0c-1.6,-0.2 -2.8,-1.7 -2.6,-3.3c0,-0.1 0.7,-6.7 -2.4,-16.2c-0.5,-1.6 0.4,-3.3 2,-3.8c1.6,-0.5 3.3,0.4 3.8,2c3.4,10.9 2.6,18.4 2.6,18.7C218.8,173.8 217.5,174.9 216,174.9z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M210.1,148.9c-1.1,0 -2.2,-0.6 -2.7,-1.7c-1.1,-2.2 -2.3,-4.3 -3.5,-6.3c-12.7,-20.4 -23.5,-22.6 -23.6,-22.6c-1.6,-0.3 -2.7,-1.8 -2.4,-3.5c0.3,-1.6 1.8,-2.7 3.4,-2.5c0.5,0.1 13.4,2.3 27.7,25.4c1.3,2.1 2.6,4.4 3.8,6.8c0.7,1.5 0.1,3.3 -1.4,4C211,148.8 210.6,148.9 210.1,148.9z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M199.8,187.8c-0.5,0 -1,-0.1 -1.5,-0.4c-1.4,-0.8 -1.9,-2.7 -1.1,-4.1c0.2,-0.3 4.8,-8.5 0.9,-22.2c-2.1,-7.5 -6.2,-14.4 -11.8,-19.8c-1.2,-1.2 -1.2,-3.1 0,-4.2s3.1,-1.2 4.2,0c6.3,6.2 10.9,14 13.3,22.5c4.6,16.3 -1.3,26.5 -1.5,26.9C201.8,187.3 200.8,187.8 199.8,187.8z"
+      android:fillColor="#D2E3FC"/>
+  <path
+      android:pathData="M259.1,189.8c-0.1,0 -0.2,-0.1 -0.3,-0.1c0,0 -0.1,0 -0.1,0c-0.1,0 -0.2,-0.1 -0.3,-0.1c0,0 0,0 0,0c-0.3,-0.1 -0.7,-0.2 -1,-0.2c0,0 -0.1,0 -0.1,0c-0.1,0 -0.2,0 -0.3,-0.1c0,0 -0.1,0 -0.1,0c-0.2,0 -0.3,-0.1 -0.5,-0.1c0,0 -0.1,0 -0.1,0c-0.1,0 -0.2,0 -0.2,-0.1c-0.1,0 -0.1,0 -0.2,0c-0.1,0 -0.2,0 -0.2,0c-0.1,0 -0.1,0 -0.2,0c-0.1,0 -0.2,0 -0.2,0c-0.1,0 -0.3,0 -0.4,-0.1c-0.1,0 -0.1,0 -0.2,0c-0.1,0 -0.2,0 -0.2,0c-0.1,0 -0.1,0 -0.2,0c-0.1,0 -0.2,0 -0.2,0c-0.1,0 -0.1,0 -0.2,0c-0.1,0 -0.3,0 -0.4,-0.1c0,0 0,0 0,0l0,0c-1.7,-0.2 -3.4,-0.3 -5.1,-0.3c-22.1,0 -40,17.9 -40,40c0,4.8 0.9,9.5 2.4,13.8l0,0c0,0 0,0 0,0c0,0.1 0.1,0.3 0.1,0.4c0,0.1 0,0.1 0.1,0.2c0,0.1 0.1,0.2 0.1,0.3c0,0.1 0,0.1 0.1,0.2c0,0.1 0.1,0.2 0.1,0.3c0,0.1 0,0.1 0.1,0.2c0,0.1 0.1,0.2 0.1,0.3c0,0.1 0.1,0.1 0.1,0.2c0,0.1 0.1,0.1 0.1,0.2c0,0.1 0.1,0.1 0.1,0.2c0,0.1 0,0.1 0.1,0.2c0,0.1 0.1,0.2 0.1,0.2c0,0 0,0.1 0,0.1c0.1,0.3 0.3,0.6 0.4,0.9c0,0 0,0 0,0.1c0.1,0.1 0.1,0.2 0.2,0.3c0,0 0,0 0,0c0.2,0.4 0.5,0.9 0.7,1.3c6.8,12.3 20,20.7 35.1,20.7c22.1,0 40,-17.9 40,-40C288,210 275.8,194.6 259.1,189.8z"
+      android:fillColor="#FFFFFF"/>
+  <path
+      android:pathData="M212.2,246.1c-0.1,-0.1 -0.1,-0.2 -0.2,-0.3c0,0 0,0 0,-0.1c-0.1,-0.3 -0.3,-0.6 -0.4,-0.9c0,0 0,-0.1 0,-0.1c0,-0.1 -0.1,-0.2 -0.1,-0.2c0,-0.1 0,-0.1 -0.1,-0.2c0,-0.1 -0.1,-0.1 -0.1,-0.2c0,-0.1 -0.1,-0.1 -0.1,-0.2c0,-0.1 -0.1,-0.1 -0.1,-0.2c0,-0.1 -0.1,-0.2 -0.1,-0.3c0,-0.1 0,-0.1 -0.1,-0.2c0,-0.1 -0.1,-0.2 -0.1,-0.3c0,-0.1 0,-0.1 -0.1,-0.2c0,-0.1 -0.1,-0.2 -0.1,-0.3c0,-0.1 0,-0.1 -0.1,-0.2c-0.1,-0.1 -0.1,-0.3 -0.1,-0.4c0,0 0,0 0,0l0,0c-17.4,11.4 -38.1,18.1 -60.4,18.1c-60.7,0 -110.1,-49.4 -110.1,-110.1S89.3,39.9 150,39.9S260.1,89.3 260.1,150c0,13.5 -2.5,26.5 -7,38.5l0,0c0,0 0,0 0,0c0.1,0 0.3,0 0.4,0.1c0.1,0 0.1,0 0.2,0c0.1,0 0.2,0 0.2,0c0.1,0 0.1,0 0.2,0c0.1,0 0.2,0 0.2,0c0.1,0 0.1,0 0.2,0c0.1,0 0.3,0 0.4,0.1c0.1,0 0.2,0 0.2,0c0.1,0 0.1,0 0.2,0c0.1,0 0.2,0 0.2,0c0.1,0 0.1,0 0.2,0c0.1,0 0.2,0 0.2,0.1c0,0 0.1,0 0.1,0c0.2,0 0.3,0.1 0.5,0.1c0,0 0.1,0 0.1,0c0.1,0 0.2,0 0.3,0.1c0,0 0.1,0 0.1,0c0.3,0.1 0.7,0.2 1,0.2c0,0 0,0 0,0c0.1,0 0.2,0.1 0.3,0.1c0,0 0.1,0 0.1,0c0.1,0 0.2,0.1 0.3,0.1c0,0 0,0 0,0c4.5,-12.4 7,-25.8 7,-39.8C266.1,86 214,33.9 150,33.9S33.9,86 33.9,150S86,266.1 150,266.1c23.2,0 44.8,-6.8 62.9,-18.6c0,0 0,0 0,0C212.7,247.1 212.5,246.6 212.2,246.1C212.2,246.2 212.2,246.2 212.2,246.1z"
+      android:fillColor="#1A73E8"/>
+  <path
+      android:pathData="M248,271.2c-23.7,0 -43,-19.3 -43,-43s19.3,-43 43,-43s43,19.3 43,43S271.7,271.2 248,271.2zM248,191.2c-20.4,0 -37,16.6 -37,37s16.6,37 37,37s37,-16.6 37,-37S268.4,191.2 248,191.2z"
+      android:fillColor="#1A73E8"/>
+  <path
+      android:pathData="M243.1,242.4l-13.5,-13.6l5,-4.9l8.5,8.5l18.4,-18.3l4.9,4.9z"
+      android:fillColor="#1A73E8"/>
+</vector>
diff --git a/res/layout/fingerprint_enroll_introduction.xml b/res/layout/fingerprint_enroll_introduction.xml
index a01f3a9..0c10e52 100644
--- a/res/layout/fingerprint_enroll_introduction.xml
+++ b/res/layout/fingerprint_enroll_introduction.xml
@@ -199,6 +199,8 @@
                     android:layout_width="16dp"
                     android:layout_height="wrap_content"/>
                 <TextView
+                    android:id="@+id/footer_learn_more"
+                    android:linksClickable="true"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
                     style="@style/BiometricEnrollIntroMessage"
diff --git a/res/layout/sfps_enroll_enrolling.xml b/res/layout/sfps_enroll_enrolling.xml
new file mode 100644
index 0000000..0e6153a
--- /dev/null
+++ b/res/layout/sfps_enroll_enrolling.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2022 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
+  -->
+
+<com.google.android.setupdesign.GlifLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/setup_wizard_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    style="?attr/fingerprint_layout_theme">
+
+    <LinearLayout
+        style="@style/SudContentFrame"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:clipToPadding="false"
+        android:clipChildren="false">
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <!-- Animation res MUST be set in code -->
+            <com.airbnb.lottie.LottieAnimationView
+                android:id="@+id/illustration_lottie"
+                android:layout_width="@dimen/fingerprint_progress_bar_max_size"
+                android:layout_height="@dimen/fingerprint_progress_bar_max_size"
+                android:layout_marginTop="@dimen/udfps_lottie_translate_y"
+                android:scaleType="centerInside"
+                android:visibility="gone"
+                app:lottie_autoPlay="true"
+                app:lottie_loop="true"
+                android:clipChildren="false"
+                android:clipToPadding="false"
+                app:lottie_speed=".85"
+                android:layout_marginVertical="24dp" />
+
+            <com.google.android.setupdesign.view.FillContentLayout
+                android:layout_width="@dimen/fingerprint_progress_bar_max_size"
+                android:layout_height="@dimen/fingerprint_progress_bar_max_size"
+                android:paddingTop="0dp"
+                android:paddingBottom="0dp"
+                android:layout_marginVertical="24dp">
+
+                <com.android.settings.widget.RingProgressBar
+                    xmlns:android="http://schemas.android.com/apk/res/android"
+                    android:id="@+id/fingerprint_progress_bar"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_gravity="center"
+                    android:minHeight="@dimen/fingerprint_progress_bar_min_size"
+                    android:progress="0" />
+            </com.google.android.setupdesign.view.FillContentLayout>
+
+            <TextView
+                style="@style/TextAppearance.ErrorText"
+                android:id="@+id/error_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal|bottom"
+                android:accessibilityLiveRegion="polite"
+                android:gravity="center"
+                android:visibility="invisible"/>
+
+        </RelativeLayout>
+
+    </LinearLayout>
+
+</com.google.android.setupdesign.GlifLayout>
diff --git a/res/layout/sfps_enroll_finish_base.xml b/res/layout/sfps_enroll_finish_base.xml
new file mode 100644
index 0000000..6e468c6
--- /dev/null
+++ b/res/layout/sfps_enroll_finish_base.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright (C) 2022 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
+  -->
+
+<com.google.android.setupdesign.GlifLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/setup_wizard_layout"
+    style="?attr/fingerprint_layout_theme"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        style="@style/SudContentFrame"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="vertical"
+        android:clipToPadding="false"
+        android:clipChildren="false">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:orientation="vertical">
+
+            <com.google.android.setupdesign.view.FillContentLayout
+                android:layout_width="@dimen/sfps_enrollment_finished_icon_max_size"
+                android:layout_height="@dimen/sfps_enrollment_finished_icon_max_size"
+                android:layout_marginTop="24dp"
+                android:paddingTop="0dp"
+                android:paddingBottom="0dp"
+                android:gravity="center">
+
+                <ImageView
+                    android:id="@+id/fingerprint_in_app_indicator"
+                    style="@style/SudContentIllustration"
+                    android:layout_width="@dimen/sfps_enrollment_finished_icon_max_size"
+                    android:layout_height="@dimen/sfps_enrollment_finished_icon_max_size"
+                    android:contentDescription="@android:string/fingerprint_icon_content_description"
+                    android:importantForAccessibility="no"
+                    android:src="@drawable/sfps_enroll_finish" />
+            </com.google.android.setupdesign.view.FillContentLayout>
+
+            <!-- Added to align elements with fingerprint_enroll_enrolling_base -->
+            <TextView
+                style="@style/TextAppearance.ErrorText"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal|bottom"
+                android:visibility="invisible" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+
+</com.google.android.setupdesign.GlifLayout>
diff --git a/res/raw/sfps_lottie_left_edge.json b/res/raw/sfps_lottie_left_edge.json
new file mode 100644
index 0000000..0a7a477
--- /dev/null
+++ b/res/raw/sfps_lottie_left_edge.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":270,"op":440,"w":240,"h":240,"nm":"Authorization_Fingerprint_WithFinger_NoCircle_Sensor_Finger_LeftEdge","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,120,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.29,2.142],[-13.375,1.375]],"o":[[6.625,-11],[4.244,-0.436]],"v":[[-29.875,-15.625],[3.375,-35.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.191,3.129],[-33.75,-10.375]],"o":[[-0.625,-10.25],[4.761,1.464]],"v":[[-27.375,9.5],[24.75,-20.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 6","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.066,1.372],[-0.75,7.625],[-3.196,3.664],[-8.288,-2.763],[0.125,-6.25],[4.191,-0.708],[7.547,1.755],[0,-6.005],[-4.625,-1.875],[-3.625,0]],"o":[[-4.75,-2.125],[1.055,-10.724],[5.125,-5.875],[10.125,3.375],[-0.103,5.138],[-8.875,1.5],[-5.375,-1.25],[0,6.25],[2.487,1.008],[1.79,0]],"v":[[-4.625,37.375],[-15.25,17.25],[-5.625,-1.625],[20.625,-8.25],[33.875,8.625],[25.375,18.25],[9.25,7.25],[-0.875,15.75],[8.625,29.25],[18.375,31.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 7","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.06,0.072],[-6.5,16.25]],"o":[[7.125,-0.25],[1.031,-2.577]],"v":[[8.875,47.375],[38.5,29.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 9","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.299,1.601],[-16.125,1.5]],"o":[[9.125,-11.25],[2.764,-0.257]],"v":[[-46.875,-41.75],[-6.875,-62.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 10","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.8,1.9],[-12.625,6.625]],"o":[[4,-9.5],[2.458,-1.29]],"v":[[-48.5,-16.625],[-24.375,-41.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 11","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.855,0.899],[-8.125,-1.625]],"o":[[8,-3.875],[2.722,0.544]],"v":[[-14.75,-46.625],[9.5,-49.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":390,"s":[100]},{"i":{"x":[0.468],"y":[1]},"o":{"x":[0.51],"y":[0]},"t":440,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.814,0.98],[3.625,5.625]],"o":[[-4.625,-2.5],[-1.503,-2.333]],"v":[[-13.125,64.375],[-27.125,52.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":270,"s":[0]},{"t":320,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":390,"s":[100]},{"i":{"x":[0.468],"y":[1]},"o":{"x":[0.51],"y":[0]},"t":440,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.182,1.689],[-2.375,8.25]],"o":[[-10.5,-15],[0.768,-2.667]],"v":[[-32.25,45.25],[-42.875,4.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":270,"s":[0]},{"t":320,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":390,"s":[100]},{"i":{"x":[0.468],"y":[1]},"o":{"x":[0.51],"y":[0]},"t":440,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.022,0.4],[1.125,8.25]],"o":[[-22.75,-4.5],[-0.375,-2.75]],"v":[[5.75,57.25],[-26.875,23]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":270,"s":[0]},{"t":320,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Layer 20","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.814,0.98],[3.625,5.625]],"o":[[-4.625,-2.5],[-1.503,-2.333]],"v":[[-13.125,64.375],[-27.125,52.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 19","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.182,1.689],[-2.375,8.25]],"o":[[-10.5,-15],[0.768,-2.667]],"v":[[-32.25,45.25],[-42.875,4.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape Layer 18","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.022,0.4],[1.125,8.25]],"o":[[-22.75,-4.5],[-0.375,-2.75]],"v":[[5.75,57.25],[-26.875,23]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape Layer 26","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.75,1.92],[5.625,3.5]],"o":[[8.5,-21.75],[-2.357,-1.466]],"v":[[49.75,34.25],[39.375,-11.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape Layer 25","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.42,2.018],[1.875,5.75]],"o":[[1.25,-6],[-0.86,-2.639]],"v":[[66,21.75],[63.875,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Shape Layer 24","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.664,1.952],[13.125,4.75]],"o":[[-4,-11.75],[-2.61,-0.945]],"v":[[61,-4.5],[31.875,-36.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"thumb","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.375,8.556,0],"ix":2,"l":2},"a":{"a":0,"k":[215.375,158.556,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.26,37.91],[39.3,9.75],[3.48,0.28],[0,0],[0.41,0.02],[5.54,-2.23],[0,0],[0.78,-0.37],[0,0],[0.94,-7.32],[-24.36,-43.08],[-3.15,0]],"o":[[-26.13,-49.49],[-3.32,-1.1],[0,0],[-0.45,0],[-5.97,-0.3],[0,0],[-0.79,0.31],[-18.55,8.39],[-3.55,6.46],[-4.52,31.97],[3.09,0.25],[44.9,0]],"v":[[83.92,30.12],[-17.81,-91.73],[-28.05,-93.81],[-28.34,-93.81],[-29.67,-93.88],[-47.15,-90.94],[-47.23,-90.94],[-49.59,-89.92],[-72.59,-70.76],[-79.4,-49.92],[-27.39,93.8],[-18.02,94.18]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431372549,0.403921598547,0.305882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[224.829,168.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1172,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw/sfps_lottie_no_animation.json b/res/raw/sfps_lottie_no_animation.json
new file mode 100644
index 0000000..744918d
--- /dev/null
+++ b/res/raw/sfps_lottie_no_animation.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":0,"op":1,"w":240,"h":240,"nm":"Authorization_Fingerprint_WithFinger_NoCircle_Sensor_Finger_NoAnimation","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,120,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.29,2.142],[-13.375,1.375]],"o":[[6.625,-11],[4.244,-0.436]],"v":[[-29.875,-15.625],[3.375,-35.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.191,3.129],[-33.75,-10.375]],"o":[[-0.625,-10.25],[4.761,1.464]],"v":[[-27.375,9.5],[24.75,-20.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 6","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.066,1.372],[-0.75,7.625],[-3.196,3.664],[-8.288,-2.763],[0.125,-6.25],[4.191,-0.708],[7.547,1.755],[0,-6.005],[-4.625,-1.875],[-3.625,0]],"o":[[-4.75,-2.125],[1.055,-10.724],[5.125,-5.875],[10.125,3.375],[-0.103,5.138],[-8.875,1.5],[-5.375,-1.25],[0,6.25],[2.487,1.008],[1.79,0]],"v":[[-4.625,37.375],[-15.25,17.25],[-5.625,-1.625],[20.625,-8.25],[33.875,8.625],[25.375,18.25],[9.25,7.25],[-0.875,15.75],[8.625,29.25],[18.375,31.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 7","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.06,0.072],[-6.5,16.25]],"o":[[7.125,-0.25],[1.031,-2.577]],"v":[[8.875,47.375],[38.5,29.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 9","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.299,1.601],[-16.125,1.5]],"o":[[9.125,-11.25],[2.764,-0.257]],"v":[[-46.875,-41.75],[-6.875,-62.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 10","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.8,1.9],[-12.625,6.625]],"o":[[4,-9.5],[2.458,-1.29]],"v":[[-48.5,-16.625],[-24.375,-41.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 11","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.855,0.899],[-8.125,-1.625]],"o":[[8,-3.875],[2.722,0.544]],"v":[[-14.75,-46.625],[9.5,-49.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Layer 20","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.814,0.98],[3.625,5.625]],"o":[[-4.625,-2.5],[-1.503,-2.333]],"v":[[-13.125,64.375],[-27.125,52.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 19","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.182,1.689],[-2.375,8.25]],"o":[[-10.5,-15],[0.768,-2.667]],"v":[[-32.25,45.25],[-42.875,4.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 18","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.022,0.4],[1.125,8.25]],"o":[[-22.75,-4.5],[-0.375,-2.75]],"v":[[5.75,57.25],[-26.875,23]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Layer 26","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.75,1.92],[5.625,3.5]],"o":[[8.5,-21.75],[-2.357,-1.466]],"v":[[49.75,34.25],[39.375,-11.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 25","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.42,2.018],[1.875,5.75]],"o":[[1.25,-6],[-0.86,-2.639]],"v":[[66,21.75],[63.875,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape Layer 24","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.664,1.952],[13.125,4.75]],"o":[[-4,-11.75],[-2.61,-0.945]],"v":[[61,-4.5],[31.875,-36.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"thumb","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.375,8.556,0],"ix":2,"l":2},"a":{"a":0,"k":[215.375,158.556,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.26,37.91],[39.3,9.75],[3.48,0.28],[0,0],[0.41,0.02],[5.54,-2.23],[0,0],[0.78,-0.37],[0,0],[0.94,-7.32],[-24.36,-43.08],[-3.15,0]],"o":[[-26.13,-49.49],[-3.32,-1.1],[0,0],[-0.45,0],[-5.97,-0.3],[0,0],[-0.79,0.31],[-18.55,8.39],[-3.55,6.46],[-4.52,31.97],[3.09,0.25],[44.9,0]],"v":[[83.92,30.12],[-17.81,-91.73],[-28.05,-93.81],[-28.34,-93.81],[-29.67,-93.88],[-47.15,-90.94],[-47.23,-90.94],[-49.59,-89.92],[-72.59,-70.76],[-79.4,-49.92],[-27.39,93.8],[-18.02,94.18]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431372549,0.403921598547,0.305882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[224.829,168.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1172,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw/sfps_lottie_pad_center.json b/res/raw/sfps_lottie_pad_center.json
new file mode 100644
index 0000000..865a8bb
--- /dev/null
+++ b/res/raw/sfps_lottie_pad_center.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":30,"op":200,"w":240,"h":240,"nm":"Authorization_Fingerprint_WithFinger_NoCircle_Sensor_Finger_PadCenter","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,120,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":200,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.29,2.142],[-13.375,1.375]],"o":[[6.625,-11],[4.244,-0.436]],"v":[[-29.875,-15.625],[3.375,-35.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":80,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":200,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.191,3.129],[-33.75,-10.375]],"o":[[-0.625,-10.25],[4.761,1.464]],"v":[[-27.375,9.5],[24.75,-20.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":80,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":200,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.066,1.372],[-0.75,7.625],[-3.196,3.664],[-8.288,-2.763],[0.125,-6.25],[4.191,-0.708],[7.547,1.755],[0,-6.005],[-4.625,-1.875],[-3.625,0]],"o":[[-4.75,-2.125],[1.055,-10.724],[5.125,-5.875],[10.125,3.375],[-0.103,5.138],[-8.875,1.5],[-5.375,-1.25],[0,6.25],[2.487,1.008],[1.79,0]],"v":[[-4.625,37.375],[-15.25,17.25],[-5.625,-1.625],[20.625,-8.25],[33.875,8.625],[25.375,18.25],[9.25,7.25],[-0.875,15.75],[8.625,29.25],[18.375,31.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":80,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":150,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":200,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.06,0.072],[-6.5,16.25]],"o":[[7.125,-0.25],[1.031,-2.577]],"v":[[8.875,47.375],[38.5,29.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":30,"s":[0]},{"t":80,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 1","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.29,2.142],[-13.375,1.375]],"o":[[6.625,-11],[4.244,-0.436]],"v":[[-29.875,-15.625],[3.375,-35.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 3","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.191,3.129],[-33.75,-10.375]],"o":[[-0.625,-10.25],[4.761,1.464]],"v":[[-27.375,9.5],[24.75,-20.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 6","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.066,1.372],[-0.75,7.625],[-3.196,3.664],[-8.288,-2.763],[0.125,-6.25],[4.191,-0.708],[7.547,1.755],[0,-6.005],[-4.625,-1.875],[-3.625,0]],"o":[[-4.75,-2.125],[1.055,-10.724],[5.125,-5.875],[10.125,3.375],[-0.103,5.138],[-8.875,1.5],[-5.375,-1.25],[0,6.25],[2.487,1.008],[1.79,0]],"v":[[-4.625,37.375],[-15.25,17.25],[-5.625,-1.625],[20.625,-8.25],[33.875,8.625],[25.375,18.25],[9.25,7.25],[-0.875,15.75],[8.625,29.25],[18.375,31.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Layer 7","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.06,0.072],[-6.5,16.25]],"o":[[7.125,-0.25],[1.031,-2.577]],"v":[[8.875,47.375],[38.5,29.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 9","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.299,1.601],[-16.125,1.5]],"o":[[9.125,-11.25],[2.764,-0.257]],"v":[[-46.875,-41.75],[-6.875,-62.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 10","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.8,1.9],[-12.625,6.625]],"o":[[4,-9.5],[2.458,-1.29]],"v":[[-48.5,-16.625],[-24.375,-41.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Layer 11","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.855,0.899],[-8.125,-1.625]],"o":[[8,-3.875],[2.722,0.544]],"v":[[-14.75,-46.625],[9.5,-49.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 20","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.814,0.98],[3.625,5.625]],"o":[[-4.625,-2.5],[-1.503,-2.333]],"v":[[-13.125,64.375],[-27.125,52.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape Layer 19","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.182,1.689],[-2.375,8.25]],"o":[[-10.5,-15],[0.768,-2.667]],"v":[[-32.25,45.25],[-42.875,4.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape Layer 18","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.022,0.4],[1.125,8.25]],"o":[[-22.75,-4.5],[-0.375,-2.75]],"v":[[5.75,57.25],[-26.875,23]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape Layer 26","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.75,1.92],[5.625,3.5]],"o":[[8.5,-21.75],[-2.357,-1.466]],"v":[[49.75,34.25],[39.375,-11.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Shape Layer 25","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.42,2.018],[1.875,5.75]],"o":[[1.25,-6],[-0.86,-2.639]],"v":[[66,21.75],[63.875,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"Shape Layer 24","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.664,1.952],[13.125,4.75]],"o":[[-4,-11.75],[-2.61,-0.945]],"v":[[61,-4.5],[31.875,-36.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"thumb","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.375,8.556,0],"ix":2,"l":2},"a":{"a":0,"k":[215.375,158.556,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.26,37.91],[39.3,9.75],[3.48,0.28],[0,0],[0.41,0.02],[5.54,-2.23],[0,0],[0.78,-0.37],[0,0],[0.94,-7.32],[-24.36,-43.08],[-3.15,0]],"o":[[-26.13,-49.49],[-3.32,-1.1],[0,0],[-0.45,0],[-5.97,-0.3],[0,0],[-0.79,0.31],[-18.55,8.39],[-3.55,6.46],[-4.52,31.97],[3.09,0.25],[44.9,0]],"v":[[83.92,30.12],[-17.81,-91.73],[-28.05,-93.81],[-28.34,-93.81],[-29.67,-93.88],[-47.15,-90.94],[-47.23,-90.94],[-49.59,-89.92],[-72.59,-70.76],[-79.4,-49.92],[-27.39,93.8],[-18.02,94.18]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431372549,0.403921598547,0.305882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[224.829,168.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1172,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw/sfps_lottie_right_edge.json b/res/raw/sfps_lottie_right_edge.json
new file mode 100644
index 0000000..9b9b961
--- /dev/null
+++ b/res/raw/sfps_lottie_right_edge.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":390,"op":560,"w":240,"h":240,"nm":"Authorization_Fingerprint_WithFinger_NoCircle_Sensor_Finger_RightEdge","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,120,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.29,2.142],[-13.375,1.375]],"o":[[6.625,-11],[4.244,-0.436]],"v":[[-29.875,-15.625],[3.375,-35.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.191,3.129],[-33.75,-10.375]],"o":[[-0.625,-10.25],[4.761,1.464]],"v":[[-27.375,9.5],[24.75,-20.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 6","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.066,1.372],[-0.75,7.625],[-3.196,3.664],[-8.288,-2.763],[0.125,-6.25],[4.191,-0.708],[7.547,1.755],[0,-6.005],[-4.625,-1.875],[-3.625,0]],"o":[[-4.75,-2.125],[1.055,-10.724],[5.125,-5.875],[10.125,3.375],[-0.103,5.138],[-8.875,1.5],[-5.375,-1.25],[0,6.25],[2.487,1.008],[1.79,0]],"v":[[-4.625,37.375],[-15.25,17.25],[-5.625,-1.625],[20.625,-8.25],[33.875,8.625],[25.375,18.25],[9.25,7.25],[-0.875,15.75],[8.625,29.25],[18.375,31.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 7","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.06,0.072],[-6.5,16.25]],"o":[[7.125,-0.25],[1.031,-2.577]],"v":[[8.875,47.375],[38.5,29.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Shape Layer 9","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.299,1.601],[-16.125,1.5]],"o":[[9.125,-11.25],[2.764,-0.257]],"v":[[-46.875,-41.75],[-6.875,-62.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Shape Layer 10","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.8,1.9],[-12.625,6.625]],"o":[[4,-9.5],[2.458,-1.29]],"v":[[-48.5,-16.625],[-24.375,-41.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 11","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.855,0.899],[-8.125,-1.625]],"o":[[8,-3.875],[2.722,0.544]],"v":[[-14.75,-46.625],[9.5,-49.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Layer 20","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.814,0.98],[3.625,5.625]],"o":[[-4.625,-2.5],[-1.503,-2.333]],"v":[[-13.125,64.375],[-27.125,52.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 19","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.182,1.689],[-2.375,8.25]],"o":[[-10.5,-15],[0.768,-2.667]],"v":[[-32.25,45.25],[-42.875,4.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 18","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.022,0.4],[1.125,8.25]],"o":[[-22.75,-4.5],[-0.375,-2.75]],"v":[[5.75,57.25],[-26.875,23]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"t":560,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.75,1.92],[5.625,3.5]],"o":[[8.5,-21.75],[-2.357,-1.466]],"v":[[49.75,34.25],[39.375,-11.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":390,"s":[0]},{"t":440,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"t":560,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.42,2.018],[1.875,5.75]],"o":[[1.25,-6],[-0.86,-2.639]],"v":[[66,21.75],[63.875,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":390,"s":[0]},{"t":440,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"t":560,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.664,1.952],[13.125,4.75]],"o":[[-4,-11.75],[-2.61,-0.945]],"v":[[61,-4.5],[31.875,-36.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":390,"s":[0]},{"t":440,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape Layer 26","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.75,1.92],[5.625,3.5]],"o":[[8.5,-21.75],[-2.357,-1.466]],"v":[[49.75,34.25],[39.375,-11.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape Layer 25","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.42,2.018],[1.875,5.75]],"o":[[1.25,-6],[-0.86,-2.639]],"v":[[66,21.75],[63.875,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Shape Layer 24","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.664,1.952],[13.125,4.75]],"o":[[-4,-11.75],[-2.61,-0.945]],"v":[[61,-4.5],[31.875,-36.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"thumb","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.375,8.556,0],"ix":2,"l":2},"a":{"a":0,"k":[215.375,158.556,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.26,37.91],[39.3,9.75],[3.48,0.28],[0,0],[0.41,0.02],[5.54,-2.23],[0,0],[0.78,-0.37],[0,0],[0.94,-7.32],[-24.36,-43.08],[-3.15,0]],"o":[[-26.13,-49.49],[-3.32,-1.1],[0,0],[-0.45,0],[-5.97,-0.3],[0,0],[-0.79,0.31],[-18.55,8.39],[-3.55,6.46],[-4.52,31.97],[3.09,0.25],[44.9,0]],"v":[[83.92,30.12],[-17.81,-91.73],[-28.05,-93.81],[-28.34,-93.81],[-29.67,-93.88],[-47.15,-90.94],[-47.23,-90.94],[-49.59,-89.92],[-72.59,-70.76],[-79.4,-49.92],[-27.39,93.8],[-18.02,94.18]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431372549,0.403921598547,0.305882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[224.829,168.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1172,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/raw/sfps_lottie_tip.json b/res/raw/sfps_lottie_tip.json
new file mode 100644
index 0000000..dd3ce11
--- /dev/null
+++ b/res/raw/sfps_lottie_tip.json
@@ -0,0 +1 @@
+{"v":"5.9.0","fr":60,"ip":150,"op":320,"w":240,"h":240,"nm":"Authorization_Fingerprint_WithFinger_NoCircle_Sensor_Finger_Tip","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Null 1","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120,120,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Shape Layer 1","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.29,2.142],[-13.375,1.375]],"o":[[6.625,-11],[4.244,-0.436]],"v":[[-29.875,-15.625],[3.375,-35.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Shape Layer 3","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.191,3.129],[-33.75,-10.375]],"o":[[-0.625,-10.25],[4.761,1.464]],"v":[[-27.375,9.5],[24.75,-20.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Shape Layer 6","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[3.066,1.372],[-0.75,7.625],[-3.196,3.664],[-8.288,-2.763],[0.125,-6.25],[4.191,-0.708],[7.547,1.755],[0,-6.005],[-4.625,-1.875],[-3.625,0]],"o":[[-4.75,-2.125],[1.055,-10.724],[5.125,-5.875],[10.125,3.375],[-0.103,5.138],[-8.875,1.5],[-5.375,-1.25],[0,6.25],[2.487,1.008],[1.79,0]],"v":[[-4.625,37.375],[-15.25,17.25],[-5.625,-1.625],[20.625,-8.25],[33.875,8.625],[25.375,18.25],[9.25,7.25],[-0.875,15.75],[8.625,29.25],[18.375,31.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"Shape Layer 7","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.06,0.072],[-6.5,16.25]],"o":[[7.125,-0.25],[1.031,-2.577]],"v":[[8.875,47.375],[38.5,29.375]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215701234,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":270,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":320,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.299,1.601],[-16.125,1.5]],"o":[[9.125,-11.25],[2.764,-0.257]],"v":[[-46.875,-41.75],[-6.875,-62.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":150,"s":[0]},{"t":200,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":270,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":320,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.8,1.9],[-12.625,6.625]],"o":[[4,-9.5],[2.458,-1.29]],"v":[[-48.5,-16.625],[-24.375,-41.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":150,"s":[0]},{"t":200,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".blue100","cl":"blue100","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":270,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":320,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":460,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":510,"s":[100]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":840,"s":[100]},{"t":890,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.855,0.899],[-8.125,-1.625]],"o":[[8,-3.875],[2.722,0.544]],"v":[[-14.75,-46.625],[9.5,-49.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529411765,0.890196078431,0.988235294118,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.3],"y":[0]},"t":150,"s":[0]},{"t":200,"s":[100]}],"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":900,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Shape Layer 9","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.299,1.601],[-16.125,1.5]],"o":[[9.125,-11.25],[2.764,-0.257]],"v":[[-46.875,-41.75],[-6.875,-62.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 10","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.8,1.9],[-12.625,6.625]],"o":[[4,-9.5],[2.458,-1.29]],"v":[[-48.5,-16.625],[-24.375,-41.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Shape Layer 11","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.855,0.899],[-8.125,-1.625]],"o":[[8,-3.875],[2.722,0.544]],"v":[[-14.75,-46.625],[9.5,-49.5]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Shape Layer 20","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.814,0.98],[3.625,5.625]],"o":[[-4.625,-2.5],[-1.503,-2.333]],"v":[[-13.125,64.375],[-27.125,52.625]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Shape Layer 19","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.182,1.689],[-2.375,8.25]],"o":[[-10.5,-15],[0.768,-2.667]],"v":[[-32.25,45.25],[-42.875,4.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"Shape Layer 18","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.022,0.4],[1.125,8.25]],"o":[[-22.75,-4.5],[-0.375,-2.75]],"v":[[5.75,57.25],[-26.875,23]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":900,"st":0,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"Shape Layer 26","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.75,1.92],[5.625,3.5]],"o":[[8.5,-21.75],[-2.357,-1.466]],"v":[[49.75,34.25],[39.375,-11.75]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"Shape Layer 25","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.42,2.018],[1.875,5.75]],"o":[[1.25,-6],[-0.86,-2.639]],"v":[[66,21.75],[63.875,4]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"Shape Layer 24","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,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.664,1.952],[13.125,4.75]],"o":[[-4,-11.75],[-2.61,-0.945]],"v":[[61,-4.5],[31.875,-36.25]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.596078431373,0.321568627451,0.239215686275,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"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,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":660,"st":0,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"thumb","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[9.375,8.556,0],"ix":2,"l":2},"a":{"a":0,"k":[215.375,158.556,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-18.26,37.91],[39.3,9.75],[3.48,0.28],[0,0],[0.41,0.02],[5.54,-2.23],[0,0],[0.78,-0.37],[0,0],[0.94,-7.32],[-24.36,-43.08],[-3.15,0]],"o":[[-26.13,-49.49],[-3.32,-1.1],[0,0],[-0.45,0],[-5.97,-0.3],[0,0],[-0.79,0.31],[-18.55,8.39],[-3.55,6.46],[-4.52,31.97],[3.09,0.25],[44.9,0]],"v":[[83.92,30.12],[-17.81,-91.73],[-28.05,-93.81],[-28.34,-93.81],[-29.67,-93.88],[-47.15,-90.94],[-47.23,-90.94],[-49.59,-89.92],[-72.59,-70.76],[-79.4,-49.92],[-27.39,93.8],[-18.02,94.18]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.678431372549,0.403921598547,0.305882352941,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[224.829,168.932],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"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":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":1172,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/res/values-night/colors.xml b/res/values-night/colors.xml
index 0017c2c..e4b402f 100644
--- a/res/values-night/colors.xml
+++ b/res/values-night/colors.xml
@@ -50,6 +50,12 @@
     <color name="biometric_enroll_intro_color_outline">#5e5e5e</color>
     <color name="fingerprint_enrollment_finish_color_outline">#669df6</color>
 
+    <!-- Side fingerprint sensor enrollment animation colors -->
+    <color name="sfps_enrollment_fp_captured_color">#d2e3fc</color> <!-- Blue 100 -->
+    <color name="sfps_enrollment_fp_error_color">#fad2cf</color> <!-- Red 100 -->
+    <color name="sfps_enrollment_progress_bar_fill_color">#669df6</color> <!-- Blue 400 -->
+    <color name="sfps_enrollment_progress_bar_error_color">#ee675c</color> <!-- Red 400 -->
+
     <!-- Material inverse ripple color, useful for inverted backgrounds. -->
     <color name="ripple_material_inverse">@*android:color/ripple_material_light</color>
 
diff --git a/res/values/aliases.xml b/res/values/aliases.xml
index 881d3ca..e17198b 100644
--- a/res/values/aliases.xml
+++ b/res/values/aliases.xml
@@ -21,6 +21,7 @@
      <item name="fingerprint_enroll_find_sensor" type="layout">@layout/fingerprint_enroll_find_sensor_base</item>
      <item name="fingerprint_enroll_enrolling" type="layout">@layout/fingerprint_enroll_enrolling_base</item>
      <item name="fingerprint_enroll_finish" type="layout">@layout/fingerprint_enroll_finish_base</item>
+     <item name="sfps_enroll_finish" type="layout">@layout/sfps_enroll_finish_base</item>
      <item name="choose_lock_pattern" type="layout">@layout/choose_lock_pattern_common</item>
 </resources>
 
diff --git a/res/values/colors.xml b/res/values/colors.xml
index 7ca1ab2..2a96bf0 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -201,6 +201,12 @@
     <!-- Fingerprint enrollment color -->
     <color name="fingerprint_enrollment_finish_color_outline">#1A73E8</color>
 
+    <!-- Side fingerprint sensor guided enrollment fill colors -->
+    <color name="sfps_enrollment_fp_captured_color">#d2e3fc</color> <!-- Blue 100 -->
+    <color name="sfps_enrollment_fp_error_color">#fad2cf</color> <!-- Red 100 -->
+    <color name="sfps_enrollment_progress_bar_fill_color">#1a73e8</color> <!-- Blue 600 -->
+    <color name="sfps_enrollment_progress_bar_error_color">#d93025</color> <!-- Red 600 -->
+
     <!-- Material inverse ripple color, useful for inverted backgrounds. -->
     <color name="ripple_material_inverse">@*android:color/ripple_material_dark</color>
 
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 33786cc..8a1a685 100755
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -222,6 +222,7 @@
     <dimen name="fingerprint_error_text_appear_distance">16dp</dimen>
     <dimen name="fingerprint_error_text_disappear_distance">-8dp</dimen>
     <dimen name="fingerprint_animation_size">88dp</dimen>
+    <dimen name="sfps_enrollment_finished_icon_max_size">295dp</dimen>
     <dimen name="fingerprint_progress_bar_max_size">240dp</dimen>
     <dimen name="fingerprint_progress_bar_min_size">120dp</dimen>
     <dimen name="fingerprint_enrolling_content_margin_vertical">24dp</dimen>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 9341b95..b0bb463 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -743,7 +743,11 @@
     <!-- Introduction detail message shown in face education [CHAR LIMIT=NONE] -->
     <string name="security_settings_face_enroll_education_message"></string>
     <!-- Introduction detail message shown in face education for accessibility [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_education_message_accessibility"></string>
+    <string name="security_settings_face_enroll_education_message_accessibility" product="default"></string>
+    <!-- Introduction detail message shown in face education for accessibility [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_education_message_accessibility" product="tablet"></string>
+    <!-- Introduction detail message shown in face education for accessibility [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_education_message_accessibility" product="device"></string>
     <!-- Button that takes the user to the enrollment activity [CHAR LIMIT=20] -->
     <string name="security_settings_face_enroll_education_start">Start</string>
     <!-- Confirmation dialog message shown when users with system accessibility features enabled try to start the non-accessibility version of enrollment [CHAR LIMIT=150] -->
@@ -755,7 +759,11 @@
     <!-- Button shown which shows accessibility toggles for face enrollment when clicked. [CHAR LIMIT=32] -->
     <string name="security_settings_face_enroll_introduction_accessibility">Use accessibility setup</string>
     <!-- Additional details shown when the accessibility toggle is expanded. [CHAR LIMIT=NONE]-->
-    <string name="security_settings_face_enroll_introduction_accessibility_expanded"></string>
+    <string name="security_settings_face_enroll_introduction_accessibility_expanded" product="default"></string>
+    <!-- Additional details shown when the accessibility toggle is expanded. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_face_enroll_introduction_accessibility_expanded" product="tablet"></string>
+    <!-- Additional details shown when the accessibility toggle is expanded. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_face_enroll_introduction_accessibility_expanded" product="device"></string>
     <!-- Message shown for a toggle which when enabled, allows the user to enroll using a simpler flow for accessibility [CHAR LIMIT=NONE] -->
     <string name="security_settings_face_enroll_introduction_accessibility_diversity"></string>
     <!-- Message shown for a toggle which when enabled, allows the user to enroll using a simpler flow for accessibility [CHAR LIMIT=NONE] -->
@@ -775,7 +783,11 @@
     <!-- Introduction title shown in face enrollment to introduce the face unlock feature, when face unlock is disabled by device admin [CHAR LIMIT=60] -->
     <string name="security_settings_face_enroll_introduction_title_unlock_disabled">Use your face to authenticate</string>
     <!-- Introduction detail message shown in face enrollment dialog [CHAR LIMIT=NONE]-->
-    <string name="security_settings_face_enroll_introduction_message">Use your face to unlock your phone, authorize purchases, or sign in to apps.</string>
+    <string name="security_settings_face_enroll_introduction_message" product="default">Use your face to unlock your phone, authorize purchases, or sign in to apps.</string>
+    <!-- Introduction detail message shown in face enrollment dialog [CHAR LIMIT=NONE]-->
+    <string name="security_settings_face_enroll_introduction_message" product="tablet">Use your face to unlock your tablet, authorize purchases, or sign in to apps.</string>
+    <!-- Introduction detail message shown in face enrollment dialog [CHAR LIMIT=NONE]-->
+    <string name="security_settings_face_enroll_introduction_message" product="device">Use your face to unlock your device, authorize purchases, or sign in to apps.</string>
     <!-- Introduction detail message shown in face enrollment dialog when asking for parental consent [CHAR LIMIT=NONE]-->
     <string name="security_settings_face_enroll_introduction_consent_message_0" product="default">Allow your child to use their face to unlock their phone</string>
     <!-- Introduction detail message shown in face enrollment dialog when asking for parental consent [CHAR LIMIT=NONE]-->
@@ -799,32 +811,72 @@
     <!-- Message on the face enrollment introduction page that provides information about glasses when asking for parental consent. [CHAR LIMIT=NONE] -->
     <string name="security_settings_face_enroll_introduction_info_consent_glasses"></string>
     <!-- Message on the face enrollment introduction page that provides information about what could cause the phone to unlock. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_info_looking"></string>
+    <string name="security_settings_face_enroll_introduction_info_looking" product="default"></string>
+    <!-- Message on the face enrollment introduction page that provides information about what could cause the phone to unlock. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_looking" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that provides information about what could cause the phone to unlock. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_looking" product="device"></string>
     <!-- Message on the face enrollment introduction page that provides information about what could cause the phone to unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_info_consent_looking"></string>
+    <string name="security_settings_face_enroll_introduction_info_consent_looking" product="default"></string>
+    <!-- Message on the face enrollment introduction page that provides information about what could cause the phone to unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_consent_looking" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that provides information about what could cause the phone to unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_consent_looking" product="device"></string>
     <!-- Message on the face enrollment introduction page that provides information about the relative security of face for unlocking the phone. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_info_consent_less_secure"></string>
+    <string name="security_settings_face_enroll_introduction_info_consent_less_secure" product="default"></string>
+    <!-- Message on the face enrollment introduction page that provides information about the relative security of face for unlocking the phone. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_consent_less_secure" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that provides information about the relative security of face for unlocking the phone. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_consent_less_secure" product="device"></string>
     <!-- Message on the face enrollment introduction page that provides information about the relative security of face for unlocking the phone for parental consent. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_info_less_secure"></string>
+    <string name="security_settings_face_enroll_introduction_info_less_secure" product="default"></string>
+    <!-- Message on the face enrollment introduction page that provides information about the relative security of face for unlocking the phone for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_less_secure" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that provides information about the relative security of face for unlocking the phone for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_less_secure" product="device"></string>
     <!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_info_gaze"></string>
+    <string name="security_settings_face_enroll_introduction_info_gaze" product="default"></string>
+    <!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_gaze" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_gaze" product="device"></string>
     <!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_info_consent_gaze"></string>
+    <string name="security_settings_face_enroll_introduction_info_consent_gaze" product="default"></string>
+    <!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_consent_gaze" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that provides information about how to require eyes to be open for Face Unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_info_consent_gaze" product="device"></string>
 
     <!-- Title of a section on the face enrollment introduction page that explains how face unlock works. [CHAR LIMIT=40] -->
     <string name="security_settings_face_enroll_introduction_how_title"></string>
     <!-- Message on the face enrollment introduction page that explains how face unlock works. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_how_message"></string>
+    <string name="security_settings_face_enroll_introduction_how_message" product="default"></string>
+    <!-- Message on the face enrollment introduction page that explains how face unlock works. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_how_message" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that explains how face unlock works. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_how_message" product="device"></string>
     <!-- Message on the face enrollment introduction page that explains how Face Unlock works when asking for parental consent. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_how_consent_message"></string>
+    <string name="security_settings_face_enroll_introduction_how_consent_message" product="default"></string>
+    <!-- Message on the face enrollment introduction page that explains how Face Unlock works when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_how_consent_message" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that explains how Face Unlock works when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_how_consent_message" product="device"></string>
     <!-- Title of a section on the face enrollment introduction page that explains privacy controls for face unlock. [CHAR LIMIT=NONE] -->
     <string name="security_settings_face_enroll_introduction_control_title"></string>
     <!-- Title of a section on the face enrollment introduction page that explains privacy controls for face unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
     <string name="security_settings_face_enroll_introduction_control_consent_title"></string>
     <!-- Message on the face enrollment introduction page that explains privacy controls for face unlock [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_control_message"></string>
+    <string name="security_settings_face_enroll_introduction_control_message" product="default"></string>
+    <!-- Message on the face enrollment introduction page that explains privacy controls for face unlock [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_control_message" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that explains privacy controls for face unlock [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_control_message" product="device"></string>
     <!-- Message on the face enrollment introduction page that explains privacy controls for face unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_face_enroll_introduction_control_consent_message"></string>
+    <string name="security_settings_face_enroll_introduction_control_consent_message" product="default"></string>
+    <!-- Message on the face enrollment introduction page that explains privacy controls for face unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_control_consent_message" product="tablet"></string>
+    <!-- Message on the face enrollment introduction page that explains privacy controls for face unlock when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_face_enroll_introduction_control_consent_message" product="device"></string>
     <!-- Title shown in face enrollment dialog [CHAR LIMIT=40] -->
     <string name="security_settings_face_enroll_repeat_title">Center your face in the circle</string>
     <!-- Button text to skip enrollment of face [CHAR LIMIT=40] -->
@@ -918,7 +970,11 @@
     <!-- Introduction detail message shown in fingerprint enrollment dialog (default) [CHAR LIMIT=NONE]-->
     <string name="security_settings_fingerprint_enroll_introduction_v2_message" product="default">Use your fingerprint to unlock your phone or verify it\u2019s you, like when you sign in to apps or approve a purchase.</string>
     <!-- Introduction detail message shown in fingerprint enrollment dialog when asking for parental consent [CHAR LIMIT=NONE]-->
-    <string name="security_settings_fingerprint_enroll_introduction_consent_message">Allow your child to use their fingerprint to unlock their phone or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more.</string>
+    <string name="security_settings_fingerprint_enroll_introduction_consent_message" product="default">Allow your child to use their fingerprint to unlock their phone or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more.</string>
+    <!-- Introduction detail message shown in fingerprint enrollment dialog when asking for parental consent [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_enroll_introduction_consent_message" product="tablet">Allow your child to use their fingerprint to unlock their tablet or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more.</string>
+    <!-- Introduction detail message shown in fingerprint enrollment dialog when asking for parental consent [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_enroll_introduction_consent_message" product="device">Allow your child to use their fingerprint to unlock their device or verify it\u2019s them. This happens when they sign in to apps, approve a purchase, and more.</string>
     <!-- Introduction title shown in the bottom of fingerprint enrollment dialog [CHAR LIMIT=NONE]-->
     <string name="security_settings_fingerprint_enroll_introduction_footer_title_1">You\u2019re in control</string>
     <!-- Introduction title shown in the bottom of fingerprint enrollment dialog [CHAR LIMIT=NONE]-->
@@ -939,6 +995,16 @@
     <string name="setup_fingerprint_enroll_skip_after_adding_lock_text">Fingerprint setup only takes a minute or two. If you skip this, you can add your fingerprint later in settings.</string>
     <!-- Title of dialog shown when the user tries to skip setting up a screen lock, warning them of potential consequences of not doing so [CHAR LIMIT=30]-->
 
+    <!-- Introduction detail message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_message_setup">When you see this icon, use your fingerprint for authentication, like when you sign in to apps or approve a purchase</string>
+    <!-- Introduction subtitle message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_title_1">Keep in mind</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_1" product="default">Using your fingerprint to unlock your phone may be less secure than a strong pattern or PIN</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_1" product="tablet">Using your fingerprint to unlock your tablet may be less secure than a strong pattern or PIN</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_1" product="device">Using your fingerprint to unlock your device may be less secure than a strong pattern or PIN</string>
     <!-- Introduction subtitle message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
     <string name="security_settings_fingerprint_v2_enroll_introduction_footer_title_2">How it works</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
@@ -946,13 +1012,29 @@
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE]-->
     <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_2">Fingerprint Unlock creates a unique model of your child\u2019s fingerprint to verify it\u2019s them. To create this fingerprint model during setup, they will take images of their fingerprint from different positions.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
-    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_3">When you use Pixel Imprint, images are used to update your fingerprint model. Images used to create your fingerprint model are never stored, but the fingerprint model is stored securely on your phone and never leaves the phone. All processing occurs securely on your phone.</string>
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_3" product="default">When you use Pixel Imprint, images are used to update your fingerprint model. Images used to create your fingerprint model are never stored, but the fingerprint model is stored securely on your phone and never leaves the phone. All processing occurs securely on your phone.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_3" product="tablet">When you use Pixel Imprint, images are used to update your fingerprint model. Images used to create your fingerprint model are never stored, but the fingerprint model is stored securely on your tablet and never leaves the tablet. All processing occurs securely on your tablet.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_3" product="device">When you use Pixel Imprint, images are used to update your fingerprint model. Images used to create your fingerprint model are never stored, but the fingerprint model is stored securely on your device and never leaves the device. All processing occurs securely on your device.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE]-->
-    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3">When they use Pixel Imprint, images are used to update their fingerprint model. Images used to create your child\u2019s fingerprint model are never stored, but the fingerprint model is stored securely on the phone and never leaves the phone. All processing occurs securely on the phone.</string>
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3" product="default">When they use Pixel Imprint, images are used to update their fingerprint model. Images used to create your child\u2019s fingerprint model are never stored, but the fingerprint model is stored securely on the phone and never leaves the phone. All processing occurs securely on the phone.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3" product="tablet">When they use Pixel Imprint, images are used to update their fingerprint model. Images used to create your child\u2019s fingerprint model are never stored, but the fingerprint model is stored securely on the tablet and never leaves the tablet. All processing occurs securely on the tablet.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_3" product="device">When they use Pixel Imprint, images are used to update their fingerprint model. Images used to create your child\u2019s fingerprint model are never stored, but the fingerprint model is stored securely on the device and never leaves the device. All processing occurs securely on the device.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4">You can delete your fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the phone until you delete them.</string>
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4" product="default">You can delete your fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the phone until you delete them.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4" product="tablet">You can delete your fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the tablet until you delete them.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_4" product="device">You can delete your fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the device until you delete them.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4">You and your child can delete their fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the phone until they\u2019re deleted.</string>
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="default">You and your child can delete their fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the phone until they\u2019re deleted.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="tablet">You and your child can delete their fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the tablet until they\u2019re deleted.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_4" product="device">You and your child can delete their fingerprint images and model, or turn off Fingerprint Unlock at any time in Settings. Fingerprint images and models are stored on the device until they\u2019re deleted.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE] -->
     <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="default">Your phone can be unlocked when you don\u2019t intend to, like if someone holds it up to your finger.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE] -->
@@ -960,7 +1042,11 @@
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE] -->
     <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_5" product="device">Your device can be unlocked when you don\u2019t intend to, like if someone holds it up to your finger.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE] -->
-    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_5">Your child\u2019s phone can be unlocked when they don\u2019t intend to, like if someone holds it up to their finger.</string>
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_5" product="default">Your child\u2019s phone can be unlocked when they don\u2019t intend to, like if someone holds it up to their finger.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_5" product="tablet">Your child\u2019s tablet can be unlocked when they don\u2019t intend to, like if someone holds it up to their finger.</string>
+    <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE] -->
+    <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_consent_5" product="device">Your child\u2019s device can be unlocked when they don\u2019t intend to, like if someone holds it up to their finger.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard. [CHAR LIMIT=NONE] -->
     <string name="security_settings_fingerprint_v2_enroll_introduction_footer_message_6">For best results, use a screen protector that\u2019s Made for Google certified. With other screen protectors, your fingerprint may not work.</string>
     <!-- Introduction description message shown in fingerprint enrollment introduction screen in setup wizard when asking for parental consent. [CHAR LIMIT=NONE] -->
@@ -1031,15 +1117,23 @@
     <string name="cancel_lock_screen_dialog_button_label">Cancel</string>
     <!-- Introduction title shown in fingerprint enrollment dialog to locate the sensor [CHAR LIMIT=29] -->
     <string name="security_settings_fingerprint_enroll_find_sensor_title">Touch the sensor</string>
-    <!-- Introduction title shown in fingerprint enrollment dialog to locate the sensor [CHAR LIMIT=60] -->
+    <!-- Introduction title shown in SFPS enrollment dialog to locate the sensor [CHAR LIMIT=60] -->
+    <string name="security_settings_sfps_enroll_find_sensor_title">Touch the power button without pressing it</string>
+    <!-- Introduction title shown in UDFPS enrollment dialog to locate the sensor [CHAR LIMIT=60] -->
     <string name="security_settings_udfps_enroll_find_sensor_title">How to set up your fingerprint</string>
     <!-- Message shown in fingerprint enrollment dialog to locate the sensor -->
     <string name="security_settings_fingerprint_enroll_find_sensor_message">It\u2019s on the back of your phone. Use your index finger.</string>
-    <!-- Message shown in fingerprint enrollment dialog to locate the sensor [CHAR LIMIT=NONE]-->
+    <!-- Message shown in SFPS enrollment dialog to locate the sensor (tablet) [CHAR LIMIT=NONE]-->
+    <string name="security_settings_sfps_enroll_find_sensor_message" product="tablet">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the tablet.\n\nPressing the power button turns off the screen.</string>
+    <!-- Message shown in SFPS enrollment dialog to locate the sensor (device) [CHAR LIMIT=NONE]-->
+    <string name="security_settings_sfps_enroll_find_sensor_message" product="device">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the device.\n\nPressing the power button turns off the screen.</string>
+    <!-- Message shown in SFPS enrollment dialog to locate the sensor (default) [CHAR LIMIT=NONE]-->
+    <string name="security_settings_sfps_enroll_find_sensor_message" product="default">The fingerprint sensor is on the power button. It’s the flat button next to the raised volume button on the edge of the phone.\n\nPressing the power button turns off the screen.</string>
+    <!-- Message shown in UDFPS enrollment dialog to locate the sensor [CHAR LIMIT=NONE]-->
     <string name="security_settings_udfps_enroll_find_sensor_message">The fingerprint sensor is on your screen. You\u2019ll capture your fingerprint on the next screen.</string>
     <!-- Button for starting fingerprint enrollment. [CHAR LIMIT=10]-->
     <string name="security_settings_udfps_enroll_find_sensor_start_button">Start</string>
-    <!-- Message announced to a11y users during fingerprint enrollment to help them locate the sensor. [CHAR LIMIT=NONE] -->
+    <!-- Message announced to a11y users during UDFPS enrollment to help them locate the sensor. [CHAR LIMIT=NONE] -->
     <string name="security_settings_udfps_enroll_a11y">Move your finger across the screen to find the sensor. Touch &amp; hold the fingerprint sensor.</string>
     <!-- Content description of graphic that shows where the fingerprint of the device is [CHAR LIMIT=NONE] -->
     <string name="security_settings_fingerprint_enroll_find_sensor_content_description">Illustration with device and fingerprint sensor location</string>
@@ -1055,8 +1149,10 @@
     <string name="security_settings_fingerprint_enroll_start_title">Touch the sensor</string>
     <!-- Message shown in fingerprint enrollment dialog to begin enrollment [CHAR LIMIT=NONE] -->
     <string name="security_settings_fingerprint_enroll_start_message">Put your finger on the sensor and lift after you feel a vibration</string>
-    <!-- Message shown in fingerprint enrollment dialog to begin enrollment [CHAR LIMIT=NONE] -->
+    <!-- Message shown in UDFPS enrollment dialog to begin enrollment [CHAR LIMIT=NONE] -->
     <string name="security_settings_udfps_enroll_start_message">Keep your fingerprint flat on the sensor until you feel a vibration</string>
+    <!-- Message shown in SFPS enrollment dialog to begin enrollment [CHAR LIMIT=NONE] -->
+    <string name="security_settings_sfps_enroll_start_message">Without pressing the button, keep your fingerprint on the sensor until you feel a vibration.\n\nMove your finger slightly each time. This helps capture more of your fingerprint.</string>
     <!-- Title shown in fingerprint enrollment [CHAR LIMIT=NONE]-->
     <string name="security_settings_fingerprint_enroll_udfps_title">Touch &amp; hold the fingerprint sensor</string>
     <!-- Title shown in fingerprint enrollment dialog to repeat touching the fingerprint sensor [CHAR LIMIT=40] -->
@@ -1075,14 +1171,28 @@
     <string name="security_settings_udfps_enroll_left_edge_title">Place the left edge of your finger</string>
     <!-- Title shown during fingerprint enrollment that instructs the user to enroll the right edge of their finger [CHAR LIMIT=80] -->
     <string name="security_settings_udfps_enroll_right_edge_title">Place the right edge of your finger</string>
+    <!-- Title shown during SFPS enrollment that instructs the user to enroll the center of their finger [CHAR LIMIT=80] -->
+    <string name="security_settings_sfps_enroll_finger_center_title">Place the center part of your finger on the sensor</string>
+    <!-- Title shown during SFPS enrollment that instructs the user to enroll their fingertip [CHAR LIMIT=80] -->
+    <string name="security_settings_sfps_enroll_fingertip_title">Place the tip of your finger on the sensor</string>
+    <!-- Title shown during SFPS enrollment that instructs the user to enroll the left edge of their finger [CHAR LIMIT=80] -->
+    <string name="security_settings_sfps_enroll_left_edge_title">Place the left edge of your finger on the sensor</string>
+    <!-- Title shown during SFPS enrollment that instructs the user to enroll the right edge of their finger [CHAR LIMIT=80] -->
+    <string name="security_settings_sfps_enroll_right_edge_title">Finally, place the right edge of your finger on the sensor</string>
     <!-- Message shown during fingerprint enrollment that instructs the user to enroll the edges of their finger [CHAR LIMIT=160] -->
     <string name="security_settings_udfps_enroll_edge_message">Place the side of your fingerprint on the sensor and hold, then switch to the other side</string>
     <!-- Message shown in fingerprint enrollment asking users to repeat touching the fingerprint sensor. [CHAR LIMIT=160] -->
     <string name="security_settings_udfps_enroll_repeat_a11y_message">This helps capture more of your fingerprint</string>
-    <!-- Message read to a11y users when enrollment progress is made. The number is from 0 to 100. [CHAR LIMIT=NONE]-->
+    <!-- Message read to a11y users when SFPS enrollment progress is made. The number is from 0 to 100. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_sfps_enroll_progress_a11y_message">Enrolling fingerprint <xliff:g id="percentage" example="10">%d</xliff:g> percent</string>
+    <!-- a11y label on finger animation indicating SFPS enrollment progress. The number is from 0 to 100. [CHAR LIMIT=NONE]-->
+    <string name="security_settings_sfps_animation_a11y_label">Enrolled <xliff:g id="percentage" example="10">%d</xliff:g> percent</string>
+    <!-- Message read to a11y users when UDFPS enrollment progress is made. The number is from 0 to 100. [CHAR LIMIT=NONE]-->
     <string name="security_settings_udfps_enroll_progress_a11y_message">Enrolling fingerprint <xliff:g id="percentage" example="10">%d</xliff:g> percent</string>
     <!-- Title shown in fingerprint enrollment dialog once enrollment is completed [CHAR LIMIT=29] -->
     <string name="security_settings_fingerprint_enroll_finish_title">Fingerprint added</string>
+    <!-- Message shown in SFPS enrollment dialog once enrollment is completed [CHAR LIMIT=NONE] -->
+    <string name="security_settings_sfps_enroll_finish">Now you can use your fingerprint to unlock your tablet or verify it\u2019s you, like when you sign in to apps or approve a purchase</string>
     <!-- Message shown in fingerprint enrollment dialog once enrollment is completed (tablet) [CHAR LIMIT=NONE] -->
     <string name="security_settings_fingerprint_enroll_finish_v2_message" product="tablet">Now you can use your fingerprint to unlock your tablet or verify it\u2019s you, like when you sign in to apps</string>
     <!-- Message shown in fingerprint enrollment dialog once enrollment is completed (device) [CHAR LIMIT=NONE] -->
@@ -6451,9 +6561,17 @@
     <!-- [CHAR_LIMIT=NONE] Battery usage item for background usage time -->
     <string name="battery_usage_for_background_time">Background: <xliff:g id="time">%s</xliff:g></string>
     <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer content -->
-    <string name="battery_usage_screen_footer">Battery usage data is approximate and doesn\'t measure usage when phone is charging</string>
+    <string name="battery_usage_screen_footer" product="default">Battery usage data is approximate and doesn\'t measure usage when phone is charging</string>
+    <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer content -->
+    <string name="battery_usage_screen_footer" product="tablet">Battery usage data is approximate and doesn\'t measure usage when tablet is charging</string>
+    <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer content -->
+    <string name="battery_usage_screen_footer" product="device">Battery usage data is approximate and doesn\'t measure usage when device is charging</string>
     <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer for empty content -->
-    <string name="battery_usage_screen_footer_empty">Battery usage data will be available after you use your phone for a few hours</string>
+    <string name="battery_usage_screen_footer_empty" product="default">Battery usage data will be available after you use your phone for a few hours</string>
+    <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer for empty content -->
+    <string name="battery_usage_screen_footer_empty" product="tablet">Battery usage data will be available after you use your tablet for a few hours</string>
+    <!-- [CHAR_LIMIT=NONE] Battery usage main screen footer for empty content -->
+    <string name="battery_usage_screen_footer_empty" product="device">Battery usage data will be available after you use your device for a few hours</string>
     <!-- [CHAR_LIMIT=NONE] Accessibility content description for battery chart view. -->
     <string name="battery_usage_chart">Battery usage chart</string>
     <!-- [CHAR_LIMIT=NONE] Accessibility content description for daily battery chart view. -->
diff --git a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
index 1485500..0668c62 100644
--- a/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
+++ b/src/com/android/settings/accounts/AccountDetailDashboardFragment.java
@@ -64,8 +64,7 @@
 
     @Override
     public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-        getPreferenceManager().setPreferenceComparisonCallback(null);
+        // Initialize the parameters since displayTile() will be called in super.onCreate().
         Bundle args = getArguments();
         final Activity activity = getActivity();
         mUserHandle = Utils.getSecureTargetUser(activity.getActivityToken(),
@@ -82,6 +81,9 @@
                 mAccountType = args.getString(KEY_ACCOUNT_TYPE);
             }
         }
+
+        super.onCreate(icicle);
+        getPreferenceManager().setPreferenceComparisonCallback(null);
         mAccountSynController.init(mAccount, mUserHandle);
         mRemoveAccountController.init(mAccount, mUserHandle);
     }
diff --git a/src/com/android/settings/biometrics/combination/CombinedBiometricStatusPreferenceController.java b/src/com/android/settings/biometrics/combination/CombinedBiometricStatusPreferenceController.java
index 978fb0d..50eb43d 100644
--- a/src/com/android/settings/biometrics/combination/CombinedBiometricStatusPreferenceController.java
+++ b/src/com/android/settings/biometrics/combination/CombinedBiometricStatusPreferenceController.java
@@ -35,7 +35,7 @@
  */
 public class CombinedBiometricStatusPreferenceController extends
         BiometricStatusPreferenceController implements LifecycleObserver {
-    private static final String KEY_BIOMETRIC_SETTINGS = "biometric_settings";
+    public static final String KEY_BIOMETRIC_SETTINGS = "biometric_settings";
 
     @VisibleForTesting
     RestrictedPreference mPreference;
@@ -122,4 +122,8 @@
     protected String getSettingsClassName() {
         return mCombinedBiometricStatusUtils.getSettingsClassName();
     }
+
+    public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
+        mPreferenceScreen = preferenceScreen;
+    }
 }
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index a8be8f7..2598296 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -26,6 +26,8 @@
 import android.hardware.face.FaceManager;
 import android.hardware.face.FaceSensorPropertiesInternal;
 import android.os.Bundle;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
 import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
@@ -120,7 +122,9 @@
         infoMessageLooking.setText(getInfoMessageLooking());
         inControlTitle.setText(getInControlTitle());
         howMessage.setText(getHowMessage());
-        inControlMessage.setText(getInControlMessage());
+        inControlMessage.setText(Html.fromHtml(getString(getInControlMessage()),
+                Html.FROM_HTML_MODE_LEGACY));
+        inControlMessage.setMovementMethod(LinkMovementMethod.getInstance());
         lessSecure.setText(getLessSecureMessage());
 
         // Set up and show the "less secure" info section if necessary.
diff --git a/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java b/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java
index 7c41957..f18a74f 100644
--- a/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java
+++ b/src/com/android/settings/biometrics/face/FaceStatusPreferenceController.java
@@ -38,6 +38,7 @@
     public static final String KEY_FACE_SETTINGS = "face_settings";
 
     protected final FaceManager mFaceManager;
+
     @VisibleForTesting
     RestrictedPreference mPreference;
     private PreferenceScreen mPreferenceScreen;
@@ -111,4 +112,8 @@
     protected String getSettingsClassName() {
         return mFaceStatusUtils.getSettingsClassName();
     }
+
+    public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
+        mPreferenceScreen = preferenceScreen;
+    }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
index bad1bbd..b1b18ff 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java
@@ -16,16 +16,23 @@
 
 package com.android.settings.biometrics.fingerprint;
 
+import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_USER_CANCELED;
+
 import android.animation.Animator;
 import android.animation.ObjectAnimator;
 import android.annotation.IntDef;
 import android.annotation.NonNull;
 import android.annotation.Nullable;
+import android.annotation.RawRes;
 import android.app.Dialog;
 import android.app.settings.SettingsEnums;
+import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.res.ColorStateList;
 import android.content.res.Configuration;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
 import android.graphics.drawable.Animatable2;
 import android.graphics.drawable.AnimatedVectorDrawable;
 import android.graphics.drawable.Drawable;
@@ -51,6 +58,7 @@
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import androidx.annotation.IdRes;
 import androidx.appcompat.app.AlertDialog;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -62,6 +70,8 @@
 import com.android.settingslib.display.DisplayDensityUtils;
 
 import com.airbnb.lottie.LottieAnimationView;
+import com.airbnb.lottie.LottieProperty;
+import com.airbnb.lottie.model.KeyPath;
 import com.google.android.setupcompat.template.FooterBarMixin;
 import com.google.android.setupcompat.template.FooterButton;
 import com.google.android.setupcompat.util.WizardManagerHelper;
@@ -80,6 +90,7 @@
     private static final String TAG = "FingerprintEnrollEnrolling";
     static final String TAG_SIDECAR = "sidecar";
     static final String KEY_STATE_CANCELED = "is_canceled";
+    static final String KEY_STATE_PREVIOUS_ROTATION = "previous_rotation";
 
     private static final int PROGRESS_BAR_MAX = 10000;
 
@@ -90,11 +101,33 @@
     private static final int STAGE_LEFT_EDGE = 3;
     private static final int STAGE_RIGHT_EDGE = 4;
 
+    @VisibleForTesting
+    protected static final int SFPS_STAGE_NO_ANIMATION = 0;
+
+    @VisibleForTesting
+    protected static final int SFPS_STAGE_CENTER = 1;
+
+    @VisibleForTesting
+    protected static final int SFPS_STAGE_FINGERTIP = 2;
+
+    @VisibleForTesting
+    protected static final int SFPS_STAGE_LEFT_EDGE = 3;
+
+    @VisibleForTesting
+    protected static final int SFPS_STAGE_RIGHT_EDGE = 4;
+
     @IntDef({STAGE_UNKNOWN, STAGE_CENTER, STAGE_GUIDED, STAGE_FINGERTIP, STAGE_LEFT_EDGE,
             STAGE_RIGHT_EDGE})
     @Retention(RetentionPolicy.SOURCE)
     private @interface EnrollStage {}
 
+
+    @VisibleForTesting
+    @IntDef({STAGE_UNKNOWN, SFPS_STAGE_NO_ANIMATION, SFPS_STAGE_CENTER, SFPS_STAGE_FINGERTIP,
+            SFPS_STAGE_LEFT_EDGE, SFPS_STAGE_RIGHT_EDGE})
+    @Retention(RetentionPolicy.SOURCE)
+    protected @interface SfpsEnrollStage {}
+
     /**
      * If we don't see progress during this time, we show an error message to remind the users that
      * they need to lift the finger and touch again.
@@ -119,10 +152,9 @@
 
     private FingerprintManager mFingerprintManager;
     private boolean mCanAssumeUdfps;
-    private boolean mCanAssumeSidefps;
+    private boolean mCanAssumeSfps;
     @Nullable private ProgressBar mProgressBar;
     private ObjectAnimator mProgressAnim;
-    private TextView mDescriptionText;
     private TextView mErrorText;
     private Interpolator mFastOutSlowInInterpolator;
     private Interpolator mLinearOutSlowInInterpolator;
@@ -134,6 +166,7 @@
     private boolean mRestoring;
     private Vibrator mVibrator;
     private boolean mIsSetupWizard;
+    private boolean mIsOrientationChanged;
     private boolean mIsCanceled;
     private AccessibilityManager mAccessibilityManager;
     private boolean mIsAccessibilityEnabled;
@@ -141,6 +174,11 @@
     private boolean mHaveShownUdfpsTipLottie;
     private boolean mHaveShownUdfpsLeftEdgeLottie;
     private boolean mHaveShownUdfpsRightEdgeLottie;
+    private boolean mHaveShownSfpsNoAnimationLottie;
+    private boolean mHaveShownSfpsCenterLottie;
+    private boolean mHaveShownSfpsTipLottie;
+    private boolean mHaveShownSfpsLeftEdgeLottie;
+    private boolean mHaveShownSfpsRightEdgeLottie;
     private boolean mShouldShowLottie;
 
     private OrientationEventListener mOrientationEventListener;
@@ -156,6 +194,23 @@
     }
 
     @Override
+    public void onWindowFocusChanged(boolean hasFocus) {
+        if (hasFocus) {
+            return;
+        }
+
+        // By UX design, we should ensure seamless enrollment CUJ even though user rotate device.
+        // Do NOT cancel enrollment progress after rotating, adding mIsOrientationChanged
+        // to judge if the focus changed was triggered by rotation, current WMS has triple callbacks
+        // (true > false > true), we need to reset mIsOrientationChanged when !hasFocus callback.
+        if (!mIsOrientationChanged) {
+            onCancelEnrollment(FINGERPRINT_ERROR_USER_CANCELED);
+        } else {
+            mIsOrientationChanged = false;
+        }
+    }
+
+    @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
@@ -166,7 +221,7 @@
         final List<FingerprintSensorPropertiesInternal> props =
                 mFingerprintManager.getSensorPropertiesInternal();
         mCanAssumeUdfps = props != null && props.size() == 1 && props.get(0).isAnyUdfpsType();
-        mCanAssumeSidefps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
+        mCanAssumeSfps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
 
         mAccessibilityManager = getSystemService(AccessibilityManager.class);
         mIsAccessibilityEnabled = mAccessibilityManager.isEnabled();
@@ -204,13 +259,16 @@
                     break;
             }
             setDescriptionText(R.string.security_settings_udfps_enroll_start_message);
+        } else if (mCanAssumeSfps) {
+            setContentView(R.layout.sfps_enroll_enrolling);
+            setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
         } else {
             setContentView(R.layout.fingerprint_enroll_enrolling);
             setDescriptionText(R.string.security_settings_fingerprint_enroll_start_message);
         }
 
         mIsSetupWizard = WizardManagerHelper.isAnySetupWizard(getIntent());
-        if (mCanAssumeUdfps) {
+        if (mCanAssumeUdfps || mCanAssumeSfps) {
             updateTitleAndDescription();
         } else {
             setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
@@ -295,11 +353,15 @@
     protected void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putBoolean(KEY_STATE_CANCELED, mIsCanceled);
+        outState.putInt(KEY_STATE_PREVIOUS_ROTATION, mPreviousRotation);
     }
 
     private void restoreSavedState(Bundle savedInstanceState) {
         mRestoring = true;
         mIsCanceled = savedInstanceState.getBoolean(KEY_STATE_CANCELED, false);
+        mPreviousRotation = savedInstanceState.getInt(KEY_STATE_PREVIOUS_ROTATION,
+                getDisplay().getRotation());
+        mIsOrientationChanged = mPreviousRotation != getDisplay().getRotation();
     }
 
     @Override
@@ -337,6 +399,19 @@
         }
     }
 
+    @VisibleForTesting
+    void onCancelEnrollment(@IdRes int errorMsgId) {
+        FingerprintErrorDialog.showErrorDialog(this, errorMsgId);
+        mIsCanceled = true;
+        mIsOrientationChanged = false;
+        cancelEnrollment();
+        stopIconAnimation();
+        stopListenOrientationEvent();
+        if (!mCanAssumeUdfps) {
+            mErrorText.removeCallbacks(mTouchAgainRunnable);
+        }
+    }
+
     @Override
     protected void onStop() {
         if (!isChangingConfigurations()) {
@@ -399,6 +474,9 @@
         if (mCanAssumeUdfps) {
             updateTitleAndDescriptionForUdfps();
             return;
+        } else if (mCanAssumeSfps) {
+            updateTitleAndDescriptionForSfps();
+            return;
         }
 
         if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
@@ -428,12 +506,10 @@
                 setHeaderText(R.string.security_settings_udfps_enroll_fingertip_title);
                 if (!mHaveShownUdfpsTipLottie && mIllustrationLottie != null) {
                     mHaveShownUdfpsTipLottie = true;
-                    setDescriptionText("");
-                    mIllustrationLottie.setAnimation(R.raw.udfps_tip_hint_lottie);
-                    mIllustrationLottie.setVisibility(View.VISIBLE);
-                    mIllustrationLottie.playAnimation();
                     mIllustrationLottie.setContentDescription(
-                            getString(R.string.security_settings_udfps_tip_fingerprint_help));
+                            getString(R.string.security_settings_udfps_tip_fingerprint_help)
+                    );
+                    configureEnrollmentStage("", R.raw.udfps_tip_hint_lottie);
                 }
                 break;
 
@@ -441,12 +517,10 @@
                 setHeaderText(R.string.security_settings_udfps_enroll_left_edge_title);
                 if (!mHaveShownUdfpsLeftEdgeLottie && mIllustrationLottie != null) {
                     mHaveShownUdfpsLeftEdgeLottie = true;
-                    setDescriptionText("");
-                    mIllustrationLottie.setAnimation(R.raw.udfps_left_edge_hint_lottie);
-                    mIllustrationLottie.setVisibility(View.VISIBLE);
-                    mIllustrationLottie.playAnimation();
                     mIllustrationLottie.setContentDescription(
-                            getString(R.string.security_settings_udfps_side_fingerprint_help));
+                            getString(R.string.security_settings_udfps_side_fingerprint_help)
+                    );
+                    configureEnrollmentStage("", R.raw.udfps_left_edge_hint_lottie);
                 } else if (mIllustrationLottie == null) {
                     if (isStageHalfCompleted()) {
                         setDescriptionText(
@@ -460,12 +534,11 @@
                 setHeaderText(R.string.security_settings_udfps_enroll_right_edge_title);
                 if (!mHaveShownUdfpsRightEdgeLottie && mIllustrationLottie != null) {
                     mHaveShownUdfpsRightEdgeLottie = true;
-                    setDescriptionText("");
-                    mIllustrationLottie.setAnimation(R.raw.udfps_right_edge_hint_lottie);
-                    mIllustrationLottie.setVisibility(View.VISIBLE);
-                    mIllustrationLottie.playAnimation();
                     mIllustrationLottie.setContentDescription(
-                            getString(R.string.security_settings_udfps_side_fingerprint_help));
+                            getString(R.string.security_settings_udfps_side_fingerprint_help)
+                    );
+                    configureEnrollmentStage("", R.raw.udfps_right_edge_hint_lottie);
+
                 } else if (mIllustrationLottie == null) {
                     if (isStageHalfCompleted()) {
                         setDescriptionText(
@@ -490,9 +563,98 @@
                 getLayout().getHeaderTextView().setContentDescription(description);
                 setTitle(description);
                 break;
+
         }
     }
 
+    // Interrupt any existing talkback speech to prevent stacking talkback messages
+    private void clearTalkback() {
+        AccessibilityManager.getInstance(getApplicationContext()).interrupt();
+    }
+
+    private void updateTitleAndDescriptionForSfps() {
+        if (mIsAccessibilityEnabled) {
+            clearTalkback();
+            getLayout().getDescriptionTextView().setAccessibilityLiveRegion(
+                    View.ACCESSIBILITY_LIVE_REGION_POLITE);
+        }
+        switch (getCurrentSfpsStage()) {
+            case SFPS_STAGE_NO_ANIMATION:
+                setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title);
+                if (!mHaveShownSfpsNoAnimationLottie && mIllustrationLottie != null) {
+                    mHaveShownSfpsNoAnimationLottie = true;
+                    mIllustrationLottie.setContentDescription(
+                            getString(
+                                    R.string.security_settings_sfps_animation_a11y_label,
+                                    0
+                            )
+                    );
+                    configureEnrollmentStage(
+                            getString(R.string.security_settings_sfps_enroll_start_message),
+                            R.raw.sfps_lottie_no_animation
+                    );
+                }
+                break;
+
+            case SFPS_STAGE_CENTER:
+                setHeaderText(R.string.security_settings_sfps_enroll_finger_center_title);
+                if (!mHaveShownSfpsCenterLottie && mIllustrationLottie != null) {
+                    mHaveShownSfpsCenterLottie = true;
+                    configureEnrollmentStage(
+                            getString(R.string.security_settings_sfps_enroll_start_message),
+                            R.raw.sfps_lottie_pad_center
+                    );
+                }
+                break;
+
+            case SFPS_STAGE_FINGERTIP:
+                setHeaderText(R.string.security_settings_sfps_enroll_fingertip_title);
+                if (!mHaveShownSfpsTipLottie && mIllustrationLottie != null) {
+                    mHaveShownSfpsTipLottie = true;
+                    configureEnrollmentStage("", R.raw.sfps_lottie_tip);
+                }
+                break;
+
+            case SFPS_STAGE_LEFT_EDGE:
+                setHeaderText(R.string.security_settings_sfps_enroll_left_edge_title);
+                if (!mHaveShownSfpsLeftEdgeLottie && mIllustrationLottie != null) {
+                    mHaveShownSfpsLeftEdgeLottie = true;
+                    configureEnrollmentStage("", R.raw.sfps_lottie_left_edge);
+                }
+                break;
+
+            case SFPS_STAGE_RIGHT_EDGE:
+                setHeaderText(R.string.security_settings_sfps_enroll_right_edge_title);
+                if (!mHaveShownSfpsRightEdgeLottie && mIllustrationLottie != null) {
+                    mHaveShownSfpsRightEdgeLottie = true;
+                    configureEnrollmentStage("", R.raw.sfps_lottie_right_edge);
+                }
+                break;
+
+            case STAGE_UNKNOWN:
+            default:
+                // Don't use BiometricEnrollBase#setHeaderText, since that invokes setTitle,
+                // which gets announced for a11y upon entering the page. For SFPS, we want to
+                // announce a different string for a11y upon entering the page.
+                getLayout().setHeaderText(
+                        R.string.security_settings_sfps_enroll_find_sensor_title);
+                setDescriptionText(R.string.security_settings_sfps_enroll_start_message);
+                final CharSequence description = getString(
+                        R.string.security_settings_sfps_enroll_find_sensor_message);
+                getLayout().getHeaderTextView().setContentDescription(description);
+                setTitle(description);
+                break;
+
+        }
+    }
+
+    private void configureEnrollmentStage(CharSequence description, @RawRes int lottie) {
+        setDescriptionText(description);
+        mIllustrationLottie.setAnimation(lottie);
+        mIllustrationLottie.setVisibility(View.VISIBLE);
+        mIllustrationLottie.playAnimation();
+    }
+
     @EnrollStage
     private int getCurrentStage() {
         if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
@@ -513,6 +675,26 @@
         }
     }
 
+    @SfpsEnrollStage
+    private int getCurrentSfpsStage() {
+        if (mSidecar == null) {
+            return STAGE_UNKNOWN;
+        }
+
+        final int progressSteps = mSidecar.getEnrollmentSteps() - mSidecar.getEnrollmentRemaining();
+        if (progressSteps < getStageThresholdSteps(0)) {
+            return SFPS_STAGE_NO_ANIMATION;
+        } else if (progressSteps < getStageThresholdSteps(1)) {
+            return SFPS_STAGE_CENTER;
+        } else if (progressSteps < getStageThresholdSteps(2)) {
+            return SFPS_STAGE_FINGERTIP;
+        } else if (progressSteps < getStageThresholdSteps(3)) {
+            return SFPS_STAGE_LEFT_EDGE;
+        } else {
+            return SFPS_STAGE_RIGHT_EDGE;
+        }
+    }
+
     private boolean isStageHalfCompleted() {
         // Prior to first enrollment step.
         if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
@@ -535,7 +717,8 @@
         return true;
     }
 
-    private int getStageThresholdSteps(int index) {
+    @VisibleForTesting
+    protected int getStageThresholdSteps(int index) {
         if (mSidecar == null || mSidecar.getEnrollmentSteps() == -1) {
             Log.w(TAG, "getStageThresholdSteps: Enrollment not started yet");
             return 1;
@@ -547,7 +730,7 @@
     @Override
     public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
         if (!TextUtils.isEmpty(helpString)) {
-            if (!mCanAssumeUdfps) {
+            if (!(mCanAssumeUdfps || mCanAssumeSfps)) {
                 mErrorText.removeCallbacks(mTouchAgainRunnable);
             }
             showError(helpString);
@@ -556,37 +739,45 @@
 
     @Override
     public void onEnrollmentError(int errMsgId, CharSequence errString) {
-        FingerprintErrorDialog.showErrorDialog(this, errMsgId);
-        mIsCanceled = true;
-        cancelEnrollment();
-        stopIconAnimation();
-        stopListenOrientationEvent();
-        if (!mCanAssumeUdfps) {
-            mErrorText.removeCallbacks(mTouchAgainRunnable);
-        }
+        onCancelEnrollment(errMsgId);
+    }
+
+    private void announceEnrollmentProgress(CharSequence announcement) {
+        AccessibilityEvent e = AccessibilityEvent.obtain();
+        e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
+        e.setClassName(getClass().getName());
+        e.setPackageName(getPackageName());
+        e.getText().add(announcement);
+        mAccessibilityManager.sendAccessibilityEvent(e);
     }
 
     @Override
     public void onEnrollmentProgressChange(int steps, int remaining) {
         updateProgress(true /* animate */);
+        final int percent = (int) (((float) (steps - remaining) / (float) steps) * 100);
+        if (mCanAssumeSfps) {
+            if (mIsAccessibilityEnabled) {
+                CharSequence announcement = getString(
+                        R.string.security_settings_sfps_enroll_progress_a11y_message, percent);
+                announceEnrollmentProgress(announcement);
+                mIllustrationLottie.setContentDescription(
+                        getString(
+                                R.string.security_settings_sfps_animation_a11y_label,
+                                percent)
+                );
+            }
+        }
         updateTitleAndDescription();
         animateFlash();
-        if (!mCanAssumeUdfps) {
+        if (mCanAssumeUdfps) {
+            if (mIsAccessibilityEnabled) {
+                CharSequence announcement = getString(
+                        R.string.security_settings_udfps_enroll_progress_a11y_message, percent);
+                announceEnrollmentProgress(announcement);
+            }
+        } else if (!mCanAssumeSfps) {
             mErrorText.removeCallbacks(mTouchAgainRunnable);
             mErrorText.postDelayed(mTouchAgainRunnable, HINT_TIMEOUT_DURATION);
-        } else {
-
-            if (mIsAccessibilityEnabled) {
-                final int percent = (int) (((float)(steps - remaining) / (float) steps) * 100);
-                CharSequence cs = getString(
-                        R.string.security_settings_udfps_enroll_progress_a11y_message, percent);
-                AccessibilityEvent e = AccessibilityEvent.obtain();
-                e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
-                e.setClassName(getClass().getName());
-                e.setPackageName(getPackageName());
-                e.getText().add(cs);
-                mAccessibilityManager.sendAccessibilityEvent(e);
-            }
         }
     }
 
@@ -629,10 +820,13 @@
     }
 
     private void showError(CharSequence error) {
-        if (mCanAssumeUdfps || mCanAssumeSidefps) {
+        if (mCanAssumeUdfps || mCanAssumeSfps) {
             setHeaderText(error);
             // Show nothing for subtitle when getting an error message.
             setDescriptionText("");
+            if (mCanAssumeSfps) {
+                applySfpsErrorDynamicColors(getApplicationContext(), mIllustrationLottie, true);
+            }
         } else {
             mErrorText.setText(error);
             if (mErrorText.getVisibility() == View.INVISIBLE) {
@@ -660,7 +854,10 @@
     }
 
     private void clearError() {
-        if (!mCanAssumeUdfps && mErrorText.getVisibility() == View.VISIBLE) {
+        if (mCanAssumeSfps) {
+            applySfpsErrorDynamicColors(getApplicationContext(), mIllustrationLottie, false);
+        }
+        if ((!(mCanAssumeUdfps || mCanAssumeSfps)) && mErrorText.getVisibility() == View.VISIBLE) {
             mErrorText.animate()
                     .alpha(0f)
                     .translationY(getResources().getDimensionPixelSize(
@@ -672,6 +869,44 @@
         }
     }
 
+    /**
+     * Applies dynamic colors corresponding to showing or clearing errors on the progress bar
+     * and finger lottie for SFPS
+     */
+    private void applySfpsErrorDynamicColors(Context context, LottieAnimationView composition,
+            boolean isError) {
+        applyProgressBarDynamicColor(context, isError);
+        applyLottieDynamicColor(context, composition, isError);
+    }
+
+    private void applyProgressBarDynamicColor(Context context, boolean isError) {
+        if (mProgressBar != null) {
+            int error_color = context.getColor(R.color.sfps_enrollment_progress_bar_error_color);
+            int progress_bar_fill_color = context.getColor(
+                    R.color.sfps_enrollment_progress_bar_fill_color);
+            ColorStateList fillColor = ColorStateList.valueOf(
+                    isError ? error_color : progress_bar_fill_color);
+            mProgressBar.setProgressTintList(fillColor);
+            mProgressBar.setProgressTintMode(PorterDuff.Mode.SRC_ATOP);
+            mProgressBar.invalidate();
+        }
+    }
+
+    private void applyLottieDynamicColor(Context context, LottieAnimationView composition,
+            boolean isError) {
+        if (composition != null) {
+            int error_color = context.getColor(R.color.sfps_enrollment_fp_error_color);
+            int fp_captured_color = context.getColor(R.color.sfps_enrollment_fp_captured_color);
+            int color = isError ? error_color : fp_captured_color;
+            composition.addValueCallback(
+                    new KeyPath(".blue100", "**"),
+                    LottieProperty.COLOR_FILTER,
+                    frameInfo -> new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)
+            );
+            composition.invalidate();
+        }
+    }
+
     private void listenOrientationEvent() {
         mOrientationEventListener = new OrientationEventListener(this) {
             @Override
@@ -771,20 +1006,24 @@
     }
 
     private void updateOrientation(int orientation) {
-        switch(orientation) {
-            case Configuration.ORIENTATION_LANDSCAPE: {
-                mIllustrationLottie = null;
-                break;
-            }
-            case Configuration.ORIENTATION_PORTRAIT: {
-                if (mShouldShowLottie) {
-                    mIllustrationLottie = findViewById(R.id.illustration_lottie);
+        if (mCanAssumeSfps && mShouldShowLottie) {
+            mIllustrationLottie = findViewById(R.id.illustration_lottie);
+        } else {
+            switch(orientation) {
+                case Configuration.ORIENTATION_LANDSCAPE: {
+                    mIllustrationLottie = null;
+                    break;
                 }
-                break;
+                case Configuration.ORIENTATION_PORTRAIT: {
+                    if (mShouldShowLottie) {
+                        mIllustrationLottie = findViewById(R.id.illustration_lottie);
+                    }
+                    break;
+                }
+                default:
+                    Log.e(TAG, "Error unhandled configuration change");
+                    break;
             }
-            default:
-                Log.e(TAG, "Error unhandled configuration change");
-                break;
         }
     }
 
@@ -827,4 +1066,4 @@
             return SettingsEnums.DIALOG_FINGERPRINT_ICON_TOUCH;
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
index 9abf38d..292b8be 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
@@ -58,7 +58,7 @@
     private FingerprintEnrollSidecar mSidecar;
     private boolean mNextClicked;
     private boolean mCanAssumeUdfps;
-    private boolean mCanAssumeSidefps;
+    private boolean mCanAssumeSfps;
 
     private OrientationEventListener mOrientationEventListener;
     private int mPreviousRotation = 0;
@@ -71,7 +71,7 @@
         final List<FingerprintSensorPropertiesInternal> props =
                 fingerprintManager.getSensorPropertiesInternal();
         mCanAssumeUdfps = props != null && props.size() == 1 && props.get(0).isAnyUdfpsType();
-        mCanAssumeSidefps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
+        mCanAssumeSfps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
         setContentView(getContentView());
         mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
         mFooterBarMixin.setSecondaryButton(
@@ -102,10 +102,9 @@
             if (am.isEnabled()) {
                 lottieAnimationView.setAnimation(R.raw.udfps_edu_a11y_lottie);
             }
-
-        } else if (mCanAssumeSidefps) {
-            setHeaderText(R.string.security_settings_fingerprint_enroll_find_sensor_title);
-            setDescriptionText(R.string.security_settings_fingerprint_enroll_find_sensor_message);
+        } else if (mCanAssumeSfps) {
+            setHeaderText(R.string.security_settings_sfps_enroll_find_sensor_title);
+            setDescriptionText(R.string.security_settings_sfps_enroll_find_sensor_message);
             final LottieAnimationView lottieAnimationView = findViewById(R.id.illustration_lottie);
             final LottieAnimationView lottieAnimationViewPortrait =
                     findViewById(R.id.illustration_lottie_portrait);
@@ -201,7 +200,7 @@
     protected int getContentView() {
         if (mCanAssumeUdfps) {
             return R.layout.udfps_enroll_find_sensor_layout;
-        } else if (mCanAssumeSidefps) {
+        } else if (mCanAssumeSfps) {
             return R.layout.sfps_enroll_find_sensor_layout;
         }
         return R.layout.fingerprint_enroll_find_sensor;
@@ -374,7 +373,7 @@
     }
 
     private void listenOrientationEvent() {
-        if (!mCanAssumeSidefps) {
+        if (!mCanAssumeSfps) {
             // Do nothing if the device doesn't support SideFPS.
             return;
         }
@@ -393,7 +392,7 @@
     }
 
     private void stopListenOrientationEvent() {
-        if (!mCanAssumeSidefps) {
+        if (!mCanAssumeSfps) {
             // Do nothing if the device doesn't support SideFPS.
             return;
         }
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
index c24e9f0..0c7ef98 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java
@@ -49,15 +49,29 @@
     @VisibleForTesting
     static final String FINGERPRINT_SUGGESTION_ACTIVITY =
             "com.android.settings.SetupFingerprintSuggestionActivity";
+    private FingerprintManager mFingerprintManager;
+    private boolean mCanAssumeSfps;
 
     private boolean mIsAddAnotherOrFinish;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        setContentView(R.layout.fingerprint_enroll_finish);
+        mFingerprintManager = getSystemService(FingerprintManager.class);
+        final List<FingerprintSensorPropertiesInternal> props =
+                mFingerprintManager.getSensorPropertiesInternal();
+        mCanAssumeSfps = props != null && props.size() == 1 && props.get(0).isAnySidefpsType();
+        if (mCanAssumeSfps) {
+            setContentView(R.layout.sfps_enroll_finish);
+        } else {
+            setContentView(R.layout.fingerprint_enroll_finish);
+        }
         setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title);
-        setDescriptionText(R.string.security_settings_fingerprint_enroll_finish_v2_message);
+        if (mCanAssumeSfps) {
+            setDescriptionText(R.string.security_settings_sfps_enroll_finish);
+        } else {
+            setDescriptionText(R.string.security_settings_fingerprint_enroll_finish_v2_message);
+        }
 
         mFooterBarMixin = getLayout().getMixin(FooterBarMixin.class);
         mFooterBarMixin.setSecondaryButton(
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
index 71d0c8e..838c472 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollIntroduction.java
@@ -26,6 +26,8 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.os.Bundle;
+import android.text.Html;
+import android.text.method.LinkMovementMethod;
 import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
@@ -104,6 +106,11 @@
         footerMessage5.setText(getFooterMessage5());
         footerMessage6.setText(getFooterMessage6());
 
+        final TextView footerLink = findViewById(R.id.footer_learn_more);
+        footerLink.setMovementMethod(LinkMovementMethod.getInstance());
+        footerLink.setText(Html.fromHtml(getString(getFooterLearnMore()),
+                Html.FROM_HTML_MODE_LEGACY));
+
         if (mCanAssumeUdfps) {
             footerMessage6.setVisibility(View.VISIBLE);
             iconShield.setVisibility(View.VISIBLE);
@@ -187,6 +194,11 @@
         return R.string.security_settings_fingerprint_v2_enroll_introduction_footer_message_6;
     }
 
+    @StringRes
+    protected int getFooterLearnMore() {
+        return R.string.security_settings_fingerprint_v2_enroll_introduction_message_learn_more;
+    }
+
     @Override
     protected boolean isDisabledByAdmin() {
         return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java
index 1ed0688..347fec7 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintStatusPreferenceController.java
@@ -35,7 +35,7 @@
 public class FingerprintStatusPreferenceController extends BiometricStatusPreferenceController
         implements LifecycleObserver {
 
-    private static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings";
+    public static final String KEY_FINGERPRINT_SETTINGS = "fingerprint_settings";
 
     protected final FingerprintManager mFingerprintManager;
     @VisibleForTesting
@@ -112,4 +112,8 @@
             mPreference.setDisabledByAdmin(enforcedAdmin);
         }
     }
+
+    public void setPreferenceScreen(PreferenceScreen preferenceScreen) {
+        mPreferenceScreen = preferenceScreen;
+    }
 }
diff --git a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
index c9cc2b7..04dfc79 100644
--- a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
@@ -40,9 +40,8 @@
 
     private static final String TAG = "AbstractBtDlgCtr";
 
-    private static final int SOURCE_CODEC_TYPE_OPUS = 6; // TODO(b/240635097): remove in U
-
-    protected static final int[] CODEC_TYPES = {SOURCE_CODEC_TYPE_OPUS,
+    protected static final int[] CODEC_TYPES = {
+            BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS,
             BluetoothCodecConfig.SOURCE_CODEC_TYPE_LC3,
             BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC,
             BluetoothCodecConfig.SOURCE_CODEC_TYPE_APTX_HD,
diff --git a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
index 87d5ff0..2f0d27c 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
@@ -40,8 +40,6 @@
     private static final String KEY = "bluetooth_audio_codec_settings";
     private static final String TAG = "BtCodecCtr";
 
-    private static final int SOURCE_CODEC_TYPE_OPUS = 6; // TODO remove in U
-
     private final Callback mCallback;
 
     public BluetoothCodecDialogPreferenceController(Context context, Lifecycle lifecycle,
@@ -125,7 +123,7 @@
                 codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
                 break;
             case 7:
-                codecTypeValue = SOURCE_CODEC_TYPE_OPUS; // TODO update in U
+                codecTypeValue = BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS;
                 codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
                 break;
             default:
@@ -190,7 +188,7 @@
             case BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC:
                 index = 5;
                 break;
-            case SOURCE_CODEC_TYPE_OPUS: // TODO update in U
+            case BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS:
                 index = 7;
                 break;
             default:
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
index c1cffc8..b51eacb 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryChartView.java
@@ -413,7 +413,7 @@
         }
         // Draws the axis label slot information.
         if (mViewModel != null) {
-            final float baselineY = getHeight() - mTextPadding * 1.5f;
+            final float baselineY = getHeight() - mTextPadding;
             Rect[] axisLabelDisplayAreas;
             switch (mViewModel.axisLabelPosition()) {
                 case CENTER_OF_TRAPEZOIDS:
diff --git a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
index f04658d..68f0dc7 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java
@@ -142,11 +142,11 @@
     public static String utcToLocalTimeHour(
             final Context context, final long timestamp, final boolean is24HourFormat) {
         final Locale locale = getLocale(context);
-        // e.g. for 12-hour format: 9 pm
+        // e.g. for 12-hour format: 9 PM
         // e.g. for 24-hour format: 09:00
         final String skeleton = is24HourFormat ? "HHm" : "ha";
         final String pattern = DateFormat.getBestDateTimePattern(locale, skeleton);
-        return DateFormat.format(pattern, timestamp).toString().toLowerCase(locale);
+        return DateFormat.format(pattern, timestamp).toString();
     }
 
     /** Converts UTC timestamp to local time day of week data. */
diff --git a/src/com/android/settings/security/SecuritySettings.java b/src/com/android/settings/security/SecuritySettings.java
index 6aadee6..b30b54d 100644
--- a/src/com/android/settings/security/SecuritySettings.java
+++ b/src/com/android/settings/security/SecuritySettings.java
@@ -40,7 +40,7 @@
 public class SecuritySettings extends DashboardFragment {
 
     private static final String TAG = "SecuritySettings";
-    private static final String SECURITY_CATEGORY = "security_category";
+    protected static final String SECURITY_CATEGORY = "security_category";
 
     public static final int CHANGE_TRUST_AGENT_SETTINGS = 126;
     public static final int UNIFY_LOCK_CONFIRM_PROFILE_REQUEST = 129;
@@ -132,4 +132,9 @@
                             && !SafetyCenterManagerWrapper.get().isEnabled(context);
                 }
             };
+
+    @Override
+    public Lifecycle getSettingsLifecycle() {
+        return super.getSettingsLifecycle();
+    }
 }
diff --git a/src/com/android/settings/spa/SpaActivity.kt b/src/com/android/settings/spa/SpaActivity.kt
new file mode 100644
index 0000000..7e79350
--- /dev/null
+++ b/src/com/android/settings/spa/SpaActivity.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2022 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.android.settings.spa
+
+import com.android.settingslib.spa.framework.BrowseActivity
+
+class SpaActivity : BrowseActivity(settingsPageProviders)
diff --git a/src/com/android/settings/spa/SpaEnvironment.kt b/src/com/android/settings/spa/SpaEnvironment.kt
new file mode 100644
index 0000000..fad7ef2
--- /dev/null
+++ b/src/com/android/settings/spa/SpaEnvironment.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2022 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.android.settings.spa
+
+import com.android.settings.spa.app.InstallUnknownAppsListProvider
+import com.android.settings.spa.home.HomePageProvider
+import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
+import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListTemplate
+
+private val togglePermissionAppListTemplate = TogglePermissionAppListTemplate(
+    allProviders = listOf(InstallUnknownAppsListProvider),
+)
+
+val settingsPageProviders = SettingsPageProviderRepository(
+    allPagesList = listOf(
+        HomePageProvider,
+    ) + togglePermissionAppListTemplate.createPageProviders(),
+    rootPages = listOf(HomePageProvider.name),
+)
diff --git a/src/com/android/settings/spa/app/InstallUnknownApps.kt b/src/com/android/settings/spa/app/InstallUnknownApps.kt
new file mode 100644
index 0000000..a09fda2
--- /dev/null
+++ b/src/com/android/settings/spa/app/InstallUnknownApps.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2022 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.android.settings.spa.app
+
+import android.Manifest
+import android.app.AppGlobals
+import android.app.AppOpsManager.MODE_DEFAULT
+import android.app.AppOpsManager.OP_REQUEST_INSTALL_PACKAGES
+import android.content.Context
+import android.content.pm.ApplicationInfo
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.livedata.observeAsState
+import com.android.settings.R
+import com.android.settingslib.spaprivileged.model.app.AppOpsController
+import com.android.settingslib.spaprivileged.model.app.AppRecord
+import com.android.settingslib.spaprivileged.model.app.userId
+import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListModel
+import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.combine
+import kotlinx.coroutines.flow.map
+
+object InstallUnknownAppsListProvider : TogglePermissionAppListProvider {
+    override val permissionType = "InstallUnknownApps"
+    override fun createModel(context: Context) = InstallUnknownAppsListModel(context)
+}
+
+data class InstallUnknownAppsRecord(
+    override val app: ApplicationInfo,
+    val appOpsController: AppOpsController,
+) : AppRecord
+
+class InstallUnknownAppsListModel(private val context: Context) :
+    TogglePermissionAppListModel<InstallUnknownAppsRecord> {
+    override val pageTitleResId = R.string.install_other_apps
+    override val switchTitleResId = R.string.external_source_switch_title
+    override val footerResId = R.string.install_all_warning
+
+    override fun transformItem(app: ApplicationInfo) = InstallUnknownAppsRecord(
+        app = app,
+        appOpsController = AppOpsController(
+            context = context,
+            app = app,
+            op = OP_REQUEST_INSTALL_PACKAGES,
+        ),
+    )
+
+    override fun filter(
+        userIdFlow: Flow<Int>, recordListFlow: Flow<List<InstallUnknownAppsRecord>>,
+    ) = userIdFlow.map(::getPotentialPackageNames)
+        .combine(recordListFlow) { potentialPackageNames, recordList ->
+            recordList.filter { record ->
+                isChangeable(record, potentialPackageNames)
+            }
+        }
+
+    @Composable
+    override fun isAllowed(record: InstallUnknownAppsRecord) =
+        record.appOpsController.isAllowed.observeAsState()
+
+    override fun isChangeable(record: InstallUnknownAppsRecord) =
+        isChangeable(record, getPotentialPackageNames(record.app.userId))
+
+    override fun setAllowed(record: InstallUnknownAppsRecord, newAllowed: Boolean) {
+        record.appOpsController.setAllowed(newAllowed)
+    }
+
+    companion object {
+        private fun isChangeable(
+            record: InstallUnknownAppsRecord,
+            potentialPackageNames: Set<String>,
+        ) = record.appOpsController.getMode() != MODE_DEFAULT ||
+                record.app.packageName in potentialPackageNames
+
+        private fun getPotentialPackageNames(userId: Int): Set<String> =
+            AppGlobals.getPackageManager().getAppOpPermissionPackages(
+                Manifest.permission.REQUEST_INSTALL_PACKAGES, userId
+            ).toSet()
+    }
+}
diff --git a/src/com/android/settings/spa/home/HomePage.kt b/src/com/android/settings/spa/home/HomePage.kt
new file mode 100644
index 0000000..6cd6fe6
--- /dev/null
+++ b/src/com/android/settings/spa/home/HomePage.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2022 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.android.settings.spa.home
+
+import android.os.Bundle
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.res.stringResource
+import com.android.settings.R
+import com.android.settings.spa.app.InstallUnknownAppsListProvider
+import com.android.settingslib.spa.framework.common.SettingsPageProvider
+import com.android.settingslib.spa.widget.scaffold.HomeScaffold
+
+object HomePageProvider : SettingsPageProvider {
+    override val name = "Home"
+
+    @Composable
+    override fun Page(arguments: Bundle?) {
+        HomePage()
+    }
+}
+
+@Composable
+private fun HomePage() {
+    HomeScaffold(title = stringResource(R.string.settings_label)) {
+        InstallUnknownAppsListProvider.EntryItem()
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
index 3af10fd..da47955 100644
--- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java
@@ -16,6 +16,12 @@
 
 package com.android.settings.biometrics.fingerprint;
 
+import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWER_BUTTON;
+
+import static com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.KEY_STATE_PREVIOUS_ROTATION;
+import static com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_NO_ANIMATION;
+import static com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.SFPS_STAGE_RIGHT_EDGE;
+
 import static com.google.common.truth.Truth.assertThat;
 
 import static org.mockito.Mockito.any;
@@ -25,21 +31,30 @@
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import android.content.Context;
+import android.content.res.ColorStateList;
 import android.hardware.biometrics.ComponentInfoInternal;
 import android.hardware.biometrics.SensorProperties;
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback;
 import android.hardware.fingerprint.FingerprintSensorProperties;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
+import android.os.Bundle;
 import android.os.CancellationSignal;
 import android.os.Vibrator;
+import android.view.Display;
+import android.view.Surface;
 import android.widget.TextView;
 
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settings.widget.RingProgressBar;
+
+import com.airbnb.lottie.LottieAnimationView;
 
 import org.junit.Before;
 import org.junit.Ignore;
@@ -49,7 +64,9 @@
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
 import org.robolectric.android.controller.ActivityController;
+import org.robolectric.util.ReflectionHelpers;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -61,7 +78,16 @@
 
     @Mock private Vibrator mVibrator;
 
+    @Mock private LottieAnimationView mIllustrationLottie;
+
+    @Mock private FingerprintEnrollSidecar mSidecar;
+
+    @Mock private Display mMockDisplay;
+
+    private final int[] mSfpsStageThresholds = new int[]{0, 9, 13, 19, 25};
+
     private FingerprintEnrollEnrolling mActivity;
+    private Context mContext;
 
     @Before
     public void setUp() {
@@ -100,6 +126,102 @@
         verify(mVibrator, never()).vibrate(anyInt(), anyString(), any(), anyString(), any());
     }
 
+    @Test
+    public void fingerprintUdfpsOverlayEnrollment_gainFocus_shouldNotCancel() {
+        initializeActivityFor(FingerprintSensorProperties.TYPE_UDFPS_OPTICAL);
+
+        mActivity.onEnrollmentProgressChange(1, 1);
+        mActivity.onWindowFocusChanged(true);
+
+        verify(mActivity, never()).onCancelEnrollment(anyInt());
+    }
+
+    @Test
+    public void fingerprintUdfpsOverlayEnrollment_loseFocus_shouldCancel() {
+        initializeActivityFor(FingerprintSensorProperties.TYPE_UDFPS_OPTICAL);
+
+        mActivity.onEnrollmentProgressChange(1, 1);
+        mActivity.onWindowFocusChanged(false);
+
+        verify(mActivity, never()).onCancelEnrollment(anyInt());
+    }
+
+    @Test
+    public void fingerprintSfpsEnroll_PlaysAllAnimationsAssetsCorrectly() {
+        initializeActivityFor(TYPE_POWER_BUTTON);
+
+        int totalEnrollSteps = 25;
+        int initStageSteps = -1, initStageRemaining = 0;
+
+        when(mSidecar.getEnrollmentSteps()).thenReturn(initStageSteps);
+        when(mSidecar.getEnrollmentRemaining()).thenReturn(initStageRemaining);
+
+        mActivity.onEnrollmentProgressChange(initStageSteps, initStageRemaining);
+
+        when(mSidecar.getEnrollmentSteps()).thenReturn(totalEnrollSteps);
+
+        for (int remaining = totalEnrollSteps; remaining > 0; remaining--) {
+            when(mSidecar.getEnrollmentRemaining()).thenReturn(remaining);
+            mActivity.onEnrollmentProgressChange(totalEnrollSteps, remaining);
+        }
+
+        List<Integer> expectedLottieAssetOrder = List.of(
+                R.raw.sfps_lottie_no_animation,
+                R.raw.sfps_lottie_pad_center,
+                R.raw.sfps_lottie_tip,
+                R.raw.sfps_lottie_left_edge,
+                R.raw.sfps_lottie_right_edge
+        );
+
+        ArgumentCaptor<Integer> lottieAssetCaptor = ArgumentCaptor.forClass(Integer.class);
+        verify(mIllustrationLottie, times(5)).setAnimation(lottieAssetCaptor.capture());
+        List<Integer> observedLottieAssetOrder = lottieAssetCaptor.getAllValues();
+        assertThat(observedLottieAssetOrder).isEqualTo(expectedLottieAssetOrder);
+    }
+
+    // SFPS_STAGE_CENTER is first stage with progress bar colors, starts at steps=25, remaining=25
+    private void configureSfpsStageColorTest() {
+        when(mSidecar.getEnrollmentSteps()).thenReturn(25);
+        when(mSidecar.getEnrollmentRemaining()).thenReturn(25);
+        mActivity.onEnrollmentProgressChange(25, 25);
+    }
+
+    @Test
+    public void fingerprintSfpsEnroll_usesCorrectProgressBarFillColor() {
+        initializeActivityFor(TYPE_POWER_BUTTON);
+
+        configureSfpsStageColorTest();
+
+        int progress_bar_fill_color = mActivity.getApplicationContext().getColor(
+                R.color.sfps_enrollment_progress_bar_fill_color
+        );
+
+        RingProgressBar mProgressBar = mActivity.findViewById(R.id.fingerprint_progress_bar);
+        assertThat(mProgressBar.getProgressTintList()).isEqualTo(
+                ColorStateList.valueOf(progress_bar_fill_color)
+        );
+    }
+
+    @Test
+    public void fingerprintSfpsEnroll_usesCorrectProgressBarHelpColor() {
+        initializeActivityFor(TYPE_POWER_BUTTON);
+
+        configureSfpsStageColorTest();
+
+        int progress_bar_error_color = mActivity.getApplicationContext().getColor(
+                R.color.sfps_enrollment_progress_bar_error_color
+        );
+        mActivity.onEnrollmentHelp(
+                FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS,
+                "test enrollment help"
+        );
+
+        RingProgressBar mProgressBar = mActivity.findViewById(R.id.fingerprint_progress_bar);
+        assertThat(mProgressBar.getProgressTintList()).isEqualTo(
+                ColorStateList.valueOf(progress_bar_error_color)
+        );
+    }
+
     private void initializeActivityFor(int sensorType) {
         final List<ComponentInfoInternal> componentInfo = new ArrayList<>();
         final FingerprintSensorPropertiesInternal prop =
@@ -111,15 +233,32 @@
                         sensorType,
                         true /* resetLockoutRequiresHardwareAuthToken */);
         final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
+        final Bundle savedInstanceState = new Bundle();
+        savedInstanceState.putInt(KEY_STATE_PREVIOUS_ROTATION, Surface.ROTATION_90);
         props.add(prop);
         when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props);
-
+        mContext = spy(RuntimeEnvironment.application);
         mActivity = spy(FingerprintEnrollEnrolling.class);
+
+        when(mFingerprintManager.getSensorPropertiesInternal()).thenReturn(props);
+        when(mContext.getDisplay()).thenReturn(mMockDisplay);
+        when(mMockDisplay.getRotation()).thenReturn(Surface.ROTATION_0);
+
         doReturn(true).when(mActivity).shouldShowLottie();
         doReturn(mFingerprintManager).when(mActivity).getSystemService(FingerprintManager.class);
         doReturn(mVibrator).when(mActivity).getSystemService(Vibrator.class);
+        doReturn(mIllustrationLottie).when(mActivity).findViewById(R.id.illustration_lottie);
+        ReflectionHelpers.setField(mActivity, "mSidecar", mSidecar);
 
-        ActivityController.of(mActivity).create();
+        if (sensorType == TYPE_POWER_BUTTON) {
+            // SFPS_STAGE_NO_ANIMATION = 0, ... , SFPS_STAGE_RIGHT_EDGE = 4
+            for (int stage = SFPS_STAGE_NO_ANIMATION; stage <= SFPS_STAGE_RIGHT_EDGE; stage++) {
+                doReturn(mSfpsStageThresholds[stage]).when(mActivity).getStageThresholdSteps(stage);
+            }
+            doReturn(true).when(mSidecar).isEnrolling();
+        }
+
+        ActivityController.of(mActivity).create(savedInstanceState);
     }
 
     private EnrollmentCallback verifyAndCaptureEnrollmentCallback() {
@@ -135,4 +274,4 @@
 
         return callbackCaptor.getValue();
     }
-}
+}
\ No newline at end of file
diff --git a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java
index 8da44cc..de2b363 100644
--- a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java
@@ -52,8 +52,6 @@
 @RunWith(RobolectricTestRunner.class)
 public class BluetoothCodecDialogPreferenceControllerTest {
 
-    private static final int SOURCE_CODEC_TYPE_OPUS = 6; // TODO(b/240635097): remove in U
-
     private static final String DEVICE_ADDRESS = "00:11:22:33:44:55";
 
     @Mock
@@ -123,7 +121,7 @@
                 .setCodecType(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC)
                 .build();
         mCodecConfigOPUS = new BluetoothCodecConfig.Builder()
-                .setCodecType(SOURCE_CODEC_TYPE_OPUS)
+                .setCodecType(BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS)
                 .build();
         when(mBluetoothAdapter.getActiveDevices(eq(BluetoothProfile.A2DP)))
                 .thenReturn(Arrays.asList(mActiveDevice));
@@ -143,8 +141,8 @@
         mController.onBluetoothServiceConnected(mBluetoothA2dp);
 
         mController.writeConfigurationValues(0);
-                                                // TODO(b/240635097): update in U
-        verify(mBluetoothA2dpConfigStore).setCodecType(SOURCE_CODEC_TYPE_OPUS);
+        verify(mBluetoothA2dpConfigStore).setCodecType(
+                BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS);
     }
 
     @Test
@@ -176,8 +174,8 @@
         verify(mBluetoothA2dpConfigStore).setCodecType(BluetoothCodecConfig.SOURCE_CODEC_TYPE_LDAC);
 
         mController.writeConfigurationValues(7);
-                                                // TODO(b/240635097): update in U
-        verify(mBluetoothA2dpConfigStore).setCodecType(SOURCE_CODEC_TYPE_OPUS);
+        verify(mBluetoothA2dpConfigStore).setCodecType(
+                BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS);
     }
 
     @Test
@@ -211,8 +209,8 @@
     @Test
     public void getCurrentIndexByConfig_verifyOpusIndex() {
         assertThat(mController.getCurrentIndexByConfig(mCodecConfigOPUS)).isEqualTo(
-                mController.convertCfgToBtnIndex(SOURCE_CODEC_TYPE_OPUS));
-                                             // TODO(b/240635097): update in U
+                mController.convertCfgToBtnIndex(
+                    BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS));
     }
 
 
@@ -239,7 +237,7 @@
         mController.onHDAudioEnabled(/* enabled= */ true);
 
         verify(mBluetoothA2dpConfigStore, atLeastOnce()).setCodecType(
-                eq(SOURCE_CODEC_TYPE_OPUS)); // TODO(b/240635097): update in U
+                eq(BluetoothCodecConfig.SOURCE_CODEC_TYPE_OPUS));
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
index 1eead82..20af849 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryChartPreferenceControllerTest.java
@@ -179,7 +179,7 @@
         verify(mHourlyChartView, atLeastOnce()).setVisibility(View.VISIBLE);
         verify(mHourlyChartView).setViewModel(new BatteryChartViewModel(
                 List.of(100, 97, 95),
-                List.of("8 am", "10 am", "12 pm"),
+                List.of("8 AM", "10 AM", "12 PM"),
                 BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS));
     }
 
@@ -208,8 +208,8 @@
         verify(mDailyChartView).setViewModel(expectedDailyViewModel);
         verify(mHourlyChartView).setViewModel(new BatteryChartViewModel(
                 List.of(100, 97, 95, 93, 91, 89, 87, 85, 83),
-                List.of("8 am", "10 am", "12 pm", "2 pm", "4 pm", "6 pm", "8 pm", "10 pm",
-                        "12 am"),
+                List.of("8 AM", "10 AM", "12 PM", "2 PM", "4 PM", "6 PM", "8 PM", "10 PM",
+                        "12 AM"),
                 BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS));
 
         reset(mDailyChartView);
@@ -224,8 +224,8 @@
         verify(mDailyChartView).setViewModel(expectedDailyViewModel);
         BatteryChartViewModel expectedHourlyViewModel = new BatteryChartViewModel(
                 List.of(83, 81, 79, 77, 75, 73, 71, 69, 67, 65, 63, 61, 59),
-                List.of("12 am", "2 am", "4 am", "6 am", "8 am", "10 am", "12 pm", "2 pm",
-                        "4 pm", "6 pm", "8 pm", "10 pm", "12 am"),
+                List.of("12 AM", "2 AM", "4 AM", "6 AM", "8 AM", "10 AM", "12 PM", "2 PM",
+                        "4 PM", "6 PM", "8 PM", "10 PM", "12 AM"),
                 BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS);
         expectedHourlyViewModel.setSelectedIndex(6);
         verify(mHourlyChartView).setViewModel(expectedHourlyViewModel);
@@ -243,8 +243,8 @@
         verify(mDailyChartView).setViewModel(expectedDailyViewModel);
         verify(mHourlyChartView).setViewModel(new BatteryChartViewModel(
                 List.of(59, 57, 55, 53, 51, 49, 47, 45, 43, 41),
-                List.of("12 am", "2 am", "4 am", "6 am", "8 am", "10 am", "12 pm", "2 pm",
-                        "4 pm", "6 pm"),
+                List.of("12 AM", "2 AM", "4 AM", "6 AM", "8 AM", "10 AM", "12 PM", "2 PM",
+                        "4 PM", "6 PM"),
                 BatteryChartViewModel.AxisLabelPosition.BETWEEN_TRAPEZOIDS));
     }
 
@@ -580,7 +580,7 @@
         mBatteryChartPreferenceController.mHourlyChartIndex = 1;
 
         assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(
-                "10 am - 12 pm");
+                "10 AM - 12 PM");
     }
 
     @Test
@@ -590,7 +590,7 @@
         mBatteryChartPreferenceController.mHourlyChartIndex = 8;
 
         assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(
-                "Sunday 4 pm - 6 pm");
+                "Sunday 4 PM - 6 PM");
     }
 
     @Test
diff --git a/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java b/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java
index 272c840..c517884 100644
--- a/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java
+++ b/tests/unit/src/com/android/settings/security/SecuritySettingsTest.java
@@ -40,6 +40,10 @@
 import android.os.Looper;
 import android.provider.SearchIndexableResource;
 
+import androidx.lifecycle.Lifecycle;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceManager;
+import androidx.preference.PreferenceScreen;
 import androidx.test.annotation.UiThreadTest;
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -51,6 +55,7 @@
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.security.trustagent.TrustAgentManager;
 import com.android.settings.testutils.FakeFeatureFactory;
+import com.android.settingslib.RestrictedPreference;
 import com.android.settingslib.core.AbstractPreferenceController;
 
 import org.junit.Before;
@@ -62,13 +67,15 @@
 import java.util.ArrayList;
 import java.util.List;
 
-
 @RunWith(AndroidJUnit4.class)
 public class SecuritySettingsTest {
-
     private Context mContext;
     private SecuritySettingsFeatureProvider mSecuritySettingsFeatureProvider;
     private SecuritySettings mSecuritySettings;
+    private Preference mPreference;
+    private RestrictedPreference mPreferenceFace;
+    private RestrictedPreference mPreferenceFingerprint;
+    private RestrictedPreference mPreferenceCombined;
 
     @Mock
     private TrustAgentManager mTrustAgentManager;
@@ -79,6 +86,8 @@
     @Mock
     private PackageManager mPackageManager;
 
+    private PreferenceScreen mScreen;
+
     @Before
     @UiThreadTest
     public void setup() {
@@ -96,10 +105,30 @@
         FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest();
         SecurityFeatureProvider mSecurityFeatureProvider =
                 mFeatureFactory.getSecurityFeatureProvider();
-
         when(mSecurityFeatureProvider.getTrustAgentManager()).thenReturn(mTrustAgentManager);
         mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider();
         mSecuritySettings = new SecuritySettings();
+
+        PreferenceManager preferenceManager = new PreferenceManager(mContext);
+        mScreen = preferenceManager.createPreferenceScreen(mContext);
+        mPreference = new Preference(mContext);
+        mPreference.setKey(SecuritySettings.SECURITY_CATEGORY);
+
+        mPreferenceFace = new RestrictedPreference(mContext);
+        mPreferenceFingerprint = new RestrictedPreference(mContext);
+        mPreferenceCombined = new RestrictedPreference(mContext);
+
+        mPreferenceFace.setKey(FaceStatusPreferenceController
+                .KEY_FACE_SETTINGS);
+        mPreferenceFingerprint.setKey(FingerprintStatusPreferenceController
+                .KEY_FINGERPRINT_SETTINGS);
+        mPreferenceCombined.setKey(CombinedBiometricStatusPreferenceController
+                .KEY_BIOMETRIC_SETTINGS);
+
+        mScreen.addPreference(mPreference);
+        mScreen.addPreference(mPreferenceFace);
+        mScreen.addPreference(mPreferenceFingerprint);
+        mScreen.addPreference(mPreferenceCombined);
     }
 
     @Test
@@ -167,6 +196,150 @@
         assertThat(isCombinedPrefAvailable(controllers)).isTrue();
     }
 
+    @Test
+    @UiThreadTest
+    public void preferenceLifecycle_faceShowsThenCombined() {
+        when(mFaceManager.isHardwareDetected()).thenReturn(true);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+        final List<AbstractPreferenceController> controllers =
+                mSecuritySettings.createPreferenceControllers(mContext);
+
+        FaceStatusPreferenceController mFaceStatusPreferenceController =
+                getFaceStatusPreferenceController(controllers);
+
+        FingerprintStatusPreferenceController mFingerprintStatusPreferenceController =
+                getFingerprintStatusPreferenceController(controllers);
+
+        CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController =
+                getCombinedBiometricStatusPreferenceController(controllers);
+
+        mFaceStatusPreferenceController.setPreferenceScreen(mScreen);
+        mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen);
+        mCombinedStatusPreferenceController.setPreferenceScreen(mScreen);
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isTrue();
+        assertThat(mPreferenceFingerprint.isVisible()).isFalse();
+        assertThat(mPreferenceCombined.isVisible()).isFalse();
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isFalse();
+        assertThat(mPreferenceFingerprint.isVisible()).isFalse();
+        assertThat(mPreferenceCombined.isVisible()).isTrue();
+    }
+
+    @Test
+    @UiThreadTest
+    public void preferenceLifecycle_fingerprintShowsThenCombined() {
+        when(mFaceManager.isHardwareDetected()).thenReturn(false);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        final List<AbstractPreferenceController> controllers =
+                mSecuritySettings.createPreferenceControllers(mContext);
+
+        FaceStatusPreferenceController mFaceStatusPreferenceController =
+                getFaceStatusPreferenceController(controllers);
+
+        FingerprintStatusPreferenceController mFingerprintStatusPreferenceController =
+                getFingerprintStatusPreferenceController(controllers);
+
+        CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController =
+                getCombinedBiometricStatusPreferenceController(controllers);
+
+        mFaceStatusPreferenceController.setPreferenceScreen(mScreen);
+        mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen);
+        mCombinedStatusPreferenceController.setPreferenceScreen(mScreen);
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isFalse();
+        assertThat(mPreferenceFingerprint.isVisible()).isTrue();
+        assertThat(mPreferenceCombined.isVisible()).isFalse();
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+        when(mFaceManager.isHardwareDetected()).thenReturn(true);
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isFalse();
+        assertThat(mPreferenceFingerprint.isVisible()).isFalse();
+        assertThat(mPreferenceCombined.isVisible()).isTrue();
+    }
+
+    @Test
+    @UiThreadTest
+    public void preferenceLifecycle_combinedShowsThenFace() {
+        when(mFaceManager.isHardwareDetected()).thenReturn(true);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        final List<AbstractPreferenceController> controllers =
+                mSecuritySettings.createPreferenceControllers(mContext);
+
+        FaceStatusPreferenceController mFaceStatusPreferenceController =
+                getFaceStatusPreferenceController(controllers);
+
+        FingerprintStatusPreferenceController mFingerprintStatusPreferenceController =
+                getFingerprintStatusPreferenceController(controllers);
+
+        CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController =
+                getCombinedBiometricStatusPreferenceController(controllers);
+
+        mFaceStatusPreferenceController.setPreferenceScreen(mScreen);
+        mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen);
+        mCombinedStatusPreferenceController.setPreferenceScreen(mScreen);
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isFalse();
+        assertThat(mPreferenceFingerprint.isVisible()).isFalse();
+        assertThat(mPreferenceCombined.isVisible()).isTrue();
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(false);
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isTrue();
+        assertThat(mPreferenceFingerprint.isVisible()).isFalse();
+        assertThat(mPreferenceCombined.isVisible()).isFalse();
+    }
+
+    @Test
+    @UiThreadTest
+    public void preferenceLifecycle_combinedShowsThenFingerprint() {
+        when(mFaceManager.isHardwareDetected()).thenReturn(true);
+        when(mFingerprintManager.isHardwareDetected()).thenReturn(true);
+        final List<AbstractPreferenceController> controllers =
+                mSecuritySettings.createPreferenceControllers(mContext);
+
+        FaceStatusPreferenceController mFaceStatusPreferenceController =
+                getFaceStatusPreferenceController(controllers);
+
+        FingerprintStatusPreferenceController mFingerprintStatusPreferenceController =
+                getFingerprintStatusPreferenceController(controllers);
+
+        CombinedBiometricStatusPreferenceController mCombinedStatusPreferenceController =
+                getCombinedBiometricStatusPreferenceController(controllers);
+
+        mFaceStatusPreferenceController.setPreferenceScreen(mScreen);
+        mFingerprintStatusPreferenceController.setPreferenceScreen(mScreen);
+        mCombinedStatusPreferenceController.setPreferenceScreen(mScreen);
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isFalse();
+        assertThat(mPreferenceFingerprint.isVisible()).isFalse();
+        assertThat(mPreferenceCombined.isVisible()).isTrue();
+
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+        when(mFaceManager.isHardwareDetected()).thenReturn(false);
+        mSecuritySettings.getSettingsLifecycle().handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+
+        assertThat(mPreferenceFace.isVisible()).isFalse();
+        assertThat(mPreferenceFingerprint.isVisible()).isTrue();
+        assertThat(mPreferenceCombined.isVisible()).isFalse();
+    }
+
     private List<String> getAllXmlKeys(BaseSearchIndexProvider indexProvider) throws Exception {
         final List<SearchIndexableResource> resources = indexProvider.getXmlResourcesToIndex(
                 mContext, true /* not used*/);
@@ -207,4 +380,35 @@
                 controller -> controller instanceof CombinedBiometricStatusPreferenceController
                         && controller.isAvailable()).count() == 1;
     }
+
+    FaceStatusPreferenceController getFaceStatusPreferenceController(
+            List<AbstractPreferenceController> controllers) {
+        for (AbstractPreferenceController abstractPreferenceController: controllers) {
+            if (abstractPreferenceController instanceof FaceStatusPreferenceController) {
+                return (FaceStatusPreferenceController) abstractPreferenceController;
+            }
+        }
+        return null;
+    }
+
+    FingerprintStatusPreferenceController getFingerprintStatusPreferenceController(
+            List<AbstractPreferenceController> controllers) {
+        for (AbstractPreferenceController abstractPreferenceController: controllers) {
+            if (abstractPreferenceController instanceof FingerprintStatusPreferenceController) {
+                return (FingerprintStatusPreferenceController) abstractPreferenceController;
+            }
+        }
+        return null;
+    }
+
+    CombinedBiometricStatusPreferenceController getCombinedBiometricStatusPreferenceController(
+            List<AbstractPreferenceController> controllers) {
+        for (AbstractPreferenceController abstractPreferenceController: controllers) {
+            if (abstractPreferenceController
+                    instanceof CombinedBiometricStatusPreferenceController) {
+                return (CombinedBiometricStatusPreferenceController) abstractPreferenceController;
+            }
+        }
+        return null;
+    }
 }