diff --git a/.eslintrc.js b/.eslintrc.js index c1ceeebd..89cea69 100644 --- a/.eslintrc.js +++ b/.eslintrc.js
@@ -95,6 +95,10 @@ format: ['camelCase'], leadingUnderscore: 'allow', }, + { + selector: 'function', + format: ['camelCase'], + }, ], '@typescript-eslint/member-delimiter-style': ['error', {
diff --git a/DEPS b/DEPS index 6bb87a7a..fca3ba4 100644 --- a/DEPS +++ b/DEPS
@@ -269,15 +269,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'ee0d15dc9ffd6fc44187a04f88484b51a2029890', + 'skia_revision': 'add4004be5fcac7698e47e199893a3a2b558f09f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'db8877b6cf7bd436b95cda8b41e49d23363b835a', + 'v8_revision': '1113f167eb55e26dae1217b6e8c9dab5490dd1dc', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '9872c1d63f3836930de40bd392ab5ee10624da7e', + 'angle_revision': 'f1640db8ce52ac03e84de2108a3df3f36c4c1977', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -296,7 +296,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:8.20220510.0.1', + 'fuchsia_version': 'version:8.20220510.2.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -340,7 +340,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '406c287087f813ebe4db4c87f5241c44fb4ddf14', + 'catapult_revision': 'cc11128444a9bcdc1be8bb31aed310331903fee1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -835,7 +835,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'PEGfoXVYly3LOuJ4p8cS2AGOcgIr3w4X8VUaRUWSJKwC', + 'version': 'BYhBwKD_mQiXI07HLtMbq9rvpsXCcxZ_GxLQ8x_i1xgC', }, ], 'dep_type': 'cipd', @@ -846,7 +846,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'wF39N_-p0fPg83dHc-vsvO-Kol-9JjHELG177rkq0fYC', + 'version': 'm09GIAiaD-5EvhXkbqkTvXyxDhemj8SS74LKiFad2uQC', }, ], 'dep_type': 'cipd', @@ -857,7 +857,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': 'zNK1toC6-tqHM7SGGfxieUG6N3OIyoQfbmIX3m4CXD4C', + 'version': 'iisJyZQ2Qc0Hti6gD7K1QgX3Fx9yRfh2eyxoOwAG4-gC', }, ], 'dep_type': 'cipd', @@ -1527,7 +1527,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + '6f088f4e829de8d845bf57e04bbb713336f3aa0b', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '5508464a31539928b590baefc469ca4077612872', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1663,7 +1663,7 @@ 'condition': 'checkout_android', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@3e76ffe3d4b39f7ec38581712dbde5c2e63ef0fb', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@ef2b69a8c03b115ddf5abd144ccf6981e2cb7c59', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1699,10 +1699,10 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'cf04aebdf9b53bb2853f22a81465688daf879ec6', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '75374031ad221bb033f110e42c90766726acf558', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'ccfaca7756beef3f2ee1c01072927a3dbc5b7305', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '1f49157b41a3b800929b9c6d7ed4e9dba71bfde6', + Var('webrtc_git') + '/src.git' + '@' + '61d6fb11bd7fafa5df14f0c884188122eb44e16e', 'src/third_party/libgifcodec': Var('skia_git') + '/libgifcodec' + '@'+ Var('libgifcodec_revision'), @@ -1775,7 +1775,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@2de429fbae8d37f1be9ae87bd0828db7a934378a', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9c325b4004540cb3a0404f7c15791ad7fd868985', 'condition': 'checkout_src_internal', },
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 4165e61..042b6fe 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1178,6 +1178,8 @@ "system/ime_menu/ime_list_view.h", "system/ime_menu/ime_menu_tray.cc", "system/ime_menu/ime_menu_tray.h", + "system/keyboard_brightness/keyboard_backlight_color_controller.cc", + "system/keyboard_brightness/keyboard_backlight_color_controller.h", "system/keyboard_brightness/keyboard_backlight_toggle_controller.cc", "system/keyboard_brightness/keyboard_backlight_toggle_controller.h", "system/keyboard_brightness/keyboard_brightness_controller.cc", @@ -2707,6 +2709,7 @@ "system/human_presence/snooping_protection_notification_blocker_unittest.cc", "system/ime/ime_feature_pod_controller_unittest.cc", "system/ime_menu/ime_menu_tray_unittest.cc", + "system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc", "system/locale/locale_feature_pod_controller_unittest.cc", "system/machine_learning/user_settings_event_logger_unittest.cc", "system/media/media_notification_provider_impl_unittest.cc",
diff --git a/ash/ash_prefs.cc b/ash/ash_prefs.cc index f110fdb..62c3a20 100644 --- a/ash/ash_prefs.cc +++ b/ash/ash_prefs.cc
@@ -33,6 +33,7 @@ #include "ash/system/caps_lock_notification_controller.h" #include "ash/system/gesture_education/gesture_education_notification_controller.h" #include "ash/system/human_presence/snooping_protection_controller.h" +#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" #include "ash/system/media/media_tray.h" #include "ash/system/message_center/message_center_controller.h" #include "ash/system/network/cellular_setup_notifier.h" @@ -91,6 +92,7 @@ LoginScreenController::RegisterProfilePrefs(registry, for_test); LogoutButtonTray::RegisterProfilePrefs(registry); LogoutConfirmationController::RegisterProfilePrefs(registry); + KeyboardBacklightColorController::RegisterProfilePrefs(registry); KeyboardControllerImpl::RegisterProfilePrefs(registry); MediaControllerImpl::RegisterProfilePrefs(registry); MessageCenterController::RegisterProfilePrefs(registry);
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index ef24748..29a81a6 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -259,6 +259,9 @@ <message name="IDS_SHELF_PREVIOUS" desc="Tooltip for the shelf arrow button that scrolls the shelf backward"> Previous </message> + <message name="IDS_SHELF_LAUNCHER_NUDGE_TEXT" desc="The text shown to users beside the home button that shows the launcher UI when the device is in clamshell mode. This nudge text guides them to click on the home button to see all the apps in the launcher UI."> + See all apps + </message> <!-- Status tray items --> <message name="IDS_ASH_STATUS_TRAY_ACCESSIBLE_DESCRIPTION" is_accessibility_with_no_ui="true" desc="The accessible description of the status tray and the information on it."> @@ -1844,6 +1847,9 @@ <message name="IDS_ASH_DESKS_TEMPLATES_USE_TEMPLATE_BUTTON" desc="The text of the button to launch the template."> Use template </message> + <message name="IDS_ASH_DESKS_TEMPLATES_OPEN_DESK_BUTTON" desc="The text of the button to launch the saved desk."> + Open desk + </message> <message name="IDS_ASH_DESKS_TEMPLATES_REACH_MAXIMUM_DESK_TOAST" desc="The text of the toast displayed when user tries to launch a template while maximum desk number is reached."> Only <ph name="MAX_DESK_LIMIT">$1<ex>8</ex></ph> desks allowed. Remove a desk to open a new one. </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_OPEN_DESK_BUTTON.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_OPEN_DESK_BUTTON.png.sha1 new file mode 100644 index 0000000..25475530 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_DESKS_TEMPLATES_OPEN_DESK_BUTTON.png.sha1
@@ -0,0 +1 @@ +32e1f86fbb63d7c726350dd894f7d856729a649c \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_SHELF_LAUNCHER_NUDGE_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_SHELF_LAUNCHER_NUDGE_TEXT.png.sha1 new file mode 100644 index 0000000..dc04f01 --- /dev/null +++ b/ash/ash_strings_grd/IDS_SHELF_LAUNCHER_NUDGE_TEXT.png.sha1
@@ -0,0 +1 @@ +8f77a5e6dfd51e78a9f24cd60cc00057f66687dd \ No newline at end of file
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index aece600f..b64aea0 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -1157,7 +1157,7 @@ base::FEATURE_ENABLED_BY_DEFAULT}; // Controls whether to enable Projector. -const base::Feature kProjector{"Projector", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kProjector{"Projector", base::FEATURE_ENABLED_BY_DEFAULT}; // Controls whether to enable Projector for managed users. const base::Feature kProjectorManagedUser{"ProjectorManagedUser",
diff --git a/ash/projector/test/mock_projector_client.h b/ash/projector/test/mock_projector_client.h index c59160b..c17508c5 100644 --- a/ash/projector/test/mock_projector_client.h +++ b/ash/projector/test/mock_projector_client.h
@@ -36,6 +36,7 @@ MOCK_CONST_METHOD0(IsDriveFsMountFailed, bool()); MOCK_CONST_METHOD0(OpenProjectorApp, void()); MOCK_CONST_METHOD0(MinimizeProjectorApp, void()); + MOCK_CONST_METHOD0(CloseProjectorApp, void()); MOCK_CONST_METHOD1(OnNewScreencastPreconditionChanged, void(const NewScreencastPrecondition&)); MOCK_METHOD1(SetAnnotatorMessageHandler, void(AnnotatorMessageHandler*));
diff --git a/ash/public/cpp/ash_typography.cc b/ash/public/cpp/ash_typography.cc index 2a2750b..74e2ecd3 100644 --- a/ash/public/cpp/ash_typography.cc +++ b/ash/public/cpp/ash_typography.cc
@@ -12,6 +12,9 @@ switch (context) { case CONTEXT_SEARCH_RESULT_VIEW_INLINE_ANSWER_DETAILS: break; + case CONTEXT_LAUNCHER_NUDGE_LABEL: + details.size_delta = 1; + break; case CONTEXT_SHARESHEET_BUBBLE_SMALL: details.size_delta = -2; break;
diff --git a/ash/public/cpp/ash_typography.h b/ash/public/cpp/ash_typography.h index 725a161..e9200754 100644 --- a/ash/public/cpp/ash_typography.h +++ b/ash/public/cpp/ash_typography.h
@@ -18,6 +18,9 @@ // A button that appears in the launcher's status area. CONTEXT_LAUNCHER_BUTTON = ASH_TEXT_CONTEXT_START, + // Text label that used in launcher nudge label. Medium weight. 13pt size. + CONTEXT_LAUNCHER_NUDGE_LABEL, + // A button that appears within a row of the tray popup. CONTEXT_TRAY_POPUP_BUTTON,
diff --git a/ash/public/cpp/projector/projector_client.h b/ash/public/cpp/projector/projector_client.h index 407f33d0..c1697bd 100644 --- a/ash/public/cpp/projector/projector_client.h +++ b/ash/public/cpp/projector/projector_client.h
@@ -39,6 +39,8 @@ virtual void OpenProjectorApp() const = 0; // Minimizes Projector SWA. virtual void MinimizeProjectorApp() const = 0; + // Closes Projector SWA. + virtual void CloseProjectorApp() const = 0; // Registers the AnnotatorMessageHandler that is owned by the WebUI that // contains the Projector annotator.
diff --git a/ash/shelf/home_button.cc b/ash/shelf/home_button.cc index d99ea4a8..131784f 100644 --- a/ash/shelf/home_button.cc +++ b/ash/shelf/home_button.cc
@@ -8,12 +8,15 @@ #include <memory> #include "ash/app_list/app_list_controller_impl.h" +#include "ash/public/cpp/ash_typography.h" #include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shelf_types.h" #include "ash/shelf/shelf.h" #include "ash/shelf/shelf_focus_cycler.h" #include "ash/shelf/shelf_navigation_widget.h" +#include "ash/shelf/shelf_view.h" #include "ash/shell.h" +#include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/check_op.h" @@ -30,6 +33,9 @@ #include "ui/views/animation/animation_builder.h" #include "ui/views/animation/flood_fill_ink_drop_ripple.h" #include "ui/views/controls/button/button_controller.h" +#include "ui/views/controls/label.h" +#include "ui/views/layout/fill_layout.h" +#include "ui/views/view.h" namespace ash { namespace { @@ -44,10 +50,30 @@ constexpr int kAnimationBounceUpOffset = 12; constexpr int kAnimationBounceDownOffset = 3; +// Constants used on `nudge_ripple_layer_` animation. constexpr base::TimeDelta kHomeButtonAnimationDuration = base::Milliseconds(250); constexpr base::TimeDelta kRippleAnimationDuration = base::Milliseconds(2000); +// Constants used on `nudge_label_` animation. +// +// The duration of the showing/hiding animation for nudge label. +constexpr base::TimeDelta kNudgeLabelTransitionOnDuration = + base::Milliseconds(300); +constexpr base::TimeDelta kNudgeLabelTransitionOffDuration = + base::Milliseconds(500); + +// The duration of the fade out animation that animates `nudge_label_` when +// users click on the home button while `nudge_label_` is showing. +constexpr base::TimeDelta kNudgeLabelFadeOutDuration = base::Milliseconds(100); + +// The duration that the nudge label is shown. +constexpr base::TimeDelta kNudgeLabelShowingDuration = base::Seconds(6); + +// The minimum space we want to keep between the `nudge_label_` and the first +// app in hotseat. Used to determine if `nudge_label_` should be shown. +constexpr int kMinSpaceBetweenNudgeLabelAndHotseat = 24; + } // namespace // static @@ -72,7 +98,7 @@ // HomeButton::ScopedNoClipRect ------------------------------------------------ HomeButton::HomeButton(Shelf* shelf) - : ShelfControlButton(shelf, this), controller_(this) { + : ShelfControlButton(shelf, this), shelf_(shelf), controller_(this) { SetAccessibleName( l10n_util::GetStringUTF16(IDS_ASH_SHELF_APP_LIST_LAUNCHER_TITLE)); button_controller()->set_notify_action( @@ -85,6 +111,24 @@ HomeButton::~HomeButton() = default; +gfx::Size HomeButton::CalculatePreferredSize() const { + // Take the preferred size of the nudge label into consideration when it is + // visible. Note that the button width is already included in the label width. + if (label_container_ && label_container_->GetVisible()) + return label_container_->GetPreferredSize(); + + return ShelfControlButton::CalculatePreferredSize(); +} + +void HomeButton::Layout() { + ShelfControlButton::Layout(); + + if (label_container_) { + label_container_->SetSize( + gfx::Size(label_container_->GetPreferredSize().width(), height())); + } +} + void HomeButton::OnGestureEvent(ui::GestureEvent* event) { if (!controller_.MaybeHandleGestureEvent(event)) Button::OnGestureEvent(event); @@ -130,6 +174,20 @@ event.IsShiftDown() ? kShelfButtonFullscreen : kShelfButton; Shell::Get()->app_list_controller()->ToggleAppList( GetDisplayId(), show_source, event.time_stamp()); + + // If the home button is pressed, fade out the nudge label if it is showing. + if (label_container_) { + if (!label_container_->GetVisible()) { + // If the nudge label is not visible and will not be animating, directly + // remove them as the nudge won't be showing anymore. + RemoveNudgeLabel(); + return; + } + + if (label_nudge_timer_.IsRunning()) + label_nudge_timer_.AbandonAndStop(); + AnimateNudgeLabelFadeOut(); + } } void HomeButton::OnAssistantAvailabilityChanged() { @@ -160,94 +218,77 @@ shelf()->navigation_widget()); } +bool HomeButton::CanShowNudgeLabel() const { + if (!shelf_->IsHorizontalAlignment()) + return false; + + // If there's no pinned app in shelf, shows the nudge label for the launcher + // nudge. + ShelfView* shelf_view = shelf_->hotseat_widget()->GetShelfView(); + int view_size = shelf_view->view_model()->view_size(); + if (view_size == 0) + return true; + + // Need to have nudge_label_ existing to calculate the space for itself. + DCHECK(nudge_label_); + + // For the calculation below, convert all points and rects to the root window + // coordinate to make sure they are under the same coordinate. + gfx::Rect first_app_bounds = + shelf_view->view_model()->view_at(0)->GetMirroredBounds(); + first_app_bounds = shelf_view->ConvertRectToWidget(first_app_bounds); + aura::Window* shelf_native_window = + shelf_view->GetWidget()->GetNativeWindow(); + aura::Window::ConvertRectToTarget(shelf_native_window, + shelf_native_window->GetRootWindow(), + &first_app_bounds); + + gfx::Rect label_rect = + ConvertRectToWidget(label_container_->GetMirroredBounds()); + aura::Window* native_window = GetWidget()->GetNativeWindow(); + DCHECK_EQ(shelf_native_window->GetRootWindow(), + native_window->GetRootWindow()); + aura::Window::ConvertRectToTarget( + native_window, native_window->GetRootWindow(), &label_rect); + + // Horizontal space between the `label_rect` and the first app in shelf, which + // is also the app that is closest to the home button, is calculated here to + // check if there's enough space to show the `nudge_label_`. + int space = label_rect.ManhattanInternalDistance(first_app_bounds); + return space >= kMinSpaceBetweenNudgeLabelAndHotseat; +} + void HomeButton::StartNudgeAnimation() { - // Create the ripple layer and its delegate for the nudge animation. - nudge_ripple_layer_ = std::make_unique<ui::Layer>(); - float ripple_diameter = layer()->size().width(); - ripple_layer_delegate_ = std::make_unique<views::CircleLayerDelegate>( - AshColorProvider::Get()->GetInkDropBaseColorAndOpacity().first, - /*radius=*/ripple_diameter / 2); + // Create the nudge label first to check if there is enough space to show it. + if (!nudge_label_) + CreateNudgeLabel(); - // The bounds are set with respect to |shelf_container_layer| stated below. - nudge_ripple_layer_->SetBounds( - gfx::Rect(layer()->parent()->bounds().x() + bounds().x(), - layer()->parent()->bounds().y() + bounds().y(), ripple_diameter, - ripple_diameter)); - nudge_ripple_layer_->set_delegate(ripple_layer_delegate_.get()); - nudge_ripple_layer_->SetMasksToBounds(true); - nudge_ripple_layer_->SetFillsBoundsOpaquely(false); + const bool can_show_nudge_label = CanShowNudgeLabel(); - // The position of the ripple layer is independent to the home button and its - // parent shelf navigation widget. Therefore the ripple layer is added to the - // shelf container layer, which is the parent layer of the shelf navigation - // widget. - ui::Layer* shelf_container_layer = GetWidget()->GetLayer()->parent(); - shelf_container_layer->Add(nudge_ripple_layer_.get()); - shelf_container_layer->StackBelow(nudge_ripple_layer_.get(), - layer()->parent()); - - // Home button movement settings. Note that the navigation widget layer - // contains the non-opaque part of the home button and is also animated along - // with the home button. - ui::Layer* widget_layer = GetWidget()->GetLayer(); - - gfx::PointF bounce_up_point = shelf()->SelectValueForShelfAlignment( - gfx::PointF(0, -kAnimationBounceUpOffset), - gfx::PointF(kAnimationBounceUpOffset, 0), - gfx::PointF(-kAnimationBounceUpOffset, 0)); - gfx::PointF bounce_down_point = shelf()->SelectValueForShelfAlignment( - gfx::PointF(0, kAnimationBounceDownOffset), - gfx::PointF(-kAnimationBounceDownOffset, 0), - gfx::PointF(kAnimationBounceDownOffset, 0)); - - gfx::Transform move_up; - move_up.Translate(bounce_up_point.x(), bounce_up_point.y()); - gfx::Transform move_down; - move_down.Translate(bounce_down_point.x(), bounce_down_point.y()); - - gfx::Transform initial_disc_scale; - initial_disc_scale.Scale(0.1f, 0.1f); - gfx::Transform initial_state = - gfx::TransformAboutPivot(GetCenterPoint(), initial_disc_scale); - - gfx::Transform final_disc_scale; - final_disc_scale.Scale(3.0f, 3.0f); - gfx::Transform scale_about_pivot = - gfx::TransformAboutPivot(GetCenterPoint(), final_disc_scale); - - // Remove clip_rect from the home button and its ancestors as the animation - // goes beyond its size. The object is deleted once the animation ends. - scoped_no_clip_rect_ = CreateScopedNoClipRect(); - - views::AnimationBuilder() + views::AnimationBuilder builder; + builder .SetPreemptionStrategy( ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET) .OnStarted(base::BindOnce(&HomeButton::OnNudgeAnimationStarted, weak_ptr_factory_.GetWeakPtr())) - .OnEnded(base::BindOnce(&HomeButton::OnNudgeAnimationEnded, + .OnEnded(base::BindOnce(can_show_nudge_label + ? &HomeButton::OnLabelSlideInAnimationEnded + : &HomeButton::OnNudgeAnimationEnded, weak_ptr_factory_.GetWeakPtr())) - .Once() - // Set up the animation of the ripple_layer - .SetDuration(base::TimeDelta()) - .SetTransform(nudge_ripple_layer_.get(), initial_state) - .SetOpacity(nudge_ripple_layer_.get(), 0.5f) - .Then() - .SetDuration(kRippleAnimationDuration) - .SetTransform(nudge_ripple_layer_.get(), scale_about_pivot, - gfx::Tween::ACCEL_0_40_DECEL_100) - .SetOpacity(nudge_ripple_layer_.get(), 0.0f, - gfx::Tween::ACCEL_0_80_DECEL_80) - // Set up the animation of the widget_layer - .At(base::Seconds(0)) - .SetDuration(kHomeButtonAnimationDuration) - .SetTransform(widget_layer, move_up, gfx::Tween::FAST_OUT_SLOW_IN_3) - .Then() - .SetDuration(kHomeButtonAnimationDuration) - .SetTransform(widget_layer, move_down, gfx::Tween::ACCEL_80_DECEL_20) - .Then() - .SetDuration(kHomeButtonAnimationDuration) - .SetTransform(widget_layer, gfx::Transform(), - gfx::Tween::FAST_OUT_SLOW_IN_3); + .OnAborted(base::BindOnce(&HomeButton::OnNudgeAnimationEnded, + weak_ptr_factory_.GetWeakPtr())) + .Once(); + + if (can_show_nudge_label) { + AnimateNudgeLabelSlideIn(builder); + } else { + AnimateNudgeBounce(builder); + } + + // Remove clip_rect from the home button and its ancestors as the animation + // goes beyond its bounds. The object is deleted once the animation ends. + scoped_no_clip_rect_ = CreateScopedNoClipRect(); + AnimateNudgeRipple(builder); } void HomeButton::AddNudgeAnimationObserverForTest( @@ -260,7 +301,7 @@ } void HomeButton::PaintButtonContents(gfx::Canvas* canvas) { - gfx::PointF circle_center(GetCenterPoint()); + gfx::PointF circle_center(gfx::Rect(size()).CenterPoint()); // Paint a white ring as the foreground for the app list circle. The ceil/dsf // math assures that the ring draws sharply and is centered at all scale @@ -310,21 +351,241 @@ ripple_layer_delegate_->set_color( AshColorProvider::Get()->GetInkDropBaseColorAndOpacity().first); } + if (label_container_) { + label_container_->layer()->SetColor( + AshColorProvider::Get()->GetControlsLayerColor( + AshColorProvider::ControlsLayerType:: + kControlBackgroundColorInactive)); + } SchedulePaint(); } -bool HomeButton::DoesIntersectRect(const views::View* target, - const gfx::Rect& rect) const { - DCHECK_EQ(target, this); - gfx::Rect button_bounds = target->GetLocalBounds(); - // Increase clickable area for the button to account for clicks around the - // spacing. This will not intercept events outside of the parent widget. - button_bounds.Inset( - gfx::Insets::VH(-ShelfConfig::Get()->control_button_edge_spacing( - !shelf()->IsHorizontalAlignment()), - -ShelfConfig::Get()->control_button_edge_spacing( - shelf()->IsHorizontalAlignment()))); - return button_bounds.Intersects(rect); +void HomeButton::CreateNudgeLabel() { + DCHECK(!label_container_); + const int home_button_width = + ShelfControlButton::CalculatePreferredSize().width(); + + label_container_ = AddChildView(std::make_unique<views::View>()); + label_container_->SetLayoutManager(std::make_unique<views::FillLayout>()); + label_container_->SetBorder( + views::CreateEmptyBorder(gfx::Insets::TLBR(0, home_button_width, 0, 16))); + label_container_->SetPaintToLayer(ui::LAYER_SOLID_COLOR); + label_container_->layer()->SetMasksToBounds(true); + label_container_->layer()->SetColor( + AshColorProvider::Get()->GetControlsLayerColor( + AshColorProvider::ControlsLayerType:: + kControlBackgroundColorInactive)); + label_container_->layer()->SetRoundedCornerRadius( + gfx::RoundedCornersF(home_button_width / 2.f)); + label_container_->layer()->SetName("NudgeLabelContainer"); + + // Create a view to clip the `nudge_label_` to the area right of the home + // button during nudge label animation. + auto* label_mask = + label_container_->AddChildView(std::make_unique<views::View>()); + label_mask->SetLayoutManager(std::make_unique<views::FillLayout>()); + label_mask->SetBorder( + views::CreateEmptyBorder(gfx::Insets::TLBR(0, 12, 0, 0))); + label_mask->SetPaintToLayer(ui::LAYER_NOT_DRAWN); + label_mask->layer()->SetMasksToBounds(true); + label_mask->layer()->SetName("NudgeLabelMask"); + + nudge_label_ = label_mask->AddChildView(std::make_unique<views::Label>( + l10n_util::GetStringUTF16(IDS_SHELF_LAUNCHER_NUDGE_TEXT))); + nudge_label_->SetAutoColorReadabilityEnabled(false); + nudge_label_->SetPaintToLayer(); + nudge_label_->layer()->SetFillsBoundsOpaquely(false); + nudge_label_->SetTextContext(CONTEXT_LAUNCHER_NUDGE_LABEL); + nudge_label_->SetTextStyle(STYLE_EMPHASIZED); + nudge_label_->SetEnabledColor(AshColorProvider::Get()->GetContentLayerColor( + AshColorProvider::ContentLayerType::kTextColorPrimary)); + + Layout(); + label_container_->SetVisible(false); +} + +void HomeButton::AnimateNudgeRipple(views::AnimationBuilder& builder) { + // Create the ripple layer and its delegate for the nudge animation. + nudge_ripple_layer_.Reset(std::make_unique<ui::Layer>()); + ui::Layer* ripple_layer = nudge_ripple_layer_.layer(); + + float ripple_diameter = ShelfControlButton::CalculatePreferredSize().width(); + ripple_layer_delegate_ = std::make_unique<views::CircleLayerDelegate>( + AshColorProvider::Get()->GetInkDropBaseColorAndOpacity().first, + /*radius=*/ripple_diameter / 2); + + // The bounds are set with respect to |shelf_container_layer| stated below. + ripple_layer->SetBounds( + gfx::Rect(layer()->parent()->bounds().x() + layer()->bounds().x(), + layer()->parent()->bounds().y() + layer()->bounds().y(), + ripple_diameter, ripple_diameter)); + + ripple_layer->set_delegate(ripple_layer_delegate_.get()); + ripple_layer->SetMasksToBounds(true); + ripple_layer->SetFillsBoundsOpaquely(false); + + // The position of the ripple layer is independent to the home button and its + // parent shelf navigation widget. Therefore the ripple layer is added to the + // shelf container layer, which is the parent layer of the shelf navigation + // widget. + ui::Layer* shelf_container_layer = GetWidget()->GetLayer()->parent(); + shelf_container_layer->Add(ripple_layer); + shelf_container_layer->StackBelow(ripple_layer, layer()->parent()); + + // The point of the center of the round button. + gfx::Point ripple_center = gfx::Rect(ripple_layer->size()).CenterPoint(); + + gfx::Transform initial_disc_scale; + initial_disc_scale.Scale(0.1f, 0.1f); + gfx::Transform initial_state = + gfx::TransformAboutPivot(ripple_center, initial_disc_scale); + + gfx::Transform final_disc_scale; + final_disc_scale.Scale(3.0f, 3.0f); + gfx::Transform scale_about_pivot = + gfx::TransformAboutPivot(ripple_center, final_disc_scale); + + builder.GetCurrentSequence() + .At(base::TimeDelta()) + // Set up the animation of the `nudge_ripple_layer_` + .SetDuration(base::TimeDelta()) + .SetTransform(ripple_layer, initial_state) + .SetOpacity(ripple_layer, 0.5f) + .Then() + .SetDuration(kRippleAnimationDuration) + .SetTransform(ripple_layer, scale_about_pivot, + gfx::Tween::ACCEL_0_40_DECEL_100) + .SetOpacity(ripple_layer, 0.0f, gfx::Tween::ACCEL_0_80_DECEL_80); +} + +void HomeButton::AnimateNudgeBounce(views::AnimationBuilder& builder) { + gfx::PointF bounce_up_point = shelf()->SelectValueForShelfAlignment( + gfx::PointF(0, -kAnimationBounceUpOffset), + gfx::PointF(kAnimationBounceUpOffset, 0), + gfx::PointF(-kAnimationBounceUpOffset, 0)); + gfx::PointF bounce_down_point = shelf()->SelectValueForShelfAlignment( + gfx::PointF(0, kAnimationBounceDownOffset), + gfx::PointF(-kAnimationBounceDownOffset, 0), + gfx::PointF(kAnimationBounceDownOffset, 0)); + + gfx::Transform move_up; + move_up.Translate(bounce_up_point.x(), bounce_up_point.y()); + gfx::Transform move_down; + move_down.Translate(bounce_down_point.x(), bounce_down_point.y()); + + // Home button movement settings. Note that the navigation widget layer + // contains the non-opaque part of the home button and is also animated along + // with the home button. + ui::Layer* widget_layer = GetWidget()->GetLayer(); + + // Set up the animation of the `widget_layer`, which bounce up and down during + // the animation. + builder.GetCurrentSequence() + .At(base::TimeDelta()) + .SetDuration(kHomeButtonAnimationDuration) + .SetTransform(widget_layer, move_up, gfx::Tween::FAST_OUT_SLOW_IN_3) + .Then() + .SetDuration(kHomeButtonAnimationDuration) + .SetTransform(widget_layer, move_down, gfx::Tween::ACCEL_80_DECEL_20) + .Then() + .SetDuration(kHomeButtonAnimationDuration) + .SetTransform(widget_layer, gfx::Transform(), + gfx::Tween::FAST_OUT_SLOW_IN_3); +} + +void HomeButton::AnimateNudgeLabelSlideIn(views::AnimationBuilder& builder) { + // Make sure the label is created. + DCHECK(label_container_ && nudge_label_); + + // Update the shelf layout to provide space for the navigation widget. + label_container_->SetVisible(true); + shelf_->shelf_layout_manager()->LayoutShelf(false); + + const int home_button_width = + ShelfControlButton::CalculatePreferredSize().width(); + const int label_visible_width = label_container_->width() - home_button_width; + + gfx::Rect initial_container_clip_rect; + gfx::Transform initial_transform; + + // Set up the initial label transform and label container clip rect. + if (base::i18n::IsRTL()) { + initial_transform.Translate(label_visible_width, 0); + initial_container_clip_rect = gfx::Rect( + label_visible_width, 0, home_button_width, label_container_->height()); + } else { + initial_transform.Translate(-label_visible_width, 0); + initial_container_clip_rect = + gfx::Rect(0, 0, home_button_width, label_container_->height()); + } + + // Calculate the target clip rect on `label_container_`. + gfx::Rect container_target_clip_rect = gfx::Rect(label_container_->size()); + + // Set up the animation of the `nudge_label_` + builder.GetCurrentSequence() + .At(base::TimeDelta()) + .SetDuration(base::TimeDelta()) + .SetTransform(nudge_label_->layer(), initial_transform) + .SetClipRect(label_container_->layer(), initial_container_clip_rect) + .SetOpacity(label_container_->layer(), 0) + .Then() + .SetDuration(kNudgeLabelTransitionOnDuration) + .SetTransform(nudge_label_->layer(), gfx::Transform(), + gfx::Tween::ACCEL_5_70_DECEL_90) + .SetClipRect(label_container_->layer(), container_target_clip_rect, + gfx::Tween::ACCEL_5_70_DECEL_90) + .SetOpacity(label_container_->layer(), 1, + gfx::Tween::ACCEL_5_70_DECEL_90); +} + +void HomeButton::AnimateNudgeLabelSlideOut() { + const int home_button_width = + ShelfControlButton::CalculatePreferredSize().width(); + const int label_visible_width = label_container_->width() - home_button_width; + + gfx::Transform target_transform; + gfx::Rect container_target_clip_rect; + + // Calculate the target transform and clip rect. + if (base::i18n::IsRTL()) { + target_transform.Translate(label_visible_width, 0); + container_target_clip_rect = gfx::Rect( + label_visible_width, 0, home_button_width, label_container_->height()); + } else { + target_transform.Translate(-label_visible_width, 0); + container_target_clip_rect = + gfx::Rect(0, 0, home_button_width, label_container_->height()); + } + + views::AnimationBuilder() + .SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET) + .OnEnded(base::BindOnce(&HomeButton::OnNudgeAnimationEnded, + weak_ptr_factory_.GetWeakPtr())) + .OnAborted(base::BindOnce(&HomeButton::OnNudgeAnimationEnded, + weak_ptr_factory_.GetWeakPtr())) + .Once() + .SetDuration(kNudgeLabelTransitionOffDuration) + .SetTransform(nudge_label_->layer(), target_transform, + gfx::Tween::ACCEL_40_DECEL_100_3) + .SetClipRect(label_container_->layer(), container_target_clip_rect, + gfx::Tween::ACCEL_40_DECEL_100_3) + .SetOpacity(label_container_->layer(), 0, + gfx::Tween::ACCEL_40_DECEL_100_3); +} + +void HomeButton::AnimateNudgeLabelFadeOut() { + views::AnimationBuilder() + .SetPreemptionStrategy( + ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET) + .OnEnded(base::BindOnce(&HomeButton::OnLabelFadeOutAnimationEnded, + weak_ptr_factory_.GetWeakPtr())) + .OnAborted(base::BindOnce(&HomeButton::OnLabelFadeOutAnimationEnded, + weak_ptr_factory_.GetWeakPtr())) + .Once() + .SetDuration(kNudgeLabelFadeOutDuration) + .SetOpacity(label_container_->layer(), 0, gfx::Tween::LINEAR); } void HomeButton::OnNudgeAnimationStarted() { @@ -335,9 +596,14 @@ void HomeButton::OnNudgeAnimationEnded() { // Delete the ripple layer and its delegate after the launcher nudge animation // is completed. - nudge_ripple_layer_.reset(); + nudge_ripple_layer_.ReleaseLayer(); ripple_layer_delegate_.reset(); + if (label_container_) { + label_container_->SetVisible(false); + shelf_->shelf_layout_manager()->LayoutShelf(false); + } + // Reset the clip rect after the animation is completed. scoped_no_clip_rect_.reset(); @@ -345,4 +611,50 @@ observer.NudgeAnimationEnded(this); } +void HomeButton::OnLabelSlideInAnimationEnded() { + for (auto& observer : observers_) + observer.NudgeLabelShown(this); + + // After the label is shown for `kNudgeLabelShowingDuration` amount of time, + // move the label back to its original position. + label_nudge_timer_.Start( + FROM_HERE, kNudgeLabelShowingDuration, + base::BindOnce(&HomeButton::AnimateNudgeLabelSlideOut, + base::Unretained(this))); +} + +void HomeButton::OnLabelFadeOutAnimationEnded() { + OnNudgeAnimationEnded(); + + // If the label is faded out by clicking on it, remove the label as it is + // assumed that the nudge won't be shown again. + RemoveNudgeLabel(); +} + +void HomeButton::RemoveNudgeLabel() { + RemoveChildViewT(label_container_); + label_container_ = nullptr; + nudge_label_ = nullptr; +} + +bool HomeButton::DoesIntersectRect(const views::View* target, + const gfx::Rect& rect) const { + DCHECK_EQ(target, this); + gfx::Rect button_bounds = target->GetLocalBounds(); + + // If the `label_container_` is visible, set all the area within the label + // bounds clickable. + if (label_container_ && label_container_->GetVisible()) + button_bounds = label_container_->layer()->bounds(); + + // Increase clickable area for the button to account for clicks around the + // spacing. This will not intercept events outside of the parent widget. + button_bounds.Inset( + gfx::Insets::VH(-ShelfConfig::Get()->control_button_edge_spacing( + !shelf()->IsHorizontalAlignment()), + -ShelfConfig::Get()->control_button_edge_spacing( + shelf()->IsHorizontalAlignment()))); + return button_bounds.Intersects(rect); +} + } // namespace ash
diff --git a/ash/shelf/home_button.h b/ash/shelf/home_button.h index b0053c2a..789ebf1c 100644 --- a/ash/shelf/home_button.h +++ b/ash/shelf/home_button.h
@@ -16,15 +16,18 @@ #include "ui/views/view_targeter_delegate.h" namespace views { +class AnimationBuilder; class CircleLayerDelegate; +class Label; } // namespace views namespace ui { -class Layer; +class LayerOwner; } namespace ash { +class Shelf; class ShelfButtonDelegate; class ShelfNavigationWidget; @@ -63,6 +66,9 @@ // Called when the nudge animation is started/ended. virtual void NudgeAnimationStarted(HomeButton* home_button) = 0; virtual void NudgeAnimationEnded(HomeButton* home_button) = 0; + + // Called when the nudge label is animated to fully shown. + virtual void NudgeLabelShown(HomeButton* home_button) = 0; }; static const char kViewClassName[]; @@ -74,6 +80,10 @@ ~HomeButton() override; + // views::View: + gfx::Size CalculatePreferredSize() const override; + void Layout() override; + // views::Button: void OnGestureEvent(ui::GestureEvent* event) override; const char* GetClassName() const override; @@ -104,32 +114,67 @@ // returned ScopedNoClipRect. [[nodiscard]] std::unique_ptr<ScopedNoClipRect> CreateScopedNoClipRect(); + // Checks if the `nudge_label_` can be shown for the launcher nudge. + // NOTE: This must be called after `CreateNudgeLabel()`, where the + // `nudge_label_` is created. This is because whether the nudge can be shown + // depends on nudge_label_'s preferred size. + bool CanShowNudgeLabel() const; + // Starts the launcher nudge animation. void StartNudgeAnimation(); void AddNudgeAnimationObserverForTest(NudgeAnimationObserver* observer); void RemoveNudgeAnimationObserverForTest(NudgeAnimationObserver* observer); + views::View* label_container_for_test() const { return label_container_; } + protected: // views::Button: void PaintButtonContents(gfx::Canvas* canvas) override; void OnThemeChanged() override; private: + // Creates `nudge_label_` for launcher nudge. + void CreateNudgeLabel(); + + // Animation functions for launcher nudge. + void AnimateNudgeRipple(views::AnimationBuilder& builder); + void AnimateNudgeBounce(views::AnimationBuilder& builder); + void AnimateNudgeLabelSlideIn(views::AnimationBuilder& builder); + void AnimateNudgeLabelSlideOut(); + void AnimateNudgeLabelFadeOut(); + + // Callbacks for the nudge animation. + void OnNudgeAnimationStarted(); + void OnNudgeAnimationEnded(); + void OnLabelSlideInAnimationEnded(); + void OnLabelFadeOutAnimationEnded(); + + // Removes the nudge label from the view hierarchy. + void RemoveNudgeLabel(); + // views::ViewTargeterDelegate: bool DoesIntersectRect(const views::View* target, const gfx::Rect& rect) const override; - // Callback for the nudge animation. - void OnNudgeAnimationStarted(); - void OnNudgeAnimationEnded(); + Shelf* const shelf_; // The controller used to determine the button's behavior. HomeButtonController controller_; // The ripple layer in the launcher nudge animation. Only exists during the // nudge animation. - std::unique_ptr<ui::Layer> nudge_ripple_layer_; + ui::LayerOwner nudge_ripple_layer_; + + // The label view and for launcher nudge animation. + views::Label* nudge_label_ = nullptr; + + // The container of `nudge_label_`. This is also responsible for painting the + // background of the label. + views::View* label_container_ = nullptr; + + // The timer that counts down to hide the nudge_label_ from showing state. + base::OneShotTimer label_nudge_timer_; // The delegate used by |nudge_ripple_layer_|. Only exists during the // nudge animation.
diff --git a/ash/shelf/launcher_nudge_controller_unittest.cc b/ash/shelf/launcher_nudge_controller_unittest.cc index 884a035..94fa106 100644 --- a/ash/shelf/launcher_nudge_controller_unittest.cc +++ b/ash/shelf/launcher_nudge_controller_unittest.cc
@@ -5,17 +5,22 @@ #include "ash/shelf/launcher_nudge_controller.h" #include "ash/app_list/app_list_controller_impl.h" +#include "ash/app_list/test/app_list_test_helper.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/session/session_controller_impl.h" #include "ash/shelf/home_button.h" +#include "ash/shelf/scrollable_shelf_view.h" #include "ash/shelf/shelf_controller.h" +#include "ash/shelf/shelf_test_util.h" +#include "ash/shelf/shelf_view_test_api.h" #include "ash/shell.h" #include "ash/test/ash_test_base.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "base/json/values_util.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "ui/compositor/layer.h" #include "ui/compositor/scoped_animation_duration_scale_mode.h" namespace ash { @@ -43,7 +48,23 @@ DCHECK_EQ(started_animation_count_, ended_animation_count_ + 1); ++ended_animation_count_; - run_loop_.Quit(); + animation_run_loop_.Quit(); + } + void NudgeLabelShown(HomeButton* home_button) override { + if (home_button != home_button_) + return; + + label_run_loop_.Quit(); + } + + void WaitUntilLabelShown() { + ASSERT_TRUE(home_button_->CanShowNudgeLabel()); + DCHECK_GE(started_animation_count_, ended_animation_count_); + if (started_animation_count_ == ended_animation_count_) + return; + + // Block the test to wait until the label is shown. + label_run_loop_.Run(); } void WaitUntilAnimationEnded() { @@ -52,14 +73,15 @@ return; // Block the test to wait until the animation ended. - run_loop_.Run(); + animation_run_loop_.Run(); } // Returns the number of finished animation on this home_button_. int GetShownCount() const { return ended_animation_count_; } private: - base::RunLoop run_loop_; + base::RunLoop animation_run_loop_; + base::RunLoop label_run_loop_; HomeButton* const home_button_; // Counts the number of started/ended animations. @@ -86,6 +108,13 @@ nudge_controller_->SetClockForTesting( task_environment()->GetMockClock(), task_environment()->GetMockTickClock()); + + scrollable_shelf_view_ = GetPrimaryShelf() + ->shelf_widget() + ->hotseat_widget() + ->scrollable_shelf_view(); + test_api_ = std::make_unique<ShelfViewTestAPI>( + scrollable_shelf_view_->shelf_view()); } // Advances the mock clock in the task environment and wait until it is idle. @@ -103,8 +132,19 @@ return LauncherNudgeController::GetShownCount(pref_service); } + void AddAppShortcut(int& id) { + ShelfItem item = ShelfTestUtil::AddAppShortcut(base::NumberToString(id++), + TYPE_PINNED_APP); + + // Wait for shelf view's bounds animation to end. Otherwise the scrollable + // shelf's bounds are not updated yet. + test_api_->RunMessageLoopUntilAnimationsDone(); + } + LauncherNudgeController* nudge_controller_; std::unique_ptr<TestNudgeAnimationObserver> observer_; + ScrollableShelfView* scrollable_shelf_view_ = nullptr; + std::unique_ptr<ShelfViewTestAPI> test_api_; private: base::test::ScopedFeatureList scoped_feature_list_; @@ -304,4 +344,82 @@ EXPECT_EQ(2, GetNudgeShownCount()); } +TEST_F(LauncherNudgeControllerTest, NudgeLabelVisibilityTest) { + // Set the animation duration mode to non-zero for the launcher nudge + // animation to actually run in the tests. + ui::ScopedAnimationDurationScaleMode non_zero_duration_mode( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + SimulateNewUserFirstLogin("user@gmail.com"); + EXPECT_EQ(GetNudgeShownCount(), 0); + + HomeButton* home_button = LauncherNudgeController::GetHomeButtonForDisplay( + GetPrimaryDisplay().id()); + TestNudgeAnimationObserver waiter(home_button); + AdvanceClock(nudge_controller_->GetNudgeInterval(/*is_first_time=*/true)); + + // Wait until the label to be shown and check if the label is visible. + waiter.WaitUntilLabelShown(); + views::View* label_container = home_button->label_container_for_test(); + EXPECT_TRUE(label_container && label_container->GetVisible()); + EXPECT_EQ(label_container->layer()->opacity(), 1); + + // Wait until the label is hidden. + AdvanceClock(base::TimeDelta(base::Seconds(6))); + waiter.WaitUntilAnimationEnded(); + EXPECT_FALSE(label_container->GetVisible()); + EXPECT_EQ(label_container->layer()->opacity(), 0); + EXPECT_EQ(GetNudgeShownCount(), 1); + + TestNudgeAnimationObserver waiter2(home_button); + AdvanceClock(nudge_controller_->GetNudgeInterval(/*is_first_time=*/false) - + base::Seconds(6)); + waiter2.WaitUntilLabelShown(); + EXPECT_TRUE(label_container->GetVisible()); + + gfx::Point center = label_container->GetBoundsInScreen().CenterPoint(); + GetEventGenerator()->MoveMouseTo(center); + + // Click on the nudge label should toggle the app list. + GetEventGenerator()->ClickLeftButton(); + GetAppListTestHelper()->WaitUntilIdle(); + GetAppListTestHelper()->CheckVisibility(true); + + // Clicking on the nudge label should animate it. Wait until the animation + // ends. + waiter2.WaitUntilAnimationEnded(); + + // The label is removed after it is clicked. + EXPECT_FALSE(home_button->label_container_for_test()); +} + +TEST_F(LauncherNudgeControllerTest, AnimationUsedDependsOnAvailableSpace) { + // Set the animation duration mode to non-zero for the launcher nudge + // animation to actually run in the tests. + ui::ScopedAnimationDurationScaleMode non_zero_duration_mode( + ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION); + SimulateNewUserFirstLogin("user@gmail.com"); + EXPECT_EQ(GetNudgeShownCount(), 0); + + HomeButton* home_button = LauncherNudgeController::GetHomeButtonForDisplay( + GetPrimaryDisplay().id()); + + // Advance the clock to trigger the animation and create the label nudge. + AdvanceClock(nudge_controller_->GetNudgeInterval(/*is_first_time=*/true)); + + // Without adding anything to shelf, there should be enough space to show + // nudge label. + EXPECT_TRUE(home_button->CanShowNudgeLabel()); + + int id = 0; + // Add app shortcuts until the hotseat overflow. + while (scrollable_shelf_view_->layout_strategy_for_test() == + ScrollableShelfView::kNotShowArrowButtons) { + AddAppShortcut(id); + } + + // If the apps overflow in shelf, there should be no space for the label to be + // shown. + EXPECT_FALSE(home_button->CanShowNudgeLabel()); +} + } // namespace ash
diff --git a/ash/shelf/shelf_navigation_widget.cc b/ash/shelf/shelf_navigation_widget.cc index 6571b7f..5e30a97 100644 --- a/ash/shelf/shelf_navigation_widget.cc +++ b/ash/shelf/shelf_navigation_widget.cc
@@ -825,18 +825,24 @@ if (!ShelfConfig::Get()->shelf_controls_shown()) return gfx::Size(); - int control_button_number; + int controls_space = 0; + const int control_size = ShelfConfig::Get()->control_size(); + if (Shell::Get()->IsInTabletMode() && !only_visible_area) { // There are home button and back button. So the maximum is 2. - control_button_number = 2; + controls_space = control_size * 2 + ShelfConfig::Get()->button_spacing(); } else { - control_button_number = CalculateButtonCount(); + // Use CalculatePreferredSize here to take the launcher nudge label into + // consider. + controls_space += IsHomeButtonShown() + ? GetHomeButton()->CalculatePreferredSize().width() + : 0; + controls_space += + IsBackButtonShown(shelf_->IsHorizontalAlignment()) ? control_size : 0; + controls_space += + (CalculateButtonCount() - 1) * ShelfConfig::Get()->button_spacing(); } - const int control_size = ShelfConfig::Get()->control_size(); - int controls_space = - control_button_number * control_size + - (control_button_number - 1) * ShelfConfig::Get()->button_spacing(); const int major_axis_spacing = 2 * ShelfConfig::Get()->control_button_edge_spacing( shelf_->IsHorizontalAlignment());
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc index b038439d..ab95bc58 100644 --- a/ash/shelf/shelf_view.cc +++ b/ash/shelf/shelf_view.cc
@@ -1505,10 +1505,9 @@ // context menu is requested), to prevent the pending callback from showing // a context menu just after drag starts. if (!context_menu_callback_.IsCancelled()) { - context_menu_callback_.Cancel(); GetShelfAppButton(item_awaiting_response_) ->OnContextMenuModelRequestCanceled(); - item_awaiting_response_ = ShelfID(); + ResetActiveMenuModelRequest(); } // Move the view to the front so that it appears on top of other views. @@ -2141,6 +2140,9 @@ if (old_item.id == context_menu_id_ && shelf_menu_model_adapter_) shelf_menu_model_adapter_->Cancel(); + if (old_item.id == item_awaiting_response_) + ResetActiveMenuModelRequest(); + { base::AutoReset<bool> cancelling_drag(&cancelling_drag_model_changed_, true); @@ -2642,4 +2644,9 @@ } } +void ShelfView::ResetActiveMenuModelRequest() { + context_menu_callback_.Cancel(); + item_awaiting_response_ = ShelfID(); +} + } // namespace ash
diff --git a/ash/shelf/shelf_view.h b/ash/shelf/shelf_view.h index 73d9032..8a5928c 100644 --- a/ash/shelf/shelf_view.h +++ b/ash/shelf/shelf_view.h
@@ -555,6 +555,9 @@ // Removes and reset |current_ghost_view| and |last_ghost_view|. void RemoveGhostView(); + // Resets the data members related to the app item context menu model request. + void ResetActiveMenuModelRequest(); + // The model; owned by Launcher. ShelfModel* const model_;
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc index e8b8879..82e7f18 100644 --- a/ash/shelf/shelf_view_unittest.cc +++ b/ash/shelf/shelf_view_unittest.cc
@@ -3431,6 +3431,48 @@ EXPECT_EQ(views::InkDropState::HIDDEN, GetInkDropStateOfAppIcon1()); } +// Verifies that removing an item that is still waiting for the context menu +// model works as expected. +TEST_F(ShelfViewGestureTapTest, InterruptContextMenuShowByItemRemoval) { + // Add two shelf app buttons. + const ShelfID id1 = AddAppShortcut(); + const ShelfID id2 = AddAppShortcut(); + + auto item_delegate_owned = + std::make_unique<AsyncContextMenuShelfItemDelegate>(); + AsyncContextMenuShelfItemDelegate* item_delegate = item_delegate_owned.get(); + model_->ReplaceShelfItemDelegate(id1, std::move(item_delegate_owned)); + + ShelfAppButton* app_button = GetButtonByID(id1); + GetEventGenerator()->MoveTouch(app_button->GetBoundsInScreen().CenterPoint()); + GetEventGenerator()->PressTouch(); + + // Fast forward to generate the ET_GESTURE_SHOW_PRESS event. + task_environment()->FastForwardBy(base::Milliseconds(200)); + + // Fast forward to generate the ET_GESTURE_LONG_PRESS event to show the + // context menu. + task_environment()->FastForwardBy(base::Milliseconds(1000)); + EXPECT_TRUE(item_delegate->HasPendingContextMenuCallback()); + + // Remove the shelf item indexed by `id` before handling the pending context + // menu model request. + const int index = ShelfModel::Get()->ItemIndexByID(id1); + ShelfModel::Get()->RemoveItemAt(index); + EXPECT_FALSE(shelf_view_->drag_view()); + + // Initialize the mouse drag on the shelf app button specified by `id2`. + ShelfAppButton* app_button2 = GetButtonByID(id2); + GetEventGenerator()->MoveMouseTo( + app_button2->GetBoundsInScreen().CenterPoint()); + GetEventGenerator()->PressLeftButton(); + task_environment()->FastForwardBy(base::Milliseconds(200)); + + // Move the mouse. Verify that the shelf view has a view under drag. + GetEventGenerator()->MoveMouseBy(0, -100); + EXPECT_TRUE(shelf_view_->drag_view()); +} + TEST_F(ShelfViewGestureTapTest, PressEscapeKeyBeforeReleaseLongPressOnAppButton) { const ShelfID id = AddAppShortcut();
diff --git a/ash/shell.cc b/ash/shell.cc index 721a7ad..eb1b57c 100644 --- a/ash/shell.cc +++ b/ash/shell.cc
@@ -119,6 +119,7 @@ #include "ash/system/geolocation/geolocation_controller.h" #include "ash/system/human_presence/human_presence_orientation_controller.h" #include "ash/system/human_presence/snooping_protection_controller.h" +#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" #include "ash/system/keyboard_brightness/keyboard_brightness_controller.h" #include "ash/system/keyboard_brightness_control_delegate.h" #include "ash/system/locale/locale_update_controller_impl.h" @@ -820,6 +821,7 @@ display_configuration_controller_.reset(); // Needs to be destructed before `ime_controler_`. + keyboard_backlight_color_controller_.reset(); rgb_keyboard_manager_.reset(); // These members access Shell in their destructors. @@ -1071,6 +1073,13 @@ wallpaper_controller_ = WallpaperControllerImpl::Create(local_state_); + if (features::IsRgbKeyboardEnabled()) { + // Initialized after |wallpaper_controller_| because we will need to observe + // when the extracted wallpaper color changes. + keyboard_backlight_color_controller_ = + std::make_unique<KeyboardBacklightColorController>(); + } + window_positioner_ = std::make_unique<WindowPositioner>(); native_cursor_manager_ = new NativeCursorManagerAsh;
diff --git a/ash/shell.h b/ash/shell.h index b006363..6b13731 100644 --- a/ash/shell.h +++ b/ash/shell.h
@@ -138,6 +138,7 @@ class ImeControllerImpl; class WebAuthNDialogControllerImpl; class KeyAccessibilityEnabler; +class KeyboardBacklightColorController; class KeyboardBrightnessControlDelegate; class KeyboardControllerImpl; class LaserPointerController; @@ -460,6 +461,9 @@ KeyAccessibilityEnabler* key_accessibility_enabler() { return key_accessibility_enabler_.get(); } + KeyboardBacklightColorController* keyboard_backlight_color_controller() { + return keyboard_backlight_color_controller_.get(); + } KeyboardBrightnessControlDelegate* keyboard_brightness_control_delegate() { return keyboard_brightness_control_delegate_.get(); } @@ -796,6 +800,8 @@ std::unique_ptr<ImeControllerImpl> ime_controller_; std::unique_ptr<chromeos::ImmersiveContext> immersive_context_; std::unique_ptr<WebAuthNDialogControllerImpl> webauthn_dialog_controller_; + std::unique_ptr<KeyboardBacklightColorController> + keyboard_backlight_color_controller_; std::unique_ptr<KeyboardBrightnessControlDelegate> keyboard_brightness_control_delegate_; std::unique_ptr<LocaleUpdateControllerImpl> locale_update_controller_;
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc new file mode 100644 index 0000000..575e1ad --- /dev/null +++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc
@@ -0,0 +1,116 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" + +#include "ash/constants/ash_pref_names.h" +#include "ash/public/cpp/wallpaper/wallpaper_controller.h" +#include "ash/rgb_keyboard/rgb_keyboard_manager.h" +#include "ash/rgb_keyboard/rgb_keyboard_util.h" +#include "ash/session/session_controller_impl.h" +#include "ash/shell.h" +#include "ash/wallpaper/wallpaper_controller_impl.h" +#include "ash/webui/personalization_app/mojom/personalization_app.mojom.h" +#include "base/check_op.h" +#include "components/prefs/pref_registry_simple.h" +#include "components/prefs/pref_service.h" +#include "third_party/skia/include/core/SkColor.h" +#include "ui/gfx/color_analysis.h" + +namespace ash { + +namespace { + +PrefService* GetActivePrefService() { + return Shell::Get()->session_controller()->GetActivePrefService(); +} + +} // namespace + +KeyboardBacklightColorController::KeyboardBacklightColorController() { + wallpaper_controller_observation_.Observe(WallpaperController::Get()); +} + +KeyboardBacklightColorController::~KeyboardBacklightColorController() = default; + +// static +void KeyboardBacklightColorController::RegisterProfilePrefs( + PrefRegistrySimple* registry) { + registry->RegisterIntegerPref( + prefs::kPersonalizationKeyboardBacklightColor, + static_cast<int>(personalization_app::mojom::BacklightColor::kWallpaper)); +} + +void KeyboardBacklightColorController::SetBacklightColor( + personalization_app::mojom::BacklightColor backlight_color) { + auto* rgb_keyboard_manager = Shell::Get()->rgb_keyboard_manager(); + DCHECK(rgb_keyboard_manager); + DVLOG(3) << __func__ << " backlight_color=" << backlight_color; + switch (backlight_color) { + case personalization_app::mojom::BacklightColor::kWallpaper: { + auto* wallpaper_controller = Shell::Get()->wallpaper_controller(); + DCHECK(wallpaper_controller); + SkColor color = wallpaper_controller->GetProminentColor( + color_utils::ColorProfile(color_utils::LumaRange::NORMAL, + color_utils::SaturationRange::VIBRANT)); + rgb_keyboard_manager->SetStaticBackgroundColor( + SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)); + break; + } + case personalization_app::mojom::BacklightColor::kWhite: + case personalization_app::mojom::BacklightColor::kRed: + case personalization_app::mojom::BacklightColor::kYellow: + case personalization_app::mojom::BacklightColor::kGreen: + case personalization_app::mojom::BacklightColor::kBlue: + case personalization_app::mojom::BacklightColor::kIndigo: + case personalization_app::mojom::BacklightColor::kPurple: { + SkColor color = ConvertBacklightColorToSkColor(backlight_color); + rgb_keyboard_manager->SetStaticBackgroundColor( + SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)); + break; + } + case personalization_app::mojom::BacklightColor::kRainbow: + rgb_keyboard_manager->SetRainbowMode(); + break; + } + + GetActivePrefService()->SetInteger( + prefs::kPersonalizationKeyboardBacklightColor, + static_cast<int>(backlight_color)); +} + +personalization_app::mojom::BacklightColor +KeyboardBacklightColorController::GetBacklightColor() { + return static_cast<personalization_app::mojom::BacklightColor>( + GetActivePrefService()->GetInteger( + prefs::kPersonalizationKeyboardBacklightColor)); +} + +void KeyboardBacklightColorController::OnActiveUserSessionChanged( + const AccountId& account_id) { + auto* session_controller = Shell::Get()->session_controller(); + DCHECK(session_controller); + PrefService* pref_service = + session_controller->GetUserPrefServiceForUser(account_id); + DCHECK(pref_service); + auto backlight_color = + static_cast<personalization_app::mojom::BacklightColor>( + pref_service->GetInteger( + prefs::kPersonalizationKeyboardBacklightColor)); + SetBacklightColor(backlight_color); +} + +void KeyboardBacklightColorController::OnWallpaperColorsChanged() { + auto* wallpaper_controller = Shell::Get()->wallpaper_controller(); + DCHECK(wallpaper_controller); + auto backlight_color = + static_cast<personalization_app::mojom::BacklightColor>( + GetActivePrefService()->GetInteger( + prefs::kPersonalizationKeyboardBacklightColor)); + if (backlight_color != personalization_app::mojom::BacklightColor::kWallpaper) + return; + SetBacklightColor(personalization_app::mojom::BacklightColor::kWallpaper); +} + +} // namespace ash
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.h b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.h new file mode 100644 index 0000000..2341f67 --- /dev/null +++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.h
@@ -0,0 +1,57 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SYSTEM_KEYBOARD_BRIGHTNESS_KEYBOARD_BACKLIGHT_COLOR_CONTROLLER_H_ +#define ASH_SYSTEM_KEYBOARD_BRIGHTNESS_KEYBOARD_BACKLIGHT_COLOR_CONTROLLER_H_ + +#include "ash/ash_export.h" +#include "ash/public/cpp/session/session_observer.h" +#include "ash/public/cpp/wallpaper/wallpaper_controller.h" +#include "ash/public/cpp/wallpaper/wallpaper_controller_observer.h" +#include "ash/webui/personalization_app/mojom/personalization_app.mojom-shared.h" +#include "base/scoped_observation.h" + +class PrefRegistrySimple; + +namespace ash { + +// Controller to manage keyboard backlight colors. +class ASH_EXPORT KeyboardBacklightColorController + : public SessionObserver, + public WallpaperControllerObserver { + public: + KeyboardBacklightColorController(); + + KeyboardBacklightColorController(const KeyboardBacklightColorController&) = + delete; + KeyboardBacklightColorController& operator=( + const KeyboardBacklightColorController&) = delete; + + ~KeyboardBacklightColorController() override; + + static void RegisterProfilePrefs(PrefRegistrySimple* registry); + + // Sets the keyboard backlight color. + void SetBacklightColor( + personalization_app::mojom::BacklightColor backlight_color); + + // Returns the currently set backlight color. + personalization_app::mojom::BacklightColor GetBacklightColor(); + + // SessionObserver: + void OnActiveUserSessionChanged(const AccountId& account_id) override; + + // WallpaperControllerObserver: + void OnWallpaperColorsChanged() override; + + private: + ScopedSessionObserver scoped_session_observer_{this}; + + base::ScopedObservation<WallpaperController, WallpaperControllerObserver> + wallpaper_controller_observation_{this}; +}; + +} // namespace ash + +#endif // ASH_SYSTEM_KEYBOARD_BRIGHTNESS_KEYBOARD_BACKLIGHT_COLOR_CONTROLLER_H_
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc new file mode 100644 index 0000000..05cddae0 --- /dev/null +++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc
@@ -0,0 +1,82 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" +#include "ash/session/session_controller_impl.h" +#include "ash/shell.h" +#include "ash/test/ash_test_base.h" +#include "base/test/scoped_feature_list.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash { + +namespace { +constexpr char kUser1[] = "user1@test.com"; +const AccountId account_id_1 = AccountId::FromUserEmailGaiaId(kUser1, kUser1); + +constexpr char kUser2[] = "user2@test.com"; +const AccountId account_id_2 = AccountId::FromUserEmailGaiaId(kUser2, kUser2); +} // namespace + +class KeyboardBacklightColorControllerTest : public AshTestBase { + public: + KeyboardBacklightColorControllerTest() + : scoped_feature_list_(features::kRgbKeyboard) {} + + KeyboardBacklightColorControllerTest( + const KeyboardBacklightColorControllerTest&) = delete; + KeyboardBacklightColorControllerTest& operator=( + const KeyboardBacklightColorControllerTest&) = delete; + + ~KeyboardBacklightColorControllerTest() override = default; + + // testing::Test: + void SetUp() override { + AshTestBase::SetUp(); + + controller_ = Shell::Get()->keyboard_backlight_color_controller(); + } + + protected: + KeyboardBacklightColorController* controller_ = nullptr; + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(KeyboardBacklightColorControllerTest, SetBacklightColorUpdatesPref) { + controller_->SetBacklightColor( + personalization_app::mojom::BacklightColor::kBlue); + + PrefService* prefs_service = + Shell::Get()->session_controller()->GetActivePrefService(); + EXPECT_EQ(personalization_app::mojom::BacklightColor::kBlue, + static_cast<personalization_app::mojom::BacklightColor>( + prefs_service->GetInteger( + prefs::kPersonalizationKeyboardBacklightColor))); +} + +TEST_F(KeyboardBacklightColorControllerTest, SetBacklightColorAfterSignin) { + // Verify the user starts with wallpaper-extracted color. + SimulateUserLogin(account_id_1); + EXPECT_EQ(personalization_app::mojom::BacklightColor::kWallpaper, + controller_->GetBacklightColor()); + controller_->SetBacklightColor( + personalization_app::mojom::BacklightColor::kRainbow); + EXPECT_EQ(personalization_app::mojom::BacklightColor::kRainbow, + controller_->GetBacklightColor()); + + // Simulate login for user2. + SimulateUserLogin(account_id_2); + EXPECT_EQ(personalization_app::mojom::BacklightColor::kWallpaper, + controller_->GetBacklightColor()); + + SimulateUserLogin(account_id_1); + EXPECT_EQ(personalization_app::mojom::BacklightColor::kRainbow, + controller_->GetBacklightColor()); +} + +} // namespace ash
diff --git a/ash/system/message_center/stacked_notification_bar.cc b/ash/system/message_center/stacked_notification_bar.cc index 59329cd..171a0581 100644 --- a/ash/system/message_center/stacked_notification_bar.cc +++ b/ash/system/message_center/stacked_notification_bar.cc
@@ -257,13 +257,14 @@ base::Unretained(message_center_view_)), l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_EXPAND_ALL_NOTIFICATIONS_BUTTON_LABEL), - message_center_view))) { + message_center_view))), + layout_manager_(SetLayoutManager(std::make_unique<views::BoxLayout>( + views::BoxLayout::Orientation::kHorizontal, + features::IsNotificationsRefreshEnabled() ? kNotificationBarPadding + : gfx::Insets()))) { SetVisible(false); - auto* layout = SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, - features::IsNotificationsRefreshEnabled() ? kNotificationBarPadding - : gfx::Insets())); - layout->set_cross_axis_alignment( + + layout_manager_->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kStretch); notification_icons_container_->SetLayoutManager( @@ -283,7 +284,7 @@ count_label_->SetFontList(views::Label::GetDefaultFontList().Derive( 1, gfx::Font::NORMAL, gfx::Font::Weight::MEDIUM)); - layout->SetFlexForView(spacer_, 1); + layout_manager_->SetFlexForView(spacer_, 1); clear_all_button_->SetTooltipText(l10n_util::GetStringUTF16( IDS_ASH_MESSAGE_CENTER_CLEAR_ALL_BUTTON_TOOLTIP)); @@ -340,12 +341,18 @@ } void StackedNotificationBar::SetCollapsed() { + if (features::IsNotificationsRefreshEnabled()) + layout_manager_->set_inside_border_insets(gfx::Insets()); + clear_all_button_->SetVisible(false); expand_all_button_->SetVisible(true); UpdateVisibility(); } void StackedNotificationBar::SetExpanded() { + if (features::IsNotificationsRefreshEnabled()) + layout_manager_->set_inside_border_insets(kNotificationBarPadding); + clear_all_button_->SetVisible(true); expand_all_button_->SetVisible(false); }
diff --git a/ash/system/message_center/stacked_notification_bar.h b/ash/system/message_center/stacked_notification_bar.h index e7f51ab..772d368 100644 --- a/ash/system/message_center/stacked_notification_bar.h +++ b/ash/system/message_center/stacked_notification_bar.h
@@ -15,6 +15,7 @@ } // namespace message_center namespace views { +class BoxLayout; class Label; } // namespace views @@ -108,6 +109,7 @@ views::View* const spacer_; views::Button* const clear_all_button_; views::Button* const expand_all_button_; + views::BoxLayout* const layout_manager_; base::WeakPtrFactory<StackedNotificationBar> weak_ptr_factory_{this}; };
diff --git a/ash/system/message_center/unified_message_center_view.cc b/ash/system/message_center/unified_message_center_view.cc index d527225..3bc230b 100644 --- a/ash/system/message_center/unified_message_center_view.cc +++ b/ash/system/message_center/unified_message_center_view.cc
@@ -515,6 +515,11 @@ return message_list_view_->GetAllNotifications(); } + if (is_notifications_refresh_enabled_) { + const int y_offset = scroller_->GetVisibleRect().bottom() - scroller_->y(); + return message_list_view_->GetNotificationsBelowY(y_offset); + } + const int notification_bar_height = IsNotificationBarVisible() ? kStackedNotificationBarHeight : 0; const int y_offset = scroller_->GetVisibleRect().y() - scroller_->y() +
diff --git a/ash/system/message_center/unified_message_center_view_unittest.cc b/ash/system/message_center/unified_message_center_view_unittest.cc index 241d80b..7ab865ab 100644 --- a/ash/system/message_center/unified_message_center_view_unittest.cc +++ b/ash/system/message_center/unified_message_center_view_unittest.cc
@@ -538,12 +538,8 @@ EXPECT_EQ(GetNotificationBar()->bounds().y(), GetScroller()->bounds().bottom()); } - // With the refresh enabled, we do not scroll the message center to the bottom - // so the label should not be visible. - if (IsNotificationsRefreshEnabled()) - EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); - else - EXPECT_TRUE(GetNotificationBarLabel()->GetVisible()); + + EXPECT_TRUE(GetNotificationBarLabel()->GetVisible()); EXPECT_TRUE(GetNotificationBarClearAllButton()->GetVisible()); } @@ -553,8 +549,13 @@ AddManyNotifications(); CreateMessageCenterView(); - // Scroll to the top, the counter label should be invisible. - GetScroller()->ScrollToPosition(GetScrollBar(), 0); + // Scroll to the top, the counter label should be invisible. After + // NotificationsRefresh, scrolling to the bottom should make the counter + // invisible. + GetScroller()->ScrollToPosition(GetScrollBar(), + features::IsNotificationsRefreshEnabled() + ? GetScrollBar()->bounds().bottom() + : 0); message_center_view()->OnMessageCenterScrolled(); EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); @@ -569,7 +570,9 @@ // Scrolling past 5 notifications should make the counter label visible. const int scroll_amount = (GetMessageViewVisibleBounds(0).height() * 5) + 1; - GetScroller()->ScrollToPosition(GetScrollBar(), scroll_amount); + GetScroller()->ScrollToPosition( + GetScrollBar(), + features::IsNotificationsRefreshEnabled() ? 0 : scroll_amount); message_center_view()->OnMessageCenterScrolled(); EXPECT_TRUE(GetNotificationBarLabel()->GetVisible()); @@ -582,20 +585,32 @@ AddManyNotifications(); CreateMessageCenterView(); - // Scroll to the top, making the counter label invisible. - GetScroller()->ScrollToPosition(GetScrollBar(), 0); + // Scroll to the top, making the counter label invisible. In + // NotificationsRefresh we must scroll to the bottom instead. + auto bottom_position = GetScrollBar()->bounds().bottom(); + GetScroller()->ScrollToPosition( + GetScrollBar(), + features::IsNotificationsRefreshEnabled() ? bottom_position : 0); message_center_view()->OnMessageCenterScrolled(); + EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); + // Scrolling past 5 notifications should make the counter label visible. const int scroll_amount = (GetMessageViewVisibleBounds(0).height() * 5) + 1; - GetScroller()->ScrollToPosition(GetScrollBar(), scroll_amount); + GetScroller()->ScrollToPosition(GetScrollBar(), + features::IsNotificationsRefreshEnabled() + ? bottom_position - scroll_amount + : scroll_amount); message_center_view()->OnMessageCenterScrolled(); ASSERT_TRUE(GetNotificationBarLabel()->GetVisible()); - // Scrolling back to the top should make the + // Scrolling back to the top (bottom in NotificationsRefresh) should make the // counter label invisible again. - GetScroller()->ScrollToPosition(GetScrollBar(), 0); + GetScroller()->ScrollToPosition(GetScrollBar(), + features::IsNotificationsRefreshEnabled() + ? GetScrollBar()->bounds().bottom() + : 0); message_center_view()->OnMessageCenterScrolled(); EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); @@ -613,13 +628,22 @@ AddNotification(false); CreateMessageCenterView(); + auto bottom_position = GetScrollBar()->bounds().bottom(); + if (features::IsNotificationsRefreshEnabled()) { + GetScroller()->ScrollToPosition(GetScrollBar(), bottom_position); + message_center_view()->OnMessageCenterScrolled(); + } + // Force animations to happen, so we can see if multiple animations trigger. ui::ScopedAnimationDurationScaleMode scoped_duration_modifier( ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); // Scroll past 20 notifications, so we can scroll back up quickly. for (int i = 20; i >= 0; --i) { const int scroll_amount = (GetMessageViewVisibleBounds(0).height() * i) + 1; - GetScroller()->ScrollToPosition(GetScrollBar(), scroll_amount); + GetScroller()->ScrollToPosition(GetScrollBar(), + features::IsNotificationsRefreshEnabled() + ? bottom_position - scroll_amount + : scroll_amount); message_center_view()->OnMessageCenterScrolled(); auto icons_container_children = @@ -693,16 +717,29 @@ // Open the message center at the top of the notification list so the stacking // bar is hidden by default. std::string id = AddNotification(false /* pinned */); - for (size_t i = 0; i < 30; ++i) + int total_notifications = 30; + for (int i = 0; i < total_notifications; ++i) AddNotification(false /* pinned */); model()->SetTargetNotification(id); CreateMessageCenterView(); + + auto bottom_position = + GetMessageViewVisibleBounds(total_notifications - 1).bottom(); + + if (features::IsNotificationsRefreshEnabled()) { + GetScroller()->ScrollToPosition(GetScrollBar(), bottom_position); + message_center_view()->OnMessageCenterScrolled(); + } + EXPECT_FALSE(GetNotificationBarLabel()->GetVisible()); - // Scroll past 5 notifications so the count label becomes visible - int scroll_amount = (GetMessageViewVisibleBounds(0).height() * 5) + 1; - GetScroller()->ScrollToPosition(GetScrollBar(), scroll_amount); + // Scroll past 6 notifications so the count label becomes visible + int scroll_amount = (GetMessageViewVisibleBounds(0).height() * 6) + 1; + GetScroller()->ScrollToPosition(GetScrollBar(), + features::IsNotificationsRefreshEnabled() + ? bottom_position - scroll_amount + : scroll_amount); message_center_view()->OnMessageCenterScrolled(); RelayoutMessageCenterViewForTest(); EXPECT_TRUE(GetNotificationBarLabel()->GetVisible()); @@ -712,7 +749,10 @@ // Scroll past 14 notifications so the label width must be expanded to // contain longer 2-digit label. scroll_amount = (GetMessageViewVisibleBounds(0).height() * 14) + 1; - GetScroller()->ScrollToPosition(GetScrollBar(), scroll_amount); + GetScroller()->ScrollToPosition(GetScrollBar(), + features::IsNotificationsRefreshEnabled() + ? bottom_position - scroll_amount + : scroll_amount); message_center_view()->OnMessageCenterScrolled(); RelayoutMessageCenterViewForTest(); EXPECT_GT(GetNotificationBarLabel()->bounds().width(), label_width);
diff --git a/ash/system/message_center/unified_message_list_view.cc b/ash/system/message_center/unified_message_list_view.cc index f535d62e..572288a3 100644 --- a/ash/system/message_center/unified_message_list_view.cc +++ b/ash/system/message_center/unified_message_list_view.cc
@@ -514,6 +514,22 @@ return notifications; } +std::vector<message_center::Notification*> +UnifiedMessageListView::GetNotificationsBelowY(int y_offset) const { + std::vector<message_center::Notification*> notifications; + for (views::View* view : children()) { + const int bottom_limit = + view->bounds().y() + kNotificationIconStackThreshold; + if (bottom_limit >= y_offset) { + auto* notification = MessageCenter::Get()->FindVisibleNotificationById( + AsMVC(view)->GetNotificationId()); + if (notification) + notifications.push_back(notification); + } + } + return notifications; +} + std::vector<std::string> UnifiedMessageListView::GetNotificationIdsAboveY( int y_offset) const { std::vector<std::string> notifications;
diff --git a/ash/system/message_center/unified_message_list_view.h b/ash/system/message_center/unified_message_list_view.h index 44ce829..15989d38 100644 --- a/ash/system/message_center/unified_message_list_view.h +++ b/ash/system/message_center/unified_message_list_view.h
@@ -83,6 +83,12 @@ std::vector<message_center::Notification*> GetNotificationsAboveY( int y_offset) const; + // Returns the notifications in the view hierarchy that are also in the + // MessageCenter, whose bottom position is below |y_offset|. O(n) where n is + // number of notifications. + std::vector<message_center::Notification*> GetNotificationsBelowY( + int y_offset) const; + // Same as GetNotificationsAboveY, but returns notifications that are not in // the MessageCenter. This is useful for the clear all animation which first // removes all notifications before asking for stacked notifications.
diff --git a/ash/system/palette/palette_welcome_bubble.cc b/ash/system/palette/palette_welcome_bubble.cc index f8a96d9..bc7e558 100644 --- a/ash/system/palette/palette_welcome_bubble.cc +++ b/ash/system/palette/palette_welcome_bubble.cc
@@ -17,6 +17,8 @@ #include "components/prefs/pref_service.h" #include "ui/aura/window.h" #include "ui/base/l10n/l10n_util.h" +#include "ui/base/metadata/metadata_header_macros.h" +#include "ui/base/metadata/metadata_impl_macros.h" #include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/views/controls/label.h" #include "ui/views/layout/fill_layout.h" @@ -34,6 +36,7 @@ class PaletteWelcomeBubble::WelcomeBubbleView : public views::BubbleDialogDelegateView { public: + METADATA_HEADER(WelcomeBubbleView); WelcomeBubbleView(views::View* anchor, views::BubbleBorder::Arrow arrow) : views::BubbleDialogDelegateView(anchor, arrow) { SetTitle( @@ -56,30 +59,32 @@ ~WelcomeBubbleView() override = default; void Init() override { - SetLayoutManager(std::make_unique<views::FillLayout>()); - auto* label = new views::Label(l10n_util::GetStringUTF16( - assistant::util::IsGoogleDevice() - ? IDS_ASH_STYLUS_WARM_WELCOME_BUBBLE_WITH_ASSISTANT_DESCRIPTION - : IDS_ASH_STYLUS_WARM_WELCOME_BUBBLE_DESCRIPTION)); - label->SetHorizontalAlignment(gfx::ALIGN_LEFT); - label->SetMultiLine(true); - label->SizeToFit(kBubbleContentLabelPreferredWidthDp); - AddChildView(label); + SetUseDefaultFillLayout(true); + views::Builder<views::BubbleDialogDelegateView>(this) + .AddChild( + views::Builder<views::Label>() + .SetText(l10n_util::GetStringUTF16( + assistant::util::IsGoogleDevice() + ? IDS_ASH_STYLUS_WARM_WELCOME_BUBBLE_WITH_ASSISTANT_DESCRIPTION + : IDS_ASH_STYLUS_WARM_WELCOME_BUBBLE_DESCRIPTION)) + .SetHorizontalAlignment(gfx::ALIGN_LEFT) + .SetMultiLine(true) + .SizeToFit(kBubbleContentLabelPreferredWidthDp)) + .BuildChildren(); } - - // views::View: - const char* GetClassName() const override { return "WelcomeBubbleView"; } }; +BEGIN_METADATA(PaletteWelcomeBubble, + WelcomeBubbleView, + views::BubbleDialogDelegateView) +END_METADATA + PaletteWelcomeBubble::PaletteWelcomeBubble(PaletteTray* tray) : tray_(tray) { Shell::Get()->session_controller()->AddObserver(this); } PaletteWelcomeBubble::~PaletteWelcomeBubble() { - if (bubble_view_) { - bubble_view_->GetWidget()->RemoveObserver(this); - Shell::Get()->RemovePreTargetHandler(this); - } + DisconnectObservers(); Shell::Get()->session_controller()->RemoveObserver(this); CHECK(!views::WidgetObserver::IsInObserverList()); } @@ -89,10 +94,9 @@ registry->RegisterBooleanPref(prefs::kShownPaletteWelcomeBubble, false); } -void PaletteWelcomeBubble::OnWidgetClosing(views::Widget* widget) { - widget->RemoveObserver(this); - bubble_view_ = nullptr; - Shell::Get()->RemovePreTargetHandler(this); +void PaletteWelcomeBubble::OnWidgetDestroying(views::Widget* widget) { + DCHECK(bubble_view_ && bubble_view_->GetWidget() == widget); + DisconnectObservers(); } void PaletteWelcomeBubble::OnActiveUserPrefServiceChanged( @@ -148,8 +152,18 @@ } void PaletteWelcomeBubble::Hide() { - if (bubble_view_) + if (bubble_view_) { bubble_view_->GetWidget()->Close(); + DisconnectObservers(); + } +} + +void PaletteWelcomeBubble::DisconnectObservers() { + if (bubble_view_) { + bubble_view_->GetWidget()->RemoveObserver(this); + bubble_view_ = nullptr; + } + Shell::Get()->RemovePreTargetHandler(this); } void PaletteWelcomeBubble::OnMouseEvent(ui::MouseEvent* event) {
diff --git a/ash/system/palette/palette_welcome_bubble.h b/ash/system/palette/palette_welcome_bubble.h index 41d878d..c5e0a0ba 100644 --- a/ash/system/palette/palette_welcome_bubble.h +++ b/ash/system/palette/palette_welcome_bubble.h
@@ -51,7 +51,7 @@ void OnActiveUserPrefServiceChanged(PrefService* pref_service) override; // views::WidgetObserver: - void OnWidgetClosing(views::Widget* widget) override; + void OnWidgetDestroying(views::Widget* widget) override; // Returns the bubble view for tests, or null when the bubble is not showing. views::View* GetBubbleViewForTesting(); @@ -64,6 +64,9 @@ void Show(); void Hide(); + // Disconnects from the observers and pre-target handlers. + void DisconnectObservers(); + // ui::EventHandler: void OnMouseEvent(ui::MouseEvent* event) override; void OnTouchEvent(ui::TouchEvent* event) override;
diff --git a/ash/system/palette/palette_welcome_bubble_unittest.cc b/ash/system/palette/palette_welcome_bubble_unittest.cc index d806a7a5..f8b7d5b 100644 --- a/ash/system/palette/palette_welcome_bubble_unittest.cc +++ b/ash/system/palette/palette_welcome_bubble_unittest.cc
@@ -112,7 +112,12 @@ ASSERT_FALSE(bounds.Contains(gfx::Point())); GetEventGenerator()->set_current_screen_location(gfx::Point()); GetEventGenerator()->ClickLeftButton(); - EXPECT_FALSE(welcome_bubble_->GetBubbleViewForTesting()); + // The Widget (and thus the contained views) is closed asynchronously. This + // check ensures either the BubbleView doesn't exist or that the Widget has + // been closed. + EXPECT_TRUE( + !welcome_bubble_->GetBubbleViewForTesting() || + welcome_bubble_->GetBubbleViewForTesting()->GetWidget()->IsClosed()); } // Verify that a second user sees the bubble even after a first user has seen it
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc b/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc index 8983286b..f525c5cb 100644 --- a/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc +++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider.cc
@@ -36,6 +36,11 @@ std::move(callback).Run(std::move(feedback_context)); } +void FeedbackServiceProvider::GetScreenshotPng( + GetScreenshotPngCallback callback) { + feedback_delegate_->GetScreenshotPng(std::move(callback)); +} + void FeedbackServiceProvider::SendReport(ReportPtr report, SendReportCallback callback) { feedback_delegate_->SendReport(std::move(report), std::move(callback));
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h index cdb9228..c025bd89 100644 --- a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h +++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
@@ -29,6 +29,7 @@ // os_feedback_ui::mojom::FeedbackServiceProvider: void GetFeedbackContext(GetFeedbackContextCallback callback) override; + void GetScreenshotPng(GetScreenshotPngCallback callback) override; void SendReport(os_feedback_ui::mojom::ReportPtr report, SendReportCallback callback) override;
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc b/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc index b6c15d75..df857f1 100644 --- a/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc +++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider_unittest.cc
@@ -23,6 +23,7 @@ constexpr char kPageUrl[] = "https://www.google.com/"; constexpr char kSignedInUserEmail[] = "test_user_email@test.com"; +const std::vector<uint8_t> kFakePngData = {42, 22, 26, 13, 7, 16, 8, 2}; } // namespace @@ -48,6 +49,10 @@ return kSignedInUserEmail; } + void GetScreenshotPng(GetScreenshotPngCallback callback) override { + std::move(callback).Run(kFakePngData); + } + void SendReport(os_feedback_ui::mojom::ReportPtr report, SendReportCallback callback) override { std::move(callback).Run(SendReportStatus::kSuccess); @@ -75,6 +80,15 @@ return out_feedback_context; } + // Call the GetScreenshotPng of the remote provider async and return the + // response. + std::vector<uint8_t> GetScreenshotPngAndWait() { + std::vector<uint8_t> out_png_data; + FeedbackServiceProviderAsyncWaiter(provider_remote_.get()) + .GetScreenshotPng(&out_png_data); + return out_png_data; + } + // Call the SendReport of the remote provider async and return the // response. SendReportStatus SendReportAndWait(ReportPtr report) { @@ -99,6 +113,12 @@ EXPECT_EQ(kPageUrl, feedback_context->page_url.value().spec()); } +// Test that GetScreenshotPng returns a response with correct status. +TEST_F(FeedbackServiceProviderTest, GetScreenshotPng) { + auto png_data = GetScreenshotPngAndWait(); + EXPECT_EQ(kFakePngData, png_data); +} + // Test that SendReport returns a response with correct status. TEST_F(FeedbackServiceProviderTest, SendReportSuccess) { ReportPtr report = Report::New();
diff --git a/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h b/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h index b39fc8a..8bf5e0c7 100644 --- a/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h +++ b/ash/webui/os_feedback_ui/backend/os_feedback_delegate.h
@@ -14,6 +14,8 @@ namespace ash { +using GetScreenshotPngCallback = + base::OnceCallback<void(const std::vector<uint8_t>&)>; using SendReportCallback = base::OnceCallback<void(os_feedback_ui::mojom::SendReportStatus)>; @@ -31,6 +33,9 @@ // Returns the normalized email address of the signed-in user associated with // the browser context, if any. virtual absl::optional<std::string> GetSignedInUserEmail() const = 0; + // Return the screenshot of the primary display in PNG format. It was taken + // right before the feedback tool is launched. + virtual void GetScreenshotPng(GetScreenshotPngCallback callback) = 0; // Collect data and send the report to Google. virtual void SendReport(os_feedback_ui::mojom::ReportPtr report, SendReportCallback callback) = 0;
diff --git a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom index 3a70fc224..40c887d1 100644 --- a/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom +++ b/ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom
@@ -97,6 +97,9 @@ mojo_base.mojom.String16 description; // Whether or not to send system logs and metrics/histograms with this report. bool include_system_logs_and_histograms; + // Whether or not to include the screenshot with this report. The screenshot + // data should have been cached in C++ side. + bool include_screenshot; }; // Provides services needed by the feedback UI to display data and send reports. @@ -106,6 +109,9 @@ // Returns the feedback context info, e.g., the email of the currently active // or logged in user, the URL of the active page, etc. GetFeedbackContext() => (FeedbackContext feedback_context); + // Returns the screenshot of the primary display in PNG format taken before + // the feedback tool is launched. + GetScreenshotPng() => (array<uint8> png_data); // Sends a feedback report and returns its status. SendReport(Report report) => (SendReportStatus status); };
diff --git a/ash/webui/os_feedback_ui/resources/fake_data.js b/ash/webui/os_feedback_ui/resources/fake_data.js index dbfc31c..7e37881 100644 --- a/ash/webui/os_feedback_ui/resources/fake_data.js +++ b/ash/webui/os_feedback_ui/resources/fake_data.js
@@ -78,3 +78,13 @@ email: '', pageUrl: {url: ''}, }; + +/** @type {!Array<number>} */ +export const fakePngData = [ + 137, 80, 78, 71, 13, 10, 26, 10, 0, 0, 0, 13, 73, 72, 68, 82, + 0, 0, 0, 8, 0, 0, 0, 8, 8, 2, 0, 0, 0, 75, 109, 41, + 220, 0, 0, 0, 34, 73, 68, 65, 84, 8, 215, 99, 120, 173, 168, 135, + 21, 49, 0, 241, 255, 15, 90, 104, 8, 33, 129, 83, 7, 97, 163, 136, + 214, 129, 93, 2, 43, 2, 0, 181, 31, 90, 179, 225, 252, 176, 37, 0, + 0, 0, 0, 73, 69, 78, 68, 174, 66, 96, 130 +];
diff --git a/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js b/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js index 024300ba..37adf1d 100644 --- a/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js +++ b/ash/webui/os_feedback_ui/resources/fake_feedback_service_provider.js
@@ -18,9 +18,12 @@ // Setup method resolvers. this.methods_.register('getFeedbackContext'); + this.methods_.register('getScreenshotPng'); this.methods_.register('sendReport'); // Let sendReport return success by default. this.methods_.setResult('sendReport', {status: SendReportStatus.kSuccess}); + // Let getScreenshotPng return an empty array by default. + this.methods_.setResult('getScreenshotPng', {pngData: []}); /** * Used to track how many times each method is being called. @@ -30,6 +33,8 @@ /** @type {number} */ getFeedbackContext: 0, /** @type {number} */ + getScreenshotPng: 0, + /** @type {number} */ sendReport: 0, }; } @@ -70,6 +75,23 @@ } /** + * @return {number} + */ + getScreenshotPngCallCount() { + return this.callCounts_.getScreenshotPng; + } + + /** + * @return {!Promise<{ + * pngData: !Array<!number>, + * }>} + */ + getScreenshotPng() { + this.callCounts_.getScreenshotPng++; + return this.methods_.resolveMethod('getScreenshotPng'); + } + + /** * Sets the value that will be returned when calling getFeedbackContext(). * @param {!FeedbackContext} feedbackContext */ @@ -77,6 +99,7 @@ this.methods_.setResult( 'getFeedbackContext', {feedbackContext: feedbackContext}); } + /** * Sets the value that will be returned when calling sendReport(). * @param {!SendReportStatus} status @@ -84,4 +107,12 @@ setFakeSendFeedbackStatus(status) { this.methods_.setResult('sendReport', {status: status}); } + + /** + * Sets the value that will be returned when calling getScreenshotPng(). + * @param {!Array<!number>} data + */ + setFakeScreenshotPng(data) { + this.methods_.setResult('getScreenshotPng', {pngData: data}); + } }
diff --git a/ash/webui/os_feedback_ui/resources/feedback_flow.js b/ash/webui/os_feedback_ui/resources/feedback_flow.js index 6a61f94..705da101 100644 --- a/ash/webui/os_feedback_ui/resources/feedback_flow.js +++ b/ash/webui/os_feedback_ui/resources/feedback_flow.js
@@ -81,6 +81,24 @@ } /** + * @private + */ + fetchScreenshot_() { + const shareDataPage = this.shadowRoot.querySelector('share-data-page'); + // Fetch screenshot if not fetched before. + if (!shareDataPage.screenshotUrl) { + this.feedbackServiceProvider_.getScreenshotPng().then((response) => { + if (response.pngData.length > 0) { + const blob = new Blob( + [Uint8Array.from(response.pngData)], {type: 'image/png'}); + const imageUrl = URL.createObjectURL(blob); + shareDataPage.screenshotUrl = imageUrl; + } + }); + } + } + + /** * @param {!Event} event * @protected */ @@ -89,9 +107,7 @@ case FeedbackFlowState.SEARCH: this.currentState_ = FeedbackFlowState.SHARE_DATA; this.description_ = event.detail.description; - // TODO(xiangdongkong): Fetch a real screenshot. - this.shadowRoot.querySelector('share-data-page').screenshotUrl = - './app_icon_192.png'; + this.fetchScreenshot_(); break; case FeedbackFlowState.SHARE_DATA: /** @type {!Report} */
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js index 4294bdc..45b735b 100644 --- a/ash/webui/os_feedback_ui/resources/share_data_page.js +++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -94,9 +94,19 @@ } /** + * @param {string} selector + * @return {Element} + * @private + */ + getElement_(selector) { + return this.shadowRoot.querySelector(selector); + } + + /** * @return {!{ * feedbackContext: FeedbackContext, * includeSystemLogsAndHistograms: boolean, + * includeScreenshot: boolean, * }} * @private */ @@ -104,17 +114,19 @@ const report = { feedbackContext: {}, includeSystemLogsAndHistograms: - this.shadowRoot.querySelector('#sysInfoCheckbox').checked + this.getElement_('#sysInfoCheckbox').checked, + includeScreenshot: this.getElement_('#screenshotCheckbox').checked && + !!this.getElement_('#screenshotImage').src }; - const email = this.shadowRoot.querySelector('#userEmailDropDown').value; + const email = this.getElement_('#userEmailDropDown').value; if (email) { report.feedbackContext.email = email; } - if (this.shadowRoot.querySelector('#pageUrlCheckbox').checked) { + if (this.getElement_('#pageUrlCheckbox').checked) { report.feedbackContext.pageUrl = { - url: this.shadowRoot.querySelector('#pageUrlText').value + url: this.getElement_('#pageUrlText').value }; } return report;
diff --git a/ash/webui/personalization_app/resources/trusted/ambient/ambient_observer.ts b/ash/webui/personalization_app/resources/trusted/ambient/ambient_observer.ts index 1ae5943..1d97bbb 100644 --- a/ash/webui/personalization_app/resources/trusted/ambient/ambient_observer.ts +++ b/ash/webui/personalization_app/resources/trusted/ambient/ambient_observer.ts
@@ -30,7 +30,8 @@ } } - receiver_: AmbientObserverReceiver = this.initReceiver_(getAmbientProvider()); + private receiver_: AmbientObserverReceiver = + this.initReceiver_(getAmbientProvider()); private initReceiver_(ambientProvider: AmbientProviderInterface): AmbientObserverReceiver {
diff --git a/ash/webui/personalization_app/resources/trusted/keyboard_backlight/keyboard_backlight_observer.ts b/ash/webui/personalization_app/resources/trusted/keyboard_backlight/keyboard_backlight_observer.ts index e5e3ca4..d425d850 100644 --- a/ash/webui/personalization_app/resources/trusted/keyboard_backlight/keyboard_backlight_observer.ts +++ b/ash/webui/personalization_app/resources/trusted/keyboard_backlight/keyboard_backlight_observer.ts
@@ -31,14 +31,14 @@ } } - receiver_: KeyboardBacklightObserverReceiver = + private receiver_: KeyboardBacklightObserverReceiver = this.initReceiver_(getKeyboardBacklightProvider()); - private initReceiver_(KeyboardBacklightProvider: + private initReceiver_(keyboardBacklightProvider: KeyboardBacklightProviderInterface): KeyboardBacklightObserverReceiver { const receiver = new KeyboardBacklightObserverReceiver(this); - KeyboardBacklightProvider.setKeyboardBacklightObserver( + keyboardBacklightProvider.setKeyboardBacklightObserver( receiver.$.bindNewPipeAndPassRemote()); return receiver; }
diff --git a/ash/webui/personalization_app/resources/trusted/personalization_metrics_logger.ts b/ash/webui/personalization_app/resources/trusted/personalization_metrics_logger.ts index c8efad2..6c6e6e7 100644 --- a/ash/webui/personalization_app/resources/trusted/personalization_metrics_logger.ts +++ b/ash/webui/personalization_app/resources/trusted/personalization_metrics_logger.ts
@@ -25,7 +25,7 @@ const PersonalizationAmbientModeOptInHistogramName: string = 'Ash.Personalization.AmbientMode.OptIn'; -function ToMetricsEnum(path: Paths) { +function toMetricsEnum(path: Paths) { switch (path) { case Paths.AMBIENT: return MetricsPath.AMBIENT; @@ -47,7 +47,7 @@ } export function logPersonalizationPathUMA(path: Paths) { - const metricsPath = ToMetricsEnum(path); + const metricsPath = toMetricsEnum(path); assert(metricsPath <= MetricsPath.MAX_VALUE); chrome.metricsPrivate.recordEnumerationValue( PersonalizationPathHistogramName, metricsPath, MetricsPath.MAX_VALUE + 1);
diff --git a/ash/webui/personalization_app/resources/trusted/theme/theme_observer.ts b/ash/webui/personalization_app/resources/trusted/theme/theme_observer.ts index 4a09cc6..c94fc03 100644 --- a/ash/webui/personalization_app/resources/trusted/theme/theme_observer.ts +++ b/ash/webui/personalization_app/resources/trusted/theme/theme_observer.ts
@@ -28,7 +28,8 @@ } } - receiver_: ThemeObserverReceiver = this.initReceiver_(getThemeProvider()); + private receiver_: ThemeObserverReceiver = + this.initReceiver_(getThemeProvider()); private initReceiver_(themeProvider: ThemeProviderInterface): ThemeObserverReceiver {
diff --git a/ash/webui/personalization_app/resources/trusted/user/user_image_observer.ts b/ash/webui/personalization_app/resources/trusted/user/user_image_observer.ts index e0abd58..8a4f621ec 100644 --- a/ash/webui/personalization_app/resources/trusted/user/user_image_observer.ts +++ b/ash/webui/personalization_app/resources/trusted/user/user_image_observer.ts
@@ -31,7 +31,8 @@ } } - receiver_: UserImageObserverReceiver = this.initReceiver_(getUserProvider()); + private receiver_: UserImageObserverReceiver = + this.initReceiver_(getUserProvider()); private initReceiver_(userProvider: UserProviderInterface): UserImageObserverReceiver {
diff --git a/ash/webui/personalization_app/resources/trusted/user/user_subpage_element.html b/ash/webui/personalization_app/resources/trusted/user/user_subpage_element.html index 54087c3..359cdd0 100644 --- a/ash/webui/personalization_app/resources/trusted/user/user_subpage_element.html +++ b/ash/webui/personalization_app/resources/trusted/user/user_subpage_element.html
@@ -17,6 +17,7 @@ } user-preview + avatar-list { border-top: 1px solid var(--cros-separator-color); + padding-top: 8px; } </style> <div id="container">
diff --git a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_observer.ts b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_observer.ts index 6f3f4fd3..9669375 100644 --- a/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_observer.ts +++ b/ash/webui/personalization_app/resources/trusted/wallpaper/wallpaper_observer.ts
@@ -42,7 +42,7 @@ } } - receiver_: WallpaperObserverReceiver = + private receiver_: WallpaperObserverReceiver = initWallpaperObserver(getWallpaperProvider(), this); onWallpaperChanged(currentWallpaper: CurrentWallpaper) {
diff --git a/ash/webui/projector_app/resources/assets/icon_128.png b/ash/webui/projector_app/resources/assets/icon_128.png index e6ee338..3014556c 100644 --- a/ash/webui/projector_app/resources/assets/icon_128.png +++ b/ash/webui/projector_app/resources/assets/icon_128.png Binary files differ
diff --git a/ash/webui/projector_app/resources/assets/icon_16.png b/ash/webui/projector_app/resources/assets/icon_16.png index 310f824..ba60119 100644 --- a/ash/webui/projector_app/resources/assets/icon_16.png +++ b/ash/webui/projector_app/resources/assets/icon_16.png Binary files differ
diff --git a/ash/webui/projector_app/resources/assets/icon_192.png b/ash/webui/projector_app/resources/assets/icon_192.png index f5ffba5..8e998e4 100644 --- a/ash/webui/projector_app/resources/assets/icon_192.png +++ b/ash/webui/projector_app/resources/assets/icon_192.png Binary files differ
diff --git a/ash/webui/projector_app/resources/assets/icon_256.png b/ash/webui/projector_app/resources/assets/icon_256.png index e0e9a30..73e8e8b 100644 --- a/ash/webui/projector_app/resources/assets/icon_256.png +++ b/ash/webui/projector_app/resources/assets/icon_256.png Binary files differ
diff --git a/ash/webui/projector_app/resources/assets/icon_32.png b/ash/webui/projector_app/resources/assets/icon_32.png index 39a1f422..5f20a90 100644 --- a/ash/webui/projector_app/resources/assets/icon_32.png +++ b/ash/webui/projector_app/resources/assets/icon_32.png Binary files differ
diff --git a/ash/webui/projector_app/resources/assets/icon_48.png b/ash/webui/projector_app/resources/assets/icon_48.png index b3e0cf58..a53758a8 100644 --- a/ash/webui/projector_app/resources/assets/icon_48.png +++ b/ash/webui/projector_app/resources/assets/icon_48.png Binary files differ
diff --git a/ash/webui/projector_app/resources/assets/icon_64.png b/ash/webui/projector_app/resources/assets/icon_64.png index 2a2492f..edbc85f 100644 --- a/ash/webui/projector_app/resources/assets/icon_64.png +++ b/ash/webui/projector_app/resources/assets/icon_64.png Binary files differ
diff --git a/ash/webui/projector_app/resources/assets/icon_96.png b/ash/webui/projector_app/resources/assets/icon_96.png index cbe5758..3e3aaf3 100644 --- a/ash/webui/projector_app/resources/assets/icon_96.png +++ b/ash/webui/projector_app/resources/assets/icon_96.png Binary files differ
diff --git a/ash/webui/shimless_rma/resources/onboarding_network_page.html b/ash/webui/shimless_rma/resources/onboarding_network_page.html index 2fa83b6..da102003 100644 --- a/ash/webui/shimless_rma/resources/onboarding_network_page.html +++ b/ash/webui/shimless_rma/resources/onboarding_network_page.html
@@ -26,6 +26,7 @@ disabled="[[allButtonsDisabled]]"> </network-list> </div> + <div class="gradient unequal-panes"></div> </div> </base-page>
diff --git a/ash/webui/shimless_rma/resources/onboarding_select_components_page.html b/ash/webui/shimless_rma/resources/onboarding_select_components_page.html index 3e75e614..54cbe263 100644 --- a/ash/webui/shimless_rma/resources/onboarding_select_components_page.html +++ b/ash/webui/shimless_rma/resources/onboarding_select_components_page.html
@@ -25,6 +25,7 @@ </repair-component-chip> </template> </div> + <div class="gradient unequal-panes"></div> </div> </div> </base-page>
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html index 451515a..8ee4d34 100644 --- a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html +++ b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.html
@@ -21,6 +21,7 @@ </calibration-component-chip> </template> </div> + <div class="gradient equal-panes"></div> </div> </div> </base-page>
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js index 8ccc29e..992a60a8 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma.js +++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -461,6 +461,11 @@ this.style.setProperty( '--container-horizontal-padding', `${containerHorizontalPadding}px`); + const contentContainerWidth = + screenWidth - (containerHorizontalPadding * 2); + this.style.setProperty( + '--content-container-width', `${contentContainerWidth}px`); + const screenHeight = window.innerHeight; const containerVerticalPadding = screenHeight * .06; this.style.setProperty(
diff --git a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html index cfbaeb96..22c63fb7 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html +++ b/ash/webui/shimless_rma/resources/shimless_rma_shared_css.html
@@ -4,6 +4,7 @@ --cr-dialog-width: 320px; --cr-dialog-button-container-padding-horizontal: 24px; --content-container-padding: 40px; + --margin-between-panes: 80px; --radio-button-top-padding: 20px; --title-bottom-margin: 16px; } @@ -156,6 +157,26 @@ border-radius: 15px; } + .gradient { + background-image: linear-gradient(to bottom, + rgba(255,255,255,0), rgba(255,255,255,1)); + bottom: calc(var(--header-footer-height) + var(--content-container-padding)); + height: 40px; + position: fixed; + } + + .gradient.equal-panes { + width: calc(.5 * (var(--content-container-width) + - var(--content-container-padding) * 2 + - var(--margin-between-panes))); + } + + .gradient.unequal-panes { + width: calc(.6 * (var(--content-container-width) + - var(--content-container-padding) * 2 + - var(--margin-between-panes))); + } + .illustration-wrapper { align-items: center; display: flex;
diff --git a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js index a4eb9f51..e1cede3 100644 --- a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
@@ -186,6 +186,9 @@ /** @protected */ onPowerwashButtonClick_(e) { e.preventDefault(); + const dialog = /** @type {!CrDialogElement} */ ( + this.shadowRoot.querySelector('#powerwashDialog')); + dialog.close(); this.shutDownOrReboot_(); }
diff --git a/ash/webui/shimless_rma/resources/wrapup_restock_page.js b/ash/webui/shimless_rma/resources/wrapup_restock_page.js index d04fb0c7..b6f4e8dd 100644 --- a/ash/webui/shimless_rma/resources/wrapup_restock_page.js +++ b/ash/webui/shimless_rma/resources/wrapup_restock_page.js
@@ -81,6 +81,9 @@ /** @protected */ onPowerwashButtonClick_(e) { e.preventDefault(); + const dialog = /** @type {!CrDialogElement} */ ( + this.shadowRoot.querySelector('#powerwashDialog')); + dialog.close(); executeThenTransitionState( this, () => this.shimlessRmaService_.shutdownForRestock()); }
diff --git a/ash/wm/desks/templates/saved_desk_item_view.cc b/ash/wm/desks/templates/saved_desk_item_view.cc index 6669429..9bcea5d 100644 --- a/ash/wm/desks/templates/saved_desk_item_view.cc +++ b/ash/wm/desks/templates/saved_desk_item_view.cc
@@ -203,11 +203,15 @@ SetPaintToLayer(); layer()->SetFillsBoundsOpaquely(false); + const int button_text_id = + desk_template_->type() == DeskTemplateType::kTemplate + ? IDS_ASH_DESKS_TEMPLATES_USE_TEMPLATE_BUTTON + : IDS_ASH_DESKS_TEMPLATES_OPEN_DESK_BUTTON; launch_button_ = hover_container_->AddChildView(std::make_unique<PillButton>( base::BindRepeating(&SavedDeskItemView::OnGridItemPressed, weak_ptr_factory_.GetWeakPtr()), - l10n_util::GetStringUTF16(IDS_ASH_DESKS_TEMPLATES_USE_TEMPLATE_BUTTON), - PillButton::Type::kIconless, /*icon=*/nullptr)); + l10n_util::GetStringUTF16(button_text_id), PillButton::Type::kIconless, + /*icon=*/nullptr)); // Users cannot delete admin templates. if (!is_admin_managed) {
diff --git a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc index e59464c79..b6178e8 100644 --- a/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc +++ b/base/allocator/allocator_shim_default_dispatch_to_partition_alloc.cc
@@ -251,13 +251,13 @@ // Note that all "AlignedFree()" variants (_aligned_free() on Windows for // instance) directly call PartitionFree(), so there is no risk of // mismatch. (see below the default_dispatch definition). - if (alignment <= base::kAlignment) { + if (alignment <= partition_alloc::internal::kAlignment) { // This is mandated by |posix_memalign()| and friends, so should never fire. PA_CHECK(base::bits::IsPowerOfTwo(alignment)); // TODO(bartekn): See if the compiler optimizes branches down the stack on // Mac, where PartitionPageSize() isn't constexpr. - return Allocator()->AllocWithFlagsNoHooks(0, size, - base::PartitionPageSize()); + return Allocator()->AllocWithFlagsNoHooks( + 0, size, partition_alloc::PartitionPageSize()); } return AlignedAllocator()->AlignedAllocWithFlags( @@ -296,7 +296,8 @@ void* PartitionMalloc(const AllocatorDispatch*, size_t size, void* context) { ScopedDisallowAllocations guard{}; return Allocator()->AllocWithFlagsNoHooks( - 0 | g_alloc_flags, MaybeAdjustSize(size), PartitionPageSize()); + 0 | g_alloc_flags, MaybeAdjustSize(size), + partition_alloc::PartitionPageSize()); } void* PartitionMallocUnchecked(const AllocatorDispatch*, @@ -305,7 +306,7 @@ ScopedDisallowAllocations guard{}; return Allocator()->AllocWithFlagsNoHooks( partition_alloc::AllocFlags::kReturnNull | g_alloc_flags, - MaybeAdjustSize(size), PartitionPageSize()); + MaybeAdjustSize(size), partition_alloc::PartitionPageSize()); } void* PartitionCalloc(const AllocatorDispatch*, @@ -316,7 +317,7 @@ const size_t total = base::CheckMul(n, MaybeAdjustSize(size)).ValueOrDie(); return Allocator()->AllocWithFlagsNoHooks( partition_alloc::AllocFlags::kZeroFill | g_alloc_flags, total, - PartitionPageSize()); + partition_alloc::PartitionPageSize()); } void* PartitionMemalign(const AllocatorDispatch*,
diff --git a/base/allocator/allocator_shim_override_mac_default_zone.h b/base/allocator/allocator_shim_override_mac_default_zone.h index c98e05a..513953d9 100644 --- a/base/allocator/allocator_shim_override_mac_default_zone.h +++ b/base/allocator/allocator_shim_override_mac_default_zone.h
@@ -47,7 +47,7 @@ } size_t MallocIntrospectionGoodSize(malloc_zone_t* zone, size_t size) { - return base::bits::AlignUp(size, base::kAlignment); + return base::bits::AlignUp(size, partition_alloc::internal::kAlignment); } boolean_t MallocIntrospectionCheck(malloc_zone_t* zone) {
diff --git a/base/allocator/partition_allocator/PartitionAlloc.md b/base/allocator/partition_allocator/PartitionAlloc.md index df65931f..a531f4f 100644 --- a/base/allocator/partition_allocator/PartitionAlloc.md +++ b/base/allocator/partition_allocator/PartitionAlloc.md
@@ -25,7 +25,7 @@ geometrically-spaced, and go all the way up to `kMaxBucketed`, which is a tad under 1MiB (so called *normal buckets*). There are tens of buckets, 4 between each power of two (except for lower sizes where buckets that aren't a multiple -of `base::kAlignment` simply don't exist). +of `partition_alloc::internal::kAlignment` simply don't exist). Larger allocations (>`kMaxBucketed`) are realized by direct memory mapping (*direct map*). @@ -85,7 +85,8 @@ ### Alignment PartitionAlloc guarantees that returned pointers are aligned on -`base::kAlignment` boundary (typically 16B on 64-bit systems, and 8B on 32-bit). +`partition_alloc::internal::kAlignment` boundary (typically 16B on +64-bit systems, and 8B on 32-bit). PartitionAlloc also supports higher levels of alignment, that can be requested via `PartitionAlloc::AlignedAllocWithFlags()` or platform-specific APIs (such as @@ -94,7 +95,8 @@ up the requested size to the nearest power of two, greater than or equal to the requested alignment. This may be wasteful, but allows taking advantage of natural PartitionAlloc alignment guarantees. Allocations with an alignment -requirement greater than `base::kAlignment` are expected to be very rare. +requirement greater than `partition_alloc::internal::kAlignment` are expected +to be very rare. ## PartitionAlloc-Everywhere
diff --git a/base/allocator/partition_allocator/partition_alloc_constants.h b/base/allocator/partition_allocator/partition_alloc_constants.h index ba20c2b..5f374c42 100644 --- a/base/allocator/partition_allocator/partition_alloc_constants.h +++ b/base/allocator/partition_allocator/partition_alloc_constants.h
@@ -429,6 +429,10 @@ } // namespace internal +// This function is used often enough to be worth publicizing outside the +// `internal` namespace. +using ::partition_alloc::internal::PartitionPageSize; + } // namespace partition_alloc namespace base { @@ -486,7 +490,6 @@ using ::partition_alloc::internal::PartitionPageBaseMask; using ::partition_alloc::internal::PartitionPageOffsetMask; using ::partition_alloc::internal::PartitionPageShift; -using ::partition_alloc::internal::PartitionPageSize; } // namespace base
diff --git a/base/allocator/partition_allocator/partition_alloc_forward.h b/base/allocator/partition_allocator/partition_alloc_forward.h index f591b11..d848c6e 100644 --- a/base/allocator/partition_allocator/partition_alloc_forward.h +++ b/base/allocator/partition_allocator/partition_alloc_forward.h
@@ -67,7 +67,6 @@ using ::partition_alloc::PartitionRoot; using ::partition_alloc::PartitionStatsDumper; using ::partition_alloc::ThreadSafePartitionRoot; -using ::partition_alloc::internal::kAlignment; } // namespace base
diff --git a/base/allocator/partition_allocator/partition_alloc_unittest.cc b/base/allocator/partition_allocator/partition_alloc_unittest.cc index 1ade33e5..3658087 100644 --- a/base/allocator/partition_allocator/partition_alloc_unittest.cc +++ b/base/allocator/partition_allocator/partition_alloc_unittest.cc
@@ -908,13 +908,13 @@ // To make both alloc(x + 1) and alloc(x + kSmallestBucket) to allocate from // the same bucket, partition_alloc::internal::base::bits::AlignUp(1 + x + - // kExtraAllocSize, base::kAlignment) + // kExtraAllocSize, kAlignment) // == partition_alloc::internal::base::bits::AlignUp(kSmallestBucket + x + - // kExtraAllocSize, base::kAlignment), because slot_size is multiples of - // base::kAlignment. So (x + kExtraAllocSize) must be multiples of - // base::kAlignment. x = + // kExtraAllocSize, kAlignment), because slot_size is multiples of + // kAlignment. So (x + kExtraAllocSize) must be multiples of + // kAlignment. x = // partition_alloc::internal::base::bits::AlignUp(kExtraAllocSize, - // base::kAlignment) - kExtraAllocSize; + // kAlignment) - kExtraAllocSize; size_t base_size = partition_alloc::internal::base::bits::AlignUp( kExtraAllocSize, kAlignment) - kExtraAllocSize; @@ -3221,7 +3221,7 @@ #if BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT) // The capacity(C) is slot size - kExtraAllocSize. - // Since slot size is multiples of base::kAlignment, + // Since slot size is multiples of kAlignment, // C % kAlignment == (slot_size - kExtraAllocSize) % kAlignment. // C % kAlignment == (-kExtraAllocSize) % kAlignment. // Since kCookieSize is a multiple of kAlignment,
diff --git a/base/allocator/partition_allocator/partition_root.h b/base/allocator/partition_allocator/partition_root.h index e6a2768..78057659 100644 --- a/base/allocator/partition_allocator/partition_root.h +++ b/base/allocator/partition_allocator/partition_root.h
@@ -138,7 +138,7 @@ // Options struct used to configure PartitionRoot and PartitionAllocator. struct PartitionOptions { enum class AlignedAlloc : uint8_t { - // By default all allocations will be aligned to `base::kAlignment`, + // By default all allocations will be aligned to `kAlignment`, // likely to be 8B or 16B depending on platforms and toolchains. // AlignedAlloc() allows to enforce higher alignment. // This option determines whether it is supported for the partition.
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc index 0344539..c7b5037a 100644 --- a/base/files/important_file_writer.cc +++ b/base/files/important_file_writer.cc
@@ -147,6 +147,7 @@ StringPiece data, StringPiece histogram_suffix, bool from_instance) { + const TimeTicks write_start = TimeTicks::Now(); if (!from_instance) ImportantFileWriterCleaner::AddDirectory(path.DirName()); @@ -259,6 +260,10 @@ DeleteTmpFileWithRetry(File(), tmp_file_path); } + const TimeDelta write_duration = TimeTicks::Now() - write_start; + UmaHistogramTimesWithSuffix("ImportantFile.WriteDuration", histogram_suffix, + write_duration); + return result; }
diff --git a/base/files/important_file_writer_unittest.cc b/base/files/important_file_writer_unittest.cc index b4cb431..9dd772c 100644 --- a/base/files/important_file_writer_unittest.cc +++ b/base/files/important_file_writer_unittest.cc
@@ -358,6 +358,7 @@ EXPECT_FALSE(PathExists(writer.path())); // We don't record metrics in case the serialization fails. histogram_tester.ExpectTotalCount("ImportantFile.SerializationDuration", 0); + histogram_tester.ExpectTotalCount("ImportantFile.WriteDuration", 0); } TEST_F(ImportantFileWriterTest, ScheduleWriteWithBackgroundDataSerializer) { @@ -393,6 +394,7 @@ ASSERT_TRUE(PathExists(writer.path())); EXPECT_EQ("foo", GetFileContent(writer.path())); histogram_tester.ExpectTotalCount("ImportantFile.SerializationDuration", 1); + histogram_tester.ExpectTotalCount("ImportantFile.WriteDuration", 1); } TEST_F(ImportantFileWriterTest, @@ -428,6 +430,7 @@ // We record the foreground serialization metric despite later failure in // background sequence. histogram_tester.ExpectTotalCount("ImportantFile.SerializationDuration", 1); + histogram_tester.ExpectTotalCount("ImportantFile.WriteDuration", 0); } // Test that the chunking to avoid very large writes works. @@ -450,6 +453,7 @@ writer.DoScheduledWrite(); RunLoop().RunUntilIdle(); histogram_tester.ExpectTotalCount("ImportantFile.SerializationDuration", 1); + histogram_tester.ExpectTotalCount("ImportantFile.WriteDuration", 1); } // Verify that a UMA metric for the serialization duration is recorded if the @@ -463,6 +467,7 @@ RunLoop().RunUntilIdle(); histogram_tester.ExpectTotalCount("ImportantFile.SerializationDuration.Foo", 1); + histogram_tester.ExpectTotalCount("ImportantFile.WriteDuration.Foo", 1); } } // namespace base
diff --git a/base/memory/nonscannable_memory.cc b/base/memory/nonscannable_memory.cc index e79112b..146b4534 100644 --- a/base/memory/nonscannable_memory.cc +++ b/base/memory/nonscannable_memory.cc
@@ -38,12 +38,12 @@ // TODO(bikineev): Change to LIKELY once PCScan is enabled by default. if (UNLIKELY(pcscan_enabled_.load(std::memory_order_acquire))) { PA_DCHECK(allocator_.get()); - return allocator_->root()->AllocWithFlagsNoHooks(0, size, - PartitionPageSize()); + return allocator_->root()->AllocWithFlagsNoHooks( + 0, size, partition_alloc::PartitionPageSize()); } // Otherwise, dispatch to default partition. return PartitionAllocMalloc::Allocator()->AllocWithFlagsNoHooks( - 0, size, PartitionPageSize()); + 0, size, partition_alloc::PartitionPageSize()); } template <bool Quarantinable>
diff --git a/base/memory/raw_ptr.cc b/base/memory/raw_ptr.cc index 8e097e8..bc81fdb 100644 --- a/base/memory/raw_ptr.cc +++ b/base/memory/raw_ptr.cc
@@ -71,10 +71,10 @@ void CheckThatAddressIsntWithinFirstPartitionPage(uintptr_t address) { if (IsManagedByDirectMap(address)) { uintptr_t reservation_start = GetDirectMapReservationStart(address); - CHECK(address - reservation_start >= PartitionPageSize()); + CHECK(address - reservation_start >= partition_alloc::PartitionPageSize()); } else { CHECK(IsManagedByNormalBuckets(address)); - CHECK(address % kSuperPageSize >= PartitionPageSize()); + CHECK(address % kSuperPageSize >= partition_alloc::PartitionPageSize()); } } #endif // DCHECK_IS_ON() || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS)
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index e0dee204..316107d 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -8.20220510.0.1 +8.20220510.3.1
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index 8955e5d8..da0a7e0 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -16,7 +16,6 @@ "java/res/anim/fast_out_slow_in_interpolator.xml", "java/res/anim/slide_in_up.xml", "java/res/anim/stay_hidden.xml", - "java/res/color/white_mode_tint.xml", "java/res/drawable-hdpi/bg_tabstrip_background_tab_outline.9.png", "java/res/drawable-hdpi/bg_tabstrip_tab.9.png", "java/res/drawable-hdpi/bookmark_check_gray.png",
diff --git a/chrome/android/java/res/color/white_mode_tint.xml b/chrome/android/java/res/color/white_mode_tint.xml deleted file mode 100644 index 0df30f8..0000000 --- a/chrome/android/java/res/color/white_mode_tint.xml +++ /dev/null
@@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright 2016 The Chromium Authors. All rights reserved. - Use of this source code is governed by a BSD-style license that can be - found in the LICENSE file. ---> -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="@color/baseline_neutral_0"/> -</selector>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java index a4b7ada4..f8e3b932 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/accessibility_tab_switcher/AccessibilityTabModelWrapper.java
@@ -92,8 +92,8 @@ SemanticColorUtils.getDefaultControlColorActive(getContext())); mTabIconLightColor = AppCompatResources.getColorStateList(getContext(), R.color.white_alpha_70); - mTabIconSelectedLightColor = - AppCompatResources.getColorStateList(getContext(), R.color.white_mode_tint); + mTabIconSelectedLightColor = AppCompatResources.getColorStateList( + getContext(), R.color.default_icon_color_white_tint_list); // Setting scaleY here to make sure the icons are not flipped due to the scaleY of its // container layout. mStandardButtonIcon = new ChromeImageView(getContext());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java index bdf7bb4..840e3ac 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/tablet/emptybackground/incognitotoggle/IncognitoToggleButton.java
@@ -75,7 +75,7 @@ setImageResource(R.drawable.incognito_simple); ApiCompatibilityUtils.setImageTintList(this, AppCompatResources.getColorStateList(getContext(), - isIncognitoSelected ? R.color.white_mode_tint + isIncognitoSelected ? R.color.default_icon_color_white_tint_list : R.color.default_icon_color_tint_list)); }
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 0a480a2d..6aafda6 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -5989,6 +5989,7 @@ "//chrome/browser/enterprise/connectors/device_trust/attestation/common/proto:interface_proto", "//chrome/browser/enterprise/connectors/device_trust/key_management/core", "//chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence", + "//components/device_signals/core/common", ] }
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index e43d831..49ccc5b0 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -6130,13 +6130,6 @@ flag_descriptions::kSkiaRendererDescription, kOsAll, FEATURE_VALUE_TYPE(features::kUseSkiaRenderer)}, -#if BUILDFLAG(IS_CHROMEOS) - {"bluetooth-advertisement-monitoring", - flag_descriptions::kBluetoothAdvertisementMonitoringName, - flag_descriptions::kBluetoothAdvertisementMonitoringDescription, kOsCrOS, - FEATURE_VALUE_TYPE(chromeos::features::kBluetoothAdvertisementMonitoring)}, -#endif // BUILDFLAG(IS_CHROMEOS) - #if BUILDFLAG(IS_CHROMEOS_ASH) {"allow-disable-touchpad-haptic-feedback", flag_descriptions::kAllowDisableTouchpadHapticFeedbackName,
diff --git a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc index d06a9f2d..13240cf3 100644 --- a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc +++ b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.cc
@@ -9,6 +9,7 @@ #include "ash/components/arc/arc_browser_context_keyed_service_factory_base.h" #include "ash/public/cpp/window_properties.h" #include "ash/shell.h" +#include "ash/wm/window_util.h" #include "base/bind.h" #include "base/json/json_reader.h" #include "base/logging.h" @@ -88,7 +89,8 @@ task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::USER_VISIBLE, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); + // Should not block shutdown. + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}); // For test. The unittest is based on ExoTestBase which must run on // Chrome_UIThread. While TestingProfileManager::CreateTestingProfile runs on @@ -166,9 +168,9 @@ void ArcInputOverlayManager::OnProtoDataAvailable( input_overlay::TouchInjector* touch_injector, std::unique_ptr<input_overlay::AppDataProto> proto) { - if (!proto) - return; - touch_injector->OnProtoDataAvailable(std::move(proto)); + if (proto) + touch_injector->OnProtoDataAvailable(std::move(proto)); + RegisterWindowIfFocused(touch_injector->target_window()); } void ArcInputOverlayManager::OnSaveProtoFile( @@ -248,6 +250,11 @@ registered_top_level_window_ = nullptr; } +void ArcInputOverlayManager::RegisterWindowIfFocused(aura::Window* window) { + if (ash::window_util::GetFocusedWindow() == window) + RegisterWindow(window); +} + void ArcInputOverlayManager::AddDisplayOverlayController() { if (!registered_top_level_window_) return;
diff --git a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.h b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.h index 33a335b..5f72ce9 100644 --- a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.h +++ b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager.h
@@ -122,6 +122,7 @@ // Only top level window will be registered successfully. void RegisterWindow(aura::Window* window); void UnRegisterWindow(aura::Window* window); + void RegisterWindowIfFocused(aura::Window* window); void AddDisplayOverlayController(); void RemoveDisplayOverlayController();
diff --git a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc index d35e245..48733348 100644 --- a/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc +++ b/chrome/browser/ash/arc/input_overlay/arc_input_overlay_manager_unittest.cc
@@ -110,7 +110,9 @@ // I/O takes time here. task_environment()->FastForwardBy(kIORead); EXPECT_TRUE(IsInputOverlayEnabled(arc_window->GetWindow())); - EXPECT_FALSE(GetRegisteredWindow()); + // Input overlay registers the window after reading the data when the window + // is still focused. In the test, the arc_window is considered as focused now. + EXPECT_TRUE(GetRegisteredWindow()); WindowFocus(arc_window->GetWindow(), nullptr); EXPECT_TRUE(GetRegisteredWindow());
diff --git a/chrome/browser/ash/arc/print_spooler/print_session_impl.cc b/chrome/browser/ash/arc/print_spooler/print_session_impl.cc index 1cbb2f03..1d44bf5 100644 --- a/chrome/browser/ash/arc/print_spooler/print_session_impl.cc +++ b/chrome/browser/ash/arc/print_spooler/print_session_impl.cc
@@ -273,16 +273,16 @@ } void PrintSessionImpl::CreatePreviewDocument( - base::Value job_settings, + base::Value::Dict job_settings, CreatePreviewDocumentCallback callback) { mojom::PrintDocumentRequestPtr request = - PrintDocumentRequestFromJobSettings(job_settings.GetDict()); + PrintDocumentRequestFromJobSettings(job_settings); if (!request || !request->attributes) { std::move(callback).Run(base::ReadOnlySharedMemoryRegion()); return; } - int request_id = job_settings.FindIntKey(printing::kPreviewRequestID).value(); + int request_id = job_settings.FindInt(printing::kPreviewRequestID).value(); instance_->CreatePreviewDocument( std::move(request), base::BindOnce(&PrintSessionImpl::OnPreviewDocumentCreated,
diff --git a/chrome/browser/ash/arc/print_spooler/print_session_impl.h b/chrome/browser/ash/arc/print_spooler/print_session_impl.h index aba9053..fd20bb96 100644 --- a/chrome/browser/ash/arc/print_spooler/print_session_impl.h +++ b/chrome/browser/ash/arc/print_spooler/print_session_impl.h
@@ -63,7 +63,7 @@ friend class content::WebContentsUserData<PrintSessionImpl>; // printing::mojom::PrintRenderer: - void CreatePreviewDocument(base::Value job_settings, + void CreatePreviewDocument(base::Value::Dict job_settings, CreatePreviewDocumentCallback callback) override; // Called once the preview document has been created by ARC. The preview
diff --git a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc index 642dcda6..66fa385e 100644 --- a/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc +++ b/chrome/browser/ash/login/quick_unlock/quick_unlock_utils.cc
@@ -260,48 +260,41 @@ } void AddFingerprintResources(content::WebUIDataSource* html_source) { - int resource_id; - bool is_lottie_animation = false; + int resource_id_dark; + int resource_id_light; switch (GetFingerprintLocation()) { case FingerprintLocation::TABLET_POWER_BUTTON: - is_lottie_animation = true; - resource_id = IDR_FINGERPRINT_TABLET_ANIMATION; + resource_id_dark = IDR_FINGERPRINT_TABLET_ANIMATION_DARK; + resource_id_light = IDR_FINGERPRINT_TABLET_ANIMATION_LIGHT; break; case FingerprintLocation::KEYBOARD_BOTTOM_RIGHT: - is_lottie_animation = true; - resource_id = IDR_FINGERPRINT_LAPTOP_BOTTOM_RIGHT_ANIMATION; + resource_id_dark = IDR_FINGERPRINT_LAPTOP_BOTTOM_RIGHT_ANIMATION_DARK; + resource_id_light = IDR_FINGERPRINT_LAPTOP_BOTTOM_RIGHT_ANIMATION_LIGHT; break; case FingerprintLocation::KEYBOARD_BOTTOM_LEFT: - resource_id = IDR_FINGERPRINT_LAPTOP_BOTTOM_LEFT_ILLUSTRATION_SVG; + resource_id_dark = IDR_FINGERPRINT_LAPTOP_BOTTOM_LEFT_ANIMATION_DARK; + resource_id_light = IDR_FINGERPRINT_LAPTOP_BOTTOM_LEFT_ANIMATION_LIGHT; break; case FingerprintLocation::KEYBOARD_TOP_RIGHT: - resource_id = IDR_FINGERPRINT_LAPTOP_TOP_RIGHT_ILLUSTRATION_SVG; - break; case FingerprintLocation::RIGHT_SIDE: case FingerprintLocation::LEFT_SIDE: case FingerprintLocation::UNKNOWN: - is_lottie_animation = true; - resource_id = IDR_FINGERPRINT_DEFAULT_ANIMATION; + resource_id_dark = IDR_FINGERPRINT_DEFAULT_ANIMATION_DARK; + resource_id_light = IDR_FINGERPRINT_DEFAULT_ANIMATION_LIGHT; break; } - if (is_lottie_animation) { - html_source->AddResourcePath("fingerprint_scanner_animation.json", - resource_id); + html_source->AddResourcePath("fingerprint_scanner_animation_dark.json", + resource_id_dark); + html_source->AddResourcePath("fingerprint_scanner_animation_light.json", + resource_id_light); - // To use lottie, the worker-src CSP needs to be updated for the web ui - // that is using it. Since as of now there are only a couple of webuis - // using lottie animations, this update has to be performed manually. As - // the usage increases, set this as the default so manual override is no - // longer required. - html_source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::WorkerSrc, - "worker-src blob: 'self';"); - } else { - html_source->AddResourcePath("fingerprint_scanner_illustration.svg", - resource_id); - } - html_source->AddBoolean("useLottieAnimationForFingerprint", - is_lottie_animation); + // To use lottie, the worker-src CSP needs to be updated for the web ui + // that is using it. Since as of now there are only a couple of webuis + // using lottie animations, this update has to be performed manually. As + // the usage increases, set this as the default so manual override is no + // longer required. + html_source->OverrideContentSecurityPolicy( + network::mojom::CSPDirectiveName::WorkerSrc, "worker-src blob: 'self';"); } } // namespace quick_unlock
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc index 442f5527..6fc99895 100644 --- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc +++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
@@ -7,8 +7,12 @@ #include <string> #include <utility> +#include "ash/shell.h" #include "ash/webui/os_feedback_ui/mojom/os_feedback_ui.mojom.h" #include "base/bind.h" +#include "base/logging.h" +#include "base/memory/ref_counted.h" +#include "base/memory/ref_counted_memory.h" #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "chrome/browser/browser_process.h" @@ -30,6 +34,8 @@ #include "extensions/browser/api/feedback_private/feedback_service.h" #include "net/base/network_change_notifier.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "ui/aura/window.h" +#include "ui/snapshot/snapshot.h" #include "url/gurl.h" namespace ash { @@ -41,6 +47,15 @@ return feedback::FeedbackUploaderFactoryChrome::GetForBrowserContext(context); } +void TakeScreenshot( + base::OnceCallback<void(scoped_refptr<base::RefCountedMemory>)> callback) { + aura::Window* primary_window = ash::Shell::GetPrimaryRootWindow(); + if (primary_window) { + gfx::Rect rect = primary_window->bounds(); + ui::GrabWindowSnapshotAsyncPNG(primary_window, rect, std::move(callback)); + } +} + } // namespace using ::ash::os_feedback_ui::mojom::SendReportStatus; @@ -57,6 +72,10 @@ Profile* profile, scoped_refptr<extensions::FeedbackService> feedback_service) : profile_(profile), feedback_service_(feedback_service) { + // TODO(xiangdongkong): Take screenshot first, then open the feedback app. + TakeScreenshot(base::BindOnce(&ChromeOsFeedbackDelegate::OnScreenshotTaken, + weak_ptr_factory_.GetWeakPtr())); + Browser* browser = BrowserList::GetInstance()->GetLastActive(); if (browser) { // Save the last active page url before opening the feedback tool. @@ -85,6 +104,19 @@ .email; } +void ChromeOsFeedbackDelegate::GetScreenshotPng( + GetScreenshotPngCallback callback) { + if (screenshot_png_data_ && screenshot_png_data_.get()) { + std::vector<uint8_t> data( + screenshot_png_data_->data(), + screenshot_png_data_->data() + screenshot_png_data_->size()); + std::move(callback).Run(data); + } else { + std::vector<uint8_t> empty_data; + std::move(callback).Run(empty_data); + } +} + void ChromeOsFeedbackDelegate::SendReport( os_feedback_ui::mojom::ReportPtr report, SendReportCallback callback) { @@ -110,6 +142,12 @@ feedback_data->set_page_url(feedback_context->page_url.value().spec()); } + if (report->include_screenshot && screenshot_png_data_ && + screenshot_png_data_.get()) { + feedback_data->set_image(std::string(screenshot_png_data_->front_as<char>(), + screenshot_png_data_->size())); + } + feedback_service_->SendFeedback( feedback_params, feedback_data, base::BindOnce(&ChromeOsFeedbackDelegate::OnSendFeedbackDone, @@ -123,4 +161,13 @@ std::move(callback).Run(send_status); } +void ChromeOsFeedbackDelegate::OnScreenshotTaken( + scoped_refptr<base::RefCountedMemory> data) { + if (data && data.get()) { + screenshot_png_data_ = std::move(data); + } else { + LOG(ERROR) << "failed to take screenshot."; + } +} + } // namespace ash
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h index 86405659..bac37ec 100644 --- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h +++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.h
@@ -9,6 +9,7 @@ #include "ash/webui/os_feedback_ui/backend/os_feedback_delegate.h" #include "base/memory/raw_ptr.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -16,6 +17,10 @@ class Profile; +namespace base { +class RefCountedMemory; +} // namespace base + namespace extensions { class FeedbackService; } // namespace extensions @@ -37,17 +42,24 @@ std::string GetApplicationLocale() override; absl::optional<GURL> GetLastActivePageUrl() override; absl::optional<std::string> GetSignedInUserEmail() const override; + void GetScreenshotPng(GetScreenshotPngCallback callback) override; void SendReport(os_feedback_ui::mojom::ReportPtr report, SendReportCallback callback) override; + void SetPngDataForTesting(scoped_refptr<base::RefCountedMemory> png_data) { + screenshot_png_data_ = std::move(png_data); + } + private: void OnSendFeedbackDone(SendReportCallback callback, bool status); + void OnScreenshotTaken(scoped_refptr<base::RefCountedMemory> data); // TODO(xiangdongkong): make sure the profile_ cannot be destroyed while // operations are pending. raw_ptr<Profile> profile_; scoped_refptr<extensions::FeedbackService> feedback_service_; absl::optional<GURL> page_url_; + scoped_refptr<base::RefCountedMemory> screenshot_png_data_; base::WeakPtrFactory<ChromeOsFeedbackDelegate> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc index 514570d..a098ea18 100644 --- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc +++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate_browsertest.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/files/scoped_temp_dir.h" #include "base/memory/ref_counted.h" +#include "base/memory/ref_counted_memory.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" @@ -89,6 +90,14 @@ auto feedback_delegate_ = std::make_unique<ChromeOsFeedbackDelegate>(profile_, std::move(mock)); + scoped_refptr<base::RefCountedMemory> fake_png_data; + { + const unsigned char kData[] = {12, 11, 99}; + fake_png_data = + base::MakeRefCounted<base::RefCountedBytes>(kData, std::size(kData)); + } + feedback_delegate_->SetPngDataForTesting(std::move(fake_png_data)); + base::test::TestFuture<SendReportStatus> future; feedback_delegate_->SendReport(std::move(report), future.GetCallback()); @@ -126,14 +135,17 @@ } // Test that feedback params and data are populated with correct data before -// passed to SendFeedback method of the feedback service . +// passed to SendFeedback method of the feedback service. +// - System logs and histograms are included. +// - Screenshot is included. // TODO(xiangdongkong): Add tests for other flags once they are supported. // Currently, only load_system_info and send_histograms flags are implemented. IN_PROC_BROWSER_TEST_F(ChromeOsFeedbackDelegateTest, - FeedbackDataPopulatedIncludeSysLogs) { + FeedbackDataPopulatedIncludeSysLogsAndScreenshot) { ReportPtr report = Report::New(); report->feedback_context = FeedbackContext::New(); report->description = kDescription; + report->include_screenshot = true; report->include_system_logs_and_histograms = true; const FeedbackParams expected_params{/*is_internal_email=*/false, @@ -148,17 +160,22 @@ EXPECT_EQ("", feedback_data->user_email()); EXPECT_EQ("", feedback_data->page_url()); EXPECT_EQ(base::UTF16ToUTF8(kDescription), feedback_data->description()); + // Verify screenshot is added to feedback data. + EXPECT_GT(feedback_data->image().size(), 0); } // Test that feedback params and data are populated with correct data before -// passed to SendFeedback method of the feedback service . +// passed to SendFeedback method of the feedback service. +// - System logs and histograms are not included. +// - Screenshot is not included. IN_PROC_BROWSER_TEST_F(ChromeOsFeedbackDelegateTest, - FeedbackDataPopulatedNotIncludeSysLogs) { + FeedbackDataPopulatedNotIncludeSysLogsOrScreenshot) { ReportPtr report = Report::New(); report->feedback_context = FeedbackContext::New(); report->feedback_context->email = kSignedInUserEmail; report->feedback_context->page_url = GURL(kPageUrl); report->description = kDescription; + report->include_screenshot = false; report->include_system_logs_and_histograms = false; const FeedbackParams expected_params{/*is_internal_email=*/false, @@ -173,6 +190,8 @@ EXPECT_EQ(kSignedInUserEmail, feedback_data->user_email()); EXPECT_EQ(kPageUrl, feedback_data->page_url()); EXPECT_EQ(base::UTF16ToUTF8(kDescription), feedback_data->description()); + // Verify no screenshot is added to feedback data. + EXPECT_EQ("", feedback_data->image()); } } // namespace ash
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc index f6a0ddb..632dd09 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc
@@ -9,6 +9,7 @@ #include "ash/rgb_keyboard/rgb_keyboard_manager.h" #include "ash/rgb_keyboard/rgb_keyboard_util.h" #include "ash/shell.h" +#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h" #include "ash/wallpaper/wallpaper_controller_impl.h" #include "ash/webui/personalization_app/mojom/personalization_app.mojom.h" #include "base/check.h" @@ -22,6 +23,15 @@ namespace ash { namespace personalization_app { +namespace { +KeyboardBacklightColorController* GetKeyboardBacklightColorController() { + auto* keyboard_backlight_color_controller = + ash::Shell::Get()->keyboard_backlight_color_controller(); + DCHECK(keyboard_backlight_color_controller); + return keyboard_backlight_color_controller; +} +} // namespace + PersonalizationAppKeyboardBacklightProviderImpl:: PersonalizationAppKeyboardBacklightProviderImpl(content::WebUI* web_ui) : profile_(Profile::FromWebUI(web_ui)) {} @@ -57,41 +67,7 @@ return; } DVLOG(4) << __func__ << " backlight_color=" << backlight_color; - auto* rgb_keyboard_manager = ash::Shell::Get()->rgb_keyboard_manager(); - DCHECK(rgb_keyboard_manager); - SkColor color = kInvalidColor; - switch (backlight_color) { - case mojom::BacklightColor::kWallpaper: { - auto* wallpaper_controller = ash::Shell::Get()->wallpaper_controller(); - DCHECK(wallpaper_controller); - color = wallpaper_controller->GetProminentColor( - color_utils::ColorProfile(color_utils::LumaRange::NORMAL, - color_utils::SaturationRange::VIBRANT)); - rgb_keyboard_manager->SetStaticBackgroundColor( - SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)); - break; - } - case mojom::BacklightColor::kWhite: - case mojom::BacklightColor::kRed: - case mojom::BacklightColor::kYellow: - case mojom::BacklightColor::kGreen: - case mojom::BacklightColor::kBlue: - case mojom::BacklightColor::kIndigo: - case mojom::BacklightColor::kPurple: { - color = ConvertBacklightColorToSkColor(backlight_color); - rgb_keyboard_manager->SetStaticBackgroundColor( - SkColorGetR(color), SkColorGetG(color), SkColorGetB(color)); - break; - } - case mojom::BacklightColor::kRainbow: - rgb_keyboard_manager->SetRainbowMode(); - break; - } - - PrefService* pref_service = profile_->GetPrefs(); - DCHECK(pref_service); - pref_service->SetInteger(ash::prefs::kPersonalizationKeyboardBacklightColor, - static_cast<int>(backlight_color)); + GetKeyboardBacklightColorController()->SetBacklightColor(backlight_color); NotifyBacklightColorChanged(); } @@ -99,11 +75,8 @@ void PersonalizationAppKeyboardBacklightProviderImpl:: NotifyBacklightColorChanged() { DCHECK(keyboard_backlight_observer_remote_.is_bound()); - PrefService* pref_service = profile_->GetPrefs(); - DCHECK(pref_service); keyboard_backlight_observer_remote_->OnBacklightColorChanged( - static_cast<mojom::BacklightColor>(pref_service->GetInteger( - prefs::kPersonalizationKeyboardBacklightColor))); + GetKeyboardBacklightColorController()->GetBacklightColor()); } } // namespace personalization_app
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc index ace6f66..abd99ac2 100644 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc +++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc
@@ -136,11 +136,6 @@ keyboard_backlight_provider()->SetBacklightColor( mojom::BacklightColor::kBlue); - // Verify the backlight color pref is saved. - EXPECT_EQ(profile()->GetPrefs()->GetInteger( - ash::prefs::kPersonalizationKeyboardBacklightColor), - static_cast<int>(mojom::BacklightColor::kBlue)); - // Verify JS side is notified. EXPECT_EQ(mojom::BacklightColor::kBlue, ObservedBacklightColor()); }
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.cc deleted file mode 100644 index 2d4b35f..0000000 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.cc +++ /dev/null
@@ -1,18 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.h" -#include "ash/constants/ash_pref_names.h" -#include "ash/webui/personalization_app/mojom/personalization_app.mojom.h" -#include "components/prefs/pref_registry_simple.h" - -namespace ash::personalization_app::prefs { - -void RegisterProfilePrefs(PrefRegistrySimple* registry) { - registry->RegisterIntegerPref( - ash::prefs::kPersonalizationKeyboardBacklightColor, - static_cast<int>(mojom::BacklightColor::kWallpaper)); -} - -} // namespace ash::personalization_app::prefs
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.h deleted file mode 100644 index 0e4d6d9..0000000 --- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.h +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_ASH_WEB_APPLICATIONS_PERSONALIZATION_APP_PERSONALIZATION_APP_PREFS_H_ -#define CHROME_BROWSER_ASH_WEB_APPLICATIONS_PERSONALIZATION_APP_PERSONALIZATION_APP_PREFS_H_ - -class PrefRegistrySimple; - -namespace ash::personalization_app::prefs { - -// Registers profile prefs. -void RegisterProfilePrefs(PrefRegistrySimple* registry); - -} // namespace ash::personalization_app::prefs - -#endif // CHROME_BROWSER_ASH_WEB_APPLICATIONS_PERSONALIZATION_APP_PERSONALIZATION_APP_PREFS_H_
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 03172f6..aa9fde86 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -217,11 +217,14 @@ <include name="IDR_ARC_SUPPORT_MANIFEST" file="resources\chromeos\arc_support\manifest.json" type="BINDATA" /> <!-- Fingerprint resources. --> - <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_RIGHT_ANIMATION" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_right.json"/> - <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_TABLET_ANIMATION" file="resources\chromeos\quick_unlock\fingerprint_tablet.json"/> - <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_DEFAULT_ANIMATION" file="resources\chromeos\quick_unlock\fingerprint_default.json"/> - <include type="BINDATA" name="IDR_FINGERPRINT_LAPTOP_TOP_RIGHT_ILLUSTRATION_SVG" file="resources\chromeos\quick_unlock\fingerprint_laptop_top_right.svg" /> - <include type="BINDATA" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_LEFT_ILLUSTRATION_SVG" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_left.svg" /> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_LEFT_ANIMATION_DARK" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_left_dark.json"/> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_LEFT_ANIMATION_LIGHT" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_left_light.json"/> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_RIGHT_ANIMATION_DARK" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_right_dark.json"/> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_LAPTOP_BOTTOM_RIGHT_ANIMATION_LIGHT" file="resources\chromeos\quick_unlock\fingerprint_laptop_bottom_right_light.json"/> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_TABLET_ANIMATION_DARK" file="resources\chromeos\quick_unlock\fingerprint_tablet_dark.json"/> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_TABLET_ANIMATION_LIGHT" file="resources\chromeos\quick_unlock\fingerprint_tablet_light.json"/> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_DEFAULT_ANIMATION_DARK" file="resources\chromeos\quick_unlock\fingerprint_default_dark.json"/> + <include type="BINDATA" compress="gzip" name="IDR_FINGERPRINT_DEFAULT_ANIMATION_LIGHT" file="resources\chromeos\quick_unlock\fingerprint_default_light.json"/> <include name="IDR_VM_INDEX_HTML" file="resources\chromeos\vm\index.html" type="BINDATA" /> <include name="IDR_VM_APP_JS" file="${root_gen_dir}\chrome\browser\resources\chromeos\vm\app.js" type="BINDATA" use_base_dir="false" />
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 8766cd0..02770b2 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -3342,8 +3342,6 @@ "../ash/web_applications/personalization_app/personalization_app_manager_factory.h", "../ash/web_applications/personalization_app/personalization_app_metrics.cc", "../ash/web_applications/personalization_app/personalization_app_metrics.h", - "../ash/web_applications/personalization_app/personalization_app_prefs.cc", - "../ash/web_applications/personalization_app/personalization_app_prefs.h", "../ash/web_applications/personalization_app/personalization_app_theme_provider_impl.cc", "../ash/web_applications/personalization_app/personalization_app_theme_provider_impl.h", "../ash/web_applications/personalization_app/personalization_app_user_provider_impl.cc",
diff --git a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc index f1dee9f..efd9c62 100644 --- a/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc +++ b/chrome/browser/chromeos/extensions/autotest_private/autotest_private_api.cc
@@ -1385,13 +1385,13 @@ auto client = std::make_unique<policy::ChromePolicyConversionsClient>( browser_context()); - base::Value all_policies_array = + base::Value::Dict all_policies_dict = policy::DictionaryPolicyConversions(std::move(client)) .EnableDeviceLocalAccountPolicies(true) .EnableDeviceInfo(true) - .ToValue(); + .ToValueDict(); - return RespondNow(OneArgument(std::move(all_policies_array))); + return RespondNow(OneArgument(base::Value(std::move(all_policies_dict)))); } ///////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/continuous_search/BUILD.gn b/chrome/browser/continuous_search/BUILD.gn index 27a31b0..9bff3d0b 100644 --- a/chrome/browser/continuous_search/BUILD.gn +++ b/chrome/browser/continuous_search/BUILD.gn
@@ -84,8 +84,6 @@ } android_library("data_structures_java") { - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] - sources = [ "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousNavigationMetadata.java", "android/java/src/org/chromium/chrome/browser/continuous_search/ContinuousNavigationUserData.java", @@ -97,7 +95,6 @@ deps = [ "//base:base_java", - "//base:jni_java", "//chrome/browser/tab:java", "//third_party/androidx:androidx_annotation_annotation_java", "//url:gurl_java",
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/BUILD.gn index 918f702..31aaffd 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/BUILD.gn
@@ -15,6 +15,7 @@ "//chrome/browser/ash", "//chrome/browser/enterprise/connectors/device_trust/common", "//chrome/browser/profiles:profile", + "//components/device_signals/core/common", ] public_deps = [
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc index ba2c495b..b81cd2e 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc
@@ -12,6 +12,7 @@ #include "base/callback.h" #include "base/check.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/ash/attestation/tpm_challenge_key_result.h" #include "chrome/browser/ash/attestation/tpm_challenge_key_with_timeout.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h" @@ -46,9 +47,8 @@ void AshAttestationService::BuildChallengeResponseForVAChallenge( const std::string& serialized_signed_challenge, - std::unique_ptr<attestation::DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback) { - DCHECK(signals); auto tpm_key_challenger = std::make_unique<ash::attestation::TpmChallengeKeyWithTimeout>(); auto* tpm_key_challenger_ptr = tpm_key_challenger.get(); @@ -58,7 +58,8 @@ weak_factory_.GetWeakPtr(), std::move(tpm_key_challenger), std::move(callback)), serialized_signed_challenge, /*register_key=*/false, - /*key_name_for_spkac=*/std::string(), /*signals=*/*signals); + /*key_name_for_spkac=*/std::string(), + /*signals=*/*DictionarySignalsToProtobufSignals(signals)); } void AshAttestationService::ReturnResult(
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.h index b21a0ecd..d1c853a 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.h
@@ -32,7 +32,7 @@ // AttestationService: void BuildChallengeResponseForVAChallenge( const std::string& serialized_signed_challenge, - std::unique_ptr<attestation::DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback) override; private:
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc index 353d913..59e0a80 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc
@@ -23,6 +23,7 @@ #include "chromeos/dbus/attestation/attestation_ca.pb.h" #include "chromeos/dbus/attestation/attestation_client.h" #include "chromeos/dbus/constants/attestation_constants.h" +#include "components/device_signals/core/common/signals_constants.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -109,10 +110,11 @@ std::make_unique<AshAttestationService>(&test_profile_); } - std::unique_ptr<attestation::DeviceTrustSignals> CreateSignals() { - auto signals = std::make_unique<attestation::DeviceTrustSignals>(); - signals->set_device_id(kDeviceId); - signals->set_obfuscated_customer_id(kObfuscatedCustomerId); + base::Value::Dict CreateSignals() { + base::Value::Dict signals; + signals.Set(device_signals::names::kDeviceId, kDeviceId); + signals.Set(device_signals::names::kObfuscatedCustomerId, + kObfuscatedCustomerId); return signals; } @@ -124,8 +126,6 @@ }; TEST_F(AshAttestationServiceTest, BuildChallengeResponse_Success) { - auto signals = CreateSignals(); - base::RunLoop run_loop; auto callback = base::BindLambdaForTesting([&](const std::string& challenge_response) { @@ -150,7 +150,7 @@ kFakeResponse))); attestation_service_->BuildChallengeResponseForVAChallenge( - protoChallenge, std::move(signals), std::move(callback)); + protoChallenge, CreateSignals(), std::move(callback)); run_loop.Run(); }
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h index 7e775e57..e6a5271 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h
@@ -9,6 +9,7 @@ #include <string> #include "base/callback.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" namespace enterprise_connectors { @@ -27,7 +28,7 @@ // `callback` with an empty string. virtual void BuildChallengeResponseForVAChallenge( const std::string& serialized_signed_challenge, - std::unique_ptr<SignalsType> signals, + base::Value::Dict signals, AttestationCallback callback) = 0; };
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h index 36a4c85..36ace13a 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h
@@ -7,8 +7,8 @@ #include <string> +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" #include "testing/gmock/include/gmock/gmock.h" namespace enterprise_connectors { @@ -23,9 +23,7 @@ MOCK_METHOD(void, BuildChallengeResponseForVAChallenge, - (const std::string&, - std::unique_ptr<SignalsType>, - AttestationCallback), + (const std::string&, base::Value::Dict, AttestationCallback), (override)); };
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc index 47f6d65..b0172e8 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/proto/device_trust_attestation_ca.pb.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/desktop/crypto_utility.h" #include "chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/enterprise/browser/device_trust/device_trust_key_manager.h" #include "crypto/random.h" #include "crypto/unexportable_key.h" @@ -102,16 +103,14 @@ // - Reply to callback. void DesktopAttestationService::BuildChallengeResponseForVAChallenge( const std::string& serialized_signed_challenge, - std::unique_ptr<DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(signals); // Signals have to at least have the non-empty device ID and obfuscated // customer ID. - if (!signals || !signals->has_device_id() || signals->device_id().empty() || - !signals->has_obfuscated_customer_id() || - signals->obfuscated_customer_id().empty()) { + if (!signals.FindString(device_signals::names::kDeviceId) || + !signals.FindString(device_signals::names::kObfuscatedCustomerId)) { LogAttestationResult(DTAttestationResult::kMissingCoreSignals); std::move(callback).Run(std::string()); return; @@ -125,7 +124,7 @@ void DesktopAttestationService::OnPublicKeyExported( const std::string& serialized_signed_challenge, - std::unique_ptr<DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback, absl::optional<std::string> exported_key) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -160,7 +159,7 @@ void DesktopAttestationService::OnChallengeValidated( const SignedData& signed_data, const std::string& exported_public_key, - std::unique_ptr<DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback, bool is_va_challenge) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -177,9 +176,14 @@ KeyInfo key_info; key_info.set_key_type(CBCM); key_info.set_browser_instance_public_key(exported_public_key); - key_info.set_device_id(signals->device_id()); - key_info.set_customer_id(signals->obfuscated_customer_id()); - key_info.set_allocated_device_trust_signals(signals.release()); + key_info.set_device_id(*signals.FindString(device_signals::names::kDeviceId)); + key_info.set_customer_id( + *signals.FindString(device_signals::names::kObfuscatedCustomerId)); + + // VA currently only accepts the signals in a protobuf format. + std::unique_ptr<DeviceTrustSignals> signals_proto = + DictionarySignalsToProtobufSignals(signals); + key_info.set_allocated_device_trust_signals(signals_proto.release()); std::string serialized_key_info; if (!key_info.SerializeToString(&serialized_key_info)) {
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.h index 9482ebe..b614caf 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.h
@@ -20,7 +20,6 @@ namespace enterprise_connectors { class DeviceTrustKeyManager; -class DeviceTrustSignals; // This class is in charge of handling the key pair used for attestation. Also // provides the methods needed in the handshake between Chrome, an IdP and @@ -33,22 +32,22 @@ // AttestationService: void BuildChallengeResponseForVAChallenge( const std::string& serialized_signed_challenge, - std::unique_ptr<DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback) override; private: void OnChallengeParsed(AttestationCallback callback, - std::unique_ptr<DeviceTrustSignals> signals, + base::Value::Dict signals, const std::string& serialized_signed_challenge); void OnPublicKeyExported(const std::string& serialized_signed_challenge, - std::unique_ptr<DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback, absl::optional<std::string> exported_key); void OnChallengeValidated(const SignedData& signed_data, const std::string& exported_public_key, - std::unique_ptr<DeviceTrustSignals> signals, + base::Value::Dict signals, AttestationCallback callback, bool is_va_challenge);
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc index 12b987b8..4160f29 100644 --- a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/device_trust_key_manager_impl.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/mock_key_rotation_launcher.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.h" +#include "components/device_signals/core/common/signals_constants.h" #include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -96,10 +97,11 @@ std::make_unique<DesktopAttestationService>(key_manager_.get()); } - std::unique_ptr<DeviceTrustSignals> CreateSignals() { - auto signals = std::make_unique<DeviceTrustSignals>(); - signals->set_device_id(kDeviceId); - signals->set_obfuscated_customer_id(kObfuscatedCustomerId); + base::Value::Dict CreateSignals() { + base::Value::Dict signals; + signals.Set(device_signals::names::kDeviceId, kDeviceId); + signals.Set(device_signals::names::kObfuscatedCustomerId, + kObfuscatedCustomerId); return signals; } @@ -112,7 +114,6 @@ TEST_F(DesktopAttestationServiceTest, BuildChallengeResponse_Success) { // TODO(crbug.com/1208881): Add signals and validate they effectively get // added to the signed data. - auto signals = CreateSignals(); base::RunLoop run_loop; auto callback = base::BindLambdaForTesting( @@ -126,7 +127,7 @@ }); attestation_service_->BuildChallengeResponseForVAChallenge( - GetSerializedSignedChallenge(), std::move(signals), std::move(callback)); + GetSerializedSignedChallenge(), CreateSignals(), std::move(callback)); run_loop.Run(); }
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc index d0dfc9b..08ececd1 100644 --- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc +++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/enterprise/connectors/device_trust/device_trust_service.h" #include "base/base64.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/connectors_prefs.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h" #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h" @@ -102,7 +103,7 @@ void DeviceTrustService::OnSignalsCollected( const std::string& serialized_signed_challenge, AttestationCallback callback, - std::unique_ptr<SignalsType> signals) { + base::Value::Dict signals) { LogAttestationFunnelStep(DTAttestationFunnelStep::kSignalsCollected); attestation_service_->BuildChallengeResponseForVAChallenge(
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h index 7b95931b..8fc87dbd 100644 --- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
@@ -10,7 +10,7 @@ #include "base/callback.h" #include "base/memory/raw_ptr.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" +#include "base/values.h" #include "components/keyed_service/core/keyed_service.h" #include "services/data_decoder/public/cpp/data_decoder.h" @@ -55,8 +55,7 @@ virtual bool Watches(const GURL& url) const; // Collects device trust signals and returns them via `callback`. - void GetSignals( - base::OnceCallback<void(std::unique_ptr<SignalsType>)> callback); + void GetSignals(base::OnceCallback<void(const base::Value::Dict)> callback); // Parses the `challenge` response and returns it via a `callback`. void ParseJsonChallenge(const std::string& challenge, @@ -71,7 +70,7 @@ const std::string& serialized_signed_challenge); void OnSignalsCollected(const std::string& challenge, AttestationCallback callback, - std::unique_ptr<SignalsType> signals); + base::Value::Dict signals); std::unique_ptr<AttestationService> attestation_service_; std::unique_ptr<SignalsService> signals_service_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc index 3b257a3..442b2a5 100644 --- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.h" #include "chrome/browser/enterprise/connectors/device_trust/device_trust_features.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/mock_signals_service.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/prefs/testing_pref_service.h" #include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h" #include "testing/gmock/include/gmock/gmock.h" @@ -152,22 +153,22 @@ std::string fake_device_id = "fake_device_id"; EXPECT_CALL(*mock_signals_service_, CollectSignals(_)) - .WillOnce( - Invoke([&fake_device_id]( - base::OnceCallback<void(std::unique_ptr<SignalsType>)> - signals_callback) { - auto fake_signals = std::make_unique<SignalsType>(); - fake_signals->set_device_id(fake_device_id); - std::move(signals_callback).Run(std::move(fake_signals)); + .WillOnce(Invoke( + [&fake_device_id]( + base::OnceCallback<void(base::Value::Dict)> signals_callback) { + auto fake_signals = std::make_unique<base::Value::Dict>(); + fake_signals->Set(device_signals::names::kDeviceId, fake_device_id); + std::move(signals_callback).Run(std::move(*fake_signals)); })); EXPECT_CALL(*mock_attestation_service_, BuildChallengeResponseForVAChallenge( - GetSerializedSignedChallenge(kJsonChallenge), NotNull(), _)) + GetSerializedSignedChallenge(kJsonChallenge), _, _)) .WillOnce(Invoke([&fake_device_id](const std::string& challenge, - std::unique_ptr<SignalsType> signals, + const base::Value::Dict signals, AttestationCallback callback) { - EXPECT_EQ(signals->device_id(), fake_device_id); + EXPECT_EQ(signals.FindString(device_signals::names::kDeviceId)->c_str(), + fake_device_id); std::move(callback).Run(challenge); }));
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc index 7cc5bd66..b534eb0 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc
@@ -6,9 +6,11 @@ #include "base/check.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/metrics_utils.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/policy/proto/device_management_backend.pb.h" namespace enterprise_connectors { @@ -29,16 +31,17 @@ AshSignalsDecorator::~AshSignalsDecorator() = default; -void AshSignalsDecorator::Decorate(attestation::DeviceTrustSignals& signals, +void AshSignalsDecorator::Decorate(base::Value::Dict& signals, base::OnceClosure done_closure) { auto start_time = base::TimeTicks::Now(); // Directory API ID is the same thing as permanent device ID, which is generated by the server. - signals.set_device_id(browser_policy_connector_->GetDirectoryApiID()); - signals.set_obfuscated_customer_id( - browser_policy_connector_->GetObfuscatedCustomerID()); - signals.set_enrollment_domain( - browser_policy_connector_->GetEnterpriseDomainManager()); + signals.Set(device_signals::names::kDeviceId, + browser_policy_connector_->GetDirectoryApiID()); + signals.Set(device_signals::names::kObfuscatedCustomerId, + browser_policy_connector_->GetObfuscatedCustomerID()); + signals.Set(device_signals::names::kEnrollmentDomain, + browser_policy_connector_->GetEnterpriseDomainManager()); LogSignalsCollectionLatency(kLatencyHistogramVariant, start_time);
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.h b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.h index 5d8b3c9..8e40fb00 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.h
@@ -7,6 +7,8 @@ #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" +#include "base/values.h" + namespace policy { class BrowserPolicyConnectorAsh; } // namespace policy @@ -21,7 +23,7 @@ ~AshSignalsDecorator() override; // SignalsDecorator: - void Decorate(attestation::DeviceTrustSignals& signals, + void Decorate(base::Value::Dict& signals, base::OnceClosure done_closure) override; private:
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/BUILD.gn index 2955c3830..ceb05bb7 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/BUILD.gn
@@ -9,6 +9,7 @@ deps = [ "//chrome/browser", "//chrome/browser/enterprise/connectors/device_trust/attestation/common/proto:attestation_ca_proto", + "//components/device_signals/core/common", "//components/enterprise:test_support", "//components/policy/core/common:test_support", "//components/policy/proto",
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.cc index 063e423..d0c7e5e 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.cc
@@ -8,9 +8,11 @@ #include "base/check.h" #include "base/task/thread_pool.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/metrics_utils.h" #include "chrome/browser/enterprise/signals/device_info_fetcher.h" #include "chrome/browser/enterprise/signals/signals_common.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/enterprise/browser/controller/browser_dm_token_storage.h" #include "components/policy/core/common/cloud/cloud_policy_store.h" #include "components/policy/proto/device_management_backend.pb.h" @@ -36,18 +38,20 @@ BrowserSignalsDecorator::~BrowserSignalsDecorator() = default; -void BrowserSignalsDecorator::Decorate(DeviceTrustSignals& signals, +void BrowserSignalsDecorator::Decorate(base::Value::Dict& signals, base::OnceClosure done_closure) { auto start_time = base::TimeTicks::Now(); - signals.set_device_id(dm_token_storage_->RetrieveClientId()); + signals.Set(device_signals::names::kDeviceId, + dm_token_storage_->RetrieveClientId()); if (cloud_policy_store_->has_policy()) { const auto* policy = cloud_policy_store_->policy(); - signals.set_obfuscated_customer_id(policy->obfuscated_customer_id()); - signals.set_enrollment_domain(policy->has_managed_by() - ? policy->managed_by() - : policy->display_domain()); + signals.Set(device_signals::names::kObfuscatedCustomerId, + policy->obfuscated_customer_id()); + signals.Set(device_signals::names::kEnrollmentDomain, + policy->has_managed_by() ? policy->managed_by() + : policy->display_domain()); } if (cache_initialized_) { @@ -67,7 +71,7 @@ } void BrowserSignalsDecorator::OnDeviceInfoFetched( - DeviceTrustSignals& signals, + base::Value::Dict& signals, base::TimeTicks start_time, base::OnceClosure done_closure, const enterprise_signals::DeviceInfo& device_info) { @@ -83,14 +87,16 @@ std::move(done_closure).Run(); } -void BrowserSignalsDecorator::UpdateFromCache(DeviceTrustSignals& signals) { +void BrowserSignalsDecorator::UpdateFromCache(base::Value::Dict& signals) { DCHECK(cache_initialized_); if (cached_serial_number_) { - signals.set_serial_number(cached_serial_number_.value()); + signals.Set(device_signals::names::kSerialNumber, + cached_serial_number_.value()); } if (cached_is_disk_encrypted_.has_value()) { - signals.set_is_disk_encrypted(cached_is_disk_encrypted_.value()); + signals.Set(device_signals::names::kIsDiskEncrypted, + cached_is_disk_encrypted_.value()); } }
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.h b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.h index cdc71b36..75881a5 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator.h
@@ -10,6 +10,7 @@ #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -32,16 +33,16 @@ ~BrowserSignalsDecorator() override; // SignalsDecorator: - void Decorate(DeviceTrustSignals& signals, + void Decorate(base::Value::Dict& signals, base::OnceClosure done_closure) override; private: - void OnDeviceInfoFetched(DeviceTrustSignals& signals, + void OnDeviceInfoFetched(base::Value::Dict& signals, base::TimeTicks start_time, base::OnceClosure done_closure, const enterprise_signals::DeviceInfo& device_info); - void UpdateFromCache(DeviceTrustSignals& signals); + void UpdateFromCache(base::Value::Dict& signals); policy::BrowserDMTokenStorage* const dm_token_storage_; policy::CloudPolicyStore* const cloud_policy_store_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc index 3ded0a6..8fc054a 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/browser/browser_signals_decorator_unittest.cc
@@ -8,7 +8,9 @@ #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" +#include "base/values.h" #include "chrome/browser/enterprise/signals/device_info_fetcher.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/enterprise/browser/controller/fake_browser_dm_token_storage.h" #include "components/policy/core/common/cloud/mock_cloud_policy_store.h" #include "components/policy/proto/device_management_backend.pb.h" @@ -51,10 +53,13 @@ std::move(policy_data)); } - void ValidateStaticSignals(const DeviceTrustSignals& signals) { - EXPECT_EQ(signals.device_id(), kFakeDeviceId); - EXPECT_EQ(signals.serial_number(), "twirlchange"); - EXPECT_EQ(signals.is_disk_encrypted(), false); + void ValidateStaticSignals(const base::Value::Dict& signals) { + EXPECT_EQ(*signals.FindString(device_signals::names::kDeviceId), + kFakeDeviceId); + EXPECT_EQ(*signals.FindString(device_signals::names::kSerialNumber), + "twirlchange"); + EXPECT_EQ(*signals.FindBool(device_signals::names::kIsDiskEncrypted), + false); } base::test::TaskEnvironment task_environment_; @@ -69,28 +74,32 @@ base::RunLoop run_loop; - DeviceTrustSignals signals; + base::Value::Dict signals; decorator_->Decorate(signals, run_loop.QuitClosure()); run_loop.Run(); ValidateStaticSignals(signals); - EXPECT_EQ(kFakeCustomerId, signals.obfuscated_customer_id()); - EXPECT_EQ(kFakeEnrollmentDomain, signals.enrollment_domain()); + + EXPECT_EQ(kFakeCustomerId, + *signals.FindString(device_signals::names::kObfuscatedCustomerId)); + EXPECT_EQ(kFakeEnrollmentDomain, + *signals.FindString(device_signals::names::kEnrollmentDomain)); histogram_tester_.ExpectTotalCount(kLatencyHistogram, 1); histogram_tester_.ExpectTotalCount(kCachedLatencyHistogram, 0); // Running a second time will exercise the caching code. base::RunLoop second_run_loop; - DeviceTrustSignals second_signals; + base::Value::Dict second_signals; decorator_->Decorate(second_signals, second_run_loop.QuitClosure()); second_run_loop.Run(); - EXPECT_EQ(signals.has_serial_number(), second_signals.has_serial_number()); - EXPECT_EQ(signals.has_is_disk_encrypted(), - second_signals.has_is_disk_encrypted()); + EXPECT_EQ(*signals.FindString(device_signals::names::kSerialNumber), + *second_signals.FindString(device_signals::names::kSerialNumber)); + EXPECT_EQ(*signals.FindBool(device_signals::names::kIsDiskEncrypted), + *second_signals.FindBool(device_signals::names::kIsDiskEncrypted)); histogram_tester_.ExpectTotalCount(kLatencyHistogram, 1); histogram_tester_.ExpectTotalCount(kCachedLatencyHistogram, 1); @@ -99,14 +108,14 @@ TEST_F(BrowserSignalsDecoratorTest, Decorate_WithoutPolicyData) { base::RunLoop run_loop; - DeviceTrustSignals signals; + base::Value::Dict signals; decorator_->Decorate(signals, run_loop.QuitClosure()); run_loop.Run(); ValidateStaticSignals(signals); - EXPECT_FALSE(signals.has_obfuscated_customer_id()); - EXPECT_FALSE(signals.has_enrollment_domain()); + EXPECT_FALSE(signals.contains(device_signals::names::kObfuscatedCustomerId)); + EXPECT_FALSE(signals.contains(device_signals::names::kEnrollmentDomain)); } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/BUILD.gn index 8bdf3fb5..1365c40 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/BUILD.gn
@@ -23,6 +23,7 @@ deps = [ "//chrome/browser/enterprise/signals:utils", + "//components/device_signals/core/common", "//components/policy/core/common", "//components/version_info", "//third_party/abseil-cpp:absl", @@ -55,6 +56,7 @@ "//chrome/browser/enterprise/connectors/device_trust/attestation/common:types", "//chrome/common:constants", "//components/component_updater", + "//components/device_signals/core/common", "//components/policy/content", "//components/policy/core/browser", "//components/prefs:test_support",
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.cc index af938379..61e6c54 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.cc
@@ -6,8 +6,10 @@ #include "base/bind.h" #include "base/callback.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/metrics_utils.h" #include "chrome/browser/enterprise/signals/signals_utils.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/policy/core/common/cloud/cloud_policy_util.h" #include "components/version_info/version_info.h" @@ -29,33 +31,35 @@ CommonSignalsDecorator::~CommonSignalsDecorator() = default; -void CommonSignalsDecorator::Decorate(SignalsType& signals, +void CommonSignalsDecorator::Decorate(base::Value::Dict& signals, base::OnceClosure done_closure) { auto start_time = base::TimeTicks::Now(); - - signals.set_os(policy::GetOSPlatform()); - signals.set_os_version(policy::GetOSVersion()); - signals.set_display_name(policy::GetDeviceName()); - signals.set_browser_version(version_info::GetVersionNumber()); + signals.Set(device_signals::names::kOs, policy::GetOSPlatform()); + signals.Set(device_signals::names::kOsVersion, policy::GetOSVersion()); + signals.Set(device_signals::names::kDisplayName, policy::GetDeviceName()); + signals.Set(device_signals::names::kBrowserVersion, + version_info::GetVersionNumber()); // Get signals from policy values. - signals.set_built_in_dns_client_enabled( + signals.Set( + device_signals::names::kBuiltInDnsClientEnabled, enterprise_signals::utils::GetBuiltInDnsClientEnabled(local_state_)); - signals.set_safe_browsing_protection_level(static_cast<int32_t>( - enterprise_signals::utils::GetSafeBrowsingProtectionLevel( - profile_prefs_))); - + signals.Set(device_signals::names::kSafeBrowsingProtectionLevel, + static_cast<int32_t>( + enterprise_signals::utils::GetSafeBrowsingProtectionLevel( + profile_prefs_))); absl::optional<bool> third_party_blocking_enabled = enterprise_signals::utils::GetThirdPartyBlockingEnabled(local_state_); if (third_party_blocking_enabled.has_value()) { - signals.set_third_party_blocking_enabled( - third_party_blocking_enabled.value()); + signals.Set(device_signals::names::kThirdPartyBlockingEnabled, + third_party_blocking_enabled.value()); } absl::optional<bool> chrome_cleanup_enabled = enterprise_signals::utils::GetChromeCleanupEnabled(local_state_); if (chrome_cleanup_enabled.has_value()) { - signals.set_chrome_cleanup_enabled(chrome_cleanup_enabled.value()); + signals.Set(device_signals::names::kChromeCleanupEnabled, + chrome_cleanup_enabled.value()); } absl::optional<safe_browsing::PasswordProtectionTrigger> @@ -63,7 +67,8 @@ enterprise_signals::utils::GetPasswordProtectionWarningTrigger( profile_prefs_); if (password_protection_warning_trigger.has_value()) { - signals.set_password_protection_warning_trigger( + signals.Set( + device_signals::names::kPasswordProtectionWarningTrigger, static_cast<int32_t>(password_protection_warning_trigger.value())); } @@ -83,7 +88,7 @@ } void CommonSignalsDecorator::OnHardwareInfoRetrieved( - SignalsType& signals, + base::Value::Dict& signals, base::TimeTicks start_time, base::OnceClosure done_closure, base::SysInfo::HardwareInfo hardware_info) { @@ -97,9 +102,11 @@ std::move(done_closure).Run(); } -void CommonSignalsDecorator::UpdateFromCache(SignalsType& signals) { - signals.set_device_model(cached_device_model_.value()); - signals.set_device_manufacturer(cached_device_manufacturer_.value()); +void CommonSignalsDecorator::UpdateFromCache(base::Value::Dict& signals) { + signals.Set(device_signals::names::kDeviceModel, + cached_device_model_.value()); + signals.Set(device_signals::names::kDeviceManufacturer, + cached_device_manufacturer_.value()); } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.h b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.h index a239d77e..7d06582a 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator.h
@@ -9,6 +9,7 @@ #include "base/system/sys_info.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -23,15 +24,16 @@ ~CommonSignalsDecorator() override; // SignalsDecorator: - void Decorate(SignalsType& signals, base::OnceClosure done_closure) override; + void Decorate(base::Value::Dict& signals, + base::OnceClosure done_closure) override; private: - void OnHardwareInfoRetrieved(SignalsType& signals, + void OnHardwareInfoRetrieved(base::Value::Dict& signals, base::TimeTicks start_time, base::OnceClosure done_closure, base::SysInfo::HardwareInfo hardware_info); - void UpdateFromCache(SignalsType& signals); + void UpdateFromCache(base::Value::Dict& signals); PrefService* local_state_; PrefService* profile_prefs_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator_unittest.cc index ef4360c2..aae9d0b 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/common_signals_decorator_unittest.cc
@@ -8,10 +8,11 @@ #include "base/run_loop.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" +#include "base/values.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" #include "chrome/common/pref_names.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/prefs/testing_pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "components/sync_preferences/testing_pref_service_syncable.h" @@ -72,30 +73,34 @@ base::RunLoop run_loop; - SignalsType signals; + base::Value::Dict signals; decorator_->Decorate(signals, run_loop.QuitClosure()); run_loop.Run(); - EXPECT_TRUE(signals.has_os()); - EXPECT_TRUE(signals.has_os_version()); - EXPECT_TRUE(signals.has_device_model()); - EXPECT_TRUE(signals.has_device_manufacturer()); - EXPECT_TRUE(signals.has_display_name()); - EXPECT_TRUE(signals.has_browser_version()); - EXPECT_TRUE(signals.has_built_in_dns_client_enabled()); - EXPECT_TRUE(signals.has_safe_browsing_protection_level()); - EXPECT_TRUE(signals.has_password_protection_warning_trigger()); + EXPECT_TRUE(signals.contains(device_signals::names::kOsVersion)); + EXPECT_TRUE(signals.contains(device_signals::names::kDeviceModel)); + EXPECT_TRUE(signals.contains(device_signals::names::kDeviceManufacturer)); + EXPECT_TRUE(signals.contains(device_signals::names::kDisplayName)); + EXPECT_TRUE(signals.contains(device_signals::names::kBrowserVersion)); + EXPECT_TRUE( + signals.contains(device_signals::names::kBuiltInDnsClientEnabled)); + EXPECT_TRUE( + signals.contains(device_signals::names::kSafeBrowsingProtectionLevel)); + EXPECT_TRUE(signals.contains( + device_signals::names::kPasswordProtectionWarningTrigger)); #if BUILDFLAG(IS_WIN) - EXPECT_TRUE(signals.has_chrome_cleanup_enabled()); + EXPECT_TRUE(signals.contains(device_signals::names::kChromeCleanupEnabled)); #if BUILDFLAG(GOOGLE_CHROME_BRANDING) - EXPECT_TRUE(signals.has_third_party_blocking_enabled()); + EXPECT_TRUE( + signals.contains(device_signals::names::kThirdPartyBlockingEnabled)); #else // BUILDFLAG(GOOGLE_CHROME_BRANDING) - EXPECT_FALSE(signals.has_third_party_blocking_enabled()); + EXPECT_FALSE( + signals.contains(device_signals::names::kThirdPartyBlockingEnabled)); #endif // BUILDFLAG(GOOGLE_CHROME_BRANDING) #else // BUILDFLAG(IS_WIN) - EXPECT_FALSE(signals.has_chrome_cleanup_enabled()); + EXPECT_FALSE(signals.contains(device_signals::names::kChromeCleanupEnabled)); #endif // BUILDFLAG(IS_WIN) histogram_tester_.ExpectTotalCount(kLatencyHistogram, 1); @@ -103,13 +108,15 @@ // Run a second time to exercise the caching code. base::RunLoop second_run_loop; - SignalsType second_signals; + base::Value::Dict second_signals; decorator_->Decorate(second_signals, second_run_loop.QuitClosure()); second_run_loop.Run(); - EXPECT_EQ(signals.device_model(), second_signals.device_model()); - EXPECT_EQ(signals.device_manufacturer(), - second_signals.device_manufacturer()); + EXPECT_EQ(*signals.FindString(device_signals::names::kDeviceModel), + *second_signals.FindString(device_signals::names::kDeviceModel)); + EXPECT_EQ( + *signals.FindString(device_signals::names::kDeviceManufacturer), + *second_signals.FindString(device_signals::names::kDeviceManufacturer)); histogram_tester_.ExpectTotalCount(kLatencyHistogram, 1); histogram_tester_.ExpectTotalCount(kCachedLatencyHistogram, 1);
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/mock_signals_decorator.h b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/mock_signals_decorator.h index 07da30e4..49fe031 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/mock_signals_decorator.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/mock_signals_decorator.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_SIGNALS_DECORATORS_COMMON_MOCK_SIGNALS_DECORATOR_H_ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_SIGNALS_DECORATORS_COMMON_MOCK_SIGNALS_DECORATOR_H_ +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" #include "testing/gmock/include/gmock/gmock.h" @@ -16,7 +17,10 @@ MockSignalsDecorator(); ~MockSignalsDecorator() override; - MOCK_METHOD(void, Decorate, (SignalsType&, base::OnceClosure), (override)); + MOCK_METHOD(void, + Decorate, + (base::Value::Dict&, base::OnceClosure), + (override)); }; } // namespace test
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h index 696c233..96ae7f4 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h
@@ -6,7 +6,7 @@ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_SIGNALS_DECORATORS_COMMON_SIGNALS_DECORATOR_H_ #include "base/callback.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" +#include "base/values.h" namespace enterprise_connectors { @@ -18,7 +18,7 @@ // Asynchronously sets signals data on the `signals` proto properties and // invoked `done_closure` when done. - virtual void Decorate(SignalsType& signals, + virtual void Decorate(base::Value::Dict& signals, base::OnceClosure done_closure) = 0; };
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/BUILD.gn index 192e775..a28ad30 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/BUILD.gn
@@ -17,6 +17,7 @@ deps = [ "//base", "//chrome/browser/enterprise/signals:utils", + "//components/device_signals/core/common", "//components/policy/content", "//content/public/browser", ] @@ -31,6 +32,7 @@ "//base/test:test_support", "//chrome/browser/enterprise/connectors/device_trust/attestation/common:types", "//components/component_updater", + "//components/device_signals/core/common", "//components/policy/content", "//components/policy/core/browser", "//components/policy/core/common:common_constants",
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.cc index 4bf277a7b..b92181b 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.cc
@@ -6,9 +6,11 @@ #include "base/callback.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/metrics_utils.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" #include "chrome/browser/enterprise/signals/signals_utils.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/policy/content/policy_blocklist_service.h" #include "content/public/browser/site_isolation_policy.h" @@ -28,16 +30,14 @@ ContentSignalsDecorator::~ContentSignalsDecorator() = default; -void ContentSignalsDecorator::Decorate(SignalsType& signals, +void ContentSignalsDecorator::Decorate(base::Value::Dict& signals, base::OnceClosure done_closure) { auto start_time = base::TimeTicks::Now(); - - signals.set_remote_desktop_available( - enterprise_signals::utils::GetChromeRemoteDesktopAppBlocked( - policy_blocklist_service_)); - signals.set_site_isolation_enabled( - content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); - + signals.Set(device_signals::names::kRemoteDesktopAvailable, + enterprise_signals::utils::GetChromeRemoteDesktopAppBlocked( + policy_blocklist_service_)); + signals.Set(device_signals::names::kSiteIsolationEnabled, + content::SiteIsolationPolicy::UseDedicatedProcessesForAllSites()); LogSignalsCollectionLatency(kLatencyHistogramVariant, start_time); std::move(done_closure).Run();
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.h b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.h index 157cdca0..9ab0ed1 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_SIGNALS_DECORATORS_CONTENT_CONTENT_SIGNALS_DECORATOR_H_ #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_SIGNALS_DECORATORS_CONTENT_CONTENT_SIGNALS_DECORATOR_H_ +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" class PolicyBlocklistService; @@ -20,7 +21,8 @@ ~ContentSignalsDecorator() override; // SignalsDecorator: - void Decorate(SignalsType& signals, base::OnceClosure done_closure) override; + void Decorate(base::Value::Dict& signals, + base::OnceClosure done_closure) override; private: PolicyBlocklistService* policy_blocklist_service_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator_unittest.cc index 629e663e..2dcdfcd7 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/content/content_signals_decorator_unittest.cc
@@ -8,7 +8,8 @@ #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" +#include "base/values.h" +#include "components/device_signals/core/common/signals_constants.h" #include "components/policy/content/policy_blocklist_service.h" #include "components/policy/core/browser/url_blocklist_manager.h" #include "components/policy/core/common/policy_pref_names.h" @@ -49,11 +50,11 @@ base::OnceClosure closure = base::BindLambdaForTesting( [&callback_invoked]() { callback_invoked = true; }); - SignalsType signals; + base::Value::Dict signals; decorator_->Decorate(signals, std::move(closure)); - EXPECT_TRUE(signals.has_remote_desktop_available()); - EXPECT_TRUE(signals.has_site_isolation_enabled()); + EXPECT_TRUE(signals.contains(device_signals::names::kRemoteDesktopAvailable)); + EXPECT_TRUE(signals.contains(device_signals::names::kSiteIsolationEnabled)); EXPECT_TRUE(callback_invoked);
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service.h b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service.h index bb00cc7..95d8aad 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service.h
@@ -8,7 +8,7 @@ #include <memory> #include "base/callback.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" +#include "base/values.h" namespace enterprise_connectors { @@ -16,7 +16,7 @@ class SignalsService { public: using CollectSignalsCallback = - base::OnceCallback<void(std::unique_ptr<SignalsType>)>; + base::OnceCallback<void(const base::Value::Dict)>; virtual ~SignalsService() = default;
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.cc b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.cc index 2676ffb5..fe12d357 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.cc
@@ -10,7 +10,7 @@ #include "base/barrier_closure.h" #include "base/bind.h" #include "base/callback.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/metrics_utils.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" @@ -30,7 +30,7 @@ void SignalsServiceImpl::CollectSignals(CollectSignalsCallback callback) { auto start_time = base::TimeTicks::Now(); - auto signals = std::make_unique<SignalsType>(); + auto signals = std::make_unique<base::Value::Dict>(); auto* signals_ptr = signals.get(); auto barrier_closure = base::BarrierClosure( @@ -47,10 +47,15 @@ void SignalsServiceImpl::OnSignalsDecorated( CollectSignalsCallback callback, base::TimeTicks start_time, - std::unique_ptr<SignalsType> signals) { + std::unique_ptr<base::Value::Dict> signals) { LogSignalsCollectionLatency(kLatencyHistogramVariant, start_time); - std::move(callback).Run(std::move(signals)); + if (!signals) { + base::Value::Dict empty_dictionary; + std::move(callback).Run(std::move(empty_dictionary)); + } else { + std::move(callback).Run(std::move(*signals)); + } } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.h b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.h index 07394c0..ee7cb21 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.h +++ b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl.h
@@ -10,6 +10,7 @@ #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/signals_service.h" namespace enterprise_connectors { @@ -32,7 +33,7 @@ private: void OnSignalsDecorated(CollectSignalsCallback callback, base::TimeTicks start_time, - std::unique_ptr<SignalsType> signals); + std::unique_ptr<base::Value::Dict> signals); std::vector<std::unique_ptr<SignalsDecorator>> signals_decorators_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl_unittest.cc index e4b223c6..ee7734c 100644 --- a/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl_unittest.cc +++ b/chrome/browser/enterprise/connectors/device_trust/signals/signals_service_impl_unittest.cc
@@ -12,8 +12,10 @@ #include "base/callback.h" #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "base/values.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/mock_signals_decorator.h" #include "chrome/browser/enterprise/connectors/device_trust/signals/decorators/common/signals_decorator.h" +#include "components/device_signals/core/common/signals_constants.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -35,9 +37,10 @@ std::unique_ptr<MockSignalsDecorator> first_decorator = std::make_unique<MockSignalsDecorator>(); EXPECT_CALL(*first_decorator.get(), Decorate(_, _)) - .WillOnce([&fake_obfuscated_customer_id](SignalsType& signals, + .WillOnce([&fake_obfuscated_customer_id](base::Value::Dict& signals, base::OnceClosure done_closure) { - signals.set_obfuscated_customer_id(fake_obfuscated_customer_id); + signals.Set(device_signals::names::kObfuscatedCustomerId, + fake_obfuscated_customer_id); std::move(done_closure).Run(); }); @@ -45,9 +48,9 @@ std::unique_ptr<MockSignalsDecorator> second_decorator = std::make_unique<MockSignalsDecorator>(); EXPECT_CALL(*second_decorator.get(), Decorate(_, _)) - .WillOnce([&fake_device_id](SignalsType& signals, + .WillOnce([&fake_device_id](base::Value::Dict& signals, base::OnceClosure done_closure) { - signals.set_device_id(fake_device_id); + signals.Set(device_signals::names::kDeviceId, fake_device_id); std::move(done_closure).Run(); }); @@ -59,10 +62,13 @@ bool callback_called = false; auto callback = - base::BindLambdaForTesting([&](std::unique_ptr<SignalsType> signals) { - EXPECT_EQ(signals->obfuscated_customer_id(), - fake_obfuscated_customer_id); - EXPECT_EQ(signals->device_id(), fake_device_id); + base::BindLambdaForTesting([&](const base::Value::Dict signals) { + EXPECT_EQ( + signals.FindString(device_signals::names::kObfuscatedCustomerId) + ->c_str(), + fake_obfuscated_customer_id); + EXPECT_EQ(signals.FindString(device_signals::names::kDeviceId)->c_str(), + fake_device_id); callback_called = true; });
diff --git a/chrome/browser/enterprise/reporting/policy_info_unittest.cc b/chrome/browser/enterprise/reporting/policy_info_unittest.cc index a917fa94..d1f0204 100644 --- a/chrome/browser/enterprise/reporting/policy_info_unittest.cc +++ b/chrome/browser/enterprise/reporting/policy_info_unittest.cc
@@ -113,7 +113,7 @@ policy::DictionaryPolicyConversions(std::move(client)) .EnableConvertTypes(false) .EnablePrettyPrint(false) - .ToValue(), + .ToValueDict(), &profile_info); EXPECT_EQ(2, profile_info.chrome_policies_size()); @@ -162,7 +162,7 @@ policy::DictionaryPolicyConversions(std::move(client)) .EnableConvertTypes(false) .EnablePrettyPrint(false) - .ToValue(), + .ToValueDict(), &profile_info); // The second extension is not in the report because it has no policy. EXPECT_EQ(1, profile_info.extension_policies_size());
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 7c192b7..08b86e07 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -55,8 +55,8 @@ }, { "name": "adaptive-button-in-top-toolbar-customization", - "owners": [ "bttk", "chrome-segmentation-platform@google.com" ], - "expiry_milestone": 102 + "owners": [ "shaktisahu", "chrome-segmentation-platform@google.com" ], + "expiry_milestone": 107 }, { "name": "add-passwords-in-settings", @@ -590,11 +590,6 @@ "expiry_milestone": 110 }, { - "name": "bluetooth-advertisement-monitoring", - "owners": [ "cvandermerwe@google.com", "hansenmichael@google.com", "chromeos-cross-device-eng@google.com" ], - "expiry_milestone": 98 - }, - { "name": "bluetooth-bond-on-demand", "owners": [ "cmumford@chromium.org", "deviceapi-team@google.com" ], "expiry_milestone": 100 @@ -4229,6 +4224,11 @@ "expiry_milestone": 105 }, { + "name": "new-overflow-menu-cbd-action", + "owners": [ "rkgibson@google.com", "bling-flags@google.com" ], + "expiry_milestone": 109 + }, + { "name": "new-overflow-menu-settings-action", "owners": [ "rkgibson@google.com", "bling-flags@google.com" ], "expiry_milestone": 109
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 24077d8..bf41a98 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -4471,9 +4471,7 @@ const char kFastPairName[] = "Enable Fast Pair"; const char kFastPairDescription[] = "Enables Google Fast Pair service which uses BLE to discover supported " - "nearby Bluetooth devices and surfaces a notification for quick pairing. " - "Use along with #bluetooth-advertisement-monitoring to allow background " - "scanning."; + "nearby Bluetooth devices and surfaces a notification for quick pairing."; const char kFastPairLowPowerName[] = "Enable Fast Pair Low Power mode"; const char kFastPairLowPowerDescription[] = @@ -5551,13 +5549,6 @@ "chrome://flags/#enable-migrate-default-chrome-app-to-web-apps-non-gsuite) " "are ignored for managed ChromeOS users unless this feature is enabled."; -const char kBluetoothAdvertisementMonitoringName[] = - "Bluetooth Advertisement Monitoring"; -const char kBluetoothAdvertisementMonitoringDescription[] = - "Advertisement monitoring allows applications to register low energy " - "scanners that filter low energy advertisements in a power-efficient " - "manner."; - const char kCrOSDspBasedAecAllowedName[] = "Allow CRAS to use a DSP-based AEC if available"; const char kCrOSDspBasedAecAllowedDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index e0470e1..34f30e9 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -3183,9 +3183,6 @@ extern const char kAllowDefaultWebAppMigrationForChromeOsManagedUsersDescription[]; -extern const char kBluetoothAdvertisementMonitoringName[]; -extern const char kBluetoothAdvertisementMonitoringDescription[]; - extern const char kCrOSDspBasedAecAllowedName[]; extern const char kCrOSDspBasedAecAllowedDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index b67ab67..e4f2a1c 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -578,7 +578,7 @@ "ContextualSearchMlTapSuppression", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature KContextualSearchNewSettings{ - "ContextualSearchNewSettings", base::FEATURE_ENABLED_BY_DEFAULT}; + "ContextualSearchNewSettings", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kContextualSearchTapDisableOverride{ "ContextualSearchTapDisableOverride", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -588,7 +588,7 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kContextualSearchTranslations{ - "ContextualSearchTranslations", base::FEATURE_ENABLED_BY_DEFAULT}; + "ContextualSearchTranslations", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kContextualTriggersSelectionHandles{ "ContextualTriggersSelectionHandles", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/chrome/browser/lacros/browser_service_lacros.cc b/chrome/browser/lacros/browser_service_lacros.cc index 151738c..80f75c5 100644 --- a/chrome/browser/lacros/browser_service_lacros.cc +++ b/chrome/browser/lacros/browser_service_lacros.cc
@@ -681,7 +681,8 @@ void BrowserServiceLacros::UpdateComponentPolicy( policy::ComponentPolicyMap policy) { - // TODO(crbug.com/1284279): Process received data in Lacros. + chromeos::LacrosService::Get()->NotifyComponentPolicyUpdated( + std::move(policy)); } void BrowserServiceLacros::OnBrowserAdded(Browser* browser) {
diff --git a/chrome/browser/lacros/component_policy_lacros_browsertest.cc b/chrome/browser/lacros/component_policy_lacros_browsertest.cc new file mode 100644 index 0000000..8c306787 --- /dev/null +++ b/chrome/browser/lacros/component_policy_lacros_browsertest.cc
@@ -0,0 +1,167 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/callback.h" +#include "base/json/json_reader.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/policy/chrome_browser_policy_connector.h" +#include "chrome/browser/policy/profile_policy_connector.h" +#include "chrome/browser/policy/schema_registry_service.h" +#include "chrome/browser/profiles/profile_impl.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/lacros/lacros_service.h" +#include "components/policy/core/common/policy_loader_lacros.h" +#include "content/public/test/browser_test.h" +#include "testing/gmock/include/gmock/gmock.h" + +const char kTestExtension[] = "super_secret_component_id"; +constexpr char kValidationSchemaJson[] = R"( +{ + "type": "object", + "properties": { + "force_allowed_client_app_ids": { + "title": "Force allowed client App identifiers.", + "description": "List of client App identifiers", + "type": "array", + "items": { + "type": "string", + "minLength": 32, + "maxLength": 32 + } + } + } +} +)"; + +constexpr char kTestPolicy1[] = R"( + {"force_allowed_client_app_ids": + {"Value":["haeblkpifdemlfnkogkipmghfcbonief"]}})"; +constexpr char kTestPolicy2[] = R"( + {"force_allowed_client_app_ids":{"Value": + ["haeblkpifdemlfnkogkipmghfcbonie1","haeblkpifdemlfnkogkipmghfcbonie2"]}})"; + +int map_size_test1 = 1, map_size_test2 = 1, list_size_test1 = 1, + list_size_test2 = 2; + +const policy::PolicyNamespace ns(policy::POLICY_DOMAIN_EXTENSIONS, + kTestExtension); + +class LacrosServiceObserverForTest : public chromeos::LacrosService::Observer { + public: + LacrosServiceObserverForTest(base::OnceClosure run_closure, + bool skip_initial_notification) { + run_closure_ = std::move(run_closure); + skip_initial_notification_ = skip_initial_notification; + } + + void OnComponentPolicyUpdated( + const policy::ComponentPolicyMap& policy) override { + if (skip_initial_notification_) { + skip_initial_notification_ = false; + return; + } + std::move(run_closure_).Run(); + } + + base::OnceClosure run_closure_; + bool skip_initial_notification_; +}; + +class ComponentPolicyLacrosBrowserTest : public InProcessBrowserTest { + public: + void SetUp() override { + base::JSONReader::ValueWithError value_with_error = + base::JSONReader::ReadAndReturnValueWithError( + std::string(kTestPolicy1), + base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); + ASSERT_TRUE(value_with_error.value); + base::Value json = std::move(value_with_error.value.value()); + ASSERT_TRUE(json.is_dict()); + + policy::ComponentPolicyMap component_policy; + component_policy[ns] = std::move(json); + crosapi::mojom::BrowserInitParamsPtr params = + crosapi::mojom::BrowserInitParams::New(); + params->device_account_component_policy = std::move(component_policy); + chromeos::BrowserInitParams::SetInitParamsForTests(std::move(params)); + InProcessBrowserTest::SetUp(); + } + + void VerifyMap(int map_size, int list_size) { + auto* profile = ProfileManager::GetPrimaryUserProfile(); + auto* policy_connector = profile->GetProfilePolicyConnector(); + + const policy::PolicyMap& map = + policy_connector->policy_service()->GetPolicies(ns); + EXPECT_THAT(map, testing::SizeIs(map_size)); + const policy::PolicyMap::Entry* entry = + map.Get("force_allowed_client_app_ids"); + ASSERT_TRUE(entry); + const base::Value* value = entry->value(base::Value::Type::LIST); + ASSERT_TRUE(value); + const base::Value::List& list = value->GetList(); + EXPECT_THAT(list, testing::SizeIs(list_size)); + } + + std::unique_ptr<LacrosServiceObserverForTest> service_for_test_; +}; + +// Test to check the initial component policy received from Ash. +IN_PROC_BROWSER_TEST_F(ComponentPolicyLacrosBrowserTest, + BasicInitParamsSuccess) { + auto* profile = ProfileManager::GetPrimaryUserProfile(); + + auto* loader = g_browser_process->browser_policy_connector() + ->device_account_policy_loader(); + // The per_profile:False loader should have no component policy. + ASSERT_FALSE(loader->component_policy()); + + auto* registry = profile->GetPolicySchemaRegistryService()->registry(); + std::string error; + registry->RegisterComponent( + ns, policy::Schema::Parse(kValidationSchemaJson, &error)); + ASSERT_TRUE(error.empty()); + registry->SetDomainReady(ns.domain); + base::RunLoop run_loop; + service_for_test_ = std::make_unique<LacrosServiceObserverForTest>( + run_loop.QuitClosure(), false); + chromeos::LacrosService::Get()->AddObserver(service_for_test_.get()); + run_loop.RunUntilIdle(); + VerifyMap(map_size_test1, list_size_test1); + chromeos::LacrosService::Get()->RemoveObserver(service_for_test_.get()); +} + +// Test to check the initial component policy received from Ash. +IN_PROC_BROWSER_TEST_F(ComponentPolicyLacrosBrowserTest, BasicUpdateSuccess) { + auto* profile = ProfileManager::GetPrimaryUserProfile(); + + auto* registry = profile->GetPolicySchemaRegistryService()->registry(); + std::string error; + registry->RegisterComponent( + ns, policy::Schema::Parse(kValidationSchemaJson, &error)); + ASSERT_TRUE(error.empty()); + registry->SetDomainReady(ns.domain); + auto* lacros_service = chromeos::LacrosService::Get(); + + base::RunLoop run_loop; + service_for_test_ = std::make_unique<LacrosServiceObserverForTest>( + run_loop.QuitClosure(), /*skip_initial_notification=*/true); + lacros_service->AddObserver(service_for_test_.get()); + + policy::ComponentPolicyMap component_policy; + base::JSONReader::ValueWithError value_with_error = + base::JSONReader::ReadAndReturnValueWithError( + std::string(kTestPolicy2), + base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS); + ASSERT_TRUE(value_with_error.value); + base::Value json = std::move(value_with_error.value.value()); + ASSERT_TRUE(json.is_dict()); + component_policy[ns] = std::move(json); + + lacros_service->NotifyComponentPolicyUpdated(std::move(component_policy)); + run_loop.RunUntilIdle(); + VerifyMap(map_size_test2, list_size_test2); + chromeos::LacrosService::Get()->RemoveObserver(service_for_test_.get()); +}
diff --git a/chrome/browser/loading_modal/android/BUILD.gn b/chrome/browser/loading_modal/android/BUILD.gn index 896c7ff..5bc8a918 100644 --- a/chrome/browser/loading_modal/android/BUILD.gn +++ b/chrome/browser/loading_modal/android/BUILD.gn
@@ -8,7 +8,6 @@ deps = [ ":java_resources", "//base:base_java", - "//base:jni_java", "//components/browser_ui/modaldialog/android:java", "//third_party/androidx:androidx_annotation_annotation_java", "//ui/android:ui_java",
diff --git a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc index b785352e..1dcc7f4 100644 --- a/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc +++ b/chrome/browser/media/webrtc/webrtc_getdisplaymedia_browsertest.cc
@@ -875,9 +875,6 @@ class GetDisplayMediaChangeSourceBrowserTest : public WebRtcTestBase { public: void SetUpInProcessBrowserTestFixture() override { - feature_list_.InitWithFeatures( - {media::kShareThisTabInsteadButtonGetDisplayMedia}, {}); - WebRtcTestBase::SetUpInProcessBrowserTestFixture(); DetectErrorsInJavaScript(); @@ -892,9 +889,6 @@ command_line->AppendSwitchASCII( switches::kAutoSelectTabCaptureSourceByTitle, kCapturedTabTitle); } - - private: - base::test::ScopedFeatureList feature_list_; }; IN_PROC_BROWSER_TEST_F(GetDisplayMediaChangeSourceBrowserTest, ChangeSource) {
diff --git a/chrome/browser/metrics/power/power_metrics.cc b/chrome/browser/metrics/power/power_metrics.cc index 22e7445..3504f03 100644 --- a/chrome/browser/metrics/power/power_metrics.cc +++ b/chrome/browser/metrics/power/power_metrics.cc
@@ -122,16 +122,13 @@ #if BUILDFLAG(IS_MAC) void ReportShortIntervalHistograms( const char* scenario_suffix, - absl::optional<power_metrics::CoalitionResourceUsageRate> + const power_metrics::CoalitionResourceUsageRate& coalition_resource_usage_rate) { - if (!coalition_resource_usage_rate.has_value()) - return; - for (const char* suffix : {"", scenario_suffix}) { UsageTimeHistogram( base::StrCat( {"PerformanceMonitor.ResourceCoalition.CPUTime2_10sec", suffix}), - coalition_resource_usage_rate->cpu_time_per_second, kMaxCPUProportion); + coalition_resource_usage_rate.cpu_time_per_second, kMaxCPUProportion); } }
diff --git a/chrome/browser/metrics/power/power_metrics.h b/chrome/browser/metrics/power/power_metrics.h index 70acdc5..4deacfd 100644 --- a/chrome/browser/metrics/power/power_metrics.h +++ b/chrome/browser/metrics/power/power_metrics.h
@@ -59,7 +59,7 @@ #if BUILDFLAG(IS_MAC) void ReportShortIntervalHistograms( const char* scenario_suffix, - absl::optional<power_metrics::CoalitionResourceUsageRate> + const power_metrics::CoalitionResourceUsageRate& coalition_resource_usage_rate); // Report resource coalition metrics to histograms with |suffixes|.
diff --git a/chrome/browser/metrics/power/power_metrics_reporter.cc b/chrome/browser/metrics/power/power_metrics_reporter.cc index 61534a02..5b3d0d8 100644 --- a/chrome/browser/metrics/power/power_metrics_reporter.cc +++ b/chrome/browser/metrics/power/power_metrics_reporter.cc
@@ -164,11 +164,8 @@ #if BUILDFLAG(IS_MAC) void PowerMetricsReporter::MaybeEmitHighCPUTraceEvent( const ScenarioParams& short_interval_scenario_params, - absl::optional<CoalitionResourceUsageRate> coalition_resource_usage_rate) { - if (!coalition_resource_usage_rate.has_value()) - return; - - if (coalition_resource_usage_rate->cpu_time_per_second >= + const CoalitionResourceUsageRate& coalition_resource_usage_rate) { + if (coalition_resource_usage_rate.cpu_time_per_second >= short_interval_scenario_params.short_interval_cpu_threshold) { const base::TimeTicks now = base::TimeTicks::Now(); @@ -248,10 +245,13 @@ const ScenarioParams short_interval_scenario_params = GetShortIntervalScenarioParams(short_interval_data, long_interval_data); - ReportShortIntervalHistograms(short_interval_scenario_params.histogram_suffix, - short_interval_resource_usage_rate); - MaybeEmitHighCPUTraceEvent(short_interval_scenario_params, - short_interval_resource_usage_rate); + if (short_interval_resource_usage_rate.has_value()) { + ReportShortIntervalHistograms( + short_interval_scenario_params.histogram_suffix, + short_interval_resource_usage_rate.value()); + MaybeEmitHighCPUTraceEvent(short_interval_scenario_params, + short_interval_resource_usage_rate.value()); + } #endif // BUILDFLAG(IS_MAC) if (on_battery_sampled_for_testing_)
diff --git a/chrome/browser/metrics/power/power_metrics_reporter.h b/chrome/browser/metrics/power/power_metrics_reporter.h index 6d768e5..36b8ec0 100644 --- a/chrome/browser/metrics/power/power_metrics_reporter.h +++ b/chrome/browser/metrics/power/power_metrics_reporter.h
@@ -101,7 +101,7 @@ // Emit trace event when CPU usage is high for 10 secondes or more. void MaybeEmitHighCPUTraceEvent( const ScenarioParams& short_interval_scenario_params, - absl::optional<CoalitionResourceUsageRate> coalition_resource_usage_rate); + const CoalitionResourceUsageRate& coalition_resource_usage_rate); #endif // BUILDFLAG(IS_MAC) private:
diff --git a/chrome/browser/nearby_sharing/nearby_share_settings.cc b/chrome/browser/nearby_sharing/nearby_share_settings.cc index 6e44292e..d00657e 100644 --- a/chrome/browser/nearby_sharing/nearby_share_settings.cc +++ b/chrome/browser/nearby_sharing/nearby_share_settings.cc
@@ -247,8 +247,7 @@ } if (base::FeatureList::IsEnabled( - features::kNearbySharingBackgroundScanning) && - chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) { + features::kNearbySharingBackgroundScanning)) { ProcessFastInitiationNotificationParentPrefChanged(enabled); } }
diff --git a/chrome/browser/nearby_sharing/nearby_share_settings_unittest.cc b/chrome/browser/nearby_sharing/nearby_share_settings_unittest.cc index 24ae42b..a4b175f 100644 --- a/chrome/browser/nearby_sharing/nearby_share_settings_unittest.cc +++ b/chrome/browser/nearby_sharing/nearby_share_settings_unittest.cc
@@ -88,9 +88,7 @@ NearbyShareSettingsTest() : local_device_data_manager_(kDefaultDeviceName) { scoped_feature_list_.InitWithFeatures( /*enabled_features=*/{features::kNearbySharing, - features::kNearbySharingBackgroundScanning, - chromeos::features:: - kBluetoothAdvertisementMonitoring}, + features::kNearbySharingBackgroundScanning}, /*disabled_features=*/{}); RegisterNearbySharingPrefs(pref_service_.registry());
diff --git a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc index 832c4a9..eddea976 100644 --- a/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc +++ b/chrome/browser/nearby_sharing/nearby_sharing_service_impl.cc
@@ -113,8 +113,7 @@ bool IsBackgroundScanningFeatureEnabled() { return base::FeatureList::IsEnabled( - features::kNearbySharingBackgroundScanning) && - chromeos::features::IsBluetoothAdvertisementMonitoringEnabled(); + features::kNearbySharingBackgroundScanning); } std::string ReceiveSurfaceStateToString(
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 264af149..3608f024 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -766,6 +766,15 @@ { key::kSensorsBlockedForUrls, prefs::kManagedSensorsBlockedForUrls, base::Value::Type::LIST }, + { key::kDefaultClipboardSetting, + prefs::kManagedDefaultClipboardSetting, + base::Value::Type::LIST }, + { key::kClipboardAllowedForUrls, + prefs::kManagedClipboardAllowedForUrls, + base::Value::Type::LIST }, + { key::kClipboardBlockedForUrls, + prefs::kManagedClipboardBlockedForUrls, + base::Value::Type::LIST }, // First run import. { key::kImportBookmarks,
diff --git a/chrome/browser/policy/profile_policy_connector.cc b/chrome/browser/policy/profile_policy_connector.cc index 0c6bb44..b429fd5 100644 --- a/chrome/browser/policy/profile_policy_connector.cc +++ b/chrome/browser/policy/profile_policy_connector.cc
@@ -194,8 +194,15 @@ policy_providers_.push_back(connector->command_line_policy_provider()); #endif - if (configuration_policy_provider) + if (configuration_policy_provider) { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + AppendPolicyProviderWithSchemaTracking(configuration_policy_provider, + schema_registry); + configuration_policy_provider_ = wrapped_policy_providers_.back().get(); +#else policy_providers_.push_back(configuration_policy_provider); +#endif + } #if BUILDFLAG(IS_CHROMEOS_ASH) if (!user) {
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index c826e0b6..fad55d4 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -376,7 +376,6 @@ #include "chrome/browser/ash/system/automatic_reboot_manager.h" #include "chrome/browser/ash/system/input_device_settings.h" #include "chrome/browser/ash/web_applications/help_app/help_app_notification_controller.h" -#include "chrome/browser/ash/web_applications/personalization_app/personalization_app_prefs.h" #include "chrome/browser/chromeos/extensions/login_screen/login/prefs.h" #include "chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos.h" #include "chrome/browser/extensions/extension_assets_manager_chromeos.h" @@ -1433,7 +1432,6 @@ chromeos::NetworkMetadataStore::RegisterPrefs(registry); ash::ReleaseNotesStorage::RegisterProfilePrefs(registry); ash::HelpAppNotificationController::RegisterProfilePrefs(registry); - ash::personalization_app::prefs::RegisterProfilePrefs(registry); ash::quick_unlock::FingerprintStorage::RegisterProfilePrefs(registry); ash::quick_unlock::PinStoragePrefs::RegisterProfilePrefs(registry); ash::Preferences::RegisterProfilePrefs(registry);
diff --git a/chrome/browser/resources/bookmarks/folder_node.ts b/chrome/browser/resources/bookmarks/folder_node.ts index e8b93e9..7815e96 100644 --- a/chrome/browser/resources/bookmarks/folder_node.ts +++ b/chrome/browser/resources/bookmarks/folder_node.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; -import 'chrome://resources/cr_elements/cr_nav_menu_item_style.js'; +import 'chrome://resources/cr_elements/cr_nav_menu_item_style.css.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js index c9d5e7d..aa8f077 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_display_manager.js
@@ -16,59 +16,53 @@ * of the current translator to use. */ constructor(translatorManager) { - /** - * @type {!BrailleTranslatorManager} - * @private - */ - this.translatorManager_ = translatorManager; - /** - * @type {!NavBraille} - * @private - */ + /** @private {number|undefined} */ + this.blinkerId_; + + /** @private {!NavBraille} */ this.content_ = new NavBraille({}); - /** - * @type {!ExpandingBrailleTranslator.ExpansionType} valueExpansion - * @private - */ - this.expansionType_ = ExpandingBrailleTranslator.ExpansionType.SELECTION; - /** - * @type {PanStrategy} - * @private - */ - this.panStrategy_ = new PanStrategy(); - /** - * @type {function(!BrailleKeyEvent, !NavBraille)} - * @private - */ + + /** @private {function(!BrailleKeyEvent, !NavBraille)} */ this.commandListener_ = function() {}; + /** * Current display state to show in the Virtual Braille Captions display. * This is different from realDisplayState_ if the braille captions feature * is enabled and there is no hardware display connected. Otherwise, it is * the same object as realDisplayState_. - * @type {!BrailleDisplayState} - * @private + * @private {!BrailleDisplayState} */ this.displayState_ = { available: false, textRowCount: 0, textColumnCount: 0 }; + + /** @private {!ExpandingBrailleTranslator.ExpansionType} valueExpansion */ + this.expansionType_ = ExpandingBrailleTranslator.ExpansionType.SELECTION; + + /** @private {PanStrategy} */ + this.panStrategy_ = new PanStrategy(); + /** * State reported from the chrome api, reflecting a real hardware * display. - * @type {!BrailleDisplayState} - * @private + * @private {!BrailleDisplayState} */ this.realDisplayState_ = this.displayState_; - /** @private {number|undefined} */ - this.blinkerId_; - translatorManager.addChangeListener(function() { - this.translateContent_(this.content_, this.expansionType_); - }.bind(this)); + /** @private {!BrailleTranslatorManager} */ + this.translatorManager_ = translatorManager; - chrome.storage.onChanged.addListener(function(changes, area) { + this.init_(); + } + + /** @private */ + init_() { + this.translatorManager_.addChangeListener( + () => this.translateContent_(this.content_, this.expansionType_)); + + chrome.storage.onChanged.addListener((changes, area) => { if (area === 'local' && 'brailleWordWrap' in changes) { this.updatePanStrategy_(changes.brailleWordWrap.newValue); } @@ -77,19 +71,20 @@ 'virtualBrailleColumns' in changes)) { this.onCaptionsStateChanged_(); } - }.bind(this)); - chrome.storage.local.get({brailleWordWrap: true}, function(items) { - this.updatePanStrategy_(items.brailleWordWrap); - }.bind(this)); + }); + chrome.storage.local.get( + {brailleWordWrap: true}, + items => this.updatePanStrategy_(items.brailleWordWrap)); - BrailleCaptionsBackground.init(this.onCaptionsStateChanged_.bind(this)); + BrailleCaptionsBackground.init(() => this.onCaptionsStateChanged_()); if (goog.isDef(chrome.brailleDisplayPrivate)) { - const onDisplayStateChanged = this.refreshDisplayState_.bind(this); + const onDisplayStateChanged = (newState) => + this.refreshDisplayState_(newState); chrome.brailleDisplayPrivate.getDisplayState(onDisplayStateChanged); chrome.brailleDisplayPrivate.onDisplayStateChanged.addListener( onDisplayStateChanged); chrome.brailleDisplayPrivate.onKeyEvent.addListener( - this.onKeyEvent_.bind(this)); + (event) => this.onKeyEvent_(event)); } else { // Get the initial captions state since we won't refresh the display // state in an API callback in this case. @@ -131,7 +126,7 @@ const imageDataUrl = imageUrl; const imgElement = document.createElement('img'); imgElement.src = imageDataUrl; - imgElement.onload = function() { + imgElement.onload = () => { const canvas = document.createElement('canvas'); const context = canvas.getContext('2d'); canvas.width = columns * cellWidth; @@ -189,7 +184,7 @@ if (BrailleCaptionsBackground.isEnabled()) { BrailleCaptionsBackground.setImageContent(brailleBuf, rows, columns); } - }.bind(this); + }; } /** @@ -223,7 +218,7 @@ refreshDisplayState_(newState) { const oldColumnCount = this.displayState_.textColumnCount || 0; const oldRowCount = this.displayState_.textRowCount || 0; - const processDisplayState = function(displayState) { + const processDisplayState = displayState => { this.displayState_ = displayState; const newColumnCount = displayState.textColumnCount || 0; const newRowCount = displayState.textRowCount || 0; @@ -232,7 +227,7 @@ this.panStrategy_.setDisplaySize(newRowCount, newColumnCount); } this.refresh_(); - }.bind(this); + }; this.realDisplayState_ = { available: newState.available, textRowCount: newState.textRowCount || 0, @@ -280,10 +275,10 @@ } let showCursor = false; - this.blinkerId_ = window.setInterval(function() { + this.blinkerId_ = window.setInterval(() => { this.refreshInternal_(showCursor); showCursor = !showCursor; - }.bind(this), BrailleDisplayManager.CURSOR_BLINK_TIME_MS); + }, BrailleDisplayManager.CURSOR_BLINK_TIME_MS); } /** @@ -317,8 +312,7 @@ * @private */ translateContent_(newContent, newExpansionType) { - const writeTranslatedContent = function( - cells, textToBraille, brailleToText) { + const writeTranslatedContent = (cells, textToBraille, brailleToText) => { this.content_ = newContent; this.expansionType_ = newExpansionType; const startIndex = this.content_.startIndex; @@ -357,7 +351,7 @@ this.content_.text.toString(), cells, brailleToText, targetPosition); this.refresh_(); - }.bind(this); + }; const translator = this.translatorManager_.getExpandingTranslator(); if (!translator) {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js index 2f0e950..ed7d17f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/gesture_command_handler.js
@@ -22,12 +22,6 @@ GestureCommandHandler.setEnabled = function(state) { GestureCommandHandler.enabled_ = state; }; -chrome.runtime.onMessage.addListener((message) => { - if (message.target === 'GestureCommandHandler' && - message.action === 'setEnabled') { - GestureCommandHandler.setEnabled(message.value); - } -}); /** * Global setting for the enabled state of this handler. @@ -141,3 +135,7 @@ GestureCommandHandler.granularity = GestureGranularity.LINE; GestureCommandHandler.init_(); + +BridgeHelper.registerHandler( + BridgeTarget.GESTURE_COMMAND_HANDLER, BridgeAction.SET_ENABLED, + enabled => GestureCommandHandler.setEnabled(enabled));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js index e8d09342..e9a5f4d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js
@@ -127,7 +127,18 @@ async get() { return BridgeHelper.sendMessage( BridgeTarget.EVENT_SOURCE_STATE, BridgeAction.GET); - } + }, +}; + +BackgroundBridge.GestureCommandHandler = { + /** + * @param {boolean} enabled + * @return {!Promise} + */ + async setEnabled(enabled) { + return BridgeHelper.sendMessage( + BridgeTarget.GESTURE_COMMAND_HANDLER, BridgeAction.SET_ENABLED); + }, }; BackgroundBridge.LogStore = {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js index 4c40de03f..1b4560e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_constants.js
@@ -19,6 +19,7 @@ CHROMEVOX_STATE: 'ChromeVoxState', COMMAND_HANDLER: 'CommandHandler', EVENT_SOURCE_STATE: 'EventSourceState', + GESTURE_COMMAND_HANDLER: 'GestureCommandHandler', LOG_STORE: 'LogStore', PANEL: 'Panel', PANEL_BACKGROUND: 'PanelBackground',
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js index 775e25dd..73bc85f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/learn_mode/learn_mode.js
@@ -36,8 +36,7 @@ LearnMode.onAccessibilityGesture); chrome.accessibilityPrivate.setKeyboardListener(true, true); BackgroundBridge.BrailleCommandHandler.setEnabled(false); - chrome.runtime.sendMessage( - {target: 'GestureCommandHandler', action: 'setEnabled', value: false}); + BackgroundBridge.GestureCommandHandler.setEnabled(false); ChromeVoxKbHandler.handlerKeyMap = KeyMap.get();
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js index 2ec2d72d..6e373d2 100644 --- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js +++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
@@ -6,7 +6,7 @@ import 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_pairing_ui.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import './strings.m.js'; import {loadTimeData} from '//resources/js/load_time_data.m.js';
diff --git a/chrome/browser/resources/chromeos/contact_center_insights/background.js b/chrome/browser/resources/chromeos/contact_center_insights/background.js index e44f9d3..d6cdeb372 100644 --- a/chrome/browser/resources/chromeos/contact_center_insights/background.js +++ b/chrome/browser/resources/chromeos/contact_center_insights/background.js
@@ -17,7 +17,7 @@ goog.require('proto.reporting.UserStatusTelemetry.DeviceActivityState'); const NETWORK_BANDWIDTH_ALARM = 'NetworkBandwidth'; -const REPORT_NETWORK_BANDWIDTH_PERIOD_MINUTES = 12 /** hours **/ * 60; +const REPORT_NETWORK_BANDWIDTH_PERIOD_MINUTES = 15; const DEVICE_ACTIVITY_STATE_ALARM = 'DeviceActivityState'; const REPORT_DEVICE_ACTIVITY_STATE_PERIOD_MINUTES = 15;
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn index aec2d476..e0e189ff 100644 --- a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
@@ -31,6 +31,7 @@ deps = [ ":preprocess_generated", + "../../../../../ui/webui/resources:library", "../../../../../ui/webui/resources:preprocess", ] }
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js index 6503469..ff3c708a 100644 --- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js +++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -7,7 +7,7 @@ import 'chrome://resources/cr_components/chromeos/network/network_shared_css.m.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import './strings.m.js';
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn index 89cbb2d..fc6384bb 100644 --- a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn +++ b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -35,6 +35,7 @@ deps = [ ":preprocess", ":preprocess_generated", + "../../../../../ui/webui/resources:library", "../../../../../ui/webui/resources:preprocess", ] }
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js index 09336f83..4c508e7 100644 --- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js +++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
@@ -13,7 +13,7 @@ import 'chrome://resources/cr_components/chromeos/network/network_shared_css.m.js'; import 'chrome://resources/cr_components/chromeos/network/network_siminfo.m.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import './strings.m.js'; @@ -27,6 +27,7 @@ import {I18nBehavior} from 'chrome://resources/js/i18n_behavior.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + import {InternetDetailDialogBrowserProxy, InternetDetailDialogBrowserProxyImpl} from './internet_detail_dialog_browser_proxy.js'; /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.html b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.html index cd561072..16fabdf 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.html +++ b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.html
@@ -27,14 +27,6 @@ height: 242px; width: 352px; } - - #sensorLocation { - background-image: - url(chrome://oobe/fingerprint_scanner_illustration.svg); - background-size: 352px 242px; - height: 100%; - width: 100%; - } </style> <oobe-adaptive-dialog id="setupFingerprint" role="dialog" for-step="start" footer-shrinkable @@ -54,14 +46,9 @@ <iron-icon slot="icon" icon="oobe-32:fingerprint"></iron-icon> <div slot="content" class="flex layout vertical center center-justified"> <div id="sensorLocationContainer" class="oobe-illustration"> - <template is="dom-if" if="[[shouldUseLottieAnimation_]]"> - <oobe-cr-lottie id="scannerLocationLottie" - animation-url="fingerprint_scanner_animation.json"> - </oobe-cr-lottie> - </template> - <template is="dom-if" if="[[!shouldUseLottieAnimation_]]"> - <div id="sensorLocation"></div> - </template> + <oobe-cr-lottie id="scannerLocationLottie" + animation-url="fingerprint_scanner_animation_light.json"> + </oobe-cr-lottie> </div> </div> <div slot="bottom-buttons">
diff --git a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js index d5bced2..629117ef 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js +++ b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
@@ -95,15 +95,6 @@ }, /** - * True if lottie animation file should be used instead of an - * illustration. - * @private - */ - shouldUseLottieAnimation_: { - type: Boolean, - }, - - /** * Indicates whether user is a child account. */ isChildAccount_: { @@ -119,8 +110,6 @@ this.complete_ = false; this.canAddFinger = true; this.scanResult_ = FingerprintResultType.SUCCESS; - this.shouldUseLottieAnimation_ = - loadTimeData.getBoolean('useLottieAnimationForFingerprint'); this.isChildAccount_ = false; } @@ -205,12 +194,10 @@ * @param {boolean} playing True if animation should be playing. */ setAnimationState_(playing) { - if (this.shouldUseLottieAnimation_) { - const lottieElement = /** @type{CrLottieElement} */ ( - this.$.setupFingerprint.querySelector('#scannerLocationLottie')); - lottieElement.playing = playing; - this.$.arc.setPlay(playing); - } + const lottieElement = /** @type{CrLottieElement} */ ( + this.$.setupFingerprint.querySelector('#scannerLocationLottie')); + lottieElement.playing = playing; + this.$.arc.setPlay(playing); } /**
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default.json deleted file mode 100644 index 91cc2d2..0000000 --- a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default.json +++ /dev/null
@@ -1 +0,0 @@ -{"v":"5.7.6","fr":30,"ip":0,"op":126,"w":440,"h":360,"nm":"3_Fingerprint-Setup v6 - 440x360","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Master Scale Null","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220,180,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[85,85,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":202,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Group 10","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081],"e":[-9.548]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-9.548],"e":[10.446]},{"i":{"x":[0.668],"y":[0.194]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[10.446],"e":[2.081]},{"t":124.8}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[162.856],"e":[141.606]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[141.606],"e":[141.606]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[141.606],"e":[168.856]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[168.856],"e":[157.606]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[157.606],"e":[162.856]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[162.856],"e":[141.606]},{"t":136.8}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[47.081],"e":[61.081]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[61.081],"e":[61.081]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[61.081],"e":[42.831]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[42.831],"e":[50.331]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[50.331],"e":[47.081]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[47.081],"e":[61.081]},{"t":136.8}],"ix":4}},"a":{"a":0,"k":[161.106,47.581,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.452,0.479],[0,0],[0,0],[1.456,-0.058],[0,0],[2.714,3.158],[0,0],[0,0],[0,0],[0.468,0.32],[4.129,-6.04],[-6.04,-4.129],[-0.491,-0.252],[0,0],[-0.06,-0.018],[0,0],[-1.804,-3.753],[0,0],[-0.789,-1.247],[0,0],[0,0],[-2.911,-1.617],[-5.668,7.279],[8.957,6.123]],"o":[[0,0],[0,0],[-1.448,-0.282],[0,0],[-4.151,-0.318],[0,0],[-0.039,-0.049],[0,0],[-0.413,-0.366],[-6.04,-4.129],[-4.129,6.04],[0.468,0.32],[0,0],[0,0],[0,0],[3.927,1.383],[0,0],[0.474,1.377],[0,0],[0,0],[1.635,2.583],[8.065,4.48],[6.769,-8.693],[-2.193,-1.499]],"v":[[176.917,36.441],[176.917,36.44],[176.911,36.44],[172.541,36.104],[167.85,35.745],[157.129,30.317],[153.66,26.282],[152.047,24.591],[152.047,24.591],[150.734,23.552],[132.321,27.012],[135.781,45.424],[137.225,46.27],[137.255,46.292],[139.387,47.16],[144.406,48.927],[153.355,56.947],[155.393,61.187],[157.292,65.138],[157.294,65.144],[157.295,65.143],[164.135,71.581],[188.189,66.666],[183.959,39.391]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":43.2,"s":[0.901960849762,0.905882418156,0.917647123337,1],"e":[0.992156863213,0.611764729023,0.992156863213,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":48,"s":[0.992156863213,0.611764729023,0.992156863213,1],"e":[0.992156863213,0.611764729023,0.992156863213,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":85.2,"s":[0.992156863213,0.611764729023,0.992156863213,1],"e":[0.901960849762,0.905882418156,0.917647123337,1]},{"t":90.0001953125}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Group 9","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":-29.555,"s":[2.081],"e":[-9.548]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":-14.741,"s":[-9.548],"e":[10.446]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":6,"s":[10.446],"e":[2.081]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":30.445,"s":[2.081],"e":[-9.548]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":53.244,"s":[-9.548],"e":[10.446]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":76.044,"s":[10.446],"e":[2.081]},{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":95.244,"s":[2.081],"e":[-9.548]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":110.059,"s":[-9.548],"e":[10.446]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":130.8,"s":[10.446],"e":[2.081]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":155.244,"s":[2.081],"e":[-9.548]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":178.044,"s":[-9.548],"e":[10.446]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":200.844,"s":[10.446],"e":[2.081]},{"t":220.044140625}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[-217.666],"e":[-171.041]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[-171.041],"e":[-171.041]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[-171.041],"e":[-223.041]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[-223.041],"e":[-209.666]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[-209.666],"e":[-217.666]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[-217.666],"e":[-171.041]},{"t":141.5998046875}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[-19.529],"e":[-7.029]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[-7.029],"e":[-7.029]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[-7.029],"e":[-21.029]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[-21.029],"e":[-17.529]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[-17.529],"e":[-19.529]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[-19.529],"e":[-7.029]},{"t":141.5998046875}],"ix":4}},"a":{"a":0,"k":[-213.541,-18.529,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.146,-1.492],[5.42,2.097],[-0.46,5.512],[-1.755,-0.679]],"o":[[1.755,0.679],[-3.37,4.387],[-5.42,-2.097],[0.157,-1.875],[0,0]],"v":[[-203.342,-17.911],[-202.107,-13.557],[-216.872,-9.425],[-225.01,-22.419],[-221.165,-24.807]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":44.4,"s":[0.901960849762,0.905882418156,0.917647123337,1],"e":[0.368627458811,0.945098042488,0.949019610882,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49.2,"s":[0.368627458811,0.945098042488,0.949019610882,1],"e":[0.368627458811,0.945098042488,0.949019610882,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":87.6,"s":[0.368627458811,0.945098042488,0.949019610882,1],"e":[0.901960849762,0.905882418156,0.917647123337,1]},{"t":92.399609375}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Group 8","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081],"e":[-9.548]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":14.814,"s":[-9.548],"e":[10.446]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":35.556,"s":[10.446],"e":[2.081]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":60,"s":[2.081],"e":[-9.548]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":82.8,"s":[-9.548],"e":[10.446]},{"i":{"x":[0.845],"y":[0.89]},"o":{"x":[0.456],"y":[-0.077]},"t":105.6,"s":[10.446],"e":[2.081]},{"t":124.7998046875}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[-183.673],"e":[-144.596]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[-144.596],"e":[-144.596]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[-144.596],"e":[-195.846]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[-195.846],"e":[-179.721]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[-179.721],"e":[-183.673]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[-183.673],"e":[-144.596]},{"t":134.400390625}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[51.579],"e":[56.55]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[56.55],"e":[56.55]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[56.55],"e":[51.05]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[51.05],"e":[52.425]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[52.425],"e":[51.579]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[51.579],"e":[56.55]},{"t":134.400390625}],"ix":4}},"a":{"a":0,"k":[-183.096,52.05,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.832,-1.058],[0,0],[-1.832,-1.058],[0,0],[0,2.115],[0,0]],"o":[[0,0],[-1.832,1.058],[0,0],[1.832,1.058],[0,0],[0,-2.115]],"v":[[-177.038,37.258],[-199.403,50.17],[-199.403,54.93],[-177.038,67.842],[-172.916,65.462],[-172.916,39.638]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":40.8,"s":[0.901960849762,0.905882418156,0.917647123337,1],"e":[1,0.729411780834,0,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":45.6,"s":[1,0.729411780834,0,1],"e":[1,0.729411780834,0,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":82.8,"s":[1,0.729411780834,0,1],"e":[0.901960849762,0.905882418156,0.917647123337,1]},{"t":87.599609375}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Group 7","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":124.7998046875}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":-25.2,"s":[208.506],"e":[181.131]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[181.131],"e":[181.131]},{"i":{"x":[0.374],"y":[1.076]},"o":{"x":[0.403],"y":[0]},"t":32.4,"s":[181.131],"e":[210.631]},{"i":{"x":[0.624],"y":[1.189]},"o":{"x":[0.575],"y":[0.459]},"t":61.2,"s":[210.631],"e":[205.506]},{"i":{"x":[0.445],"y":[0.741]},"o":{"x":[0.482],"y":[0.217]},"t":86.4,"s":[205.506],"e":[208.506]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":100.8,"s":[208.506],"e":[181.131]},{"t":139.2001953125}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":-25.2,"s":[-22.567],"e":[-8.942]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[-8.942],"e":[-8.942]},{"i":{"x":[0.374],"y":[1.076]},"o":{"x":[0.403],"y":[0]},"t":32.4,"s":[-8.942],"e":[-23.442]},{"i":{"x":[0.624],"y":[1.189]},"o":{"x":[0.575],"y":[0.459]},"t":61.2,"s":[-23.442],"e":[-20.817]},{"i":{"x":[0.445],"y":[0.741]},"o":{"x":[0.482],"y":[0.217]},"t":86.4,"s":[-20.817],"e":[-22.567]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":100.8,"s":[-22.567],"e":[-8.942]},{"t":139.2001953125}],"ix":4}},"a":{"a":0,"k":[207.631,-21.942,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.819],[4.819,0],[0,4.819],[-4.819,0]],"o":[[0,4.819],[-4.819,0],[0,-4.819],[4.819,0]],"v":[[219.606,-23.192],[210.881,-14.467],[202.156,-23.192],[210.881,-31.917]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.901960790157,0.905882358551,0.917647063732,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"Group 6","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0],"e":[-30]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-30],"e":[21.58]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[21.58],"e":[0]},{"t":124.7998046875}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[-158.077],"e":[-109.577]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[-109.577],"e":[-109.577]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[-109.577],"e":[-162.577]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[-162.577],"e":[-152.577]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[-152.577],"e":[-158.077]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[-158.077],"e":[-109.577]},{"t":136.7998046875}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[-71.661],"e":[-36.286]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[-36.286],"e":[-36.286]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[-36.286],"e":[-74.786]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[-74.786],"e":[-67.661]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[-67.661],"e":[-71.661]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[-71.661],"e":[-36.286]},{"t":136.7998046875}],"ix":4}},"a":{"a":0,"k":[-155.577,-70.286,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.064,4.133],[0,0],[-4.133,-5.064],[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0]],"o":[[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0],[-5.064,4.133],[0,0],[-4.133,-5.064]],"v":[[-171.83,-90.169],[-171.83,-90.169],[-155.177,-88.483],[-137.639,-67.056],[-139.325,-50.403],[-139.325,-50.403],[-155.978,-52.088],[-173.516,-73.516]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":44.4,"s":[0.901960849762,0.905882418156,0.917647123337,1],"e":[0.203921571374,0.658823549747,0.32549020648,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":49.2,"s":[0.203921571374,0.658823549747,0.32549020648,1],"e":[0.203921571374,0.658823549747,0.32549020648,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":86.4,"s":[0.203921571374,0.658823549747,0.32549020648,1],"e":[0.901960849762,0.905882418156,0.917647123337,1]},{"t":91.2001953125}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":3,"nm":"Null 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":-129,"ix":10},"p":{"a":0,"k":[-189.75,-143,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":74.4,"op":202.8,"st":74.4,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"thumb","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":128.725,"ix":3},"y":{"a":0,"k":-83.038,"ix":4}},"a":{"a":0,"k":[128.725,-83.038,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[11.106,-33.272],[5.661,-1.05],[1.136,4.946],[0.029,5.583],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-1.573,4.712],[-6.045,1.121],[-1.264,-5.501],[-0.063,-12.384],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[92.997,21.162],[83.365,34.523],[71.497,24.978],[70.873,8.188],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[4.839,-13.578],[11.106,-33.272],[5.661,-1.05],[1.136,4.946],[0.029,5.583],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-1.573,4.712],[-6.045,1.121],[-1.264,-5.501],[-0.063,-12.384],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[92.997,21.162],[83.365,34.523],[71.497,24.978],[70.873,8.188],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[20.554,-28.423],[5.716,0.693],[-0.396,5.059],[-1.643,5.335],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.911,4.026],[-6.103,-0.739],[0.44,-5.627],[3.646,-11.836],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[79.712,22.036],[66.523,31.902],[58.055,19.243],[62.484,3.035],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":24,"s":[{"i":[[0,0],[4.839,-13.578],[20.554,-28.423],[5.716,0.693],[-0.396,5.059],[-1.643,5.335],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.911,4.026],[-6.103,-0.739],[0.44,-5.627],[3.646,-11.836],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[79.712,22.036],[66.523,31.902],[58.055,19.243],[62.484,3.035],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[19.525,-29.139],[5.737,0.488],[-0.215,5.07],[-1.452,5.391],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.765,4.127],[-6.126,-0.521],[0.239,-5.639],[3.22,-11.958],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[83.926,22.786],[71.098,33.116],[62.183,20.768],[66.031,4.413],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[4.839,-13.578],[19.525,-29.139],[5.737,0.488],[-0.215,5.07],[-1.452,5.391],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.765,4.127],[-6.126,-0.521],[0.239,-5.639],[3.22,-11.958],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[83.926,22.786],[71.098,33.116],[62.183,20.768],[66.031,4.413],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":69.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[24.293,-25.05],[5.529,1.498],[-1.112,4.925],[-2.38,5.018],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.441,3.548],[-5.903,-1.599],[1.237,-5.477],[5.279,-11.133],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[75.271,21.529],[60.877,29.36],[54.347,15.688],[61.021,0.363],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[4.839,-13.578],[24.293,-25.05],[5.529,1.498],[-1.112,4.925],[-2.38,5.018],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.441,3.548],[-5.903,-1.599],[1.237,-5.477],[5.279,-11.133],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[75.271,21.529],[60.877,29.36],[54.347,15.688],[61.021,0.363],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[20.903,-28.167],[5.707,0.763],[-0.458,5.054],[-1.709,5.315],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.961,3.989],[-6.094,-0.815],[0.51,-5.621],[3.792,-11.79],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[80.005,22.37],[66.696,32.072],[58.385,19.31],[63.014,3.158],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[0,0],[4.839,-13.578],[20.903,-28.167],[5.707,0.763],[-0.458,5.054],[-1.709,5.315],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.961,3.989],[-6.094,-0.815],[0.51,-5.621],[3.792,-11.79],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[80.005,22.37],[66.696,32.072],[58.385,19.31],[63.014,3.158],[76.676,-33.112],[77.155,-35.31]],"c":false}],"e":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"t":122}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"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":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}],"e":[{"i":[[0,0],[1.926,0.283],[1.533,-1.2],[0.392,-1.769],[-3.206,-3.461],[-1.035,-0.649],[0.025,0.012]],"o":[[-1.781,-0.786],[-1.926,-0.283],[-1.427,1.117],[-1.022,4.605],[0.83,0.896],[-0.025,-0.012],[0,0]],"v":[[93.996,12.919],[88.481,11.055],[82.93,12.26],[80.334,16.912],[83.89,30.047],[86.632,32.29],[86.559,32.255]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[1.926,0.283],[1.533,-1.2],[0.392,-1.769],[-3.206,-3.461],[-1.035,-0.649],[0.025,0.012]],"o":[[-1.781,-0.786],[-1.926,-0.283],[-1.427,1.117],[-1.022,4.605],[0.83,0.896],[-0.025,-0.012],[0,0]],"v":[[93.996,12.919],[88.481,11.055],[82.93,12.26],[80.334,16.912],[83.89,30.047],[86.632,32.29],[86.559,32.255]],"c":false}],"e":[{"i":[[0,0],[1.753,0.846],[1.822,-0.687],[0.904,-1.57],[-2.023,-4.261],[-0.793,-0.929],[0.02,0.019]],"o":[[-1.464,-1.283],[-1.753,-0.846],[-1.695,0.639],[-2.353,4.088],[0.524,1.103],[-0.02,-0.019],[0,0]],"v":[[83.131,14.469],[78.427,11.041],[72.77,10.529],[68.901,14.191],[68.363,27.788],[70.308,30.749],[70.248,30.694]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":24,"s":[{"i":[[0,0],[1.753,0.846],[1.822,-0.687],[0.904,-1.57],[-2.023,-4.261],[-0.793,-0.929],[0.02,0.019]],"o":[[-1.464,-1.283],[-1.753,-0.846],[-1.695,0.639],[-2.353,4.088],[0.524,1.103],[-0.02,-0.019],[0,0]],"v":[[83.131,14.469],[78.427,11.041],[72.77,10.529],[68.901,14.191],[68.363,27.788],[70.308,30.749],[70.248,30.694]],"c":false}],"e":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}],"e":[{"i":[[0,0],[1.782,0.783],[1.796,-0.751],[0.847,-1.602],[-2.174,-4.186],[-0.826,-0.9],[0.021,0.018]],"o":[[-1.509,-1.23],[-1.782,-0.783],[-1.672,0.699],[-2.205,4.17],[0.563,1.084],[-0.021,-0.018],[0,0]],"v":[[87.073,15.102],[82.25,11.843],[76.578,11.534],[72.842,15.332],[72.79,28.94],[74.84,31.83],[74.778,31.776]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[1.782,0.783],[1.796,-0.751],[0.847,-1.602],[-2.174,-4.186],[-0.826,-0.9],[0.021,0.018]],"o":[[-1.509,-1.23],[-1.782,-0.783],[-1.672,0.699],[-2.205,4.17],[0.563,1.084],[-0.021,-0.018],[0,0]],"v":[[87.073,15.102],[82.25,11.843],[76.578,11.534],[72.842,15.332],[72.79,28.94],[74.84,31.83],[74.778,31.776]],"c":false}],"e":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":69.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}],"e":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}],"e":[{"i":[[0,0],[1.605,1.083],[1.891,-0.416],[1.114,-1.417],[-1.383,-4.484],[-0.649,-1.027],[0.017,0.021]],"o":[[-1.258,-1.472],[-1.605,-1.083],[-1.76,0.387],[-2.9,3.689],[0.358,1.161],[-0.017,-0.021],[0,0]],"v":[[79.718,14.568],[75.576,10.521],[70.079,9.209],[65.746,12.262],[63.276,25.573],[64.769,28.766],[64.718,28.703]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[1.605,1.083],[1.891,-0.416],[1.114,-1.417],[-1.383,-4.484],[-0.649,-1.027],[0.017,0.021]],"o":[[-1.258,-1.472],[-1.605,-1.083],[-1.76,0.387],[-2.9,3.689],[0.358,1.161],[-0.017,-0.021],[0,0]],"v":[[79.718,14.568],[75.576,10.521],[70.079,9.209],[65.746,12.262],[63.276,25.573],[64.769,28.766],[64.718,28.703]],"c":false}],"e":[{"i":[[0,0],[1.742,0.868],[1.83,-0.664],[0.923,-1.559],[-1.97,-4.286],[-0.782,-0.938],[0.02,0.019]],"o":[[-1.448,-1.301],[-1.742,-0.868],[-1.703,0.618],[-2.403,4.059],[0.51,1.11],[-0.02,-0.019],[0,0]],"v":[[83.518,14.846],[78.857,11.36],[73.206,10.778],[69.292,14.392],[68.587,27.982],[70.495,30.967],[70.436,30.911]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[0,0],[1.742,0.868],[1.83,-0.664],[0.923,-1.559],[-1.97,-4.286],[-0.782,-0.938],[0.02,0.019]],"o":[[-1.448,-1.301],[-1.742,-0.868],[-1.703,0.618],[-2.403,4.059],[0.51,1.11],[-0.02,-0.019],[0,0]],"v":[[83.518,14.846],[78.857,11.36],[73.206,10.778],[69.292,14.392],[68.587,27.982],[70.495,30.967],[70.436,30.911]],"c":false}],"e":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"t":122}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"index","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":2.4,"s":[0],"e":[14]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":16.8,"s":[14],"e":[-8.5]},{"i":{"x":[0.833],"y":[0.95]},"o":{"x":[0.167],"y":[0.167]},"t":26.4,"s":[-8.5],"e":[0]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.992]},"t":33.6,"s":[0],"e":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50.4,"s":[0],"e":[0]},{"i":{"x":[0.339],"y":[1]},"o":{"x":[0.497],"y":[0]},"t":81.6,"s":[0],"e":[0]},{"t":118.7998046875}],"ix":10},"p":{"s":true,"x":{"a":0,"k":77.038,"ix":3},"y":{"a":0,"k":-35.351,"ix":4}},"a":{"a":0,"k":[77.038,-35.351,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]},{"t":110.400390625}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"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":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[0,0],[-1.402,0.164],[-1.191,0.756],[1.16,5.51],[4.658,-0.366]],"o":[[0.865,1.115],[1.402,-0.164],[4.212,-2.673],[-1.054,-5.008],[0,0]],"v":[[-27.591,62.383],[-24.41,63.765],[-20.527,62.173],[-13.334,47.619],[-24.309,42.263]],"c":false}],"e":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-42.467,46.279],[-39.884,48.693],[-35.689,48.805],[-23.23,38.396],[-31.108,29.064]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-42.467,46.279],[-39.884,48.693],[-35.689,48.805],[-23.23,38.396],[-31.108,29.064]],"c":false}],"e":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-41.564,44.492],[-39.044,47.113],[-34.849,47.225],[-22.802,37.349],[-30.679,28.016]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-41.564,44.492],[-39.044,47.113],[-34.849,47.225],[-22.802,37.349],[-30.679,28.016]],"c":false}],"e":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-34.221,50.995],[-32.488,54.052],[-28.351,54.76],[-14.537,46.231],[-21.005,35.873]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-34.221,50.995],[-32.488,54.052],[-28.351,54.76],[-14.537,46.231],[-21.005,35.873]],"c":false}],"e":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-38.715,47.696],[-36.77,50.356],[-32.633,51.064],[-18.819,42.535],[-25.287,32.176]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-38.715,47.696],[-36.77,50.356],[-32.633,51.064],[-18.819,42.535],[-25.287,32.176]],"c":false}],"e":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-33.74,50.709],[-31.901,53.508],[-27.764,54.216],[-13.95,45.687],[-20.419,35.328]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-33.74,50.709],[-31.901,53.508],[-27.764,54.216],[-13.95,45.687],[-20.419,35.328]],"c":false}],"e":[{"i":[[0,0],[-1.407,-0.075],[-1.3,0.544],[0.216,5.62],[4.647,0.423]],"o":[[0.665,1.243],[1.407,0.075],[4.596,-1.924],[-0.197,-5.108],[0,0]],"v":[[-23.679,59.511],[-20.737,61.449],[-16.646,60.534],[-7.118,47.413],[-17.024,40.295]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[0,0],[-1.407,-0.075],[-1.3,0.544],[0.216,5.62],[4.647,0.423]],"o":[[0.665,1.243],[1.407,0.075],[4.596,-1.924],[-0.197,-5.108],[0,0]],"v":[[-23.679,59.511],[-20.737,61.449],[-16.646,60.534],[-7.118,47.413],[-17.024,40.295]],"c":false}],"e":[{"i":[[0,0],[-1.402,0.164],[-1.191,0.756],[1.16,5.51],[4.658,-0.366]],"o":[[0.865,1.115],[1.402,-0.164],[4.212,-2.673],[-1.054,-5.008],[0,0]],"v":[[-27.841,62.392],[-24.41,63.765],[-20.527,62.173],[-13.334,47.619],[-24.309,42.263]],"c":false}]},{"t":110.400390625}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"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":"Group 3","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}],"e":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]},{"t":110.400390625}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":3,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Layer 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.524],"y":[0.895]},"o":{"x":[0.718],"y":[-0.082]},"t":0,"s":[0],"e":[14]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.521],"y":[-0.037]},"t":14.4,"s":[14],"e":[-7.4]},{"i":{"x":[0.833],"y":[0.92]},"o":{"x":[0.167],"y":[0.167]},"t":26.4,"s":[-7.4],"e":[4.2]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.313]},"t":33.6,"s":[4.2],"e":[11.1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50.4,"s":[11.1],"e":[4.2]},{"i":{"x":[0.569],"y":[1.061]},"o":{"x":[0.4],"y":[0]},"t":81.6,"s":[4.2],"e":[-0.8]},{"i":{"x":[0.461],"y":[1]},"o":{"x":[0.251],"y":[0.311]},"t":110.4,"s":[-0.8],"e":[0]},{"t":122.400390625}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":12,"s":[110.225],"e":[76.975]},{"i":{"x":[0.583],"y":[0.613]},"o":{"x":[0.167],"y":[0.147]},"t":26.4,"s":[76.975],"e":[98.067]},{"i":{"x":[0.833],"y":[0.908]},"o":{"x":[0.417],"y":[0.505]},"t":30,"s":[98.067],"e":[114.225]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.314]},"t":33.6,"s":[114.225],"e":[136.225]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50.4,"s":[136.225],"e":[114.225]},{"i":{"x":[0.408],"y":[1.006]},"o":{"x":[0.376],"y":[0]},"t":81.6,"s":[114.225],"e":[121.403]},{"i":{"x":[0.62],"y":[0.952]},"o":{"x":[0.555],"y":[0.184]},"t":94.8,"s":[121.403],"e":[108.725]},{"i":{"x":[0.649],"y":[0.782]},"o":{"x":[0.266],"y":[-0.313]},"t":110.4,"s":[108.725],"e":[110.225]},{"t":122.400390625}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.649],"y":[1.21]},"o":{"x":[0.527],"y":[0]},"t":0,"s":[-93.038],"e":[-100.438]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.416],"y":[0.203]},"t":12,"s":[-100.438],"e":[-89.538]},{"i":{"x":[0.583],"y":[0.588]},"o":{"x":[0.167],"y":[0.157]},"t":26.4,"s":[-89.538],"e":[-71.407]},{"i":{"x":[0.713],"y":[0.746]},"o":{"x":[0.357],"y":[0.357]},"t":30,"s":[-71.407],"e":[-59.476]},{"i":{"x":[0.785],"y":[0.851]},"o":{"x":[0.432],"y":[0.565]},"t":32.4,"s":[-59.476],"e":[-55.438]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.298]},"t":33.6,"s":[-55.438],"e":[-33.538]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50.4,"s":[-33.538],"e":[-55.038]},{"i":{"x":[0.622],"y":[0.96]},"o":{"x":[0.248],"y":[0]},"t":81.6,"s":[-55.038],"e":[-96.557]},{"i":{"x":[0.628],"y":[0.694]},"o":{"x":[0.204],"y":[0]},"t":102,"s":[-96.557],"e":[-92.738]},{"i":{"x":[0.643],"y":[1]},"o":{"x":[0.276],"y":[-3.844]},"t":110.4,"s":[-92.738],"e":[-93.038]},{"t":122.400390625}],"ix":4}},"a":{"a":0,"k":[110.225,-93.038,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}],"e":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}],"e":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}],"e":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"t":118.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}],"e":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}],"e":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}],"e":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"t":118.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}],"e":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}],"e":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}],"e":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"t":118.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"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":"Group 6","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}],"e":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}],"e":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}],"e":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"t":118.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"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":"Group 7","np":2,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Shape Layer 2","parent":11,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-11.1,"ix":10},"p":{"a":0,"k":[-16.995,-33.901,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":[[4.5,-9],[-0.75,-5],[-6.5,-0.25],[-5.598,-1.022],[-6.348,0.686],[-2.75,2.25],[8.25,6.5]],"o":[[-4.5,9],[0.75,5],[2.039,0.078],[12.249,2.235],[9.25,-1],[2.75,-2.25],[-8.25,-6.5]],"v":[[-21,-5.75],[-32.75,37.25],[-19.593,49.869],[-11.691,60.349],[25.363,62.509],[55.25,53.5],[56.901,30.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.01568627451,0.125490196078,0.6,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Group 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100],"e":[92,92,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100],"e":[100,100,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100],"e":[92,92,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100],"e":[100,100,100]},{"t":79.1998046875}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.473,-0.064],[-0.075,-0.025],[-1.039,-1.686],[2.604,-2.504],[3.815,0.519],[-2.131,2.049],[2.577,0.351],[1.409,-1.355],[-8.973,-1.221],[-5.849,2.741],[-1.366,1.314],[-0.758,2.206],[-0.698,0.034],[0.129,-0.344],[1.775,-1.706],[2.261,-1.064],[7.246,0.986],[-5.684,5.466],[-3.815,-0.519],[2.131,-2.049],[-2.577,-0.351],[-1.409,1.355],[1.137,1.887],[2.65,0.922],[-0.5,0.308]],"o":[[0.088,0.012],[2.986,1.042],[1.313,2.186],[-2.131,2.049],[-3.815,-0.519],[1.407,-1.353],[-2.581,-0.351],[-4.958,4.768],[6.373,0.867],[1.943,-0.906],[1.026,-0.987],[0.12,-0.36],[0.715,-0.046],[-0.623,1.806],[-1.578,1.518],[-6.655,3.124],[-10.207,-1.389],[2.131,-2.049],[3.815,0.519],[-1.407,1.353],[2.577,0.351],[2.25,-2.164],[-0.895,-1.478],[-0.515,-0.172],[0.414,-0.275]],"v":[[-13.704,71.497],[-13.439,71.563],[-7.855,75.354],[-9.852,82.619],[-20.631,85.397],[-23.675,80.738],[-25.788,77.649],[-33.005,79.468],[-25.724,90.319],[-5.593,87.24],[-0.587,83.88],[2.657,79.109],[4.148,78.389],[5.202,78.95],[1.632,84.182],[-4.157,88.072],[-27.056,91.596],[-35.263,79.174],[-24.484,76.396],[-21.44,81.054],[-19.327,84.144],[-12.11,82.324],[-10.373,76.049],[-15.274,72.711],[-15.256,71.833]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":34.8,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[1,1,1,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[1,1,1,1],"e":[1,1,1,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84,"s":[1,1,1,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"t":91.1998046875}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":34.8,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[1,1,1,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":42,"s":[1,1,1,1],"e":[1,1,1,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84,"s":[1,1,1,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"t":91.1998046875}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Group 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100],"e":[92,92,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100],"e":[100,100,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100],"e":[92,92,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100],"e":[100,100,100]},{"t":79.1998046875}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":79.2,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[1,1,1,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":86.4,"s":[1,1,1,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"t":93.6001953125}],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.315,-0.043],[-1.151,-1.008],[2.289,-2.201],[0.631,0.086],[-0.37,0.356],[1.658,1.411],[2.246,0.306],[0.99,0.036],[-0.256,0.369],[-0.692,-0.022]],"o":[[2.669,0.363],[2.014,1.732],[-0.368,0.353],[-0.631,-0.086],[1.853,-1.782],[-0.961,-0.824],[-0.538,-0.073],[-0.669,-0.019],[0.245,-0.358],[1.433,0.037]],"v":[[-20.924,73.487],[-15.14,75.558],[-15.577,81.837],[-17.358,82.318],[-17.823,81.532],[-17.493,76.436],[-22.259,74.763],[-24.725,74.571],[-25.486,73.876],[-23.804,73.268]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Group 3","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":66,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[1,1,1,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":73.2,"s":[1,1,1,1],"e":[1,1,1,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84,"s":[1,1,1,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"t":91.1998046875}],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.292,-0.04],[-0.067,-0.155],[0.092,-1.735],[2.12,-2.038],[7,0.952],[-3.905,3.755],[-0.631,-0.086],[0.37,-0.356],[-5.765,-0.785],[-3.184,3.061],[-0.051,1.552],[0.701,1.221],[-0.688,0.193]],"o":[[0.292,0.04],[0.811,1.365],[-0.067,1.765],[-3.905,3.755],[-7,-0.952],[0.368,-0.353],[0.627,0.085],[-3.184,3.061],[5.765,0.785],[1.894,-1.821],[0.078,-1.65],[-0.163,-0.312],[0.387,-0.093]],"v":[[-2.403,73.337],[-1.817,73.634],[-0.782,77.587],[-4.137,83.397],[-23.926,88.485],[-29.536,79.94],[-27.755,79.46],[-27.29,80.246],[-22.611,87.221],[-6.383,83.091],[-3.407,77.937],[-4.373,74.311],[-3.44,73.413]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"Group 4","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":28.8,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[1,1,1,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":36,"s":[1,1,1,1],"e":[1,1,1,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":82.8,"s":[1,1,1,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"t":89.999609375}],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.358,-0.049],[-0.119,-0.105],[0.66,-0.242],[4.384,-0.517],[4.934,3.01],[0.394,2.061],[-0.725,0.132],[-0.056,-0.339],[-2.118,-1.286],[-8.361,0.998],[-3.676,1.319]],"o":[[0.223,0.03],[0.306,0.272],[-4.065,1.469],[-9.177,1.09],[-2.353,-1.431],[-0.069,-0.326],[0.725,-0.132],[0.362,1.868],[4.506,2.734],[3.97,-0.47],[0.377,-0.152]],"v":[[-4.261,90.896],[-3.73,91.1],[-4.381,92.021],[-17.098,95.013],[-40.242,91.878],[-44.381,86.622],[-43.192,85.774],[-41.781,86.14],[-38.044,90.893],[-16.943,93.749],[-5.423,91.043]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"Group 5","parent":14,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":21,"nm":"Fill","np":9,"mn":"ADBE Fill","ix":1,"en":1,"ef":[{"ty":10,"nm":"Fill Mask","mn":"ADBE Fill-0001","ix":1,"v":{"a":0,"k":0,"ix":1}},{"ty":7,"nm":"All Masks","mn":"ADBE Fill-0007","ix":2,"v":{"a":0,"k":0,"ix":2}},{"ty":2,"nm":"Color","mn":"ADBE Fill-0002","ix":3,"v":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26.4,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[1,1,1,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":33.6,"s":[1,1,1,1],"e":[1,1,1,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":82.8,"s":[1,1,1,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"t":89.999609375}],"ix":3}},{"ty":7,"nm":"Invert","mn":"ADBE Fill-0006","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Horizontal Feather","mn":"ADBE Fill-0003","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":0,"nm":"Vertical Feather","mn":"ADBE Fill-0004","ix":6,"v":{"a":0,"k":0,"ix":6}},{"ty":0,"nm":"Opacity","mn":"ADBE Fill-0005","ix":7,"v":{"a":0,"k":1,"ix":7}}]}],"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.404,-0.055],[-0.106,-0.071],[-4.465,-0.608],[-5.072,0.669],[0,-0.346],[0.71,-0.092],[4.823,0.656],[3.198,1.952],[-0.608,0.264]],"o":[[0.181,0.025],[3.004,1.839],[4.442,0.604],[0.71,-0.092],[-0.023,0.343],[-5.501,0.709],[-4.781,-0.651],[-0.39,-0.241],[0.443,-0.202]],"v":[[-43.27,93.41],[-42.833,93.556],[-32.193,97.04],[-17.842,96.956],[-16.579,97.418],[-17.924,98.217],[-33.51,98.306],[-45.04,94.542],[-44.628,93.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":" 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-21.57,86.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.489,0.489,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100],"e":[106,106,100]},{"i":{"x":[0.565,0.565,0.34],"y":[0.962,0.962,1]},"o":{"x":[0.571,0.571,0.66],"y":[0,0,0]},"t":36,"s":[106,106,100],"e":[100,100,100]},{"i":{"x":[0.489,0.489,0.34],"y":[1.034,1.034,1]},"o":{"x":[0.617,0.617,0.66],"y":[-0.022,-0.022,0]},"t":45.6,"s":[100,100,100],"e":[106,106,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.571,0.571,0.66],"y":[0.054,0.054,0]},"t":55.2,"s":[106,106,100],"e":[100,100,100]},{"t":64.7998046875}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-12.99],[28.705,0],[0,12.99],[-28.705,0]],"o":[[0,12.99],[-28.705,0],[0,-12.99],[28.705,0]],"v":[[30.405,86.351],[-21.57,109.872],[-73.545,86.351],[-21.57,62.83]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26.4,"s":[0.823529422283,0.890196084976,0.988235294819,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":32.4,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[0.164705887437,0.517647087574,0.988235294819,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":80.4,"s":[0.164705887437,0.517647087574,0.988235294819,1],"e":[0.823529422283,0.890196084976,0.988235294819,1]},{"t":86.400390625}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":" 5","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-21.57,86.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":25.2,"s":[{"i":[[17.59,-2.239],[0,-15.103],[-41.731,0],[0,19.094],[24.106,5.75]],"o":[[-29.182,3.714],[0,19.094],[41.731,0],[0,-13.028],[-24.106,-5.75]],"v":[[-46.465,52.739],[-97.13,85.391],[-21.57,119.963],[53.99,85.391],[14.981,55.125]],"c":true}],"e":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":42,"s":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}],"e":[{"i":[[23.972,-3.051],[0,-20.583],[-56.871,0],[0,26.021],[32.852,7.836]],"o":[[-39.77,5.061],[0,26.021],[56.871,0],[0,-17.754],[-32.852,-7.836]],"v":[[-55.497,41.154],[-124.545,85.652],[-21.57,132.769],[81.405,85.652],[28.242,44.406]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":56.4,"s":[{"i":[[23.972,-3.051],[0,-20.583],[-56.871,0],[0,26.021],[32.852,7.836]],"o":[[-39.77,5.061],[0,26.021],[56.871,0],[0,-17.754],[-32.852,-7.836]],"v":[[-55.497,41.154],[-124.545,85.652],[-21.57,132.769],[81.405,85.652],[28.242,44.406]],"c":true}],"e":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":70.8,"s":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}],"e":[{"i":[[18.871,-2.402],[0,-16.202],[-44.769,0],[0,20.484],[25.861,6.169]],"o":[[-31.307,3.984],[0,20.484],[44.769,0],[0,-13.976],[-25.861,-6.169]],"v":[[-48.277,50.414],[-102.631,85.443],[-21.57,122.533],[59.491,85.443],[17.642,52.974]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":85.2,"s":[{"i":[[18.871,-2.402],[0,-16.202],[-44.769,0],[0,20.484],[25.861,6.169]],"o":[[-31.307,3.984],[0,20.484],[44.769,0],[0,-13.976],[-25.861,-6.169]],"v":[[-48.277,50.414],[-102.631,85.443],[-21.57,122.533],[59.491,85.443],[17.642,52.974]],"c":true}],"e":[{"i":[[17.59,-2.239],[0,-15.103],[-41.731,0],[0,19.094],[24.106,5.75]],"o":[[-29.182,3.714],[0,19.094],[41.731,0],[0,-13.028],[-24.106,-5.75]],"v":[[-46.465,52.739],[-97.13,85.391],[-21.57,119.963],[53.99,85.391],[14.981,55.125]],"c":true}]},{"t":100.800390625}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0.2,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":139.2,"st":26.4,"bm":0},{"ddd":0,"ind":22,"ty":1,"nm":"bkrnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220,180,0],"ix":2,"l":2},"a":{"a":0,"k":[220,180,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":440,"sh":360,"sc":"#ffffff","ip":0,"op":202,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default_dark.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default_dark.json new file mode 100644 index 0000000..6748823 --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default_dark.json
@@ -0,0 +1 @@ +{"v":"5.9.2","fr":30,"ip":0,"op":126,"w":600,"h":296,"nm":"DM_fingerprint_1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hori_magenta","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.17],"y":[0]},"t":85,"s":[100]},{"t":90.0001953125,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-9.548]},{"i":{"x":[0.668],"y":[0.194]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[10.446]},{"t":124.8,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[462.856]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[441.606]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[441.606]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[468.856]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[457.606]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[462.856]},{"t":136.8,"s":[441.606]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[195.081]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[209.081]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[209.081]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[190.831]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[198.331]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[195.081]},{"t":136.8,"s":[209.081]}],"ix":4}},"a":{"a":0,"k":[161.106,47.581,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.452,0.479],[0,0],[0,0],[1.456,-0.058],[0,0],[2.714,3.158],[0,0],[0,0],[0,0],[0.468,0.32],[4.129,-6.04],[-6.04,-4.129],[-0.491,-0.252],[0,0],[-0.06,-0.018],[0,0],[-1.804,-3.753],[0,0],[-0.789,-1.247],[0,0],[0,0],[-2.911,-1.617],[-5.668,7.279],[8.957,6.123]],"o":[[0,0],[0,0],[-1.448,-0.282],[0,0],[-4.151,-0.318],[0,0],[-0.039,-0.049],[0,0],[-0.413,-0.366],[-6.04,-4.129],[-4.129,6.04],[0.468,0.32],[0,0],[0,0],[0,0],[3.927,1.383],[0,0],[0.474,1.377],[0,0],[0,0],[1.635,2.583],[8.065,4.48],[6.769,-8.693],[-2.193,-1.499]],"v":[[176.917,36.441],[176.917,36.44],[176.911,36.44],[172.541,36.104],[167.85,35.745],[157.129,30.317],[153.66,26.282],[152.047,24.591],[152.047,24.591],[150.734,23.552],[132.321,27.012],[135.781,45.424],[137.225,46.27],[137.255,46.292],[139.387,47.16],[144.406,48.927],[153.355,56.947],[155.393,61.187],[157.292,65.138],[157.294,65.144],[157.295,65.143],[164.135,71.581],[188.189,66.666],[183.959,39.391]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9725490196078431,0.5098039215686274,1.0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color5","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"hori_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-9.548]},{"i":{"x":[0.668],"y":[0.194]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[10.446]},{"t":124.8,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[462.856]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[441.606]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[441.606]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[468.856]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[457.606]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[462.856]},{"t":136.8,"s":[441.606]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[195.081]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[209.081]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[209.081]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[190.831]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[198.331]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[195.081]},{"t":136.8,"s":[209.081]}],"ix":4}},"a":{"a":0,"k":[161.106,47.581,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.452,0.479],[0,0],[0,0],[1.456,-0.058],[0,0],[2.714,3.158],[0,0],[0,0],[0,0],[0.468,0.32],[4.129,-6.04],[-6.04,-4.129],[-0.491,-0.252],[0,0],[-0.06,-0.018],[0,0],[-1.804,-3.753],[0,0],[-0.789,-1.247],[0,0],[0,0],[-2.911,-1.617],[-5.668,7.279],[8.957,6.123]],"o":[[0,0],[0,0],[-1.448,-0.282],[0,0],[-4.151,-0.318],[0,0],[-0.039,-0.049],[0,0],[-0.413,-0.366],[-6.04,-4.129],[-4.129,6.04],[0.468,0.32],[0,0],[0,0],[0,0],[3.927,1.383],[0,0],[0.474,1.377],[0,0],[0,0],[1.635,2.583],[8.065,4.48],[6.769,-8.693],[-2.193,-1.499]],"v":[[176.917,36.441],[176.917,36.44],[176.911,36.44],[172.541,36.104],[167.85,35.745],[157.129,30.317],[153.66,26.282],[152.047,24.591],[152.047,24.591],[150.734,23.552],[132.321,27.012],[135.781,45.424],[137.225,46.27],[137.255,46.292],[139.387,47.16],[144.406,48.927],[153.355,56.947],[155.393,61.187],[157.292,65.138],[157.294,65.144],[157.295,65.143],[164.135,71.581],[188.189,66.666],[183.959,39.391]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"\nsemicircle_electric","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":87,"s":[100]},{"t":92.0001953125,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":-29.555,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":-14.741,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":6,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":30.445,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":53.244,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":76.044,"s":[10.446]},{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":95.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":110.059,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":130.8,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":155.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":178.044,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":200.844,"s":[10.446]},{"t":220.044140625,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[82.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[128.959]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[128.959]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[76.959]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[90.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[82.334]},{"t":141.5998046875,"s":[128.959]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[128.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[140.971]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[140.971]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[126.971]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[130.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[128.471]},{"t":141.5998046875,"s":[140.971]}],"ix":4}},"a":{"a":0,"k":[-213.541,-18.529,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.146,-1.492],[5.42,2.097],[-0.46,5.512],[-1.755,-0.679]],"o":[[1.755,0.679],[-3.37,4.387],[-5.42,-2.097],[0.157,-1.875],[0,0]],"v":[[-203.342,-17.911],[-202.107,-13.557],[-216.872,-9.425],[-225.01,-22.419],[-221.165,-24.807]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3686274509803922,0.9450980392156862,0.9490196078431372,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"\nsemicircle_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":-29.555,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":-14.741,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":6,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":30.445,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":53.244,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":76.044,"s":[10.446]},{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":95.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":110.059,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":130.8,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":155.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":178.044,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":200.844,"s":[10.446]},{"t":220.044140625,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[82.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[128.959]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[128.959]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[76.959]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[90.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[82.334]},{"t":141.5998046875,"s":[128.959]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[128.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[140.971]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[140.971]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[126.971]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[130.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[128.471]},{"t":141.5998046875,"s":[140.971]}],"ix":4}},"a":{"a":0,"k":[-213.541,-18.529,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.146,-1.492],[5.42,2.097],[-0.46,5.512],[-1.755,-0.679]],"o":[[1.755,0.679],[-3.37,4.387],[-5.42,-2.097],[0.157,-1.875],[0,0]],"v":[[-203.342,-17.911],[-202.107,-13.557],[-216.872,-9.425],[-225.01,-22.419],[-221.165,-24.807]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"triangle yellow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.36],"y":[0.08]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.36],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":83,"s":[100]},{"t":88,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":14.814,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":35.556,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":60,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":82.8,"s":[-9.548]},{"i":{"x":[0.845],"y":[0.89]},"o":{"x":[0.456],"y":[-0.077]},"t":105.6,"s":[10.446]},{"t":124.7998046875,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[116.327]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[155.404]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[155.404]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[104.154]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[120.279]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[116.327]},{"t":134.400390625,"s":[155.404]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[199.579]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[204.55]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[204.55]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[199.05]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[200.425]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[199.579]},{"t":134.400390625,"s":[204.55]}],"ix":4}},"a":{"a":0,"k":[-183.096,52.05,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.832,-1.058],[0,0],[-1.832,-1.058],[0,0],[0,2.115],[0,0]],"o":[[0,0],[-1.832,1.058],[0,0],[1.832,1.058],[0,0],[0,-2.115]],"v":[[-177.038,37.258],[-199.403,50.17],[-199.403,54.93],[-177.038,67.842],[-172.916,65.462],[-172.916,39.638]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9882352941176471,0.788235294117647,0.20392156862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"triangle grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":14.814,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":35.556,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":60,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":82.8,"s":[-9.548]},{"i":{"x":[0.845],"y":[0.89]},"o":{"x":[0.456],"y":[-0.077]},"t":105.6,"s":[10.446]},{"t":124.7998046875,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[116.327]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[155.404]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[155.404]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[104.154]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[120.279]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[116.327]},{"t":134.400390625,"s":[155.404]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[199.579]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[204.55]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[204.55]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[199.05]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[200.425]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[199.579]},{"t":134.400390625,"s":[204.55]}],"ix":4}},"a":{"a":0,"k":[-183.096,52.05,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.832,-1.058],[0,0],[-1.832,-1.058],[0,0],[0,2.115],[0,0]],"o":[[0,0],[-1.832,1.058],[0,0],[1.832,1.058],[0,0],[0,-2.115]],"v":[[-177.038,37.258],[-199.403,50.17],[-199.403,54.93],[-177.038,67.842],[-172.916,65.462],[-172.916,39.638]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Group 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":124.7998046875,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":-25.2,"s":[508.506]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[481.131]},{"i":{"x":[0.374],"y":[1.076]},"o":{"x":[0.403],"y":[0]},"t":32.4,"s":[481.131]},{"i":{"x":[0.624],"y":[1.189]},"o":{"x":[0.575],"y":[0.459]},"t":61.2,"s":[510.631]},{"i":{"x":[0.445],"y":[0.741]},"o":{"x":[0.482],"y":[0.217]},"t":86.4,"s":[505.506]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":100.8,"s":[508.506]},{"t":139.2001953125,"s":[481.131]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":-25.2,"s":[125.433]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[139.058]},{"i":{"x":[0.374],"y":[1.076]},"o":{"x":[0.403],"y":[0]},"t":32.4,"s":[139.058]},{"i":{"x":[0.624],"y":[1.189]},"o":{"x":[0.575],"y":[0.459]},"t":61.2,"s":[124.558]},{"i":{"x":[0.445],"y":[0.741]},"o":{"x":[0.482],"y":[0.217]},"t":86.4,"s":[127.183]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":100.8,"s":[125.433]},{"t":139.2001953125,"s":[139.058]}],"ix":4}},"a":{"a":0,"k":[207.631,-21.942,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.819],[4.819,0],[0,4.819],[-4.819,0]],"o":[[0,4.819],[-4.819,0],[0,-4.819],[4.819,0]],"v":[[219.606,-23.192],[210.881,-14.467],[202.156,-23.192],[210.881,-31.917]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"oval left green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":86,"s":[100]},{"t":91,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[21.58]},{"t":124.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[141.923]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[190.423]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[190.423]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[137.423]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[147.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[141.923]},{"t":136.7998046875,"s":[190.423]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[76.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[111.714]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[111.714]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[73.214]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[80.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[76.339]},{"t":136.7998046875,"s":[111.714]}],"ix":4}},"a":{"a":0,"k":[-155.577,-70.286,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.064,4.133],[0,0],[-4.133,-5.064],[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0]],"o":[[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0],[-5.064,4.133],[0,0],[-4.133,-5.064]],"v":[[-171.83,-90.169],[-171.83,-90.169],[-155.177,-88.483],[-137.639,-67.056],[-139.325,-50.403],[-139.325,-50.403],[-155.978,-52.088],[-173.516,-73.516]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3568627450980392,0.7254901960784313,0.4549019607843137,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"oval left grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[21.58]},{"t":124.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[141.923]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[190.423]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[190.423]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[137.423]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[147.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[141.923]},{"t":136.7998046875,"s":[190.423]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[76.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[111.714]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[111.714]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[73.214]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[80.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[76.339]},{"t":136.7998046875,"s":[111.714]}],"ix":4}},"a":{"a":0,"k":[-155.577,-70.286,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.064,4.133],[0,0],[-4.133,-5.064],[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0]],"o":[[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0],[-5.064,4.133],[0,0],[-4.133,-5.064]],"v":[[-171.83,-90.169],[-171.83,-90.169],[-155.177,-88.483],[-137.639,-67.056],[-139.325,-50.403],[-139.325,-50.403],[-155.978,-52.088],[-173.516,-73.516]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"Null 2","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":-129,"ix":10},"p":{"a":0,"k":[110.25,5,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":74.4,"op":202.8,"st":74.4,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"thumb","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":128.725,"ix":3},"y":{"a":0,"k":-83.038,"ix":4}},"a":{"a":0,"k":[128.725,-83.038,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[4.839,-13.578],[11.106,-33.272],[5.661,-1.05],[1.136,4.946],[0.029,5.583],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-1.573,4.712],[-6.045,1.121],[-1.264,-5.501],[-0.063,-12.384],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[92.997,21.162],[83.365,34.523],[71.497,24.978],[70.873,8.188],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":24,"s":[{"i":[[0,0],[4.839,-13.578],[20.554,-28.423],[5.716,0.693],[-0.396,5.059],[-1.643,5.335],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.911,4.026],[-6.103,-0.739],[0.44,-5.627],[3.646,-11.836],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[79.712,22.036],[66.523,31.902],[58.055,19.243],[62.484,3.035],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[4.839,-13.578],[19.525,-29.139],[5.737,0.488],[-0.215,5.07],[-1.452,5.391],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.765,4.127],[-6.126,-0.521],[0.239,-5.639],[3.22,-11.958],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[83.926,22.786],[71.098,33.116],[62.183,20.768],[66.031,4.413],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":69.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[4.839,-13.578],[24.293,-25.05],[5.529,1.498],[-1.112,4.925],[-2.38,5.018],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.441,3.548],[-5.903,-1.599],[1.237,-5.477],[5.279,-11.133],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[75.271,21.529],[60.877,29.36],[54.347,15.688],[61.021,0.363],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[0,0],[4.839,-13.578],[20.903,-28.167],[5.707,0.763],[-0.458,5.054],[-1.709,5.315],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.961,3.989],[-6.094,-0.815],[0.51,-5.621],[3.792,-11.79],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[80.005,22.37],[66.696,32.072],[58.385,19.31],[63.014,3.158],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"t":122,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"stroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[1.926,0.283],[1.533,-1.2],[0.392,-1.769],[-3.206,-3.461],[-1.035,-0.649],[0.025,0.012]],"o":[[-1.781,-0.786],[-1.926,-0.283],[-1.427,1.117],[-1.022,4.605],[0.83,0.896],[-0.025,-0.012],[0,0]],"v":[[93.996,12.919],[88.481,11.055],[82.93,12.26],[80.334,16.912],[83.89,30.047],[86.632,32.29],[86.559,32.255]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":24,"s":[{"i":[[0,0],[1.753,0.846],[1.822,-0.687],[0.904,-1.57],[-2.023,-4.261],[-0.793,-0.929],[0.02,0.019]],"o":[[-1.464,-1.283],[-1.753,-0.846],[-1.695,0.639],[-2.353,4.088],[0.524,1.103],[-0.02,-0.019],[0,0]],"v":[[83.131,14.469],[78.427,11.041],[72.77,10.529],[68.901,14.191],[68.363,27.788],[70.308,30.749],[70.248,30.694]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[1.782,0.783],[1.796,-0.751],[0.847,-1.602],[-2.174,-4.186],[-0.826,-0.9],[0.021,0.018]],"o":[[-1.509,-1.23],[-1.782,-0.783],[-1.672,0.699],[-2.205,4.17],[0.563,1.084],[-0.021,-0.018],[0,0]],"v":[[87.073,15.102],[82.25,11.843],[76.578,11.534],[72.842,15.332],[72.79,28.94],[74.84,31.83],[74.778,31.776]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":69.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[1.605,1.083],[1.891,-0.416],[1.114,-1.417],[-1.383,-4.484],[-0.649,-1.027],[0.017,0.021]],"o":[[-1.258,-1.472],[-1.605,-1.083],[-1.76,0.387],[-2.9,3.689],[0.358,1.161],[-0.017,-0.021],[0,0]],"v":[[79.718,14.568],[75.576,10.521],[70.079,9.209],[65.746,12.262],[63.276,25.573],[64.769,28.766],[64.718,28.703]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[0,0],[1.742,0.868],[1.83,-0.664],[0.923,-1.559],[-1.97,-4.286],[-0.782,-0.938],[0.02,0.019]],"o":[[-1.448,-1.301],[-1.742,-0.868],[-1.703,0.618],[-2.403,4.059],[0.51,1.11],[-0.02,-0.019],[0,0]],"v":[[83.518,14.846],[78.857,11.36],[73.206,10.778],[69.292,14.392],[68.587,27.982],[70.495,30.967],[70.436,30.911]],"c":false}]},{"t":122,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"nail","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"index","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":2.4,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":16.8,"s":[14]},{"i":{"x":[0.833],"y":[0.95]},"o":{"x":[0.167],"y":[0.167]},"t":26.4,"s":[-8.5]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.992]},"t":33.6,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50.4,"s":[0]},{"i":{"x":[0.339],"y":[1]},"o":{"x":[0.497],"y":[0]},"t":81.6,"s":[0]},{"t":118.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":0,"k":77.038,"ix":3},"y":{"a":0,"k":-35.351,"ix":4}},"a":{"a":0,"k":[77.038,-35.351,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}]},{"t":110.400390625,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"index stroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[0,0],[-1.402,0.164],[-1.191,0.756],[1.16,5.51],[4.658,-0.366]],"o":[[0.865,1.115],[1.402,-0.164],[4.212,-2.673],[-1.054,-5.008],[0,0]],"v":[[-27.591,62.383],[-24.41,63.765],[-20.527,62.173],[-13.334,47.619],[-24.309,42.263]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-42.467,46.279],[-39.884,48.693],[-35.689,48.805],[-23.23,38.396],[-31.108,29.064]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-41.564,44.492],[-39.044,47.113],[-34.849,47.225],[-22.802,37.349],[-30.679,28.016]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-34.221,50.995],[-32.488,54.052],[-28.351,54.76],[-14.537,46.231],[-21.005,35.873]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-38.715,47.696],[-36.77,50.356],[-32.633,51.064],[-18.819,42.535],[-25.287,32.176]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-33.74,50.709],[-31.901,53.508],[-27.764,54.216],[-13.95,45.687],[-20.419,35.328]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[0,0],[-1.407,-0.075],[-1.3,0.544],[0.216,5.62],[4.647,0.423]],"o":[[0.665,1.243],[1.407,0.075],[4.596,-1.924],[-0.197,-5.108],[0,0]],"v":[[-23.679,59.511],[-20.737,61.449],[-16.646,60.534],[-7.118,47.413],[-17.024,40.295]],"c":false}]},{"t":110.400390625,"s":[{"i":[[0,0],[-1.402,0.164],[-1.191,0.756],[1.16,5.51],[4.658,-0.366]],"o":[[0.865,1.115],[1.402,-0.164],[4.212,-2.673],[-1.054,-5.008],[0,0]],"v":[[-27.841,62.392],[-24.41,63.765],[-20.527,62.173],[-13.334,47.619],[-24.309,42.263]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"index nail","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}]},{"t":110.400390625,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"index base","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.524],"y":[0.895]},"o":{"x":[0.718],"y":[-0.082]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.521],"y":[-0.037]},"t":14.4,"s":[14]},{"i":{"x":[0.833],"y":[0.919]},"o":{"x":[0.167],"y":[0.167]},"t":26.4,"s":[-7.4]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.311]},"t":33.6,"s":[4.2]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50,"s":[11.1]},{"i":{"x":[0.569],"y":[1.061]},"o":{"x":[0.4],"y":[0]},"t":81.6,"s":[4.2]},{"i":{"x":[0.461],"y":[1]},"o":{"x":[0.251],"y":[0.311]},"t":110.4,"s":[-0.8]},{"t":122.400390625,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":12,"s":[410.225]},{"i":{"x":[0.583],"y":[0.613]},"o":{"x":[0.167],"y":[0.147]},"t":26.4,"s":[376.975]},{"i":{"x":[0.833],"y":[0.908]},"o":{"x":[0.417],"y":[0.505]},"t":30,"s":[398.067]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.307]},"t":33.6,"s":[414.225]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50,"s":[436.225]},{"i":{"x":[0.408],"y":[1.006]},"o":{"x":[0.376],"y":[0]},"t":81.6,"s":[414.225]},{"i":{"x":[0.62],"y":[0.952]},"o":{"x":[0.555],"y":[0.184]},"t":94.8,"s":[421.403]},{"i":{"x":[0.649],"y":[0.782]},"o":{"x":[0.266],"y":[-0.313]},"t":110.4,"s":[408.725]},{"t":122.400390625,"s":[410.225]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.649],"y":[1.21]},"o":{"x":[0.527],"y":[0]},"t":0,"s":[54.962]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.416],"y":[0.203]},"t":12,"s":[47.562]},{"i":{"x":[0.583],"y":[0.588]},"o":{"x":[0.167],"y":[0.157]},"t":26.4,"s":[58.462]},{"i":{"x":[0.713],"y":[0.746]},"o":{"x":[0.357],"y":[0.357]},"t":30,"s":[76.593]},{"i":{"x":[0.785],"y":[0.851]},"o":{"x":[0.432],"y":[0.565]},"t":32.4,"s":[88.524]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.291]},"t":33.6,"s":[92.562]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50,"s":[114.462]},{"i":{"x":[0.622],"y":[0.96]},"o":{"x":[0.248],"y":[0]},"t":81.6,"s":[92.962]},{"i":{"x":[0.628],"y":[0.694]},"o":{"x":[0.204],"y":[0]},"t":102,"s":[51.443]},{"i":{"x":[0.643],"y":[1]},"o":{"x":[0.276],"y":[-3.844]},"t":110.4,"s":[55.262]},{"t":122.400390625,"s":[54.962]}],"ix":4}},"a":{"a":0,"k":[110.225,-93.038,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 6","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 7","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"t":82,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-23.682,-0.979],[-5.567,3.943],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.436,4.7],[27.875,1.153],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[1.949,-15.44],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 2","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-11.1,"ix":10},"p":{"a":0,"k":[-16.995,-33.901,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":[[4.5,-9],[-0.75,-5],[-6.5,-0.25],[-5.598,-1.022],[-6.348,0.686],[-2.75,2.25],[8.25,6.5]],"o":[[-4.5,9],[0.75,5],[2.039,0.078],[12.249,2.235],[9.25,-1],[2.75,-2.25],[-8.25,-6.5]],"v":[[-21,-5.75],[-32.75,37.25],[-19.593,49.869],[-11.691,60.349],[25.363,62.509],[55.25,53.5],[56.901,30.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"fingerprint5_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.473,-0.064],[-0.075,-0.025],[-1.039,-1.686],[2.604,-2.504],[3.815,0.519],[-2.131,2.049],[2.577,0.351],[1.409,-1.355],[-8.973,-1.221],[-5.849,2.741],[-1.366,1.314],[-0.758,2.206],[-0.698,0.034],[0.129,-0.344],[1.775,-1.706],[2.261,-1.064],[7.246,0.986],[-5.684,5.466],[-3.815,-0.519],[2.131,-2.049],[-2.577,-0.351],[-1.409,1.355],[1.137,1.887],[2.65,0.922],[-0.5,0.308]],"o":[[0.088,0.012],[2.986,1.042],[1.313,2.186],[-2.131,2.049],[-3.815,-0.519],[1.407,-1.353],[-2.581,-0.351],[-4.958,4.768],[6.373,0.867],[1.943,-0.906],[1.026,-0.987],[0.12,-0.36],[0.715,-0.046],[-0.623,1.806],[-1.578,1.518],[-6.655,3.124],[-10.207,-1.389],[2.131,-2.049],[3.815,0.519],[-1.407,1.353],[2.577,0.351],[2.25,-2.164],[-0.895,-1.478],[-0.515,-0.172],[0.414,-0.275]],"v":[[-13.704,71.497],[-13.439,71.563],[-7.855,75.354],[-9.852,82.619],[-20.631,85.397],[-23.675,80.738],[-25.788,77.649],[-33.005,79.468],[-25.724,90.319],[-5.593,87.24],[-0.587,83.88],[2.657,79.109],[4.148,78.389],[5.202,78.95],[1.632,84.182],[-4.157,88.072],[-27.056,91.596],[-35.263,79.174],[-24.484,76.396],[-21.44,81.054],[-19.327,84.144],[-12.11,82.324],[-10.373,76.049],[-15.274,72.711],[-15.256,71.833]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84,"s":[100]},{"t":90.999609375,"s":[0]}],"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"fingerprint5_blue","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.473,-0.064],[-0.075,-0.025],[-1.039,-1.686],[2.604,-2.504],[3.815,0.519],[-2.131,2.049],[2.577,0.351],[1.409,-1.355],[-8.973,-1.221],[-5.849,2.741],[-1.366,1.314],[-0.758,2.206],[-0.698,0.034],[0.129,-0.344],[1.775,-1.706],[2.261,-1.064],[7.246,0.986],[-5.684,5.466],[-3.815,-0.519],[2.131,-2.049],[-2.577,-0.351],[-1.409,1.355],[1.137,1.887],[2.65,0.922],[-0.5,0.308]],"o":[[0.088,0.012],[2.986,1.042],[1.313,2.186],[-2.131,2.049],[-3.815,-0.519],[1.407,-1.353],[-2.581,-0.351],[-4.958,4.768],[6.373,0.867],[1.943,-0.906],[1.026,-0.987],[0.12,-0.36],[0.715,-0.046],[-0.623,1.806],[-1.578,1.518],[-6.655,3.124],[-10.207,-1.389],[2.131,-2.049],[3.815,0.519],[-1.407,1.353],[2.577,0.351],[2.25,-2.164],[-0.895,-1.478],[-0.515,-0.172],[0.414,-0.275]],"v":[[-13.704,71.497],[-13.439,71.563],[-7.855,75.354],[-9.852,82.619],[-20.631,85.397],[-23.675,80.738],[-25.788,77.649],[-33.005,79.468],[-25.724,90.319],[-5.593,87.24],[-0.587,83.88],[2.657,79.109],[4.148,78.389],[5.202,78.95],[1.632,84.182],[-4.157,88.072],[-27.056,91.596],[-35.263,79.174],[-24.484,76.396],[-21.44,81.054],[-19.327,84.144],[-12.11,82.324],[-10.373,76.049],[-15.274,72.711],[-15.256,71.833]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"fingerprint4_grey","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":79,"s":[0]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":86,"s":[100]},{"t":93.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.315,-0.043],[-1.151,-1.008],[2.289,-2.201],[0.631,0.086],[-0.37,0.356],[1.658,1.411],[2.246,0.306],[0.99,0.036],[-0.256,0.369],[-0.692,-0.022]],"o":[[2.669,0.363],[2.014,1.732],[-0.368,0.353],[-0.631,-0.086],[1.853,-1.782],[-0.961,-0.824],[-0.538,-0.073],[-0.669,-0.019],[0.245,-0.358],[1.433,0.037]],"v":[[-20.924,73.487],[-15.14,75.558],[-15.577,81.837],[-17.358,82.318],[-17.823,81.532],[-17.493,76.436],[-22.259,74.763],[-24.725,74.571],[-25.486,73.876],[-23.804,73.268]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"fingerprint4_blue","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.315,-0.043],[-1.151,-1.008],[2.289,-2.201],[0.631,0.086],[-0.37,0.356],[1.658,1.411],[2.246,0.306],[0.99,0.036],[-0.256,0.369],[-0.692,-0.022]],"o":[[2.669,0.363],[2.014,1.732],[-0.368,0.353],[-0.631,-0.086],[1.853,-1.782],[-0.961,-0.824],[-0.538,-0.073],[-0.669,-0.019],[0.245,-0.358],[1.433,0.037]],"v":[[-20.924,73.487],[-15.14,75.558],[-15.577,81.837],[-17.358,82.318],[-17.823,81.532],[-17.493,76.436],[-22.259,74.763],[-24.725,74.571],[-25.486,73.876],[-23.804,73.268]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"fingerprint3_grey","parent":18,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84,"s":[100]},{"t":90.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.292,-0.04],[-0.067,-0.155],[0.092,-1.735],[2.12,-2.038],[7,0.952],[-3.905,3.755],[-0.631,-0.086],[0.37,-0.356],[-5.765,-0.785],[-3.184,3.061],[-0.051,1.552],[0.701,1.221],[-0.688,0.193]],"o":[[0.292,0.04],[0.811,1.365],[-0.067,1.765],[-3.905,3.755],[-7,-0.952],[0.368,-0.353],[0.627,0.085],[-3.184,3.061],[5.765,0.785],[1.894,-1.821],[0.078,-1.65],[-0.163,-0.312],[0.387,-0.093]],"v":[[-2.403,73.337],[-1.817,73.634],[-0.782,77.587],[-4.137,83.397],[-23.926,88.485],[-29.536,79.94],[-27.755,79.46],[-27.29,80.246],[-22.611,87.221],[-6.383,83.091],[-3.407,77.937],[-4.373,74.311],[-3.44,73.413]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"fingerprint3_blue","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.292,-0.04],[-0.067,-0.155],[0.092,-1.735],[2.12,-2.038],[7,0.952],[-3.905,3.755],[-0.631,-0.086],[0.37,-0.356],[-5.765,-0.785],[-3.184,3.061],[-0.051,1.552],[0.701,1.221],[-0.688,0.193]],"o":[[0.292,0.04],[0.811,1.365],[-0.067,1.765],[-3.905,3.755],[-7,-0.952],[0.368,-0.353],[0.627,0.085],[-3.184,3.061],[5.765,0.785],[1.894,-1.821],[0.078,-1.65],[-0.163,-0.312],[0.387,-0.093]],"v":[[-2.403,73.337],[-1.817,73.634],[-0.782,77.587],[-4.137,83.397],[-23.926,88.485],[-29.536,79.94],[-27.755,79.46],[-27.29,80.246],[-22.611,87.221],[-6.383,83.091],[-3.407,77.937],[-4.373,74.311],[-3.44,73.413]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"fingerprint2_grey","parent":18,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":83,"s":[100]},{"t":89.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.358,-0.049],[-0.119,-0.105],[0.66,-0.242],[4.384,-0.517],[4.934,3.01],[0.394,2.061],[-0.725,0.132],[-0.056,-0.339],[-2.118,-1.286],[-8.361,0.998],[-3.676,1.319]],"o":[[0.223,0.03],[0.306,0.272],[-4.065,1.469],[-9.177,1.09],[-2.353,-1.431],[-0.069,-0.326],[0.725,-0.132],[0.362,1.868],[4.506,2.734],[3.97,-0.47],[0.377,-0.152]],"v":[[-4.261,90.896],[-3.73,91.1],[-4.381,92.021],[-17.098,95.013],[-40.242,91.878],[-44.381,86.622],[-43.192,85.774],[-41.781,86.14],[-38.044,90.893],[-16.943,93.749],[-5.423,91.043]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"fingerprint2_blue","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.358,-0.049],[-0.119,-0.105],[0.66,-0.242],[4.384,-0.517],[4.934,3.01],[0.394,2.061],[-0.725,0.132],[-0.056,-0.339],[-2.118,-1.286],[-8.361,0.998],[-3.676,1.319]],"o":[[0.223,0.03],[0.306,0.272],[-4.065,1.469],[-9.177,1.09],[-2.353,-1.431],[-0.069,-0.326],[0.725,-0.132],[0.362,1.868],[4.506,2.734],[3.97,-0.47],[0.377,-0.152]],"v":[[-4.261,90.896],[-3.73,91.1],[-4.381,92.021],[-17.098,95.013],[-40.242,91.878],[-44.381,86.622],[-43.192,85.774],[-41.781,86.14],[-38.044,90.893],[-16.943,93.749],[-5.423,91.043]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"fingerprint1_grey","parent":18,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":83,"s":[100]},{"t":89.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.404,-0.055],[-0.106,-0.071],[-4.465,-0.608],[-5.072,0.669],[0,-0.346],[0.71,-0.092],[4.823,0.656],[3.198,1.952],[-0.608,0.264]],"o":[[0.181,0.025],[3.004,1.839],[4.442,0.604],[0.71,-0.092],[-0.023,0.343],[-5.501,0.709],[-4.781,-0.651],[-0.39,-0.241],[0.443,-0.202]],"v":[[-43.27,93.41],[-42.833,93.556],[-32.193,97.04],[-17.842,96.956],[-16.579,97.418],[-17.924,98.217],[-33.51,98.306],[-45.04,94.542],[-44.628,93.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"fingerprint1_blue","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.404,-0.055],[-0.106,-0.071],[-4.465,-0.608],[-5.072,0.669],[0,-0.346],[0.71,-0.092],[4.823,0.656],[3.198,1.952],[-0.608,0.264]],"o":[[0.181,0.025],[3.004,1.839],[4.442,0.604],[0.71,-0.092],[-0.023,0.343],[-5.501,0.709],[-4.781,-0.651],[-0.39,-0.241],[0.443,-0.202]],"v":[[-43.27,93.41],[-42.833,93.556],[-32.193,97.04],[-17.842,96.956],[-16.579,97.418],[-17.924,98.217],[-33.51,98.306],[-45.04,94.542],[-44.628,93.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"button blue","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":80,"s":[100]},{"t":86,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[278.43,234.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.489,0.489,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.565,0.565,0.34],"y":[0.962,0.962,1]},"o":{"x":[0.571,0.571,0.66],"y":[0,0,0]},"t":36,"s":[106,106,100]},{"i":{"x":[0.489,0.489,0.34],"y":[1.034,1.034,1]},"o":{"x":[0.617,0.617,0.66],"y":[-0.022,-0.022,0]},"t":45.6,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.571,0.571,0.66],"y":[0.054,0.054,0]},"t":55.2,"s":[106,106,100]},{"t":64.7998046875,"s":[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,-12.99],[28.705,0],[0,12.99],[-28.705,0]],"o":[[0,12.99],[-28.705,0],[0,-12.99],[28.705,0]],"v":[[30.405,86.351],[-21.57,109.872],[-73.545,86.351],[-21.57,62.83]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"button grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[278.43,234.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.489,0.489,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.565,0.565,0.34],"y":[0.962,0.962,1]},"o":{"x":[0.571,0.571,0.66],"y":[0,0,0]},"t":36,"s":[106,106,100]},{"i":{"x":[0.489,0.489,0.34],"y":[1.034,1.034,1]},"o":{"x":[0.617,0.617,0.66],"y":[-0.022,-0.022,0]},"t":45.6,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.571,0.571,0.66],"y":[0.054,0.054,0]},"t":55.2,"s":[106,106,100]},{"t":64.7998046875,"s":[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,-12.99],[28.705,0],[0,12.99],[-28.705,0]],"o":[[0,12.99],[-28.705,0],[0,-12.99],[28.705,0]],"v":[[30.405,86.351],[-21.57,109.872],[-73.545,86.351],[-21.57,62.83]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":" 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[278.43,234.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":25.2,"s":[{"i":[[17.59,-2.239],[0,-15.103],[-41.731,0],[0,19.094],[24.106,5.75]],"o":[[-29.182,3.714],[0,19.094],[41.731,0],[0,-13.028],[-24.106,-5.75]],"v":[[-46.465,52.739],[-97.13,85.391],[-21.57,119.963],[53.99,85.391],[14.981,55.125]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":42,"s":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":56.4,"s":[{"i":[[23.972,-3.051],[0,-20.583],[-56.871,0],[0,26.021],[32.852,7.836]],"o":[[-39.77,5.061],[0,26.021],[56.871,0],[0,-17.754],[-32.852,-7.836]],"v":[[-55.497,41.154],[-124.545,85.652],[-21.57,132.769],[81.405,85.652],[28.242,44.406]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":70.8,"s":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":85.2,"s":[{"i":[[18.871,-2.402],[0,-16.202],[-44.769,0],[0,20.484],[25.861,6.169]],"o":[[-31.307,3.984],[0,20.484],[44.769,0],[0,-13.976],[-25.861,-6.169]],"v":[[-48.277,50.414],[-102.631,85.443],[-21.57,122.533],[59.491,85.443],[17.642,52.974]],"c":true}]},{"t":100.800390625,"s":[{"i":[[17.59,-2.239],[0,-15.103],[-41.731,0],[0,19.094],[24.106,5.75]],"o":[[-29.182,3.714],[0,19.094],[41.731,0],[0,-13.028],[-24.106,-5.75]],"v":[[-46.465,52.739],[-97.13,85.391],[-21.57,119.963],[53.99,85.391],[14.981,55.125]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0.2,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":139.2,"st":26.4,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default_light.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default_light.json new file mode 100644 index 0000000..f9e3d68 --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_default_light.json
@@ -0,0 +1 @@ +{"v":"5.9.2","fr":30,"ip":0,"op":126,"w":600,"h":296,"nm":"LM_fingerprint_1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hori_magenta","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":43,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":48,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.17],"y":[0]},"t":85,"s":[100]},{"t":90.0001953125,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-9.548]},{"i":{"x":[0.668],"y":[0.194]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[10.446]},{"t":124.8,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[462.856]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[441.606]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[441.606]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[468.856]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[457.606]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[462.856]},{"t":136.8,"s":[441.606]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[195.081]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[209.081]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[209.081]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[190.831]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[198.331]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[195.081]},{"t":136.8,"s":[209.081]}],"ix":4}},"a":{"a":0,"k":[161.106,47.581,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.452,0.479],[0,0],[0,0],[1.456,-0.058],[0,0],[2.714,3.158],[0,0],[0,0],[0,0],[0.468,0.32],[4.129,-6.04],[-6.04,-4.129],[-0.491,-0.252],[0,0],[-0.06,-0.018],[0,0],[-1.804,-3.753],[0,0],[-0.789,-1.247],[0,0],[0,0],[-2.911,-1.617],[-5.668,7.279],[8.957,6.123]],"o":[[0,0],[0,0],[-1.448,-0.282],[0,0],[-4.151,-0.318],[0,0],[-0.039,-0.049],[0,0],[-0.413,-0.366],[-6.04,-4.129],[-4.129,6.04],[0.468,0.32],[0,0],[0,0],[0,0],[3.927,1.383],[0,0],[0.474,1.377],[0,0],[0,0],[1.635,2.583],[8.065,4.48],[6.769,-8.693],[-2.193,-1.499]],"v":[[176.917,36.441],[176.917,36.44],[176.911,36.44],[172.541,36.104],[167.85,35.745],[157.129,30.317],[153.66,26.282],[152.047,24.591],[152.047,24.591],[150.734,23.552],[132.321,27.012],[135.781,45.424],[137.225,46.27],[137.255,46.292],[139.387,47.16],[144.406,48.927],[153.355,56.947],[155.393,61.187],[157.292,65.138],[157.294,65.144],[157.295,65.143],[164.135,71.581],[188.189,66.666],[183.959,39.391]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.933333337307,0.372549027205,0.980392158031,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color5","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"hori_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-9.548]},{"i":{"x":[0.668],"y":[0.194]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[10.446]},{"t":124.8,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[462.856]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[441.606]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[441.606]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[468.856]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[457.606]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[462.856]},{"t":136.8,"s":[441.606]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":-26.4,"s":[195.081]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[209.081]},{"i":{"x":[0.488],"y":[1.053]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[209.081]},{"i":{"x":[0.728],"y":[1.04]},"o":{"x":[0.462],"y":[0.124]},"t":57.6,"s":[190.831]},{"i":{"x":[0.561],"y":[1.159]},"o":{"x":[0.404],"y":[0.098]},"t":82.8,"s":[198.331]},{"i":{"x":[0.416],"y":[1]},"o":{"x":[0.346],"y":[0.078]},"t":97.2,"s":[195.081]},{"t":136.8,"s":[209.081]}],"ix":4}},"a":{"a":0,"k":[161.106,47.581,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[2.452,0.479],[0,0],[0,0],[1.456,-0.058],[0,0],[2.714,3.158],[0,0],[0,0],[0,0],[0.468,0.32],[4.129,-6.04],[-6.04,-4.129],[-0.491,-0.252],[0,0],[-0.06,-0.018],[0,0],[-1.804,-3.753],[0,0],[-0.789,-1.247],[0,0],[0,0],[-2.911,-1.617],[-5.668,7.279],[8.957,6.123]],"o":[[0,0],[0,0],[-1.448,-0.282],[0,0],[-4.151,-0.318],[0,0],[-0.039,-0.049],[0,0],[-0.413,-0.366],[-6.04,-4.129],[-4.129,6.04],[0.468,0.32],[0,0],[0,0],[0,0],[3.927,1.383],[0,0],[0.474,1.377],[0,0],[0,0],[1.635,2.583],[8.065,4.48],[6.769,-8.693],[-2.193,-1.499]],"v":[[176.917,36.441],[176.917,36.44],[176.911,36.44],[172.541,36.104],[167.85,35.745],[157.129,30.317],[153.66,26.282],[152.047,24.591],[152.047,24.591],[150.734,23.552],[132.321,27.012],[135.781,45.424],[137.225,46.27],[137.255,46.292],[139.387,47.16],[144.406,48.927],[153.355,56.947],[155.393,61.187],[157.292,65.138],[157.294,65.144],[157.295,65.143],[164.135,71.581],[188.189,66.666],[183.959,39.391]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"\nsemicircle_electric","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":87,"s":[100]},{"t":92.0001953125,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":-29.555,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":-14.741,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":6,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":30.445,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":53.244,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":76.044,"s":[10.446]},{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":95.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":110.059,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":130.8,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":155.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":178.044,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":200.844,"s":[10.446]},{"t":220.044140625,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[82.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[128.959]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[128.959]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[76.959]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[90.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[82.334]},{"t":141.5998046875,"s":[128.959]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[128.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[140.971]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[140.971]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[126.971]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[130.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[128.471]},{"t":141.5998046875,"s":[140.971]}],"ix":4}},"a":{"a":0,"k":[-213.541,-18.529,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.146,-1.492],[5.42,2.097],[-0.46,5.512],[-1.755,-0.679]],"o":[[1.755,0.679],[-3.37,4.387],[-5.42,-2.097],[0.157,-1.875],[0,0]],"v":[[-203.342,-17.911],[-202.107,-13.557],[-216.872,-9.425],[-225.01,-22.419],[-221.165,-24.807]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.188235297799,0.886274516582,0.917647063732,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"\nsemicircle_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":-29.555,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":-14.741,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":6,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":30.445,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":53.244,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":76.044,"s":[10.446]},{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":95.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":110.059,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":130.8,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":155.244,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":178.044,"s":[-9.548]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.456],"y":[-0.077]},"t":200.844,"s":[10.446]},{"t":220.044140625,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[82.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[128.959]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[128.959]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[76.959]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[90.334]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[82.334]},{"t":141.5998046875,"s":[128.959]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":-24,"s":[128.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15.6,"s":[140.971]},{"i":{"x":[0.521],"y":[1.052]},"o":{"x":[0.509],"y":[0]},"t":32.4,"s":[140.971]},{"i":{"x":[0.614],"y":[1.252]},"o":{"x":[0.483],"y":[0.358]},"t":60,"s":[126.971]},{"i":{"x":[0.517],"y":[0.787]},"o":{"x":[0.466],"y":[0.339]},"t":87.6,"s":[130.471]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.58],"y":[-0.064]},"t":102,"s":[128.471]},{"t":141.5998046875,"s":[140.971]}],"ix":4}},"a":{"a":0,"k":[-213.541,-18.529,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.146,-1.492],[5.42,2.097],[-0.46,5.512],[-1.755,-0.679]],"o":[[1.755,0.679],[-3.37,4.387],[-5.42,-2.097],[0.157,-1.875],[0,0]],"v":[[-203.342,-17.911],[-202.107,-13.557],[-216.872,-9.425],[-225.01,-22.419],[-221.165,-24.807]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":-85.2,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"triangle yellow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.36],"y":[0.08]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.36],"y":[0]},"t":46,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":83,"s":[100]},{"t":88,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":14.814,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":35.556,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":60,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":82.8,"s":[-9.548]},{"i":{"x":[0.845],"y":[0.89]},"o":{"x":[0.456],"y":[-0.077]},"t":105.6,"s":[10.446]},{"t":124.7998046875,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[116.327]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[155.404]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[155.404]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[104.154]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[120.279]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[116.327]},{"t":134.400390625,"s":[155.404]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[199.579]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[204.55]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[204.55]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[199.05]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[200.425]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[199.579]},{"t":134.400390625,"s":[204.55]}],"ix":4}},"a":{"a":0,"k":[-183.096,52.05,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.832,-1.058],[0,0],[-1.832,-1.058],[0,0],[0,2.115],[0,0]],"o":[[0,0],[-1.832,1.058],[0,0],[1.832,1.058],[0,0],[0,-2.115]],"v":[[-177.038,37.258],[-199.403,50.17],[-199.403,54.93],[-177.038,67.842],[-172.916,65.462],[-172.916,39.638]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"triangle grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[2.081]},{"i":{"x":[0.518],"y":[0.898]},"o":{"x":[0.467],"y":[-0.067]},"t":14.814,"s":[-9.548]},{"i":{"x":[0.668],"y":[-0.097]},"o":{"x":[0.456],"y":[-0.098]},"t":35.556,"s":[10.446]},{"i":{"x":[0.515],"y":[0.883]},"o":{"x":[0.174],"y":[0.454]},"t":60,"s":[2.081]},{"i":{"x":[0.518],"y":[0.888]},"o":{"x":[0.467],"y":[-0.073]},"t":82.8,"s":[-9.548]},{"i":{"x":[0.845],"y":[0.89]},"o":{"x":[0.456],"y":[-0.077]},"t":105.6,"s":[10.446]},{"t":124.7998046875,"s":[2.081]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[116.327]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[155.404]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[155.404]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[104.154]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[120.279]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[116.327]},{"t":134.400390625,"s":[155.404]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":-27.6,"s":[199.579]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":7.2,"s":[204.55]},{"i":{"x":[0.567],"y":[1.041]},"o":{"x":[0.66],"y":[0]},"t":31.2,"s":[204.55]},{"i":{"x":[0.768],"y":[1.064]},"o":{"x":[0.564],"y":[0.251]},"t":58.8,"s":[199.05]},{"i":{"x":[0.546],"y":[0.654]},"o":{"x":[0.396],"y":[0]},"t":85.2,"s":[200.425]},{"i":{"x":[0.478],"y":[1]},"o":{"x":[0.356],"y":[-0.031]},"t":99.6,"s":[199.579]},{"t":134.400390625,"s":[204.55]}],"ix":4}},"a":{"a":0,"k":[-183.096,52.05,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[1.832,-1.058],[0,0],[-1.832,-1.058],[0,0],[0,2.115],[0,0]],"o":[[0,0],[-1.832,1.058],[0,0],[1.832,1.058],[0,0],[0,-2.115]],"v":[[-177.038,37.258],[-199.403,50.17],[-199.403,54.93],[-177.038,67.842],[-172.916,65.462],[-172.916,39.638]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"Group 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":124.7998046875,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":-25.2,"s":[508.506]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[481.131]},{"i":{"x":[0.374],"y":[1.076]},"o":{"x":[0.403],"y":[0]},"t":32.4,"s":[481.131]},{"i":{"x":[0.624],"y":[1.189]},"o":{"x":[0.575],"y":[0.459]},"t":61.2,"s":[510.631]},{"i":{"x":[0.445],"y":[0.741]},"o":{"x":[0.482],"y":[0.217]},"t":86.4,"s":[505.506]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":100.8,"s":[508.506]},{"t":139.2001953125,"s":[481.131]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":-25.2,"s":[125.433]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":13.2,"s":[139.058]},{"i":{"x":[0.374],"y":[1.076]},"o":{"x":[0.403],"y":[0]},"t":32.4,"s":[139.058]},{"i":{"x":[0.624],"y":[1.189]},"o":{"x":[0.575],"y":[0.459]},"t":61.2,"s":[124.558]},{"i":{"x":[0.445],"y":[0.741]},"o":{"x":[0.482],"y":[0.217]},"t":86.4,"s":[127.183]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.565],"y":[-0.049]},"t":100.8,"s":[125.433]},{"t":139.2001953125,"s":[139.058]}],"ix":4}},"a":{"a":0,"k":[207.631,-21.942,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.819],[4.819,0],[0,4.819],[-4.819,0]],"o":[[0,4.819],[-4.819,0],[0,-4.819],[4.819,0]],"v":[[219.606,-23.192],[210.881,-14.467],[202.156,-23.192],[210.881,-31.917]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"oval left green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":44,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":49,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":86,"s":[100]},{"t":91,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[21.58]},{"t":124.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[141.923]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[190.423]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[190.423]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[137.423]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[147.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[141.923]},{"t":136.7998046875,"s":[190.423]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[76.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[111.714]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[111.714]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[73.214]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[80.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[76.339]},{"t":136.7998046875,"s":[111.714]}],"ix":4}},"a":{"a":0,"k":[-155.577,-70.286,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.064,4.133],[0,0],[-4.133,-5.064],[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0]],"o":[[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0],[-5.064,4.133],[0,0],[-4.133,-5.064]],"v":[[-171.83,-90.169],[-171.83,-90.169],[-155.177,-88.483],[-137.639,-67.056],[-139.325,-50.403],[-139.325,-50.403],[-155.978,-52.088],[-173.516,-73.516]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"oval left grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":29.63,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":88.889,"s":[21.58]},{"t":124.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[141.923]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[190.423]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[190.423]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[137.423]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[147.423]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[141.923]},{"t":136.7998046875,"s":[190.423]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":-27.6,"s":[76.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":10.8,"s":[111.714]},{"i":{"x":[0.49],"y":[1.051]},"o":{"x":[0.333],"y":[0]},"t":31.2,"s":[111.714]},{"i":{"x":[0.69],"y":[1.192]},"o":{"x":[0.459],"y":[0.207]},"t":58.8,"s":[73.214]},{"i":{"x":[0.655],"y":[0.709]},"o":{"x":[0.538],"y":[0.267]},"t":84,"s":[80.339]},{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.324],"y":[-0.054]},"t":98.4,"s":[76.339]},{"t":136.7998046875,"s":[111.714]}],"ix":4}},"a":{"a":0,"k":[-155.577,-70.286,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-5.064,4.133],[0,0],[-4.133,-5.064],[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0]],"o":[[0,0],[5.064,-4.133],[0,0],[4.133,5.064],[0,0],[-5.064,4.133],[0,0],[-4.133,-5.064]],"v":[[-171.83,-90.169],[-171.83,-90.169],[-155.177,-88.483],[-137.639,-67.056],[-139.325,-50.403],[-139.325,-50.403],[-155.978,-52.088],[-173.516,-73.516]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":3,"nm":"Null 2","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":-129,"ix":10},"p":{"a":0,"k":[110.25,5,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":74.4,"op":202.8,"st":74.4,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"thumb","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":128.725,"ix":3},"y":{"a":0,"k":-83.038,"ix":4}},"a":{"a":0,"k":[128.725,-83.038,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[4.839,-13.578],[11.106,-33.272],[5.661,-1.05],[1.136,4.946],[0.029,5.583],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-1.573,4.712],[-6.045,1.121],[-1.264,-5.501],[-0.063,-12.384],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[92.997,21.162],[83.365,34.523],[71.497,24.978],[70.873,8.188],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":24,"s":[{"i":[[0,0],[4.839,-13.578],[20.554,-28.423],[5.716,0.693],[-0.396,5.059],[-1.643,5.335],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.911,4.026],[-6.103,-0.739],[0.44,-5.627],[3.646,-11.836],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[79.712,22.036],[66.523,31.902],[58.055,19.243],[62.484,3.035],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[4.839,-13.578],[19.525,-29.139],[5.737,0.488],[-0.215,5.07],[-1.452,5.391],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.765,4.127],[-6.126,-0.521],[0.239,-5.639],[3.22,-11.958],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[83.926,22.786],[71.098,33.116],[62.183,20.768],[66.031,4.413],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":69.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[4.839,-13.578],[24.293,-25.05],[5.529,1.498],[-1.112,4.925],[-2.38,5.018],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.441,3.548],[-5.903,-1.599],[1.237,-5.477],[5.279,-11.133],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[75.271,21.529],[60.877,29.36],[54.347,15.688],[61.021,0.363],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[0,0],[4.839,-13.578],[20.903,-28.167],[5.707,0.763],[-0.458,5.054],[-1.709,5.315],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-2.961,3.989],[-6.094,-0.815],[0.51,-5.621],[3.792,-11.79],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[80.005,22.37],[66.696,32.072],[58.385,19.31],[63.014,3.158],[76.676,-33.112],[77.155,-35.31]],"c":false}]},{"t":122,"s":[{"i":[[0,0],[4.839,-13.578],[22.979,-26.501],[5.633,1.194],[-0.84,5.005],[-2.107,5.17],[-2.839,12.132],[-0.148,0.735]],"o":[[-4.046,13.851],[-10.368,29.093],[-3.255,3.753],[-6.014,-1.275],[0.935,-5.566],[4.675,-11.468],[0.171,-0.73],[-20.135,14.331]],"v":[[128.894,-83.073],[116.184,-40.638],[77.317,22.02],[63.309,30.684],[55.99,17.328],[61.831,1.574],[76.676,-33.112],[77.155,-35.31]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"stroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":0,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[1.926,0.283],[1.533,-1.2],[0.392,-1.769],[-3.206,-3.461],[-1.035,-0.649],[0.025,0.012]],"o":[[-1.781,-0.786],[-1.926,-0.283],[-1.427,1.117],[-1.022,4.605],[0.83,0.896],[-0.025,-0.012],[0,0]],"v":[[93.996,12.919],[88.481,11.055],[82.93,12.26],[80.334,16.912],[83.89,30.047],[86.632,32.29],[86.559,32.255]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":24,"s":[{"i":[[0,0],[1.753,0.846],[1.822,-0.687],[0.904,-1.57],[-2.023,-4.261],[-0.793,-0.929],[0.02,0.019]],"o":[[-1.464,-1.283],[-1.753,-0.846],[-1.695,0.639],[-2.353,4.088],[0.524,1.103],[-0.02,-0.019],[0,0]],"v":[[83.131,14.469],[78.427,11.041],[72.77,10.529],[68.901,14.191],[68.363,27.788],[70.308,30.749],[70.248,30.694]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[1.782,0.783],[1.796,-0.751],[0.847,-1.602],[-2.174,-4.186],[-0.826,-0.9],[0.021,0.018]],"o":[[-1.509,-1.23],[-1.782,-0.783],[-1.672,0.699],[-2.205,4.17],[0.563,1.084],[-0.021,-0.018],[0,0]],"v":[[87.073,15.102],[82.25,11.843],[76.578,11.534],[72.842,15.332],[72.79,28.94],[74.84,31.83],[74.778,31.776]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":69.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0.167},"t":91,"s":[{"i":[[0,0],[1.605,1.083],[1.891,-0.416],[1.114,-1.417],[-1.383,-4.484],[-0.649,-1.027],[0.017,0.021]],"o":[[-1.258,-1.472],[-1.605,-1.083],[-1.76,0.387],[-2.9,3.689],[0.358,1.161],[-0.017,-0.021],[0,0]],"v":[[79.718,14.568],[75.576,10.521],[70.079,9.209],[65.746,12.262],[63.276,25.573],[64.769,28.766],[64.718,28.703]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.333,"y":0},"t":107,"s":[{"i":[[0,0],[1.742,0.868],[1.83,-0.664],[0.923,-1.559],[-1.97,-4.286],[-0.782,-0.938],[0.02,0.019]],"o":[[-1.448,-1.301],[-1.742,-0.868],[-1.703,0.618],[-2.403,4.059],[0.51,1.11],[-0.02,-0.019],[0,0]],"v":[[83.518,14.846],[78.857,11.36],[73.206,10.778],[69.292,14.392],[68.587,27.982],[70.495,30.967],[70.436,30.911]],"c":false}]},{"t":122,"s":[{"i":[[0,0],[1.672,0.998],[1.875,-0.523],[1.039,-1.485],[-1.639,-4.423],[-0.708,-0.995],[0.018,0.02]],"o":[[-1.345,-1.407],[-1.672,-0.998],[-1.745,0.487],[-2.704,3.865],[0.424,1.145],[-0.018,-0.02],[0,0]],"v":[[81.39,14.784],[77.007,10.954],[71.417,9.946],[67.239,13.252],[65.505,26.75],[67.181,29.87],[67.127,29.81]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"nail","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"index","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":2.4,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.4],"y":[0]},"t":16.8,"s":[14]},{"i":{"x":[0.833],"y":[0.95]},"o":{"x":[0.167],"y":[0.167]},"t":26.4,"s":[-8.5]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.992]},"t":33.6,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50.4,"s":[0]},{"i":{"x":[0.339],"y":[1]},"o":{"x":[0.497],"y":[0]},"t":81.6,"s":[0]},{"t":118.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":0,"k":77.038,"ix":3},"y":{"a":0,"k":-35.351,"ix":4}},"a":{"a":0,"k":[77.038,-35.351,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}]},{"t":110.400390625,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"index stroke","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[0,0],[-1.402,0.164],[-1.191,0.756],[1.16,5.51],[4.658,-0.366]],"o":[[0.865,1.115],[1.402,-0.164],[4.212,-2.673],[-1.054,-5.008],[0,0]],"v":[[-27.591,62.383],[-24.41,63.765],[-20.527,62.173],[-13.334,47.619],[-24.309,42.263]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-42.467,46.279],[-39.884,48.693],[-35.689,48.805],[-23.23,38.396],[-31.108,29.064]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[0,0],[-1.348,-0.417],[-1.395,0.211],[-1.164,5.509],[4.409,1.547]],"o":[[0.341,1.369],[1.348,0.417],[4.933,-0.745],[1.058,-5.007],[0,0]],"v":[[-41.564,44.492],[-39.044,47.113],[-34.849,47.225],[-22.802,37.349],[-30.679,28.016]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-34.221,50.995],[-32.488,54.052],[-28.351,54.76],[-14.537,46.231],[-21.005,35.873]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-38.715,47.696],[-36.77,50.356],[-32.633,51.064],[-18.819,42.535],[-25.287,32.176]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[0,0],[-1.275,-0.604],[-1.411,0.01],[-1.937,5.287],[4.143,2.159]],"o":[[0.143,1.404],[1.275,0.604],[4.988,-0.035],[1.76,-4.805],[0,0]],"v":[[-33.74,50.709],[-31.901,53.508],[-27.764,54.216],[-13.95,45.687],[-20.419,35.328]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[0,0],[-1.407,-0.075],[-1.3,0.544],[0.216,5.62],[4.647,0.423]],"o":[[0.665,1.243],[1.407,0.075],[4.596,-1.924],[-0.197,-5.108],[0,0]],"v":[[-23.679,59.511],[-20.737,61.449],[-16.646,60.534],[-7.118,47.413],[-17.024,40.295]],"c":false}]},{"t":110.400390625,"s":[{"i":[[0,0],[-1.402,0.164],[-1.191,0.756],[1.16,5.51],[4.658,-0.366]],"o":[[0.865,1.115],[1.402,-0.164],[4.212,-2.673],[-1.054,-5.008],[0,0]],"v":[[-27.841,62.392],[-24.41,63.765],[-20.527,62.173],[-13.334,47.619],[-24.309,42.263]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"index nail","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":2.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":16.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[28.866,-38.373]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":26.4,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[6.216,-6.212],[14.286,-2.142],[2.159,2.588],[-4.242,4.815],[-9.34,11.114],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.616,9.61],[-3.333,0.5],[-5.187,-6.216],[9.907,-11.244],[14.753,-17.555],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[8.481,27.743],[-29.829,56.249],[-40.6,52.829],[-36.02,33.558],[-6.036,-1.128],[35.675,-47.522]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":33.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-23.076,63.945],[-33.25,59.026],[-26.507,39.621],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50.4,"s":[{"i":[[-0.148,0.735],[13.35,-18.206],[11.313,-9.989],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-9.359,11.888],[-13.134,8.667]],"o":[[-20.135,14.331],[-5.503,7.505],[-13.421,11.85],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[15.339,-19.486],[0,0]],"v":[[77.155,-35.31],[41.725,3.219],[19.503,27.597],[-27.963,60.544],[-38.137,55.624],[-31.395,36.22],[4.245,-1.975],[38.263,-44.718]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.4,"y":0},"t":81.6,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[7.393,-12.017],[14.445,-0.087],[1.769,2.869],[-4.885,4.162],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-9.189,14.935],[-3.37,0.02],[-4.249,-6.892],[11.407,-9.718],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[35.135,-0.208],[19.084,27.256],[-22.489,63.4],[-32.663,58.481],[-25.921,39.077],[-1.147,-2.191],[35.675,-47.522]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":94.8,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[5.318,-11.74],[13.314,-5.56],[2.722,1.98],[-2.935,5.698],[-7.615,12.945],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-8.534,15.541],[-3.106,1.297],[-6.541,-4.756],[6.853,-13.307],[11.62,-19.713],[0,0]],"v":[[77.155,-35.31],[34.24,0.718],[18.964,26.916],[-8.413,66.94],[-19.68,66.255],[-20.686,45.847],[-1.795,-2.05],[34.773,-46.31]],"c":false}]},{"t":110.400390625,"s":[{"i":[[-0.148,0.735],[15.207,-16.686],[4.361,-7.629],[12.203,-7.73],[3.02,1.495],[-1.936,6.118],[-7.351,13.224],[-12.61,9.457]],"o":[[-20.135,14.331],[-5.939,6.517],[-6.747,11.803],[-2.847,1.803],[-7.256,-3.592],[4.522,-14.287],[11.141,-20.042],[0,0]],"v":[[77.155,-35.31],[28.375,6.782],[13.373,28.456],[-12.159,66.616],[-23.394,67.837],[-26.988,48.359],[-6.574,0],[35.675,-47.522]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"index base","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.524],"y":[0.895]},"o":{"x":[0.718],"y":[-0.082]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.521],"y":[-0.037]},"t":14.4,"s":[14]},{"i":{"x":[0.833],"y":[0.919]},"o":{"x":[0.167],"y":[0.167]},"t":26.4,"s":[-7.4]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.311]},"t":33.6,"s":[4.2]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50,"s":[11.1]},{"i":{"x":[0.569],"y":[1.061]},"o":{"x":[0.4],"y":[0]},"t":81.6,"s":[4.2]},{"i":{"x":[0.461],"y":[1]},"o":{"x":[0.251],"y":[0.311]},"t":110.4,"s":[-0.8]},{"t":122.400390625,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.66],"y":[0]},"t":12,"s":[410.225]},{"i":{"x":[0.583],"y":[0.613]},"o":{"x":[0.167],"y":[0.147]},"t":26.4,"s":[376.975]},{"i":{"x":[0.833],"y":[0.908]},"o":{"x":[0.417],"y":[0.505]},"t":30,"s":[398.067]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.307]},"t":33.6,"s":[414.225]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50,"s":[436.225]},{"i":{"x":[0.408],"y":[1.006]},"o":{"x":[0.376],"y":[0]},"t":81.6,"s":[414.225]},{"i":{"x":[0.62],"y":[0.952]},"o":{"x":[0.555],"y":[0.184]},"t":94.8,"s":[421.403]},{"i":{"x":[0.649],"y":[0.782]},"o":{"x":[0.266],"y":[-0.313]},"t":110.4,"s":[408.725]},{"t":122.400390625,"s":[410.225]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.649],"y":[1.21]},"o":{"x":[0.527],"y":[0]},"t":0,"s":[54.962]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.416],"y":[0.203]},"t":12,"s":[47.562]},{"i":{"x":[0.583],"y":[0.588]},"o":{"x":[0.167],"y":[0.157]},"t":26.4,"s":[58.462]},{"i":{"x":[0.713],"y":[0.746]},"o":{"x":[0.357],"y":[0.357]},"t":30,"s":[76.593]},{"i":{"x":[0.785],"y":[0.851]},"o":{"x":[0.432],"y":[0.565]},"t":32.4,"s":[88.524]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.167],"y":[0.291]},"t":33.6,"s":[92.562]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":50,"s":[114.462]},{"i":{"x":[0.622],"y":[0.96]},"o":{"x":[0.248],"y":[0]},"t":81.6,"s":[92.962]},{"i":{"x":[0.628],"y":[0.694]},"o":{"x":[0.204],"y":[0]},"t":102,"s":[51.443]},{"i":{"x":[0.643],"y":[1]},"o":{"x":[0.276],"y":[-3.844]},"t":110.4,"s":[55.262]},{"t":122.400390625,"s":[54.962]}],"ix":4}},"a":{"a":0,"k":[110.225,-93.038,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[2.337,5.479],[-0.575,5.013],[-1.11,10.665],[-12.78,6.799],[-13.902,6.043],[-20.228,9.794]],"o":[[-5.95,0.291],[-1.98,-4.641],[1.4,-12.209],[1.434,-13.777],[13.56,-7.214],[20.611,-8.96],[0,0]],"v":[[-26.807,19.25],[-41.037,10.34],[-41.923,-4.594],[-38.475,-35.249],[-20.357,-67.592],[21.891,-86.048],[75.844,-110.663]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[-9.342,5.277],[-2.885,4.758],[3.58,3.615],[10.86,-2.948]],"o":[[9.342,-5.277],[4.845,-2.737],[2.885,-4.758],[0,0],[-18.858,5.119]],"v":[[14.731,26.107],[36.382,14.895],[49.167,4.465],[48.132,-10.99],[31.401,-12.876]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0},"t":12,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[1.678,-5.847],[1.787,-10.018],[-27.368,9.255]],"o":[[-5.36,2.877],[-1.678,5.847],[0,0],[18.965,-6.413]],"v":[[13.721,-53.731],[3.249,-39.382],[-4.587,-3.284],[14.334,26.3]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 6","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":81.6,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[1.085,-6.335],[-0.193,-18.422],[-3.971,-2.362],[-8.812,8.651]],"o":[[-5.885,2.582],[-3.38,19.741],[0.048,4.62],[0,0],[6.703,-6.581]],"v":[[-7.49,-58.363],[-18.781,-43.541],[-26.825,14.365],[-20.522,26.107],[-2.465,23.047]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2.725,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 7","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":12,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":32,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.66,"y":0},"t":50,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.4,"y":0},"t":82,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-23.682,-0.979],[-5.567,3.943],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.436,4.7],[27.875,1.153],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[1.949,-15.44],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]},{"t":118.7998046875,"s":[{"i":[[0,0],[20.611,-8.959],[13.56,-7.214],[1.279,-13.792],[-20.573,-1.219],[-6.05,4.285],[-1.068,1.418],[-10.368,29.094],[-4.046,13.851]],"o":[[-20.228,9.793],[-13.902,6.043],[-12.78,6.8],[-0.391,4.22],[29.31,1.736],[0.782,-0.554],[-2.506,12.449],[4.839,-13.578],[0,0]],"v":[[75.844,-110.664],[21.891,-86.048],[-20.357,-67.592],[-38.475,-35.249],[-1.517,-27.098],[70.857,-30.942],[77.155,-35.31],[116.184,-40.638],[128.894,-83.073]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 8","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Shape Layer 2","parent":13,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-11.1,"ix":10},"p":{"a":0,"k":[-16.995,-33.901,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":[[4.5,-9],[-0.75,-5],[-6.5,-0.25],[-5.598,-1.022],[-6.348,0.686],[-2.75,2.25],[8.25,6.5]],"o":[[-4.5,9],[0.75,5],[2.039,0.078],[12.249,2.235],[9.25,-1],[2.75,-2.25],[-8.25,-6.5]],"v":[[-21,-5.75],[-32.75,37.25],[-19.593,49.869],[-11.691,60.349],[25.363,62.509],[55.25,53.5],[56.901,30.652]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":202.8,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"fingerprint5_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.473,-0.064],[-0.075,-0.025],[-1.039,-1.686],[2.604,-2.504],[3.815,0.519],[-2.131,2.049],[2.577,0.351],[1.409,-1.355],[-8.973,-1.221],[-5.849,2.741],[-1.366,1.314],[-0.758,2.206],[-0.698,0.034],[0.129,-0.344],[1.775,-1.706],[2.261,-1.064],[7.246,0.986],[-5.684,5.466],[-3.815,-0.519],[2.131,-2.049],[-2.577,-0.351],[-1.409,1.355],[1.137,1.887],[2.65,0.922],[-0.5,0.308]],"o":[[0.088,0.012],[2.986,1.042],[1.313,2.186],[-2.131,2.049],[-3.815,-0.519],[1.407,-1.353],[-2.581,-0.351],[-4.958,4.768],[6.373,0.867],[1.943,-0.906],[1.026,-0.987],[0.12,-0.36],[0.715,-0.046],[-0.623,1.806],[-1.578,1.518],[-6.655,3.124],[-10.207,-1.389],[2.131,-2.049],[3.815,0.519],[-1.407,1.353],[2.577,0.351],[2.25,-2.164],[-0.895,-1.478],[-0.515,-0.172],[0.414,-0.275]],"v":[[-13.704,71.497],[-13.439,71.563],[-7.855,75.354],[-9.852,82.619],[-20.631,85.397],[-23.675,80.738],[-25.788,77.649],[-33.005,79.468],[-25.724,90.319],[-5.593,87.24],[-0.587,83.88],[2.657,79.109],[4.148,78.389],[5.202,78.95],[1.632,84.182],[-4.157,88.072],[-27.056,91.596],[-35.263,79.174],[-24.484,76.396],[-21.44,81.054],[-19.327,84.144],[-12.11,82.324],[-10.373,76.049],[-15.274,72.711],[-15.256,71.833]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":35,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84,"s":[100]},{"t":90.999609375,"s":[0]}],"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":16,"ty":4,"nm":"fingerprint5_blue","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.473,-0.064],[-0.075,-0.025],[-1.039,-1.686],[2.604,-2.504],[3.815,0.519],[-2.131,2.049],[2.577,0.351],[1.409,-1.355],[-8.973,-1.221],[-5.849,2.741],[-1.366,1.314],[-0.758,2.206],[-0.698,0.034],[0.129,-0.344],[1.775,-1.706],[2.261,-1.064],[7.246,0.986],[-5.684,5.466],[-3.815,-0.519],[2.131,-2.049],[-2.577,-0.351],[-1.409,1.355],[1.137,1.887],[2.65,0.922],[-0.5,0.308]],"o":[[0.088,0.012],[2.986,1.042],[1.313,2.186],[-2.131,2.049],[-3.815,-0.519],[1.407,-1.353],[-2.581,-0.351],[-4.958,4.768],[6.373,0.867],[1.943,-0.906],[1.026,-0.987],[0.12,-0.36],[0.715,-0.046],[-0.623,1.806],[-1.578,1.518],[-6.655,3.124],[-10.207,-1.389],[2.131,-2.049],[3.815,0.519],[-1.407,1.353],[2.577,0.351],[2.25,-2.164],[-0.895,-1.478],[-0.515,-0.172],[0.414,-0.275]],"v":[[-13.704,71.497],[-13.439,71.563],[-7.855,75.354],[-9.852,82.619],[-20.631,85.397],[-23.675,80.738],[-25.788,77.649],[-33.005,79.468],[-25.724,90.319],[-5.593,87.24],[-0.587,83.88],[2.657,79.109],[4.148,78.389],[5.202,78.95],[1.632,84.182],[-4.157,88.072],[-27.056,91.596],[-35.263,79.174],[-24.484,76.396],[-21.44,81.054],[-19.327,84.144],[-12.11,82.324],[-10.373,76.049],[-15.274,72.711],[-15.256,71.833]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":17,"ty":4,"nm":"fingerprint4_grey","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":79,"s":[0]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":86,"s":[100]},{"t":93.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.315,-0.043],[-1.151,-1.008],[2.289,-2.201],[0.631,0.086],[-0.37,0.356],[1.658,1.411],[2.246,0.306],[0.99,0.036],[-0.256,0.369],[-0.692,-0.022]],"o":[[2.669,0.363],[2.014,1.732],[-0.368,0.353],[-0.631,-0.086],[1.853,-1.782],[-0.961,-0.824],[-0.538,-0.073],[-0.669,-0.019],[0.245,-0.358],[1.433,0.037]],"v":[[-20.924,73.487],[-15.14,75.558],[-15.577,81.837],[-17.358,82.318],[-17.823,81.532],[-17.493,76.436],[-22.259,74.763],[-24.725,74.571],[-25.486,73.876],[-23.804,73.268]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":18,"ty":4,"nm":"fingerprint4_blue","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[279.99,233.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":40.8,"s":[92,92,100]},{"i":{"x":[0.387,0.387,0.2],"y":[0.871,0.871,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":52.8,"s":[100,100,100]},{"i":{"x":[0.2,0.2,0.2],"y":[1,1,1]},"o":{"x":[0.444,0.444,0.4],"y":[-0.116,-0.116,0]},"t":67.2,"s":[92,92,100]},{"t":79.1998046875,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.315,-0.043],[-1.151,-1.008],[2.289,-2.201],[0.631,0.086],[-0.37,0.356],[1.658,1.411],[2.246,0.306],[0.99,0.036],[-0.256,0.369],[-0.692,-0.022]],"o":[[2.669,0.363],[2.014,1.732],[-0.368,0.353],[-0.631,-0.086],[1.853,-1.782],[-0.961,-0.824],[-0.538,-0.073],[-0.669,-0.019],[0.245,-0.358],[1.433,0.037]],"v":[[-20.924,73.487],[-15.14,75.558],[-15.577,81.837],[-17.358,82.318],[-17.823,81.532],[-17.493,76.436],[-22.259,74.763],[-24.725,74.571],[-25.486,73.876],[-23.804,73.268]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":19,"ty":4,"nm":"fingerprint3_grey","parent":18,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":66,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":73,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":84,"s":[100]},{"t":90.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.292,-0.04],[-0.067,-0.155],[0.092,-1.735],[2.12,-2.038],[7,0.952],[-3.905,3.755],[-0.631,-0.086],[0.37,-0.356],[-5.765,-0.785],[-3.184,3.061],[-0.051,1.552],[0.701,1.221],[-0.688,0.193]],"o":[[0.292,0.04],[0.811,1.365],[-0.067,1.765],[-3.905,3.755],[-7,-0.952],[0.368,-0.353],[0.627,0.085],[-3.184,3.061],[5.765,0.785],[1.894,-1.821],[0.078,-1.65],[-0.163,-0.312],[0.387,-0.093]],"v":[[-2.403,73.337],[-1.817,73.634],[-0.782,77.587],[-4.137,83.397],[-23.926,88.485],[-29.536,79.94],[-27.755,79.46],[-27.29,80.246],[-22.611,87.221],[-6.383,83.091],[-3.407,77.937],[-4.373,74.311],[-3.44,73.413]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":20,"ty":4,"nm":"fingerprint3_blue","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.292,-0.04],[-0.067,-0.155],[0.092,-1.735],[2.12,-2.038],[7,0.952],[-3.905,3.755],[-0.631,-0.086],[0.37,-0.356],[-5.765,-0.785],[-3.184,3.061],[-0.051,1.552],[0.701,1.221],[-0.688,0.193]],"o":[[0.292,0.04],[0.811,1.365],[-0.067,1.765],[-3.905,3.755],[-7,-0.952],[0.368,-0.353],[0.627,0.085],[-3.184,3.061],[5.765,0.785],[1.894,-1.821],[0.078,-1.65],[-0.163,-0.312],[0.387,-0.093]],"v":[[-2.403,73.337],[-1.817,73.634],[-0.782,77.587],[-4.137,83.397],[-23.926,88.485],[-29.536,79.94],[-27.755,79.46],[-27.29,80.246],[-22.611,87.221],[-6.383,83.091],[-3.407,77.937],[-4.373,74.311],[-3.44,73.413]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":21,"ty":4,"nm":"fingerprint2_grey","parent":18,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":29,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":83,"s":[100]},{"t":89.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.358,-0.049],[-0.119,-0.105],[0.66,-0.242],[4.384,-0.517],[4.934,3.01],[0.394,2.061],[-0.725,0.132],[-0.056,-0.339],[-2.118,-1.286],[-8.361,0.998],[-3.676,1.319]],"o":[[0.223,0.03],[0.306,0.272],[-4.065,1.469],[-9.177,1.09],[-2.353,-1.431],[-0.069,-0.326],[0.725,-0.132],[0.362,1.868],[4.506,2.734],[3.97,-0.47],[0.377,-0.152]],"v":[[-4.261,90.896],[-3.73,91.1],[-4.381,92.021],[-17.098,95.013],[-40.242,91.878],[-44.381,86.622],[-43.192,85.774],[-41.781,86.14],[-38.044,90.893],[-16.943,93.749],[-5.423,91.043]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":22,"ty":4,"nm":"fingerprint2_blue","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.358,-0.049],[-0.119,-0.105],[0.66,-0.242],[4.384,-0.517],[4.934,3.01],[0.394,2.061],[-0.725,0.132],[-0.056,-0.339],[-2.118,-1.286],[-8.361,0.998],[-3.676,1.319]],"o":[[0.223,0.03],[0.306,0.272],[-4.065,1.469],[-9.177,1.09],[-2.353,-1.431],[-0.069,-0.326],[0.725,-0.132],[0.362,1.868],[4.506,2.734],[3.97,-0.47],[0.377,-0.152]],"v":[[-4.261,90.896],[-3.73,91.1],[-4.381,92.021],[-17.098,95.013],[-40.242,91.878],[-44.381,86.622],[-43.192,85.774],[-41.781,86.14],[-38.044,90.893],[-16.943,93.749],[-5.423,91.043]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":23,"ty":4,"nm":"fingerprint1_grey","parent":18,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":83,"s":[100]},{"t":89.999609375,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.404,-0.055],[-0.106,-0.071],[-4.465,-0.608],[-5.072,0.669],[0,-0.346],[0.71,-0.092],[4.823,0.656],[3.198,1.952],[-0.608,0.264]],"o":[[0.181,0.025],[3.004,1.839],[4.442,0.604],[0.71,-0.092],[-0.023,0.343],[-5.501,0.709],[-4.781,-0.651],[-0.39,-0.241],[0.443,-0.202]],"v":[[-43.27,93.41],[-42.833,93.556],[-32.193,97.04],[-17.842,96.956],[-16.579,97.418],[-17.924,98.217],[-33.51,98.306],[-45.04,94.542],[-44.628,93.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":24,"ty":4,"nm":"fingerprint1_blue","parent":18,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-20.01,85.128,0],"ix":2,"l":2},"a":{"a":0,"k":[-20.01,85.128,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.404,-0.055],[-0.106,-0.071],[-4.465,-0.608],[-5.072,0.669],[0,-0.346],[0.71,-0.092],[4.823,0.656],[3.198,1.952],[-0.608,0.264]],"o":[[0.181,0.025],[3.004,1.839],[4.442,0.604],[0.71,-0.092],[-0.023,0.343],[-5.501,0.709],[-4.781,-0.651],[-0.39,-0.241],[0.443,-0.202]],"v":[[-43.27,93.41],[-42.833,93.556],[-32.193,97.04],[-17.842,96.956],[-16.579,97.418],[-17.924,98.217],[-33.51,98.306],[-45.04,94.542],[-44.628,93.631]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.5,"ix":5},"lc":1,"lj":1,"ml":10,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":26.4,"bm":0},{"ddd":0,"ind":25,"ty":4,"nm":"button blue","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26,"s":[0]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":32,"s":[100]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":80,"s":[100]},{"t":86,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[278.43,234.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.489,0.489,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.565,0.565,0.34],"y":[0.962,0.962,1]},"o":{"x":[0.571,0.571,0.66],"y":[0,0,0]},"t":36,"s":[106,106,100]},{"i":{"x":[0.489,0.489,0.34],"y":[1.034,1.034,1]},"o":{"x":[0.617,0.617,0.66],"y":[-0.022,-0.022,0]},"t":45.6,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.571,0.571,0.66],"y":[0.054,0.054,0]},"t":55.2,"s":[106,106,100]},{"t":64.7998046875,"s":[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,-12.99],[28.705,0],[0,12.99],[-28.705,0]],"o":[[0,12.99],[-28.705,0],[0,-12.99],[28.705,0]],"v":[[30.405,86.351],[-21.57,109.872],[-73.545,86.351],[-21.57,62.83]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":26,"ty":4,"nm":"button grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[278.43,234.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.489,0.489,0.34],"y":[1,1,1]},"o":{"x":[0.66,0.66,0.66],"y":[0,0,0]},"t":26.4,"s":[100,100,100]},{"i":{"x":[0.565,0.565,0.34],"y":[0.962,0.962,1]},"o":{"x":[0.571,0.571,0.66],"y":[0,0,0]},"t":36,"s":[106,106,100]},{"i":{"x":[0.489,0.489,0.34],"y":[1.034,1.034,1]},"o":{"x":[0.617,0.617,0.66],"y":[-0.022,-0.022,0]},"t":45.6,"s":[100,100,100]},{"i":{"x":[0.34,0.34,0.34],"y":[1,1,1]},"o":{"x":[0.571,0.571,0.66],"y":[0.054,0.054,0]},"t":55.2,"s":[106,106,100]},{"t":64.7998046875,"s":[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,-12.99],[28.705,0],[0,12.99],[-28.705,0]],"o":[[0,12.99],[-28.705,0],[0,-12.99],[28.705,0]],"v":[[30.405,86.351],[-21.57,109.872],[-73.545,86.351],[-21.57,62.83]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":27,"ty":4,"nm":" 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[278.43,234.351,0],"ix":2,"l":2},"a":{"a":0,"k":[-21.57,86.351,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":1,"k":[{"i":{"x":0.34,"y":1},"o":{"x":0.66,"y":0},"t":25.2,"s":[{"i":[[17.59,-2.239],[0,-15.103],[-41.731,0],[0,19.094],[24.106,5.75]],"o":[[-29.182,3.714],[0,19.094],[41.731,0],[0,-13.028],[-24.106,-5.75]],"v":[[-46.465,52.739],[-97.13,85.391],[-21.57,119.963],[53.99,85.391],[14.981,55.125]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":42,"s":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":56.4,"s":[{"i":[[23.972,-3.051],[0,-20.583],[-56.871,0],[0,26.021],[32.852,7.836]],"o":[[-39.77,5.061],[0,26.021],[56.871,0],[0,-17.754],[-32.852,-7.836]],"v":[[-55.497,41.154],[-124.545,85.652],[-21.57,132.769],[81.405,85.652],[28.242,44.406]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":70.8,"s":[{"i":[[24.212,-3.081],[0,-20.789],[-57.441,0],[0,26.282],[33.181,7.915]],"o":[[-40.168,5.112],[0,26.282],[57.441,0],[0,-17.932],[-33.181,-7.915]],"v":[[-55.837,40.718],[-125.576,85.662],[-21.57,133.25],[82.436,85.662],[28.741,44.003]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":85.2,"s":[{"i":[[18.871,-2.402],[0,-16.202],[-44.769,0],[0,20.484],[25.861,6.169]],"o":[[-31.307,3.984],[0,20.484],[44.769,0],[0,-13.976],[-25.861,-6.169]],"v":[[-48.277,50.414],[-102.631,85.443],[-21.57,122.533],[59.491,85.443],[17.642,52.974]],"c":true}]},{"t":100.800390625,"s":[{"i":[[17.59,-2.239],[0,-15.103],[-41.731,0],[0,19.094],[24.106,5.75]],"o":[[-29.182,3.714],[0,19.094],[41.731,0],[0,-13.028],[-24.106,-5.75]],"v":[[-46.465,52.739],[-97.13,85.391],[-21.57,119.963],[53.99,85.391],[14.981,55.125]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0.2,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false}],"ip":0,"op":139.2,"st":26.4,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left.svg b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left.svg deleted file mode 100644 index 5c864c8..0000000 --- a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg width="520" height="320" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="M0 0h520v320H0z"/><g clip-path="url(#a)"><path d="M376.3 203.8H133.4c-6 0-10.8-4.9-10.8-10.8V27.4h264.6v165.5c0 6-4.9 10.9-10.9 10.9z" fill="#fff" stroke="#D2E3FC" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M146 162.3c14.746 0 26.7-11.954 26.7-26.7 0-14.746-11.954-26.7-26.7-26.7-14.746 0-26.7 11.954-26.7 26.7 0 14.746 11.954 26.7 26.7 26.7z" stroke="#34A853" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M146 180.1c24.577 0 44.5-19.923 44.5-44.5S170.577 91.1 146 91.1s-44.5 19.923-44.5 44.5 19.923 44.5 44.5 44.5z" stroke="#FBBC05" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M216.1 132.3h77.6c2.3 0 4.1 1.8 4.1 4.1V185c0 2.3-1.8 4.1-4.1 4.1h-77.6c-2.3 0-4.1-1.8-4.1-4.1v-48.6c0-2.2 1.8-4.1 4.1-4.1z" fill="#2A84FC"/><path d="M105.7 22.5h298.4c2.4 0 4.3 1.9 4.3 4.3v4.9c0 1.2-1 2.2-2.2 2.2H103.5c-1.2 0-2.2-1-2.2-2.2v-4.9c.1-2.4 2-4.3 4.4-4.3z" fill="#fff" stroke="#D2E3FC" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M152 138.9h-12c-1.2 0-2.2-1-2.2-2.2v-2.2c0-1.2 1-2.2 2.2-2.2h12c1.2 0 2.2 1 2.2 2.2v2.2c0 1.2-1 2.2-2.2 2.2z" fill="#255FDB"/><path d="M371.2 118.9H139c-.9 0-1.7-.8-1.7-1.7v-69c0-.9.8-1.7 1.7-1.7h232.2c.9 0 1.7.8 1.7 1.7v68.9c0 1-.8 1.8-1.7 1.8z" fill="#2A84FC"/><mask id="b" maskUnits="userSpaceOnUse" x="137" y="46" width="236" height="73"><path d="M371.2 118.9H139c-.9 0-1.7-.8-1.7-1.7v-69c0-.9.8-1.7 1.7-1.7h232.2c.9 0 1.7.8 1.7 1.7v68.9c0 1-.8 1.8-1.7 1.8z" fill="#2A84FC"/></mask><g mask="url(#b)" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"><path d="M146 162.2c14.746 0 26.7-11.954 26.7-26.7 0-14.746-11.954-26.7-26.7-26.7-14.746 0-26.7 11.954-26.7 26.7 0 14.746 11.954 26.7 26.7 26.7z" stroke="#D2E3FC"/><path d="M146 180c24.577 0 44.5-19.923 44.5-44.5S170.577 91 146 91s-44.5 19.923-44.5 44.5S121.423 180 146 180z" stroke="#fff"/></g><path d="M125.4 280.3c7.3-8.2 15.1-17.1 17.5-28.1 2.9-13.3-4.7-23.4-10.1-34.8 7-19.7 15-41.3 18.7-55.1 1.2-4.4 3.9-15.7-4.7-18.7-6-2-10.9 2.9-12.6 6.5-3.2 7.1-7.7 21.2-10.9 29.9-2.7 7.5-2.6 6.5-2.6 6.5-6.3-1.3-13.4-2.5-18.7 1.1-5.1 3.5-6.7 5-6.7 5-3.2-.5-6.4-1.9-9.6-1.5-4.4.6-7.6 4.3-9.6 8.2l-.3.6-.7-.2c-4.2-.8-9.1-1.8-13.2-.3-3.9 1.4-6.9 5.1-8.8 8.6-5.8 10.4-9.8 22.6-13.2 33.9-3.7 12.2-6 25.1-4.2 37.9" fill="#fff"/><path d="M122 250.4c5.7-21.5 23.3-65.4 29.5-88.1 1.2-4.4 3.9-15.7-4.7-18.7-6-2-10.9 2.9-12.6 6.6-3.2 7.1-7.7 21.2-10.9 29.9-2.9 7.9-9.3 24.2-12.3 32" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M120.699 186.6c-6.3-1.3-13.4-2.5-18.7 1.1-7.3 4.9-11.8 16-14.8 25.1m8-20.1c-3.2-.5-6.3-1.9-9.6-1.5-4.4.6-7.6 4.3-9.6 8.3-2 4-3.2 9.5-5.7 15.2m62.5 2.7c5.5 11.4 13.5 21.7 10.1 34.8-5 19.7-11.8 27.8-28.2 44.4m-39.6-96.8c-4.2-.8-9-1.8-13.2-.3-3.9 1.4-6.9 5.1-8.8 8.6-5.8 10.4-9.8 22.6-13.2 34-4.1 13.5-6.5 26-10.3 41.2" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M137.299 153.7c.8-2.3 2.2-4.7 4.6-5.3 2.4-.6 4.9 1.2 5.8 3.5.9 2.3.3 5-1 7.1-1.8 3-5.2 5.2-8.5 3.3-3.2-1.8-1.9-5.7-.9-8.6z" stroke="#D2E3FC" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="m429.2 181.5-3.2-3.2c-.6-.6-.6-1.5 0-2.1l3.2-3.2c.6-.6 1.5-.6 2.1 0l3.2 3.2c.6.6.6 1.5 0 2.1l-3.2 3.2c-.6.6-1.6.6-2.1 0z" fill="#34A853"/><path d="M50.8 141.6a7.8 7.8 0 1 0 0-15.6 7.8 7.8 0 0 0 0 15.6z" fill="#E6E6E6"/><path d="M466.4 225.2c-7.9 0-14.3-6.4-14.3-14.3s6.4-14.3 14.3-14.3 14.3 6.4 14.3 14.3-6.4 14.3-14.3 14.3z" fill="#fff" stroke="#5EF1F2" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M492.8 105.9c1.7 5.5-.3 11.6-5.2 15.1L461 139.8c-6.1 4.3-14.6 2.9-18.9-3.3-.9-1.2-1.5-2.5-1.9-3.9-1.7-5.5.3-11.6 5.2-15.1l26.7-18.8c6.1-4.3 14.6-2.9 19 3.3.6 1.2 1.3 2.5 1.7 3.9z" fill="#fff" stroke="#E6E7EA" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></g><defs><clipPath id="a"><path fill="#fff" transform="translate(28 21)" d="M0 0h466.9v277.2H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left_dark.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left_dark.json new file mode 100644 index 0000000..a270e4fb --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left_dark.json
@@ -0,0 +1 @@ +{"v":"5.9.3","fr":30,"ip":0,"op":99,"w":600,"h":296,"nm":"DM_fingerprint_3_2","ddd":0,"assets":[{"id":"comp_0","nm":"hand LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"index","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.86,39.816,0],"ix":2,"l":2},"a":{"a":0,"k":[129.86,39.816,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[1.297,2.726],[2.42,0.323],[0.609,-2.386],[-1.456,-1.986],[-3.163,2.253]],"o":[[-1.049,-2.205],[-2.441,-0.326],[-0.609,2.386],[2.082,2.838],[2.95,-2.1]],"v":[[119.578,-1.895],[114.461,-6.697],[109.059,-2.646],[110.757,4.298],[119.598,6.692]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0.689,3.011],[2.135,0.808],[0.977,-2.289],[-0.965,-2.295],[-3.267,1.646]],"o":[[-0.557,-2.435],[-2.153,-0.815],[-0.977,2.289],[1.38,3.28],[3.047,-1.535]],"v":[[131.004,-0.144],[127.343,-4.578],[121.727,-1.561],[121.909,4.357],[128.998,7.45]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0.594,2.96],[2.269,0.903],[1.171,-2.166],[-0.929,-2.281],[-3.617,1.414]],"o":[[-0.481,-2.394],[-2.288,-0.911],[-1.171,2.166],[1.328,3.26],[3.372,-1.319]],"v":[[128.941,-3.578],[125.147,-9.481],[118.922,-6.867],[118.877,0.281],[126.869,4.756]],"c":true}]},{"t":79,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[0,0],[8.666,20.582],[2.823,7.226],[-8.257,3.806],[-2.049,-3.47],[-4.093,-8.34],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-4.272,-10.147],[-1.649,-4.22],[5.718,-2.636],[3.97,6.724],[3.692,7.523],[0,0]],"v":[[139.769,93.433],[117.463,34.894],[106.385,8.104],[109.059,-10.945],[122.266,-5.755],[136.296,22.867],[150.819,55.192]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[5.925,20.819],[1.415,7.858],[-9.095,2.202],[-1.379,-3.911],[-2.405,-8.974],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-2.921,-10.264],[-0.826,-4.59],[6.298,-1.525],[2.672,7.579],[2.17,8.094],[0,0]],"v":[[139.769,93.433],[122.412,35.169],[115.574,7.33],[122.061,-11.374],[134.367,-3.508],[141.316,23.288],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0,0],[6.472,22.127],[0.979,7.696],[-8.935,1.68],[-1.142,-3.864],[-1.939,-9.086],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.191,-10.909],[-0.572,-4.495],[6.188,-1.164],[2.213,7.488],[1.749,8.196],[0,0]],"v":[[139.769,93.433],[120.437,31.656],[113.71,2.907],[120.942,-14.917],[132.488,-6.667],[140.768,24.22],[150.819,55.192]],"c":false}]},{"t":79,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.335],"y":[1.035]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.639],"y":[0.105]},"t":14.4,"s":[19]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33.6,"s":[6]},{"i":{"x":[0.499],"y":[0.989]},"o":{"x":[0.673],"y":[0]},"t":58.8,"s":[6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.33],"y":[0.225]},"t":70.8,"s":[-3]},{"t":82.7998046875,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[503.157,274.552,0],"to":[0,-3.333,0],"ti":[4.5,1.333,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[503.157,254.552,0],"to":[-4.5,-1.333,0],"ti":[4.5,-2,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":28.8,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"t":82,"s":[503.157,274.552,0]}],"ix":2,"l":2},"a":{"a":0,"k":[191.157,126.552,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-3.749,-1.166],[-1.981,-3.388],[-3.9,-11.099],[-5.532,-17.305]],"o":[[3.581,-1.112],[3.547,1.103],[5.846,9.996],[4.617,13.141],[0,0]],"v":[[182.957,41.992],[193.49,41.044],[201.859,49.015],[216.105,81.93],[232.244,126.272]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.5,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[119.967,95.829],[147.071,139.722]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.459,-0.224],[-2.04,-3.776],[-2.601,-5.443]],"o":[[2.751,-0.727],[3.845,0.193],[2.04,3.776],[0,0]],"v":[[162.853,36.62],[172.127,34.467],[182.097,41.696],[188.248,56.406]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.924,-3.228],[-3.368,-8.816]],"o":[[6.302,-1.303],[6.731,4.412],[0,0]],"v":[[141.077,29.65],[157.661,32.153],[171.936,56.187]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.902,-1.673],[11.202,-12.826],[-24.735,-1.137],[0,0],[5.392,6.96]],"o":[[-4.902,1.673],[-7.666,8.777],[24.735,1.137],[0,0],[-5.392,-6.96]],"v":[[135.507,32.114],[126.633,71.854],[161.944,100.161],[175.345,58.741],[163.456,35.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[5.573,29.063,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,0],[0,0],[-3.258,-5.898],[0,0],[-24.25,31.875],[1.25,3.75]],"o":[[0,0],[0,0],[3.258,5.898],[0,0],[-5.23,-26.932],[-1.25,-3.75]],"v":[[160.076,24.339],[110.764,92.322],[117.617,108.602],[132.353,127.547],[217.25,123.125],[189.113,44.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":202,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"left shape LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"left shape 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9882352941176471,0.788235294117647,0.20392156862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"left shape 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":96,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"left shape","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":35,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"circle right LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"circle_electric","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3686274509803922,0.9450980392156862,0.9490196078431372,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"circle right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"little circle right LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"little circle_green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3568627450980392,0.7254901960784313,0.4549019607843137,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"little circle_grey 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":93,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"little circle_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":33,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"hand LM","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[310,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":202,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"yellow circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.4,"s":[100]},{"t":83.5998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":30.8,"s":[{"i":[[0,-6.352],[6.352,0],[0,6.352],[-6.352,0]],"o":[[0,6.352],[-6.352,0],[0,-6.352],[6.352,0]],"v":[[124.567,-21.374],[113.066,-9.872],[101.564,-21.374],[113.066,-32.875]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":45.2,"s":[{"i":[[0,-26.302],[26.302,0],[0,26.302],[-26.302,0]],"o":[[0,26.302],[-26.302,0],[0,-26.302],[26.302,0]],"v":[[160.689,-21.374],[113.066,26.25],[65.442,-21.374],[113.066,-68.997]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":65.6,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.635,"y":0},"t":74,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"t":83.5998046875,"s":[{"i":[[0,-27.959],[27.959,0],[0,27.959],[-27.959,0]],"o":[[0,27.959],[-27.959,0],[0,-27.959],[27.959,0]],"v":[[163.689,-21.374],[113.066,29.25],[62.442,-21.374],[113.066,-71.997]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9882352941176471,0.788235294117647,0.20392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":30.8,"op":200,"st":30.8,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"green circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.6,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78.8,"s":[100]},{"t":85.9998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":33.2,"s":[{"i":[[0,-5.837],[5.837,0],[0,5.837],[-5.837,0]],"o":[[0,5.837],[-5.837,0],[0,-5.837],[5.837,0]],"v":[[123.634,-21.374],[113.066,-10.805],[102.497,-21.374],[113.066,-31.942]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":47.6,"s":[{"i":[[0,-15.77],[15.77,0],[0,15.77],[-15.77,0]],"o":[[0,15.77],[-15.77,0],[0,-15.77],[15.77,0]],"v":[[141.619,-21.374],[113.066,7.18],[84.512,-21.374],[113.066,-49.927]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":68,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.617,"y":0},"t":76.4,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"t":85.9998046875,"s":[{"i":[[0,-16.763],[16.763,0],[0,16.763],[-16.763,0]],"o":[[0,16.763],[-16.763,0],[0,-16.763],[16.763,0]],"v":[[143.418,-21.374],[113.066,8.979],[82.713,-21.374],[113.066,-51.726]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3568627450980392,0.7254901960784313,0.4549019607843137,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":33.2,"op":200,"st":33.2,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"left shape LM","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"circle right LM","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[302,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"little circle right LM","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193.691,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,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.192,0],[0,0],[0,1.192],[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0],[1.192,0],[0,0],[0,1.192]],"v":[[119.063,-18.107],[107.068,-18.107],[104.9,-20.275],[104.9,-22.472],[107.068,-24.64],[119.063,-24.64],[121.231,-22.472],[121.231,-20.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[303.677,104.171,0],"ix":2,"l":2},"a":{"a":0,"k":[3.677,-43.829,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.928,0],[0,0],[0,0.928],[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0]],"o":[[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0],[0.928,0],[0,0],[0,0.928]],"v":[[119.551,-38.113],[-112.636,-38.113],[-114.316,-39.793],[-114.316,-108.732],[-112.636,-110.412],[119.551,-110.412],[121.231,-108.732],[121.231,-39.793]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.394,0],[0,0],[0,-2.394],[0,0],[1.197,0],[0,0],[0,1.197],[0,0]],"o":[[0,0],[2.394,0],[0,0],[0,1.197],[0,0],[-1.197,0],[0,0],[0,-2.394]],"v":[[-145.915,-134.466],[152.437,-134.466],[156.773,-130.13],[156.773,-125.217],[154.605,-123.049],[-148.083,-123.049],[-150.25,-125.217],[-150.25,-130.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.253,0],[0,0],[0,-2.253],[0,0],[2.253,0],[0,0],[0,2.253],[0,0]],"o":[[0,0],[2.253,0],[0,0],[0,2.253],[0,0],[-2.253,0],[0,0],[0,-2.253]],"v":[[-35.528,-24.64],[42.05,-24.64],[46.13,-20.56],[46.13,28.031],[42.05,32.111],[-35.528,32.111],[-39.608,28.031],[-39.608,-20.56]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.986,0],[0,0],[0,5.986],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.986,0],[0,0],[0,0],[0,0],[0,5.986]],"v":[[124.704,46.809],[-118.181,46.809],[-129.02,35.97],[-129.02,-129.567],[135.543,-129.567],[135.543,35.97]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left_light.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left_light.json new file mode 100644 index 0000000..456e0b8 --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_left_light.json
@@ -0,0 +1 @@ +{"v":"5.9.3","fr":30,"ip":0,"op":99,"w":600,"h":296,"nm":"LM_fingerprint_3_2","ddd":0,"assets":[{"id":"comp_0","nm":"hand LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"index","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.86,39.816,0],"ix":2,"l":2},"a":{"a":0,"k":[129.86,39.816,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[1.297,2.726],[2.42,0.323],[0.609,-2.386],[-1.456,-1.986],[-3.163,2.253]],"o":[[-1.049,-2.205],[-2.441,-0.326],[-0.609,2.386],[2.082,2.838],[2.95,-2.1]],"v":[[119.578,-1.895],[114.461,-6.697],[109.059,-2.646],[110.757,4.298],[119.598,6.692]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0.689,3.011],[2.135,0.808],[0.977,-2.289],[-0.965,-2.295],[-3.267,1.646]],"o":[[-0.557,-2.435],[-2.153,-0.815],[-0.977,2.289],[1.38,3.28],[3.047,-1.535]],"v":[[131.004,-0.144],[127.343,-4.578],[121.727,-1.561],[121.909,4.357],[128.998,7.45]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0.594,2.96],[2.269,0.903],[1.171,-2.166],[-0.929,-2.281],[-3.617,1.414]],"o":[[-0.481,-2.394],[-2.288,-0.911],[-1.171,2.166],[1.328,3.26],[3.372,-1.319]],"v":[[128.941,-3.578],[125.147,-9.481],[118.922,-6.867],[118.877,0.281],[126.869,4.756]],"c":true}]},{"t":79,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[0,0],[8.666,20.582],[2.823,7.226],[-8.257,3.806],[-2.049,-3.47],[-4.093,-8.34],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-4.272,-10.147],[-1.649,-4.22],[5.718,-2.636],[3.97,6.724],[3.692,7.523],[0,0]],"v":[[139.769,93.433],[117.463,34.894],[106.385,8.104],[109.059,-10.945],[122.266,-5.755],[136.296,22.867],[150.819,55.192]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[5.925,20.819],[1.415,7.858],[-9.095,2.202],[-1.379,-3.911],[-2.405,-8.974],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-2.921,-10.264],[-0.826,-4.59],[6.298,-1.525],[2.672,7.579],[2.17,8.094],[0,0]],"v":[[139.769,93.433],[122.412,35.169],[115.574,7.33],[122.061,-11.374],[134.367,-3.508],[141.316,23.288],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0,0],[6.472,22.127],[0.979,7.696],[-8.935,1.68],[-1.142,-3.864],[-1.939,-9.086],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.191,-10.909],[-0.572,-4.495],[6.188,-1.164],[2.213,7.488],[1.749,8.196],[0,0]],"v":[[139.769,93.433],[120.437,31.656],[113.71,2.907],[120.942,-14.917],[132.488,-6.667],[140.768,24.22],[150.819,55.192]],"c":false}]},{"t":79,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.335],"y":[1.035]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.639],"y":[0.105]},"t":14.4,"s":[19]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33.6,"s":[6]},{"i":{"x":[0.499],"y":[0.989]},"o":{"x":[0.673],"y":[0]},"t":58.8,"s":[6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.33],"y":[0.225]},"t":70.8,"s":[-3]},{"t":82.7998046875,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[503.157,274.552,0],"to":[0,-3.333,0],"ti":[4.5,1.333,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[503.157,254.552,0],"to":[-4.5,-1.333,0],"ti":[4.5,-2,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":28.8,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"t":82,"s":[503.157,274.552,0]}],"ix":2,"l":2},"a":{"a":0,"k":[191.157,126.552,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-3.749,-1.166],[-1.981,-3.388],[-3.9,-11.099],[-5.532,-17.305]],"o":[[3.581,-1.112],[3.547,1.103],[5.846,9.996],[4.617,13.141],[0,0]],"v":[[182.957,41.992],[193.49,41.044],[201.859,49.015],[216.105,81.93],[232.244,126.272]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.5,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[119.967,95.829],[147.071,139.722]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.459,-0.224],[-2.04,-3.776],[-2.601,-5.443]],"o":[[2.751,-0.727],[3.845,0.193],[2.04,3.776],[0,0]],"v":[[162.853,36.62],[172.127,34.467],[182.097,41.696],[188.248,56.406]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.924,-3.228],[-3.368,-8.816]],"o":[[6.302,-1.303],[6.731,4.412],[0,0]],"v":[[141.077,29.65],[157.661,32.153],[171.936,56.187]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.902,-1.673],[11.202,-12.826],[-24.735,-1.137],[0,0],[5.392,6.96]],"o":[[-4.902,1.673],[-7.666,8.777],[24.735,1.137],[0,0],[-5.392,-6.96]],"v":[[135.507,32.114],[126.633,71.854],[161.944,100.161],[175.345,58.741],[163.456,35.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[5.573,29.063,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,0],[0,0],[-3.258,-5.898],[0,0],[-24.25,31.875],[1.25,3.75]],"o":[[0,0],[0,0],[3.258,5.898],[0,0],[-5.23,-26.932],[-1.25,-3.75]],"v":[[160.076,24.339],[110.764,92.322],[117.617,108.602],[132.353,127.547],[217.25,123.125],[189.113,44.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":202,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"left shape LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"left shape 2","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"left shape 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":96,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"left shape","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":35,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"circle right LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"circle_electric","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.188235297799,0.886274516582,0.917647063732,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"circle right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"little circle right LM","fr":30,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"little circle_green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"little circle_grey 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":93,"op":191,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"little circle_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":33,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"hand LM","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[310,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":202,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"yellow circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.4,"s":[100]},{"t":83.5998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":30.8,"s":[{"i":[[0,-6.352],[6.352,0],[0,6.352],[-6.352,0]],"o":[[0,6.352],[-6.352,0],[0,-6.352],[6.352,0]],"v":[[124.567,-21.374],[113.066,-9.872],[101.564,-21.374],[113.066,-32.875]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":45.2,"s":[{"i":[[0,-26.302],[26.302,0],[0,26.302],[-26.302,0]],"o":[[0,26.302],[-26.302,0],[0,-26.302],[26.302,0]],"v":[[160.689,-21.374],[113.066,26.25],[65.442,-21.374],[113.066,-68.997]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":65.6,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.635,"y":0},"t":74,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"t":83.5998046875,"s":[{"i":[[0,-27.959],[27.959,0],[0,27.959],[-27.959,0]],"o":[[0,27.959],[-27.959,0],[0,-27.959],[27.959,0]],"v":[[163.689,-21.374],[113.066,29.25],[62.442,-21.374],[113.066,-71.997]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":30.8,"op":200,"st":30.8,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"green circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.6,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78.8,"s":[100]},{"t":85.9998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":33.2,"s":[{"i":[[0,-5.837],[5.837,0],[0,5.837],[-5.837,0]],"o":[[0,5.837],[-5.837,0],[0,-5.837],[5.837,0]],"v":[[123.634,-21.374],[113.066,-10.805],[102.497,-21.374],[113.066,-31.942]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":47.6,"s":[{"i":[[0,-15.77],[15.77,0],[0,15.77],[-15.77,0]],"o":[[0,15.77],[-15.77,0],[0,-15.77],[15.77,0]],"v":[[141.619,-21.374],[113.066,7.18],[84.512,-21.374],[113.066,-49.927]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":68,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.617,"y":0},"t":76.4,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"t":85.9998046875,"s":[{"i":[[0,-16.763],[16.763,0],[0,16.763],[-16.763,0]],"o":[[0,16.763],[-16.763,0],[0,-16.763],[16.763,0]],"v":[[143.418,-21.374],[113.066,8.979],[82.713,-21.374],[113.066,-51.726]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":33.2,"op":200,"st":33.2,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"left shape LM","refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"circle right LM","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[302,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"little circle right LM","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[306,148,0],"ix":2,"l":2},"a":{"a":0,"k":[300,148,0],"ix":1,"l":2},"s":{"a":0,"k":[-100,100,100],"ix":6,"l":2}},"ao":0,"w":600,"h":296,"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[193.691,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,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.192,0],[0,0],[0,1.192],[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0],[1.192,0],[0,0],[0,1.192]],"v":[[119.063,-18.107],[107.068,-18.107],[104.9,-20.275],[104.9,-22.472],[107.068,-24.64],[119.063,-24.64],[121.231,-22.472],[121.231,-20.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[303.677,104.171,0],"ix":2,"l":2},"a":{"a":0,"k":[3.677,-43.829,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.928,0],[0,0],[0,0.928],[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0]],"o":[[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0],[0.928,0],[0,0],[0,0.928]],"v":[[119.551,-38.113],[-112.636,-38.113],[-114.316,-39.793],[-114.316,-108.732],[-112.636,-110.412],[119.551,-110.412],[121.231,-108.732],[121.231,-39.793]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.394,0],[0,0],[0,-2.394],[0,0],[1.197,0],[0,0],[0,1.197],[0,0]],"o":[[0,0],[2.394,0],[0,0],[0,1.197],[0,0],[-1.197,0],[0,0],[0,-2.394]],"v":[[-145.915,-134.466],[152.437,-134.466],[156.773,-130.13],[156.773,-125.217],[154.605,-123.049],[-148.083,-123.049],[-150.25,-125.217],[-150.25,-130.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.253,0],[0,0],[0,-2.253],[0,0],[2.253,0],[0,0],[0,2.253],[0,0]],"o":[[0,0],[2.253,0],[0,0],[0,2.253],[0,0],[-2.253,0],[0,0],[0,-2.253]],"v":[[-35.528,-24.64],[42.05,-24.64],[46.13,-20.56],[46.13,28.031],[42.05,32.111],[-35.528,32.111],[-39.608,28.031],[-39.608,-20.56]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.986,0],[0,0],[0,5.986],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.986,0],[0,0],[0,0],[0,0],[0,5.986]],"v":[[124.704,46.809],[-118.181,46.809],[-129.02,35.97],[-129.02,-129.567],[135.543,-129.567],[135.543,35.97]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"ct":1,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right.json deleted file mode 100644 index 2b8f5e76..0000000 --- a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right.json +++ /dev/null
@@ -1 +0,0 @@ -{"v":"5.7.6","fr":30,"ip":0,"op":99,"w":440,"h":360,"nm":"4_Fingerprint-Scan_b_v2 - 440x360","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Master Scale Null","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220,180,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[85,85,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":202,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"index","parent":3,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.86,39.816,0],"ix":2,"l":2},"a":{"a":0,"k":[129.86,39.816,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}],"e":[{"i":[[1.297,2.726],[2.42,0.323],[0.609,-2.386],[-1.456,-1.986],[-3.163,2.253]],"o":[[-1.049,-2.205],[-2.441,-0.326],[-0.609,2.386],[2.082,2.838],[2.95,-2.1]],"v":[[119.578,-1.895],[114.461,-6.697],[109.059,-2.646],[110.757,4.298],[119.598,6.692]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[1.297,2.726],[2.42,0.323],[0.609,-2.386],[-1.456,-1.986],[-3.163,2.253]],"o":[[-1.049,-2.205],[-2.441,-0.326],[-0.609,2.386],[2.082,2.838],[2.95,-2.1]],"v":[[119.578,-1.895],[114.461,-6.697],[109.059,-2.646],[110.757,4.298],[119.598,6.692]],"c":true}],"e":[{"i":[[0.689,3.011],[2.135,0.808],[0.977,-2.289],[-0.965,-2.295],[-3.267,1.646]],"o":[[-0.557,-2.435],[-2.153,-0.815],[-0.977,2.289],[1.38,3.28],[3.047,-1.535]],"v":[[131.004,-0.144],[127.343,-4.578],[121.727,-1.561],[121.909,4.357],[128.998,7.45]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0.689,3.011],[2.135,0.808],[0.977,-2.289],[-0.965,-2.295],[-3.267,1.646]],"o":[[-0.557,-2.435],[-2.153,-0.815],[-0.977,2.289],[1.38,3.28],[3.047,-1.535]],"v":[[131.004,-0.144],[127.343,-4.578],[121.727,-1.561],[121.909,4.357],[128.998,7.45]],"c":true}],"e":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}],"e":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}],"e":[{"i":[[0.594,2.96],[2.269,0.903],[1.171,-2.166],[-0.929,-2.281],[-3.617,1.414]],"o":[[-0.481,-2.394],[-2.288,-0.911],[-1.171,2.166],[1.328,3.26],[3.372,-1.319]],"v":[[128.941,-3.578],[125.147,-9.481],[118.922,-6.867],[118.877,0.281],[126.869,4.756]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0.594,2.96],[2.269,0.903],[1.171,-2.166],[-0.929,-2.281],[-3.617,1.414]],"o":[[-0.481,-2.394],[-2.288,-0.911],[-1.171,2.166],[1.328,3.26],[3.372,-1.319]],"v":[[128.941,-3.578],[125.147,-9.481],[118.922,-6.867],[118.877,0.281],[126.869,4.756]],"c":true}],"e":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]},{"t":79}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}],"e":[{"i":[[0,0],[8.666,20.582],[2.823,7.226],[-8.257,3.806],[-2.049,-3.47],[-4.093,-8.34],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-4.272,-10.147],[-1.649,-4.22],[5.718,-2.636],[3.97,6.724],[3.692,7.523],[0,0]],"v":[[139.769,93.433],[117.463,34.894],[106.385,8.104],[109.059,-10.945],[122.266,-5.755],[136.296,22.867],[150.819,55.192]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[0,0],[8.666,20.582],[2.823,7.226],[-8.257,3.806],[-2.049,-3.47],[-4.093,-8.34],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-4.272,-10.147],[-1.649,-4.22],[5.718,-2.636],[3.97,6.724],[3.692,7.523],[0,0]],"v":[[139.769,93.433],[117.463,34.894],[106.385,8.104],[109.059,-10.945],[122.266,-5.755],[136.296,22.867],[150.819,55.192]],"c":false}],"e":[{"i":[[0,0],[5.925,20.819],[1.415,7.858],[-9.095,2.202],[-1.379,-3.911],[-2.405,-8.974],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-2.921,-10.264],[-0.826,-4.59],[6.298,-1.525],[2.672,7.579],[2.17,8.094],[0,0]],"v":[[139.769,93.433],[122.412,35.169],[115.574,7.33],[122.061,-11.374],[134.367,-3.508],[141.316,23.288],[150.819,55.192]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[5.925,20.819],[1.415,7.858],[-9.095,2.202],[-1.379,-3.911],[-2.405,-8.974],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-2.921,-10.264],[-0.826,-4.59],[6.298,-1.525],[2.672,7.579],[2.17,8.094],[0,0]],"v":[[139.769,93.433],[122.412,35.169],[115.574,7.33],[122.061,-11.374],[134.367,-3.508],[141.316,23.288],[150.819,55.192]],"c":false}],"e":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}],"e":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}],"e":[{"i":[[0,0],[6.472,22.127],[0.979,7.696],[-8.935,1.68],[-1.142,-3.864],[-1.939,-9.086],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.191,-10.909],[-0.572,-4.495],[6.188,-1.164],[2.213,7.488],[1.749,8.196],[0,0]],"v":[[139.769,93.433],[120.437,31.656],[113.71,2.907],[120.942,-14.917],[132.488,-6.667],[140.768,24.22],[150.819,55.192]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0,0],[6.472,22.127],[0.979,7.696],[-8.935,1.68],[-1.142,-3.864],[-1.939,-9.086],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.191,-10.909],[-0.572,-4.495],[6.188,-1.164],[2.213,7.488],[1.749,8.196],[0,0]],"v":[[139.769,93.433],[120.437,31.656],[113.71,2.907],[120.942,-14.917],[132.488,-6.667],[140.768,24.22],[150.819,55.192]],"c":false}],"e":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]},{"t":79}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"hand","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.335],"y":[1.035]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0],"e":[19]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.639],"y":[0.105]},"t":14.4,"s":[19],"e":[6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33.6,"s":[6],"e":[6]},{"i":{"x":[0.499],"y":[0.989]},"o":{"x":[0.673],"y":[0]},"t":58.8,"s":[6],"e":[-3]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.33],"y":[0.225]},"t":70.8,"s":[-3],"e":[0]},{"t":82.7998046875}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[203.157,126.552,0],"e":[203.157,106.552,0],"to":[0,-3.333,0],"ti":[4.5,1.333,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[203.157,106.552,0],"e":[176.157,118.552,0],"to":[-4.5,-1.333,0],"ti":[4.5,-2,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":28.8,"s":[176.157,118.552,0],"e":[176.157,118.552,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[176.157,118.552,0],"e":[203.157,126.552,0],"to":[0,0,0],"ti":[0,0,0]},{"t":82}],"ix":2,"l":2},"a":{"a":0,"k":[191.157,126.552,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}],"e":[{"i":[[0,0],[-3.749,-1.166],[-1.981,-3.388],[-3.9,-11.099],[-5.532,-17.305]],"o":[[3.581,-1.112],[3.547,1.103],[5.846,9.996],[4.617,13.141],[0,0]],"v":[[182.957,41.992],[193.49,41.044],[201.859,49.015],[216.105,81.93],[232.244,126.272]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-3.749,-1.166],[-1.981,-3.388],[-3.9,-11.099],[-5.532,-17.305]],"o":[[3.581,-1.112],[3.547,1.103],[5.846,9.996],[4.617,13.141],[0,0]],"v":[[182.957,41.992],[193.49,41.044],[201.859,49.015],[216.105,81.93],[232.244,126.272]],"c":false}],"e":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]},{"t":28.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}],"e":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[119.967,95.829],[147.071,139.722]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.5,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[119.967,95.829],[147.071,139.722]],"c":false}],"e":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]},{"t":28.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}],"e":[{"i":[[0,0],[-4.459,-0.224],[-2.04,-3.776],[-2.601,-5.443]],"o":[[2.751,-0.727],[3.845,0.193],[2.04,3.776],[0,0]],"v":[[162.853,36.62],[172.127,34.467],[182.097,41.696],[188.248,56.406]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.459,-0.224],[-2.04,-3.776],[-2.601,-5.443]],"o":[[2.751,-0.727],[3.845,0.193],[2.04,3.776],[0,0]],"v":[[162.853,36.62],[172.127,34.467],[182.097,41.696],[188.248,56.406]],"c":false}],"e":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]},{"t":28.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}],"e":[{"i":[[0,0],[-4.924,-3.228],[-3.368,-8.816]],"o":[[6.302,-1.303],[6.731,4.412],[0,0]],"v":[[141.077,29.65],[157.661,32.153],[171.936,56.187]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.924,-3.228],[-3.368,-8.816]],"o":[[6.302,-1.303],[6.731,4.412],[0,0]],"v":[[141.077,29.65],[157.661,32.153],[171.936,56.187]],"c":false}],"e":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]},{"t":28.7998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.902,-1.673],[11.202,-12.826],[-24.735,-1.137],[0,0],[5.392,6.96]],"o":[[-4.902,1.673],[-7.666,8.777],[24.735,1.137],[0,0],[-5.392,-6.96]],"v":[[135.507,32.114],[126.633,71.854],[161.944,100.161],[175.345,58.741],[163.456,35.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823529412,0.521568627451,0.956862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"yellow circle","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[30],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.4,"s":[100],"e":[0]},{"t":83.5998046875}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.066,-21.374,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":30.8,"s":[{"i":[[0,-6.352],[6.352,0],[0,6.352],[-6.352,0]],"o":[[0,6.352],[-6.352,0],[0,-6.352],[6.352,0]],"v":[[124.567,-21.374],[113.066,-9.872],[101.564,-21.374],[113.066,-32.875]],"c":true}],"e":[{"i":[[0,-26.302],[26.302,0],[0,26.302],[-26.302,0]],"o":[[0,26.302],[-26.302,0],[0,-26.302],[26.302,0]],"v":[[160.689,-21.374],[113.066,26.25],[65.442,-21.374],[113.066,-68.997]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":45.2,"s":[{"i":[[0,-26.302],[26.302,0],[0,26.302],[-26.302,0]],"o":[[0,26.302],[-26.302,0],[0,-26.302],[26.302,0]],"v":[[160.689,-21.374],[113.066,26.25],[65.442,-21.374],[113.066,-68.997]],"c":true}],"e":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":65.6,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}],"e":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.635,"y":0},"t":74,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}],"e":[{"i":[[0,-27.959],[27.959,0],[0,27.959],[-27.959,0]],"o":[[0,27.959],[-27.959,0],[0,-27.959],[27.959,0]],"v":[[163.689,-21.374],[113.066,29.25],[62.442,-21.374],[113.066,-71.997]],"c":true}]},{"t":83.5998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.984313726425,0.737254917622,0.019607843831,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":30.8,"op":200,"st":30.8,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"green circle","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[30],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.6,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78.8,"s":[100],"e":[0]},{"t":85.9998046875}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.066,-21.374,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":33.2,"s":[{"i":[[0,-5.837],[5.837,0],[0,5.837],[-5.837,0]],"o":[[0,5.837],[-5.837,0],[0,-5.837],[5.837,0]],"v":[[123.634,-21.374],[113.066,-10.805],[102.497,-21.374],[113.066,-31.942]],"c":true}],"e":[{"i":[[0,-15.77],[15.77,0],[0,15.77],[-15.77,0]],"o":[[0,15.77],[-15.77,0],[0,-15.77],[15.77,0]],"v":[[141.619,-21.374],[113.066,7.18],[84.512,-21.374],[113.066,-49.927]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":47.6,"s":[{"i":[[0,-15.77],[15.77,0],[0,15.77],[-15.77,0]],"o":[[0,15.77],[-15.77,0],[0,-15.77],[15.77,0]],"v":[[141.619,-21.374],[113.066,7.18],[84.512,-21.374],[113.066,-49.927]],"c":true}],"e":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":68,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}],"e":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.617,"y":0},"t":76.4,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}],"e":[{"i":[[0,-16.763],[16.763,0],[0,16.763],[-16.763,0]],"o":[[0,16.763],[-16.763,0],[0,-16.763],[16.763,0]],"v":[[143.418,-21.374],[113.066,8.979],[82.713,-21.374],[113.066,-51.726]],"c":true}]},{"t":85.9998046875}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":33.2,"op":200,"st":33.2,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"left shape","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0],"e":[-30]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30],"e":[21.58]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58],"e":[0]},{"t":97}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[-211.229],"e":[-169.229]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[-169.229],"e":[-169.229]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[-169.229],"e":[-219.229]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[-219.229],"e":[-207.729]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[-207.729],"e":[-211.229]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[-211.229],"e":[-169.229]},{"t":113}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[-9.569],"e":[-18.569]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[-18.569],"e":[-18.569]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[-18.569],"e":[-8.569]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[-8.569],"e":[-10.569]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[-10.569],"e":[-9.569]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[-9.569],"e":[-18.569]},{"t":113}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0.901960790157,0.905882358551,0.917647063732,1],"e":[1,0.729411780834,0,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[1,0.729411780834,0,1],"e":[1,0.729411780834,0,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[1,0.729411780834,0,1],"e":[0.901960790157,0.905882358551,0.917647063732,1]},{"t":97}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"circle right","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":98}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[212.374],"e":[181.337]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[181.337],"e":[181.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[181.337],"e":[212.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[212.337],"e":[206.837]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[206.837],"e":[212.374]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[212.374],"e":[181.337]},{"t":120}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[-94.826],"e":[-78.66]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[-78.66],"e":[-78.66]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[-78.66],"e":[-94.16]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[-94.16],"e":[-90.66]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[-90.66],"e":[-94.826]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[-94.826],"e":[-78.66]},{"t":120}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.901960790157,0.905882358551,0.917647063732,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"little circle right","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[-360]},{"t":98}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[188.949],"e":[172.199]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[172.199],"e":[172.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[172.199],"e":[189.699]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[189.699],"e":[187.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[187.699],"e":[188.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[188.949],"e":[172.199]},{"t":114}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[-45.171],"e":[-34.921]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[-34.921],"e":[-34.921]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[-34.921],"e":[-45.421]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[-45.421],"e":[-44.171]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[-44.171],"e":[-45.171]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[-45.171],"e":[-34.921]},{"t":114}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0.901960790157,0.905882358551,0.917647063732,1],"e":[0.203921571374,0.658823549747,0.32549020648,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0.203921571374,0.658823549747,0.32549020648,1],"e":[0.203921571374,0.658823549747,0.32549020648,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[0.203921571374,0.658823549747,0.32549020648,1],"e":[0.901960790157,0.905882358551,0.917647063732,1]},{"t":94}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":" 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[113.066,-21.374,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,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.192,0],[0,0],[0,1.192],[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0],[1.192,0],[0,0],[0,1.192]],"v":[[119.063,-18.107],[107.068,-18.107],[104.9,-20.275],[104.9,-22.472],[107.068,-24.64],[119.063,-24.64],[121.231,-22.472],[121.231,-20.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":21.6,"s":[0.164705887437,0.517647087574,0.988235354424,1],"e":[0.145098045468,0.372549027205,0.858823537827,1]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":26.4,"s":[0.145098045468,0.372549027205,0.858823537827,1],"e":[0.145098045468,0.372549027205,0.858823537827,1]},{"i":{"x":[0.6],"y":[1]},"o":{"x":[0.8],"y":[0]},"t":70.8,"s":[0.145098045468,0.372549027205,0.858823537827,1],"e":[0.164705887437,0.517647087574,0.988235354424,1]},{"t":75.599609375}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Layer 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[3.677,-43.829,0],"ix":2,"l":2},"a":{"a":0,"k":[3.677,-43.829,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.928,0],[0,0],[0,0.928],[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0]],"o":[[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0],[0.928,0],[0,0],[0,0.928]],"v":[[119.551,-38.113],[-112.636,-38.113],[-114.316,-39.793],[-114.316,-108.732],[-112.636,-110.412],[119.551,-110.412],[121.231,-108.732],[121.231,-39.793]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.394,0],[0,0],[0,-2.394],[0,0],[1.197,0],[0,0],[0,1.197],[0,0]],"o":[[0,0],[2.394,0],[0,0],[0,1.197],[0,0],[-1.197,0],[0,0],[0,-2.394]],"v":[[-145.915,-134.466],[152.437,-134.466],[156.773,-130.13],[156.773,-125.217],[154.605,-123.049],[-148.083,-123.049],[-150.25,-125.217],[-150.25,-130.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.253,0],[0,0],[0,-2.253],[0,0],[2.253,0],[0,0],[0,2.253],[0,0]],"o":[[0,0],[2.253,0],[0,0],[0,2.253],[0,0],[-2.253,0],[0,0],[0,-2.253]],"v":[[-35.528,-24.64],[42.05,-24.64],[46.13,-20.56],[46.13,28.031],[42.05,32.111],[-35.528,32.111],[-39.608,28.031],[-39.608,-20.56]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.164705887437,0.517647087574,0.988235294819,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.986,0],[0,0],[0,5.986],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.986,0],[0,0],[0,0],[0,0],[0,5.986]],"v":[[124.704,46.809],[-118.181,46.809],[-129.02,35.97],[-129.02,-129.567],[135.543,-129.567],[135.543,35.97]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":3,"nm":"Null 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":-180,"ix":10},"p":{"a":0,"k":[25,-5,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":191,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":1,"nm":"Bkrnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220,180,0],"ix":2,"l":2},"a":{"a":0,"k":[220,180,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":440,"sh":360,"sc":"#ffffff","ip":0,"op":202,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right_dark.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right_dark.json new file mode 100644 index 0000000..ab54493b --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right_dark.json
@@ -0,0 +1 @@ +{"v":"5.9.2","fr":30,"ip":0,"op":99,"w":600,"h":296,"nm":"DM_fingerprint_3_1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"index","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.86,39.816,0],"ix":2,"l":2},"a":{"a":0,"k":[129.86,39.816,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[1.297,2.726],[2.42,0.323],[0.609,-2.386],[-1.456,-1.986],[-3.163,2.253]],"o":[[-1.049,-2.205],[-2.441,-0.326],[-0.609,2.386],[2.082,2.838],[2.95,-2.1]],"v":[[119.578,-1.895],[114.461,-6.697],[109.059,-2.646],[110.757,4.298],[119.598,6.692]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0.689,3.011],[2.135,0.808],[0.977,-2.289],[-0.965,-2.295],[-3.267,1.646]],"o":[[-0.557,-2.435],[-2.153,-0.815],[-0.977,2.289],[1.38,3.28],[3.047,-1.535]],"v":[[131.004,-0.144],[127.343,-4.578],[121.727,-1.561],[121.909,4.357],[128.998,7.45]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0.594,2.96],[2.269,0.903],[1.171,-2.166],[-0.929,-2.281],[-3.617,1.414]],"o":[[-0.481,-2.394],[-2.288,-0.911],[-1.171,2.166],[1.328,3.26],[3.372,-1.319]],"v":[[128.941,-3.578],[125.147,-9.481],[118.922,-6.867],[118.877,0.281],[126.869,4.756]],"c":true}]},{"t":79,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[0,0],[8.666,20.582],[2.823,7.226],[-8.257,3.806],[-2.049,-3.47],[-4.093,-8.34],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-4.272,-10.147],[-1.649,-4.22],[5.718,-2.636],[3.97,6.724],[3.692,7.523],[0,0]],"v":[[139.769,93.433],[117.463,34.894],[106.385,8.104],[109.059,-10.945],[122.266,-5.755],[136.296,22.867],[150.819,55.192]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[5.925,20.819],[1.415,7.858],[-9.095,2.202],[-1.379,-3.911],[-2.405,-8.974],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-2.921,-10.264],[-0.826,-4.59],[6.298,-1.525],[2.672,7.579],[2.17,8.094],[0,0]],"v":[[139.769,93.433],[122.412,35.169],[115.574,7.33],[122.061,-11.374],[134.367,-3.508],[141.316,23.288],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0,0],[6.472,22.127],[0.979,7.696],[-8.935,1.68],[-1.142,-3.864],[-1.939,-9.086],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.191,-10.909],[-0.572,-4.495],[6.188,-1.164],[2.213,7.488],[1.749,8.196],[0,0]],"v":[[139.769,93.433],[120.437,31.656],[113.71,2.907],[120.942,-14.917],[132.488,-6.667],[140.768,24.22],[150.819,55.192]],"c":false}]},{"t":79,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.335],"y":[1.035]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.639],"y":[0.105]},"t":14.4,"s":[19]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33.6,"s":[6]},{"i":{"x":[0.499],"y":[0.989]},"o":{"x":[0.673],"y":[0]},"t":58.8,"s":[6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.33],"y":[0.225]},"t":70.8,"s":[-3]},{"t":82.7998046875,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[503.157,274.552,0],"to":[0,-3.333,0],"ti":[4.5,1.333,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[503.157,254.552,0],"to":[-4.5,-1.333,0],"ti":[4.5,-2,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":28.8,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"t":82,"s":[503.157,274.552,0]}],"ix":2,"l":2},"a":{"a":0,"k":[191.157,126.552,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-3.749,-1.166],[-1.981,-3.388],[-3.9,-11.099],[-5.532,-17.305]],"o":[[3.581,-1.112],[3.547,1.103],[5.846,9.996],[4.617,13.141],[0,0]],"v":[[182.957,41.992],[193.49,41.044],[201.859,49.015],[216.105,81.93],[232.244,126.272]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.5,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[119.967,95.829],[147.071,139.722]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.459,-0.224],[-2.04,-3.776],[-2.601,-5.443]],"o":[[2.751,-0.727],[3.845,0.193],[2.04,3.776],[0,0]],"v":[[162.853,36.62],[172.127,34.467],[182.097,41.696],[188.248,56.406]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.924,-3.228],[-3.368,-8.816]],"o":[[6.302,-1.303],[6.731,4.412],[0,0]],"v":[[141.077,29.65],[157.661,32.153],[171.936,56.187]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.902,-1.673],[11.202,-12.826],[-24.735,-1.137],[0,0],[5.392,6.96]],"o":[[-4.902,1.673],[-7.666,8.777],[24.735,1.137],[0,0],[-5.392,-6.96]],"v":[[135.507,32.114],[126.633,71.854],[161.944,100.161],[175.345,58.741],[163.456,35.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[3.573,27.063,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,0],[0,0],[-3.258,-5.898],[0,0],[-24.25,31.875],[1.25,3.75]],"o":[[0,0],[0,0],[3.258,5.898],[0,0],[-5.23,-26.932],[-1.25,-3.75]],"v":[[159.056,29.259],[110.764,92.322],[117.617,108.602],[132.353,127.547],[217.25,123.125],[189.113,44.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":202,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"yellow circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.4,"s":[100]},{"t":83.5998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":30.8,"s":[{"i":[[0,-6.352],[6.352,0],[0,6.352],[-6.352,0]],"o":[[0,6.352],[-6.352,0],[0,-6.352],[6.352,0]],"v":[[124.567,-21.374],[113.066,-9.872],[101.564,-21.374],[113.066,-32.875]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":45.2,"s":[{"i":[[0,-26.302],[26.302,0],[0,26.302],[-26.302,0]],"o":[[0,26.302],[-26.302,0],[0,-26.302],[26.302,0]],"v":[[160.689,-21.374],[113.066,26.25],[65.442,-21.374],[113.066,-68.997]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":65.6,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.635,"y":0},"t":74,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"t":83.5998046875,"s":[{"i":[[0,-27.959],[27.959,0],[0,27.959],[-27.959,0]],"o":[[0,27.959],[-27.959,0],[0,-27.959],[27.959,0]],"v":[[163.689,-21.374],[113.066,29.25],[62.442,-21.374],[113.066,-71.997]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9882352941176471,0.788235294117647,0.20392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":30.8,"op":200,"st":30.8,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"green circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.6,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78.8,"s":[100]},{"t":85.9998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":33.2,"s":[{"i":[[0,-5.837],[5.837,0],[0,5.837],[-5.837,0]],"o":[[0,5.837],[-5.837,0],[0,-5.837],[5.837,0]],"v":[[123.634,-21.374],[113.066,-10.805],[102.497,-21.374],[113.066,-31.942]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":47.6,"s":[{"i":[[0,-15.77],[15.77,0],[0,15.77],[-15.77,0]],"o":[[0,15.77],[-15.77,0],[0,-15.77],[15.77,0]],"v":[[141.619,-21.374],[113.066,7.18],[84.512,-21.374],[113.066,-49.927]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":68,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.617,"y":0},"t":76.4,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"t":85.9998046875,"s":[{"i":[[0,-16.763],[16.763,0],[0,16.763],[-16.763,0]],"o":[[0,16.763],[-16.763,0],[0,-16.763],[16.763,0]],"v":[[143.418,-21.374],[113.066,8.979],[82.713,-21.374],[113.066,-51.726]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3568627450980392,0.7254901960784313,0.4549019607843137,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":33.2,"op":200,"st":33.2,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"oval_yellow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9882352941176471,0.788235294117647,0.20392156862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"oval_grey 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":191,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"oval_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":35,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"circle_electric","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3686274509803922,0.9450980392156862,0.9490196078431372,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"circle right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"little circle green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3568627450980392,0.7254901960784313,0.4549019607843137,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"little circle grey 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":93,"op":101,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"little circle grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":34,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,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.192,0],[0,0],[0,1.192],[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0],[1.192,0],[0,0],[0,1.192]],"v":[[119.063,-18.107],[107.068,-18.107],[104.9,-20.275],[104.9,-22.472],[107.068,-24.64],[119.063,-24.64],[121.231,-22.472],[121.231,-20.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[303.677,104.171,0],"ix":2,"l":2},"a":{"a":0,"k":[3.677,-43.829,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.928,0],[0,0],[0,0.928],[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0]],"o":[[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0],[0.928,0],[0,0],[0,0.928]],"v":[[119.551,-38.113],[-112.636,-38.113],[-114.316,-39.793],[-114.316,-108.732],[-112.636,-110.412],[119.551,-110.412],[121.231,-108.732],[121.231,-39.793]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.394,0],[0,0],[0,-2.394],[0,0],[1.197,0],[0,0],[0,1.197],[0,0]],"o":[[0,0],[2.394,0],[0,0],[0,1.197],[0,0],[-1.197,0],[0,0],[0,-2.394]],"v":[[-145.915,-134.466],[152.437,-134.466],[156.773,-130.13],[156.773,-125.217],[154.605,-123.049],[-148.083,-123.049],[-150.25,-125.217],[-150.25,-130.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.253,0],[0,0],[0,-2.253],[0,0],[2.253,0],[0,0],[0,2.253],[0,0]],"o":[[0,0],[2.253,0],[0,0],[0,2.253],[0,0],[-2.253,0],[0,0],[0,-2.253]],"v":[[-35.528,-24.64],[42.05,-24.64],[46.13,-20.56],[46.13,28.031],[42.05,32.111],[-35.528,32.111],[-39.608,28.031],[-39.608,-20.56]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.986,0],[0,0],[0,5.986],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.986,0],[0,0],[0,0],[0,0],[0,5.986]],"v":[[124.704,46.809],[-118.181,46.809],[-129.02,35.97],[-129.02,-129.567],[135.543,-129.567],[135.543,35.97]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right_light.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right_light.json new file mode 100644 index 0000000..5a272d38 --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_bottom_right_light.json
@@ -0,0 +1 @@ +{"v":"5.9.2","fr":30,"ip":0,"op":99,"w":600,"h":296,"nm":"LM_fingerprint_3_1","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"index","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[129.86,39.816,0],"ix":2,"l":2},"a":{"a":0,"k":[129.86,39.816,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":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[1.297,2.726],[2.42,0.323],[0.609,-2.386],[-1.456,-1.986],[-3.163,2.253]],"o":[[-1.049,-2.205],[-2.441,-0.326],[-0.609,2.386],[2.082,2.838],[2.95,-2.1]],"v":[[119.578,-1.895],[114.461,-6.697],[109.059,-2.646],[110.757,4.298],[119.598,6.692]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0.689,3.011],[2.135,0.808],[0.977,-2.289],[-0.965,-2.295],[-3.267,1.646]],"o":[[-0.557,-2.435],[-2.153,-0.815],[-0.977,2.289],[1.38,3.28],[3.047,-1.535]],"v":[[131.004,-0.144],[127.343,-4.578],[121.727,-1.561],[121.909,4.357],[128.998,7.45]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[1.003,2.848],[2.373,0.577],[0.857,-2.309],[-1.239,-2.128],[-3.383,1.907]],"o":[[-0.811,-2.303],[-2.393,-0.582],[-0.857,2.309],[1.771,3.042],[3.155,-1.778]],"v":[[124.457,-3.222],[119.875,-8.537],[114.076,-5.078],[115.032,2.007],[123.572,5.32]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0.594,2.96],[2.269,0.903],[1.171,-2.166],[-0.929,-2.281],[-3.617,1.414]],"o":[[-0.481,-2.394],[-2.288,-0.911],[-1.171,2.166],[1.328,3.26],[3.372,-1.319]],"v":[[128.941,-3.578],[125.147,-9.481],[118.922,-6.867],[118.877,0.281],[126.869,4.756]],"c":true}]},{"t":79,"s":[{"i":[[1.246,1.561],[2.398,-0.003],[0.641,-1.511],[-1.415,-1.095],[-3.176,1.641]],"o":[[-1.007,-1.263],[-2.419,0.003],[-0.641,1.511],[2.023,1.565],[2.962,-1.531]],"v":[[119.239,-3.284],[114.233,-5.8],[108.806,-2.871],[110.154,1.399],[117.606,1.94]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":4.8,"s":[{"i":[[0,0],[8.666,20.582],[2.823,7.226],[-8.257,3.806],[-2.049,-3.47],[-4.093,-8.34],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-4.272,-10.147],[-1.649,-4.22],[5.718,-2.636],[3.97,6.724],[3.692,7.523],[0,0]],"v":[[139.769,93.433],[117.463,34.894],[106.385,8.104],[109.059,-10.945],[122.266,-5.755],[136.296,22.867],[150.819,55.192]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":17,"s":[{"i":[[0,0],[5.925,20.819],[1.415,7.858],[-9.095,2.202],[-1.379,-3.911],[-2.405,-8.974],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-2.921,-10.264],[-0.826,-4.59],[6.298,-1.525],[2.672,7.579],[2.17,8.094],[0,0]],"v":[[139.769,93.433],[122.412,35.169],[115.574,7.33],[122.061,-11.374],[134.367,-3.508],[141.316,23.288],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.167,"y":0},"t":31.2,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.667,"y":1},"o":{"x":0.333,"y":0},"t":59,"s":[{"i":[[0,0],[7.501,21.407],[2.046,7.483],[-8.612,2.914],[-1.672,-3.666],[-3.191,-8.725],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.698,-10.554],[-1.195,-4.371],[5.964,-2.018],[3.239,7.105],[2.879,7.87],[0,0]],"v":[[139.769,93.433],[119.32,33.174],[110.283,5.33],[114.95,-13.33],[127.537,-6.777],[138.471,23.164],[150.819,55.192]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.333,"y":0},"t":67.5,"s":[{"i":[[0,0],[6.472,22.127],[0.979,7.696],[-8.935,1.68],[-1.142,-3.864],[-1.939,-9.086],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-3.191,-10.909],[-0.572,-4.495],[6.188,-1.164],[2.213,7.488],[1.749,8.196],[0,0]],"v":[[139.769,93.433],[120.437,31.656],[113.71,2.907],[120.942,-14.917],[132.488,-6.667],[140.768,24.22],[150.819,55.192]],"c":false}]},{"t":79,"s":[{"i":[[0,0],[7.59,21.375],[3.972,7.334],[-8.09,4.149],[-2.192,-3.381],[-7.696,-18.956],[-3.08,-7.793]],"o":[[-3.785,-14.375],[-6.574,-18.516],[-2.158,-3.984],[5.602,-2.873],[4.248,6.551],[3.152,7.765],[0,0]],"v":[[139.769,93.433],[122.799,40.684],[107.77,8.822],[108.51,-8.936],[121.924,-4.305],[140.953,29.671],[150.819,55.192]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.335],"y":[1.035]},"o":{"x":[0.4],"y":[0]},"t":0,"s":[0]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.639],"y":[0.105]},"t":14.4,"s":[19]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":33.6,"s":[6]},{"i":{"x":[0.499],"y":[0.989]},"o":{"x":[0.673],"y":[0]},"t":58.8,"s":[6]},{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.33],"y":[0.225]},"t":70.8,"s":[-3]},{"t":82.7998046875,"s":[0]}],"ix":10},"p":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[503.157,274.552,0],"to":[0,-3.333,0],"ti":[4.5,1.333,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[503.157,254.552,0],"to":[-4.5,-1.333,0],"ti":[4.5,-2,0]},{"i":{"x":0.2,"y":0.2},"o":{"x":0.4,"y":0.4},"t":28.8,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[476.157,266.552,0],"to":[0,0,0],"ti":[0,0,0]},{"t":82,"s":[503.157,274.552,0]}],"ix":2,"l":2},"a":{"a":0,"k":[191.157,126.552,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-3.749,-1.166],[-1.981,-3.388],[-3.9,-11.099],[-5.532,-17.305]],"o":[[3.581,-1.112],[3.547,1.103],[5.846,9.996],[4.617,13.141],[0,0]],"v":[[182.957,41.992],[193.49,41.044],[201.859,49.015],[216.105,81.93],[232.244,126.272]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-4.174,-1.462],[-1.952,-3.536],[-3.434,-11.376],[-3.791,-15.178]],"o":[[4.191,-0.821],[3.949,1.383],[5.758,10.432],[4.066,13.469],[0,0]],"v":[[186.674,42.882],[199.898,42.533],[208.723,51.149],[221.968,85.1],[232.244,126.272]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.5,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[119.967,95.829],[147.071,139.722]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.327,-13.145],[-16.389,-16.681]],"o":[[-5.473,11.383],[4.992,19.724],[0,0]],"v":[[128.993,60.476],[118.855,95.287],[147.071,139.722]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.459,-0.224],[-2.04,-3.776],[-2.601,-5.443]],"o":[[2.751,-0.727],[3.845,0.193],[2.04,3.776],[0,0]],"v":[[162.853,36.62],[172.127,34.467],[182.097,41.696],[188.248,56.406]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-3.222,-0.408],[-1.982,-3.927],[-2.471,-5.634]],"o":[[3.208,-0.504],[4.364,0.553],[1.982,3.927],[0,0]],"v":[[166.538,35.782],[176.109,34.265],[185.72,42.518],[191.393,57.674]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":0,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":14.4,"s":[{"i":[[0,0],[-4.924,-3.228],[-3.368,-8.816]],"o":[[6.302,-1.303],[6.731,4.412],[0,0]],"v":[[141.077,29.65],[157.661,32.153],[171.936,56.187]],"c":false}]},{"t":28.7998046875,"s":[{"i":[[0,0],[-5.326,-3.612],[-3.037,-9.057]],"o":[[6.302,-1.303],[7.28,4.937],[0,0]],"v":[[141.077,29.65],[159.804,30.799],[174.626,55.866]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[4.902,-1.673],[11.202,-12.826],[-24.735,-1.137],[0,0],[5.392,6.96]],"o":[[-4.902,1.673],[-7.666,8.777],[24.735,1.137],[0,0],[-5.392,-6.96]],"v":[[135.507,32.114],[126.633,71.854],[161.944,100.161],[175.345,58.741],[163.456,35.552]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 1","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-6,"ix":10},"p":{"a":0,"k":[3.573,27.063,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,0],[0,0],[-3.258,-5.898],[0,0],[-24.25,31.875],[1.25,3.75]],"o":[[0,0],[0,0],[3.258,5.898],[0,0],[-5.23,-26.932],[-1.25,-3.75]],"v":[[159.056,29.259],[110.764,92.322],[117.617,108.602],[132.353,127.547],[217.25,123.125],[189.113,44.65]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":202,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"yellow circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":30.8,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.4,"s":[100]},{"t":83.5998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":30.8,"s":[{"i":[[0,-6.352],[6.352,0],[0,6.352],[-6.352,0]],"o":[[0,6.352],[-6.352,0],[0,-6.352],[6.352,0]],"v":[[124.567,-21.374],[113.066,-9.872],[101.564,-21.374],[113.066,-32.875]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":45.2,"s":[{"i":[[0,-26.302],[26.302,0],[0,26.302],[-26.302,0]],"o":[[0,26.302],[-26.302,0],[0,-26.302],[26.302,0]],"v":[[160.689,-21.374],[113.066,26.25],[65.442,-21.374],[113.066,-68.997]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":65.6,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.635,"y":0},"t":74,"s":[{"i":[[0,-24.598],[24.598,0],[0,24.598],[-24.598,0]],"o":[[0,24.598],[-24.598,0],[0,-24.598],[24.598,0]],"v":[[157.604,-21.374],[113.066,23.164],[68.528,-21.374],[113.066,-65.912]],"c":true}]},{"t":83.5998046875,"s":[{"i":[[0,-27.959],[27.959,0],[0,27.959],[-27.959,0]],"o":[[0,27.959],[-27.959,0],[0,-27.959],[27.959,0]],"v":[[163.689,-21.374],[113.066,29.25],[62.442,-21.374],[113.066,-71.997]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":30.8,"op":200,"st":30.8,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"green circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":33.2,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":35.6,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":78.8,"s":[100]},{"t":85.9998046875,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.817},"o":{"x":0.167,"y":0.167},"t":33.2,"s":[{"i":[[0,-5.837],[5.837,0],[0,5.837],[-5.837,0]],"o":[[0,5.837],[-5.837,0],[0,-5.837],[5.837,0]],"v":[[123.634,-21.374],[113.066,-10.805],[102.497,-21.374],[113.066,-31.942]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":47.6,"s":[{"i":[[0,-15.77],[15.77,0],[0,15.77],[-15.77,0]],"o":[[0,15.77],[-15.77,0],[0,-15.77],[15.77,0]],"v":[[141.619,-21.374],[113.066,7.18],[84.512,-21.374],[113.066,-49.927]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":68,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.617,"y":0},"t":76.4,"s":[{"i":[[0,-14.748],[14.748,0],[0,14.748],[-14.748,0]],"o":[[0,14.748],[-14.748,0],[0,-14.748],[14.748,0]],"v":[[139.769,-21.374],[113.066,5.33],[86.362,-21.374],[113.066,-48.077]],"c":true}]},{"t":85.9998046875,"s":[{"i":[[0,-16.763],[16.763,0],[0,16.763],[-16.763,0]],"o":[[0,16.763],[-16.763,0],[0,-16.763],[16.763,0]],"v":[[143.418,-21.374],[113.066,8.979],[82.713,-21.374],[113.066,-51.726]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Stroke","hd":false}],"ip":33.2,"op":200,"st":33.2,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"oval_yellow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"oval_grey 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":94,"op":191,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"oval_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.515],"y":[0.924]},"o":{"x":[0.174],"y":[0.295]},"t":0,"s":[0]},{"i":{"x":[0.518],"y":[0.854]},"o":{"x":[0.467],"y":[-0.095]},"t":23.029,"s":[-30]},{"i":{"x":[0.845],"y":[0.897]},"o":{"x":[0.456],"y":[-0.072]},"t":69.088,"s":[21.58]},{"t":97,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":-10,"s":[88.771]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[130.771]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[130.771]},{"i":{"x":[0.531],"y":[1.289]},"o":{"x":[0.482],"y":[-0.297]},"t":53,"s":[80.771]},{"i":{"x":[0.645],"y":[1.456]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[92.271]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.635],"y":[0.136]},"t":89,"s":[88.771]},{"t":113,"s":[130.771]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":-10,"s":[138.431]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[129.431]},{"i":{"x":[0.421],"y":[0.91]},"o":{"x":[0.47],"y":[0]},"t":31,"s":[129.431]},{"i":{"x":[0.531],"y":[1.333]},"o":{"x":[0.482],"y":[-0.342]},"t":53,"s":[139.431]},{"i":{"x":[0.56],"y":[1.24]},"o":{"x":[0.422],"y":[0.479]},"t":73,"s":[137.431]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.655],"y":[0.06]},"t":89,"s":[138.431]},{"t":113,"s":[129.431]}],"ix":4}},"a":{"a":0,"k":[-219.229,-8.569,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.341,-1.328],[4.903,-3.15],[0,0],[3.923,6.121],[0.343,1.336],[-4.895,3.148],[0,0],[-3.931,-6.119]],"o":[[1.372,5.351],[0,0],[-6.113,3.921],[-0.781,-1.215],[-1.37,-5.343],[0,0],[6.12,-3.923],[0.781,1.215]],"v":[[-193.189,-20.37],[-198.832,-6.02],[-225.407,11.041],[-243.591,7.072],[-245.269,3.223],[-239.632,-11.118],[-213.057,-28.178],[-194.865,-24.212]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":35,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"circle_electric","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":36,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":94,"s":[100]},{"t":97,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.188235297799,0.886274516582,0.917647063732,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"circle right","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.143]},"t":-11,"s":[512.374]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[481.337]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[481.337]},{"i":{"x":[0.673],"y":[1.412]},"o":{"x":[0.532],"y":[0.302]},"t":54,"s":[512.337]},{"i":{"x":[0.544],"y":[0.733]},"o":{"x":[0.524],"y":[0.517]},"t":74,"s":[506.837]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.126]},"t":92,"s":[512.374]},{"t":120,"s":[481.337]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.141]},"t":-11,"s":[53.174]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":21,"s":[69.34]},{"i":{"x":[0.412],"y":[1.072]},"o":{"x":[0.363],"y":[0]},"t":31,"s":[69.34]},{"i":{"x":[0.673],"y":[1.343]},"o":{"x":[0.532],"y":[0.251]},"t":54,"s":[53.84]},{"i":{"x":[0.544],"y":[0.786]},"o":{"x":[0.524],"y":[0.416]},"t":74,"s":[57.34]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.654],"y":[-0.123]},"t":92,"s":[53.174]},{"t":120,"s":[69.34]}],"ix":4}},"a":{"a":0,"k":[215.045,-95.56,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[214.337,-82.893],[214.337,-82.893],[200.07,-97.16],[200.07,-97.16],[214.337,-111.427],[214.337,-111.427],[228.604,-97.16],[228.604,-97.16]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"little circle green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":31,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":34,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":91,"s":[100]},{"t":94,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":191,"st":0,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"little circle grey 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":93,"op":101,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"little circle grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":98,"s":[-360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[488.949]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[472.199]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[472.199]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[489.699]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[487.699]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[488.949]},{"t":114,"s":[472.199]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":-11,"s":[102.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":15,"s":[113.079]},{"i":{"x":[0.407],"y":[1.07]},"o":{"x":[0.66],"y":[0]},"t":31,"s":[113.079]},{"i":{"x":[0.598],"y":[1.02]},"o":{"x":[0.644],"y":[0.576]},"t":51,"s":[102.579]},{"i":{"x":[0.547],"y":[1.227]},"o":{"x":[0.415],"y":[0.027]},"t":69,"s":[103.829]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.657],"y":[0.044]},"t":88,"s":[102.829]},{"t":114,"s":[113.079]}],"ix":4}},"a":{"a":0,"k":[189.699,-45.421,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-2.772],[2.772,0],[0,2.772],[-2.772,0]],"o":[[0,2.772],[-2.772,0],[0,-2.772],[2.772,0]],"v":[[194.218,-46.296],[189.199,-41.278],[184.181,-46.296],[189.199,-51.315]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":34,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[413.066,126.626,0],"ix":2,"l":2},"a":{"a":0,"k":[113.066,-21.374,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.192,0],[0,0],[0,1.192],[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0]],"o":[[0,0],[-1.192,0],[0,0],[0,-1.192],[0,0],[1.192,0],[0,0],[0,1.192]],"v":[[119.063,-18.107],[107.068,-18.107],[104.9,-20.275],[104.9,-22.472],[107.068,-24.64],[119.063,-24.64],[121.231,-22.472],[121.231,-20.275]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"Layer 2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[303.677,104.171,0],"ix":2,"l":2},"a":{"a":0,"k":[3.677,-43.829,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.928,0],[0,0],[0,0.928],[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0]],"o":[[0,0],[-0.928,0],[0,0],[0,-0.928],[0,0],[0.928,0],[0,0],[0,0.928]],"v":[[119.551,-38.113],[-112.636,-38.113],[-114.316,-39.793],[-114.316,-108.732],[-112.636,-110.412],[119.551,-110.412],[121.231,-108.732],[121.231,-39.793]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.394,0],[0,0],[0,-2.394],[0,0],[1.197,0],[0,0],[0,1.197],[0,0]],"o":[[0,0],[2.394,0],[0,0],[0,1.197],[0,0],[-1.197,0],[0,0],[0,-2.394]],"v":[[-145.915,-134.466],[152.437,-134.466],[156.773,-130.13],[156.773,-125.217],[154.605,-123.049],[-148.083,-123.049],[-150.25,-125.217],[-150.25,-130.13]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-2.253,0],[0,0],[0,-2.253],[0,0],[2.253,0],[0,0],[0,2.253],[0,0]],"o":[[0,0],[2.253,0],[0,0],[0,2.253],[0,0],[-2.253,0],[0,0],[0,-2.253]],"v":[[-35.528,-24.64],[42.05,-24.64],[46.13,-20.56],[46.13,28.031],[42.05,32.111],[-35.528,32.111],[-39.608,28.031],[-39.608,-20.56]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[5.986,0],[0,0],[0,5.986],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.986,0],[0,0],[0,0],[0,0],[0,5.986]],"v":[[124.704,46.809],[-118.181,46.809],[-129.02,35.97],[-129.02,-129.567],[135.543,-129.567],[135.543,35.97]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 5","np":3,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_top_right.svg b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_top_right.svg deleted file mode 100644 index a7757867..0000000 --- a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_laptop_top_right.svg +++ /dev/null
@@ -1 +0,0 @@ -<svg width="520" height="320" fill="none" xmlns="http://www.w3.org/2000/svg"><path fill="#fff" d="M0 0h520v320H0z"/><g clip-path="url(#a)"><path d="M375.3 252.5H132.4c-6 0-10.8-4.9-10.8-10.8V76.1h264.6v165.5c0 6.1-4.9 10.9-10.9 10.9z" fill="#fff" stroke="#D2E3FC" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M104.7 71.2h298.4c2.4 0 4.3 1.9 4.3 4.3v4.9c0 1.2-1 2.2-2.2 2.2H102.5c-1.2 0-2.2-1-2.2-2.2v-4.9c.1-2.3 2-4.3 4.4-4.3z" fill="#fff" stroke="#D2E3FC" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M215.1 181.1h77.6c2.3 0 4.1 1.8 4.1 4.1v48.6c0 2.3-1.8 4.1-4.1 4.1h-77.6c-2.3 0-4.1-1.8-4.1-4.1v-48.6c0-2.3 1.8-4.1 4.1-4.1zm155.1-13.5H138c-.9 0-1.7-.8-1.7-1.7V97c0-.9.8-1.7 1.7-1.7h232.2c.9 0 1.7.8 1.7 1.7v68.9c0 .9-.8 1.7-1.7 1.7z" fill="#D2E3FC"/><path d="M369 104.5h-16.8c-1.7 0-3-1.4-3-3v-3.1c0-1.7 1.4-3 3-3H369c1.7 0 3 1.4 3 3v3.1c.1 1.6-1.3 3-3 3z" fill="#255FDB"/><path d="M447.4 102.6a5 5 0 1 0 0-10 5 5 0 0 0 0 10z" fill="#D2E3FC"/><path d="M361.7 127c14.746 0 26.7-11.954 26.7-26.7 0-14.746-11.954-26.7-26.7-26.7-14.746 0-26.7 11.954-26.7 26.7 0 14.746 11.954 26.7 26.7 26.7z" stroke="#34A853" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M361.7 144.8c24.577 0 44.5-19.923 44.5-44.5s-19.923-44.5-44.5-44.5c-24.576 0-44.5 19.923-44.5 44.5s19.924 44.5 44.5 44.5z" stroke="#FBBC05" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M387 239.1c-7.3-8.2-15.1-17.1-17.5-28.1-2.9-13.3 4.7-23.4 10.1-34.8-7-19.7-15-41.3-18.7-55.1-1.2-4.4-3.9-15.7 4.7-18.7 6-2 10.9 2.9 12.6 6.5 3.2 7.1 7.7 21.2 10.9 29.9 2.7 7.5 2.6 6.5 2.6 6.5 6.3-1.3 13.4-2.5 18.7 1.1 5.1 3.5 6.7 5 6.7 5 3.2-.5 6.4-1.9 9.6-1.5 4.4.6 7.6 4.3 9.6 8.2l.3.6.7-.2c4.2-.8 9.1-1.8 13.2-.3 3.9 1.4 6.9 5.1 8.8 8.6 5.8 10.4 9.8 22.6 13.2 33.9 3.7 12.2 6 25.1 4.2 37.9" fill="#fff"/><path d="M65 123.6c1.4 5.4-.7 11.2-5.6 14.4l-26.6 17c-6.1 3.9-14.3 2.2-18.2-4-.8-1.2-1.3-2.5-1.7-3.8-1.4-5.3.7-11.2 5.6-14.3l26.6-17.1c6.1-3.9 14.3-2.2 18.2 4 .8 1.1 1.3 2.4 1.7 3.8z" fill="#fff" stroke="#E6E7EA" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><mask id="b" maskUnits="userSpaceOnUse" x="136" y="95" width="236" height="73"><path d="M370.2 167.6H138c-.9 0-1.7-.8-1.7-1.7V97c0-.9.8-1.7 1.7-1.7h232.2c.9 0 1.7.8 1.7 1.7v68.9c0 .9-.8 1.7-1.7 1.7z" fill="#D2E3FC"/></mask><g mask="url(#b)" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"><path d="M361.7 127c14.746 0 26.7-11.954 26.7-26.7 0-14.746-11.954-26.7-26.7-26.7-14.746 0-26.7 11.954-26.7 26.7 0 14.746 11.954 26.7 26.7 26.7z" stroke="#4285F4"/><path d="M361.7 144.8c24.577 0 44.5-19.923 44.5-44.5s-19.923-44.5-44.5-44.5c-24.576 0-44.5 19.923-44.5 44.5s19.924 44.5 44.5 44.5z" stroke="#fff"/></g><path d="M472.5 61c-7.9 0-14.3-6.4-14.3-14.3s6.4-14.3 14.3-14.3 14.3 6.4 14.3 14.3S480.4 61 472.5 61z" fill="#fff" stroke="#5EF1F2" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M390.4 209.1c-5.7-21.5-23.3-65.4-29.5-88.1-1.2-4.4-3.9-15.7 4.7-18.7 6-2 10.9 2.9 12.6 6.6 3.2 7.1 7.7 21.2 10.9 29.9 2.9 7.9 9.3 24.2 12.3 32" fill="#fff"/><path d="M390.4 209.1c-5.7-21.5-23.3-65.4-29.5-88.1-1.2-4.4-3.9-15.7 4.7-18.7 6-2 10.9 2.9 12.6 6.6 3.2 7.1 7.7 21.2 10.9 29.9 2.9 7.9 9.3 24.2 12.3 32" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M391.7 145.4c6.3-1.3 13.4-2.5 18.7 1.1 7.3 4.9 11.8 16 14.8 25.1m-8-20.1c3.2-.5 6.3-1.9 9.6-1.5 4.4.6 7.6 4.3 9.6 8.3 2 4 3.2 9.5 5.7 15.2m-62.5 2.7c-5.5 11.4-13.5 21.7-10.1 34.8 5 19.7 11.8 27.8 28.2 44.4m39.6-96.8c4.2-.8 9-1.8 13.2-.3 3.9 1.4 6.9 5.1 8.8 8.6 5.8 10.4 9.8 22.6 13.2 34 4.1 13.5 6.5 26 10.3 41.2" stroke="#4285F4" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/><path d="M375.1 112.5c-.8-2.3-2.2-4.7-4.6-5.3-2.4-.6-4.9 1.2-5.8 3.5-.9 2.3-.3 5 1 7.1 1.8 3 5.2 5.2 8.5 3.3 3.1-1.9 1.9-5.8.9-8.6z" stroke="#D2E3FC" stroke-width="3" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/></g><defs><clipPath id="a"><path fill="#fff" transform="translate(11 31)" d="M0 0h477.3v225.9H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet.json deleted file mode 100644 index 241cf3a..0000000 --- a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet.json +++ /dev/null
@@ -1 +0,0 @@ -{"v":"5.7.6","fr":30,"ip":0,"op":97,"w":440,"h":360,"nm":"4_Fingerprint-Scan_a_v2 - 440x360","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Master Scale Null","sr":1,"ks":{"o":{"a":0,"k":0,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220,180,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[85,85,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":202,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"yellow circle 2","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39.6,"s":[30],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75.6,"s":[100],"e":[0]},{"t":82.8001953125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-57.338,-66.92,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.085,-50.875],[-88.829,-50.875],[-88.79,21.518],[5.125,21.518]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":39.6,"s":[{"i":[[7.5,0],[0,0],[0,7.5],[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0]],"o":[[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0],[7.5,0],[0,0],[0,7.5]],"v":[[-57.338,-53.34],[-57.338,-53.34],[-70.918,-66.92],[-70.918,-66.92],[-57.338,-80.5],[-57.338,-80.5],[-43.758,-66.92],[-43.758,-66.92]],"c":true}],"e":[{"i":[[34.148,0],[0,0],[0,34.148],[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0]],"o":[[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0],[34.148,0],[0,0],[0,34.148]],"v":[[-57.338,-5.09],[-57.338,-5.09],[-119.168,-66.92],[-119.168,-66.92],[-57.338,-128.75],[-57.338,-128.75],[4.492,-66.92],[4.492,-66.92]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":54,"s":[{"i":[[34.148,0],[0,0],[0,34.148],[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0]],"o":[[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0],[34.148,0],[0,0],[0,34.148]],"v":[[-57.338,-5.09],[-57.338,-5.09],[-119.168,-66.92],[-119.168,-66.92],[-57.338,-128.75],[-57.338,-128.75],[4.492,-66.92],[4.492,-66.92]],"c":true}],"e":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}],"e":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":75.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}],"e":[{"i":[[36.361,0],[0,0],[0,36.361],[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0]],"o":[[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0],[36.361,0],[0,0],[0,36.361]],"v":[[-57.338,-1.082],[-57.338,-1.082],[-123.177,-66.92],[-123.177,-66.92],[-57.338,-132.758],[-57.338,-132.758],[8.5,-66.92],[8.5,-66.92]],"c":true}]},{"t":82.8001953125}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":39.6,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"green circle 2","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.001,"s":[30],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44.4,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.8,"s":[100],"e":[0]},{"t":85.20078125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-57.338,-66.92,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"hasMask":true,"masksProperties":[{"inv":false,"mode":"a","pt":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[5.085,-50.875],[-88.829,-50.875],[-88.79,21.518],[5.125,21.518]],"c":true},"ix":1},"o":{"a":0,"k":100,"ix":3},"x":{"a":0,"k":0,"ix":4},"nm":"Mask 1"}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":42.001,"s":[{"i":[[0,-7.362],[7.362,0],[0,7.362],[-7.362,0]],"o":[[0,7.362],[-7.362,0],[0,-7.362],[7.362,0]],"v":[[-44.008,-66.92],[-57.338,-53.59],[-70.668,-66.92],[-57.338,-80.25]],"c":true}],"e":[{"i":[[0,-23.654],[23.654,0],[0,23.654],[-23.654,0]],"o":[[0,23.654],[-23.654,0],[0,-23.654],[23.654,0]],"v":[[-14.508,-66.92],[-57.338,-24.09],[-100.168,-66.92],[-57.338,-109.75]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.522,"y":0.153},"t":56.4,"s":[{"i":[[0,-23.654],[23.654,0],[0,23.654],[-23.654,0]],"o":[[0,23.654],[-23.654,0],[0,-23.654],[23.654,0]],"v":[[-14.508,-66.92],[-57.338,-24.09],[-100.168,-66.92],[-57.338,-109.75]],"c":true}],"e":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":66.001,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}],"e":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":76.8,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}],"e":[{"i":[[0,-22.554],[22.554,0],[0,22.554],[-22.554,0]],"o":[[0,22.554],[-22.554,0],[0,-22.554],[22.554,0]],"v":[[-16.5,-66.92],[-57.338,-26.082],[-98.177,-66.92],[-57.338,-107.758]],"c":true}]},{"t":85.20078125}],"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":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":202.8,"st":42.4,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":" 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-61.971,-57.428,0],"ix":2,"l":2},"a":{"a":0,"k":[-61.971,-57.428,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":40.8,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":45.6,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67.2,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}],"e":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]},{"t":72}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40.8,"s":[0.258823543787,0.521568655968,0.956862807274,1],"e":[0.145098045468,0.372549027205,0.858823537827,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.3,"s":[0.145098045468,0.372549027205,0.858823537827,1],"e":[0.145098045468,0.372549027205,0.858823537827,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67.2,"s":[0.145098045468,0.372549027205,0.858823537827,1],"e":[0.258823543787,0.521568655968,0.956862807274,1]},{"t":68.7001953125}],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"screen device","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[35.772,28.054,0],"ix":2,"l":2},"a":{"a":0,"k":[35.772,28.054,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.3,0],[0,0],[0,1.3],[0,0],[-1.3,0],[0,0],[0,-1.3],[0,0]],"o":[[0,0],[-1.3,0],[0,0],[0,-1.3],[0,0],[1.3,0],[0,0],[0,1.3]],"v":[[158,106.705],[-86.455,106.705],[-88.809,104.352],[-88.809,-48.245],[-86.455,-50.598],[158,-50.598],[160.354,-48.245],[160.354,104.352]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"bg device","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[35.772,29.608,0],"ix":2,"l":2},"a":{"a":0,"k":[35.772,29.608,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[141.735,116.644],[151.813,116.644]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":3,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[100.301,116.644],[123.817,116.644]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":3,"lj":2,"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.924],[0,0],[1.924,0],[0,0],[0,1.924],[0,0],[-1.924,0],[0,0]],"o":[[0,0],[1.924,0],[0,0],[0,1.924],[0,0],[-1.924,0],[0,0],[0,-1.924],[0,0],[0,0]],"v":[[-50.378,-57.428],[163.804,-57.428],[167.287,-53.944],[167.287,110.051],[163.804,113.535],[-92.259,113.535],[-95.742,110.051],[-95.742,-53.944],[-92.259,-57.428],[-73.565,-57.428]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"hand","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.423],"y":[0.812]},"o":{"x":[0.355],"y":[0]},"t":2.4,"s":[0],"e":[-9.213]},{"i":{"x":[0.526],"y":[1]},"o":{"x":[0.762],"y":[-0.379]},"t":19.2,"s":[-9.213],"e":[0]},{"t":40.7998046875}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[0.956]},"o":{"x":[0.425],"y":[0]},"t":0,"s":[-228.27],"e":[-247.27]},{"i":{"x":[0.665],"y":[-0.405]},"o":{"x":[0.331],"y":[0.116]},"t":17,"s":[-247.27],"e":[-245.421]},{"i":{"x":[0.684],"y":[1]},"o":{"x":[0.339],"y":[0.189]},"t":25.5,"s":[-245.421],"e":[-228.27]},{"t":36}],"ix":3},"y":{"a":0,"k":-9.789,"ix":4}},"a":{"a":0,"k":[-228.27,-9.789,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":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}],"e":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.534,-1.964],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.701,-95.961],[-153.322,-96.299],[-173.801,-86.147],[-180.008,-81.51]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.04},"t":17,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.534,-1.964],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.701,-95.961],[-153.322,-96.299],[-173.801,-86.147],[-180.008,-81.51]],"c":false}],"e":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.473,-2.087],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.949,-95.921],[-153.584,-96.392],[-173.956,-86.207],[-180.162,-81.57]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.473,-2.087],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.949,-95.921],[-153.584,-96.392],[-173.956,-86.207],[-180.162,-81.57]],"c":false}],"e":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}],"e":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}],"e":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}],"e":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"t":78.599609375}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}],"e":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-6.97,-1.916]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-162.422,-76.533],[-136.651,-94.438],[-112.446,-98.822],[-92.574,-96.053]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-6.97,-1.916]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-162.422,-76.533],[-136.651,-94.438],[-112.446,-98.822],[-92.574,-96.053]],"c":false}],"e":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-3.679,-1.02]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.071,-76.783],[-137.034,-94.782],[-113.379,-99.531],[-96.701,-97.703]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-3.679,-1.02]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.071,-76.783],[-137.034,-94.782],[-113.379,-99.531],[-96.701,-97.703]],"c":false}],"e":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-2.508,-0.701]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.302,-76.872],[-137.17,-94.904],[-113.71,-99.783],[-98.17,-98.29]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-2.508,-0.701]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.302,-76.872],[-137.17,-94.904],[-113.71,-99.783],[-98.17,-98.29]],"c":false}],"e":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}],"e":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}],"e":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}],"e":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]},{"t":78.599609375}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}],"e":[{"i":[[0,0],[-7.629,5.615],[-10.948,2.568],[-8.802,3.104],[-0.571,6.235],[6.488,-1.036],[0.965,-0.089],[3.94,0.067],[8.338,-2.119],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.983,-2.107],[5.33,-1.88],[0.693,-7.559],[-0.957,0.153],[-3.925,0.36],[-8.511,-0.144],[-12.086,3.072],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-84.967,-72.976],[-60.987,-77.685],[-49.191,-89.297],[-62.804,-96.899],[-67.418,-96.349],[-79.202,-95.975],[-101.008,-94.751],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-7.629,5.615],[-10.948,2.568],[-8.802,3.104],[-0.571,6.235],[6.488,-1.036],[0.965,-0.089],[3.94,0.067],[8.338,-2.119],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.983,-2.107],[5.33,-1.88],[0.693,-7.559],[-0.957,0.153],[-3.925,0.36],[-8.511,-0.144],[-12.086,3.072],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-84.967,-72.976],[-60.987,-77.685],[-49.191,-89.297],[-62.804,-96.899],[-67.418,-96.349],[-79.202,-95.975],[-101.008,-94.751],[-126.922,-84.962],[-148.303,-70.778]],"c":false}],"e":[{"i":[[0,0],[-7.629,5.615],[-9.813,5],[-7.646,5.008],[0.913,6.063],[5.929,-2.501],[0.898,-0.31],[3.691,-1.054],[8.04,-2.645],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.052,-4.103],[4.631,-3.033],[-1.107,-7.351],[-0.875,0.369],[-3.649,1.26],[-5.12,1.126],[-10.525,3.431],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-82.719,-77.479],[-61.012,-87.559],[-52.506,-101.359],[-67.23,-105.409],[-71.489,-103.808],[-82.61,-100.699],[-100.013,-96.669],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-7.629,5.615],[-9.813,5],[-7.646,5.008],[0.913,6.063],[5.929,-2.501],[0.898,-0.31],[3.691,-1.054],[8.04,-2.645],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.052,-4.103],[4.631,-3.033],[-1.107,-7.351],[-0.875,0.369],[-3.649,1.26],[-5.12,1.126],[-10.525,3.431],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-82.719,-77.479],[-61.012,-87.559],[-52.506,-101.359],[-67.23,-105.409],[-71.489,-103.808],[-82.61,-100.699],[-100.013,-96.669],[-126.922,-84.962],[-148.303,-70.778]],"c":false}],"e":[{"i":[[0,0],[-7.629,5.615],[-9.409,5.866],[-7.235,5.686],[1.441,6.002],[5.73,-3.022],[0.873,-0.389],[3.603,-1.453],[7.933,-2.832],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[7.72,-4.813],[4.382,-3.443],[-1.748,-7.277],[-0.845,0.446],[-3.551,1.58],[-3.914,1.578],[-9.969,3.559],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-81.92,-79.08],[-61.021,-91.072],[-53.685,-105.651],[-68.804,-108.437],[-72.938,-106.462],[-83.822,-102.38],[-99.659,-97.351],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-7.629,5.615],[-9.409,5.866],[-7.235,5.686],[1.441,6.002],[5.73,-3.022],[0.873,-0.389],[3.603,-1.453],[7.933,-2.832],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[7.72,-4.813],[4.382,-3.443],[-1.748,-7.277],[-0.845,0.446],[-3.551,1.58],[-3.914,1.578],[-9.969,3.559],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-81.92,-79.08],[-61.021,-91.072],[-53.685,-105.651],[-68.804,-108.437],[-72.938,-106.462],[-83.822,-102.38],[-99.659,-97.351],[-126.922,-84.962],[-148.303,-70.778]],"c":false}],"e":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}],"e":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}],"e":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}],"e":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"t":78.599609375}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}],"e":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.73,-92.515],[-187.918,-89.019],[-211.307,-72.486],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.04},"t":17,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.73,-92.515],[-187.918,-89.019],[-211.307,-72.486],[-247.959,-48.075]],"c":false}],"e":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.885,-92.575],[-188.073,-89.078],[-211.462,-72.545],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.885,-92.575],[-188.073,-89.078],[-211.462,-72.545],[-247.959,-48.075]],"c":false}],"e":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}],"e":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]},{"t":78.599609375}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}],"e":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}],"e":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}],"e":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":43.2,"s":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}],"e":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":67,"s":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}],"e":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"t":82}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}],"e":[{"i":[[0,0],[-2.976,-1.495],[-2.285,1.448],[-0.019,2.544]],"o":[[1.07,2.889],[2.417,1.214],[2.443,-1.548],[0,0]],"v":[[-74.583,-94.759],[-68.715,-88.567],[-60.935,-88.821],[-56.412,-96.746]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-2.976,-1.495],[-2.285,1.448],[-0.019,2.544]],"o":[[1.07,2.889],[2.417,1.214],[2.443,-1.548],[0,0]],"v":[[-74.583,-94.759],[-68.715,-88.567],[-60.935,-88.821],[-56.412,-96.746]],"c":false}],"e":[{"i":[[0,0],[-3.18,-0.727],[-1.835,1.911],[0.576,2.424]],"o":[[1.693,2.497],[2.583,0.59],[1.962,-2.043],[0,0]],"v":[[-77.933,-100.623],[-70.904,-96.104],[-63.564,-98.163],[-61.114,-106.757]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-3.18,-0.727],[-1.835,1.911],[0.576,2.424]],"o":[[1.693,2.497],[2.583,0.59],[1.962,-2.043],[0,0]],"v":[[-77.933,-100.623],[-70.904,-96.104],[-63.564,-98.163],[-61.114,-106.757]],"c":false}],"e":[{"i":[[0,0],[-3.252,-0.453],[-1.675,2.076],[0.788,2.382]],"o":[[1.914,2.358],[2.642,0.368],[1.791,-2.219],[0,0]],"v":[[-79.124,-102.708],[-71.683,-98.785],[-64.5,-101.487],[-62.787,-110.319]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-3.252,-0.453],[-1.675,2.076],[0.788,2.382]],"o":[[1.914,2.358],[2.642,0.368],[1.791,-2.219],[0,0]],"v":[[-79.124,-102.708],[-71.683,-98.785],[-64.5,-101.487],[-62.787,-110.319]],"c":false}],"e":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}],"e":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}],"e":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}],"e":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]},{"t":78.599609375}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}],"e":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}],"e":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}],"e":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":43.2,"s":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}],"e":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":67,"s":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}],"e":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"t":82}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":5,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}],"e":[{"i":[[0.691,-7.553],[5.338,-1.881],[8.98,-2.101],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.25],[-7.449,-2.104],[0,0],[-7.567,-0.124],[-3.923,0.356],[-0.963,0.153]],"o":[[-0.571,6.239],[-8.8,3.101],[-10.958,2.564],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.171,-2.803],[7.77,-0.25],[0,0],[6.814,-1.357],[3.932,0.064],[0.963,-0.093],[6.484,-1.03]],"v":[[-49.187,-89.3],[-60.99,-77.677],[-84.962,-72.973],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.312,-72.485],[-187.922,-89.015],[-164.732,-92.515],[-164.722,-92.125],[-153.318,-96.299],[-134.454,-95.927],[-112.442,-98.822],[-92.576,-96.05],[-93.137,-95.716],[-79.196,-95.97],[-67.417,-96.342],[-62.802,-96.898]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0.691,-7.553],[5.338,-1.881],[8.98,-2.101],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.25],[-7.449,-2.104],[0,0],[-7.567,-0.124],[-3.923,0.356],[-0.963,0.153]],"o":[[-0.571,6.239],[-8.8,3.101],[-10.958,2.564],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.171,-2.803],[7.77,-0.25],[0,0],[6.814,-1.357],[3.932,0.064],[0.963,-0.093],[6.484,-1.03]],"v":[[-49.187,-89.3],[-60.99,-77.677],[-84.962,-72.973],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.312,-72.485],[-187.922,-89.015],[-164.732,-92.515],[-164.722,-92.125],[-153.318,-96.299],[-134.454,-95.927],[-112.442,-98.822],[-92.576,-96.05],[-93.137,-95.716],[-79.196,-95.97],[-67.417,-96.342],[-62.802,-96.898]],"c":true}],"e":[{"i":[[-1.107,-7.345],[4.638,-3.037],[8.05,-4.097],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.254],[-4.467,-0.966],[0,0],[-7.226,1.65],[-3.648,1.255],[-0.88,0.371]],"o":[[0.915,6.067],[-7.645,5.006],[-9.823,4.999],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.059,-3.106],[7.77,-0.25],[0,0],[6.337,-1.157],[3.755,-0.858],[0.894,-0.314],[5.926,-2.495]],"v":[[-52.503,-101.363],[-61.013,-87.552],[-82.714,-77.477],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.961,-72.735],[-188.571,-89.265],[-165.381,-92.765],[-165.371,-92.375],[-154.417,-96.689],[-135.578,-95.768],[-113.374,-99.532],[-96.703,-97.7],[-97.291,-97.435],[-82.602,-100.696],[-71.487,-103.802],[-67.227,-105.409]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[-1.107,-7.345],[4.638,-3.037],[8.05,-4.097],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.254],[-4.467,-0.966],[0,0],[-7.226,1.65],[-3.648,1.255],[-0.88,0.371]],"o":[[0.915,6.067],[-7.645,5.006],[-9.823,4.999],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.059,-3.106],[7.77,-0.25],[0,0],[6.337,-1.157],[3.755,-0.858],[0.894,-0.314],[5.926,-2.495]],"v":[[-52.503,-101.363],[-61.013,-87.552],[-82.714,-77.477],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.961,-72.735],[-188.571,-89.265],[-165.381,-92.765],[-165.371,-92.375],[-154.417,-96.689],[-135.578,-95.768],[-113.374,-99.532],[-96.703,-97.7],[-97.291,-97.435],[-82.602,-100.696],[-71.487,-103.802],[-67.227,-105.409]],"c":true}],"e":[{"i":[[-1.747,-7.271],[4.389,-3.448],[7.719,-4.807],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.255],[-3.406,-0.562],[0,0],[-7.104,2.281],[-3.55,1.575],[-0.851,0.448]],"o":[[1.443,6.006],[-7.234,5.683],[-9.419,5.865],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.02,-3.213],[7.77,-0.25],[0,0],[6.168,-1.086],[3.692,-1.185],[0.87,-0.392],[5.728,-3.016]],"v":[[-53.682,-105.655],[-61.021,-91.065],[-81.914,-79.079],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-212.192,-72.823],[-188.802,-89.353],[-165.612,-92.853],[-165.602,-92.464],[-154.808,-96.828],[-135.978,-95.711],[-113.706,-99.784],[-98.171,-98.287],[-98.769,-98.046],[-83.814,-102.378],[-72.934,-106.456],[-68.801,-108.437]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[-1.747,-7.271],[4.389,-3.448],[7.719,-4.807],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.255],[-3.406,-0.562],[0,0],[-7.104,2.281],[-3.55,1.575],[-0.851,0.448]],"o":[[1.443,6.006],[-7.234,5.683],[-9.419,5.865],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.02,-3.213],[7.77,-0.25],[0,0],[6.168,-1.086],[3.692,-1.185],[0.87,-0.392],[5.728,-3.016]],"v":[[-53.682,-105.655],[-61.021,-91.065],[-81.914,-79.079],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-212.192,-72.823],[-188.802,-89.353],[-165.612,-92.853],[-165.602,-92.464],[-154.808,-96.828],[-135.978,-95.711],[-113.706,-99.784],[-98.171,-98.287],[-98.769,-98.046],[-83.814,-102.378],[-72.934,-106.456],[-68.801,-108.437]],"c":true}],"e":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}],"e":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}],"e":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}],"e":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]},{"t":82}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"yellow circle","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39.6,"s":[30],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75.6,"s":[100],"e":[0]},{"t":82.8001953125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-57.338,-66.92,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,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":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":39.6,"s":[{"i":[[7.5,0],[0,0],[0,7.5],[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0]],"o":[[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0],[7.5,0],[0,0],[0,7.5]],"v":[[-57.338,-53.34],[-57.338,-53.34],[-70.918,-66.92],[-70.918,-66.92],[-57.338,-80.5],[-57.338,-80.5],[-43.758,-66.92],[-43.758,-66.92]],"c":true}],"e":[{"i":[[34.148,0],[0,0],[0,34.148],[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0]],"o":[[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0],[34.148,0],[0,0],[0,34.148]],"v":[[-57.338,-5.09],[-57.338,-5.09],[-119.168,-66.92],[-119.168,-66.92],[-57.338,-128.75],[-57.338,-128.75],[4.492,-66.92],[4.492,-66.92]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":54,"s":[{"i":[[34.148,0],[0,0],[0,34.148],[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0]],"o":[[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0],[34.148,0],[0,0],[0,34.148]],"v":[[-57.338,-5.09],[-57.338,-5.09],[-119.168,-66.92],[-119.168,-66.92],[-57.338,-128.75],[-57.338,-128.75],[4.492,-66.92],[4.492,-66.92]],"c":true}],"e":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}],"e":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":75.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}],"e":[{"i":[[36.361,0],[0,0],[0,36.361],[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0]],"o":[[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0],[36.361,0],[0,0],[0,36.361]],"v":[[-57.338,-1.082],[-57.338,-1.082],[-123.177,-66.92],[-123.177,-66.92],[-57.338,-132.758],[-57.338,-132.758],[8.5,-66.92],[8.5,-66.92]],"c":true}]},{"t":82.8001953125}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.984313726425,0.737254917622,0.019607843831,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":39.6,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"green circle","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.001,"s":[30],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44.4,"s":[100],"e":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.8,"s":[100],"e":[0]},{"t":85.20078125}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[-57.338,-66.92,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,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":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":42.001,"s":[{"i":[[0,-7.362],[7.362,0],[0,7.362],[-7.362,0]],"o":[[0,7.362],[-7.362,0],[0,-7.362],[7.362,0]],"v":[[-44.008,-66.92],[-57.338,-53.59],[-70.668,-66.92],[-57.338,-80.25]],"c":true}],"e":[{"i":[[0,-23.654],[23.654,0],[0,23.654],[-23.654,0]],"o":[[0,23.654],[-23.654,0],[0,-23.654],[23.654,0]],"v":[[-14.508,-66.92],[-57.338,-24.09],[-100.168,-66.92],[-57.338,-109.75]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.522,"y":0.153},"t":56.4,"s":[{"i":[[0,-23.654],[23.654,0],[0,23.654],[-23.654,0]],"o":[[0,23.654],[-23.654,0],[0,-23.654],[23.654,0]],"v":[[-14.508,-66.92],[-57.338,-24.09],[-100.168,-66.92],[-57.338,-109.75]],"c":true}],"e":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":66.001,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}],"e":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":76.8,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}],"e":[{"i":[[0,-22.554],[22.554,0],[0,22.554],[-22.554,0]],"o":[[0,22.554],[-22.554,0],[0,-22.554],[22.554,0]],"v":[[-16.5,-66.92],[-57.338,-26.082],[-98.177,-66.92],[-57.338,-107.758]],"c":true}]},{"t":85.20078125}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":202.8,"st":42.4,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"Group 1","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.684],"y":[0.935]},"o":{"x":[0.75],"y":[0]},"t":0,"s":[-25],"e":[-13.097]},{"i":{"x":[0.399],"y":[1.043]},"o":{"x":[0.486],"y":[-0.011]},"t":37,"s":[-13.097],"e":[-66.007]},{"i":{"x":[0.506],"y":[1]},"o":{"x":[0.583],"y":[0.042]},"t":67,"s":[-66.007],"e":[-25]},{"t":96.000390625}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.147]},"t":-5,"s":[227.598],"e":[208.098]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":20,"s":[208.098],"e":[208.098]},{"i":{"x":[0.506],"y":[0.953]},"o":{"x":[0.52],"y":[0]},"t":40,"s":[208.098],"e":[230.598]},{"i":{"x":[0.598],"y":[0.722]},"o":{"x":[0.655],"y":[-0.268]},"t":62,"s":[230.598],"e":[225.848]},{"i":{"x":[0.466],"y":[-0.143]},"o":{"x":[0.347],"y":[-0.682]},"t":78,"s":[225.848],"e":[227.598]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.147]},"t":92,"s":[227.598],"e":[208.098]},{"t":117.000390625}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.131]},"t":-5,"s":[-56.528],"e":[-45.528]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":20,"s":[-45.528],"e":[-45.528]},{"i":{"x":[0.506],"y":[0.958]},"o":{"x":[0.52],"y":[0]},"t":40,"s":[-45.528],"e":[-58.028]},{"i":{"x":[0.598],"y":[0.789]},"o":{"x":[0.655],"y":[-0.204]},"t":62,"s":[-58.028],"e":[-55.528]},{"i":{"x":[0.466],"y":[0.333]},"o":{"x":[0.347],"y":[-0.398]},"t":78,"s":[-55.528],"e":[-56.528]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.131]},"t":92,"s":[-56.528],"e":[-45.528]},{"t":117.000390625}],"ix":4}},"a":{"a":0,"k":[230.598,-58.028,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.412,-1.355],[4.917,-3.475],[0,0],[4.328,6.139],[0.414,1.363],[-4.909,3.473],[0,0],[-4.336,-6.136]],"o":[[1.66,5.461],[0,0],[-6.131,4.326],[-0.861,-1.219],[-1.658,-5.453],[0,0],[6.138,-4.328],[0.861,1.219]],"v":[[256.938,-71.394],[251.766,-56.325],[225.114,-37.506],[206.164,-40.775],[204.257,-44.671],[209.423,-59.73],[236.075,-78.549],[255.033,-75.283]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.901960790157,0.905882358551,0.917647063732,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":31.6,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":"Group 2","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0],"e":[360]},{"t":90.000390625}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[235.468],"e":[205.468]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[205.468],"e":[205.468]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[205.468],"e":[235.468]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[235.468],"e":[230.468]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[230.468],"e":[235.468]},{"t":96.000390625}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[45.039],"e":[40.039]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[40.039],"e":[40.039]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[40.039],"e":[45.039]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[45.039],"e":[44.539]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[44.539],"e":[45.039]},{"t":96.000390625}],"ix":4}},"a":{"a":0,"k":[230.468,35.039,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[230.598,47.916],[230.598,47.916],[216.331,33.649],[216.331,33.649],[230.598,19.382],[230.598,19.382],[244.865,33.649],[244.865,33.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0.368627458811,0.945098042488,0.949019610882,1],"e":[0.901960849762,0.901960849762,0.901960849762,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[0.901960849762,0.901960849762,0.901960849762,1],"e":[0.901960849762,0.901960849762,0.901960849762,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0.901960849762,0.901960849762,0.901960849762,1],"e":[0.368627458811,0.945098042488,0.949019610882,1]},{"t":47.000390625}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":"Group 3","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[360],"e":[0]},{"t":96.000390625}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.075]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[-116.291],"e":[-137.791]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.076]},"t":66,"s":[-137.791],"e":[-116.291]},{"t":96.000390625}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.048]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[30.32],"e":[49.32]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.059]},"t":66,"s":[49.32],"e":[30.32]},{"t":96.000390625}],"ix":4}},"a":{"a":0,"k":[-147.791,51.82,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.306],[4.306,0],[0,4.306],[-4.306,0]],"o":[[0,4.306],[-4.306,0],[0,-4.306],[4.306,0]],"v":[[-138.993,50.32],[-146.791,58.117],[-154.588,50.32],[-146.791,42.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0.901960849762,0.901960849762,0.901960849762,1],"e":[1,0.729411780834,0,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[1,0.729411780834,0,1],"e":[1,0.729411780834,0,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[1,0.729411780834,0,1],"e":[0.901960849762,0.901960849762,0.901960849762,1]},{"t":90.000390625}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"Group 4","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0],"e":[360]},{"t":96.000390625}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.901]},"o":{"x":[0.756],"y":[-0.155]},"t":-26,"s":[214.367],"e":[214.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[214.367],"e":[194.367]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[194.367],"e":[194.367]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[194.367],"e":[214.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[214.367],"e":[194.367]},{"t":111.000390625}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.985]},"o":{"x":[0.756],"y":[-0.023]},"t":-26,"s":[3],"e":[3]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[3],"e":[0]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[0],"e":[0]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[0],"e":[3]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[3],"e":[0]},{"t":111.000390625}],"ix":4}},"a":{"a":0,"k":[194.367,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.576,0.576],[0,0],[-0.576,0.576],[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0]],"o":[[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0],[0.576,0.576],[0,0],[-0.576,0.576]],"v":[[193.325,4.201],[190.166,1.042],[190.166,-1.042],[193.325,-4.201],[195.41,-4.201],[198.568,-1.042],[198.568,1.042],[195.41,4.201]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0.901960849762,0.901960849762,0.901960849762,1],"e":[0.203921571374,0.658823549747,0.32549020648,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[0.203921571374,0.658823549747,0.32549020648,1],"e":[0.203921571374,0.658823549747,0.32549020648,1]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[0.203921571374,0.658823549747,0.32549020648,1],"e":[0.901960849762,0.901960849762,0.901960849762,1]},{"t":95.000390625}],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":20,"ty":1,"nm":"Bkrnd","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[220,180,0],"ix":2,"l":2},"a":{"a":0,"k":[220,180,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":440,"sh":360,"sc":"#ffffff","ip":0,"op":202,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet_dark.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet_dark.json new file mode 100644 index 0000000..bd7bb4b --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet_dark.json
@@ -0,0 +1 @@ +{"v":"5.9.2","fr":30,"ip":0,"op":97,"w":600,"h":296,"nm":"DM_fingerprint_2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.423],"y":[0.812]},"o":{"x":[0.355],"y":[0]},"t":2.4,"s":[0]},{"i":{"x":[0.526],"y":[1]},"o":{"x":[0.762],"y":[-0.379]},"t":19.2,"s":[-9.213]},{"t":40.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[0.956]},"o":{"x":[0.425],"y":[0]},"t":0,"s":[71.73]},{"i":{"x":[0.665],"y":[-0.405]},"o":{"x":[0.331],"y":[0.116]},"t":17,"s":[52.73]},{"i":{"x":[0.684],"y":[1]},"o":{"x":[0.339],"y":[0.189]},"t":25.5,"s":[54.579]},{"t":36,"s":[71.73]}],"ix":3},"y":{"a":0,"k":138.211,"ix":4}},"a":{"a":0,"k":[-228.27,-9.789,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":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.04},"t":17,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.534,-1.964],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.701,-95.961],[-153.322,-96.299],[-173.801,-86.147],[-180.008,-81.51]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.473,-2.087],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.949,-95.921],[-153.584,-96.392],[-173.956,-86.207],[-180.162,-81.57]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-6.97,-1.916]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-162.422,-76.533],[-136.651,-94.438],[-112.446,-98.822],[-92.574,-96.053]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-3.679,-1.02]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.071,-76.783],[-137.034,-94.782],[-113.379,-99.531],[-96.701,-97.703]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-2.508,-0.701]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.302,-76.872],[-137.17,-94.904],[-113.71,-99.783],[-98.17,-98.29]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-7.629,5.615],[-10.948,2.568],[-8.802,3.104],[-0.571,6.235],[6.488,-1.036],[0.965,-0.089],[3.94,0.067],[8.338,-2.119],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.983,-2.107],[5.33,-1.88],[0.693,-7.559],[-0.957,0.153],[-3.925,0.36],[-8.511,-0.144],[-12.086,3.072],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-84.967,-72.976],[-60.987,-77.685],[-49.191,-89.297],[-62.804,-96.899],[-67.418,-96.349],[-79.202,-95.975],[-101.008,-94.751],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-7.629,5.615],[-9.813,5],[-7.646,5.008],[0.913,6.063],[5.929,-2.501],[0.898,-0.31],[3.691,-1.054],[8.04,-2.645],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.052,-4.103],[4.631,-3.033],[-1.107,-7.351],[-0.875,0.369],[-3.649,1.26],[-5.12,1.126],[-10.525,3.431],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-82.719,-77.479],[-61.012,-87.559],[-52.506,-101.359],[-67.23,-105.409],[-71.489,-103.808],[-82.61,-100.699],[-100.013,-96.669],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-7.629,5.615],[-9.409,5.866],[-7.235,5.686],[1.441,6.002],[5.73,-3.022],[0.873,-0.389],[3.603,-1.453],[7.933,-2.832],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[7.72,-4.813],[4.382,-3.443],[-1.748,-7.277],[-0.845,0.446],[-3.551,1.58],[-3.914,1.578],[-9.969,3.559],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-81.92,-79.08],[-61.021,-91.072],[-53.685,-105.651],[-68.804,-108.437],[-72.938,-106.462],[-83.822,-102.38],[-99.659,-97.351],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.04},"t":17,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.73,-92.515],[-187.918,-89.019],[-211.307,-72.486],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.885,-92.575],[-188.073,-89.078],[-211.462,-72.545],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":43.2,"s":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":67,"s":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"t":82,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-2.976,-1.495],[-2.285,1.448],[-0.019,2.544]],"o":[[1.07,2.889],[2.417,1.214],[2.443,-1.548],[0,0]],"v":[[-74.583,-94.759],[-68.715,-88.567],[-60.935,-88.821],[-56.412,-96.746]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-3.18,-0.727],[-1.835,1.911],[0.576,2.424]],"o":[[1.693,2.497],[2.583,0.59],[1.962,-2.043],[0,0]],"v":[[-77.933,-100.623],[-70.904,-96.104],[-63.564,-98.163],[-61.114,-106.757]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-3.252,-0.453],[-1.675,2.076],[0.788,2.382]],"o":[[1.914,2.358],[2.642,0.368],[1.791,-2.219],[0,0]],"v":[[-79.124,-102.708],[-71.683,-98.785],[-64.5,-101.487],[-62.787,-110.319]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":43.2,"s":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":67,"s":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}]},{"t":82,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":5,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0.691,-7.553],[5.338,-1.881],[8.98,-2.101],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.25],[-7.449,-2.104],[0,0],[-7.567,-0.124],[-3.923,0.356],[-0.963,0.153]],"o":[[-0.571,6.239],[-8.8,3.101],[-10.958,2.564],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.171,-2.803],[7.77,-0.25],[0,0],[6.814,-1.357],[3.932,0.064],[0.963,-0.093],[6.484,-1.03]],"v":[[-49.187,-89.3],[-60.99,-77.677],[-84.962,-72.973],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.312,-72.485],[-187.922,-89.015],[-164.732,-92.515],[-164.722,-92.125],[-153.318,-96.299],[-134.454,-95.927],[-112.442,-98.822],[-92.576,-96.05],[-93.137,-95.716],[-79.196,-95.97],[-67.417,-96.342],[-62.802,-96.898]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[-1.107,-7.345],[4.638,-3.037],[8.05,-4.097],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.254],[-4.467,-0.966],[0,0],[-7.226,1.65],[-3.648,1.255],[-0.88,0.371]],"o":[[0.915,6.067],[-7.645,5.006],[-9.823,4.999],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.059,-3.106],[7.77,-0.25],[0,0],[6.337,-1.157],[3.755,-0.858],[0.894,-0.314],[5.926,-2.495]],"v":[[-52.503,-101.363],[-61.013,-87.552],[-82.714,-77.477],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.961,-72.735],[-188.571,-89.265],[-165.381,-92.765],[-165.371,-92.375],[-154.417,-96.689],[-135.578,-95.768],[-113.374,-99.532],[-96.703,-97.7],[-97.291,-97.435],[-82.602,-100.696],[-71.487,-103.802],[-67.227,-105.409]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[-1.747,-7.271],[4.389,-3.448],[7.719,-4.807],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.255],[-3.406,-0.562],[0,0],[-7.104,2.281],[-3.55,1.575],[-0.851,0.448]],"o":[[1.443,6.006],[-7.234,5.683],[-9.419,5.865],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.02,-3.213],[7.77,-0.25],[0,0],[6.168,-1.086],[3.692,-1.185],[0.87,-0.392],[5.728,-3.016]],"v":[[-53.682,-105.655],[-61.021,-91.065],[-81.914,-79.079],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-212.192,-72.823],[-188.802,-89.353],[-165.612,-92.853],[-165.602,-92.464],[-154.808,-96.828],[-135.978,-95.711],[-113.706,-99.784],[-98.171,-98.287],[-98.769,-98.046],[-83.814,-102.378],[-72.934,-106.456],[-68.801,-108.437]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}]},{"t":82,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"yellow circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39.6,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75.6,"s":[100]},{"t":82.8001953125,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[242.662,81.08,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,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":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":39.6,"s":[{"i":[[7.5,0],[0,0],[0,7.5],[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0]],"o":[[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0],[7.5,0],[0,0],[0,7.5]],"v":[[-57.338,-53.34],[-57.338,-53.34],[-70.918,-66.92],[-70.918,-66.92],[-57.338,-80.5],[-57.338,-80.5],[-43.758,-66.92],[-43.758,-66.92]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":54,"s":[{"i":[[34.148,0],[0,0],[0,34.148],[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0]],"o":[[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0],[34.148,0],[0,0],[0,34.148]],"v":[[-57.338,-5.09],[-57.338,-5.09],[-119.168,-66.92],[-119.168,-66.92],[-57.338,-128.75],[-57.338,-128.75],[4.492,-66.92],[4.492,-66.92]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":75.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"t":82.8001953125,"s":[{"i":[[36.361,0],[0,0],[0,36.361],[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0]],"o":[[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0],[36.361,0],[0,0],[0,36.361]],"v":[[-57.338,-1.082],[-57.338,-1.082],[-123.177,-66.92],[-123.177,-66.92],[-57.338,-132.758],[-57.338,-132.758],[8.5,-66.92],[8.5,-66.92]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.9882352941176471,0.788235294117647,0.20392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color3","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":39.6,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"green circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.001,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44.4,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.8,"s":[100]},{"t":85.20078125,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[242.662,81.08,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,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":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":42.001,"s":[{"i":[[0,-7.362],[7.362,0],[0,7.362],[-7.362,0]],"o":[[0,7.362],[-7.362,0],[0,-7.362],[7.362,0]],"v":[[-44.008,-66.92],[-57.338,-53.59],[-70.668,-66.92],[-57.338,-80.25]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.522,"y":0.153},"t":56.4,"s":[{"i":[[0,-23.654],[23.654,0],[0,23.654],[-23.654,0]],"o":[[0,23.654],[-23.654,0],[0,-23.654],[23.654,0]],"v":[[-14.508,-66.92],[-57.338,-24.09],[-100.168,-66.92],[-57.338,-109.75]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":66.001,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":76.8,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"t":85.20078125,"s":[{"i":[[0,-22.554],[22.554,0],[0,22.554],[-22.554,0]],"o":[[0,22.554],[-22.554,0],[0,-22.554],[22.554,0]],"v":[[-16.5,-66.92],[-57.338,-26.082],[-98.177,-66.92],[-57.338,-107.758]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.3568627450980392,0.7254901960784313,0.4549019607843137,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":202.8,"st":42.4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Group 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.684],"y":[0.935]},"o":{"x":[0.75],"y":[0]},"t":0,"s":[-25]},{"i":{"x":[0.399],"y":[1.043]},"o":{"x":[0.486],"y":[-0.011]},"t":37,"s":[-13.097]},{"i":{"x":[0.506],"y":[1]},"o":{"x":[0.583],"y":[0.042]},"t":67,"s":[-66.007]},{"t":96.000390625,"s":[-25]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.147]},"t":-5,"s":[527.598]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":20,"s":[508.098]},{"i":{"x":[0.506],"y":[0.953]},"o":{"x":[0.52],"y":[0]},"t":40,"s":[508.098]},{"i":{"x":[0.598],"y":[0.722]},"o":{"x":[0.655],"y":[-0.268]},"t":62,"s":[530.598]},{"i":{"x":[0.466],"y":[-0.143]},"o":{"x":[0.347],"y":[-0.682]},"t":78,"s":[525.848]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.147]},"t":92,"s":[527.598]},{"t":117.000390625,"s":[508.098]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.131]},"t":-5,"s":[91.472]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":20,"s":[102.472]},{"i":{"x":[0.506],"y":[0.958]},"o":{"x":[0.52],"y":[0]},"t":40,"s":[102.472]},{"i":{"x":[0.598],"y":[0.789]},"o":{"x":[0.655],"y":[-0.204]},"t":62,"s":[89.972]},{"i":{"x":[0.466],"y":[0.333]},"o":{"x":[0.347],"y":[-0.398]},"t":78,"s":[92.472]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.131]},"t":92,"s":[91.472]},{"t":117.000390625,"s":[102.472]}],"ix":4}},"a":{"a":0,"k":[230.598,-58.028,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.412,-1.355],[4.917,-3.475],[0,0],[4.328,6.139],[0.414,1.363],[-4.909,3.473],[0,0],[-4.336,-6.136]],"o":[[1.66,5.461],[0,0],[-6.131,4.326],[-0.861,-1.219],[-1.658,-5.453],[0,0],[6.138,-4.328],[0.861,1.219]],"v":[[256.938,-71.394],[251.766,-56.325],[225.114,-37.506],[206.164,-40.775],[204.257,-44.671],[209.423,-59.73],[236.075,-78.549],[255.033,-75.283]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":31.6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"circle_grey","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"t":47.000390625,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":90.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[535.468]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[505.468]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[505.468]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[535.468]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[530.468]},{"t":96.000390625,"s":[535.468]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[193.039]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[188.039]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[188.039]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[193.039]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[192.539]},{"t":96.000390625,"s":[193.039]}],"ix":4}},"a":{"a":0,"k":[230.468,35.039,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[230.598,47.916],[230.598,47.916],[216.331,33.649],[216.331,33.649],[230.598,19.382],[230.598,19.382],[244.865,33.649],[244.865,33.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"circle_electric","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":90.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[535.468]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[505.468]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[505.468]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[535.468]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[530.468]},{"t":96.000390625,"s":[535.468]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[193.039]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[188.039]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[188.039]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[193.039]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[192.539]},{"t":96.000390625,"s":[193.039]}],"ix":4}},"a":{"a":0,"k":[230.468,35.039,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[230.598,47.916],[230.598,47.916],[216.331,33.649],[216.331,33.649],[230.598,19.382],[230.598,19.382],[244.865,33.649],[244.865,33.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3686274509803922,0.9450980392156862,0.9490196078431372,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":43,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"circle_cyan","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":90.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[535.468]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[505.468]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[505.468]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[535.468]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[530.468]},{"t":96.000390625,"s":[535.468]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[193.039]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[188.039]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[188.039]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[193.039]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[192.539]},{"t":96.000390625,"s":[193.039]}],"ix":4}},"a":{"a":0,"k":[230.468,35.039,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[230.598,47.916],[230.598,47.916],[216.331,33.649],[216.331,33.649],[230.598,19.382],[230.598,19.382],[244.865,33.649],[244.865,33.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3686274509803922,0.9450980392156862,0.9490196078431372,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":4,"st":39.6,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"circle_yellow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":90.000390625,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[360]},{"t":96.000390625,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.075]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[183.709]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.076]},"t":66,"s":[162.209]},{"t":96.000390625,"s":[183.709]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.048]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[178.32]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.059]},"t":66,"s":[197.32]},{"t":96.000390625,"s":[178.32]}],"ix":4}},"a":{"a":0,"k":[-147.791,51.82,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.306],[4.306,0],[0,4.306],[-4.306,0]],"o":[[0,4.306],[-4.306,0],[0,-4.306],[4.306,0]],"v":[[-138.993,50.32],[-146.791,58.117],[-154.588,50.32],[-146.791,42.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.9882352941176471,0.788235294117647,0.20392156862745098,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"circle_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[360]},{"t":96.000390625,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.075]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[183.709]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.076]},"t":66,"s":[162.209]},{"t":96.000390625,"s":[183.709]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.048]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[178.32]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.059]},"t":66,"s":[197.32]},{"t":96.000390625,"s":[178.32]}],"ix":4}},"a":{"a":0,"k":[-147.791,51.82,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.306],[4.306,0],[0,4.306],[-4.306,0]],"o":[[0,4.306],[-4.306,0],[0,-4.306],[4.306,0]],"v":[[-138.993,50.32],[-146.791,58.117],[-154.588,50.32],[-146.791,42.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"square_green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":95.000390625,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":96.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.901]},"o":{"x":[0.756],"y":[-0.155]},"t":-26,"s":[514.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[514.367]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[494.367]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[494.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[514.367]},{"t":111.000390625,"s":[494.367]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.985]},"o":{"x":[0.756],"y":[-0.023]},"t":-26,"s":[151]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[151]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[148]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[148]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[151]},{"t":111.000390625,"s":[148]}],"ix":4}},"a":{"a":0,"k":[194.367,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.576,0.576],[0,0],[-0.576,0.576],[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0]],"o":[[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0],[0.576,0.576],[0,0],[-0.576,0.576]],"v":[[193.325,4.201],[190.166,1.042],[190.166,-1.042],[193.325,-4.201],[195.41,-4.201],[198.568,-1.042],[198.568,1.042],[195.41,4.201]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.3568627450980392,0.7254901960784313,0.4549019607843137,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"square_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":96.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.901]},"o":{"x":[0.756],"y":[-0.155]},"t":-26,"s":[514.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[514.367]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[494.367]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[494.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[514.367]},{"t":111.000390625,"s":[494.367]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.985]},"o":{"x":[0.756],"y":[-0.023]},"t":-26,"s":[151]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[151]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[148]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[148]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[151]},{"t":111.000390625,"s":[148]}],"ix":4}},"a":{"a":0,"k":[194.367,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.576,0.576],[0,0],[-0.576,0.576],[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0]],"o":[[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0],[0.576,0.576],[0,0],[-0.576,0.576]],"v":[[193.325,4.201],[190.166,1.042],[190.166,-1.042],[193.325,-4.201],[195.41,-4.201],[198.568,-1.042],[198.568,1.042],[195.41,4.201]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.37254901960784315,0.38823529411764707,0.40784313725490196,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":" 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[238.029,90.572,0],"ix":2,"l":2},"a":{"a":0,"k":[-61.971,-57.428,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":40.8,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":45.6,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67.2,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"t":72,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":" 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[238.029,90.572,0],"ix":2,"l":2},"a":{"a":0,"k":[-61.971,-57.428,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":40.8,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":45.6,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67.2,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"t":72,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"screen device","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[335.772,176.054,0],"ix":2,"l":2},"a":{"a":0,"k":[35.772,28.054,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.3,0],[0,0],[0,1.3],[0,0],[-1.3,0],[0,0],[0,-1.3],[0,0]],"o":[[0,0],[-1.3,0],[0,0],[0,-1.3],[0,0],[1.3,0],[0,0],[0,1.3]],"v":[[158,106.705],[-86.455,106.705],[-88.809,104.352],[-88.809,-48.245],[-86.455,-50.598],[158,-50.598],[160.354,-48.245],[160.354,104.352]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.4,0.615686274509804,0.9647058823529412,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"bg device","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[335.772,177.608,0],"ix":2,"l":2},"a":{"a":0,"k":[35.772,29.608,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[141.735,116.644],[151.813,116.644]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":3,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[100.301,116.644],[123.817,116.644]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":3,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.924],[0,0],[1.924,0],[0,0],[0,1.924],[0,0],[-1.924,0],[0,0]],"o":[[0,0],[1.924,0],[0,0],[0,1.924],[0,0],[-1.924,0],[0,0],[0,-1.924],[0,0],[0,0]],"v":[[-50.378,-57.428],[163.804,-57.428],[167.287,-53.944],[167.287,110.051],[163.804,113.535],[-92.259,113.535],[-95.742,110.051],[-95.742,-53.944],[-92.259,-57.428],[-73.565,-57.428]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.2980392156862745,0.35294117647058826,0.4392156862745098,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.19607843137254902,0.2,0.21176470588235294,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet_light.json b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet_light.json new file mode 100644 index 0000000..3285540 --- /dev/null +++ b/chrome/browser/resources/chromeos/quick_unlock/fingerprint_tablet_light.json
@@ -0,0 +1 @@ +{"v":"5.9.2","fr":30,"ip":0,"op":97,"w":600,"h":296,"nm":"LM_fingerprint_2","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"hand","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.423],"y":[0.812]},"o":{"x":[0.355],"y":[0]},"t":2.4,"s":[0]},{"i":{"x":[0.526],"y":[1]},"o":{"x":[0.762],"y":[-0.379]},"t":19.2,"s":[-9.213]},{"t":40.7998046875,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.667],"y":[0.956]},"o":{"x":[0.425],"y":[0]},"t":0,"s":[71.73]},{"i":{"x":[0.665],"y":[-0.405]},"o":{"x":[0.331],"y":[0.116]},"t":17,"s":[52.73]},{"i":{"x":[0.684],"y":[1]},"o":{"x":[0.339],"y":[0.189]},"t":25.5,"s":[54.579]},{"t":36,"s":[71.73]}],"ix":3},"y":{"a":0,"k":138.211,"ix":4}},"a":{"a":0,"k":[-228.27,-9.789,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":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.04},"t":17,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.534,-1.964],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.701,-95.961],[-153.322,-96.299],[-173.801,-86.147],[-180.008,-81.51]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-6.473,-2.087],[-6.034,1.637],[0,0],[0,0]],"v":[[-134.949,-95.921],[-153.584,-96.392],[-173.956,-86.207],[-180.162,-81.57]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.285,-94.708],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[6.034,-1.637],[5.013,-3.682],[0,0]],"o":[[-5.769,-3.492],[-6.034,1.637],[0,0],[0,0]],"v":[[-137.785,-95.458],[-156.581,-97.455],[-175.725,-86.887],[-181.932,-82.25]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-6.97,-1.916]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-162.422,-76.533],[-136.651,-94.438],[-112.446,-98.822],[-92.574,-96.053]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-3.679,-1.02]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.071,-76.783],[-137.034,-94.782],[-113.379,-99.531],[-96.701,-97.703]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-2.508,-0.701]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-163.302,-76.872],[-137.17,-94.904],[-113.71,-99.783],[-98.17,-98.29]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.285,-94.708],[-114.711,-100.175],[-90.004,-89.807]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[-4.438,2.398],[-7.771,0.254],[-5.641,-5.574]],"o":[[8.184,-6.818],[6.84,-3.696],[7.771,-0.254],[0,0]],"v":[[-164.347,-77.273],[-137.785,-95.458],[-115.211,-100.925],[-90.754,-92.057]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-7.629,5.615],[-10.948,2.568],[-8.802,3.104],[-0.571,6.235],[6.488,-1.036],[0.965,-0.089],[3.94,0.067],[8.338,-2.119],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.983,-2.107],[5.33,-1.88],[0.693,-7.559],[-0.957,0.153],[-3.925,0.36],[-8.511,-0.144],[-12.086,3.072],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-84.967,-72.976],[-60.987,-77.685],[-49.191,-89.297],[-62.804,-96.899],[-67.418,-96.349],[-79.202,-95.975],[-101.008,-94.751],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-7.629,5.615],[-9.813,5],[-7.646,5.008],[0.913,6.063],[5.929,-2.501],[0.898,-0.31],[3.691,-1.054],[8.04,-2.645],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[8.052,-4.103],[4.631,-3.033],[-1.107,-7.351],[-0.875,0.369],[-3.649,1.26],[-5.12,1.126],[-10.525,3.431],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-82.719,-77.479],[-61.012,-87.559],[-52.506,-101.359],[-67.23,-105.409],[-71.489,-103.808],[-82.61,-100.699],[-100.013,-96.669],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-7.629,5.615],[-9.409,5.866],[-7.235,5.686],[1.441,6.002],[5.73,-3.022],[0.873,-0.389],[3.603,-1.453],[7.933,-2.832],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[7.72,-4.813],[4.382,-3.443],[-1.748,-7.277],[-0.845,0.446],[-3.551,1.58],[-3.914,1.578],[-9.969,3.559],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-81.92,-79.08],[-61.021,-91.072],[-53.685,-105.651],[-68.804,-108.437],[-72.938,-106.462],[-83.822,-102.38],[-99.659,-97.351],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-109.514,-59.635],[-84.41,-63.514],[-60.221,-60.036],[-45.251,-67.099],[-55.588,-78.772],[-60.125,-79.777],[-71.371,-83.317],[-92.356,-89.365],[-125.672,-83.712],[-147.053,-69.528]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[-7.629,5.615],[-11.182,-1.193],[-9.333,0.022],[-2.599,5.696],[6.466,1.166],[0.941,0.235],[3.696,1.365],[8.57,0.754],[11.151,-5.372],[5.599,-4.429]],"o":[[15.76,-14.563],[8.04,-5.911],[9.175,0.979],[5.652,-0.013],[3.151,-6.906],[-0.954,-0.172],[-3.824,-0.957],[-7.985,-2.948],[-12.422,-1.094],[-6.434,3.1],[0,0]],"v":[[-143.782,-31.147],[-110.764,-60.885],[-86.16,-66.389],[-61.971,-62.911],[-47.001,-69.974],[-57.338,-81.647],[-61.875,-82.652],[-73.121,-86.192],[-94.106,-92.24],[-126.922,-84.962],[-148.303,-70.778]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.04},"t":17,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.73,-92.515],[-187.918,-89.019],[-211.307,-72.486],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-164.885,-92.575],[-188.073,-89.078],[-211.462,-72.545],[-247.959,-48.075]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[6.647,-3.954],[7.595,-5.841],[18.025,-11.048]],"o":[[-7.351,-4.662],[-8.246,4.906],[-12.598,9.688],[0,0]],"v":[[-166.654,-93.255],[-189.843,-89.759],[-213.231,-73.226],[-247.959,-48.075]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":43.2,"s":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":67,"s":[{"i":[[0,0],[-29.877,20.946],[-4.364,3.085],[-2.91,3.941],[1.501,2.312],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.378,-3.069],[3.936,-2.782],[1.608,-2.177],[-7.365,-11.343],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-126.086,-11.941],[-113.553,-20.757],[-102.069,-30.082],[-101.045,-38.215],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]},{"t":82,"s":[{"i":[[0,0],[-28.816,22.384],[-4.016,3.526],[-2.48,4.225],[1.736,2.142],[11.096,-5.717],[6.457,-1.057]],"o":[[36.814,2.258],[4.223,-3.28],[3.622,-3.181],[1.37,-2.333],[-8.516,-10.507],[-10.624,5.474],[0,0]],"v":[[-228.453,21.119],[-125.924,-13.184],[-113.679,-23.538],[-103.239,-34.018],[-103.075,-42.213],[-139.345,-33.199],[-165.784,-25.955]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 3","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0,0],[-2.976,-1.495],[-2.285,1.448],[-0.019,2.544]],"o":[[1.07,2.889],[2.417,1.214],[2.443,-1.548],[0,0]],"v":[[-74.583,-94.759],[-68.715,-88.567],[-60.935,-88.821],[-56.412,-96.746]],"c":false}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[-3.18,-0.727],[-1.835,1.911],[0.576,2.424]],"o":[[1.693,2.497],[2.583,0.59],[1.962,-2.043],[0,0]],"v":[[-77.933,-100.623],[-70.904,-96.104],[-63.564,-98.163],[-61.114,-106.757]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[0,0],[-3.252,-0.453],[-1.675,2.076],[0.788,2.382]],"o":[[1.914,2.358],[2.642,0.368],[1.791,-2.219],[0,0]],"v":[[-79.124,-102.708],[-71.683,-98.785],[-64.5,-101.487],[-62.787,-110.319]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":66,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-67.413,-80.644],[-63.92,-72.86],[-56.493,-70.53],[-49.606,-76.515]],"c":false}]},{"t":78.599609375,"s":[{"i":[[0,0],[-2.315,-2.394],[-2.635,0.611],[-0.859,2.395]],"o":[[0.056,3.08],[1.88,1.945],[2.817,-0.654],[0,0]],"v":[[-69.163,-83.519],[-65.67,-75.735],[-58.243,-73.405],[-51.356,-79.39]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]},{"i":{"x":0.833,"y":1},"o":{"x":0.167,"y":0},"t":43.2,"s":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":67,"s":[{"i":[[0,0],[4.411,-1.857],[0.941,-1.272],[-1.593,-3.41]],"o":[[-4.023,-2.593],[-1.458,0.614],[-2.238,3.026],[0,0]],"v":[[-102.582,-30.795],[-116.274,-32.503],[-120.028,-29.693],[-120.119,-18.946]],"c":false}]},{"t":82,"s":[{"i":[[0,0],[4.191,-2.311],[0.802,-1.363],[-1.942,-3.224]],"o":[[-4.273,-2.156],[-1.385,0.764],[-1.908,3.244],[0,0]],"v":[[-103.823,-34.673],[-117.619,-34.933],[-121.057,-31.745],[-120.019,-21.047]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 5","np":2,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 3","np":5,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.667,"y":0.891},"o":{"x":0.66,"y":0},"t":4.8,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.333,"y":0.109},"t":17,"s":[{"i":[[0.691,-7.553],[5.338,-1.881],[8.98,-2.101],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.25],[-7.449,-2.104],[0,0],[-7.567,-0.124],[-3.923,0.356],[-0.963,0.153]],"o":[[-0.571,6.239],[-8.8,3.101],[-10.958,2.564],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.171,-2.803],[7.77,-0.25],[0,0],[6.814,-1.357],[3.932,0.064],[0.963,-0.093],[6.484,-1.03]],"v":[[-49.187,-89.3],[-60.99,-77.677],[-84.962,-72.973],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.312,-72.485],[-187.922,-89.015],[-164.732,-92.515],[-164.722,-92.125],[-153.318,-96.299],[-134.454,-95.927],[-112.442,-98.822],[-92.576,-96.05],[-93.137,-95.716],[-79.196,-95.97],[-67.417,-96.342],[-62.802,-96.898]],"c":true}]},{"i":{"x":0.34,"y":1},"o":{"x":0.167,"y":0.167},"t":25.5,"s":[{"i":[[-1.107,-7.345],[4.638,-3.037],[8.05,-4.097],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.254],[-4.467,-0.966],[0,0],[-7.226,1.65],[-3.648,1.255],[-0.88,0.371]],"o":[[0.915,6.067],[-7.645,5.006],[-9.823,4.999],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.059,-3.106],[7.77,-0.25],[0,0],[6.337,-1.157],[3.755,-0.858],[0.894,-0.314],[5.926,-2.495]],"v":[[-52.503,-101.363],[-61.013,-87.552],[-82.714,-77.477],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-211.961,-72.735],[-188.571,-89.265],[-165.381,-92.765],[-165.371,-92.375],[-154.417,-96.689],[-135.578,-95.768],[-113.374,-99.532],[-96.703,-97.7],[-97.291,-97.435],[-82.602,-100.696],[-71.487,-103.802],[-67.227,-105.409]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.66,"y":0},"t":29,"s":[{"i":[[-1.747,-7.271],[4.389,-3.448],[7.719,-4.807],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.255],[-3.406,-0.562],[0,0],[-7.104,2.281],[-3.55,1.575],[-0.851,0.448]],"o":[[1.443,6.006],[-7.234,5.683],[-9.419,5.865],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[7.02,-3.213],[7.77,-0.25],[0,0],[6.168,-1.086],[3.692,-1.185],[0.87,-0.392],[5.728,-3.016]],"v":[[-53.682,-105.655],[-61.021,-91.065],[-81.914,-79.079],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-212.192,-72.823],[-188.802,-89.353],[-165.612,-92.853],[-165.602,-92.464],[-154.808,-96.828],[-135.978,-95.711],[-113.706,-99.784],[-98.171,-98.287],[-98.769,-98.046],[-83.814,-102.378],[-72.934,-106.456],[-68.801,-108.437]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0.167},"t":36,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":43.2,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-7.351,-11.341],[1.607,-2.174],[3.934,-2.781],[4.376,-3.069],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.505,2.321],[-2.91,3.936],[-4.369,3.088],[-29.872,20.953],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-45.246,-67.1],[-60.226,-60.03],[-84.406,-63.51],[-109.516,-59.635],[-143.776,-31.155],[-139.346,-33.195],[-101.046,-38.217],[-102.067,-30.079],[-113.55,-20.754],[-126.088,-11.942],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.286,-94.705],[-114.706,-100.175],[-90.006,-89.805],[-90.646,-89.675],[-71.366,-83.31],[-60.126,-79.77],[-55.586,-78.77]],"c":true}]},{"t":82,"s":[{"i":[[3.15,-6.9],[5.66,-0.02],[9.17,0.98],[8.04,-5.91],[15.76,-14.56],[-1.5,0.77],[-8.51,-10.5],[1.37,-2.33],[3.62,-3.18],[4.22,-3.28],[36.82,2.25],[2.93,17.67],[-7.68,8.64],[-13.46,10.36],[-8.24,4.9],[-7.35,-4.66],[0,0],[-3.06,0.83],[-5.77,-3.49],[-7.78,0.26],[-5.64,-5.57],[0,0],[-7.1,-2.62],[-3.82,-0.96],[-0.96,-0.17]],"o":[[-2.6,5.7],[-9.33,0.02],[-11.19,-1.2],[-7.63,5.62],[1.45,-0.6],[11.1,-5.72],[1.74,2.15],[-2.48,4.22],[-4.02,3.53],[-28.81,22.39],[-15.79,-0.97],[-1.95,-11.76],[13.12,-14.77],[7.6,-5.84],[6.65,-3.96],[0,0],[3.44,-2.01],[6.03,-1.63],[6.84,-3.7],[7.77,-0.25],[0,0],[6.88,0.97],[3.69,1.36],[0.94,0.23],[6.46,1.17]],"v":[[-46.996,-69.975],[-61.976,-62.905],[-86.156,-66.385],[-110.766,-60.885],[-143.776,-31.155],[-139.346,-33.195],[-103.076,-42.215],[-103.236,-34.015],[-113.676,-23.535],[-125.926,-13.185],[-228.456,21.125],[-264.896,-3.615],[-254.176,-36.755],[-213.236,-73.225],[-189.846,-89.755],[-166.656,-93.255],[-166.646,-92.865],[-156.576,-97.455],[-137.786,-95.455],[-115.206,-100.925],[-90.756,-92.055],[-91.396,-91.925],[-73.116,-86.185],[-61.876,-82.645],[-57.336,-81.645]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 4","np":2,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"yellow circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":39.6,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":75.6,"s":[100]},{"t":82.8001953125,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[242.662,81.08,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,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":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":39.6,"s":[{"i":[[7.5,0],[0,0],[0,7.5],[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0]],"o":[[0,0],[-7.5,0],[0,0],[0,-7.5],[0,0],[7.5,0],[0,0],[0,7.5]],"v":[[-57.338,-53.34],[-57.338,-53.34],[-70.918,-66.92],[-70.918,-66.92],[-57.338,-80.5],[-57.338,-80.5],[-43.758,-66.92],[-43.758,-66.92]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.615,"y":0.187},"t":54,"s":[{"i":[[34.148,0],[0,0],[0,34.148],[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0]],"o":[[0,0],[-34.148,0],[0,0],[0,-34.148],[0,0],[34.148,0],[0,0],[0,34.148]],"v":[[-57.338,-5.09],[-57.338,-5.09],[-119.168,-66.92],[-119.168,-66.92],[-57.338,-128.75],[-57.338,-128.75],[4.492,-66.92],[4.492,-66.92]],"c":true}]},{"i":{"x":0.833,"y":1},"o":{"x":0.4,"y":0},"t":63.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":75.6,"s":[{"i":[[32.019,0],[0,0],[0,32.019],[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0]],"o":[[0,0],[-32.019,0],[0,0],[0,-32.019],[0,0],[32.019,0],[0,0],[0,32.019]],"v":[[-57.338,-8.945],[-57.338,-8.945],[-115.314,-66.92],[-115.314,-66.92],[-57.338,-124.895],[-57.338,-124.895],[0.637,-66.92],[0.637,-66.92]],"c":true}]},{"t":82.8001953125,"s":[{"i":[[36.361,0],[0,0],[0,36.361],[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0]],"o":[[0,0],[-36.361,0],[0,0],[0,-36.361],[0,0],[36.361,0],[0,0],[0,36.361]],"v":[[-57.338,-1.082],[-57.338,-1.082],[-123.177,-66.92],[-123.177,-66.92],[-57.338,-132.758],[-57.338,-132.758],[8.5,-66.92],[8.5,-66.92]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color3","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":39.6,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"green circle","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42.001,"s":[30]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":44.4,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":76.8,"s":[100]},{"t":85.20078125,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[242.662,81.08,0],"ix":2,"l":2},"a":{"a":0,"k":[-57.338,-66.92,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":1,"k":[{"i":{"x":0.2,"y":0.756},"o":{"x":0.167,"y":0.167},"t":42.001,"s":[{"i":[[0,-7.362],[7.362,0],[0,7.362],[-7.362,0]],"o":[[0,7.362],[-7.362,0],[0,-7.362],[7.362,0]],"v":[[-44.008,-66.92],[-57.338,-53.59],[-70.668,-66.92],[-57.338,-80.25]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.522,"y":0.153},"t":56.4,"s":[{"i":[[0,-23.654],[23.654,0],[0,23.654],[-23.654,0]],"o":[[0,23.654],[-23.654,0],[0,-23.654],[23.654,0]],"v":[[-14.508,-66.92],[-57.338,-24.09],[-100.168,-66.92],[-57.338,-109.75]],"c":true}]},{"i":{"x":0.2,"y":1},"o":{"x":0.167,"y":0},"t":66.001,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0},"t":76.8,"s":[{"i":[[0,-20.887],[20.887,0],[0,20.887],[-20.887,0]],"o":[[0,20.887],[-20.887,0],[0,-20.887],[20.887,0]],"v":[[-19.52,-66.92],[-57.338,-29.101],[-95.157,-66.92],[-57.338,-104.739]],"c":true}]},{"t":85.20078125,"s":[{"i":[[0,-22.554],[22.554,0],[0,22.554],[-22.554,0]],"o":[[0,22.554],[-22.554,0],[0,-22.554],[22.554,0]],"v":[[-16.5,-66.92],[-57.338,-26.082],[-98.177,-66.92],[-57.338,-107.758]],"c":true}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color2","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":42,"op":202.8,"st":42.4,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Group 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.684],"y":[0.935]},"o":{"x":[0.75],"y":[0]},"t":0,"s":[-25]},{"i":{"x":[0.399],"y":[1.043]},"o":{"x":[0.486],"y":[-0.011]},"t":37,"s":[-13.097]},{"i":{"x":[0.506],"y":[1]},"o":{"x":[0.583],"y":[0.042]},"t":67,"s":[-66.007]},{"t":96.000390625,"s":[-25]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.147]},"t":-5,"s":[527.598]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":20,"s":[508.098]},{"i":{"x":[0.506],"y":[0.953]},"o":{"x":[0.52],"y":[0]},"t":40,"s":[508.098]},{"i":{"x":[0.598],"y":[0.722]},"o":{"x":[0.655],"y":[-0.268]},"t":62,"s":[530.598]},{"i":{"x":[0.466],"y":[-0.143]},"o":{"x":[0.347],"y":[-0.682]},"t":78,"s":[525.848]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.147]},"t":92,"s":[527.598]},{"t":117.000390625,"s":[508.098]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.131]},"t":-5,"s":[91.472]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":20,"s":[102.472]},{"i":{"x":[0.506],"y":[0.958]},"o":{"x":[0.52],"y":[0]},"t":40,"s":[102.472]},{"i":{"x":[0.598],"y":[0.789]},"o":{"x":[0.655],"y":[-0.204]},"t":62,"s":[89.972]},{"i":{"x":[0.466],"y":[0.333]},"o":{"x":[0.347],"y":[-0.398]},"t":78,"s":[92.472]},{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.644],"y":[-0.131]},"t":92,"s":[91.472]},{"t":117.000390625,"s":[102.472]}],"ix":4}},"a":{"a":0,"k":[230.598,-58.028,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.412,-1.355],[4.917,-3.475],[0,0],[4.328,6.139],[0.414,1.363],[-4.909,3.473],[0,0],[-4.336,-6.136]],"o":[[1.66,5.461],[0,0],[-6.131,4.326],[-0.861,-1.219],[-1.658,-5.453],[0,0],[6.138,-4.328],[0.861,1.219]],"v":[[256.938,-71.394],[251.766,-56.325],[225.114,-37.506],[206.164,-40.775],[204.257,-44.671],[209.423,-59.73],[236.075,-78.549],[255.033,-75.283]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":31.6,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"circle_grey","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":5,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[100]},{"t":47.000390625,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":90.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[535.468]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[505.468]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[505.468]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[535.468]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[530.468]},{"t":96.000390625,"s":[535.468]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[193.039]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[188.039]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[188.039]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[193.039]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[192.539]},{"t":96.000390625,"s":[193.039]}],"ix":4}},"a":{"a":0,"k":[230.468,35.039,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[230.598,47.916],[230.598,47.916],[216.331,33.649],[216.331,33.649],[230.598,19.382],[230.598,19.382],[244.865,33.649],[244.865,33.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"circle_electric","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":90.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[535.468]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[505.468]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[505.468]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[535.468]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[530.468]},{"t":96.000390625,"s":[535.468]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[193.039]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[188.039]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[188.039]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[193.039]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[192.539]},{"t":96.000390625,"s":[193.039]}],"ix":4}},"a":{"a":0,"k":[230.468,35.039,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[230.598,47.916],[230.598,47.916],[216.331,33.649],[216.331,33.649],[230.598,19.382],[230.598,19.382],[244.865,33.649],[244.865,33.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.188235297799,0.886274516582,0.917647063732,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":43,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"circle_cyan","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[0]},{"t":90.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[535.468]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[505.468]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[505.468]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[535.468]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[530.468]},{"t":96.000390625,"s":[535.468]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.34],"y":[1]},"o":{"x":[0.409],"y":[0.117]},"t":0,"s":[193.039]},{"i":{"x":[0.833],"y":[1]},"o":{"x":[0.66],"y":[0]},"t":28,"s":[188.039]},{"i":{"x":[0.457],"y":[0.915]},"o":{"x":[0.41],"y":[0]},"t":40,"s":[188.039]},{"i":{"x":[0.578],"y":[1.172]},"o":{"x":[0.43],"y":[-0.52]},"t":62,"s":[193.039]},{"i":{"x":[0.542],"y":[0.883]},"o":{"x":[0.66],"y":[0.27]},"t":79,"s":[192.539]},{"t":96.000390625,"s":[193.039]}],"ix":4}},"a":{"a":0,"k":[230.468,35.039,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[7.88,0],[0,0],[0,7.88],[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0]],"o":[[0,0],[-7.88,0],[0,0],[0,-7.88],[0,0],[7.88,0],[0,0],[0,7.88]],"v":[[230.598,47.916],[230.598,47.916],[216.331,33.649],[216.331,33.649],[230.598,19.382],[230.598,19.382],[244.865,33.649],[244.865,33.649]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.188235297799,0.886274516582,0.917647063732,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color6","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":4,"st":39.6,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":"circle_yellow","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":85,"s":[100]},{"t":90.000390625,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[360]},{"t":96.000390625,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.075]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[183.709]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.076]},"t":66,"s":[162.209]},{"t":96.000390625,"s":[183.709]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.048]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[178.32]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.059]},"t":66,"s":[197.32]},{"t":96.000390625,"s":[178.32]}],"ix":4}},"a":{"a":0,"k":[-147.791,51.82,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.306],[4.306,0],[0,4.306],[-4.306,0]],"o":[[0,4.306],[-4.306,0],[0,-4.306],[4.306,0]],"v":[[-138.993,50.32],[-146.791,58.117],[-154.588,50.32],[-146.791,42.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.984313726425,0.737254917622,0.015686275437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color3","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"circle_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[360]},{"t":96.000390625,"s":[0]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.075]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[183.709]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.076]},"t":66,"s":[162.209]},{"t":96.000390625,"s":[183.709]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.279],"y":[1.048]},"o":{"x":[0.333],"y":[0]},"t":40,"s":[178.32]},{"i":{"x":[0.524],"y":[1]},"o":{"x":[0.758],"y":[0.059]},"t":66,"s":[197.32]},{"t":96.000390625,"s":[178.32]}],"ix":4}},"a":{"a":0,"k":[-147.791,51.82,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-4.306],[4.306,0],[0,4.306],[-4.306,0]],"o":[[0,4.306],[-4.306,0],[0,-4.306],[4.306,0]],"v":[[-138.993,50.32],[-146.791,58.117],[-154.588,50.32],[-146.791,42.522]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"square_green","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":40,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":45,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":90,"s":[100]},{"t":95.000390625,"s":[0]}],"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":96.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.901]},"o":{"x":[0.756],"y":[-0.155]},"t":-26,"s":[514.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[514.367]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[494.367]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[494.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[514.367]},{"t":111.000390625,"s":[494.367]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.985]},"o":{"x":[0.756],"y":[-0.023]},"t":-26,"s":[151]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[151]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[148]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[148]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[151]},{"t":111.000390625,"s":[148]}],"ix":4}},"a":{"a":0,"k":[194.367,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.576,0.576],[0,0],[-0.576,0.576],[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0]],"o":[[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0],[0.576,0.576],[0,0],[-0.576,0.576]],"v":[[193.325,4.201],[190.166,1.042],[190.166,-1.042],[193.325,-4.201],[195.41,-4.201],[198.568,-1.042],[198.568,1.042],[195.41,4.201]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.203921571374,0.658823549747,0.32549020648,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color2","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"square_grey","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":96.000390625,"s":[360]}],"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.901]},"o":{"x":[0.756],"y":[-0.155]},"t":-26,"s":[514.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[514.367]},{"i":{"x":[1],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[494.367]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[494.367]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[514.367]},{"t":111.000390625,"s":[494.367]}],"ix":3},"y":{"a":1,"k":[{"i":{"x":[0.408],"y":[0.985]},"o":{"x":[0.756],"y":[-0.023]},"t":-26,"s":[151]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":-24,"s":[151]},{"i":{"x":[0.999],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":14,"s":[148]},{"i":{"x":[0.408],"y":[0.919]},"o":{"x":[0.323],"y":[0]},"t":40,"s":[148]},{"i":{"x":[0.512],"y":[1]},"o":{"x":[0.723],"y":[-0.114]},"t":73,"s":[151]},{"t":111.000390625,"s":[148]}],"ix":4}},"a":{"a":0,"k":[194.367,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0.576,0.576],[0,0],[-0.576,0.576],[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0]],"o":[[0,0],[-0.576,-0.576],[0,0],[0.576,-0.576],[0,0],[0.576,0.576],[0,0],[-0.576,0.576]],"v":[[193.325,4.201],[190.166,1.042],[190.166,-1.042],[193.325,-4.201],[195.41,-4.201],[198.568,-1.042],[198.568,1.042],[195.41,4.201]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.909803926945,0.917647063732,0.929411768913,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_SecondaryColor","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":202.8,"st":39.6,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":" 4","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":41,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":43,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":67,"s":[100]},{"t":69,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[238.029,90.572,0],"ix":2,"l":2},"a":{"a":0,"k":[-61.971,-57.428,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":40.8,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":45.6,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67.2,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"t":72,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":" 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[238.029,90.572,0],"ix":2,"l":2},"a":{"a":0,"k":[-61.971,-57.428,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":1,"k":[{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":40.8,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":45.6,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"i":{"x":0.2,"y":1},"o":{"x":0.4,"y":0},"t":67.2,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-74.752,-57.428],[-49.19,-57.428]],"c":false}]},{"t":72,"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-73.565,-57.428],[-50.378,-57.428]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"_CrOS_Color1","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":"screen device","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[335.772,176.054,0],"ix":2,"l":2},"a":{"a":0,"k":[35.772,28.054,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.3,0],[0,0],[0,1.3],[0,0],[-1.3,0],[0,0],[0,-1.3],[0,0]],"o":[[0,0],[-1.3,0],[0,0],[0,-1.3],[0,0],[1.3,0],[0,0],[0,1.3]],"v":[[158,106.705],[-86.455,106.705],[-88.809,104.352],[-88.809,-48.245],[-86.455,-50.598],[158,-50.598],[160.354,-48.245],[160.354,104.352]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.258823543787,0.521568655968,0.956862747669,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_Color1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0},{"ddd":0,"ind":15,"ty":4,"nm":"bg device","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[335.772,177.608,0],"ix":2,"l":2},"a":{"a":0,"k":[35.772,29.608,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[141.735,116.644],[151.813,116.644]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":3,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[100.301,116.644],[123.817,116.644]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":3,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","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":"Group 2","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,-1.924],[0,0],[1.924,0],[0,0],[0,1.924],[0,0],[-1.924,0],[0,0]],"o":[[0,0],[1.924,0],[0,0],[0,1.924],[0,0],[-1.924,0],[0,0],[0,-1.924],[0,0],[0,0]],"v":[[-50.378,-57.428],[163.804,-57.428],[167.287,-53.944],[167.287,110.051],[163.804,113.535],[-92.259,113.535],[-95.742,110.051],[-95.742,-53.944],[-92.259,-57.428],[-73.565,-57.428]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.823529422283,0.890196084976,0.988235294819,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":3,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"_CrOS_Color1Shade2","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"_CrOS_BaseColor","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":3,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":192,"st":0,"bm":0}],"markers":[]} \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js index 9ff1a2b..6b13d0cb 100644 --- a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js +++ b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js
@@ -14,7 +14,7 @@ import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.m.js'; -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import 'chrome://resources/cr_elements/md_select_css.m.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import './strings.m.js';
diff --git a/chrome/browser/resources/connectors_internals/zero_trust_connector.ts b/chrome/browser/resources/connectors_internals/zero_trust_connector.ts index 5c83a7aa..4fe5a81 100644 --- a/chrome/browser/resources/connectors_internals/zero_trust_connector.ts +++ b/chrome/browser/resources/connectors_internals/zero_trust_connector.ts
@@ -113,8 +113,7 @@ this.keyInfo = state.keyInfo; - // Pretty print the dictionary as a JSON string. - this.signalsString = JSON.stringify(state.signalsDictionary, null, 2); + this.signalsString = state.signalsJson; } private async fetchZeroTrustValues(): Promise<ZeroTrustState|undefined> {
diff --git a/chrome/browser/resources/downloads/BUILD.gn b/chrome/browser/resources/downloads/BUILD.gn index 33fd5dd8..798fcae 100644 --- a/chrome/browser/resources/downloads/BUILD.gn +++ b/chrome/browser/resources/downloads/BUILD.gn
@@ -5,7 +5,6 @@ import("//chrome/common/features.gni") import("//tools/grit/grit_rule.gni") import("//tools/grit/preprocess_if_expr.gni") -import("//tools/polymer/html_to_js.gni") import("//tools/polymer/html_to_wrapper.gni") import("//tools/typescript/ts_library.gni") import("//ui/webui/resources/tools/generate_grd.gni") @@ -61,13 +60,10 @@ } preprocess_if_expr("preprocess_generated") { - deps = [ - ":css_wrapper_files", - ":html_wrapper_files", - ] + deps = [ ":html_wrapper_files" ] in_folder = target_gen_dir out_folder = "$target_gen_dir/$preprocess_folder" - in_files = html_wrapper_files + css_wrapper_files + in_files = html_wrapper_files } copy("copy_mojo") { @@ -93,12 +89,8 @@ output_dir = "$root_gen_dir/chrome" } -html_to_js("css_wrapper_files") { - js_files = css_wrapper_files -} - html_to_wrapper("html_wrapper_files") { - in_files = html_files + in_files = html_files + icons_html_files } ts_library("build_ts") { @@ -106,8 +98,7 @@ out_dir = "$target_gen_dir/tsc" composite = true tsconfig_base = "tsconfig_base.json" - in_files = ts_files + css_wrapper_files + html_wrapper_files + - [ "downloads.mojom-webui.js" ] + in_files = ts_files + html_wrapper_files + [ "downloads.mojom-webui.js" ] deps = [ "//third_party/polymer/v3_0:library", "//ui/webui/resources:library",
diff --git a/chrome/browser/resources/downloads/downloads.gni b/chrome/browser/resources/downloads/downloads.gni index 7226610..5283a47 100644 --- a/chrome/browser/resources/downloads/downloads.gni +++ b/chrome/browser/resources/downloads/downloads.gni
@@ -15,9 +15,11 @@ html_files += [ string_replace(f, ".ts", ".html") ] } +icons_html_files = [ "icons.html" ] + # Files that are generated by html_to_wrapper(). html_wrapper_files = [] -foreach(f, html_files) { +foreach(f, html_files + icons_html_files) { html_wrapper_files += [ f + ".ts" ] } @@ -29,5 +31,3 @@ "icon_loader.ts", "search_service.ts", ] + web_component_files - -css_wrapper_files = [ "icons.ts" ]
diff --git a/chrome/browser/resources/downloads/icons.ts b/chrome/browser/resources/downloads/icons.ts deleted file mode 100644 index bfa10de..0000000 --- a/chrome/browser/resources/downloads/icons.ts +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; -import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -const template = html`{__html_template__}`; -document.head.appendChild(template.content);
diff --git a/chrome/browser/resources/downloads/item.ts b/chrome/browser/resources/downloads/item.ts index 3f1ff2d..c743ebf 100644 --- a/chrome/browser/resources/downloads/item.ts +++ b/chrome/browser/resources/downloads/item.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import './icons.js'; +import './icons.html.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_icons_css.m.js';
diff --git a/chrome/browser/resources/downloads/manager.ts b/chrome/browser/resources/downloads/manager.ts index 1053d8d..737e509 100644 --- a/chrome/browser/resources/downloads/manager.ts +++ b/chrome/browser/resources/downloads/manager.ts
@@ -7,7 +7,7 @@ import './toolbar.js'; import 'chrome://resources/cr_components/managed_footnote/managed_footnote.js'; import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js';
diff --git a/chrome/browser/resources/extensions/activity_log/activity_log_history.ts b/chrome/browser/resources/extensions/activity_log/activity_log_history.ts index 6f0b485..b34ef72 100644 --- a/chrome/browser/resources/extensions/activity_log/activity_log_history.ts +++ b/chrome/browser/resources/extensions/activity_log/activity_log_history.ts
@@ -42,7 +42,7 @@ * the scripts executed (specified as a stringified JSON array in the args * field) as the keys for an activity group instead. */ -function getActivityGroupKeysForContentScript_( +function getActivityGroupKeysForContentScript( activity: chrome.activityLogPrivate.ExtensionActivity): string[] { assert( activity.activityType === @@ -63,7 +63,7 @@ * is in activity.other.webRequest and we use this to generate more activity * group keys if possible. */ -function getActivityGroupKeysForWebRequest_( +function getActivityGroupKeysForWebRequest( activity: chrome.activityLogPrivate.ExtensionActivity): Array<string> { assert( activity.activityType === @@ -111,9 +111,9 @@ let activityGroupKeys = [activity.apiCall]; if (isContentScript) { - activityGroupKeys = getActivityGroupKeysForContentScript_(activity); + activityGroupKeys = getActivityGroupKeysForContentScript(activity); } else if (isWebRequest) { - activityGroupKeys = getActivityGroupKeysForWebRequest_(activity); + activityGroupKeys = getActivityGroupKeysForWebRequest(activity); } for (const key of activityGroupKeys) {
diff --git a/chrome/browser/resources/extensions/error_page.ts b/chrome/browser/resources/extensions/error_page.ts index a4ceea5..80be32d 100644 --- a/chrome/browser/resources/extensions/error_page.ts +++ b/chrome/browser/resources/extensions/error_page.ts
@@ -50,7 +50,7 @@ * Given 3 strings, this function returns the correct one for the type of * error that |item| is. */ -function getErrorSeverityText_( +function getErrorSeverityText( item: ManifestError|RuntimeError, log: string, warn: string, error: string): string { if (item.type === chrome.developerPrivate.ErrorType.RUNTIME) { @@ -179,11 +179,11 @@ private computeErrorIcon_(error: ManifestError|RuntimeError): string { // Do not i18n these strings, they're CSS classes. - return getErrorSeverityText_(error, 'info', 'warning', 'error'); + return getErrorSeverityText(error, 'info', 'warning', 'error'); } private computeErrorTypeLabel_(error: ManifestError|RuntimeError): string { - return getErrorSeverityText_( + return getErrorSeverityText( error, loadTimeData.getString('logLevel'), loadTimeData.getString('warnLevel'), loadTimeData.getString('errorLevel'));
diff --git a/chrome/browser/resources/extensions/item_util.ts b/chrome/browser/resources/extensions/item_util.ts index 9b42cb6..f5172175 100644 --- a/chrome/browser/resources/extensions/item_util.ts +++ b/chrome/browser/resources/extensions/item_util.ts
@@ -151,7 +151,7 @@ /** * @return Whether the extension is in the terminated state. */ -function isTerminated_(state: chrome.developerPrivate.ExtensionState): boolean { +function isTerminated(state: chrome.developerPrivate.ExtensionState): boolean { return state === chrome.developerPrivate.ExtensionState.TERMINATED; } @@ -160,7 +160,7 @@ */ export function getEnableControl(data: chrome.developerPrivate.ExtensionInfo): EnableControl { - if (isTerminated_(data.state)) { + if (isTerminated(data.state)) { return EnableControl.RELOAD; } if (data.disableReasons.corruptInstall && data.userMayModify) {
diff --git a/chrome/browser/resources/history/side_bar.ts b/chrome/browser/resources/history/side_bar.ts index 51c3797d..e4e1141 100644 --- a/chrome/browser/resources/history/side_bar.ts +++ b/chrome/browser/resources/history/side_bar.ts
@@ -5,7 +5,7 @@ import 'chrome://resources/cr_components/managed_footnote/managed_footnote.js'; import 'chrome://resources/cr_elements/cr_icons_css.m.js'; import 'chrome://resources/cr_elements/cr_menu_selector/cr_menu_selector.js'; -import 'chrome://resources/cr_elements/cr_nav_menu_item_style.js'; +import 'chrome://resources/cr_elements/cr_nav_menu_item_style.css.js'; import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
diff --git a/chrome/browser/resources/management/management_ui.ts b/chrome/browser/resources/management/management_ui.ts index d891d30..1b4c411 100644 --- a/chrome/browser/resources/management/management_ui.ts +++ b/chrome/browser/resources/management/management_ui.ts
@@ -4,7 +4,7 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_icons_css.m.js'; -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js'; import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/cr_elements/icons.m.js';
diff --git a/chrome/browser/resources/pdf/pdf_scripting_api.ts b/chrome/browser/resources/pdf/pdf_scripting_api.ts index d78ee2d..930ba3ed 100644 --- a/chrome/browser/resources/pdf/pdf_scripting_api.ts +++ b/chrome/browser/resources/pdf/pdf_scripting_api.ts
@@ -33,7 +33,7 @@ * Turn a dictionary received from postMessage into a key event. * @param dict A dictionary representing the key event. */ -export function DeserializeKeyEvent(dict: SerializedKeyEvent): KeyboardEvent { +export function deserializeKeyEvent(dict: SerializedKeyEvent): KeyboardEvent { const e = new KeyboardEvent('keydown', { bubbles: true, cancelable: true, @@ -52,7 +52,7 @@ * Turn a key event into a dictionary which can be sent over postMessage. * @return A dictionary representing the key event. */ -export function SerializeKeyEvent(event: KeyboardEvent): SerializedKeyEvent { +export function serializeKeyEvent(event: KeyboardEvent): SerializedKeyEvent { return { keyCode: event.keyCode, code: event.code, @@ -129,7 +129,7 @@ } case 'sendKeyEvent': if (this.keyEventCallback_) { - this.keyEventCallback_(DeserializeKeyEvent(event.data.keyEvent)); + this.keyEventCallback_(deserializeKeyEvent(event.data.keyEvent)); } break; } @@ -267,7 +267,7 @@ */ sendKeyEvent(keyEvent: KeyboardEvent) { this.sendMessage_( - {type: 'sendKeyEvent', keyEvent: SerializeKeyEvent(keyEvent)}); + {type: 'sendKeyEvent', keyEvent: serializeKeyEvent(keyEvent)}); } /** @@ -288,7 +288,7 @@ * @param baseUrl the base URL of the PDF viewer * @return The iframe element containing the PDF viewer. */ -export function PDFCreateOutOfProcessPlugin( +export function pdfCreateOutOfProcessPlugin( src: string, baseUrl: string): PDFPlugin { const client = new PDFScriptingAPI(window, null); const iframe = window.document.createElement('iframe') as PDFPlugin;
diff --git a/chrome/browser/resources/pdf/pdf_viewer.ts b/chrome/browser/resources/pdf/pdf_viewer.ts index 22f7a86..27b9715 100644 --- a/chrome/browser/resources/pdf/pdf_viewer.ts +++ b/chrome/browser/resources/pdf/pdf_viewer.ts
@@ -37,7 +37,7 @@ import {LocalStorageProxyImpl} from './local_storage_proxy.js'; import {record, UserAction} from './metrics.js'; import {NavigatorDelegateImpl, PdfNavigator, WindowOpenDisposition} from './navigator.js'; -import {DeserializeKeyEvent, LoadState} from './pdf_scripting_api.js'; +import {deserializeKeyEvent, LoadState} from './pdf_scripting_api.js'; import {getTemplate} from './pdf_viewer.html.js'; import {KeyEventData, PDFViewerBaseElement} from './pdf_viewer_base.js'; import {DestinationMessageData, DocumentDimensionsMessageData, hasCtrlModifier, shouldIgnoreKeyEvents} from './pdf_viewer_utils.js'; @@ -749,7 +749,7 @@ case 'sendKeyEvent': const keyEventData = data as unknown as KeyEventData; const keyEvent = - DeserializeKeyEvent(keyEventData.keyEvent) as ExtendedKeyEvent; + deserializeKeyEvent(keyEventData.keyEvent) as ExtendedKeyEvent; keyEvent.fromPlugin = true; this.handleKeyEvent(keyEvent); return;
diff --git a/chrome/browser/resources/pdf/pdf_viewer_pp.ts b/chrome/browser/resources/pdf/pdf_viewer_pp.ts index 883cb8de..fb88b84 100644 --- a/chrome/browser/resources/pdf/pdf_viewer_pp.ts +++ b/chrome/browser/resources/pdf/pdf_viewer_pp.ts
@@ -16,7 +16,7 @@ import {MessageData, PluginController, PrintPreviewParams} from './controller.js'; import {ViewerPageIndicatorElement} from './elements/viewer-page-indicator.js'; import {ViewerZoomToolbarElement} from './elements/viewer-zoom-toolbar.js'; -import {DeserializeKeyEvent, LoadState, SerializeKeyEvent} from './pdf_scripting_api.js'; +import {deserializeKeyEvent, LoadState, serializeKeyEvent} from './pdf_scripting_api.js'; import {KeyEventData, PDFViewerBaseElement} from './pdf_viewer_base.js'; import {getTemplate} from './pdf_viewer_pp.html.js'; import {DestinationMessageData, DocumentDimensionsMessageData, hasCtrlModifier, shouldIgnoreKeyEvents} from './pdf_viewer_utils.js'; @@ -98,7 +98,7 @@ // Give print preview a chance to handle the key event. if (!e.fromScriptingAPI) { this.sendScriptingMessage( - {type: 'sendKeyEvent', keyEvent: SerializeKeyEvent(e)}); + {type: 'sendKeyEvent', keyEvent: serializeKeyEvent(e)}); } else { // Show toolbar as a fallback. if (!(e.shiftKey || e.ctrlKey || e.altKey)) { @@ -215,7 +215,7 @@ return true; case 'sendKeyEvent': const keyEvent = - DeserializeKeyEvent((message.data as KeyEventData).keyEvent); + deserializeKeyEvent((message.data as KeyEventData).keyEvent); const extendedKeyEvent = keyEvent as ExtendedKeyEvent; extendedKeyEvent.fromScriptingAPI = true; this.handleKeyEvent(extendedKeyEvent); @@ -284,7 +284,7 @@ // TODO(crbug.com/1069370): Draw a focus rect around plugin. return; case 'sendKeyEvent': - const keyEvent = DeserializeKeyEvent((data as KeyEventData).keyEvent) as + const keyEvent = deserializeKeyEvent((data as KeyEventData).keyEvent) as ExtendedKeyEvent; keyEvent.fromPlugin = true; this.handleKeyEvent(keyEvent);
diff --git a/chrome/browser/resources/print_preview/ui/advanced_settings_item.ts b/chrome/browser/resources/print_preview/ui/advanced_settings_item.ts index 747b150..1dc8f99 100644 --- a/chrome/browser/resources/print_preview/ui/advanced_settings_item.ts +++ b/chrome/browser/resources/print_preview/ui/advanced_settings_item.ts
@@ -5,7 +5,7 @@ import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.m.js'; import 'chrome://resources/cr_elements/cr_input/cr_input.m.js'; -import 'chrome://resources/cr_elements/search_highlight_style_css.js'; +import 'chrome://resources/cr_elements/search_highlight_style.css.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/cr_elements/md_select_css.m.js'; import './print_preview_shared_css.js';
diff --git a/chrome/browser/resources/print_preview/ui/plugin_proxy.ts b/chrome/browser/resources/print_preview/ui/plugin_proxy.ts index 3aaac8d8..13d2feb 100644 --- a/chrome/browser/resources/print_preview/ui/plugin_proxy.ts +++ b/chrome/browser/resources/print_preview/ui/plugin_proxy.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {PDFCreateOutOfProcessPlugin, PDFPlugin} from 'chrome://print/pdf/pdf_scripting_api.js'; +import {pdfCreateOutOfProcessPlugin, PDFPlugin} from 'chrome://print/pdf/pdf_scripting_api.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; export type ViewportChangedCallback = @@ -83,7 +83,7 @@ createPlugin(previewUid: number, index: number) { assert(!this.plugin_); const srcUrl = this.getPreviewUrl_(previewUid, index); - this.plugin_ = PDFCreateOutOfProcessPlugin(srcUrl, 'chrome://print/pdf'); + this.plugin_ = pdfCreateOutOfProcessPlugin(srcUrl, 'chrome://print/pdf'); this.plugin_!.classList.add('preview-area-plugin'); // NOTE: The plugin's 'id' field must be set to 'pdf-viewer' since // chrome/renderer/printing/print_render_frame_helper.cc actually
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.html b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.html index a88ebc1..d1209015 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.html +++ b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.html
@@ -1,16 +1,11 @@ +<link rel="import" href="chrome://resources/polymer/v1_0/iron-media-query/iron-media-query.html"> + <style include="settings-shared"> #dialog::part(dialog) { min-width: 500px; width: 500px; } - #scannerLocation { - display: block; - height: 205px; - margin: auto; - padding: 10px 0; - } - #scannerLocationLottie { height: 220px; padding: 10px 0; @@ -39,20 +34,16 @@ aria-live="polite"> <span>[[getInstructionMessage_(step_, problemMessage_)]]</span> </div> - <template is="dom-if" if="[[shouldUseLottieAnimation_]]"> - <div id="scannerLocationLottie" + <div id="scannerLocationLottie" hidden="[[!showScannerLocation_(step_)]]" aria-live="polite" aria-label="$i18n{configureFingerprintScannerStepAriaLabel}"> - <cr-lottie animation-url="fingerprint_scanner_animation.json" autoplay> - </cr-lottie> - </div> - </template> - <template is="dom-if" if="[[!shouldUseLottieAnimation_]]"> - <img id="scannerLocation" hidden="[[!showScannerLocation_(step_)]]" - aria-label="$i18n{configureFingerprintScannerStepAriaLabel}" - aria-live="polite" - src="fingerprint_scanner_illustration.svg"> - </template> + <iron-media-query query="(prefers-color-scheme: dark)" + query-matches="{{isDarkModeActive_}}"> + </iron-media-query> + <cr-lottie animation-url="[[getAnimationUrl_(isDarkModeActive_)]]" + autoplay> + </cr-lottie> + </div> <cr-fingerprint-progress-arc id="arc" circle-radius="100" autoplay hidden="[[!showArc_(step_)]]"> </cr-fingerprint-progress-arc>
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js index 81de537..14b9fe5e 100644 --- a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js
@@ -48,6 +48,18 @@ */ const SHOW_TAP_SENSOR_MESSAGE_DELAY_MS = 2000; +/** + * The onboarding animation asset for dark mode. + * @type {string} + */ +const ONBOARDING_ANIMATION_DARK = 'fingerprint_scanner_animation_dark.json'; + +/** + * The onboarding animation asset for light mode. + * @type {string} + */ +const ONBOARDING_ANIMATION_LIGHT = 'fingerprint_scanner_animation_light.json'; + Polymer({ _template: html`{__html_template__}`, is: 'settings-setup-fingerprint-dialog', @@ -103,18 +115,14 @@ }, /** - * True if lottie animation file should be used instead of an - * illustration. + * Whether the dialog is being rendered in dark mode. * @type {boolean} * @private */ - shouldUseLottieAnimation_: { + isDarkModeActive_: { type: Boolean, - value() { - return loadTimeData.getBoolean('useLottieAnimationForFingerprint'); - }, - readOnly: true, - } + value: false, + }, }, /** @@ -348,4 +356,15 @@ this.$.arc.setProgress(oldValue, newValue, newValue === 100); }, + + /** + * Returns the URL for the asset that defines the onboarding animation for the + * current fingerprint sensor location. + * @return {string} + * @private + */ + getAnimationUrl_() { + return this.isDarkModeActive_ ? ONBOARDING_ANIMATION_DARK : + ONBOARDING_ANIMATION_LIGHT; + }, });
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js index c5dd81a..6aed440b 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js +++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.js
@@ -12,7 +12,7 @@ */ import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; import '//resources/cr_elements/cr_drawer/cr_drawer.js'; -import '//resources/cr_elements/cr_page_host_style_css.js'; +import '//resources/cr_elements/cr_page_host_style.css.js'; import '//resources/cr_elements/icons.m.js'; import '//resources/cr_elements/shared_vars_css.m.js'; import '../os_settings_menu/os_settings_menu.js';
diff --git a/chrome/browser/resources/settings/privacy_sandbox/app.ts b/chrome/browser/resources/settings/privacy_sandbox/app.ts index 8a26c4e5..3639b99 100644 --- a/chrome/browser/resources/settings/privacy_sandbox/app.ts +++ b/chrome/browser/resources/settings/privacy_sandbox/app.ts
@@ -1,7 +1,7 @@ // Copyright 2020 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import 'chrome://resources/cr_elements/shared_style_css.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import './icons.js';
diff --git a/chrome/browser/resources/settings/search_settings.ts b/chrome/browser/resources/settings/search_settings.ts index 9ffe2dc..fa87655 100644 --- a/chrome/browser/resources/settings/search_settings.ts +++ b/chrome/browser/resources/settings/search_settings.ts
@@ -68,7 +68,8 @@ * @param root The root of the sub-tree to be searched * @return Whether or not matches were found. */ - function findAndHighlightMatches_(request: SearchRequest, root: Node): boolean { + function findAndHighlightMatches( + request: SearchRequest, root: Node): boolean { let foundMatches = false; const highlights: Array<HTMLElement> = []; @@ -116,7 +117,7 @@ if (ranges.length > 0) { foundMatches = true; - revealParentSection_( + revealParentSection( node, /*numResults=*/ ranges.length, request.bubbles); if (node.parentNode!.nodeName === 'OPTION') { @@ -132,7 +133,7 @@ return; } - showBubble_( + showBubble( select, /*numResults=*/ ranges.length, request.bubbles, /*horizontallyCenter=*/ true); } else { @@ -169,7 +170,7 @@ * Finds and makes visible the <settings-section> parent of |node|. * @param bubbles A map of bubbles created so far. */ - function revealParentSection_( + function revealParentSection( node: Node, numResults: number, bubbles: Map<Node, number>) { let associatedControl: HTMLElement|null = null; @@ -197,13 +198,13 @@ // Need to add the search bubble after the parent SETTINGS-SECTION has // become visible, otherwise |offsetWidth| returns zero. if (associatedControl) { - showBubble_( + showBubble( associatedControl, numResults, bubbles, /* horizontallyCenter= */ false); } } - function showBubble_( + function showBubble( control: Node, numResults: number, bubbles: Map<Node, number>, horizontallyCenter: boolean) { const bubble = createEmptySearchBubble(control, horizontallyCenter); @@ -263,7 +264,7 @@ class SearchAndHighlightTask extends Task { exec() { - const foundMatches = findAndHighlightMatches_(this.request, this.node); + const foundMatches = findAndHighlightMatches(this.request, this.node); this.request.updateMatches(foundMatches); return Promise.resolve(); } @@ -276,7 +277,7 @@ const shouldSearch = this.request.regExp !== null; this.setSectionsVisibility_(!shouldSearch); if (shouldSearch) { - const foundMatches = findAndHighlightMatches_(this.request, this.node); + const foundMatches = findAndHighlightMatches(this.request, this.node); this.request.updateMatches(foundMatches); }
diff --git a/chrome/browser/resources/settings/settings_menu/settings_menu.ts b/chrome/browser/resources/settings/settings_menu/settings_menu.ts index adeb4eb8..4ef872e 100644 --- a/chrome/browser/resources/settings/settings_menu/settings_menu.ts +++ b/chrome/browser/resources/settings/settings_menu/settings_menu.ts
@@ -8,7 +8,7 @@ */ import 'chrome://resources/cr_elements/cr_icons_css.m.js'; import 'chrome://resources/cr_elements/cr_menu_selector/cr_menu_selector.js'; -import 'chrome://resources/cr_elements/cr_nav_menu_item_style.js'; +import 'chrome://resources/cr_elements/cr_nav_menu_item_style.css.js'; import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js';
diff --git a/chrome/browser/resources/settings/settings_shared_css.ts b/chrome/browser/resources/settings/settings_shared_css.ts index 22ad70f..12d3cff 100644 --- a/chrome/browser/resources/settings/settings_shared_css.ts +++ b/chrome/browser/resources/settings/settings_shared_css.ts
@@ -5,7 +5,7 @@ // <if expr="chromeos_ash"> import '//resources/cr_elements/chromeos/cros_color_overrides.m.js'; // </if> -import '//resources/cr_elements/search_highlight_style_css.js'; +import '//resources/cr_elements/search_highlight_style.css.js'; import '//resources/cr_elements/shared_vars_css.m.js'; import '//resources/cr_elements/shared_style_css.m.js'; import './settings_vars_css.js';
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.ts b/chrome/browser/resources/settings/settings_ui/settings_ui.ts index 4d35de95..9a58833 100644 --- a/chrome/browser/resources/settings/settings_ui/settings_ui.ts +++ b/chrome/browser/resources/settings/settings_ui/settings_ui.ts
@@ -13,7 +13,7 @@ import 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js'; import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js'; import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js'; -import 'chrome://resources/cr_elements/cr_page_host_style_css.js'; +import 'chrome://resources/cr_elements/cr_page_host_style.css.js'; import 'chrome://resources/cr_elements/icons.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/paper-styles/color.js';
diff --git a/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts b/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts index 5a4789d..31613c4 100644 --- a/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts +++ b/chrome/browser/resources/side_panel/bookmarks/bookmark_folder.ts
@@ -4,7 +4,7 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; -import 'chrome://resources/cr_elements/mwb_element_shared_style.js'; +import 'chrome://resources/cr_elements/mwb_element_shared_style.css.js'; import {getFaviconForPageURL} from 'chrome://resources/js/icon.js'; import {DomRepeatEvent, html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/side_panel/bookmarks/bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/bookmarks_list.ts index c5f13c1..fb0d7347 100644 --- a/chrome/browser/resources/side_panel/bookmarks/bookmarks_list.ts +++ b/chrome/browser/resources/side_panel/bookmarks/bookmarks_list.ts
@@ -168,7 +168,7 @@ private findPathToId_(id: string): chrome.bookmarks.BookmarkTreeNode[] { const path: chrome.bookmarks.BookmarkTreeNode[] = []; - function findPathByIdInternal_( + function findPathByIdInternal( id: string, node: chrome.bookmarks.BookmarkTreeNode) { if (node.id === id) { path.push(node); @@ -181,7 +181,7 @@ path.push(node); const foundInChildren = - node.children.some(child => findPathByIdInternal_(id, child)); + node.children.some(child => findPathByIdInternal(id, child)); if (!foundInChildren) { path.pop(); } @@ -189,7 +189,7 @@ return foundInChildren; } - this.folders_.some(folder => findPathByIdInternal_(id, folder)); + this.folders_.some(folder => findPathByIdInternal(id, folder)); return path; }
diff --git a/chrome/browser/resources/side_panel/reading_list/app.ts b/chrome/browser/resources/side_panel/reading_list/app.ts index 53cc898..fc81cc5 100644 --- a/chrome/browser/resources/side_panel/reading_list/app.ts +++ b/chrome/browser/resources/side_panel/reading_list/app.ts
@@ -6,9 +6,9 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/hidden_style_css.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; -import 'chrome://resources/cr_elements/mwb_element_shared_style.js'; -import 'chrome://resources/cr_elements/mwb_shared_style.js'; -import 'chrome://resources/cr_elements/mwb_shared_vars.js'; +import 'chrome://resources/cr_elements/mwb_element_shared_style.css.js'; +import 'chrome://resources/cr_elements/mwb_shared_style.css.js'; +import 'chrome://resources/cr_elements/mwb_shared_vars.css.js'; import 'chrome://resources/polymer/v3_0/iron-selector/iron-selector.js'; import './reading_list_item.js'; import '../strings.m.js';
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list.html b/chrome/browser/resources/side_panel/reading_list/reading_list.html index 590d6775..058b8b1 100644 --- a/chrome/browser/resources/side_panel/reading_list/reading_list.html +++ b/chrome/browser/resources/side_panel/reading_list/reading_list.html
@@ -22,7 +22,7 @@ <body> <reading-list-app></reading-list-app> <script type="module" src="reading_list/app.js"></script> - <script type="module" src="chrome://resources/cr_elements/mwb_shared_vars.js"> + <script type="module" src="chrome://resources/cr_elements/mwb_shared_vars.css.js"> </script> </body> </html>
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts b/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts index 5447247..4c40e8b 100644 --- a/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts +++ b/chrome/browser/resources/side_panel/reading_list/reading_list_item.ts
@@ -5,8 +5,8 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_icons_css.m.js'; import 'chrome://resources/cr_elements/icons.m.js'; -import 'chrome://resources/cr_elements/mwb_element_shared_style.js'; -import 'chrome://resources/cr_elements/mwb_shared_vars.js'; +import 'chrome://resources/cr_elements/mwb_element_shared_style.css.js'; +import 'chrome://resources/cr_elements/mwb_shared_vars.css.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import './icons.js';
diff --git a/chrome/browser/resources/tab_search/app.ts b/chrome/browser/resources/tab_search/app.ts index 78a2c15..dc540bbd 100644 --- a/chrome/browser/resources/tab_search/app.ts +++ b/chrome/browser/resources/tab_search/app.ts
@@ -4,9 +4,9 @@ import 'chrome://resources/cr_elements/cr_expand_button/cr_expand_button.m.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; -import 'chrome://resources/cr_elements/mwb_element_shared_style.js'; -import 'chrome://resources/cr_elements/mwb_shared_style.js'; -import 'chrome://resources/cr_elements/mwb_shared_vars.js'; +import 'chrome://resources/cr_elements/mwb_element_shared_style.css.js'; +import 'chrome://resources/cr_elements/mwb_shared_style.css.js'; +import 'chrome://resources/cr_elements/mwb_shared_vars.css.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; import './infinite_list.js'; @@ -22,8 +22,8 @@ import {Token} from 'chrome://resources/mojo/mojo/public/mojom/base/token.mojom-webui.js'; import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js'; import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {getTemplate} from './app.html.js'; +import {getTemplate} from './app.html.js'; import {fuzzySearch, FuzzySearchOptions} from './fuzzy_search.js'; import {InfiniteList, NO_SELECTION, selectorNavigationKeys} from './infinite_list.js'; import {ariaLabel, ItemData, TabData, TabGroupData, TabItemType, tokenEquals, tokenToString} from './tab_data.js';
diff --git a/chrome/browser/resources/tab_search/tab_search.html b/chrome/browser/resources/tab_search/tab_search.html index 43c3421..5802949 100644 --- a/chrome/browser/resources/tab_search/tab_search.html +++ b/chrome/browser/resources/tab_search/tab_search.html
@@ -26,7 +26,7 @@ <body> <tab-search-app></tab-search-app> <script type="module" src="tab_search.js"></script> - <script type="module" src="chrome://resources/cr_elements/mwb_shared_vars.js"> + <script type="module" src="chrome://resources/cr_elements/mwb_shared_vars.css.js"> </script> </body> </html>
diff --git a/chrome/browser/resources/tab_search/tab_search_group_item.ts b/chrome/browser/resources/tab_search/tab_search_group_item.ts index de961da..6556572 100644 --- a/chrome/browser/resources/tab_search/tab_search_group_item.ts +++ b/chrome/browser/resources/tab_search/tab_search_group_item.ts
@@ -4,8 +4,8 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_icons_css.m.js'; -import 'chrome://resources/cr_elements/mwb_shared_icons.js'; -import 'chrome://resources/cr_elements/mwb_shared_vars.js'; +import 'chrome://resources/cr_elements/mwb_shared_icons.html.js'; +import 'chrome://resources/cr_elements/mwb_shared_vars.css.js'; import {MouseHoverableMixin} from 'chrome://resources/cr_elements/mouse_hoverable_mixin.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
diff --git a/chrome/browser/resources/tab_search/tab_search_item.ts b/chrome/browser/resources/tab_search/tab_search_item.ts index c5333d39..7d6b721 100644 --- a/chrome/browser/resources/tab_search/tab_search_item.ts +++ b/chrome/browser/resources/tab_search/tab_search_item.ts
@@ -4,8 +4,8 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_icons_css.m.js'; -import 'chrome://resources/cr_elements/mwb_shared_icons.js'; -import 'chrome://resources/cr_elements/mwb_shared_vars.js'; +import 'chrome://resources/cr_elements/mwb_shared_icons.html.js'; +import 'chrome://resources/cr_elements/mwb_shared_vars.css.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import './strings.m.js';
diff --git a/chrome/browser/resources/tab_search/tab_search_search_field.ts b/chrome/browser/resources/tab_search/tab_search_search_field.ts index aa3da54..b227e9e 100644 --- a/chrome/browser/resources/tab_search/tab_search_search_field.ts +++ b/chrome/browser/resources/tab_search/tab_search_search_field.ts
@@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'chrome://resources/cr_elements/mwb_shared_icons.js'; -import 'chrome://resources/cr_elements/mwb_shared_vars.js'; +import 'chrome://resources/cr_elements/mwb_shared_icons.html.js'; +import 'chrome://resources/cr_elements/mwb_shared_vars.css.js'; import 'chrome://resources/cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; import {CrSearchFieldMixin} from 'chrome://resources/cr_elements/cr_search_field/cr_search_field_mixin.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + import {getTemplate} from './tab_search_search_field.html.js'; const TabSearchSearchFieldBase = CrSearchFieldMixin(PolymerElement);
diff --git a/chrome/browser/resources/webui_gallery/app.ts b/chrome/browser/resources/webui_gallery/app.ts index 8911714..8e8ad9f 100644 --- a/chrome/browser/resources/webui_gallery/app.ts +++ b/chrome/browser/resources/webui_gallery/app.ts
@@ -3,7 +3,7 @@ // found in the LICENSE file. import '//resources/cr_elements/cr_menu_selector/cr_menu_selector.js'; -import '//resources/cr_elements/cr_nav_menu_item_style.js'; +import '//resources/cr_elements/cr_nav_menu_item_style.css.js'; import '//resources/polymer/v3_0/iron-selector/iron-selector.js'; import {assert} from '//resources/js/assert_ts.js';
diff --git a/chrome/browser/safe_browsing/client_side_detection_host_browsertest.cc b/chrome/browser/safe_browsing/client_side_detection_host_browsertest.cc index 707c0ed..d052bf96 100644 --- a/chrome/browser/safe_browsing/client_side_detection_host_browsertest.cc +++ b/chrome/browser/safe_browsing/client_side_detection_host_browsertest.cc
@@ -58,6 +58,8 @@ void SetModel(const ClientSideModel& model) { model_ = model; } + CSDModelType GetModelType() override { return CSDModelType::kProtobuf; } + const std::string& GetModelStr() override { client_side_model_ = model_.SerializeAsString(); return client_side_model_; @@ -150,9 +152,10 @@ ChromeClientSideDetectionHostDelegate::CreateHost( browser()->tab_strip_model()->GetActiveWebContents()); csd_host->set_client_side_detection_service(&fake_csd_service); - csd_host->SendModelToRenderFrame(); csd_host->set_ui_manager(mock_ui_manager.get()); + fake_csd_service.SendModelToRenderers(); + GURL page_url(embedded_test_server()->GetURL("/safe_browsing/malware.html")); ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), page_url)); @@ -196,9 +199,10 @@ ChromeClientSideDetectionHostDelegate::CreateHost( browser()->tab_strip_model()->GetActiveWebContents()); csd_host->set_client_side_detection_service(&fake_csd_service); - csd_host->SendModelToRenderFrame(); csd_host->set_ui_manager(mock_ui_manager.get()); + fake_csd_service.SendModelToRenderers(); + base::RunLoop run_loop; fake_csd_service.SetRequestCallback(run_loop.QuitClosure());
diff --git a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc index 2a10cfe..5a49278a 100644 --- a/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc +++ b/chrome/browser/safe_browsing/client_side_detection_host_unittest.cc
@@ -52,11 +52,12 @@ #include "content/public/test/test_renderer_host.h" #include "content/public/test/web_contents_tester.h" #include "ipc/ipc_test_sink.h" +#include "mojo/public/cpp/bindings/associated_receiver_set.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/bindings/receiver_set.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "url/gurl.h" using content::BrowserThread; @@ -212,20 +213,10 @@ ~FakePhishingDetector() override = default; - void BindReceiver(mojo::ScopedMessagePipeHandle handle) { - receivers_.Add(this, mojo::PendingReceiver<mojom::PhishingDetector>( - std::move(handle))); - } - - // mojom::PhishingDetector - void SetPhishingModel(const std::string& model, base::File file) override { - model_ = model; - } - - // mojom::PhishingDetector - void SetPhishingFlatBufferModel(base::ReadOnlySharedMemoryRegion region, - base::File file) override { - region_ = std::move(region); + void BindReceiver(mojo::ScopedInterfaceEndpointHandle handle) { + receivers_.Add(this, + mojo::PendingAssociatedReceiver<mojom::PhishingDetector>( + std::move(handle))); } // mojom::PhishingDetector @@ -254,25 +245,15 @@ } } - void CheckModel(const std::string& model) { EXPECT_EQ(model, model_); } - - void CheckModel(base::ReadOnlySharedMemoryRegion region) { - EXPECT_EQ(region.GetGUID(), region_.GetGUID()); - } - void Reset() { phishing_detection_started_ = false; url_ = GURL(); - model_ = ""; - region_ = base::ReadOnlySharedMemoryRegion(); } private: - mojo::ReceiverSet<mojom::PhishingDetector> receivers_; + mojo::AssociatedReceiverSet<mojom::PhishingDetector> receivers_; bool phishing_detection_started_ = false; GURL url_; - std::string model_ = ""; - base::ReadOnlySharedMemoryRegion region_ = base::ReadOnlySharedMemoryRegion(); }; class ClientSideDetectionHostTestBase : public ChromeRenderViewHostTestHarness { @@ -299,12 +280,7 @@ : is_incognito_(is_incognito), model_str_("model_str") {} void InitTestApi(content::RenderFrameHost* rfh) { - service_manager::InterfaceProvider* remote_interfaces = - rfh->GetRemoteInterfaces(); - - service_manager::InterfaceProvider::TestApi test_api(remote_interfaces); - - test_api.SetBinderForName( + rfh->GetRemoteAssociatedInterfaces()->OverrideBinderForTesting( mojom::PhishingDetector::Name_, base::BindRepeating(&FakePhishingDetector::BindReceiver, base::Unretained(&fake_phishing_detector_))); @@ -359,6 +335,10 @@ // SafeBrowsingService. content::GetUIThreadTaskRunner({})->DeleteSoon(FROM_HERE, csd_host_.release()); + + // RenderProcessHostCreationObserver expects to be torn down on UI. + content::GetUIThreadTaskRunner({})->DeleteSoon(FROM_HERE, + csd_service_.release()); database_manager_.reset(); ui_manager_.reset(); base::RunLoop().RunUntilIdle(); @@ -1201,29 +1181,6 @@ .min); } -TEST_F(ClientSideDetectionHostTest, TestSendFlatBufferModelToRenderFrame) { - base::MappedReadOnlyRegion mapped_region = - base::ReadOnlySharedMemoryRegion::Create(10); - EXPECT_CALL(*csd_service_, GetModelType()) - .WillRepeatedly(Return(CSDModelType::kFlatbuffer)); - EXPECT_CALL(*csd_service_, GetModelSharedMemoryRegion()) - .WillRepeatedly( - Return(testing::ByMove(mapped_region.region.Duplicate()))); - csd_host_->SendModelToRenderFrame(); - base::RunLoop().RunUntilIdle(); - fake_phishing_detector_.CheckModel(mapped_region.region.Duplicate()); - fake_phishing_detector_.Reset(); -} - -TEST_F(ClientSideDetectionHostTest, TestSendModelToRenderFrame) { - std::string stardard("standard"); - EXPECT_CALL(*csd_service_, GetModelStr()).WillRepeatedly(ReturnRef(stardard)); - csd_host_->SendModelToRenderFrame(); - base::RunLoop().RunUntilIdle(); - fake_phishing_detector_.CheckModel("standard"); - fake_phishing_detector_.Reset(); -} - class ClientSideDetectionHostDebugFeaturesTest : public ClientSideDetectionHostTest { public:
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowIphController.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowIphController.java index 1c667fd..99e41185 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowIphController.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/crow/CrowIphController.java
@@ -79,8 +79,7 @@ private void requestShowCrowIph() { mUserEducationHelper.requestShowIPH( new IPHCommandBuilder(mActivity.getResources(), FeatureConstants.CROW_FEATURE, - // TODO(crbug/1314530): Fix IPH strings once they are finalized. - R.string.link_toggle_iph, R.string.link_toggle_iph) + R.string.crow_iph, R.string.crow_iph) .setAnchorView(mMenuButtonAnchorView) .setOnShowCallback(this::turnOnHighlightForCrowMenuItem) .setOnDismissCallback(this::turnOffHighlightForCrowMenuItem)
diff --git a/chrome/browser/signin/dice_web_signin_interceptor.cc b/chrome/browser/signin/dice_web_signin_interceptor.cc index 0a46efcd..416f814 100644 --- a/chrome/browser/signin/dice_web_signin_interceptor.cc +++ b/chrome/browser/signin/dice_web_signin_interceptor.cc
@@ -541,6 +541,7 @@ } } else if (ShouldShowEnterpriseDialog(info)) { interception_type = SigninInterceptionType::kEnterpriseAcceptManagement; + show_link_data_option = true; RecordSigninInterceptionHeuristicOutcome( SigninInterceptionHeuristicOutcome::kInterceptEnterprise); } else if (!profile_->GetPrefs()->GetBoolean(
diff --git a/chrome/browser/site_isolation/origin_agent_cluster_browsertest.cc b/chrome/browser/site_isolation/origin_agent_cluster_browsertest.cc index c43a0e2..96d5bae 100644 --- a/chrome/browser/site_isolation/origin_agent_cluster_browsertest.cc +++ b/chrome/browser/site_isolation/origin_agent_cluster_browsertest.cc
@@ -121,21 +121,6 @@ std::string origin_list = https_server()->GetURL("isolated.foo.com", "/").spec(); command_line->AppendSwitchASCII(switches::kIsolateOrigins, origin_list); - - // To keep the tests easier to reason about, turn off both the spare - // renderer process and process reuse for subframes in different - // BrowsingInstances. - if (enable_origin_agent_cluster_) { - feature_list_.InitWithFeatures( - /* enable_features */ {features::kOriginIsolationHeader, - features::kDisableProcessReuse}, - /* disable_features */ {features::kSpareRendererForSitePerProcess}); - } else { - feature_list_.InitWithFeatures( - /* enable_features */ {features::kDisableProcessReuse}, - /* disable_features */ {features::kOriginIsolationHeader, - features::kSpareRendererForSitePerProcess}); - } } void SetUpOnMainThread() override { @@ -152,7 +137,22 @@ protected: explicit OriginAgentClusterBrowserTest(bool enable_oac) : https_server_(net::EmbeddedTestServer::TYPE_HTTPS), - enable_origin_agent_cluster_(enable_oac) {} + enable_origin_agent_cluster_(enable_oac) { + // To keep the tests easier to reason about, turn off both the spare + // renderer process and process reuse for subframes in different + // BrowsingInstances. + if (enable_origin_agent_cluster_) { + feature_list_.InitWithFeatures( + /* enable_features */ {features::kOriginIsolationHeader, + features::kDisableProcessReuse}, + /* disable_features */ {features::kSpareRendererForSitePerProcess}); + } else { + feature_list_.InitWithFeatures( + /* enable_features */ {features::kDisableProcessReuse}, + /* disable_features */ {features::kOriginIsolationHeader, + features::kSpareRendererForSitePerProcess}); + } + } private: std::unique_ptr<net::test_server::HttpResponse> HandleResponse(
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index ff28762..932d6a7d 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -5244,6 +5244,11 @@ chrome_image_<ph name="CURRENT_TIMESTAMP_MS">%1$s<ex>1582667748515</ex></ph> </message> + <!-- Share Crow strings --> + <message name="IDS_CROW_IPH" desc="In product help string for Crow feature"> + Show thanks to this creator + </message> + <!-- Chime DFM module strings --> <message name="IDS_CHIME_MODULE_TITLE" desc="Text shown when the chime module is referenced in install start, success, failure UI (e.g. in IDS_MODULE_INSTALL_START_TEXT, which will expand to 'Installing Google Notifications Platform for Chrome…')."> Google Notifications Platform
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CROW_IPH.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CROW_IPH.png.sha1 new file mode 100644 index 0000000..4210738c --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CROW_IPH.png.sha1
@@ -0,0 +1 @@ +d32368d8c5c03709f6432d24d0eb348a2c21f390 \ No newline at end of file
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.cc b/chrome/browser/ui/ash/projector/projector_client_impl.cc index a299d6ca..ba42ba3 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_client_impl.cc
@@ -5,12 +5,14 @@ #include "chrome/browser/ui/ash/projector/projector_client_impl.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/projector/annotator_tool.h" #include "ash/public/cpp/projector/projector_controller.h" #include "ash/public/cpp/projector/projector_new_screencast_precondition.h" #include "ash/webui/projector_app/annotator_message_handler.h" #include "ash/webui/projector_app/projector_app_client.h" #include "ash/webui/projector_app/public/cpp/projector_app_constants.h" +#include "base/bind.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/download/download_prefs.h" #include "chrome/browser/profiles/profile.h" @@ -19,7 +21,11 @@ #include "chrome/browser/ui/ash/projector/projector_utils.h" #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h" +#include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h" +#include "chrome/browser/web_applications/web_app_id.h" +#include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/browser/web_applications/web_app_sync_bridge.h" #include "chromeos/login/login_state/login_state.h" #include "components/soda/soda_installer.h" #include "content/public/browser/download_manager.h" @@ -141,6 +147,14 @@ browser->window()->Minimize(); } +void ProjectorClientImpl::CloseProjectorApp() const { + auto* profile = ProfileManager::GetActiveUserProfile(); + auto* browser = + FindSystemWebAppBrowser(profile, web_app::SystemAppType::PROJECTOR); + if (browser) + browser->window()->Close(); +} + void ProjectorClientImpl::OnNewScreencastPreconditionChanged( const ash::NewScreencastPrecondition& precondition) const { ash::ProjectorAppClient* app_client = ash::ProjectorAppClient::Get(); @@ -217,6 +231,23 @@ MaybeSwitchDriveIntegrationServiceObservation(); } +void ProjectorClientImpl::OnUserSessionStarted(bool is_primary_user) { + if (!is_primary_user || !pref_change_registrar_.IsEmpty()) + return; + Profile* profile = ProfileManager::GetActiveUserProfile(); + pref_change_registrar_.Init(profile->GetPrefs()); + // TOOD(b/232043809): Consider using the disabled system feature policy + // instead. + pref_change_registrar_.Add( + ash::prefs::kProjectorAllowByPolicy, + base::BindRepeating(&ProjectorClientImpl::OnEnablementPolicyChanged, + base::Unretained(this))); + pref_change_registrar_.Add( + ash::prefs::kProjectorDogfoodForFamilyLinkEnabled, + base::BindRepeating(&ProjectorClientImpl::OnEnablementPolicyChanged, + base::Unretained(this))); +} + void ProjectorClientImpl::ActiveUserChanged(user_manager::User* active_user) { // After user login, the first ActiveUserChanged() might be called before // profile is loaded. @@ -237,3 +268,30 @@ drive_observation_.Reset(); drive_observation_.Observe(drive_service); } + +void ProjectorClientImpl::OnEnablementPolicyChanged() { + Profile* profile = ProfileManager::GetActiveUserProfile(); + web_app::SystemWebAppManager& manager = + web_app::WebAppProvider::GetForSystemWebApps(profile) + ->system_web_app_manager(); + const bool is_installed = + manager.IsSystemWebApp(ash::kChromeUITrustedProjectorSwaAppId); + // We can't enable or disable the app if it's not already installed. + if (!is_installed) + return; + + const bool is_enabled = IsProjectorAppEnabled(profile); + // The policy has changed to disallow the Projector app. Since we can't + // uninstall the Projector SWA until the user signs out and back in, we should + // close and disable the app for this current session. + if (!is_enabled) + CloseProjectorApp(); + + absl::optional<web_app::AppId> app_id = + GetAppIdForSystemWebApp(profile, web_app::SystemAppType::PROJECTOR); + if (!app_id) + return; + + auto* web_app_provider = web_app::WebAppProvider::GetForWebApps(profile); + web_app_provider->sync_bridge().SetAppIsDisabled(app_id.value(), !is_enabled); +}
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.h b/chrome/browser/ui/ash/projector/projector_client_impl.h index 6c471b5..8ffcdcc 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl.h +++ b/chrome/browser/ui/ash/projector/projector_client_impl.h
@@ -15,6 +15,7 @@ #include "base/scoped_observation.h" #include "chrome/browser/ash/drive/drive_integration_service.h" #include "chrome/browser/speech/speech_recognizer_delegate.h" +#include "components/prefs/pref_change_registrar.h" #include "components/session_manager/core/session_manager.h" #include "components/session_manager/core/session_manager_observer.h" #include "components/soda/constants.h" @@ -56,6 +57,7 @@ bool IsDriveFsMountFailed() const override; void OpenProjectorApp() const override; void MinimizeProjectorApp() const override; + void CloseProjectorApp() const override; void OnNewScreencastPreconditionChanged( const ash::NewScreencastPrecondition& precondition) const override; void SetAnnotatorMessageHandler( @@ -85,6 +87,7 @@ // session_manager::SessionManagerObserver: void OnUserProfileLoaded(const AccountId& account_id) override; + void OnUserSessionStarted(bool is_primary_user) override; // user_manager::UserManager::UserSessionStateObserver: void ActiveUserChanged(user_manager::User* active_user) override; @@ -94,6 +97,10 @@ // of active profile when ActiveUserChanged and OnUserProfileLoaded. void MaybeSwitchDriveIntegrationServiceObservation(); + // Called when any of the policies change that control whether the Projector + // app is enabled. + void OnEnablementPolicyChanged(); + ash::ProjectorController* const controller_; ash::AnnotatorMessageHandler* message_handler_; SpeechRecognizerStatus recognizer_status_ = @@ -106,6 +113,8 @@ session_manager::SessionManagerObserver> session_observation_{this}; + PrefChangeRegistrar pref_change_registrar_; + base::ScopedObservation<drive::DriveIntegrationService, drive::DriveIntegrationServiceObserver> drive_observation_{this};
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl_browsertest.cc b/chrome/browser/ui/ash/projector/projector_client_impl_browsertest.cc index fdc1c45c..79bc3c7 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl_browsertest.cc +++ b/chrome/browser/ui/ash/projector/projector_client_impl_browsertest.cc
@@ -7,6 +7,7 @@ #include <memory> #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "ash/projector/test/mock_projector_client.h" #include "ash/public/cpp/projector/projector_client.h" #include "ash/public/cpp/projector/projector_new_screencast_precondition.h" @@ -15,8 +16,13 @@ #include "base/callback_forward.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" +#include "chrome/browser/apps/app_service/app_icon/app_icon_factory.h" +#include "chrome/browser/apps/app_service/app_service_proxy.h" +#include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/ash/drive/drive_integration_service.h" #include "chrome/browser/ash/drive/drivefs_test_support.h" +#include "chrome/browser/ash/login/test/fake_gaia_mixin.h" +#include "chrome/browser/ash/login/test/logged_in_user_mixin.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/ash/projector/projector_app_client_impl.h" #include "chrome/browser/ui/browser.h" @@ -25,9 +31,15 @@ #include "chrome/browser/ui/web_applications/system_web_app_ui_utils.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_manager.h" #include "chrome/browser/web_applications/system_web_apps/system_web_app_types.h" +#include "chrome/browser/web_applications/web_app_id.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/account_id/account_id.h" +#include "components/services/app_service/public/cpp/app_registry_cache.h" +#include "components/services/app_service/public/cpp/app_types.h" +#include "components/services/app_service/public/cpp/icon_types.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" #include "content/public/common/page_type.h" @@ -38,6 +50,25 @@ namespace ash { +namespace { + +apps::AppServiceProxy* GetAppServiceProxy(Profile* profile) { + return apps::AppServiceProxyFactory::GetForProfile(profile); +} + +// Returns the account id for logging in. +absl::optional<AccountId> GetPrimaryAccountId(bool is_managed) { + if (is_managed) { + return AccountId::FromUserEmailGaiaId( + ash::FakeGaiaMixin::kEnterpriseUser1, + ash::FakeGaiaMixin::kEnterpriseUser1GaiaId); + } + // Use the default FakeGaiaMixin::kFakeUserEmail consumer test account id. + return absl::nullopt; +} + +} // namespace + // A class helps to verify enable/disable Drive could invoke // ProjectorAppClient::Observer::OnDriveFsMountStatusChanged(). class DriveFsMountStatusWaiter : public ProjectorAppClient::Observer { @@ -194,6 +225,31 @@ EXPECT_TRUE(app_browser->window()->IsMinimized()); } +IN_PROC_BROWSER_TEST_F(ProjectorClientTest, CloseProjectorApp) { + auto* profile = browser()->profile(); + web_app::WebAppProvider::GetForTest(profile) + ->system_web_app_manager() + .InstallSystemAppsForTesting(); + + client()->OpenProjectorApp(); + web_app::FlushSystemWebAppLaunchesForTesting(profile); + + // Verify that Projector App is opened. + Browser* app_browser = + FindSystemWebAppBrowser(profile, web_app::SystemAppType::PROJECTOR); + ASSERT_TRUE(app_browser); + content::WebContents* tab = + app_browser->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(tab); + EXPECT_EQ(tab->GetController().GetVisibleEntry()->GetPageType(), + content::PAGE_TYPE_NORMAL); + + EXPECT_FALSE(app_browser->IsAttemptingToCloseBrowser()); + client()->CloseProjectorApp(); + // Verify that Projector App is closing. + EXPECT_TRUE(app_browser->IsAttemptingToCloseBrowser()); +} + IN_PROC_BROWSER_TEST_F(ProjectorClientTest, GetDriveFsMountPointPath) { ASSERT_TRUE(client()->IsDriveFsMounted()); ASSERT_FALSE(client()->IsDriveFsMountFailed()); @@ -225,4 +281,123 @@ } } +// Tests Projector client for child and managed users. +class ProjectorClientManagedTest + : public MixinBasedInProcessBrowserTest, + public testing::WithParamInterface</*IsChild=*/bool> { + protected: + void SetUpOnMainThread() override { + MixinBasedInProcessBrowserTest::SetUpOnMainThread(); + logged_in_user_mixin_.LogInUser(); + } + + bool is_child() const { return GetParam(); } + + bool is_managed() const { return !is_child(); } + + ProjectorClient* client() { return ProjectorClient::Get(); } + + std::string GetPolicy() { + if (is_child()) + return ash::prefs::kProjectorDogfoodForFamilyLinkEnabled; + return ash::prefs::kProjectorAllowByPolicy; + } + + apps::Readiness GetAppReadiness(const web_app::AppId& app_id) { + apps::Readiness readiness; + bool app_found = + GetAppServiceProxy(browser()->profile()) + ->AppRegistryCache() + .ForOneApp(app_id, [&readiness](const apps::AppUpdate& update) { + readiness = update.Readiness(); + }); + EXPECT_TRUE(app_found); + return readiness; + } + + absl::optional<apps::IconKey> GetAppIconKey(const web_app::AppId& app_id) { + absl::optional<apps::IconKey> icon_key; + bool app_found = + GetAppServiceProxy(browser()->profile()) + ->AppRegistryCache() + .ForOneApp(app_id, [&icon_key](const apps::AppUpdate& update) { + icon_key = update.IconKey(); + }); + EXPECT_TRUE(app_found); + return icon_key; + } + + private: + LoggedInUserMixin logged_in_user_mixin_{ + &mixin_host_, + is_child() ? LoggedInUserMixin::LogInType::kChild + : LoggedInUserMixin::LogInType::kRegular, + embedded_test_server(), + this, + /*should_launch_browser=*/true, + GetPrimaryAccountId(is_managed())}; +}; + +IN_PROC_BROWSER_TEST_P(ProjectorClientManagedTest, + CantOpenProjectorAppWithoutPolicy) { + auto* profile = browser()->profile(); + web_app::WebAppProvider::GetForTest(profile) + ->system_web_app_manager() + .InstallSystemAppsForTesting(); + + client()->OpenProjectorApp(); + web_app::FlushSystemWebAppLaunchesForTesting(profile); + + // Verify that Projector App is not opened. + Browser* app_browser = + FindSystemWebAppBrowser(profile, web_app::SystemAppType::PROJECTOR); + EXPECT_FALSE(app_browser); +} + +// Prevents a regression to b/230779397. +IN_PROC_BROWSER_TEST_P(ProjectorClientManagedTest, DisableThenEnablePolicy) { + auto* profile = browser()->profile(); + profile->GetPrefs()->SetBoolean(GetPolicy(), true); + web_app::WebAppProvider::GetForTest(profile) + ->system_web_app_manager() + .InstallSystemAppsForTesting(); + + client()->OpenProjectorApp(); + web_app::FlushSystemWebAppLaunchesForTesting(profile); + + // Verify the user can open the Projector App when the policy is enabled. + Browser* app_browser = + FindSystemWebAppBrowser(profile, web_app::SystemAppType::PROJECTOR); + ASSERT_TRUE(app_browser); + content::WebContents* tab = + app_browser->tab_strip_model()->GetActiveWebContents(); + ASSERT_TRUE(tab); + EXPECT_EQ(tab->GetController().GetVisibleEntry()->GetPageType(), + content::PAGE_TYPE_NORMAL); + + // Suppose the policy flips to false while the user is still signed in and has + // the Projector app open. + profile->GetPrefs()->SetBoolean(GetPolicy(), false); + // The Projector app immediately closes to prevent further access. + EXPECT_TRUE(app_browser->IsAttemptingToCloseBrowser()); + // We can't uninstall the Projector SWA until the next session, but the icon + // is greyed out and disabled. + EXPECT_EQ(apps::Readiness::kDisabledByPolicy, + GetAppReadiness(kChromeUITrustedProjectorSwaAppId)); + EXPECT_TRUE(apps::IconEffects::kBlocked & + GetAppIconKey(kChromeUITrustedProjectorSwaAppId)->icon_effects); + + // The app can re-enable too if it's already installed and the policy flips to + // true. + profile->GetPrefs()->SetBoolean(GetPolicy(), true); + EXPECT_EQ(apps::Readiness::kReady, + GetAppReadiness(kChromeUITrustedProjectorSwaAppId)); + EXPECT_FALSE(apps::IconEffects::kBlocked & + GetAppIconKey(kChromeUITrustedProjectorSwaAppId)->icon_effects); +} + +INSTANTIATE_TEST_SUITE_P(, + ProjectorClientManagedTest, + /*IsChild=*/testing::Bool()); + } // namespace ash
diff --git a/chrome/browser/ui/side_search/side_search_metrics.cc b/chrome/browser/ui/side_search/side_search_metrics.cc index bc90fb0..dafcb47 100644 --- a/chrome/browser/ui/side_search/side_search_metrics.cc +++ b/chrome/browser/ui/side_search/side_search_metrics.cc
@@ -11,6 +11,12 @@ base::UmaHistogramEnumeration("SideSearch.AvailabilityChanged", type); } +void RecordSideSearchPageActionLabelVisibilityOnToggle( + SideSearchPageActionLabelVisibility label_visibility) { + base::UmaHistogramEnumeration( + "SideSearch.PageActionIcon.LabelVisibleWhenToggled", label_visibility); +} + void RecordSideSearchOpenAction(SideSearchOpenActionType action) { base::UmaHistogramEnumeration("SideSearch.OpenAction", action); }
diff --git a/chrome/browser/ui/side_search/side_search_metrics.h b/chrome/browser/ui/side_search/side_search_metrics.h index 6d386df..959a093 100644 --- a/chrome/browser/ui/side_search/side_search_metrics.h +++ b/chrome/browser/ui/side_search/side_search_metrics.h
@@ -14,6 +14,12 @@ kMaxValue = kBecomeUnavailable }; +enum class SideSearchPageActionLabelVisibility { + kNotVisible = 0, + kVisible = 1, + kMaxValue = kVisible +}; + enum class SideSearchOpenActionType { kTapOnSideSearchToolbarButton = 0, kMaxValue = kTapOnSideSearchToolbarButton @@ -33,6 +39,8 @@ // End of enums for histograms. void RecordSideSearchAvailabilityChanged(SideSearchAvailabilityChangeType type); +void RecordSideSearchPageActionLabelVisibilityOnToggle( + SideSearchPageActionLabelVisibility label_visibility); void RecordSideSearchOpenAction(SideSearchOpenActionType action); void RecordSideSearchCloseAction(SideSearchCloseActionType action); void RecordSideSearchNavigation(SideSearchNavigationType type);
diff --git a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc index 019c18d..614e80e 100644 --- a/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc +++ b/chrome/browser/ui/signin/dice_web_signin_interceptor_delegate.cc
@@ -47,9 +47,10 @@ bubble_parameters, base::OnceCallback<void(SigninInterceptionResult)> callback) : browser_(browser), - force_new_profile_(bubble_parameters.interception_type == - DiceWebSigninInterceptor::SigninInterceptionType:: - kEnterpriseForced), + profile_creation_required_by_policy_( + bubble_parameters.interception_type == + DiceWebSigninInterceptor::SigninInterceptionType:: + kEnterpriseForced), show_link_data_option_(bubble_parameters.show_link_data_option), callback_(std::move(callback)) { DCHECK(browser_); @@ -69,7 +70,8 @@ void ShowEnterpriseProfileInterceptionDialog(const AccountInfo& account_info, SkColor profile_color) { browser_->signin_view_controller()->ShowModalEnterpriseConfirmationDialog( - account_info, force_new_profile_, show_link_data_option_, profile_color, + account_info, profile_creation_required_by_policy_, + show_link_data_option_, profile_color, base::BindOnce(&ForcedEnterpriseSigninInterceptionHandle:: OnEnterpriseInterceptionDialogClosed, base::Unretained(this))); @@ -81,7 +83,7 @@ std::move(callback_).Run(SigninInterceptionResult::kAccepted); break; case signin::SIGNIN_CHOICE_CONTINUE: - DCHECK(!force_new_profile_ || show_link_data_option_); + DCHECK(!profile_creation_required_by_policy_ || show_link_data_option_); std::move(callback_).Run( SigninInterceptionResult::kAcceptedWithExistingProfile); break; @@ -96,7 +98,7 @@ } raw_ptr<Browser> browser_; - const bool force_new_profile_; + const bool profile_creation_required_by_policy_; const bool show_link_data_option_; base::OnceCallback<void(SigninInterceptionResult)> callback_; };
diff --git a/chrome/browser/ui/signin_view_controller.h b/chrome/browser/ui/signin_view_controller.h index 3e73b08..8974d9f5 100644 --- a/chrome/browser/ui/signin_view_controller.h +++ b/chrome/browser/ui/signin_view_controller.h
@@ -145,9 +145,12 @@ // top of the `browser_`'s window. `domain_name` is the domain of the // enterprise account being shown. `callback` is called with the user's action // on the dialog. + // If `profile_creation_required_by_policy` is true, the wording of the dialog + // will tell the user that an admin requires a new profile for the account, + // otherwise the default wording will be used. void ShowModalEnterpriseConfirmationDialog( const AccountInfo& account_info, - bool force_new_profile, + bool profile_creation_required_by_policy, bool show_link_data_option, SkColor profile_color, signin::SigninChoiceCallback callback);
diff --git a/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_button.cc b/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_button.cc index e16582b..60515f9 100644 --- a/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_button.cc +++ b/chrome/browser/ui/views/bookmarks/saved_tab_groups/saved_tab_group_button.cc
@@ -20,6 +20,7 @@ #include "ui/gfx/animation/slide_animation.h" #include "ui/gfx/canvas.h" #include "ui/gfx/geometry/point.h" +#include "ui/gfx/geometry/point_f.h" #include "ui/gfx/geometry/size.h" #include "ui/views/controls/button/label_button_border.h" #include "ui/views/controls/button/menu_button.h" @@ -29,6 +30,11 @@ constexpr float kBorderRadius = 4.5f; constexpr float kButtonRadius = 5.0f; constexpr float kBorderThickness = 2.0f; + +// This value comes from tab_group_header.cc as kEmptyChipSize. Since this +// button and the tab_group_header are rendered on different surfaces, keep the +// value here in case we want to change one but not the other. +constexpr float kCircleRadius = 14.0f; } // namespace SavedTabGroupButton::SavedTabGroupButton(PressedCallback callback, @@ -66,8 +72,15 @@ show_animation_->Show(); } - SetSize(gfx::Size(GetPreferredSize().width(), - GetLayoutConstant(BOOKMARK_BAR_BUTTON_HEIGHT))); + int button_height = GetLayoutConstant(BOOKMARK_BAR_BUTTON_HEIGHT); + if (GetText().empty()) { + // When the text is empty force the button to have square dimensions. + // Likewise, we already have a constant that denotes the standard button + // height for all elements in the bookmarks bar. As such, we will use this + // constant for the width of the button to create a square that will + // comfortably fit in the bookmarks bar. + SetPreferredSize(gfx::Size(button_height, button_height)); + } } SavedTabGroupButton::~SavedTabGroupButton() = default; @@ -93,6 +106,7 @@ void SavedTabGroupButton::OnPaintBackground(gfx::Canvas* canvas) { const ui::ThemeProvider* const tp = GetThemeProvider(); + gfx::PointF center_point_f = gfx::PointF(width() / 2, height() / 2); gfx::RectF rect_f = gfx::RectF(width(), height()); rect_f.Inset(1.0f); @@ -110,14 +124,23 @@ flags.setColor(background_color); canvas->DrawRoundRect(rect_f, kButtonRadius, flags); - if (is_group_in_tabstrip_) { - // Draw border. - flags.setStyle(cc::PaintFlags::kStroke_Style); - flags.setColor(text_and_outline_color); - flags.setStrokeWidth(kBorderThickness); - canvas->DrawRoundRect(rect_f, kBorderRadius, flags); + // At the time this was written, all non-background elements share the same + // color. As such, we can set the color once here. + flags.setColor(text_and_outline_color); + + if (GetText().empty()) { + // When the title is empty, we draw a circle similar to the tab group header + // when there is no title. + canvas->DrawCircle(gfx::PointF(width() / 2, width() / 2), kCircleRadius / 2, + flags); } + // Draw border. + flags.setStyle(cc::PaintFlags::kStroke_Style); + flags.setStrokeWidth(kBorderThickness); + if (is_group_in_tabstrip_) + canvas->DrawRoundRect(rect_f, kBorderRadius, flags); + if (GetState() == STATE_HOVERED) { // TODO: Draw a box shadow on hover. return;
diff --git a/chrome/browser/ui/views/intent_picker_bubble_view.cc b/chrome/browser/ui/views/intent_picker_bubble_view.cc index 9e4d4ee..fabf6344 100644 --- a/chrome/browser/ui/views/intent_picker_bubble_view.cc +++ b/chrome/browser/ui/views/intent_picker_bubble_view.cc
@@ -133,24 +133,11 @@ intent_picker_bubble_->Initialize(); views::Widget* widget = views::BubbleDialogDelegateView::CreateBubble(intent_picker_bubble_); - // TODO(aleventhal) Should not need to be focusable as only descendant widgets - // are interactive; however, it does call RequestFocus(). If it is going to be - // focusable, it needs an accessible name so that it can pass accessibility - // checks. Use the same accessible name as the icon. Set the role as kDialog - // to ensure screen readers immediately announce the text of this view. - intent_picker_bubble_->GetViewAccessibility().OverrideRole( - ax::mojom::Role::kDialog); + if (bubble_type == BubbleType::kClickToCall) { - intent_picker_bubble_->GetViewAccessibility().OverrideName( - l10n_util::GetStringUTF16( - IDS_BROWSER_SHARING_CLICK_TO_CALL_DIALOG_TITLE_LABEL)); ClickToCallUiController::GetOrCreateFromWebContents(web_contents) ->ClearLastDialog(); - } else { - intent_picker_bubble_->GetViewAccessibility().OverrideName( - l10n_util::GetStringUTF16(IDS_TOOLTIP_INTENT_PICKER_ICON)); } - intent_picker_bubble_->SetFocusBehavior(View::FocusBehavior::ALWAYS); DCHECK(intent_picker_bubble_->HasCandidates()); widget->Show(); @@ -266,7 +253,6 @@ void IntentPickerBubbleView::AppButtonPressed(size_t index, const ui::Event& event) { SetSelectedAppIndex(index, &event); - RequestFocus(); if ((event.IsMouseEvent() && event.AsMouseEvent()->GetClickCount() == 2) || (event.IsGestureEvent() && event.AsGestureEvent()->details().tap_count() == 2)) {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc index 270f8a39..87ecd19 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_signed_in_flow_controller.cc
@@ -165,8 +165,9 @@ /*browser=*/nullptr, type, IdentityManagerFactory::GetForProfile(profile_) ->FindExtendedAccountInfoByEmailAddress(email_), - /*force_new_profile_=*/false, /*show_link_data_option=*/false, - GetProfileColor(), std::move(proceed_callback)); + /*profile_creation_required_by_policy=*/false, + /*show_link_data_option=*/false, GetProfileColor(), + std::move(proceed_callback)); } bool ProfilePickerSignedInFlowController::IsInitialized() const {
diff --git a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc index 282fcc1..368d23b 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_turn_sync_on_delegate.cc
@@ -248,7 +248,7 @@ return; } - DCHECK_EQ(choice, signin::SIGNIN_CHOICE_CONTINUE); + DCHECK_EQ(choice, signin::SIGNIN_CHOICE_NEW_PROFILE); switch (type) { case EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled:
diff --git a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc index a83b72eb..87f721d 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_view_browsertest.cc
@@ -1347,7 +1347,7 @@ profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed( /*expected_type=*/ EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled, - /*choice=*/signin::SIGNIN_CHOICE_CONTINUE); + /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); WaitForLoadStop(GetSyncConfirmationURL()); // Simulate finishing the flow with "No, thanks". @@ -1404,7 +1404,7 @@ profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed( /*expected_type=*/ EnterpriseProfileWelcomeUI::ScreenType::kConsumerAccountSyncDisabled, - /*choice=*/signin::SIGNIN_CHOICE_CONTINUE); + /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); Browser* new_browser = BrowserAddedWaiter(2u).Wait(); WaitForLoadStop(GURL("chrome://newtab/"), @@ -1456,7 +1456,7 @@ profiles::testing::ExpectPickerWelcomeScreenTypeAndProceed( /*expected_type=*/ EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled, - /*choice=*/signin::SIGNIN_CHOICE_CONTINUE); + /*choice=*/signin::SIGNIN_CHOICE_NEW_PROFILE); WaitForLoadStop(GetSyncConfirmationURL()); // Simulate finishing the flow with "Configure sync".
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc index df5e8ca..27dbd7ff 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc +++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.cc
@@ -146,7 +146,7 @@ SigninViewControllerDelegateViews::CreateEnterpriseConfirmationWebView( Browser* browser, const AccountInfo& account_info, - bool force_new_profile, + bool profile_creation_required_by_policy, bool show_link_data_option, SkColor profile_color, signin::SigninChoiceCallback callback) { @@ -164,8 +164,8 @@ web_dialog_ui->Initialize( browser, EnterpriseProfileWelcomeUI::ScreenType::kEnterpriseAccountCreation, - account_info, force_new_profile, show_link_data_option, profile_color, - std::move(callback)); + account_info, profile_creation_required_by_policy, show_link_data_option, + profile_color, std::move(callback)); return web_view; } @@ -425,14 +425,14 @@ SigninViewControllerDelegate::CreateEnterpriseConfirmationDelegate( Browser* browser, const AccountInfo& account_info, - bool force_new_profile, + bool profile_creation_required_by_policy, bool show_link_data_option, SkColor profile_color, signin::SigninChoiceCallback callback) { return new SigninViewControllerDelegateViews( SigninViewControllerDelegateViews::CreateEnterpriseConfirmationWebView( - browser, account_info, force_new_profile, show_link_data_option, - profile_color, std::move(callback)), + browser, account_info, profile_creation_required_by_policy, + show_link_data_option, profile_color, std::move(callback)), browser, ui::MODAL_TYPE_WINDOW, true, false); } #endif
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h index 3c2ca81..824097c 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h +++ b/chrome/browser/ui/views/profiles/signin_view_controller_delegate_views.h
@@ -76,7 +76,7 @@ static std::unique_ptr<views::WebView> CreateEnterpriseConfirmationWebView( Browser* browser, const AccountInfo& account_info, - bool force_new_profile, + bool profile_creation_required_by_policy, bool show_link_data_option, SkColor profile_color, signin::SigninChoiceCallback callback);
diff --git a/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc b/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc index c502189f..261f32e5 100644 --- a/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/side_search/side_search_browser_controller_interactive_uitest.cc
@@ -23,6 +23,7 @@ #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel/side_panel.h" #include "chrome/browser/ui/views/side_panel/side_panel_web_ui_view.h" +#include "chrome/browser/ui/views/side_search/side_search_icon_view.h" #include "chrome/browser/ui/views/toolbar/side_panel_toolbar_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/common/webui_url_constants.h" @@ -746,6 +747,57 @@ EXPECT_NE(nullptr, GetSidePanelContentsFor(browser(), 0)); } +// Only test the side search icon view chip in the DSE configuration. +using SideSearchIconViewTest = SideSearchBrowserControllerTest; +INSTANTIATE_TEST_SUITE_P(All, SideSearchIconViewTest, testing::Values(true)); + +// Tests that metrics correctly capture whether the label was visible when the +// entrypoint was toggled. +IN_PROC_BROWSER_TEST_P(SideSearchIconViewTest, + LabelVisibilityMetricsCorrectlyEmittedWhenToggled) { + auto* button_view = GetSidePanelButtonFor(browser()); + ASSERT_NE(nullptr, button_view); + auto* icon_view = views::AsViewClass<SideSearchIconView>(button_view); + + // Get the browser into a state where the icon view is visible. + NavigateActiveTab(browser(), GetNonMatchingUrl()); + ASSERT_FALSE(icon_view->GetVisible()); + NavigateActiveTab(browser(), GetMatchingSearchUrl()); + NavigateActiveTab(browser(), GetNonMatchingUrl()); + EXPECT_TRUE(icon_view->GetVisible()); + + // Show the icon's label and toggle the side panel. It should correctly log + // being shown while the label was visible. + EXPECT_TRUE(icon_view->GetVisible()); + icon_view->SetLabelVisibilityForTesting(true); + NotifyButtonClick(browser()); + EXPECT_TRUE(GetSidePanelFor(browser())->GetVisible()); + histogram_tester_.ExpectBucketCount( + "SideSearch.PageActionIcon.LabelVisibleWhenToggled", + SideSearchPageActionLabelVisibility::kVisible, 1); + histogram_tester_.ExpectBucketCount( + "SideSearch.PageActionIcon.LabelVisibleWhenToggled", + SideSearchPageActionLabelVisibility::kNotVisible, 0); + + // Close the side panel. + NotifyCloseButtonClick(browser()); + EXPECT_TRUE(icon_view->GetVisible()); + EXPECT_FALSE(GetSidePanelFor(browser())->GetVisible()); + + // Hide the icon's label and toggle the side panel. It should correctly log + // being shown while the label was hidden. + EXPECT_TRUE(icon_view->GetVisible()); + icon_view->SetLabelVisibilityForTesting(false); + NotifyButtonClick(browser()); + EXPECT_TRUE(GetSidePanelFor(browser())->GetVisible()); + histogram_tester_.ExpectBucketCount( + "SideSearch.PageActionIcon.LabelVisibleWhenToggled", + SideSearchPageActionLabelVisibility::kVisible, 1); + histogram_tester_.ExpectBucketCount( + "SideSearch.PageActionIcon.LabelVisibleWhenToggled", + SideSearchPageActionLabelVisibility::kNotVisible, 1); +} + // Fixture for testing side panel clobbering behavior with global panels. class SideSearchDSEClobberingTest : public SideSearchBrowserControllerTest { public:
diff --git a/chrome/browser/ui/views/side_search/side_search_icon_view.cc b/chrome/browser/ui/views/side_search/side_search_icon_view.cc index 12dc6fe..1d036cfe 100644 --- a/chrome/browser/ui/views/side_search/side_search_icon_view.cc +++ b/chrome/browser/ui/views/side_search/side_search_icon_view.cc
@@ -7,6 +7,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/side_search/side_search_config.h" +#include "chrome/browser/ui/side_search/side_search_metrics.h" #include "chrome/browser/ui/side_search/side_search_tab_contents_helper.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_search/side_search_browser_controller.h" @@ -42,6 +43,10 @@ SideSearchIconView::~SideSearchIconView() = default; +void SideSearchIconView::SetLabelVisibilityForTesting(bool visible) { + label()->SetVisible(visible); +} + void SideSearchIconView::UpdateImpl() { content::WebContents* active_contents = GetWebContents(); if (!active_contents) @@ -78,6 +83,9 @@ void SideSearchIconView::OnExecuting(PageActionIconView::ExecuteSource source) { auto* side_search_browser_controller = BrowserView::GetBrowserViewForBrowser(browser_)->side_search_controller(); + RecordSideSearchPageActionLabelVisibilityOnToggle( + label()->GetVisible() ? SideSearchPageActionLabelVisibility::kVisible + : SideSearchPageActionLabelVisibility::kNotVisible); side_search_browser_controller->ToggleSidePanel(); }
diff --git a/chrome/browser/ui/views/side_search/side_search_icon_view.h b/chrome/browser/ui/views/side_search/side_search_icon_view.h index 43f91ee..788f534 100644 --- a/chrome/browser/ui/views/side_search/side_search_icon_view.h +++ b/chrome/browser/ui/views/side_search/side_search_icon_view.h
@@ -27,6 +27,8 @@ SideSearchIconView& operator=(const SideSearchIconView&) = delete; ~SideSearchIconView() override; + void SetLabelVisibilityForTesting(bool visible); + protected: // PageActionIconView: void UpdateImpl() override;
diff --git a/chrome/browser/ui/views/task_manager_view.cc b/chrome/browser/ui/views/task_manager_view.cc index 320a09b..d697ac62 100644 --- a/chrome/browser/ui/views/task_manager_view.cc +++ b/chrome/browser/ui/views/task_manager_view.cc
@@ -124,6 +124,12 @@ } void TaskManagerView::SetColumnVisibility(int column_id, bool new_visibility) { + // Check if there is at least 1 visible column before changing the visibility. + // If this column would be the last column to be visible and its hiding, then + // prevent this column visibility change. see crbug.com/1320307 for details. + if (!new_visibility && tab_table_->visible_columns().size() <= 1) + return; + tab_table_->SetColumnVisibility(column_id, new_visibility); }
diff --git a/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc b/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc index ac822772..174e523 100644 --- a/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc +++ b/chrome/browser/ui/views/translate/partial_translate_bubble_view.cc
@@ -306,7 +306,7 @@ } } -void PartialTranslateBubbleView::OnWidgetClosing(views::Widget* widget) { +void PartialTranslateBubbleView::OnWidgetDestroying(views::Widget* widget) { // Nothing to do. When partial translate metrics get added we may want to log // when and how the bubble is closed similar to TranslateBubbleView. return;
diff --git a/chrome/browser/ui/views/translate/partial_translate_bubble_view.h b/chrome/browser/ui/views/translate/partial_translate_bubble_view.h index 0fb26b8..a21b41fd 100644 --- a/chrome/browser/ui/views/translate/partial_translate_bubble_view.h +++ b/chrome/browser/ui/views/translate/partial_translate_bubble_view.h
@@ -71,7 +71,7 @@ bool ShouldShowWindowTitle() const override; bool AcceleratorPressed(const ui::Accelerator& accelerator) override; gfx::Size CalculatePreferredSize() const override; - void OnWidgetClosing(views::Widget* widget) override; + void OnWidgetDestroying(views::Widget* widget) override; // ui::SimpleMenuModel::Delegate: void ExecuteCommand(int command_id, int event_flags) override;
diff --git a/chrome/browser/ui/webui/connectors_internals/connectors_internals.mojom b/chrome/browser/ui/webui/connectors_internals/connectors_internals.mojom index c15a6f7..deb393f 100644 --- a/chrome/browser/ui/webui/connectors_internals/connectors_internals.mojom +++ b/chrome/browser/ui/webui/connectors_internals/connectors_internals.mojom
@@ -47,8 +47,8 @@ // Information around the state of the device trust signing key. KeyInfo key_info; - // Dictionary containing device signals. - map<string, string> signals_dictionary; + // Json string of the device signals. + string signals_json; }; // Browser interface for the page. Consists of calls for data and hooks for
diff --git a/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.cc b/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.cc index f909e5d..6fe7071 100644 --- a/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.cc +++ b/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.cc
@@ -5,7 +5,8 @@ #include "chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.h" #include "base/check.h" -#include "base/containers/flat_map.h" +#include "base/json/json_writer.h" +#include "base/values.h" #include "build/build_config.h" #include "chrome/browser/enterprise/connectors/device_trust/device_trust_service.h" #include "chrome/browser/enterprise/connectors/device_trust/device_trust_service_factory.h" @@ -41,7 +42,7 @@ UNSUPPORTED, connectors_internals::mojom::KeyTrustLevel::UNSPECIFIED, connectors_internals::mojom::KeyType::UNKNOWN), - base::flat_map<std::string, std::string>()); + std::string()); std::move(callback).Run(std::move(state)); return; } @@ -57,10 +58,12 @@ void ConnectorsInternalsPageHandler::OnSignalsCollected( GetZeroTrustStateCallback callback, bool is_device_trust_enabled, - std::unique_ptr<SignalsType> signals) { + const base::Value::Dict signals) { + std::string signals_json; + base::JSONWriter::WriteWithOptions( + signals, base::JSONWriter::OPTIONS_PRETTY_PRINT, &signals_json); auto state = connectors_internals::mojom::ZeroTrustState::New( - is_device_trust_enabled, utils::GetKeyInfo(), - utils::SignalsToMap(std::move(signals))); + is_device_trust_enabled, utils::GetKeyInfo(), signals_json); std::move(callback).Run(std::move(state)); }
diff --git a/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.h b/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.h index 1ff73bc9..c7df4734 100644 --- a/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.h +++ b/chrome/browser/ui/webui/connectors_internals/connectors_internals_page_handler.h
@@ -7,7 +7,7 @@ #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" +#include "base/values.h" #include "chrome/browser/ui/webui/connectors_internals/connectors_internals.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -37,7 +37,7 @@ void OnSignalsCollected(GetZeroTrustStateCallback callback, bool is_device_trust_enabled, - std::unique_ptr<SignalsType> signals); + const base::Value::Dict signals); mojo::Receiver<connectors_internals::mojom::PageHandler> receiver_; raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.cc b/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.cc index 66aba70..84862c7 100644 --- a/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.cc +++ b/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.cc
@@ -4,9 +4,6 @@ #include "chrome/browser/ui/webui/connectors_internals/zero_trust_utils.h" -#include "base/containers/span.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_util.h" #include "build/build_config.h" #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) @@ -25,47 +22,6 @@ namespace { -using google::protobuf::RepeatedPtrField; - -void TrySetSignal(base::flat_map<std::string, std::string>& map, - const std::string& key, - bool has_value, - const std::string& string_value) { - if (has_value) { - map[key] = string_value; - } -} - -void TrySetSignal(base::flat_map<std::string, std::string>& map, - const std::string& key, - bool has_value, - bool bool_value) { - if (has_value) { - map[key] = bool_value ? "true" : "false"; - } -} - -void TrySetSignal(base::flat_map<std::string, std::string>& map, - const std::string& key, - bool has_value, - int int_value) { - if (has_value) { - map[key] = base::NumberToString(int_value); - } -} - -// Encodes repeated fields into a single string with values separated by commas. -void TrySetSignal(base::flat_map<std::string, std::string>& map, - const std::string& key, - const RepeatedPtrField<std::string>& values) { - if (values.empty()) { - return; - } - - map[key] = base::JoinString( - std::vector<base::StringPiece>(values.begin(), values.end()), ", "); -} - #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) connectors_internals::mojom::KeyTrustLevel ParseTrustLevel( @@ -96,80 +52,6 @@ } // namespace -base::flat_map<std::string, std::string> SignalsToMap( - std::unique_ptr<SignalsType> signals) { - base::flat_map<std::string, std::string> map; - - if (!signals) { - return map; - } - - TrySetSignal(map, "device_id", signals->has_device_id(), - signals->device_id()); - TrySetSignal(map, "obfuscated_customer_id", - signals->has_obfuscated_customer_id(), - signals->obfuscated_customer_id()); - TrySetSignal(map, "serial_number", signals->has_serial_number(), - signals->serial_number()); - TrySetSignal(map, "display_name", signals->has_display_name(), - signals->display_name()); - TrySetSignal(map, "os", signals->has_os(), signals->os()); - TrySetSignal(map, "os_version", signals->has_os_version(), - signals->os_version()); - TrySetSignal(map, "device_manufacturer", signals->has_device_manufacturer(), - signals->device_manufacturer()); - TrySetSignal(map, "device_model", signals->has_device_model(), - signals->device_model()); - TrySetSignal(map, "imei", signals->imei()); - TrySetSignal(map, "meid", signals->meid()); - TrySetSignal(map, "tpm_hash", signals->has_tpm_hash(), signals->tpm_hash()); - TrySetSignal(map, "is_disk_encrypted", signals->has_is_disk_encrypted(), - signals->is_disk_encrypted()); - TrySetSignal(map, "allow_screen_lock", signals->has_allow_screen_lock(), - signals->allow_screen_lock()); - TrySetSignal(map, "is_protected_by_password", - signals->has_is_protected_by_password(), - signals->is_protected_by_password()); - TrySetSignal(map, "is_jailbroken", signals->has_is_jailbroken(), - signals->is_jailbroken()); - TrySetSignal(map, "enrollment_domain", signals->has_enrollment_domain(), - signals->enrollment_domain()); - TrySetSignal(map, "browser_version", signals->has_browser_version(), - signals->browser_version()); - TrySetSignal(map, "safe_browsing_protection_level", - signals->has_safe_browsing_protection_level(), - signals->safe_browsing_protection_level()); - TrySetSignal(map, "site_isolation_enabled", - signals->has_site_isolation_enabled(), - signals->site_isolation_enabled()); - TrySetSignal(map, "third_party_blocking_enabled", - signals->has_third_party_blocking_enabled(), - signals->third_party_blocking_enabled()); - TrySetSignal(map, "remote_desktop_available", - signals->has_remote_desktop_available(), - signals->remote_desktop_available()); - TrySetSignal(map, "signed_in_profile_name", - signals->has_signed_in_profile_name(), - signals->signed_in_profile_name()); - TrySetSignal(map, "chrome_cleanup_enabled", - signals->has_chrome_cleanup_enabled(), - signals->chrome_cleanup_enabled()); - TrySetSignal(map, "password_protection_warning_trigger", - signals->has_password_protection_warning_trigger(), - signals->password_protection_warning_trigger()); - TrySetSignal(map, "dns_address", signals->has_dns_address(), - signals->dns_address()); - TrySetSignal(map, "built_in_dns_client_enabled", - signals->has_built_in_dns_client_enabled(), - signals->built_in_dns_client_enabled()); - TrySetSignal(map, "firewall_on", signals->has_firewall_on(), - signals->firewall_on()); - TrySetSignal(map, "windows_domain", signals->has_windows_domain(), - signals->windows_domain()); - - return map; -} - connectors_internals::mojom::KeyInfoPtr GetKeyInfo() { #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) auto* key_manager = g_browser_process->browser_policy_connector()
diff --git a/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.h b/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.h index a62d064..38fccdf 100644 --- a/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.h +++ b/chrome/browser/ui/webui/connectors_internals/zero_trust_utils.h
@@ -5,20 +5,11 @@ #ifndef CHROME_BROWSER_UI_WEBUI_CONNECTORS_INTERNALS_ZERO_TRUST_UTILS_H_ #define CHROME_BROWSER_UI_WEBUI_CONNECTORS_INTERNALS_ZERO_TRUST_UTILS_H_ -#include <memory> -#include <string> - -#include "base/containers/flat_map.h" -#include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h" #include "chrome/browser/ui/webui/connectors_internals/connectors_internals.mojom.h" namespace enterprise_connectors { namespace utils { -// Manually converts the given `signals` proto to a map. -base::flat_map<std::string, std::string> SignalsToMap( - std::unique_ptr<SignalsType> signals); - // Retrieves the KeyInfo containing any information about the currently loaded // key. connectors_internals::mojom::KeyInfoPtr GetKeyInfo();
diff --git a/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc b/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc index ea46345..7be09a5 100644 --- a/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc +++ b/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc
@@ -40,6 +40,8 @@ namespace { +constexpr size_t kMaxRelatedSearches = 5; + // Creates a `mojom::VisitPtr` from a `history_clusters::Visit`. mojom::URLVisitPtr VisitToMojom(Profile* profile, const history::ClusterVisit& visit) { @@ -182,14 +184,29 @@ visit_mojom->hidden = true; } - cluster_mojom->visits.push_back(std::move(visit_mojom)); - } - for (const auto& related_search : cluster.related_searches) { - auto search_query_mojom = SearchQueryToMojom(profile, related_search); - if (search_query_mojom) { - cluster_mojom->related_searches.emplace_back( - std::move(*search_query_mojom)); + cluster_mojom->visits.push_back(std::move(visit_mojom)); + + // Coalesce the unique related searches of this visit into the cluster + // until the cap is reached. + for (const auto& search_query : + visit.annotated_visit.content_annotations.related_searches) { + if (cluster_mojom->related_searches.size() >= kMaxRelatedSearches) { + break; + } + + if (base::Contains(cluster_mojom->related_searches, search_query, + [](const mojom::SearchQueryPtr& search_query_mojom) { + return search_query_mojom->query; + })) { + continue; + } + + auto search_query_mojom = SearchQueryToMojom(profile, search_query); + if (search_query_mojom) { + cluster_mojom->related_searches.emplace_back( + std::move(*search_query_mojom)); + } } }
diff --git a/chrome/browser/ui/webui/history_clusters/history_clusters_handler_unittest.cc b/chrome/browser/ui/webui/history_clusters/history_clusters_handler_unittest.cc index b58a95c..a1fef0c 100644 --- a/chrome/browser/ui/webui/history_clusters/history_clusters_handler_unittest.cc +++ b/chrome/browser/ui/webui/history_clusters/history_clusters_handler_unittest.cc
@@ -129,7 +129,20 @@ history::Cluster cluster; cluster.cluster_id = 4; - cluster.related_searches = {"one", "two", "three", "four", "five"}; + // Should include the top visit's related searches. + cluster.visits.push_back( + CreateVisit("https://high-score-1", 0, {"one", "two"})); + // Should exclude duplicates (i.e. "one"). + cluster.visits.push_back(CreateVisit( + "https://high-score-2", 0, {"one", "three", "four", "five", "six"})); + // Visits without related searches shouldn't interrupt the coalescing. + cluster.visits.push_back(CreateVisit("https://high-score-3", 0)); + // Should not include more related searches once the max related searches has + // been met (5). + cluster.visits.push_back( + CreateVisit("https://high-score-4", 0, {"seven", "eight", "nine"})); + cluster.visits.push_back(CreateVisit("https://high-score-5", 0, {"ten"})); + clusters.push_back(cluster); mojom::QueryResultPtr mojom_result =
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc index 4d5d84a..62f6971 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -1022,7 +1022,7 @@ return names; } -base::Value PolicyUIHandler::GetPolicyValues() { +base::Value::List PolicyUIHandler::GetPolicyValues() { auto client = std::make_unique<policy::ChromePolicyConversionsClient>( web_ui()->GetWebContents()->GetBrowserContext()); @@ -1034,7 +1034,7 @@ .WithUpdaterPolicies( std::make_unique<policy::PolicyMap>(updater_policies_->Clone())) .WithUpdaterPolicySchemas(GetGoogleUpdatePolicySchemas()) - .ToValue(); + .ToValueList(); } #endif // BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) @@ -1044,7 +1044,7 @@ policy_conversions.WithAdditionalChromePolicies(device_policy_.Clone()); #endif // BUILDFLAG(IS_CHROMEOS_LACROS) - return policy_conversions.EnableConvertValues(true).ToValue(); + return policy_conversions.EnableConvertValues(true).ToValueList(); } void PolicyUIHandler::AddExtensionPolicyNames( @@ -1334,7 +1334,8 @@ void PolicyUIHandler::SendPolicies() { if (IsJavascriptAllowed()) - FireWebUIListener("policies-updated", GetPolicyNames(), GetPolicyValues()); + FireWebUIListener("policies-updated", GetPolicyNames(), + base::Value(GetPolicyValues())); } #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.h b/chrome/browser/ui/webui/policy/policy_ui_handler.h index 1e5da8c..46ef2d6 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_handler.h +++ b/chrome/browser/ui/webui/policy/policy_ui_handler.h
@@ -87,7 +87,7 @@ private: base::Value GetPolicyNames(); - base::Value GetPolicyValues(); + base::Value::List GetPolicyValues(); void AddExtensionPolicyNames(base::Value* names, policy::PolicyDomain policy_domain);
diff --git a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc index aa727261..b2bd74f 100644 --- a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc +++ b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.cc
@@ -36,7 +36,7 @@ mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer, bool has_selection) {} -void FakePrintRenderFrame::PrintPreview(base::Value settings) {} +void FakePrintRenderFrame::PrintPreview(base::Value::Dict settings) {} void FakePrintRenderFrame::OnPrintPreviewDialogClosed() {}
diff --git a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h index 5f4d6e3..42f9f296 100644 --- a/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h +++ b/chrome/browser/ui/webui/print_preview/fake_print_render_frame.h
@@ -33,7 +33,7 @@ void InitiatePrintPreview( mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer, bool has_selection) override; - void PrintPreview(base::Value settings) override; + void PrintPreview(base::Value::Dict settings) override; void OnPrintPreviewDialogClosed() override; void PrintFrameContent(mojom::PrintFrameContentParamsPtr params, PrintFrameContentCallback callback) override;
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc index cb5d1ec..9bcf1b6 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler.cc
@@ -718,7 +718,7 @@ print_render_frame_->SetPrintPreviewUI( print_preview_ui()->BindPrintPreviewUI()); } - print_render_frame_->PrintPreview(base::Value(settings.Clone())); + print_render_frame_->PrintPreview(settings.Clone()); last_preview_settings_ = std::move(settings); }
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc index 2e770a53..1f7ef94 100644 --- a/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc +++ b/chrome/browser/ui/webui/print_preview/print_preview_handler_unittest.cc
@@ -284,7 +284,7 @@ const TestPrintPreviewPrintRenderFrame&) = delete; ~TestPrintPreviewPrintRenderFrame() override = default; - const base::Value& GetSettings() { return settings_; } + const base::Value::Dict& GetSettings() { return settings_; } void SetCompletionClosure(base::OnceClosure closure) { closure_ = std::move(closure); @@ -292,13 +292,13 @@ private: // FakePrintRenderFrame: - void PrintPreview(base::Value settings) override { + void PrintPreview(base::Value::Dict settings) override { settings_ = std::move(settings); std::move(closure_).Run(); } base::OnceClosure closure_; - base::Value settings_; + base::Value::Dict settings_; }; #if BUILDFLAG(IS_CHROMEOS_LACROS) @@ -1279,9 +1279,9 @@ // Verify that the preview was requested from the renderer with the // appropriate settings. - const base::Value& preview_params = print_render_frame.GetSettings(); + const base::Value::Dict& preview_params = print_render_frame.GetSettings(); bool preview_id_found = false; - for (auto it : preview_params.DictItems()) { + for (auto it : preview_params) { if (it.first == kPreviewUIID) { // This is added by the handler. preview_id_found = true; continue; @@ -1307,15 +1307,14 @@ ConstructPreviewArgs(callback_id_in, print_ticket); handler()->HandleGetPreview(list_args); run_loop.Run(); - const base::Value& preview_params = print_render_frame.GetSettings(); + const base::Value::Dict& preview_params = print_render_frame.GetSettings(); // Read the preview UI ID and request ID - absl::optional<int> request_value = - preview_params.FindIntKey(kPreviewRequestID); + absl::optional<int> request_value = preview_params.FindInt(kPreviewRequestID); ASSERT_TRUE(request_value.has_value()); int preview_request_id = request_value.value(); - absl::optional<int> ui_value = preview_params.FindIntKey(kPreviewUIID); + absl::optional<int> ui_value = preview_params.FindInt(kPreviewUIID); ASSERT_TRUE(ui_value.has_value()); int preview_ui_id = ui_value.value();
diff --git a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc index d6b30e3..8527c9c 100644 --- a/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc +++ b/chrome/browser/ui/webui/settings/chromeos/multidevice_section.cc
@@ -612,11 +612,9 @@ NearbySharingServiceFactory::IsNearbyShareSupportedForBrowserContext( profile())); // Background scanning depends on Bluetooth Advertisement Monitoring. - html_source->AddBoolean( - "isNearbyShareBackgroundScanningEnabled", - chromeos::features::IsBluetoothAdvertisementMonitoringEnabled() && - base::FeatureList::IsEnabled( - ::features::kNearbySharingBackgroundScanning)); + html_source->AddBoolean("isNearbyShareBackgroundScanningEnabled", + base::FeatureList::IsEnabled( + ::features::kNearbySharingBackgroundScanning)); html_source->AddBoolean("isEcheAppEnabled", features::IsEcheSWAEnabled()); bool is_phone_screen_lock_enabled = static_cast<phonehub::ScreenLockManager::LockStatus>(
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc index 4cac1e2..d2cd35c 100644 --- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc +++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.cc
@@ -110,13 +110,13 @@ EnterpriseProfileWelcomeHandler::EnterpriseProfileWelcomeHandler( Browser* browser, EnterpriseProfileWelcomeUI::ScreenType type, - bool force_new_profile, + bool profile_creation_required_by_policy, const AccountInfo& account_info, absl::optional<SkColor> profile_color, signin::SigninChoiceCallback proceed_callback) : browser_(browser), type_(type), - force_new_profile_(force_new_profile), + profile_creation_required_by_policy_(profile_creation_required_by_policy), email_(base::UTF8ToUTF16(account_info.email)), domain_name_(gaia::ExtractDomainName(account_info.email)), account_id_(account_info.account_id), @@ -227,13 +227,10 @@ const base::Value::List& args) { CHECK_EQ(1u, args.size()); if (proceed_callback_) { - // TODO(crbug.com/1317969): `force_new_profile_` is not forcing anything. - // Improve the naming and/or design related to this parameter. bool use_existing_profile = args[0].GetIfBool().value_or(false); std::move(proceed_callback_) - .Run(use_existing_profile || !force_new_profile_ - ? signin::SIGNIN_CHOICE_CONTINUE - : signin::SIGNIN_CHOICE_NEW_PROFILE); + .Run(use_existing_profile ? signin::SIGNIN_CHOICE_CONTINUE + : signin::SIGNIN_CHOICE_NEW_PROFILE); } } @@ -296,7 +293,7 @@ dict.SetStringKey( "proceedLabel", l10n_util::GetStringUTF8( - force_new_profile_ + profile_creation_required_by_policy_ ? IDS_ENTERPRISE_PROFILE_WELCOME_CREATE_PROFILE_BUTTON : IDS_WELCOME_SIGNIN_VIEW_SIGNIN)); break;
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h index b0ad6a0..23e0d0a 100644 --- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h +++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler.h
@@ -41,7 +41,7 @@ EnterpriseProfileWelcomeHandler( Browser* browser, EnterpriseProfileWelcomeUI::ScreenType type, - bool force_new_profile, + bool profile_creation_required_by_policy, const AccountInfo& account_info, absl::optional<SkColor> profile_color, signin::SigninChoiceCallback proceed_callback); @@ -113,7 +113,7 @@ raw_ptr<Browser> browser_ = nullptr; const EnterpriseProfileWelcomeUI::ScreenType type_; - const bool force_new_profile_; + const bool profile_creation_required_by_policy_; const std::u16string email_; const std::string domain_name_; const CoreAccountId account_id_;
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc index 41029a31..206480e 100644 --- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc +++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_handler_unittest.cc
@@ -46,13 +46,13 @@ } void InitializeHandler(EnterpriseProfileWelcomeUI::ScreenType screen_type, - bool force_new_profile, + bool profile_creation_required_by_policy, signin::SigninChoiceCallback proceed_callback) { message_handler_.reset(); message_handler_ = std::make_unique<EnterpriseProfileWelcomeHandler>( - /*browser=*/nullptr, screen_type, force_new_profile, account_info_, - absl::optional<SkColor>(), std::move(proceed_callback)); + /*browser=*/nullptr, screen_type, profile_creation_required_by_policy, + account_info_, absl::optional<SkColor>(), std::move(proceed_callback)); message_handler_->set_web_ui_for_test(web_ui()); message_handler_->RegisterMessages(); } @@ -73,12 +73,12 @@ }; struct HandleProceedTestParam { - bool force_new_profile = false; + bool profile_creation_required_by_policy = false; bool should_link_data = false; signin::SigninChoice expected_choice = signin::SIGNIN_CHOICE_CANCEL; }; const HandleProceedTestParam kHandleProceedParams[] = { - {false, false, signin::SIGNIN_CHOICE_CONTINUE}, + {false, false, signin::SIGNIN_CHOICE_NEW_PROFILE}, {false, true, signin::SIGNIN_CHOICE_CONTINUE}, {true, false, signin::SIGNIN_CHOICE_NEW_PROFILE}, {true, true, signin::SIGNIN_CHOICE_CONTINUE}, @@ -94,7 +94,8 @@ base::MockCallback<signin::SigninChoiceCallback> mock_proceed_callback; InitializeHandler( EnterpriseProfileWelcomeUI::ScreenType::kEntepriseAccountSyncEnabled, - GetParam().force_new_profile, mock_proceed_callback.Get()); + GetParam().profile_creation_required_by_policy, + mock_proceed_callback.Get()); base::ListValue args; args.Append(GetParam().should_link_data);
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc index 521e5f4..60a58512 100644 --- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc +++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.cc
@@ -64,13 +64,13 @@ Browser* browser, EnterpriseProfileWelcomeUI::ScreenType type, const AccountInfo& account_info, - bool force_new_profile, + bool profile_creation_required_by_policy, bool show_link_data_option, absl::optional<SkColor> profile_color, signin::SigninChoiceCallback proceed_callback) { auto handler = std::make_unique<EnterpriseProfileWelcomeHandler>( - browser, type, force_new_profile, account_info, profile_color, - std::move(proceed_callback)); + browser, type, profile_creation_required_by_policy, account_info, + profile_color, std::move(proceed_callback)); handler_ = handler.get(); if (type == @@ -78,7 +78,7 @@ base::Value::Dict update_data; update_data.Set("isModalDialog", true); - int title_id = force_new_profile + int title_id = profile_creation_required_by_policy ? IDS_ENTERPRISE_WELCOME_PROFILE_REQUIRED_TITLE : IDS_ENTERPRISE_WELCOME_PROFILE_WILL_BE_MANAGED_TITLE; update_data.Set("enterpriseProfileWelcomeTitle",
diff --git a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h index 2aeed73..01e5268 100644 --- a/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h +++ b/chrome/browser/ui/webui/signin/enterprise_profile_welcome_ui.h
@@ -48,8 +48,9 @@ // choice about how to set up the profile with the new account. // `proceed_callback` will be called when the user performs an action to exit // the screen. Their choice will depend on other flags passed to this method. - // `force_new_profile` set to true indicates that we want them to use a - // dedicated profile for the account they are adding. + // If `profile_creation_required_by_policy` is true, the wording of the dialog + // will tell the user that an admin requires a new profile for the account, + // otherwise the default wording will be used. // `show_link_data_option` will make the screen display a checkbox, and when // selected, will indicate that the user wants the current profile to be used // as dedicated profile for the new account, linking the current data with @@ -57,7 +58,7 @@ void Initialize(Browser* browser, ScreenType type, const AccountInfo& account_info, - bool force_new_profile, + bool profile_creation_required_by_policy, bool show_link_data_option, absl::optional<SkColor> profile_color, signin::SigninChoiceCallback proceed_callback);
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc index 6bdb0c5..106a21e 100644 --- a/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc +++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_delegate_impl.cc
@@ -193,11 +193,14 @@ g_browser_process->profile_manager() ->GetProfileAttributesStorage() .GetProfileAttributesWithPath(browser_->profile()->GetPath()); - auto force_new_profile = signin_util::ProfileSeparationEnforcedByPolicy( - browser_->profile(), signin_restriction); + auto profile_creation_required_by_policy = + signin_util::ProfileSeparationEnforcedByPolicy(browser_->profile(), + signin_restriction); + bool show_link_data_option = signin_util:: + ProfileSeparationAllowsKeepingUnmanagedBrowsingDataInManagedProfile( + browser_->profile(), signin_restriction); browser_->signin_view_controller()->ShowModalEnterpriseConfirmationDialog( - account_info, force_new_profile, - /*show_link_data_option=*/!force_new_profile, + account_info, profile_creation_required_by_policy, show_link_data_option, GenerateNewProfileColor(entry).color, base::BindOnce( [](signin::SigninChoiceCallback callback, Browser* browser, @@ -236,7 +239,7 @@ ->GetProfileAttributesStorage() .GetProfileAttributesWithPath(browser_->profile()->GetPath()); browser_->signin_view_controller()->ShowModalEnterpriseConfirmationDialog( - account_info, /*force_new_profile=*/false, + account_info, /*profile_creation_required_by_policy=*/false, /*show_link_data_option*/ false, GenerateNewProfileColor(entry).color, base::BindOnce( [](signin::SigninChoiceCallback callback, Browser* browser,
diff --git a/chrome/browser/updater/browser_updater_client_mac.mm b/chrome/browser/updater/browser_updater_client_mac.mm index 7c682dabd..4e2e612 100644 --- a/chrome/browser/updater/browser_updater_client_mac.mm +++ b/chrome/browser/updater/browser_updater_client_mac.mm
@@ -166,6 +166,17 @@ NOTIMPLEMENTED(); } +- (void)runInstallerWithAppId:(NSString* _Nonnull)appId + installerPath:(NSString* _Nonnull)installerPath + installArgs:(NSString* _Nullable)installArgs + installData:(NSString* _Nullable)installData + installSettings:(NSString* _Nullable)installSettings + updateState:(id<CRUUpdateStateObserving> _Nonnull)updateState + reply:(void (^_Nonnull)( + updater::UpdateService::Result rc))reply { + NOTIMPLEMENTED(); +} + @end BrowserUpdaterClientMac::BrowserUpdaterClientMac()
diff --git a/chrome/browser/web_applications/system_web_apps/system_web_app_types.h b/chrome/browser/web_applications/system_web_apps/system_web_app_types.h index ea67e46..877ed34 100644 --- a/chrome/browser/web_applications/system_web_apps/system_web_app_types.h +++ b/chrome/browser/web_applications/system_web_apps/system_web_app_types.h
@@ -70,10 +70,11 @@ // contact: cros-telemetry@google.com OS_FEEDBACK = 19, - // Projector (go/projector-player-dd) aims to make it simple for teachers and - // students to record and share instructional videos on a Chromebook. This app - // enables teachers to create a library of custom-tailored instructional - // content that students can search and view at home. + // Projector aka Screencast (go/projector-player-dd) aims to make it simple + // for teachers and students to record and share instructional videos on a + // Chromebook. This app enables teachers to create a library of + // custom-tailored instructional content that students can search and view at + // home. // // Source: //ash/webui/projector_app/ // Contact: cros-projector@google.com
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 66165a5e..7cac79e 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1652183724-7e1bb91f57a3917caf9fe6316ddb408f8b5c5986.profdata +chrome-linux-main-1652205556-5c9d1bad203a5581c25676c542533b7e6d92f993.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index a2f59b1..df34932f 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1652183724-b66c372e399990d019bc59edbe249a7cf72a168d.profdata +chrome-mac-arm-main-1652205556-73ed408b21c83e1179086079a772db3d0398100e.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 87ed996..159b2afb 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1652183724-ab32f495a8d15755b4203e0564cafdb942bac381.profdata +chrome-mac-main-1652205556-f04d0f9f69920b666e7a4ea2ef3ac790db0f7d3b.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 99d62f2..9e479ee 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1652194753-050bc327312ab67012958a2baca174072ebc70d4.profdata +chrome-win32-main-1652205556-38032fd4da609b1dbe6d773d2ceb88933dd4ed75.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index fe5fd863..359f23a 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1652194753-d3d13b91b2e4fc2fcdb6e937a67ec713fbbbdcf8.profdata +chrome-win64-main-1652205556-4ec78781226a20199fad6c6a154c702205211acd.profdata
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index c548cbf5..0160090 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -424,8 +424,12 @@ subresource_filter_ruleset_dealer_ = std::make_unique<subresource_filter::UnverifiedRulesetDealer>(); + phishing_model_setter_ = + std::make_unique<safe_browsing::PhishingModelSetterImpl>(); + thread->AddObserver(chrome_observer_.get()); thread->AddObserver(subresource_filter_ruleset_dealer_.get()); + thread->AddObserver(phishing_model_setter_.get()); thread->RegisterExtension(extensions_v8::LoadTimesExtension::Get());
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index 3f117b1..64b54bc 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -19,6 +19,7 @@ #include "chrome/common/media/webrtc_logging.mojom.h" #include "chrome/services/speech/buildflags/buildflags.h" #include "components/nacl/common/buildflags.h" +#include "components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h" #include "components/spellcheck/spellcheck_buildflags.h" #include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/render_thread.h" @@ -274,6 +275,8 @@ #if BUILDFLAG(ENABLE_PLUGINS) std::set<std::string> allowed_camera_device_origins_; #endif + std::unique_ptr<safe_browsing::PhishingModelSetterImpl> + phishing_model_setter_; scoped_refptr<blink::ThreadSafeBrowserInterfaceBrokerProxy> browser_interface_broker_;
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc index ba5e149..77c76a3 100644 --- a/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc +++ b/chrome/renderer/safe_browsing/phishing_classifier_browsertest.cc
@@ -155,9 +155,8 @@ ASSERT_TRUE(mapped_region_.IsValid()); memcpy(mapped_region_.mapping.memory(), model_str.data(), model_str.length()); - scorer_.reset(FlatBufferModelScorer::Create( + ScorerStorage::GetInstance()->SetScorer(FlatBufferModelScorer::Create( mapped_region_.region.Duplicate(), base::File())); - ASSERT_TRUE(scorer_.get()); } void PrepareModel() { @@ -197,19 +196,12 @@ model.set_max_shingles_per_page(100); model.set_shingle_size(3); - scorer_.reset( + ScorerStorage::GetInstance()->SetScorer( ProtobufModelScorer::Create(model.SerializeAsString(), base::File())); - ASSERT_TRUE(scorer_.get()); } void SetUpClassifier() { classifier_ = std::make_unique<PhishingClassifier>(GetMainRenderFrame()); - // No scorer yet, so the classifier is not ready. - ASSERT_FALSE(classifier_->is_ready()); - - // Now set the scorer. - classifier_->set_phishing_scorer(scorer_.get()); - ASSERT_TRUE(classifier_->is_ready()); } // Helper method to start phishing classification. @@ -247,7 +239,6 @@ } std::string response_content_; - std::unique_ptr<Scorer> scorer_; std::unique_ptr<PhishingClassifier> classifier_; base::RunLoop run_loop_; base::MappedReadOnlyRegion mapped_region_; @@ -358,7 +349,7 @@ TEST_P(PhishingClassifierTest, DisableDetection) { EXPECT_TRUE(classifier_->is_ready()); // Set a NULL scorer, which turns detection back off. - classifier_->set_phishing_scorer(NULL); + ScorerStorage::GetInstance()->SetScorer(nullptr); EXPECT_FALSE(classifier_->is_ready()); }
diff --git a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc index 8c36726..351a9ff7 100644 --- a/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc +++ b/chrome/renderer/safe_browsing/phishing_classifier_delegate_browsertest.cc
@@ -13,7 +13,9 @@ #include "chrome/test/base/chrome_unit_test_suite.h" #include "components/safe_browsing/content/common/safe_browsing.mojom-shared.h" #include "components/safe_browsing/content/renderer/phishing_classifier/features.h" +#include "components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.h" #include "components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.h" +#include "components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.h" #include "components/safe_browsing/content/renderer/phishing_classifier/scorer.h" #include "components/safe_browsing/core/common/fbs/client_model_generated.h" #include "components/safe_browsing/core/common/proto/csd.pb.h" @@ -154,6 +156,8 @@ content::RenderFrame* render_frame = GetMainRenderFrame(); classifier_ = new StrictMock<MockPhishingClassifier>(render_frame); + render_frame->GetAssociatedInterfaceRegistry()->RemoveInterface( + mojom::PhishingDetector::Name_); delegate_ = PhishingClassifierDelegate::Create(render_frame, classifier_); } @@ -195,8 +199,8 @@ }; TEST_F(PhishingClassifierDelegateTest, Navigation) { - MockScorer scorer; - delegate_->SetPhishingScorer(&scorer); + auto scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); ASSERT_TRUE(classifier_->is_ready()); // Test an initial load. We expect classification to happen normally. @@ -318,7 +322,7 @@ TEST_F(PhishingClassifierDelegateTest, NoPhishingModel) { ASSERT_FALSE(classifier_->is_ready()); - delegate_->SetPhishingModel("", base::File()); + ScorerStorage::GetInstance()->SetScorer(nullptr); // The scorer is nullptr so the classifier should still not be ready. ASSERT_FALSE(classifier_->is_ready()); } @@ -328,7 +332,8 @@ ClientSideModel model; model.set_max_words_per_term(1); - delegate_->SetPhishingModel(model.SerializeAsString(), base::File()); + ScorerStorage::GetInstance()->SetScorer( + ProtobufModelScorer::Create(model.SerializeAsString(), base::File())); ASSERT_TRUE(classifier_->is_ready()); // The delegate will cancel pending classification on destruction. @@ -343,8 +348,8 @@ base::ReadOnlySharedMemoryRegion::Create(model_str.length()); memcpy(mapped_region.mapping.memory(), model_str.data(), model_str.length()); - delegate_->SetPhishingFlatBufferModel(mapped_region.region.Duplicate(), - base::File()); + ScorerStorage::GetInstance()->SetScorer(FlatBufferModelScorer::Create( + mapped_region.region.Duplicate(), base::File())); ASSERT_TRUE(classifier_->is_ready()); // The delegate will cancel pending classification on destruction. @@ -366,7 +371,8 @@ ClientSideModel model; model.set_max_words_per_term(1); - delegate_->SetPhishingModel(model.SerializeAsString(), std::move(file)); + ScorerStorage::GetInstance()->SetScorer( + ProtobufModelScorer::Create(model.SerializeAsString(), std::move(file))); ASSERT_TRUE(classifier_->is_ready()); // The delegate will cancel pending classification on destruction. @@ -393,8 +399,8 @@ // Now set a scorer, which should cause a classifier to be created, // but no classification will start. page_text = u"dummy"; - MockScorer scorer; - delegate_->SetPhishingScorer(&scorer); + auto scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); Mock::VerifyAndClearExpectations(classifier_); // Manually start a classification. @@ -404,7 +410,8 @@ // If we set a new scorer while a classification is going on the // classification should be cancelled. EXPECT_CALL(*classifier_, CancelPendingClassification()); - delegate_->SetPhishingScorer(&scorer); + scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); Mock::VerifyAndClearExpectations(classifier_); // The delegate will cancel pending classification on destruction. @@ -430,8 +437,8 @@ // Now set a scorer, which should cause a classifier to be created, // but no classification will start. page_text = u"dummy"; - MockScorer scorer; - delegate_->SetPhishingScorer(&scorer); + auto scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); Mock::VerifyAndClearExpectations(classifier_); // Manually start a classification. @@ -441,7 +448,8 @@ // If we set a new scorer while a classification is going on the // classification should be cancelled. EXPECT_CALL(*classifier_, CancelPendingClassification()); - delegate_->SetPhishingScorer(&scorer); + scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); Mock::VerifyAndClearExpectations(classifier_); // The delegate will cancel pending classification on destruction. @@ -451,8 +459,8 @@ TEST_F(PhishingClassifierDelegateTest, NoStartPhishingDetection) { // Tests the behavior when OnStartPhishingDetection has not yet been called // when the page load finishes. - MockScorer scorer; - delegate_->SetPhishingScorer(&scorer); + auto scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); ASSERT_TRUE(classifier_->is_ready()); EXPECT_CALL(*classifier_, CancelPendingClassification()); @@ -525,8 +533,8 @@ TEST_F(PhishingClassifierDelegateTest, IgnorePreliminaryCapture) { // Tests that preliminary PageCaptured notifications are ignored. - MockScorer scorer; - delegate_->SetPhishingScorer(&scorer); + auto scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); ASSERT_TRUE(classifier_->is_ready()); EXPECT_CALL(*classifier_, CancelPendingClassification()); @@ -555,8 +563,8 @@ TEST_F(PhishingClassifierDelegateTest, DuplicatePageCapture) { // Tests that a second PageCaptured notification causes classification to // be cancelled. - MockScorer scorer; - delegate_->SetPhishingScorer(&scorer); + auto scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); ASSERT_TRUE(classifier_->is_ready()); EXPECT_CALL(*classifier_, CancelPendingClassification()); @@ -586,8 +594,8 @@ TEST_F(PhishingClassifierDelegateTest, PhishingDetectionDone) { // Tests that a SafeBrowsingHostMsg_PhishingDetectionDone IPC is // sent to the browser whenever we finish classification. - MockScorer scorer; - delegate_->SetPhishingScorer(&scorer); + auto scorer = std::make_unique<MockScorer>(); + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); ASSERT_TRUE(classifier_->is_ready()); // Start by loading a page to populate the delegate's state.
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 58c58db..2734212 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4557,6 +4557,7 @@ "../browser/lacros/browser_test_util.h", "../browser/lacros/cert/cert_db_initializer_browsertest.cc", "../browser/lacros/clipboard_lacros_browsertest.cc", + "../browser/lacros/component_policy_lacros_browsertest.cc", "../browser/lacros/crosapi_pref_observer_lacros_browsertest.cc", "../browser/lacros/holding_space_service_lacros_browsertest.cc", "../browser/lacros/keystore_service_lacros_browsertest.cc", @@ -7203,6 +7204,7 @@ "//components/app_restore:unit_tests", "//components/arc:arc_test_support", "//components/arc/common", + "//components/device_signals/core/common", "//components/services/app_service/public/cpp:app_update", "//components/services/app_service/public/cpp:instance_update", "//components/services/app_service/public/cpp:preferred_apps", @@ -8042,6 +8044,7 @@ "../browser/enterprise/connectors/device_trust/signals/decorators/common:unit_tests", "../browser/enterprise/connectors/device_trust/signals/decorators/content", "../browser/enterprise/connectors/device_trust/signals/decorators/content:unit_tests", + "//components/device_signals/core/common", "//services/data_decoder/public/cpp:test_support", ] }
diff --git a/chrome/test/data/pdf/.eslintrc.js b/chrome/test/data/pdf/.eslintrc.js index 0a5c6d93..1ff618d 100644 --- a/chrome/test/data/pdf/.eslintrc.js +++ b/chrome/test/data/pdf/.eslintrc.js
@@ -8,4 +8,22 @@ 'no-restricted-properties': 'off', 'eqeqeq': ['error', 'always', {'null': 'ignore'}], }, + + 'overrides': [{ + 'files': ['**/*.ts'], + 'parser': '../../../../third_party/node/node_modules/@typescript-eslint/parser', + 'plugins': [ + '@typescript-eslint', + ], + 'rules': { + '@typescript-eslint/naming-convention': [ + 'error', + // Override default format to allow test functions like testFoo_bar(). + { + selector: 'function', + format: null, + }, + ], + } + }] };
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 7b2aed5..1b1dd32 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -5335,6 +5335,79 @@ } ] }, + "DefaultClipboardSetting": { + "os": [ + "win", + "linux", + "mac", + "chromeos_ash", + "chromeos_lacros" + ], + "policy_pref_mapping_tests": [ + { + "policies": { + "DefaultClipboardSetting": 2 + }, + "prefs": { + "profile.managed_default_content_settings.clipboard": { + "value": 2 + } + } + }, + { + "policies": { + "DefaultClipboardSetting": 3 + }, + "prefs": { + "profile.managed_default_content_settings.clipboard": { + "value": 3 + } + } + } + ] + }, + "ClipboardAllowedForUrls": { + "os": [ + "win", + "linux", + "mac", + "chromeos_ash", + "chromeos_lacros" + ], + "policy_pref_mapping_tests": [ + { + "policies": { + "ClipboardAllowedForUrls": [ + "[*.]google.com" + ] + }, + "prefs": { + "profile.managed_clipboard_allowed_for_urls": {} + } + } + ] + }, + "ClipboardBlockedForUrls": { + "os": [ + "win", + "linux", + "mac", + "chromeos_ash", + "chromeos_lacros" + ], + "policy_pref_mapping_tests": [ + { + "policies": { + "ClipboardBlockedForUrls": [ + "[*.]google.com" + ] + }, + "prefs": { + "profile.managed_clipboard_blocked_for_urls": {} + } + } + ] + }, "JavaScriptJitAllowedForSites": { "os": [ "win",
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js index 1273dab..2791147 100644 --- a/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js +++ b/chrome/test/data/webui/chromeos/os_feedback_ui/feedback_flow_test.js
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import {fakeFeedbackContext, fakeSearchResponse} from 'chrome://os-feedback/fake_data.js'; +import {fakeFeedbackContext, fakePngData, fakeSearchResponse} from 'chrome://os-feedback/fake_data.js'; import {FakeFeedbackServiceProvider} from 'chrome://os-feedback/fake_feedback_service_provider.js'; import {FakeHelpContentProvider} from 'chrome://os-feedback/fake_help_content_provider.js'; import {FeedbackFlowElement, FeedbackFlowState} from 'chrome://os-feedback/feedback_flow.js'; @@ -145,6 +145,8 @@ // Should stay on search page when click the continue button. activePage = page.shadowRoot.querySelector('.iron-selected'); assertEquals('searchPage', activePage.id); + assertEquals(0, feedbackServiceProvider.getScreenshotPngCallCount()); + feedbackServiceProvider.setFakeScreenshotPng(fakePngData); const clickPromise = eventToPromise('continue-click', page); @@ -164,6 +166,15 @@ // Should move to share data page when click the continue button. activePage = page.shadowRoot.querySelector('.iron-selected'); assertEquals('shareDataPage', activePage.id); + + // Verify that the getScreenshotPng is called once. + assertEquals(1, feedbackServiceProvider.getScreenshotPngCallCount()); + const screenshotImg = + activePage.shadowRoot.querySelector('#screenshotImage'); + assertTrue(!!screenshotImg); + assertTrue(!!screenshotImg.src); + // Verify that the src of the screenshot image is set. + assertTrue(screenshotImg.src.startsWith('blob:chrome://os-feedback/')); }); // Test the navigation from share data page back to search page when click
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js index ddfd2f6..c468b0c 100644 --- a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js +++ b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
@@ -9,6 +9,9 @@ import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js'; import {eventToPromise, flushTasks, isVisible} from '../../test_util.js'; +/** @type {string} */ +const fakeImageUrl = 'chrome://os_feedback/app_icon_48.png'; + export function shareDataPageTestSuite() { /** @type {?ShareDataPageElement} */ let page = null; @@ -188,32 +191,61 @@ /** * Test that when when the send button is clicked, an on-continue is fired. - * Case 3: Share email. + * Case 3: Share email and screenshot. */ test('SendReportShareEmail', async () => { await initializePage(); page.feedbackContext = fakeFeedbackContext; + page.screenshotUrl = fakeImageUrl; + assertEquals(fakeImageUrl, getElement('#screenshotImage').src); + // Select the email. getElement('#userEmailDropDown').value = 'test.user2@test.com'; + // Select the screenshot. + getElement('#screenshotCheckbox').checked = true; const request = (await clickSendAndWait(page)).report; assertEquals('test.user2@test.com', request.feedbackContext.email); + assertTrue(request.includeScreenshot); }); /** * Test that when when the send button is clicked, an on-continue is fired. - * Case 3: Do not share email. + * Case 4: Do not share email or screenshot. */ test('SendReportDoNotShareEmail', async () => { await initializePage(); page.feedbackContext = fakeFeedbackContext; + // When there is not a screenshot. + page.screenshotUrl = ''; + assertFalse(!!getElement('#screenshotImage').src); + // Select the "Don't include email address" option. getElement('#userEmailDropDown').value = ''; - const request = (await clickSendAndWait(page)).report; + let request = (await clickSendAndWait(page)).report; assertFalse(!!request.feedbackContext.email); + assertFalse(request.includeScreenshot); + + // When the checkbox is selected but there is not a screenshot. + getElement('#screenshotCheckbox').checked = true; + assertFalse(!!getElement('#screenshotImage').src); + + request = (await clickSendAndWait(page)).report; + + assertFalse(!!request.feedbackContext.email); + assertFalse(request.includeScreenshot); + + // When there is a screenshot but it is not selected. + page.screenshotUrl = fakeImageUrl; + assertEquals(fakeImageUrl, getElement('#screenshotImage').src); + getElement('#screenshotCheckbox').checked = false; + request = (await clickSendAndWait(page)).report; + + assertFalse(!!request.feedbackContext.email); + assertFalse(request.includeScreenshot); }); // Test that the screenshot checkbox is disabled when no screenshot.
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js index c3483069..4401254 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_repair_complete_page_test.js
@@ -177,6 +177,36 @@ assertEquals(ShutdownMethod.kReboot, shutdownMethod); }); + test('PowerwashDialogClosesWhenCompletedWithShutdown', async () => { + await initializeRepairCompletePage(); + + service.setGetPowerwashRequiredResult(true); + + await clickButton('#shutDownButton'); + await clickButton('#powerwashButton'); + await flushTasks(); + + const powerwashDialog = + component.shadowRoot.querySelector('#powerwashDialog'); + assertTrue(!!powerwashDialog); + assertFalse(powerwashDialog.open); + }); + + test('PowerwashDialogClosesWhenCompletedWithReboot', async () => { + await initializeRepairCompletePage(); + + service.setGetPowerwashRequiredResult(true); + + await clickButton('#rebootButton'); + await clickButton('#powerwashButton'); + await flushTasks(); + + const powerwashDialog = + component.shadowRoot.querySelector('#powerwashDialog'); + assertTrue(!!powerwashDialog); + assertFalse(powerwashDialog.open); + }); + test('RebootButtonTriggersRebootIfNoPowerwashRequired', async () => { const resolver = new PromiseResolver(); await initializeRepairCompletePage();
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js index 818b7d6..33a8be5 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/wrapup_restock_page_test.js
@@ -145,6 +145,20 @@ assertFalse(powerwashDialog.open); }); + test('PowerwashDialogClosesWhenCompleted', async () => { + await initializeRestockPage(); + + const powerwashDialog = + component.shadowRoot.querySelector('#powerwashDialog'); + assertTrue(!!powerwashDialog); + + await clickButton('#shutdown'); + assertTrue(powerwashDialog.open); + + await clickButton('#powerwashButton'); + assertFalse(powerwashDialog.open); + }); + test('RestockPageButtonsDisabled', async () => { await initializeRestockPage();
diff --git a/chrome/test/data/webui/print_preview/pdf_viewer_test.ts b/chrome/test/data/webui/print_preview/pdf_viewer_test.ts index 6d50c06..4053004 100644 --- a/chrome/test/data/webui/print_preview/pdf_viewer_test.ts +++ b/chrome/test/data/webui/print_preview/pdf_viewer_test.ts
@@ -8,7 +8,7 @@ import 'chrome://print/pdf/elements/viewer-page-indicator.js'; import 'chrome://print/pdf/pdf_viewer_wrapper.js'; -import {PDFCreateOutOfProcessPlugin} from 'chrome://print/pdf/pdf_scripting_api.js'; +import {pdfCreateOutOfProcessPlugin} from 'chrome://print/pdf/pdf_scripting_api.js'; import {PDFViewerPPElement} from 'chrome://print/pdf/pdf_viewer_pp.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise, waitAfterNextRender} from 'chrome://webui-test/test_util.js'; @@ -29,7 +29,7 @@ }); test(pdf_viewer_test.TestNames.Basic, async () => { - const plugin = PDFCreateOutOfProcessPlugin( + const plugin = pdfCreateOutOfProcessPlugin( 'chrome-untrusted://print/test.pdf', 'chrome://print/pdf'); const loaded = eventToPromise('load', plugin);
diff --git a/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js b/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js index 5087741..8767a25 100644 --- a/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js +++ b/chrome/test/data/webui/settings/chromeos/fingerprint_browsertest_chromeos.js
@@ -143,10 +143,7 @@ }); test('EnrollingFingerprintLottieAnimation', function() { - loadTimeData.overrideValues({ - fingerprintUnlockEnabled: true, - useLottieAnimationForFingerprint: true, - }); + loadTimeData.overrideValues({fingerprintUnlockEnabled: true}); openDialog(); return browserProxy.whenCalled('startEnroll').then(function() { assertTrue(dialog.$$('#dialog').open); @@ -155,26 +152,10 @@ }); }); - test('EnrollingFingerprintIllustration', function() { - loadTimeData.overrideValues({ - fingerprintUnlockEnabled: true, - useLottieAnimationForFingerprint: false, - }); - openDialog(); - return browserProxy.whenCalled('startEnroll').then(function() { - assertTrue(dialog.$$('#dialog').open); - assertEquals(FingerprintSetupStep.LOCATE_SCANNER, dialog.step_); - assertFalse(dialog.$$('#scannerLocation').hidden); - }); - }); - // Verify running through the enroll session workflow // (settings-setup-fingerprint-dialog) works as expected. test('EnrollingFingerprint', function() { - loadTimeData.overrideValues({ - fingerprintUnlockEnabled: true, - useLottieAnimationForFingerprint: true, - }); + loadTimeData.overrideValues({fingerprintUnlockEnabled: true}); openDialog(); return browserProxy.whenCalled('startEnroll').then(function() { assertTrue(dialog.$$('#dialog').open); @@ -234,10 +215,7 @@ // Verify enrolling a fingerprint, then enrolling another without closing the // dialog works as intended. test('EnrollingAnotherFingerprint', function() { - loadTimeData.overrideValues({ - fingerprintUnlockEnabled: true, - useLottieAnimationForFingerprint: false, - }); + loadTimeData.overrideValues({fingerprintUnlockEnabled: true}); openDialog(); return browserProxy.whenCalled('startEnroll') .then(function() { @@ -274,7 +252,7 @@ assertTrue(dialog.$$('#dialog').open); assertFalse(isVisible(addAnotherButton)); assertEquals(FingerprintSetupStep.MOVE_FINGER, dialog.step_); - assertTrue(dialog.$$('#scannerLocation').hidden); + assertTrue(dialog.$$('#scannerLocationLottie').hidden); assertFalse(dialog.$$('#arc').hidden); browserProxy.scanReceived(
diff --git a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts index 9355fc26..efab23f4 100644 --- a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts +++ b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts
@@ -206,18 +206,18 @@ */ export function createAddressEntry(): chrome.autofillPrivate.AddressEntry { const fullName = 'John Doe'; - const addressLines = patternMaker_('xxxx Main St', 10); + const addressLines = patternMaker('xxxx Main St', 10); return { - guid: makeGuid_(), + guid: makeGuid(), fullNames: [fullName], companyName: 'Google', addressLines: addressLines, addressLevel1: 'CA', addressLevel2: 'Venice', - postalCode: patternMaker_('xxxxx', 10), + postalCode: patternMaker('xxxxx', 10), countryCode: 'US', - phoneNumbers: [patternMaker_('(xxx) xxx-xxxx', 10)], - emailAddresses: [patternMaker_('userxxxx@gmail.com', 16)], + phoneNumbers: [patternMaker('(xxx) xxx-xxxx', 10)], + emailAddresses: [patternMaker('userxxxx@gmail.com', 16)], languageCode: 'EN-US', metadata: { isLocal: true, @@ -247,9 +247,9 @@ chrome.autofillPrivate.CreditCardEntry { const cards = ['Visa', 'Mastercard', 'Discover', 'Card']; const card = cards[Math.floor(Math.random() * cards.length)]; - const cardNumber = patternMaker_('xxxx xxxx xxxx xxxx', 10); + const cardNumber = patternMaker('xxxx xxxx xxxx xxxx', 10); return { - guid: makeGuid_(), + guid: makeGuid(), name: 'Jane Doe', cardNumber: cardNumber, expirationMonth: Math.ceil(Math.random() * 11).toString(), @@ -316,8 +316,8 @@ /** * Creates a new random GUID for testing. */ -function makeGuid_(): string { - return patternMaker_('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 16); +function makeGuid(): string { + return patternMaker('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 16); } /** @@ -325,7 +325,7 @@ * @param pattern The pattern that should be used as an input. * @param base The number base. ie: 16 for hex or 10 for decimal. */ -function patternMaker_(pattern: string, base: number): string { +function patternMaker(pattern: string, base: number): string { return pattern.replace(/x/g, function() { return Math.floor(Math.random() * base).toString(base); });
diff --git a/chromeos/components/quick_answers/utils/spell_checker.cc b/chromeos/components/quick_answers/utils/spell_checker.cc index 5f82e9c..347380b0 100644 --- a/chromeos/components/quick_answers/utils/spell_checker.cc +++ b/chromeos/components/quick_answers/utils/spell_checker.cc
@@ -7,6 +7,9 @@ #include "base/files/file_util.h" #include "base/logging.h" #include "base/path_service.h" +#include "base/task/task_runner_util.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" #include "base/threading/scoped_blocking_call.h" #include "chrome/common/chrome_paths.h" #include "components/spellcheck/common/spellcheck_common.h" @@ -63,7 +66,6 @@ bool SaveDictionaryData(std::unique_ptr<std::string> data, const base::FilePath& file_path) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); @@ -87,8 +89,21 @@ return base::ReplaceFile(tmp_path, file_path, nullptr); } -void RemoveDictionaryFle(const base::FilePath& file_path) { - DCHECK_CURRENTLY_ON(content::BrowserThread::UI); +base::File OpenDictionaryFile(const base::FilePath& file_path) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + + base::File file(file_path, base::File::FLAG_READ | base::File::FLAG_OPEN); + return file; +} + +void CloseDictionaryFile(base::File file) { + base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, + base::BlockingType::MAY_BLOCK); + file.Close(); +} + +void RemoveDictionaryFile(const base::FilePath& file_path) { base::ScopedBlockingCall scoped_blocking_call(FROM_HERE, base::BlockingType::MAY_BLOCK); @@ -99,7 +114,9 @@ SpellChecker::SpellChecker( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) - : url_loader_factory_(url_loader_factory) { + : task_runner_(base::ThreadPool::CreateSequencedTaskRunner( + {base::MayBlock(), base::TaskPriority::USER_VISIBLE})), + url_loader_factory_(url_loader_factory) { quick_answers_state_observation_.Observe(QuickAnswersState::Get()); } @@ -139,30 +156,14 @@ void SpellChecker::InitializeDictionary() { DCHECK(!dictionary_file_path_.empty()); - // If the dictionary is not available, try to download it from the server. - if (!base::PathExists(dictionary_file_path_)) { - auto url = - GetDictionaryURL(dictionary_file_path_.BaseName().MaybeAsASCII()); - - auto resource_request = std::make_unique<network::ResourceRequest>(); - resource_request->url = url; - resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit; - loader_ = network::SimpleURLLoader::Create(std::move(resource_request), - kNetworkTrafficAnnotationTag); - // TODO(b/226221138): Probably use |DownloadToTempFile| instead. - loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( - url_loader_factory_.get(), - base::BindOnce(&SpellChecker::OnSimpleURLLoaderComplete, - base::Unretained(this))); - return; - } - - InitializeSpellCheckService(); + base::PostTaskAndReplyWithResult( + task_runner_.get(), FROM_HERE, + base::BindOnce(&base::PathExists, dictionary_file_path_), + base::BindOnce(&SpellChecker::OnPathExistsComplete, + weak_factory_.GetWeakPtr())); } void SpellChecker::InitializeSpellCheckService() { - DCHECK(base::PathExists(dictionary_file_path_)); - if (!service_) { service_ = content::ServiceProcessHost::Launch<mojom::SpellCheckService>( content::ServiceProcessHost::Options() @@ -170,12 +171,11 @@ .Pass()); } - base::File file(dictionary_file_path_, - base::File::FLAG_READ | base::File::FLAG_OPEN); - - service_->CreateDictionary(file.Duplicate(), - base::BindOnce(&SpellChecker::OnDictionaryCreated, - base::Unretained(this))); + base::PostTaskAndReplyWithResult( + task_runner_.get(), FROM_HERE, + base::BindOnce(&OpenDictionaryFile, dictionary_file_path_), + base::BindOnce(&SpellChecker::OnOpenDictionaryFileComplete, + weak_factory_.GetWeakPtr())); } void SpellChecker::OnSimpleURLLoaderComplete( @@ -197,12 +197,12 @@ return; } - if (!SaveDictionaryData(std::move(data), dictionary_file_path_)) { - MaybeRetryInitialize(); - return; - } - - InitializeSpellCheckService(); + base::PostTaskAndReplyWithResult( + task_runner_.get(), FROM_HERE, + base::BindOnce(&SaveDictionaryData, std::move(data), + dictionary_file_path_), + base::BindOnce(&SpellChecker::OnSaveDictionaryDataComplete, + weak_factory_.GetWeakPtr())); } void SpellChecker::OnDictionaryCreated( @@ -219,7 +219,8 @@ } void SpellChecker::MaybeRetryInitialize() { - RemoveDictionaryFle(dictionary_file_path_); + task_runner_->PostTask( + FROM_HERE, base::BindOnce(&RemoveDictionaryFile, dictionary_file_path_)); if (num_retries_ >= kMaxRetries) { LOG(ERROR) << "Service initialize failed after max retries"; @@ -231,4 +232,44 @@ InitializeDictionary(); } +void SpellChecker::OnPathExistsComplete(bool path_exists) { + // If the dictionary is not available, try to download it from the server. + if (path_exists) { + auto url = + GetDictionaryURL(dictionary_file_path_.BaseName().MaybeAsASCII()); + + auto resource_request = std::make_unique<network::ResourceRequest>(); + resource_request->url = url; + resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit; + loader_ = network::SimpleURLLoader::Create(std::move(resource_request), + kNetworkTrafficAnnotationTag); + // TODO(b/226221138): Probably use |DownloadToTempFile| instead. + loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( + url_loader_factory_.get(), + base::BindOnce(&SpellChecker::OnSimpleURLLoaderComplete, + base::Unretained(this))); + return; + } + + InitializeSpellCheckService(); +} + +void SpellChecker::OnSaveDictionaryDataComplete(bool dictionary_saved) { + if (!dictionary_saved) { + MaybeRetryInitialize(); + return; + } + + InitializeSpellCheckService(); +} + +void SpellChecker::OnOpenDictionaryFileComplete(base::File file) { + service_->CreateDictionary(file.Duplicate(), + base::BindOnce(&SpellChecker::OnDictionaryCreated, + base::Unretained(this))); + + task_runner_->PostTask(FROM_HERE, + base::BindOnce(&CloseDictionaryFile, std::move(file))); +} + } // namespace quick_answers
diff --git a/chromeos/components/quick_answers/utils/spell_checker.h b/chromeos/components/quick_answers/utils/spell_checker.h index 3bc40093..f78dbbec 100644 --- a/chromeos/components/quick_answers/utils/spell_checker.h +++ b/chromeos/components/quick_answers/utils/spell_checker.h
@@ -11,6 +11,7 @@ #include "base/files/file_path.h" #include "base/memory/weak_ptr.h" #include "base/scoped_observation.h" +#include "base/task/sequenced_task_runner.h" #include "chromeos/components/quick_answers/public/cpp/quick_answers_state.h" #include "chromeos/components/quick_answers/public/mojom/spell_check.mojom.h" #include "mojo/public/cpp/bindings/remote.h" @@ -59,6 +60,14 @@ void MaybeRetryInitialize(); + // The reply points for PostTaskAndReplyWithResult. + void OnPathExistsComplete(bool path_exists); + void OnSaveDictionaryDataComplete(bool dictionary_saved); + void OnOpenDictionaryFileComplete(base::File file); + + // Task runner where the file operations takes place. + scoped_refptr<base::SequencedTaskRunner> const task_runner_; + // Whether the Quick answers feature is enabled in settings. bool feature_enabled_ = false;
diff --git a/chromeos/constants/chromeos_features.cc b/chromeos/constants/chromeos_features.cc index 6788b019..2f478cc 100644 --- a/chromeos/constants/chromeos_features.cc +++ b/chromeos/constants/chromeos_features.cc
@@ -13,12 +13,6 @@ namespace features { -// Enables or disables the ability to use advertisement monitoring. -// Advertisement monitoring allows applications to register low energy scanners -// that filter low energy advertisements in a power-efficient manner. -const base::Feature kBluetoothAdvertisementMonitoring{ - "BluetoothAdvertisementMonitoring", base::FEATURE_ENABLED_BY_DEFAULT}; - // Enables or disables more filtering out of phones from the Bluetooth UI. const base::Feature kBluetoothPhoneFilter{"BluetoothPhoneFilter", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -44,10 +38,6 @@ const base::Feature kQuickAnswersForMoreLocales{ "QuickAnswersForMoreLocales", base::FEATURE_DISABLED_BY_DEFAULT}; -bool IsBluetoothAdvertisementMonitoringEnabled() { - return base::FeatureList::IsEnabled(kBluetoothAdvertisementMonitoring); -} - bool IsDarkLightModeEnabled() { return base::FeatureList::IsEnabled(kDarkLightMode); }
diff --git a/chromeos/constants/chromeos_features.h b/chromeos/constants/chromeos_features.h index b4e9165..f09b8a494 100644 --- a/chromeos/constants/chromeos_features.h +++ b/chromeos/constants/chromeos_features.h
@@ -23,8 +23,6 @@ // being rolled out via Finch, add a comment in the .cc file. COMPONENT_EXPORT(CHROMEOS_CONSTANTS) -extern const base::Feature kBluetoothAdvertisementMonitoring; -COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kBluetoothPhoneFilter; COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const base::Feature kDarkLightMode; COMPONENT_EXPORT(CHROMEOS_CONSTANTS) @@ -38,8 +36,6 @@ // Keep alphabetized. -COMPONENT_EXPORT(CHROMEOS_CONSTANTS) -bool IsBluetoothAdvertisementMonitoringEnabled(); COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsDarkLightModeEnabled(); COMPONENT_EXPORT(CHROMEOS_CONSTANTS) bool IsQuickAnswersV2TranslationDisabled(); COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc index 6035334b..f43c976 100644 --- a/chromeos/lacros/lacros_service.cc +++ b/chromeos/lacros/lacros_service.cc
@@ -698,4 +698,10 @@ observer_list_->Notify(FROM_HERE, &Observer::OnPolicyFetchAttempt); } +void LacrosService::NotifyComponentPolicyUpdated(ComponentPolicyMap policy) { + DCHECK_CALLED_ON_VALID_SEQUENCE(affine_sequence_checker_); + observer_list_->Notify(FROM_HERE, &Observer::OnComponentPolicyUpdated, + std::move(policy)); +} + } // namespace chromeos
diff --git a/chromeos/lacros/lacros_service.h b/chromeos/lacros/lacros_service.h index 2552496..fb69e0f 100644 --- a/chromeos/lacros/lacros_service.h +++ b/chromeos/lacros/lacros_service.h
@@ -58,6 +58,8 @@ // documented with threading requirements. class COMPONENT_EXPORT(CHROMEOS_LACROS) LacrosService { public: + using ComponentPolicyMap = + base::flat_map<policy::PolicyNamespace, base::Value>; class Observer { public: // Called when the new policy data is received from Ash. @@ -67,6 +69,9 @@ // Called when policy fetch attempt is made in Ash. virtual void OnPolicyFetchAttempt() {} + // Called when the new component policy is received from Ash. + virtual void OnComponentPolicyUpdated(const ComponentPolicyMap& policy) {} + protected: virtual ~Observer() = default; }; @@ -125,6 +130,10 @@ // Notifies that an attempt to update the device account policy has been made. void NotifyPolicyFetchAttempt(); + // Notifies that the device account component policy is updated with the + // input data. Must be called on the affined sequence. + void NotifyComponentPolicyUpdated(ComponentPolicyMap policy); + // Returns whether this interface uses the automatic registration system to be // available for immediate use at startup. Any crosapi interface can be // registered by using ConstructRemote.
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc index 2adfb206..61a6f81 100644 --- a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
@@ -161,8 +161,17 @@ #if BUILDFLAG(USE_INTERNAL_AUTOFILL_HEADERS) // Test that Autofill.ShadowPredictions.* describes the differences between the // predictions and the submitted values. +#if BUILDFLAG(IS_ANDROID) +// https://crbug.com/1324261 +#define MAYBE_SubmissionWithAgreeingShadowPredictions \ + DISABLED_SubmissionWithAgreeingShadowPredictions +#else +#define MAYBE_SubmissionWithAgreeingShadowPredictions \ + SubmissionWithAgreeingShadowPredictions +#endif + TEST_F(AutofillShadowPredictionMetricsTest, - SubmissionWithAgreeingShadowPredictions) { + MAYBE_SubmissionWithAgreeingShadowPredictions) { FormData form = GetFormWith2Fields(autofill_client_->form_origin()); form.fields[0].value = u"Elvis Aaron Presley"; // A known `NAME_FULL`. form.fields[1].value = u"buddy@gmail.com"; // A known `EMAIL_ADDRESS`.
diff --git a/components/bookmarks/browser/bookmark_load_details.cc b/components/bookmarks/browser/bookmark_load_details.cc index f1b9c52..d1bed0c 100644 --- a/components/bookmarks/browser/bookmark_load_details.cc +++ b/components/bookmarks/browser/bookmark_load_details.cc
@@ -13,7 +13,8 @@ BookmarkLoadDetails::BookmarkLoadDetails(BookmarkClient* client) : load_managed_node_callback_(client->GetLoadManagedNodeCallback()), - index_(std::make_unique<TitledUrlIndex>()) { + index_(std::make_unique<TitledUrlIndex>()), + load_start_(base::TimeTicks::Now()) { // WARNING: do NOT add |client| as a member. Much of this code runs on another // thread, and |client_| is not thread safe, and/or may be destroyed before // this.
diff --git a/components/bookmarks/browser/bookmark_load_details.h b/components/bookmarks/browser/bookmark_load_details.h index 0c1ff5e5..830826e 100644 --- a/components/bookmarks/browser/bookmark_load_details.h +++ b/components/bookmarks/browser/bookmark_load_details.h
@@ -13,6 +13,10 @@ #include "components/bookmarks/browser/bookmark_client.h" #include "components/bookmarks/browser/bookmark_node.h" +namespace base { +class TimeTicks; +} + namespace bookmarks { class BookmarkPermanentNode; @@ -91,6 +95,8 @@ void CreateUrlIndex(); UrlIndex* url_index() { return url_index_.get(); } + base::TimeTicks load_start() { return load_start_; } + private: std::unique_ptr<BookmarkNode> root_node_; raw_ptr<BookmarkNode> root_node_ptr_; @@ -108,6 +114,7 @@ scoped_refptr<UrlIndex> url_index_; // A string blob represetning the sync metadata stored in the json file. std::string sync_metadata_str_; + base::TimeTicks load_start_; }; } // namespace bookmarks
diff --git a/components/bookmarks/browser/bookmark_model.cc b/components/bookmarks/browser/bookmark_model.cc index 8dc727b..66b8d1b8 100644 --- a/components/bookmarks/browser/bookmark_model.cc +++ b/components/bookmarks/browser/bookmark_model.cc
@@ -34,6 +34,7 @@ #include "components/bookmarks/browser/url_and_title.h" #include "components/bookmarks/browser/url_index.h" #include "components/bookmarks/common/bookmark_constants.h" +#include "components/bookmarks/common/bookmark_metrics.h" #include "components/favicon_base/favicon_types.h" #include "components/strings/grit/components_strings.h" #include "ui/base/l10n/l10n_util.h" @@ -823,6 +824,10 @@ base::Unretained(store_.get())) : base::DoNothing()); + const base::TimeDelta load_duration = + base::TimeTicks::Now() - details->load_start(); + metrics::RecordTimeToLoadAtStartup(load_duration); + // Notify our direct observers. for (BookmarkModelObserver& observer : observers_) observer.BookmarkModelLoaded(this, details->ids_reassigned());
diff --git a/components/bookmarks/browser/bookmark_storage.cc b/components/bookmarks/browser/bookmark_storage.cc index 0ff4aee..915b967 100644 --- a/components/bookmarks/browser/bookmark_storage.cc +++ b/components/bookmarks/browser/bookmark_storage.cc
@@ -23,6 +23,7 @@ #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h" #include "components/bookmarks/common/bookmark_constants.h" +#include "components/bookmarks/common/bookmark_metrics.h" namespace bookmarks { @@ -50,7 +51,8 @@ writer_(profile_path.Append(kBookmarksFileName), backend_task_runner_, kSaveDelay, - "BookmarkStorage") {} + "BookmarkStorage"), + last_scheduled_save_(base::TimeTicks::Now()) {} BookmarkStorage::~BookmarkStorage() { if (writer_.HasPendingWrite()) @@ -67,6 +69,11 @@ } writer_.ScheduleWriteWithBackgroundDataSerializer(this); + + const base::TimeDelta schedule_delta = + base::TimeTicks::Now() - last_scheduled_save_; + metrics::RecordTimeSinceLastScheduledSave(schedule_delta); + last_scheduled_save_ = base::TimeTicks::Now(); } void BookmarkStorage::BookmarkModelDeleted() {
diff --git a/components/bookmarks/browser/bookmark_storage.h b/components/bookmarks/browser/bookmark_storage.h index 6bd25c8..e858258 100644 --- a/components/bookmarks/browser/bookmark_storage.h +++ b/components/bookmarks/browser/bookmark_storage.h
@@ -89,6 +89,9 @@ // The state of the backup file creation which is created lazily just before // the first scheduled save. bool backup_triggered_ = false; + + // Used to track the frequency of saves starting from the first save. + base::TimeTicks last_scheduled_save_; }; } // namespace bookmarks
diff --git a/components/bookmarks/browser/bookmark_storage_unittest.cc b/components/bookmarks/browser/bookmark_storage_unittest.cc index e03c2e9..c20ec55 100644 --- a/components/bookmarks/browser/bookmark_storage_unittest.cc +++ b/components/bookmarks/browser/bookmark_storage_unittest.cc
@@ -9,6 +9,7 @@ #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/time/time.h" #include "components/bookmarks/browser/bookmark_model.h" @@ -31,6 +32,7 @@ } // namespace TEST(BookmarkStorageTest, ShouldSaveFileToDiskAfterDelay) { + base::HistogramTester histogram_tester; std::unique_ptr<BookmarkModel> model = CreateModelWithOneBookmark(); base::ScopedTempDir temp_dir; ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); @@ -56,6 +58,8 @@ task_environment.FastForwardBy(base::Milliseconds(20)); EXPECT_FALSE(storage.HasScheduledSaveForTesting()); EXPECT_TRUE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + histogram_tester.ExpectTotalCount( + "Bookmarks.Storage.TimeSinceLastScheduledSave", 1); } TEST(BookmarkStorageTest, ShouldSaveFileDespiteShutdownWhileScheduled) { @@ -115,4 +119,36 @@ EXPECT_FALSE(base::PathExists(backup_file_path)); } +TEST(BookmarkStorageTest, RecordTimeSinceLastScheduledSave) { + base::HistogramTester histogram_tester; + std::unique_ptr<BookmarkModel> model = CreateModelWithOneBookmark(); + base::ScopedTempDir temp_dir; + ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); + + base::test::TaskEnvironment task_environment{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + BookmarkStorage storage(model.get(), temp_dir.GetPath()); + + ASSERT_FALSE(storage.HasScheduledSaveForTesting()); + ASSERT_FALSE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + + storage.ScheduleSave(); + + base::TimeDelta delay_ms = base::Milliseconds(10); + // Advance clock until immediately before saving takes place. + task_environment.FastForwardBy(delay_ms); + storage.ScheduleSave(); + EXPECT_TRUE(storage.HasScheduledSaveForTesting()); + EXPECT_FALSE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + + // Advance clock past the saving moment. + task_environment.FastForwardBy(BookmarkStorage::kSaveDelay + delay_ms); + EXPECT_FALSE(storage.HasScheduledSaveForTesting()); + EXPECT_TRUE(base::PathExists(temp_dir.GetPath().Append(kBookmarksFileName))); + histogram_tester.ExpectTotalCount( + "Bookmarks.Storage.TimeSinceLastScheduledSave", 2); + histogram_tester.ExpectTimeBucketCount( + "Bookmarks.Storage.TimeSinceLastScheduledSave", delay_ms, 1); +} + } // namespace bookmarks
diff --git a/components/bookmarks/browser/model_loader.cc b/components/bookmarks/browser/model_loader.cc index a945f27b..263c902 100644 --- a/components/bookmarks/browser/model_loader.cc +++ b/components/bookmarks/browser/model_loader.cc
@@ -18,6 +18,7 @@ #include "components/bookmarks/browser/bookmark_load_details.h" #include "components/bookmarks/browser/titled_url_index.h" #include "components/bookmarks/browser/url_index.h" +#include "components/bookmarks/common/bookmark_metrics.h" namespace bookmarks { @@ -88,6 +89,7 @@ DCHECK_LE(stats.duplicate_url_and_title_and_parent_bookmark_count, stats.duplicate_url_and_title_bookmark_count); + // TODO(crbug.com/1321690): Consolidate metrics calls into a file. base::UmaHistogramCounts100000( "Bookmarks.Count.OnProfileLoad", base::saturated_cast<int>(stats.total_url_bookmark_count)); @@ -126,6 +128,11 @@ base::saturated_cast<int>( stats.total_url_bookmark_count - stats.duplicate_url_and_title_and_parent_bookmark_count)); + + int64_t file_size_bytes; + if (bookmark_file_exists && base::GetFileSize(path, &file_size_bytes)) { + metrics::RecordFileSizeAtStartup(file_size_bytes); + } } } // namespace
diff --git a/components/bookmarks/common/BUILD.gn b/components/bookmarks/common/BUILD.gn index 5985827a..192cf94 100644 --- a/components/bookmarks/common/BUILD.gn +++ b/components/bookmarks/common/BUILD.gn
@@ -6,6 +6,8 @@ sources = [ "bookmark_constants.cc", "bookmark_constants.h", + "bookmark_metrics.cc", + "bookmark_metrics.h", "bookmark_pref_names.cc", "bookmark_pref_names.h", ]
diff --git a/components/bookmarks/common/bookmark_metrics.cc b/components/bookmarks/common/bookmark_metrics.cc new file mode 100644 index 0000000..267089c --- /dev/null +++ b/components/bookmarks/common/bookmark_metrics.cc
@@ -0,0 +1,29 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/bookmarks/common/bookmark_metrics.h" + +#include "base/metrics/histogram_functions.h" + +namespace { +const int kBytesPerKB = 1024; +} + +namespace bookmarks::metrics { + +void RecordTimeSinceLastScheduledSave(base::TimeDelta delta) { + UmaHistogramLongTimes("Bookmarks.Storage.TimeSinceLastScheduledSave", delta); +} + +void RecordTimeToLoadAtStartup(base::TimeDelta delta) { + UmaHistogramTimes("Bookmarks.Storage.TimeToLoadAtStartup", delta); +} + +void RecordFileSizeAtStartup(int64_t total_bytes) { + int total_size_kb = base::saturated_cast<int>(total_bytes / kBytesPerKB); + base::UmaHistogramCounts1M("Bookmarks.Storage.FileSizeAtStartup", + total_size_kb); +} + +} // namespace bookmarks::metrics \ No newline at end of file
diff --git a/components/bookmarks/common/bookmark_metrics.h b/components/bookmarks/common/bookmark_metrics.h new file mode 100644 index 0000000..500051c --- /dev/null +++ b/components/bookmarks/common/bookmark_metrics.h
@@ -0,0 +1,25 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_BOOKMARKS_COMMON_BOOKMARK_METRICS_H_ +#define COMPONENTS_BOOKMARKS_COMMON_BOOKMARK_METRICS_H_ + +#include "base/time/time.h" + +namespace bookmarks::metrics { + +// Records the time since the last save with a 1 hour max. The first save will +// record the time since startup. +void RecordTimeSinceLastScheduledSave(base::TimeDelta delta); + +// Records the time it takes to load the bookmark model on startup with a 10 +// second max, the time starts when BookmarkModel.Load is called. +void RecordTimeToLoadAtStartup(base::TimeDelta delta); + +// Records size of the bookmark file at startup. +void RecordFileSizeAtStartup(int64_t total_bytes); + +} // namespace bookmarks::metrics + +#endif // COMPONENTS_BOOKMARKS_COMMON_BOOKMARK_METRICS_H_ \ No newline at end of file
diff --git a/components/bookmarks/test/test_bookmark_client.cc b/components/bookmarks/test/test_bookmark_client.cc index 61e6e16..759ade0 100644 --- a/components/bookmarks/test/test_bookmark_client.cc +++ b/components/bookmarks/test/test_bookmark_client.cc
@@ -12,6 +12,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/notreached.h" +#include "base/time/time.h" #include "components/bookmarks/browser/bookmark_load_details.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/bookmarks/browser/bookmark_node.h"
diff --git a/components/browser_ui/styles/android/BUILD.gn b/components/browser_ui/styles/android/BUILD.gn index 5929c14..4c0f6bb 100644 --- a/components/browser_ui/styles/android/BUILD.gn +++ b/components/browser_ui/styles/android/BUILD.gn
@@ -42,7 +42,7 @@ "java/res/color/default_text_color_list.xml", "java/res/color/default_text_color_on_accent1_list.xml", "java/res/color/default_text_color_secondary_list.xml", - "java/res/color/filled_button_bg_dynamic.xml", + "java/res/color/filled_button_bg_dynamic_list.xml", "java/res/color/icon_animated_faded_color.xml", "java/res/color/new_tab_button_pressed_tint.xml", "java/res/color/new_tab_button_tint.xml",
diff --git a/components/browser_ui/styles/android/java/res/color/filled_button_bg_dynamic.xml b/components/browser_ui/styles/android/java/res/color/filled_button_bg_dynamic_list.xml similarity index 100% rename from components/browser_ui/styles/android/java/res/color/filled_button_bg_dynamic.xml rename to components/browser_ui/styles/android/java/res/color/filled_button_bg_dynamic_list.xml
diff --git a/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml b/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml index 74bb1ea..4e29425 100644 --- a/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml +++ b/components/browser_ui/styles/android/java/res/values/semantic_colors_dynamic.xml
@@ -3,7 +3,6 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> <resources xmlns:tools="http://schemas.android.com/tools"> - <!-- Full dynamic colors ?attr version. --> <macro name="default_bg_color">?attr/colorSurface</macro> <macro name="default_bg_color_elev_0">?attr/colorSurface</macro> @@ -40,51 +39,10 @@ <macro name="toolbar_background_primary" tools:ignore="UnusedResources">@macro/default_bg_color</macro> - <!-- Temporarily holdback @color version. Keep until we're certain we won't - need to disable. --> - <!-- - <macro name="default_bg_color">@color/default_bg_color_baseline</macro> - <macro name="default_bg_color_elev_0">@color/default_bg_color_elev_0_baseline</macro> - - <macro name="default_control_color_active">@color/default_control_color_active_baseline</macro> - <macro name="default_control_color_normal">@color/default_control_color_normal_baseline</macro> - - <macro name="default_icon_color">@color/default_icon_color_baseline</macro> - <macro name="default_icon_color_accent1">@color/default_icon_color_accent1_baseline</macro> - <macro name="default_icon_color_inverse">@color/default_icon_color_inverse_baseline</macro> - <macro name="default_icon_color_on_accent1">@color/default_icon_color_on_accent1_baseline</macro> - <macro name="default_icon_color_secondary">@color/default_icon_color_secondary_baseline</macro> - - <macro name="default_text_color">@color/default_text_color_baseline</macro> - <macro name="default_text_color_accent1">@color/default_text_color_blue_baseline</macro> - <macro name="default_text_color_on_accent1">@color/default_text_color_on_accent1_baseline</macro> - <macro name="default_text_color_on_accent2_container">@color/default_text_color_on_accent2_container_baseline</macro> - <macro name="default_text_color_secondary">@color/default_text_color_secondary_baseline</macro> - - <macro name="switch_enabled_unchecked_color_dark">@color/switch_enabled_unchecked_color_baseline_dark</macro> - <macro name="switch_enabled_unchecked_color_light">@color/switch_enabled_unchecked_color_baseline_light</macro> - <macro name="switch_track_disabled_color">@color/switch_track_disabled_color_baseline</macro> - <macro name="switch_thumb_disabled_color">@color/switch_thumb_disabled_color_baseline</macro> - - <macro name="hairline_stroke_color">@color/hairline_stroke_color_baseline</macro> - <macro name="divider_line_bg_color">@color/divider_line_bg_color_baseline</macro> - <macro name="drag_handlebar_color">@macro/divider_line_bg_color</macro> - - <macro name="chip_bg_color">@color/default_bg_color_baseline</macro> - <macro name="chip_bg_selected_color">@color/chip_bg_selected_color_baseline</macro> - <macro name="chip_outline_color">@color/default_chip_outline_color</macro> - <macro name="chip_outline_focused_color">@color/chip_outline_focused_color_baseline</macro> - <macro name="chip_state_layer_color">@color/chip_state_layer_color_baseline</macro> - <macro name="chip_state_layer_selected_color">@color/chip_state_layer_selected_color_baseline</macro> - - <macro name="toolbar_background_primary">@color/default_bg_color_baseline</macro> - --> - <!-- Gated by full dynamic colors param, no fallback needed. --> <macro name="circular_progress_icon_color_small_large">?attr/colorPrimary</macro> <macro name="circular_progress_outer_circle_progress_color_small">?attr/colorPrimary</macro> <!-- Colors that will be experimented with. --> - <!--<macro name="default_text_color_link">?attr/colorPrimary</macro>--> <macro name="default_text_color_link">@color/default_text_color_link_baseline</macro> </resources>
diff --git a/components/browser_ui/styles/android/java/res/values/themes.xml b/components/browser_ui/styles/android/java/res/values/themes.xml index 322ffae..c79b6c8 100644 --- a/components/browser_ui/styles/android/java/res/values/themes.xml +++ b/components/browser_ui/styles/android/java/res/values/themes.xml
@@ -67,7 +67,7 @@ <item name="android:textColorHint">@color/default_text_color_hint_list</item> </style> <style name="ThemeOverlay.DynamicButtons" parent=""> - <item name="globalFilledButtonBgColor">@color/filled_button_bg_dynamic</item> + <item name="globalFilledButtonBgColor">@color/filled_button_bg_dynamic_list</item> <item name="globalFilledButtonTextColor">@color/default_text_color_on_accent1_list</item> <item name="globalTextButtonTextColor">@color/default_text_color_accent1_tint_list</item> <item name="globalOutlinedButtonBorderColor">@macro/divider_line_bg_color</item>
diff --git a/components/content_settings/core/browser/content_settings_policy_provider.cc b/components/content_settings/core/browser/content_settings_policy_provider.cc index cb5c81c..1d9ecd0 100644 --- a/components/content_settings/core/browser/content_settings_policy_provider.cc +++ b/components/content_settings/core/browser/content_settings_policy_provider.cc
@@ -55,6 +55,10 @@ ContentSettingsType::JAVASCRIPT, CONTENT_SETTING_ALLOW}, {prefs::kManagedJavaScriptBlockedForUrls, ContentSettingsType::JAVASCRIPT, CONTENT_SETTING_BLOCK}, + {prefs::kManagedClipboardAllowedForUrls, + ContentSettingsType::CLIPBOARD_READ_WRITE, CONTENT_SETTING_ALLOW}, + {prefs::kManagedClipboardBlockedForUrls, + ContentSettingsType::CLIPBOARD_READ_WRITE, CONTENT_SETTING_BLOCK}, {prefs::kManagedNotificationsAllowedForUrls, ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_ALLOW}, {prefs::kManagedNotificationsBlockedForUrls, @@ -107,6 +111,8 @@ constexpr const char* kManagedPrefs[] = { prefs::kManagedAutoSelectCertificateForUrls, + prefs::kManagedClipboardAllowedForUrls, + prefs::kManagedClipboardBlockedForUrls, prefs::kManagedCookiesAllowedForUrls, prefs::kManagedCookiesBlockedForUrls, prefs::kManagedCookiesSessionOnlyForUrls, @@ -152,6 +158,7 @@ // is managed any user defined exceptions (patterns) for this type are ignored. constexpr const char* kManagedDefaultPrefs[] = { prefs::kManagedDefaultAdsSetting, + prefs::kManagedDefaultClipboardSetting, prefs::kManagedDefaultCookiesSetting, prefs::kManagedDefaultFileSystemReadGuardSetting, prefs::kManagedDefaultFileSystemWriteGuardSetting, @@ -188,6 +195,8 @@ const PolicyProvider::PrefsForManagedDefaultMapEntry PolicyProvider::kPrefsForManagedDefault[] = { {ContentSettingsType::ADS, prefs::kManagedDefaultAdsSetting}, + {ContentSettingsType::CLIPBOARD_READ_WRITE, + prefs::kManagedDefaultClipboardSetting}, {ContentSettingsType::COOKIES, prefs::kManagedDefaultCookiesSetting}, {ContentSettingsType::IMAGES, prefs::kManagedDefaultImagesSetting}, {ContentSettingsType::GEOLOCATION,
diff --git a/components/content_settings/core/common/pref_names.cc b/components/content_settings/core/common/pref_names.cc index e6a333f..11a4674 100644 --- a/components/content_settings/core/common/pref_names.cc +++ b/components/content_settings/core/common/pref_names.cc
@@ -25,6 +25,8 @@ // content settings. const char kManagedDefaultAdsSetting[] = "profile.managed_default_content_settings.ads"; +const char kManagedDefaultClipboardSetting[] = + "profile.managed_default_content_settings.clipboard"; const char kManagedDefaultCookiesSetting[] = "profile.managed_default_content_settings.cookies"; const char kManagedDefaultGeolocationSetting[] = @@ -66,6 +68,10 @@ // Preferences that are exclusively used to store managed // content settings patterns. +const char kManagedClipboardAllowedForUrls[] = + "profile.managed_clipboard_allowed_for_urls"; +const char kManagedClipboardBlockedForUrls[] = + "profile.managed_clipboard_blocked_for_urls"; const char kManagedAutoSelectCertificateForUrls[] = "profile.managed_auto_select_certificate_for_urls"; const char kManagedCookiesAllowedForUrls[] =
diff --git a/components/content_settings/core/common/pref_names.h b/components/content_settings/core/common/pref_names.h index 8d01f22..ac1023b 100644 --- a/components/content_settings/core/common/pref_names.h +++ b/components/content_settings/core/common/pref_names.h
@@ -19,6 +19,7 @@ extern const char kContentSettingsWindowLastTabIndex[]; extern const char kManagedDefaultAdsSetting[]; +extern const char kManagedDefaultClipboardSetting[]; extern const char kManagedDefaultCookiesSetting[]; extern const char kManagedDefaultImagesSetting[]; extern const char kManagedDefaultInsecureContentSetting[]; @@ -39,6 +40,8 @@ extern const char kManagedDefaultWindowPlacementSetting[]; extern const char kManagedDefaultLocalFontsSetting[]; +extern const char kManagedClipboardAllowedForUrls[]; +extern const char kManagedClipboardBlockedForUrls[]; extern const char kManagedCookiesAllowedForUrls[]; extern const char kManagedCookiesBlockedForUrls[]; extern const char kManagedCookiesSessionOnlyForUrls[];
diff --git a/components/cronet/tools/generate_javadoc.py b/components/cronet/tools/generate_javadoc.py index 0a6843f..1a48c9e 100755 --- a/components/cronet/tools/generate_javadoc.py +++ b/components/cronet/tools/generate_javadoc.py
@@ -25,6 +25,7 @@ DOCLAVA_DIR = os.path.join(REPOSITORY_ROOT, 'buildtools', 'android', 'doclava') SDK_DIR = os.path.join(REPOSITORY_ROOT, 'third_party', 'android_sdk', 'public') JAVADOC_PATH = os.path.join(build_utils.JAVA_HOME, 'bin', 'javadoc') +JAR_PATH = os.path.join(build_utils.JAVA_HOME, 'bin', 'jar') JAVADOC_WARNING = """\ javadoc: warning - The old Doclet and Taglet APIs in the packages @@ -112,7 +113,8 @@ # A temporary directory to put the output of cronet api source jar files. unzipped_jar_path = tempfile.mkdtemp(dir=args.output_dir) if os.path.exists(args.input_src_jar): - jar_cmd = ['jar', 'xf', os.path.abspath(args.input_src_jar)] + jar_cmd = [os.path.relpath(JAR_PATH, unzipped_jar_path), 'xf', + os.path.abspath(args.input_src_jar)] build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path) else: raise Exception('Jar file does not exist: %s' % args.input_src_jar)
diff --git a/components/enterprise/browser/reporting/policy_info.cc b/components/enterprise/browser/reporting/policy_info.cc index cc7ed94..d9156637 100644 --- a/components/enterprise/browser/reporting/policy_info.cc +++ b/components/enterprise/browser/reporting/policy_info.cc
@@ -108,24 +108,23 @@ } // namespace void AppendChromePolicyInfoIntoProfileReport( - const base::Value& policies, + const base::Value::Dict& policies, em::ChromeUserProfileInfo* profile_info) { - for (auto policy_iter : policies.FindKey("chromePolicies")->DictItems()) { + for (auto policy_iter : *policies.FindDict("chromePolicies")) { UpdatePolicyInfo(profile_info->add_chrome_policies(), policy_iter.first, policy_iter.second); } } void AppendExtensionPolicyInfoIntoProfileReport( - const base::Value& policies, + const base::Value::Dict& policies, em::ChromeUserProfileInfo* profile_info) { - if (!policies.FindKey("extensionPolicies")) { + if (!policies.Find("extensionPolicies")) { // Android and iOS don't support extensions and their policies. return; } - for (auto extension_iter : - policies.FindKey("extensionPolicies")->DictItems()) { + for (auto extension_iter : *policies.FindDict("extensionPolicies")) { const base::Value& policies_value = extension_iter.second; if (policies_value.DictSize() == 0) continue;
diff --git a/components/enterprise/browser/reporting/policy_info.h b/components/enterprise/browser/reporting/policy_info.h index 82a5fa9..820ef51 100644 --- a/components/enterprise/browser/reporting/policy_info.h +++ b/components/enterprise/browser/reporting/policy_info.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_ENTERPRISE_BROWSER_REPORTING_POLICY_INFO_H_ #define COMPONENTS_ENTERPRISE_BROWSER_REPORTING_POLICY_INFO_H_ +#include "base/values.h" #include "components/policy/proto/device_management_backend.pb.h" namespace base { @@ -20,11 +21,11 @@ namespace enterprise_reporting { void AppendChromePolicyInfoIntoProfileReport( - const base::Value& policies, + const base::Value::Dict& policies, enterprise_management::ChromeUserProfileInfo* profile_info); void AppendExtensionPolicyInfoIntoProfileReport( - const base::Value& policies, + const base::Value::Dict& policies, enterprise_management::ChromeUserProfileInfo* profile_info); void AppendMachineLevelUserCloudPolicyFetchTimestamp(
diff --git a/components/enterprise/browser/reporting/profile_report_generator.cc b/components/enterprise/browser/reporting/profile_report_generator.cc index 3a88bc352..b28fd89d 100644 --- a/components/enterprise/browser/reporting/profile_report_generator.cc +++ b/components/enterprise/browser/reporting/profile_report_generator.cc
@@ -72,7 +72,7 @@ policies_ = policy::DictionaryPolicyConversions(std::move(client)) .EnableConvertTypes(false) .EnablePrettyPrint(false) - .ToValue(); + .ToValueDict(); GetChromePolicyInfo(); GetExtensionPolicyInfo(); GetPolicyFetchTimestampInfo();
diff --git a/components/enterprise/browser/reporting/profile_report_generator.h b/components/enterprise/browser/reporting/profile_report_generator.h index d5faeaad..c96480c0 100644 --- a/components/enterprise/browser/reporting/profile_report_generator.h +++ b/components/enterprise/browser/reporting/profile_report_generator.h
@@ -83,7 +83,7 @@ private: std::unique_ptr<Delegate> delegate_; - base::Value policies_; + base::Value::Dict policies_; bool extensions_enabled_ = true; bool policies_enabled_ = true;
diff --git a/components/feed/core/proto/v2/store.proto b/components/feed/core/proto/v2/store.proto index 67ad56d..3582cf80f 100644 --- a/components/feed/core/proto/v2/store.proto +++ b/components/feed/core/proto/v2/store.proto
@@ -70,6 +70,9 @@ repeated int64 content_ids = 11; // Root EventID provided by the server. bytes root_event_id = 12; + // The unix timestamp in milliseconds that the feed response is produced on + // the server. This is returned from the server and based on server clock. + int64 last_server_response_time_millis = 15; reserved 3, 5; }
diff --git a/components/feed/core/proto/v2/wire/info_card.proto b/components/feed/core/proto/v2/wire/info_card.proto index a75703f5..cec6224 100644 --- a/components/feed/core/proto/v2/wire/info_card.proto +++ b/components/feed/core/proto/v2/wire/info_card.proto
@@ -18,8 +18,8 @@ optional int32 explicitly_dismissed_count = 2; optional int32 view_count = 3; optional int32 click_count = 4; - optional uint64 first_view_timestamp = 5; - optional uint64 last_view_timestamp = 6; + optional int64 first_view_timestamp = 5; + optional int64 last_view_timestamp = 6; } message InfoCardServingInfo { repeated int32 fulfilled_info_card_types = 1;
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc index ab8aa40..115999e 100644 --- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -1864,7 +1864,8 @@ for (bool waa_on : {true, false}) { for (bool privacy_notice_fulfilled : {true, false}) { response_translator_.InjectResponse(MakeTypicalNextPageState( - page++, kTestTimeEpoch, signed_in, waa_on, privacy_notice_fulfilled)); + page++, kTestTimeEpoch, kTestTimeEpoch, signed_in, waa_on, + privacy_notice_fulfilled)); stream_->LoadMore(surface, base::DoNothing()); WaitForIdleTaskQueue(); EXPECT_TRUE(surface.update->logging_parameters().logging_enabled()); @@ -3101,13 +3102,25 @@ } TEST_F(FeedApiTest, InfoCardTrackingActions) { - StreamModelUpdateRequestGenerator model_generator; - response_translator_.InjectResponse(model_generator.MakeFirstPage()); + // Set up the server and client timestamps that affect the computation of + // the view timestamps in the info card tracking state. + base::Time server_timestamp = base::Time::Now(); + task_environment_.AdvanceClock(base::Seconds(100)); + base::Time client_timestamp = base::Time::Now(); + base::TimeDelta timestamp_adjustment = server_timestamp - client_timestamp; + task_environment_.AdvanceClock(base::Seconds(200)); + + // Load the initial page. + response_translator_.InjectResponse( + MakeTypicalInitialModelState(0, client_timestamp, server_timestamp)); TestForYouSurface surface(stream_.get()); WaitForIdleTaskQueue(); base::HistogramTester histograms; + // Perform actions on one info card and verify the histograms. + base::Time first_view_timestamp2 = base::Time::Now() + timestamp_adjustment; + base::Time last_view_timestamp2 = first_view_timestamp2; stream_->ReportInfoCardTrackViewStarted(kForYouStream, kTestInfoCardType2); stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType2, kMinimumViewIntervalSeconds); @@ -3122,12 +3135,15 @@ histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Dismissed", kTestInfoCardType2, 0); + // Perform actions on another info card and verify the histograms. + base::Time first_view_timestamp1 = base::Time::Now() + timestamp_adjustment; stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1, kMinimumViewIntervalSeconds); task_environment_.AdvanceClock(base::Seconds(kMinimumViewIntervalSeconds)); stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1, kMinimumViewIntervalSeconds); task_environment_.AdvanceClock(base::Seconds(kMinimumViewIntervalSeconds)); + base::Time last_view_timestamp1 = base::Time::Now() + timestamp_adjustment; stream_->ReportInfoCardViewed(kForYouStream, kTestInfoCardType1, kMinimumViewIntervalSeconds); stream_->ReportInfoCardClicked(kForYouStream, kTestInfoCardType1); @@ -3141,11 +3157,14 @@ histograms.ExpectBucketCount("ContentSuggestions.Feed.InfoCard.Dismissed", kTestInfoCardType1, 1); - response_translator_.InjectResponse(model_generator.MakeFirstPage()); - stream_->UnloadModel(kForYouStream); - stream_->ExecuteRefreshTask(RefreshTaskId::kRefreshForYouFeed); + // Refresh the page so that a feed query including the info card tracking + // states is sent. + response_translator_.InjectResponse(MakeTypicalRefreshModelState()); + stream_->ManualRefresh(kForYouStream, base::DoNothing()); WaitForIdleTaskQueue(); + // Verify the info card tracking states. There should be 2 states with + // expected counts and view timestamps populated. ASSERT_EQ(2, network_.query_request_sent->feed_request() .feed_query() .chrome_fulfillment_info() @@ -3155,6 +3174,10 @@ state1.set_view_count(3); state1.set_click_count(1); state1.set_explicitly_dismissed_count(1); + state1.set_first_view_timestamp( + feedstore::ToTimestampMillis(first_view_timestamp1)); + state1.set_last_view_timestamp( + feedstore::ToTimestampMillis(last_view_timestamp1)); EXPECT_THAT(state1, EqualsProto(network_.query_request_sent->feed_request() .feed_query() .chrome_fulfillment_info() @@ -3163,6 +3186,10 @@ state2.set_type(kTestInfoCardType2); state2.set_view_count(1); state2.set_click_count(2); + state2.set_first_view_timestamp( + feedstore::ToTimestampMillis(first_view_timestamp2)); + state2.set_last_view_timestamp( + feedstore::ToTimestampMillis(last_view_timestamp2)); EXPECT_THAT(state2, EqualsProto(network_.query_request_sent->feed_request() .feed_query() .chrome_fulfillment_info()
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index eeab3fc..41743e05 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -905,7 +905,6 @@ result.autoplay_enabled = delegate_->IsAutoplayEnabled(); result.acknowledged_notice_keys = NoticeCardTracker::GetAllAckowledgedKeys(profile_prefs_); - result.info_card_tracking_states = info_card_tracker_.GetAllStates(); if (signed_in_request) { result.client_instance_id = prefs::GetClientInstanceId(*profile_prefs_); @@ -953,6 +952,13 @@ if (stream_type.IsWebFeed()) { result.content_order = GetValidWebFeedContentOrder(*profile_prefs_); } + + if (stream->model) { + result.info_card_tracking_states = info_card_tracker_.GetAllStates( + stream->model->last_server_response_time_millis(), + stream->model->last_added_time_millis()); + } + return result; }
diff --git a/components/feed/core/v2/feedstore_util.cc b/components/feed/core/v2/feedstore_util.cc index 5142fa1..d567b50 100644 --- a/components/feed/core/v2/feedstore_util.cc +++ b/components/feed/core/v2/feedstore_util.cc
@@ -186,4 +186,12 @@ return {}; } +void SetLastServerResponseTime(base::Time t, feedstore::StreamData& data) { + data.set_last_server_response_time_millis(ToTimestampMillis(t)); +} + +base::Time GetLastServerResponseTime(const feedstore::StreamData& data) { + return FromTimestampMillis(data.last_server_response_time_millis()); +} + } // namespace feedstore
diff --git a/components/feed/core/v2/feedstore_util.h b/components/feed/core/v2/feedstore_util.h index 57f3159e..def58f5b 100644 --- a/components/feed/core/v2/feedstore_util.h +++ b/components/feed/core/v2/feedstore_util.h
@@ -32,11 +32,14 @@ int64_t ToTimestampMillis(base::Time t); base::Time FromTimestampMillis(int64_t millis); void SetLastAddedTime(base::Time t, feedstore::StreamData& data); +void SetLastServerResponseTime(base::Time t, feedstore::StreamData& data); base::Time GetLastAddedTime(const feedstore::StreamData& data); base::Time GetSessionIdExpiryTime(const feedstore::Metadata& metadata); base::Time GetStreamViewTime(const Metadata& metadata, const feed::StreamType& stream_type); +base::Time GetLastServerResponseTime(const feedstore::StreamData& data); + bool IsKnownStale(const Metadata& metadata, const feed::StreamType& stream_type); base::Time GetLastFetchTime(const Metadata& metadata,
diff --git a/components/feed/core/v2/protocol_translator.cc b/components/feed/core/v2/protocol_translator.cc index a795d3c..0c5823c4 100644 --- a/components/feed/core/v2/protocol_translator.cc +++ b/components/feed/core/v2/protocol_translator.cc
@@ -320,6 +320,12 @@ TranslateContentLifetime(response_metadata.content_lifetime()); } + if (response_metadata.has_response_time_ms()) { + feedstore::SetLastServerResponseTime( + feedstore::FromTimestampMillis(response_metadata.response_time_ms()), + result->stream_data); + } + const auto& chrome_response_metadata = response_metadata.chrome_feed_response_metadata(); // Note that we're storing the raw proto bytes for the root event ID because
diff --git a/components/feed/core/v2/stream/info_card_tracker.cc b/components/feed/core/v2/stream/info_card_tracker.cc index 06f39ad0..4ec06a2 100644 --- a/components/feed/core/v2/stream/info_card_tracker.cc +++ b/components/feed/core/v2/stream/info_card_tracker.cc
@@ -6,11 +6,13 @@ #include <algorithm> +#include "base/base64.h" #include "base/strings/string_number_conversions.h" #include "base/time/time.h" #include "base/values.h" #include "components/feed/core/common/pref_names.h" #include "components/feed/core/v2/config.h" +#include "components/feed/core/v2/feedstore_util.h" #include "components/feed/core/v2/proto_util.h" #include "components/feed/feed_feature_list.h" #include "components/prefs/pref_service.h" @@ -30,6 +32,38 @@ return (i1.type() < i2.type()); } +InfoCardTrackingState DecodeFromBase64SerializedString( + const std::string& base64_serialized_state) { + InfoCardTrackingState state; + + std::string serialized_state; + if (!base::Base64Decode(base64_serialized_state, &serialized_state)) { + DLOG(ERROR) << "Error decoding persisted state from base64"; + return state; + } + + if (!state.ParseFromString(serialized_state)) + DLOG(ERROR) << "Error parsing InfoCardTrackingState message"; + + return state; +} + +int64_t GetAdjustedViewTimestamp(int64_t view_timestamp, + int64_t server_timestamp, + int64_t timestamp_adjustment) { + view_timestamp += timestamp_adjustment; + // Ensure that the view timestamp does not get earlier than the server. + if (view_timestamp < server_timestamp) + view_timestamp = server_timestamp; + // Ensure that the view timestamp does not exceed the lifetime of the content. + int64_t max_timestamp = + server_timestamp + + GetFeedConfig().content_expiration_threshold.InMilliseconds(); + if (view_timestamp > max_timestamp) + view_timestamp = max_timestamp; + return view_timestamp; +} + } // namespace InfoCardTracker::InfoCardTracker(PrefService* profile_prefs) @@ -39,19 +73,32 @@ InfoCardTracker::~InfoCardTracker() = default; -std::vector<InfoCardTrackingState> InfoCardTracker::GetAllStates() const { +std::vector<InfoCardTrackingState> InfoCardTracker::GetAllStates( + int64_t server_timestamp, + int64_t client_timestamp) const { std::vector<InfoCardTrackingState> states; const base::Value* dict = profile_prefs_->Get(prefs::kInfoCardStates); if (dict && dict->is_dict()) { + int64_t timestamp_adjustment = server_timestamp - client_timestamp; for (const auto pair : dict->DictItems()) { int info_card_type = 0; if (!base::StringToInt(pair.first, &info_card_type)) continue; if (!pair.second.is_string()) continue; - InfoCardTrackingState state; - state.ParseFromString(pair.second.GetString()); + InfoCardTrackingState state = + DecodeFromBase64SerializedString(pair.second.GetString()); state.set_type(info_card_type); + if (state.has_first_view_timestamp()) { + state.set_first_view_timestamp( + GetAdjustedViewTimestamp(state.first_view_timestamp(), + server_timestamp, timestamp_adjustment)); + } + if (state.has_last_view_timestamp()) { + state.set_last_view_timestamp( + GetAdjustedViewTimestamp(state.last_view_timestamp(), + server_timestamp, timestamp_adjustment)); + } states.push_back(state); } } @@ -61,16 +108,18 @@ void InfoCardTracker::OnViewed(int info_card_type, int minimum_view_interval_seconds) { - auto now = base::TimeTicks::Now(); - auto iter = last_view_times_.find(info_card_type); - if (iter != last_view_times_.end() && - now - iter->second < base::Seconds(minimum_view_interval_seconds)) { + auto now = base::Time::Now(); + InfoCardTrackingState state = GetState(info_card_type); + if (state.has_last_view_timestamp() && + now - feedstore::FromTimestampMillis(state.last_view_timestamp()) < + base::Seconds(minimum_view_interval_seconds)) { return; } - last_view_times_[info_card_type] = now; - InfoCardTrackingState state = GetState(info_card_type); state.set_view_count(state.view_count() + 1); + if (!state.has_first_view_timestamp()) + state.set_first_view_timestamp(feedstore::ToTimestampMillis(now)); + state.set_last_view_timestamp(feedstore::ToTimestampMillis(now)); SetState(info_card_type, state); } @@ -92,24 +141,26 @@ } InfoCardTrackingState InfoCardTracker::GetState(int info_card_type) const { - InfoCardTrackingState state; const base::Value* all_states = profile_prefs_->GetDictionary(prefs::kInfoCardStates); - if (all_states) { - const std::string* serialized_state = - all_states->FindStringKey(InfoCardTypeToString(info_card_type)); - if (serialized_state) { - if (!state.ParseFromString(*serialized_state)) - DLOG(ERROR) << "Error parsing InfoCardTrackingState message"; - } - } - return state; + if (!all_states) + return InfoCardTrackingState(); + const std::string* base64_serialized_state = + all_states->FindStringKey(InfoCardTypeToString(info_card_type)); + if (!base64_serialized_state) + return InfoCardTrackingState(); + return DecodeFromBase64SerializedString(*base64_serialized_state); } void InfoCardTracker::SetState(int info_card_type, const InfoCardTrackingState& state) { + // SerializeToString encodes the proto into a series of bytes that is not + // going to be compatible with UTF-8 encoding. We need to convert them to + // base64 before writing to the prefs store. std::string serialized_state; state.SerializeToString(&serialized_state); + std::string base64_state; + base::Base64Encode(serialized_state, &base64_state); base::Value updated_states(base::Value::Type::DICTIONARY); const base::Value* states = profile_prefs_->Get(prefs::kInfoCardStates); @@ -117,7 +168,7 @@ updated_states = states->Clone(); } updated_states.SetStringKey(InfoCardTypeToString(info_card_type), - serialized_state); + base64_state); profile_prefs_->Set(prefs::kInfoCardStates, updated_states); }
diff --git a/components/feed/core/v2/stream/info_card_tracker.h b/components/feed/core/v2/stream/info_card_tracker.h index c6e07f3..e959e71 100644 --- a/components/feed/core/v2/stream/info_card_tracker.h +++ b/components/feed/core/v2/stream/info_card_tracker.h
@@ -6,7 +6,6 @@ #define COMPONENTS_FEED_CORE_V2_STREAM_INFO_CARD_TRACKER_H_ #include <string> -#include <unordered_map> #include <vector> #include "base/memory/raw_ptr.h" @@ -29,8 +28,16 @@ InfoCardTracker(const InfoCardTracker&) = delete; InfoCardTracker& operator=(const InfoCardTracker&) = delete; - // Returns the list of states of all tracked info cards. - std::vector<feedwire::InfoCardTrackingState> GetAllStates() const; + // Returns the list of states of all tracked info cards. The returned view + // timestamps will be adjusted to be based on server's clock. The adjustment + // is computed based on `server_timestamp` and `client_timestamp`. + // `server_timestamp` is the server timestamp, in milliseconds from Epoch, + // when the response is produced. + // `client_timestamp` is the client timestamp, in milliseconds from Epoch, + // when the response is received. + std::vector<feedwire::InfoCardTrackingState> GetAllStates( + int64_t server_timestamp, + int64_t client_timestamp) const; // Called when the info card is fully visible. void OnViewed(int info_card_type, int minimum_view_interval_seconds); @@ -50,7 +57,6 @@ const feedwire::InfoCardTrackingState& state); raw_ptr<PrefService> profile_prefs_; - std::unordered_map<int, base::TimeTicks> last_view_times_; }; } // namespace feed
diff --git a/components/feed/core/v2/stream/info_card_tracker_unittest.cc b/components/feed/core/v2/stream/info_card_tracker_unittest.cc index 00271db6..130623d 100644 --- a/components/feed/core/v2/stream/info_card_tracker_unittest.cc +++ b/components/feed/core/v2/stream/info_card_tracker_unittest.cc
@@ -9,6 +9,7 @@ #include "base/time/time.h" #include "components/feed/core/common/pref_names.h" #include "components/feed/core/v2/config.h" +#include "components/feed/core/v2/feedstore_util.h" #include "components/feed/core/v2/test/test_util.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/testing_pref_service.h" @@ -45,32 +46,40 @@ }; TEST_F(InfoCardTrackerTest, InitialEmptyState) { - EXPECT_TRUE(tracker_.GetAllStates().empty()); + EXPECT_TRUE(tracker_.GetAllStates(0, 0).empty()); } TEST_F(InfoCardTrackerTest, ViewCount) { + int64_t initial_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + int64_t view_timestamp = initial_timestamp; tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); feedwire::InfoCardTrackingState expected_state; expected_state.set_type(kTestInfoCardType1); expected_state.set_view_count(1); - EXPECT_THAT(tracker_.GetAllStates(), + expected_state.set_first_view_timestamp(view_timestamp); + expected_state.set_last_view_timestamp(view_timestamp); + EXPECT_THAT(tracker_.GetAllStates(initial_timestamp, initial_timestamp), testing::ElementsAre(EqualsProto(expected_state))); // No enough time. The view count does not increase. task_environment_.AdvanceClock(kNotEnoughTime); tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); - EXPECT_THAT(tracker_.GetAllStates(), + EXPECT_THAT(tracker_.GetAllStates(initial_timestamp, initial_timestamp), testing::ElementsAre(EqualsProto(expected_state))); // Enough time. The view count increases. task_environment_.AdvanceClock(kEnoughTime - kNotEnoughTime); + view_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); expected_state.set_view_count(2); - EXPECT_THAT(tracker_.GetAllStates(), + expected_state.set_last_view_timestamp(view_timestamp); + EXPECT_THAT(tracker_.GetAllStates(initial_timestamp, initial_timestamp), testing::ElementsAre(EqualsProto(expected_state))); } TEST_F(InfoCardTrackerTest, ResetState) { + int64_t initial_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + int64_t view_timestamp = initial_timestamp; tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); tracker_.OnClicked(kTestInfoCardType1); tracker_.OnDismissed(kTestInfoCardType1); @@ -79,28 +88,37 @@ expected_state.set_view_count(1); expected_state.set_click_count(1); expected_state.set_explicitly_dismissed_count(1); - EXPECT_THAT(tracker_.GetAllStates(), + expected_state.set_first_view_timestamp(view_timestamp); + expected_state.set_last_view_timestamp(view_timestamp); + EXPECT_THAT(tracker_.GetAllStates(initial_timestamp, initial_timestamp), testing::ElementsAre(EqualsProto(expected_state))); tracker_.ResetState(kTestInfoCardType1); expected_state.Clear(); expected_state.set_type(kTestInfoCardType1); - EXPECT_THAT(tracker_.GetAllStates(), + EXPECT_THAT(tracker_.GetAllStates(initial_timestamp, initial_timestamp), testing::ElementsAre(EqualsProto(expected_state))); } TEST_F(InfoCardTrackerTest, ComboActions) { + int64_t initial_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + int64_t type1_fisrt_view_time = initial_timestamp; tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); tracker_.OnClicked(kTestInfoCardType1); tracker_.OnDismissed(kTestInfoCardType1); + task_environment_.AdvanceClock(kEnoughTime); tracker_.OnClicked(kTestInfoCardType2); tracker_.OnClicked(kTestInfoCardType2); + int64_t type2_fisrt_view_time = + feedstore::ToTimestampMillis(base::Time::Now()); tracker_.OnViewed(kTestInfoCardType2, kMinimumViewIntervalSeconds); task_environment_.AdvanceClock(kNotEnoughTime); tracker_.OnViewed(kTestInfoCardType2, kMinimumViewIntervalSeconds); task_environment_.AdvanceClock(kEnoughTime); + int64_t type1_last_view_time = + feedstore::ToTimestampMillis(base::Time::Now()); tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); tracker_.OnClicked(kTestInfoCardType1); @@ -109,20 +127,131 @@ expected_state1.set_view_count(2); expected_state1.set_click_count(2); expected_state1.set_explicitly_dismissed_count(1); + expected_state1.set_first_view_timestamp(type1_fisrt_view_time); + expected_state1.set_last_view_timestamp(type1_last_view_time); feedwire::InfoCardTrackingState expected_state2; expected_state2.set_type(kTestInfoCardType2); expected_state2.set_view_count(1); expected_state2.set_click_count(2); - EXPECT_THAT(tracker_.GetAllStates(), + expected_state2.set_first_view_timestamp(type2_fisrt_view_time); + expected_state2.set_last_view_timestamp(type2_fisrt_view_time); + EXPECT_THAT(tracker_.GetAllStates(initial_timestamp, initial_timestamp), testing::ElementsAre(EqualsProto(expected_state1), EqualsProto(expected_state2))); tracker_.ResetState(kTestInfoCardType1); expected_state1.Clear(); expected_state1.set_type(kTestInfoCardType1); - EXPECT_THAT(tracker_.GetAllStates(), + EXPECT_THAT(tracker_.GetAllStates(initial_timestamp, initial_timestamp), testing::ElementsAre(EqualsProto(expected_state1), EqualsProto(expected_state2))); } +TEST_F(InfoCardTrackerTest, AdjustViewTimestamp_ServerTimestampLessThanClient) { + // Make server timestamp earlier than client timestamp. + int64_t server_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + task_environment_.AdvanceClock(base::Minutes(10)); + int64_t client_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + task_environment_.AdvanceClock(base::Minutes(2)); + + int64_t first_view_timestamp = + feedstore::ToTimestampMillis(base::Time::Now()); + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + task_environment_.AdvanceClock(kEnoughTime); + int64_t last_view_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + feedwire::InfoCardTrackingState expected_state; + expected_state.set_type(kTestInfoCardType1); + expected_state.set_view_count(2); + // Standard adjustment should be made to view timestamps. + expected_state.set_first_view_timestamp(first_view_timestamp + + server_timestamp - client_timestamp); + expected_state.set_last_view_timestamp(last_view_timestamp + + server_timestamp - client_timestamp); + EXPECT_THAT(tracker_.GetAllStates(server_timestamp, client_timestamp), + testing::ElementsAre(EqualsProto(expected_state))); +} + +TEST_F(InfoCardTrackerTest, AdjustViewTimestamp_ClientTimestampLessThanServer) { + // Make client timestamp earlier than server timestamp. + int64_t client_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + task_environment_.AdvanceClock(base::Minutes(10)); + int64_t server_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + task_environment_.AdvanceClock(base::Minutes(2)); + + int64_t first_view_timestamp = + feedstore::ToTimestampMillis(base::Time::Now()); + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + task_environment_.AdvanceClock(kEnoughTime); + int64_t last_view_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + feedwire::InfoCardTrackingState expected_state; + expected_state.set_type(kTestInfoCardType1); + expected_state.set_view_count(2); + // Standard adjustment should be made to view timestamps. + expected_state.set_first_view_timestamp(first_view_timestamp + + server_timestamp - client_timestamp); + expected_state.set_last_view_timestamp(last_view_timestamp + + server_timestamp - client_timestamp); + EXPECT_THAT(tracker_.GetAllStates(server_timestamp, client_timestamp), + testing::ElementsAre(EqualsProto(expected_state))); +} + +TEST_F(InfoCardTrackerTest, + AdjustViewTimestamp_DoNotGoEarlierThanServerTimestamp) { + int64_t server_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + task_environment_.AdvanceClock(base::Minutes(10)); + // Move client timestamp to some time later to simulate the client clock + // going backward. + int64_t client_timestamp = + feedstore::ToTimestampMillis(base::Time::Now() + base::Hours(1)); + + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + task_environment_.AdvanceClock(kEnoughTime); + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + feedwire::InfoCardTrackingState expected_state; + expected_state.set_type(kTestInfoCardType1); + expected_state.set_view_count(2); + // The view timestamps should not go earlier than server timestamp. + expected_state.set_first_view_timestamp(server_timestamp); + expected_state.set_last_view_timestamp(server_timestamp); + EXPECT_THAT(tracker_.GetAllStates(server_timestamp, client_timestamp), + testing::ElementsAre(EqualsProto(expected_state))); +} + +TEST_F(InfoCardTrackerTest, AdjustViewTimestamp_DoNotGoOverContentLifetime) { + // Make server timestamp earlier than client timestamp. + int64_t server_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + task_environment_.AdvanceClock(base::Minutes(10)); + int64_t client_timestamp = feedstore::ToTimestampMillis(base::Time::Now()); + task_environment_.AdvanceClock(base::Minutes(2)); + + int64_t first_view_timestamp = + feedstore::ToTimestampMillis(base::Time::Now()); + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + task_environment_.AdvanceClock(GetFeedConfig().content_expiration_threshold + + base::Minutes(20)); + tracker_.OnViewed(kTestInfoCardType1, kMinimumViewIntervalSeconds); + + feedwire::InfoCardTrackingState expected_state; + expected_state.set_type(kTestInfoCardType1); + expected_state.set_view_count(2); + // Standard adjustment should be made to view timestamps. + expected_state.set_first_view_timestamp(first_view_timestamp + + server_timestamp - client_timestamp); + // View timestamp cannot go over content's lifetime. + expected_state.set_last_view_timestamp( + server_timestamp + + GetFeedConfig().content_expiration_threshold.InMilliseconds()); + EXPECT_THAT(tracker_.GetAllStates(server_timestamp, client_timestamp), + testing::ElementsAre(EqualsProto(expected_state))); +} + } // namespace feed
diff --git a/components/feed/core/v2/stream_model.h b/components/feed/core/v2/stream_model.h index d53af5d4..8db94bdf 100644 --- a/components/feed/core/v2/stream_model.h +++ b/components/feed/core/v2/stream_model.h
@@ -119,6 +119,18 @@ return stream_data_.privacy_notice_fulfilled(); } + // The client timestamp, in milliseconds from the Epoch, when the content + // from the response is retrieved. + int64_t last_added_time_millis() const { + return stream_data_.last_added_time_millis(); + } + + // The server timestamp, in milliseconds from the Epoch, when the response is + // produced. + int64_t last_server_response_time_millis() const { + return stream_data_.last_server_response_time_millis(); + } + // Returns the full list of content in the order it should be presented. const std::vector<ContentRevision>& GetContentList() const { return content_list_;
diff --git a/components/feed/core/v2/stream_model_unittest.cc b/components/feed/core/v2/stream_model_unittest.cc index 2e562f8..02fd236 100644 --- a/components/feed/core/v2/stream_model_unittest.cc +++ b/components/feed/core/v2/stream_model_unittest.cc
@@ -455,7 +455,7 @@ observer.Clear(); store_observer.Clear(); model.Update(MakeTypicalNextPageState( - 2, kTestTimeEpoch, true, true, true, + 2, kTestTimeEpoch, kTestTimeEpoch, true, true, true, StreamModelUpdateRequest::Source::kNetworkLoadMore)); EXPECT_EQ(2UL, observer.GetUiUpdate()->shared_states.size());
diff --git a/components/feed/core/v2/test/stream_builder.cc b/components/feed/core/v2/test/stream_builder.cc index 21a9356..686aead 100644 --- a/components/feed/core/v2/test/stream_builder.cc +++ b/components/feed/core/v2/test/stream_builder.cc
@@ -254,6 +254,8 @@ initial_update->content[i].content_id().id()); } feedstore::SetLastAddedTime(last_added_time, initial_update->stream_data); + feedstore::SetLastServerResponseTime(last_server_response_time, + initial_update->stream_data); return initial_update; } @@ -295,6 +297,8 @@ initial_update->stream_data.add_content_ids(MakeContent(j).content_id().id()); feedstore::SetLastAddedTime(last_added_time, initial_update->stream_data); + feedstore::SetLastServerResponseTime(last_server_response_time, + initial_update->stream_data); return initial_update; } @@ -302,11 +306,13 @@ std::unique_ptr<StreamModelUpdateRequest> MakeTypicalInitialModelState( int first_cluster_id, base::Time last_added_time, + base::Time last_server_response_time, bool signed_in, bool logging_enabled, bool privacy_notice_fulfilled) { StreamModelUpdateRequestGenerator generator; generator.last_added_time = last_added_time; + generator.last_server_response_time = last_server_response_time; generator.signed_in = signed_in; generator.logging_enabled = logging_enabled; generator.privacy_notice_fulfilled = privacy_notice_fulfilled; @@ -316,10 +322,12 @@ std::unique_ptr<StreamModelUpdateRequest> MakeTypicalRefreshModelState( int first_cluster_id, base::Time last_added_time, + base::Time last_server_response_time, bool signed_in, bool logging_enabled) { StreamModelUpdateRequestGenerator generator; generator.last_added_time = last_added_time; + generator.last_server_response_time = last_server_response_time; generator.signed_in = signed_in; generator.logging_enabled = logging_enabled; generator.privacy_notice_fulfilled = false; @@ -330,12 +338,14 @@ std::unique_ptr<StreamModelUpdateRequest> MakeTypicalNextPageState( int page_number, base::Time last_added_time, + base::Time last_server_response_time, bool signed_in, bool logging_enabled, bool privacy_notice_fulfilled, StreamModelUpdateRequest::Source source) { StreamModelUpdateRequestGenerator generator; generator.last_added_time = last_added_time; + generator.last_server_response_time = last_server_response_time; generator.signed_in = signed_in; generator.logging_enabled = logging_enabled; generator.privacy_notice_fulfilled = privacy_notice_fulfilled;
diff --git a/components/feed/core/v2/test/stream_builder.h b/components/feed/core/v2/test/stream_builder.h index 55c3f289..44284bca 100644 --- a/components/feed/core/v2/test/stream_builder.h +++ b/components/feed/core/v2/test/stream_builder.h
@@ -60,6 +60,7 @@ // refresh response payloads. struct StreamModelUpdateRequestGenerator { base::Time last_added_time = kTestTimeEpoch; + base::Time last_server_response_time = kTestTimeEpoch; bool signed_in = true; AccountInfo account_info = TestAccountInfo(); bool logging_enabled = true; @@ -89,6 +90,7 @@ std::unique_ptr<StreamModelUpdateRequest> MakeTypicalInitialModelState( int first_cluster_id = 0, base::Time last_added_time = kTestTimeEpoch, + base::Time last_server_response_time = kTestTimeEpoch, bool signed_in = true, bool logging_enabled = true, bool privacy_notice_fulfilled = false); @@ -103,6 +105,7 @@ std::unique_ptr<StreamModelUpdateRequest> MakeTypicalRefreshModelState( int first_cluster_id = 2, base::Time last_added_time = kTestTimeEpoch, + base::Time last_server_response_time = kTestTimeEpoch, bool signed_in = true, bool logging_enabled = true); // Root @@ -113,6 +116,7 @@ std::unique_ptr<StreamModelUpdateRequest> MakeTypicalNextPageState( int page_number = 2, base::Time last_added_time = kTestTimeEpoch, + base::Time last_server_response_time = kTestTimeEpoch, bool signed_in = true, bool logging_enabled = true, bool privacy_notice_fulfilled = true,
diff --git a/components/history/core/browser/BUILD.gn b/components/history/core/browser/BUILD.gn index df01934..b0c93f70 100644 --- a/components/history/core/browser/BUILD.gn +++ b/components/history/core/browser/BUILD.gn
@@ -46,6 +46,8 @@ "keyword_id.h", "keyword_search_term.cc", "keyword_search_term.h", + "keyword_search_term_util.cc", + "keyword_search_term_util.h", "page_usage_data.cc", "page_usage_data.h", "sync/delete_directive_handler.cc",
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index 48236783..bc6bfc72 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -893,11 +893,6 @@ // The positions within the label that match the search query, if it exists. query_parser::Snippet::MatchPositions label_match_positions; - // The vector of related searches for the whole cluster. This is derived from - // the related searches of the constituent visits, and computed in - // cross-platform code so we have a consistent set across platforms. - std::vector<std::string> related_searches; - // A floating point score that's positive if the cluster matches the user's // search query, and zero otherwise. This score changes depending on the // entered search query, so this should never be persisted. It's a
diff --git a/components/history/core/browser/keyword_search_term.cc b/components/history/core/browser/keyword_search_term.cc index 9223b95..71efe44 100644 --- a/components/history/core/browser/keyword_search_term.cc +++ b/components/history/core/browser/keyword_search_term.cc
@@ -8,6 +8,33 @@ namespace history { +namespace { + +// Returns a KeywordSearchTermVisit populated with the columns returned from +// |statement|. |statement| is expected to return the following columns which +// match in order and type to the fields in the KeywordSearchTermVisit less the +// score which is a calculated field. +//+----------+-----------------+-------------+-----------------+ +//| term | normalized_term | visit_count | last_visit_time | +//+----------+-----------------+-------------+-----------------+ +//| string16 | string16 | int | int64 | +//+----------+-----------------+-------------+-----------------+ +std::unique_ptr<KeywordSearchTermVisit> KeywordSearchTermVisitFromStatement( + sql::Statement& statement) { + auto search_term = std::make_unique<KeywordSearchTermVisit>(); + search_term->term = statement.ColumnString16(0); + search_term->normalized_term = statement.ColumnString16(1); + search_term->visit_count = statement.ColumnInt(2); + search_term->last_visit_time = + base::Time::FromInternalValue(statement.ColumnInt64(3)); + return search_term; +} + +} // namespace + +KeywordSearchTermVisit::KeywordSearchTermVisit() = default; +KeywordSearchTermVisit::KeywordSearchTermVisit( + const KeywordSearchTermVisit& other) = default; KeywordSearchTermVisit::~KeywordSearchTermVisit() = default; double KeywordSearchTermVisit::GetFrecency(base::Time now, @@ -20,11 +47,15 @@ return frequency_powered * recency_decayed; } -KeywordSearchTermRow::KeywordSearchTermRow() : keyword_id(0), url_id(0) {} +// KeywordSearchTermVisitEnumerator -------------------------------------------- -KeywordSearchTermRow::KeywordSearchTermRow(const KeywordSearchTermRow& other) = - default; - -KeywordSearchTermRow::~KeywordSearchTermRow() {} +std::unique_ptr<KeywordSearchTermVisit> +KeywordSearchTermVisitEnumerator::GetNextVisit() { + if (initialized_ && statement_.Step()) { + return KeywordSearchTermVisitFromStatement(statement_); + } + initialized_ = false; + return nullptr; +} } // namespace history
diff --git a/components/history/core/browser/keyword_search_term.h b/components/history/core/browser/keyword_search_term.h index 384e484..7783082 100644 --- a/components/history/core/browser/keyword_search_term.h +++ b/components/history/core/browser/keyword_search_term.h
@@ -10,6 +10,8 @@ #include "base/time/time.h" #include "components/history/core/browser/keyword_id.h" #include "components/history/core/browser/url_row.h" +#include "sql/statement.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace history { @@ -19,7 +21,8 @@ // visit or a set of keyword visits, depending on the overloaded functions it is // returned from. struct KeywordSearchTermVisit { - KeywordSearchTermVisit() = default; + KeywordSearchTermVisit(); + KeywordSearchTermVisit(const KeywordSearchTermVisit& other); ~KeywordSearchTermVisit(); // Returns the frecency score of the visit based on the following formula: @@ -38,23 +41,48 @@ std::u16string term; // The search term that was used. std::u16string normalized_term; // The search term, in lower case and with // extra whitespaces collapsed. - int visit_count{0}; // The visit count. - base::Time last_visit_time; // The time of the most recent visit. + int visit_count{0}; // The search term visit count. + base::Time last_visit_time; // The time of the last visit. + absl::optional<double> score; // The optional calculated frecency score. }; // Used for URLs that have a search term associated with them. struct KeywordSearchTermRow { - KeywordSearchTermRow(); - KeywordSearchTermRow(const KeywordSearchTermRow& other); - ~KeywordSearchTermRow(); + KeywordSearchTermRow() = default; + KeywordSearchTermRow(const KeywordSearchTermRow& other) = default; + ~KeywordSearchTermRow() = default; - KeywordID keyword_id; // ID of the keyword. - URLID url_id; // ID of the url. + KeywordID keyword_id{0}; // ID of the keyword. + URLID url_id{0}; // ID of the url. std::u16string term; // The search term that was used. std::u16string normalized_term; // The search term, in lower case and with // extra whitespaces collapsed. }; +// KeywordSearchTermVisitEnumerator -------------------------------------------- + +// A basic enumerator to enumerate keyword search term visits. May be created +// and initialized by URLDatabase only. +class KeywordSearchTermVisitEnumerator { + public: + KeywordSearchTermVisitEnumerator(const KeywordSearchTermVisitEnumerator&) = + delete; + KeywordSearchTermVisitEnumerator& operator=( + const KeywordSearchTermVisitEnumerator&) = delete; + + ~KeywordSearchTermVisitEnumerator() = default; + + // Returns the next search term visit or nullptr if no more visits are left. + std::unique_ptr<KeywordSearchTermVisit> GetNextVisit(); + + private: + friend class URLDatabase; + KeywordSearchTermVisitEnumerator() = default; + + sql::Statement statement_; // The statement to create KeywordSearchTermVisit. + bool initialized_{false}; // Whether |statement_| can be executed. +}; + } // namespace history #endif // COMPONENTS_HISTORY_CORE_BROWSER_KEYWORD_SEARCH_TERM_H_
diff --git a/components/history/core/browser/keyword_search_term_util.cc b/components/history/core/browser/keyword_search_term_util.cc new file mode 100644 index 0000000..7a28198b --- /dev/null +++ b/components/history/core/browser/keyword_search_term_util.cc
@@ -0,0 +1,156 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/history/core/browser/keyword_search_term_util.h" + +#include "base/time/time.h" +#include "components/history/core/browser/keyword_search_term.h" + +namespace history { + +namespace { + +// Calculates the score for the given number of visits in a given day. +// Recent visits count more than historical ones, so we multiply in a boost +// depending on how long ago this day was. This boost is a curve that +// smoothly goes through these values: Today gets 3x, a week ago 2x, three +// weeks ago 1.5x, falling off to 1x at the limit of how far we reach into +// the past. +double GetMostVisitedFrecencyScore(int visit_count, + base::Time day, + base::Time now) { + double day_score = 1.0 + log(static_cast<double>(visit_count)); + int days_ago = (now - day).InDays(); + double recency_boost = 1.0 + (2.0 * (1.0 / (1.0 + days_ago / 7.0))); + return recency_boost * day_score; +} + +// Returns whether two search terms are identical, i.e., have the same +// normalized search terms. +bool IsSameSearchTerm(const KeywordSearchTermVisit& search_term, + const KeywordSearchTermVisit& other_search_term) { + return search_term.normalized_term == other_search_term.normalized_term; +} + +// Transforms a visit time to its timeslot, i.e., day of the viist. +base::Time VisitTimeToTimeslot(base::Time visit_time) { + return visit_time.LocalMidnight(); +} + +// Returns whether two search term visits are in the same timeslot. +bool IsSameTimeslot(const KeywordSearchTermVisit& search_term, + const KeywordSearchTermVisit& other_search_term) { + return VisitTimeToTimeslot(search_term.last_visit_time) == + VisitTimeToTimeslot(other_search_term.last_visit_time); +} + +} // namespace + +// MostRepeatedSearchTermHelper ------------------------------------------------ + +// A helper class to return keyword search terms with frecency scores +// accumulated across days for use in the Most Visited tiles. +class MostRepeatedSearchTermHelper { + public: + MostRepeatedSearchTermHelper() = default; + + MostRepeatedSearchTermHelper(const MostRepeatedSearchTermHelper&) = delete; + MostRepeatedSearchTermHelper& operator=(const MostRepeatedSearchTermHelper&) = + delete; + + ~MostRepeatedSearchTermHelper() = default; + + // |enumerator| enumerates keyword search term visits from the URLDatabase. + // |now| is the time used to score the search term. + std::unique_ptr<KeywordSearchTermVisit> GetNextSearchTermFromEnumerator( + KeywordSearchTermVisitEnumerator& enumerator, + base::Time now) { + // |next_search_term| acts as the fast pointer and |last_search_term_| acts + // as the slow pointer accumulating the search term score across visits. + while (auto next_search_term = enumerator.GetNextVisit()) { + bool is_same_search_term = + last_search_term_ && + IsSameSearchTerm(*next_search_term, *last_search_term_); + if (is_same_search_term && + IsSameTimeslot(*next_search_term, *last_search_term_)) { + // We are in the same timeslot for the same search term: + // 1. Move |last_search_term_| forward. + // 2. Add up the search term visit count in the timeslot. + // 3. Carry over the search term score. + int visit_count = last_search_term_->visit_count; + double score = last_search_term_->score.value_or(0.0); + last_search_term_ = std::move(next_search_term); + last_search_term_->visit_count += visit_count; + last_search_term_->score = + last_search_term_->score.value_or(0.0) + score; + + } else if (is_same_search_term) { + // We are in a new timeslot for the same search term: + // 1. Update the search term score by adding the last timeslot's score. + // 2. Move |last_search_term_| forward. + // 3. Carry over the search term score. + double score = + last_search_term_->score.value_or(0.0) + + GetMostVisitedFrecencyScore( + last_search_term_->visit_count, + VisitTimeToTimeslot(last_search_term_->last_visit_time), now); + last_search_term_ = std::move(next_search_term); + last_search_term_->score = score; + + } else if (last_search_term_) { + // We encountered a new search term and |last_search_term_| has a value: + // 1. Update the search term score by adding the last timeslot's score. + // 2. Move |last_search_term_| forward. + // 3. Return the old |last_search_term_|. + double score = + last_search_term_->score.value_or(0.0) + + GetMostVisitedFrecencyScore( + last_search_term_->visit_count, + VisitTimeToTimeslot(last_search_term_->last_visit_time), now); + last_search_term_->score = score; + auto search_term_to_return = std::move(last_search_term_); + last_search_term_ = std::move(next_search_term); + return search_term_to_return; + } else { + // We encountered a new search term and |last_search_term_| has no + // value: + // 1. Move |last_search_term_| forward. + last_search_term_ = std::move(next_search_term); + } + } + + // |last_search_term_| has a value: + // 1. Update the search term score by adding the last timeslot's score. + if (last_search_term_) { + double score = + last_search_term_->score.value_or(0.0) + + GetMostVisitedFrecencyScore( + last_search_term_->visit_count, + VisitTimeToTimeslot(last_search_term_->last_visit_time), now); + last_search_term_->score = score; + } + + return last_search_term_ ? std::move(last_search_term_) : nullptr; + } + + // The last seen search term. + std::unique_ptr<KeywordSearchTermVisit> last_search_term_; +}; + +void GetMostRepeatedSearchTermsFromEnumerator( + KeywordSearchTermVisitEnumerator& enumerator, + std::vector<std::unique_ptr<KeywordSearchTermVisit>>* search_terms) { + MostRepeatedSearchTermHelper helper; + const base::Time now = base::Time::Now(); + while (auto search_term = + helper.GetNextSearchTermFromEnumerator(enumerator, now)) { + search_terms->push_back(std::move(search_term)); + } + // Order the search terms by descending frecency scores. + std::stable_sort( + search_terms->begin(), search_terms->end(), + [](const auto& a, const auto& b) { return a->score > b->score; }); +} + +} // namespace history
diff --git a/components/history/core/browser/keyword_search_term_util.h b/components/history/core/browser/keyword_search_term_util.h new file mode 100644 index 0000000..8c3d5c0 --- /dev/null +++ b/components/history/core/browser/keyword_search_term_util.h
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_HISTORY_CORE_BROWSER_KEYWORD_SEARCH_TERM_UTIL_H_ +#define COMPONENTS_HISTORY_CORE_BROWSER_KEYWORD_SEARCH_TERM_UTIL_H_ + +#include <memory> +#include <vector> + +namespace history { + +class KeywordSearchTermVisitEnumerator; +struct KeywordSearchTermVisit; + +// Returns keyword search terms ordered by descending frecency scores +// accumulated across days for use in the Most Visited tiles. |enumerator| +// enumerates keyword search term visits from the URLDatabase. It must return +// visits ordered first by |normalized_term| and then by |last_visit_time| in +// ascending order, i.e., from the oldest to the newest. +void GetMostRepeatedSearchTermsFromEnumerator( + KeywordSearchTermVisitEnumerator& enumerator, + std::vector<std::unique_ptr<KeywordSearchTermVisit>>* search_terms); + +} // namespace history + +#endif // COMPONENTS_HISTORY_CORE_BROWSER_KEYWORD_SEARCH_TERM_UTIL_H_
diff --git a/components/history/core/browser/url_database.cc b/components/history/core/browser/url_database.cc index bc705587..6ddb7fa 100644 --- a/components/history/core/browser/url_database.cc +++ b/components/history/core/browser/url_database.cc
@@ -682,6 +682,38 @@ } } +std::unique_ptr<KeywordSearchTermVisitEnumerator> +URLDatabase::CreateKeywordSearchTermVisitEnumerator(KeywordID keyword_id, + base::Time age_threshold) { + // NOTE: the keyword_id can be zero if on first run the user does a query + // before the TemplateURLService has finished loading. As the chances of this + // occurring are small, we ignore it. + if (!keyword_id) + return nullptr; + + auto enumerator = base::WrapUnique<KeywordSearchTermVisitEnumerator>( + new KeywordSearchTermVisitEnumerator()); + enumerator->statement_.Assign(GetDB().GetCachedStatement(SQL_FROM_HERE, + R"( + SELECT + kst.term, + kst.normalized_term, + u.visit_count, + u.last_visit_time + FROM + keyword_search_terms kst JOIN urls u ON kst.url_id = u.id + WHERE + kst.keyword_id = ? AND + u.last_visit_time > ? AND + kst.normalized_term <> '' + ORDER BY kst.normalized_term, u.last_visit_time + )")); + enumerator->statement_.BindInt64(0, keyword_id); + enumerator->statement_.BindInt64(1, age_threshold.ToInternalValue()); + enumerator->initialized_ = enumerator->statement_.is_valid(); + return enumerator; +} + bool URLDatabase::DeleteKeywordSearchTerm(const std::u16string& term) { sql::Statement statement(GetDB().GetCachedStatement(SQL_FROM_HERE, "DELETE FROM keyword_search_terms WHERE term=?"));
diff --git a/components/history/core/browser/url_database.h b/components/history/core/browser/url_database.h index 9eddb05..efc1878 100644 --- a/components/history/core/browser/url_database.h +++ b/components/history/core/browser/url_database.h
@@ -28,6 +28,7 @@ namespace history { +class KeywordSearchTermVisitEnumerator; struct KeywordSearchTermRow; struct KeywordSearchTermVisit; @@ -231,6 +232,14 @@ base::Time age_threshold, std::vector<KeywordSearchTermVisit>* visits); + // Returns an enumerator to enumerate all the KeywordSearchTermVisits no older + // than `age_threshold` for the given keyword. The visits are ordered first by + // |normalized_term| and then by |last_visit_time| in ascending order, i.e., + // from the oldest to the newest. + std::unique_ptr<KeywordSearchTermVisitEnumerator> + CreateKeywordSearchTermVisitEnumerator(KeywordID keyword_id, + base::Time age_threshold); + // Deletes all searches matching `term`. bool DeleteKeywordSearchTerm(const std::u16string& term);
diff --git a/components/history/core/browser/url_database_unittest.cc b/components/history/core/browser/url_database_unittest.cc index b14f1a0..0c8f246 100644 --- a/components/history/core/browser/url_database_unittest.cc +++ b/components/history/core/browser/url_database_unittest.cc
@@ -8,6 +8,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/strings/utf_string_conversions.h" #include "components/history/core/browser/keyword_search_term.h" +#include "components/history/core/browser/keyword_search_term_util.h" #include "sql/database.h" #include "testing/gtest/include/gtest/gtest.h" @@ -221,6 +222,111 @@ ASSERT_FALSE(GetKeywordSearchTermRow(url_id, &keyword_search_term_row)); } +// Tests querying most repeated search terms. +TEST_F(URLDatabaseTest, MostRepeatedSearchTerms) { + KeywordID keyword_id = 100; + // Choose the local midnight of yesterday as the baseline for the time. + base::Time local_midnight = Time::Now().LocalMidnight() - base::Days(1); + + // First search for "foo" - yesterday. + URLRow foo_url_1(GURL("https://www.google.com/search?q=foo&num=1")); + foo_url_1.set_visit_count(1); + foo_url_1.set_last_visit(local_midnight - base::Days(1) + base::Hours(1)); + URLID foo_url_1_id = AddURL(foo_url_1); + ASSERT_NE(0, foo_url_1_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(foo_url_1_id, keyword_id, u"foo")); + + // First search for "bar" - yesterday. + URLRow bar_url_1(GURL("https://www.google.com/search?q=bar&num=1")); + bar_url_1.set_visit_count(1); + bar_url_1.set_last_visit(local_midnight - base::Days(1) + base::Hours(2)); + URLID bar_url_1_id = AddURL(bar_url_1); + ASSERT_NE(0, bar_url_1_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(bar_url_1_id, keyword_id, u"bar")); + + // Second search for "bar" - yesterday. + URLRow bar_url_2(GURL("https://www.google.com/search?q=Bar&num=2")); + bar_url_2.set_visit_count(1); + bar_url_2.set_last_visit(local_midnight - base::Days(1) + base::Hours(3)); + URLID bar_url_2_id = AddURL(bar_url_2); + ASSERT_NE(0, bar_url_2_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(bar_url_2_id, keyword_id, u"Bar")); + + // Second search for "foo" - yesterday. + URLRow foo_url_2(GURL("https://www.google.com/search?q=Foo&num=2")); + foo_url_2.set_visit_count(1); + foo_url_2.set_last_visit(local_midnight - base::Days(1) + base::Hours(4)); + URLID foo_url_2_id = AddURL(foo_url_2); + ASSERT_NE(0, foo_url_2_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(foo_url_2_id, keyword_id, u"Foo")); + + // Third search for "bar" - today. + // This search will be ignored for having a visit count of 0. + URLRow bar_url_3(GURL("https://www.google.com/search?q=BAr&num=3")); + bar_url_3.set_visit_count(0); + bar_url_3.set_last_visit(local_midnight + base::Hours(1)); + URLID bar_url_3_id = AddURL(bar_url_3); + ASSERT_NE(0, bar_url_3_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(bar_url_3_id, keyword_id, u"BAr")); + + // Third search for "foo" - today. + // This search will be ignored for having a visit count of 0. + URLRow foo_url_3(GURL("https://www.google.com/search?q=FOo&num=3")); + foo_url_3.set_visit_count(0); + foo_url_3.set_last_visit(local_midnight + base::Hours(2)); + URLID foo_url_3_id = AddURL(foo_url_3); + ASSERT_NE(0, foo_url_3_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(foo_url_3_id, keyword_id, u"FOo")); + + // Fourth search for "bar" - today. + URLRow bar_url_4(GURL("https://www.google.com/search?q=BAR&num=4")); + bar_url_4.set_visit_count(1); + bar_url_4.set_last_visit(local_midnight + base::Hours(3)); + URLID bar_url_4_id = AddURL(bar_url_4); + ASSERT_NE(0, bar_url_4_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(bar_url_4_id, keyword_id, u"BAR")); + + // Fourth search for "foo" - today. + URLRow foo_url_4(GURL("https://www.google.com/search?q=FOO&num=4")); + foo_url_4.set_visit_count(1); + foo_url_4.set_last_visit(local_midnight + base::Hours(4)); + URLID foo_url_4_id = AddURL(foo_url_4); + ASSERT_NE(0, foo_url_4_id); + ASSERT_TRUE(SetKeywordSearchTermsForURL(foo_url_4_id, keyword_id, u"FOO")); + + // Make sure we get both "foo" and "bar" back. search terms with identical + // scores are ranked in alphabetical order. + auto enumerator = CreateKeywordSearchTermVisitEnumerator( + keyword_id, history::AutocompleteAgeThreshold()); + ASSERT_TRUE(enumerator); + std::vector<std::unique_ptr<KeywordSearchTermVisit>> matches; + GetMostRepeatedSearchTermsFromEnumerator(*enumerator, &matches); + ASSERT_EQ(2U, matches.size()); + EXPECT_EQ(matches[0]->score, matches[1]->score); + EXPECT_EQ(u"BAR", matches[0]->term); + EXPECT_EQ(u"bar", matches[0]->normalized_term); + EXPECT_EQ(u"FOO", matches[1]->term); + EXPECT_EQ(u"foo", matches[1]->normalized_term); + + KeywordSearchTermRow keyword_search_term_row; + ASSERT_TRUE(GetKeywordSearchTermRow(foo_url_4_id, &keyword_search_term_row)); + ASSERT_TRUE(GetKeywordSearchTermRow(bar_url_4_id, &keyword_search_term_row)); + + // Delete all the search terms for the keyword. + DeleteAllSearchTermsForKeyword(keyword_id); + + ASSERT_FALSE(GetKeywordSearchTermRow(foo_url_4_id, &keyword_search_term_row)); + ASSERT_FALSE(GetKeywordSearchTermRow(bar_url_4_id, &keyword_search_term_row)); + + // Make sure we get nothing back. + enumerator = CreateKeywordSearchTermVisitEnumerator( + keyword_id, history::AutocompleteAgeThreshold()); + ASSERT_TRUE(enumerator); + matches.clear(); + GetMostRepeatedSearchTermsFromEnumerator(*enumerator, &matches); + ASSERT_EQ(0U, matches.size()); +} + // Make sure deleting a URL also deletes a keyword visit. TEST_F(URLDatabaseTest, DeleteURLDeletesKeywordSearchTermVisit) { URLRow url_info1(GURL("http://www.google.com/"));
diff --git a/components/history_clusters/core/BUILD.gn b/components/history_clusters/core/BUILD.gn index 8483d7d8..6174bc44 100644 --- a/components/history_clusters/core/BUILD.gn +++ b/components/history_clusters/core/BUILD.gn
@@ -51,8 +51,6 @@ "query_clusters_state.h", "ranking_cluster_finalizer.cc", "ranking_cluster_finalizer.h", - "related_searches_cluster_finalizer.cc", - "related_searches_cluster_finalizer.h", "similar_visit_deduper_cluster_finalizer.cc", "similar_visit_deduper_cluster_finalizer.h", "single_visit_cluster_finalizer.cc", @@ -97,7 +95,6 @@ "on_device_clustering_util_unittest.cc", "query_clusters_state_unittest.cc", "ranking_cluster_finalizer_unittest.cc", - "related_searches_cluster_finalizer_unittest.cc", "similar_visit_deduper_cluster_finalizer_unittest.cc", "single_visit_cluster_finalizer_unittest.cc", "url_deduper_cluster_finalizer_unittest.cc",
diff --git a/components/history_clusters/core/on_device_clustering_backend.cc b/components/history_clusters/core/on_device_clustering_backend.cc index ff0d3c3..bf4a4be 100644 --- a/components/history_clusters/core/on_device_clustering_backend.cc +++ b/components/history_clusters/core/on_device_clustering_backend.cc
@@ -29,7 +29,6 @@ #include "components/history_clusters/core/on_device_clustering_features.h" #include "components/history_clusters/core/on_device_clustering_util.h" #include "components/history_clusters/core/ranking_cluster_finalizer.h" -#include "components/history_clusters/core/related_searches_cluster_finalizer.h" #include "components/history_clusters/core/similar_visit_deduper_cluster_finalizer.h" #include "components/history_clusters/core/single_visit_cluster_finalizer.h" #include "components/history_clusters/core/url_deduper_cluster_finalizer.h" @@ -444,8 +443,6 @@ if (GetConfig().should_label_clusters) { cluster_finalizers.push_back(std::make_unique<LabelClusterFinalizer>()); } - cluster_finalizers.push_back( - std::make_unique<RelatedSearchesClusterFinalizer>()); // Group visits into clusters. std::vector<history::Cluster> clusters =
diff --git a/components/history_clusters/core/related_searches_cluster_finalizer.cc b/components/history_clusters/core/related_searches_cluster_finalizer.cc deleted file mode 100644 index feebb3c9..0000000 --- a/components/history_clusters/core/related_searches_cluster_finalizer.cc +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/history_clusters/core/related_searches_cluster_finalizer.h" - -#include "base/containers/contains.h" -#include "components/history_clusters/core/on_device_clustering_util.h" - -namespace history_clusters { - -RelatedSearchesClusterFinalizer::RelatedSearchesClusterFinalizer() = default; -RelatedSearchesClusterFinalizer::~RelatedSearchesClusterFinalizer() = default; - -void RelatedSearchesClusterFinalizer::FinalizeCluster( - history::Cluster& cluster) { - constexpr size_t kMaxRelatedSearches = 5; - - for (const auto& visit : cluster.visits) { - // Coalesce the unique related searches of this visit into the cluster - // until the cap is reached. - for (const auto& search_query : - visit.annotated_visit.content_annotations.related_searches) { - if (cluster.related_searches.size() >= kMaxRelatedSearches) { - return; - } - - if (!base::Contains(cluster.related_searches, search_query)) { - cluster.related_searches.push_back(search_query); - } - } - } -} - -} // namespace history_clusters
diff --git a/components/history_clusters/core/related_searches_cluster_finalizer.h b/components/history_clusters/core/related_searches_cluster_finalizer.h deleted file mode 100644 index 15258e8e..0000000 --- a/components/history_clusters/core/related_searches_cluster_finalizer.h +++ /dev/null
@@ -1,25 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_HISTORY_CLUSTERS_CORE_RELATED_SEARCHES_CLUSTER_FINALIZER_H_ -#define COMPONENTS_HISTORY_CLUSTERS_CORE_RELATED_SEARCHES_CLUSTER_FINALIZER_H_ - -#include "components/history_clusters/core/cluster_finalizer.h" - -namespace history_clusters { - -// A cluster finalizer collects the related searches for all visits, and places -// them at the cluster level to be ready for UI display. -class RelatedSearchesClusterFinalizer : public ClusterFinalizer { - public: - RelatedSearchesClusterFinalizer(); - ~RelatedSearchesClusterFinalizer() override; - - // ClusterFinalizer: - void FinalizeCluster(history::Cluster& cluster) override; -}; - -} // namespace history_clusters - -#endif // COMPONENTS_HISTORY_CLUSTERS_CORE_RELATED_SEARCHES_CLUSTER_FINALIZER_H_
diff --git a/components/history_clusters/core/related_searches_cluster_finalizer_unittest.cc b/components/history_clusters/core/related_searches_cluster_finalizer_unittest.cc deleted file mode 100644 index 58eba734..0000000 --- a/components/history_clusters/core/related_searches_cluster_finalizer_unittest.cc +++ /dev/null
@@ -1,61 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/history_clusters/core/related_searches_cluster_finalizer.h" - -#include "components/history_clusters/core/clustering_test_utils.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace history_clusters { -namespace { - -using ::testing::ElementsAre; - -class RelatedSearchesClusterFinalizerTest : public ::testing::Test { - public: - void SetUp() override { - cluster_finalizer_ = std::make_unique<RelatedSearchesClusterFinalizer>(); - } - - void TearDown() override { cluster_finalizer_.reset(); } - - void FinalizeCluster(history::Cluster& cluster) { - cluster_finalizer_->FinalizeCluster(cluster); - } - - private: - std::unique_ptr<RelatedSearchesClusterFinalizer> cluster_finalizer_; -}; - -TEST_F(RelatedSearchesClusterFinalizerTest, DedupeExactURL) { - // canonical_visit has the same URL as Visit1. - history::ClusterVisit visit1 = testing::CreateClusterVisit( - testing::CreateDefaultAnnotatedVisit(1, GURL("https://google.com/"))); - visit1.annotated_visit.content_annotations.related_searches.push_back( - "search1"); - visit1.annotated_visit.content_annotations.related_searches.push_back( - "search2"); - visit1.annotated_visit.content_annotations.related_searches.push_back( - "search3"); - - history::ClusterVisit visit2 = testing::CreateClusterVisit( - testing::CreateDefaultAnnotatedVisit(2, GURL("https://google.com/"))); - visit2.annotated_visit.content_annotations.related_searches.push_back( - "search4"); - visit2.annotated_visit.content_annotations.related_searches.push_back( - "search5"); - visit2.annotated_visit.content_annotations.related_searches.push_back( - "search6"); - - history::Cluster cluster; - cluster.visits = {visit1, visit2}; - FinalizeCluster(cluster); - EXPECT_THAT( - cluster.related_searches, - ElementsAre("search1", "search2", "search3", "search4", "search5")); -} - -} // namespace -} // namespace history_clusters
diff --git a/components/omnibox/browser/omnibox_field_trial.cc b/components/omnibox/browser/omnibox_field_trial.cc index d86cc4b..82b5ce25 100644 --- a/components/omnibox/browser/omnibox_field_trial.cc +++ b/components/omnibox/browser/omnibox_field_trial.cc
@@ -233,7 +233,11 @@ // integer, return the default value. unsigned int param_value_as_int = 0; if (!base::StringToUint(param_value, ¶m_value_as_int)) { +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) param_value_as_int = 7; +#else + param_value_as_int = 60; +#endif } return (base::Time::Now() - base::Days(param_value_as_int));
diff --git a/components/omnibox/browser/omnibox_field_trial_unittest.cc b/components/omnibox/browser/omnibox_field_trial_unittest.cc index 38e66c7..5a3e3d0 100644 --- a/components/omnibox/browser/omnibox_field_trial_unittest.cc +++ b/components/omnibox/browser/omnibox_field_trial_unittest.cc
@@ -373,8 +373,14 @@ {{omnibox::kOmniboxLocalZeroSuggestAgeThreshold, {{OmniboxFieldTrial::kOmniboxLocalZeroSuggestAgeThresholdParam, "j"}}}}, {}); +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) + int expected_age_threshold_days = 7; +#else + int expected_age_threshold_days = 60; +#endif age_threshold = OmniboxFieldTrial::GetLocalHistoryZeroSuggestAgeThreshold(); - EXPECT_EQ(7, base::TimeDelta(base::Time::Now() - age_threshold).InDays()); + EXPECT_EQ(expected_age_threshold_days, + base::TimeDelta(base::Time::Now() - age_threshold).InDays()); } TEST_F(OmniboxFieldTrialTest, HUPNewScoringFieldTrial) {
diff --git a/components/policy/core/browser/policy_conversions.cc b/components/policy/core/browser/policy_conversions.cc index 9b072d7..9e2ae0e 100644 --- a/components/policy/core/browser/policy_conversions.cc +++ b/components/policy/core/browser/policy_conversions.cc
@@ -92,10 +92,6 @@ return *this; } -std::string PolicyConversions::ToJSON() { - return client_->ConvertValueToJSON(ToValue()); -} - /** * DictionaryPolicyConversions */ @@ -105,7 +101,53 @@ : PolicyConversions(std::move(client)) {} DictionaryPolicyConversions::~DictionaryPolicyConversions() = default; -Value DictionaryPolicyConversions::ToValue() { +DictionaryPolicyConversions& DictionaryPolicyConversions::EnableConvertTypes( + bool enabled) { + PolicyConversions::EnableConvertTypes(enabled); + return *this; +} + +DictionaryPolicyConversions& DictionaryPolicyConversions::EnableConvertValues( + bool enabled) { + PolicyConversions::EnableConvertValues(enabled); + return *this; +} + +DictionaryPolicyConversions& +DictionaryPolicyConversions::EnableDeviceLocalAccountPolicies(bool enabled) { + PolicyConversions::EnableDeviceLocalAccountPolicies(enabled); + return *this; +} + +DictionaryPolicyConversions& DictionaryPolicyConversions::EnableDeviceInfo( + bool enabled) { + PolicyConversions::EnableDeviceInfo(enabled); + return *this; +} + +DictionaryPolicyConversions& DictionaryPolicyConversions::EnablePrettyPrint( + bool enabled) { + PolicyConversions::EnablePrettyPrint(enabled); + return *this; +} + +DictionaryPolicyConversions& DictionaryPolicyConversions::EnableUserPolicies( + bool enabled) { + PolicyConversions::EnableUserPolicies(enabled); + return *this; +} + +DictionaryPolicyConversions& DictionaryPolicyConversions::SetDropDefaultValues( + bool enabled) { + PolicyConversions::SetDropDefaultValues(enabled); + return *this; +} + +std::string DictionaryPolicyConversions::ToJSON() { + return client()->ConvertValueToJSON(Value(ToValueDict())); +} + +Value::Dict DictionaryPolicyConversions::ToValueDict() { Value::Dict all_policies; if (client()->HasUserPolicies()) { @@ -134,7 +176,7 @@ if (!identity_fields.empty()) all_policies.Merge(identity_fields); #endif // BUILDFLAG(IS_CHROMEOS_ASH) - return Value(std::move(all_policies)); + return all_policies; } #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -181,7 +223,52 @@ } #endif // BUILDFLAG(IS_CHROMEOS_LACROS) -Value ArrayPolicyConversions::ToValue() { +ArrayPolicyConversions& ArrayPolicyConversions::EnableConvertTypes( + bool enabled) { + PolicyConversions::EnableConvertTypes(enabled); + return *this; +} + +ArrayPolicyConversions& ArrayPolicyConversions::EnableConvertValues( + bool enabled) { + PolicyConversions::EnableConvertValues(enabled); + return *this; +} + +ArrayPolicyConversions& +ArrayPolicyConversions::EnableDeviceLocalAccountPolicies(bool enabled) { + PolicyConversions::EnableDeviceLocalAccountPolicies(enabled); + return *this; +} + +ArrayPolicyConversions& ArrayPolicyConversions::EnableDeviceInfo(bool enabled) { + PolicyConversions::EnableDeviceInfo(enabled); + return *this; +} + +ArrayPolicyConversions& ArrayPolicyConversions::EnablePrettyPrint( + bool enabled) { + PolicyConversions::EnablePrettyPrint(enabled); + return *this; +} + +ArrayPolicyConversions& ArrayPolicyConversions::EnableUserPolicies( + bool enabled) { + PolicyConversions::EnableUserPolicies(enabled); + return *this; +} + +ArrayPolicyConversions& ArrayPolicyConversions::SetDropDefaultValues( + bool enabled) { + PolicyConversions::SetDropDefaultValues(enabled); + return *this; +} + +std::string ArrayPolicyConversions::ToJSON() { + return client()->ConvertValueToJSON(Value(ToValueList())); +} + +Value::List ArrayPolicyConversions::ToValueList() { Value::List all_policies; if (client()->HasUserPolicies()) { @@ -222,7 +309,7 @@ all_policies.Append(std::move(identity_fields)); #endif // BUILDFLAG(IS_CHROMEOS_ASH) - return Value(std::move(all_policies)); + return all_policies; } #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING)
diff --git a/components/policy/core/browser/policy_conversions.h b/components/policy/core/browser/policy_conversions.h index b0f03f54..ef66374 100644 --- a/components/policy/core/browser/policy_conversions.h +++ b/components/policy/core/browser/policy_conversions.h
@@ -45,25 +45,25 @@ // Set to get policy types as human friendly string instead of enum integer. // Policy types includes policy source, policy scope and policy level. // Enabled by default. - PolicyConversions& EnableConvertTypes(bool enabled); + virtual PolicyConversions& EnableConvertTypes(bool enabled); // Set to get dictionary policy value as JSON string. // Disabled by default. - PolicyConversions& EnableConvertValues(bool enabled); + virtual PolicyConversions& EnableConvertValues(bool enabled); // Set to get device local account policies on ChromeOS. // Disabled by default. - PolicyConversions& EnableDeviceLocalAccountPolicies(bool enabled); + virtual PolicyConversions& EnableDeviceLocalAccountPolicies(bool enabled); // Set to get device basic information on ChromeOS. // Disabled by default. - PolicyConversions& EnableDeviceInfo(bool enabled); + virtual PolicyConversions& EnableDeviceInfo(bool enabled); // Set to enable pretty print for all JSON string. // Enabled by default. - PolicyConversions& EnablePrettyPrint(bool enabled); + virtual PolicyConversions& EnablePrettyPrint(bool enabled); // Set to get all user scope policies. // Enabled by default. - PolicyConversions& EnableUserPolicies(bool enabled); + virtual PolicyConversions& EnableUserPolicies(bool enabled); // Set to drop the policies of which value is a default one set by the policy // provider. Disabled by default. - PolicyConversions& SetDropDefaultValues(bool enabled); + virtual PolicyConversions& SetDropDefaultValues(bool enabled); #if BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) // Sets the updater policies. @@ -73,11 +73,8 @@ PolicyConversions& WithUpdaterPolicySchemas(PolicyToSchemaMap schemas); #endif // BUILDFLAG(IS_WIN) && BUILDFLAG(GOOGLE_CHROME_BRANDING) - // Returns the policy data as a base::Value object. - virtual base::Value ToValue() = 0; - // Returns the policy data as a JSON string; - virtual std::string ToJSON(); + virtual std::string ToJSON() = 0; protected: PolicyConversionsClient* client() { return client_.get(); } @@ -95,8 +92,24 @@ delete; ~DictionaryPolicyConversions() override; - // TODO(chromium:1321529): Investigate returning base::Value::Dict. - base::Value ToValue() override; + DictionaryPolicyConversions& EnableConvertTypes(bool enabled) override; + + DictionaryPolicyConversions& EnableConvertValues(bool enabled) override; + + DictionaryPolicyConversions& EnableDeviceLocalAccountPolicies( + bool enabled) override; + + DictionaryPolicyConversions& EnableDeviceInfo(bool enabled) override; + + DictionaryPolicyConversions& EnablePrettyPrint(bool enabled) override; + + DictionaryPolicyConversions& EnableUserPolicies(bool enabled) override; + + DictionaryPolicyConversions& SetDropDefaultValues(bool enabled) override; + + std::string ToJSON() override; + + base::Value::Dict ToValueDict(); private: base::Value::Dict GetExtensionPolicies(PolicyDomain policy_domain); @@ -114,8 +127,24 @@ ArrayPolicyConversions& operator=(const ArrayPolicyConversions&) = delete; ~ArrayPolicyConversions() override; - // TODO(chromium:1321529): Investigate returning base::Value::List. - base::Value ToValue() override; + ArrayPolicyConversions& EnableConvertTypes(bool enabled) override; + + ArrayPolicyConversions& EnableConvertValues(bool enabled) override; + + ArrayPolicyConversions& EnableDeviceLocalAccountPolicies( + bool enabled) override; + + ArrayPolicyConversions& EnableDeviceInfo(bool enabled) override; + + ArrayPolicyConversions& EnablePrettyPrint(bool enabled) override; + + ArrayPolicyConversions& EnableUserPolicies(bool enabled) override; + + ArrayPolicyConversions& SetDropDefaultValues(bool enabled) override; + + std::string ToJSON() override; + + base::Value::List ToValueList(); #if BUILDFLAG(IS_CHROMEOS_LACROS) // Additional Chrome policies that need to be displayed, though not available
diff --git a/components/policy/core/browser/webui/json_generation.cc b/components/policy/core/browser/webui/json_generation.cc index 994a3a3..bb5e3b8 100644 --- a/components/policy/core/browser/webui/json_generation.cc +++ b/components/policy/core/browser/webui/json_generation.cc
@@ -23,8 +23,8 @@ std::string GenerateJson(std::unique_ptr<PolicyConversionsClient> client, base::Value status, const JsonGenerationParams& params) { - base::Value chrome_metadata(base::Value::Type::DICTIONARY); - chrome_metadata.SetKey("application", base::Value(params.application_name)); + base::Value::Dict chrome_metadata; + chrome_metadata.Set("application", params.application_name); std::string version = base::StringPrintf( "%s (%s)%s %s%s", version_info::GetVersionNumber().c_str(), @@ -36,25 +36,23 @@ params.processor_variation.c_str(), params.cohort_name ? params.cohort_name->c_str() : ""); - chrome_metadata.SetKey("version", base::Value(version)); + chrome_metadata.Set("version", version); if (params.os_name && !params.os_name->empty()) { - chrome_metadata.SetKey("OS", base::Value(params.os_name.value())); + chrome_metadata.Set("OS", params.os_name.value()); } if (params.platform_name && !params.platform_name->empty()) { - chrome_metadata.SetKey("platform", - base::Value(params.platform_name.value())); + chrome_metadata.Set("platform", params.platform_name.value()); } - chrome_metadata.SetKey("revision", - base::Value(version_info::GetLastChange())); + chrome_metadata.Set("revision", version_info::GetLastChange()); - base::Value dict = - policy::DictionaryPolicyConversions(std::move(client)).ToValue(); + base::Value::Dict dict = + policy::DictionaryPolicyConversions(std::move(client)).ToValueDict(); - dict.SetKey("chromeMetadata", std::move(chrome_metadata)); - dict.SetKey("status", std::move(status)); + dict.Set("chromeMetadata", std::move(chrome_metadata)); + dict.Set("status", std::move(status)); std::string json_policies; base::JSONWriter::WriteWithOptions(
diff --git a/components/policy/core/common/cloud/component_cloud_policy_store.cc b/components/policy/core/common/cloud/component_cloud_policy_store.cc index 265dcbb..55194c0 100644 --- a/components/policy/core/common/cloud/component_cloud_policy_store.cc +++ b/components/policy/core/common/cloud/component_cloud_policy_store.cc
@@ -23,6 +23,7 @@ #include "components/policy/core/common/cloud/resource_cache.h" #include "components/policy/core/common/external_data_fetcher.h" #include "components/policy/core/common/policy_map.h" +#include "components/policy/core/common/policy_proto_decoders.h" #include "components/policy/proto/chrome_extension_policy.pb.h" #include "components/policy/proto/device_management_backend.pb.h" #include "crypto/sha2.h" @@ -441,37 +442,8 @@ return false; } - // Each top-level key maps a policy name to its description. - // - // Each description is an object that contains the policy value under the - // "Value" key. The optional "Level" key is either "Mandatory" (default) or - // "Recommended". - for (auto it : json.DictItems()) { - const std::string& policy_name = it.first; - base::Value description = std::move(it.second); - if (!description.is_dict()) { - *error = "The JSON blob dictionary value is not a dictionary."; - return false; - } - - absl::optional<base::Value> value = description.ExtractKey(kValue); - if (!value.has_value()) { - *error = base::StrCat( - {"The JSON blob dictionary value doesn't contain the required ", - kValue, " field."}); - return false; - } - - PolicyLevel level = POLICY_LEVEL_MANDATORY; - const std::string* level_string = description.FindStringKey(kLevel); - if (level_string && *level_string == kRecommended) - level = POLICY_LEVEL_RECOMMENDED; - - policy->Set(policy_name, level, domain_constants_->scope, - POLICY_SOURCE_CLOUD, std::move(value.value()), nullptr); - } - - return true; + return ParseComponentPolicy(std::move(json), domain_constants_->scope, + POLICY_SOURCE_CLOUD, policy, error); } ComponentPolicyMap ComponentCloudPolicyStore::GetJsonPolicyMap() {
diff --git a/components/policy/core/common/policy_loader_lacros.cc b/components/policy/core/common/policy_loader_lacros.cc index 9bb144f..64dcab7 100644 --- a/components/policy/core/common/policy_loader_lacros.cc +++ b/components/policy/core/common/policy_loader_lacros.cc
@@ -66,6 +66,10 @@ LOG(ERROR) << "No init params"; return; } + if (per_profile_ == PolicyPerProfileFilter::kTrue && + init_params->device_account_component_policy) { + SetComponentPolicy(init_params->device_account_component_policy.value()); + } if (!init_params->device_account_policy) { LOG(ERROR) << "No policy data"; return; @@ -100,6 +104,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); std::unique_ptr<PolicyBundle> bundle = std::make_unique<PolicyBundle>(); + // If per_profile loader is used, apply policy for extensions. + if (per_profile_ == PolicyPerProfileFilter::kTrue && component_policy_) + bundle->MergeFrom(*component_policy_); + if (!policy_fetch_response_ || policy_fetch_response_->empty()) { return bundle; } @@ -161,6 +169,43 @@ last_fetch_timestamp_ = base::Time::Now(); } +void PolicyLoaderLacros::OnComponentPolicyUpdated( + const policy::ComponentPolicyMap& component_policy) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // The component policy is per_profile=true policy. If Lacros is using + // secondary profile, that policy is loaded directly from DMServer. In case + // it is using the device account, there are two PolicyLoaderLacros objects + // present, and we need to store it only in the object with per_profile:True. + if (per_profile_ == PolicyPerProfileFilter::kFalse) { + return; + } + + SetComponentPolicy(component_policy); + Reload(true); +} + +void PolicyLoaderLacros::SetComponentPolicy( + const policy::ComponentPolicyMap& component_policy) { + if (component_policy_) { + component_policy_->Clear(); + } else { + component_policy_ = std::make_unique<PolicyBundle>(); + } + for (auto& policy_pair : component_policy) { + PolicyMap component_policy_map; + std::string error; + // The component policy received from Ash is the JSON data corresponding to + // the policy for the namespace. + ParseComponentPolicy(policy_pair.second.Clone(), POLICY_SCOPE_USER, + POLICY_SOURCE_CLOUD_FROM_ASH, &component_policy_map, + &error); + DCHECK(error.empty()); + + // The data is also good; expose the policies. + component_policy_->Get(policy_pair.first).Swap(&component_policy_map); + } +} + enterprise_management::PolicyData* PolicyLoaderLacros::GetPolicyData() { if (!policy_fetch_response_ || !policy_data_) return nullptr;
diff --git a/components/policy/core/common/policy_loader_lacros.h b/components/policy/core/common/policy_loader_lacros.h index 376191ba..2e9199f3 100644 --- a/components/policy/core/common/policy_loader_lacros.h +++ b/components/policy/core/common/policy_loader_lacros.h
@@ -16,6 +16,7 @@ #include "chromeos/lacros/lacros_service.h" #include "components/policy/core/common/async_policy_loader.h" #include "components/policy/core/common/policy_proto_decoders.h" +#include "components/policy/core/common/values_util.h" #include "components/policy/proto/device_management_backend.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -61,6 +62,15 @@ // Update the latest policy fetch attempt timestamp. void OnPolicyFetchAttempt() override; + // chromeos::LacrosService::Observer implementation. + void OnComponentPolicyUpdated( + const policy::ComponentPolicyMap& component_policy) override; + + // Returns the current device account policies for components. + const PolicyBundle* component_policy() const { + return component_policy_.get(); + } + // Return if the main user is a device local account (i.e. Kiosk, MGS) user. static bool IsDeviceLocalAccountUser(); @@ -81,12 +91,17 @@ base::Time last_fetch_timestamp() { return last_fetch_timestamp_; } private: + void SetComponentPolicy(const policy::ComponentPolicyMap& component_policy); + // The filter for policy data to install. const PolicyPerProfileFilter per_profile_; // Serialized blob of PolicyFetchResponse object received from the server. absl::optional<std::vector<uint8_t>> policy_fetch_response_; + // The component policy of the device account. + std::unique_ptr<PolicyBundle> component_policy_; + // The parsed policy objects received from Ash. std::unique_ptr<enterprise_management::PolicyData> policy_data_;
diff --git a/components/policy/core/common/policy_proto_decoders.cc b/components/policy/core/common/policy_proto_decoders.cc index 11521b3..963c27e 100644 --- a/components/policy/core/common/policy_proto_decoders.cc +++ b/components/policy/core/common/policy_proto_decoders.cc
@@ -10,6 +10,7 @@ #include "base/json/json_reader.h" #include "base/logging.h" +#include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" @@ -25,6 +26,10 @@ namespace { +const char kValue[] = "Value"; +const char kLevel[] = "Level"; +const char kRecommended[] = "Recommended"; + // Returns true and sets |level| to a PolicyLevel if the policy has been set // at that level. Returns false if the policy is not set, or has been set at // the level of PolicyOptions::UNSET. @@ -210,4 +215,42 @@ } } +bool ParseComponentPolicy(base::Value json, + PolicyScope scope, + PolicySource source, + PolicyMap* policy, + std::string* error) { + // Each top-level key maps a policy name to its description. + // + // Each description is an object that contains the policy value under the + // "Value" key. The optional "Level" key is either "Mandatory" (default) or + // "Recommended". + for (auto it : json.DictItems()) { + const std::string& policy_name = it.first; + base::Value description = std::move(it.second); + if (!description.is_dict()) { + *error = "The JSON blob dictionary value is not a dictionary."; + return false; + } + + absl::optional<base::Value> value = description.ExtractKey(kValue); + if (!value.has_value()) { + *error = base::StrCat( + {"The JSON blob dictionary value doesn't contain the required ", + kValue, " field."}); + return false; + } + + PolicyLevel level = POLICY_LEVEL_MANDATORY; + const std::string* level_string = description.FindStringKey(kLevel); + if (level_string && *level_string == kRecommended) + level = POLICY_LEVEL_RECOMMENDED; + + policy->Set(policy_name, level, scope, source, std::move(value.value()), + nullptr); + } + + return true; +} + } // namespace policy
diff --git a/components/policy/core/common/policy_proto_decoders.h b/components/policy/core/common/policy_proto_decoders.h index 4a47256f..b9a241f7 100644 --- a/components/policy/core/common/policy_proto_decoders.h +++ b/components/policy/core/common/policy_proto_decoders.h
@@ -6,6 +6,7 @@ #define COMPONENTS_POLICY_CORE_COMMON_POLICY_PROTO_DECODERS_H_ #include "base/memory/weak_ptr.h" +#include "base/values.h" #include "components/policy/core/common/policy_types.h" #include "components/policy/policy_export.h" @@ -40,6 +41,16 @@ PolicyMap* map, PolicyPerProfileFilter per_profile); +// Parses the JSON policy in |data| into |policy|, and returns true if the +// parse was successful. The |scope| and |source| are set as scope and source of +// the policy in the result. In case of failure, the |error| is populated with +// error message and false is returned. +POLICY_EXPORT bool ParseComponentPolicy(base::Value json, + PolicyScope scope, + PolicySource source, + PolicyMap* policy, + std::string* error); + } // namespace policy #endif // COMPONENTS_POLICY_CORE_COMMON_POLICY_PROTO_DECODERS_H_
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index dcdb6e1..4a32cfd 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -540,6 +540,7 @@ 'caption': '''Content settings''', 'desc': '''Content settings allow you to specify how contents of a specific type (for example Cookies, Images or JavaScript) is handled.''', 'policies': [ + 'DefaultClipboardSetting', 'DefaultCookiesSetting', 'DefaultFileHandlingGuardSetting', 'DefaultFileSystemReadGuardSetting', @@ -561,6 +562,8 @@ 'DefaultSerialGuardSetting', 'DefaultWebHidGuardSetting', 'DefaultWindowPlacementSetting', + 'ClipboardAllowedForUrls', + 'ClipboardBlockedForUrls', 'AutoSelectCertificateForUrls', 'CookiesAllowedForUrls', 'CookiesBlockedForUrls', @@ -8202,6 +8205,89 @@ For detailed information on valid <ph name="URL_LABEL">url</ph> patterns, please see https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE">*</ph> is not an accepted value for this policy.''', }, { + 'name': 'DefaultClipboardSetting', + 'owners': ['domfc@chromium.org', 'file://components/content_settings/OWNERS'], + 'type': 'int-enum', + 'schema': { + 'type': 'integer', + 'enum': [ 2, 3 ], + }, + 'items': [ + { + 'name': 'BlockClipboard', + 'value': 2, + 'caption': '''Do not allow any site to use the clipboard site permission''', + }, + { + 'name': 'AskClipboard', + 'value': 3, + 'caption': '''Allow sites to ask the user to grant the clipboard site permission''', + }, + ], + 'supported_on': ['chrome.*:103-', 'chrome_os:103-'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': True, + }, + 'default': None, + 'example_value': 2, + 'id': 983, + 'caption': '''Default clipboard setting''', + 'tags': [], + 'desc': '''Setting the policy to 2 blocks sites from using the clipboard site permission. Setting the policy to 3 or leaving it unset lets the user change the setting and decide if the clipboard APIs are available when a site wants to use one. + + This policy can be overridden for specific URL patterns using the <ph name="CLIPBOARD_ALLOWED_FOR_URLS_POLICY_NAME">ClipboardAllowedForUrls</ph> and <ph name="CLIPBOARD_BLOCKED_FOR_URLS_POLICY_NAME">ClipboardBlockedForUrls</ph> policies. + + This policy only affects clipboard operations controlled by the clipboard site permission, and does not affect sanitized clipboard writes or trusted copy and paste operations.''', + }, + { + 'name': 'ClipboardAllowedForUrls', + 'owners': ['domfc@chromium.org', 'file://components/content_settings/OWNERS'], + 'type': 'list', + 'schema': { + 'type': 'array', + 'items': { 'type': 'string' }, + }, + 'supported_on': ['chrome.*:103-', 'chrome_os:103-'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': True, + }, + 'example_value': ['https://www.example.com', '[*.]example.edu'], + 'id': 984, + 'caption': '''Allow clipboard on these sites''', + 'tags': [], + 'desc': '''Setting the policy lets you set a list of URL patterns that specify sites that can use the clipboard site permission. This does not include all clipboard operations on origins matching the patterns. For instance, users will still be able to paste using keyboard shortcuts as this isn't gated by the clipboard site permission. + + + Leaving the policy unset means <ph name="DEFAULT_CLIPBOARD_SETTING">DefaultClipboardSetting</ph> applies for all sites, if it's set. If not, the user's personal setting applies. + + For detailed information on valid <ph name="URL_LABEL">url</ph> patterns, please see https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE">*</ph> is not an accepted value for this policy.''', + }, + { + 'name': 'ClipboardBlockedForUrls', + 'owners': ['domfc@chromium.org', 'file://components/content_settings/OWNERS'], + 'type': 'list', + 'schema': { + 'type': 'array', + 'items': { 'type': 'string' }, + }, + 'supported_on': ['chrome.*:103-', 'chrome_os:103-'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': True, + }, + 'example_value': ['https://www.example.com', '[*.]example.edu'], + 'id': 985, + 'caption': '''Block clipboard on these sites''', + 'tags': [], + 'desc': '''Setting the policy lets you set a list of URL patterns that specify sites that can't use the clipboard site permission. This does not include all clipboard operations on origins matching the patterns. For instance, users will still be able to paste using keyboard shortcuts as this isn't gated by the clipboard site permission. + + Leaving the policy unset means <ph name="DEFAULT_CLIPBOARD_SETTING">DefaultClipboardSetting</ph> applies for all sites, if it's set. If not, the user's personal setting applies. + + For detailed information on valid <ph name="URL_LABEL">url</ph> patterns, please see https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE">*</ph> is not an accepted value for this policy.''', + }, + { 'name': 'KeygenAllowedForUrls', 'owners': ['engedy@chromium.org', 'file://components/content_settings/OWNERS'], 'type': 'list', @@ -30930,7 +31016,7 @@ 'owners': ['lgrey@chromium.org', 'chrome-mac-dev@google.com'], 'type': 'main', 'schema': { 'type': 'boolean' }, - 'supported_on': ['chrome.mac:103-'], + 'future_on':['chrome.mac'], 'tags': ['local-data-access'], 'features': { 'dynamic_refresh' : True, @@ -31962,6 +32048,6 @@ 'placeholders': [], 'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872], 'deleted_atomic_policy_group_ids': [19], - 'highest_id_currently_used': 982, + 'highest_id_currently_used': 985, 'highest_atomic_group_id_currently_used': 43 }
diff --git a/components/printing/common/print.mojom b/components/printing/common/print.mojom index 8e5c441..f2c17a8f 100644 --- a/components/printing/common/print.mojom +++ b/components/printing/common/print.mojom
@@ -209,7 +209,7 @@ // The returned |preview_document_region| contains the preview document data // as a flattened PDF. It will be invalid if errors occurred while rendering // the preview document. - CreatePreviewDocument(mojo_base.mojom.DeprecatedDictionaryValue job_settings) + CreatePreviewDocument(mojo_base.mojom.DictionaryValue job_settings) => (mojo_base.mojom.ReadOnlySharedMemoryRegion? preview_document_region); }; @@ -311,7 +311,7 @@ // every requested page for print preview using the given |settings|. This // gets called multiple times as the user updates settings. [EnableIf=enable_print_preview] - PrintPreview(mojo_base.mojom.DeprecatedDictionaryValue settings); + PrintPreview(mojo_base.mojom.DictionaryValue settings); // Tells the RenderFrame that the print preview dialog was closed. [EnableIf=enable_print_preview]
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index 437a8fd..1664ac8 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -1435,7 +1435,7 @@ /*already_notified_frame=*/false); } -void PrintRenderFrameHelper::PrintPreview(base::Value settings) { +void PrintRenderFrameHelper::PrintPreview(base::Value::Dict settings) { ScopedIPC scoped_ipc(weak_ptr_factory_.GetWeakPtr()); if (ipc_nesting_level_ > kAllowedIpcDepthForPrint) return; @@ -1455,8 +1455,7 @@ } if (!UpdatePrintSettings(print_preview_context_.source_frame(), - print_preview_context_.source_node(), - settings.GetDict())) { + print_preview_context_.source_node(), settings)) { DidFinishPrinting(INVALID_SETTINGS); return; }
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h index 220b28a..f118cae 100644 --- a/components/printing/renderer/print_render_frame_helper.h +++ b/components/printing/renderer/print_render_frame_helper.h
@@ -264,7 +264,7 @@ void InitiatePrintPreview( mojo::PendingAssociatedRemote<mojom::PrintRenderer> print_renderer, bool has_selection) override; - void PrintPreview(base::Value settings) override; + void PrintPreview(base::Value::Dict settings) override; void OnPrintPreviewDialogClosed() override; #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) void PrintFrameContent(mojom::PrintFrameContentParamsPtr params, @@ -487,7 +487,7 @@ #if BUILDFLAG(IS_CHROMEOS_ASH) // Settings used by a PrintRenderer to create a preview document. - base::Value print_renderer_job_settings_; + base::Value::Dict print_renderer_job_settings_; // Used to render print documents from an external source (ARC, Crostini, // etc.).
diff --git a/components/printing/test/print_render_frame_helper_browsertest.cc b/components/printing/test/print_render_frame_helper_browsertest.cc index d242fee..9037294 100644 --- a/components/printing/test/print_render_frame_helper_browsertest.cc +++ b/components/printing/test/print_render_frame_helper_browsertest.cc
@@ -1078,41 +1078,40 @@ } void SetLetterMediaSize() { - base::Value* media_size_value = print_settings().SetKey( - kSettingMediaSize, base::Value(base::Value::Type::DICTIONARY)); - media_size_value->SetIntKey(kSettingMediaSizeWidthMicrons, 215900); - media_size_value->SetIntKey(kSettingMediaSizeHeightMicrons, 279400); + base::Value::Dict media_size; + media_size.Set(kSettingMediaSizeWidthMicrons, 215900); + media_size.Set(kSettingMediaSizeHeightMicrons, 279400); + print_settings().Set(kSettingMediaSize, std::move(media_size)); } - base::Value& print_settings() { return print_settings_; } + base::Value::Dict& print_settings() { return print_settings_; } private: void CreatePrintSettingsDictionary() { - print_settings_ = base::Value(base::Value::Type::DICTIONARY); - print_settings_.SetBoolKey(kSettingLandscape, false); - print_settings_.SetBoolKey(kSettingCollate, false); - print_settings_.SetIntKey(kSettingColor, - static_cast<int>(mojom::ColorModel::kGray)); - print_settings_.SetIntKey(kSettingPrinterType, - static_cast<int>(mojom::PrinterType::kPdf)); - print_settings_.SetIntKey(kSettingDuplexMode, - static_cast<int>(mojom::DuplexMode::kSimplex)); - print_settings_.SetIntKey(kSettingCopies, 1); - print_settings_.SetStringKey(kSettingDeviceName, "dummy"); - print_settings_.SetIntKey(kPreviewUIID, 4); - print_settings_.SetIntKey(kPreviewRequestID, 12345); - print_settings_.SetBoolKey(kIsFirstRequest, true); - print_settings_.SetIntKey( - kSettingMarginsType, - static_cast<int>(mojom::MarginType::kDefaultMargins)); - print_settings_.SetBoolKey(kSettingPreviewModifiable, true); - print_settings_.SetBoolKey(kSettingPreviewIsFromArc, false); - print_settings_.SetBoolKey(kSettingHeaderFooterEnabled, false); - print_settings_.SetBoolKey(kSettingShouldPrintBackgrounds, false); - print_settings_.SetBoolKey(kSettingShouldPrintSelectionOnly, false); + print_settings_ = base::Value::Dict(); + print_settings_.Set(kSettingLandscape, false); + print_settings_.Set(kSettingCollate, false); + print_settings_.Set(kSettingColor, + static_cast<int>(mojom::ColorModel::kGray)); + print_settings_.Set(kSettingPrinterType, + static_cast<int>(mojom::PrinterType::kPdf)); + print_settings_.Set(kSettingDuplexMode, + static_cast<int>(mojom::DuplexMode::kSimplex)); + print_settings_.Set(kSettingCopies, 1); + print_settings_.Set(kSettingDeviceName, "dummy"); + print_settings_.Set(kPreviewUIID, 4); + print_settings_.Set(kPreviewRequestID, 12345); + print_settings_.Set(kIsFirstRequest, true); + print_settings_.Set(kSettingMarginsType, + static_cast<int>(mojom::MarginType::kDefaultMargins)); + print_settings_.Set(kSettingPreviewModifiable, true); + print_settings_.Set(kSettingPreviewIsFromArc, false); + print_settings_.Set(kSettingHeaderFooterEnabled, false); + print_settings_.Set(kSettingShouldPrintBackgrounds, false); + print_settings_.Set(kSettingShouldPrintSelectionOnly, false); } - base::Value print_settings_; + base::Value::Dict print_settings_; }; TEST_F(PrintRenderFrameHelperPreviewTest, BlockScriptInitiatedPrinting) { @@ -1176,8 +1175,8 @@ "</body></html>"; LoadHTML(kHTMLWithPageMarginsCss); - print_settings().SetIntKey(kSettingPrinterType, - static_cast<int>(mojom::PrinterType::kLocal)); + print_settings().Set(kSettingPrinterType, + static_cast<int>(mojom::PrinterType::kLocal)); OnPrintPreview(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining()); @@ -1198,10 +1197,10 @@ NonDefaultMarginsSelectedIgnorePrintCss) { LoadHTML(kHTMLWithPageSizeCss); - print_settings().SetIntKey(kSettingPrinterType, - static_cast<int>(mojom::PrinterType::kLocal)); - print_settings().SetIntKey(kSettingMarginsType, - static_cast<int>(mojom::MarginType::kNoMargins)); + print_settings().Set(kSettingPrinterType, + static_cast<int>(mojom::PrinterType::kLocal)); + print_settings().Set(kSettingMarginsType, + static_cast<int>(mojom::MarginType::kNoMargins)); OnPrintPreview(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining()); @@ -1221,7 +1220,7 @@ TEST_F(PrintRenderFrameHelperPreviewTest, PrintToPDFSelectedHonorPrintCss) { LoadHTML(kHTMLWithPageSizeCss); - print_settings().SetIntKey( + print_settings().Set( kSettingMarginsType, static_cast<int>(mojom::MarginType::kPrintableAreaMargins)); OnPrintPreview(); @@ -1345,8 +1344,8 @@ "</div>"; LoadHTML(kHTMLWithPageCss); - print_settings().SetIntKey(kSettingPrinterType, - static_cast<int>(mojom::PrinterType::kLocal)); + print_settings().Set(kSettingPrinterType, + static_cast<int>(mojom::PrinterType::kLocal)); OnPrintPreview(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining()); @@ -1400,8 +1399,8 @@ TEST_F(PrintRenderFrameHelperPreviewTest, PrintPreviewCenterToFitPage) { LoadHTML(kHTMLWithPageSizeCss); - print_settings().SetIntKey(kSettingPrinterType, - static_cast<int>(mojom::PrinterType::kLocal)); + print_settings().Set(kSettingPrinterType, + static_cast<int>(mojom::PrinterType::kLocal)); OnPrintPreview(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining()); @@ -1432,8 +1431,8 @@ "</body></html>"; LoadHTML(kHTMLWithPageCss); - print_settings().SetIntKey(kSettingPrinterType, - static_cast<int>(mojom::PrinterType::kLocal)); + print_settings().Set(kSettingPrinterType, + static_cast<int>(mojom::PrinterType::kLocal)); OnPrintPreview(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining()); @@ -1453,10 +1452,10 @@ TEST_F(PrintRenderFrameHelperPreviewTest, PrintPreviewHonorsOrientationCss) { LoadHTML(kHTMLWithLandscapePageCss); - print_settings().SetIntKey(kSettingPrinterType, - static_cast<int>(mojom::PrinterType::kLocal)); - print_settings().SetIntKey(kSettingMarginsType, - static_cast<int>(mojom::MarginType::kNoMargins)); + print_settings().Set(kSettingPrinterType, + static_cast<int>(mojom::PrinterType::kLocal)); + print_settings().Set(kSettingMarginsType, + static_cast<int>(mojom::MarginType::kNoMargins)); OnPrintPreview(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining()); @@ -1477,8 +1476,8 @@ PrintToPDFSelectedHonorOrientationCss) { LoadHTML(kHTMLWithLandscapePageCss); - print_settings().SetIntKey( - kSettingMarginsType, static_cast<int>(mojom::MarginType::kCustomMargins)); + print_settings().Set(kSettingMarginsType, + static_cast<int>(mojom::MarginType::kCustomMargins)); OnPrintPreview(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining()); @@ -1517,12 +1516,12 @@ // Set a page range and update the dictionary to generate only the complete // metafile with the selected pages. Page numbers used in the dictionary // are 1-based. - base::Value page_range(base::Value::Type::DICTIONARY); - page_range.SetKey(kSettingPageRangeFrom, base::Value(2)); - page_range.SetKey(kSettingPageRangeTo, base::Value(3)); - base::Value page_range_array(base::Value::Type::LIST); + base::Value::Dict page_range; + page_range.Set(kSettingPageRangeFrom, base::Value(2)); + page_range.Set(kSettingPageRangeTo, base::Value(3)); + base::Value::List page_range_array; page_range_array.Append(std::move(page_range)); - print_settings().SetKey(kSettingPageRange, std::move(page_range_array)); + print_settings().Set(kSettingPageRange, std::move(page_range_array)); OnPrintPreview(); @@ -1551,7 +1550,7 @@ blink::WebLocalFrame::kHideSelectionHandle, blink::mojom::SelectionMenuBehavior::kHide); - print_settings().SetBoolKey(kSettingShouldPrintSelectionOnly, true); + print_settings().Set(kSettingShouldPrintSelectionOnly, true); OnPrintPreview(); @@ -1573,7 +1572,7 @@ blink::WebLocalFrame::kHideSelectionHandle, blink::mojom::SelectionMenuBehavior::kHide); - print_settings().SetBoolKey(kSettingShouldPrintSelectionOnly, true); + print_settings().Set(kSettingShouldPrintSelectionOnly, true); OnPrintPreview(); @@ -1611,7 +1610,7 @@ LoadHTML(kHTMLWithManyLinesOfText); SetLetterMediaSize(); - print_settings().SetIntKey(kSettingScaleFactor, 200); + print_settings().Set(kSettingScaleFactor, 200); OnPrintPreview(); @@ -1634,7 +1633,7 @@ GetMainFrame()->ExecuteCommand("SelectAll"); SetLetterMediaSize(); - print_settings().SetBoolKey(kSettingShouldPrintSelectionOnly, true); + print_settings().Set(kSettingShouldPrintSelectionOnly, true); OnPrintPreview(); @@ -1655,8 +1654,8 @@ GetMainFrame()->ExecuteCommand("SelectAll"); SetLetterMediaSize(); - print_settings().SetBoolKey(kSettingShouldPrintSelectionOnly, true); - print_settings().SetIntKey(kSettingScaleFactor, 200); + print_settings().Set(kSettingShouldPrintSelectionOnly, true); + print_settings().Set(kSettingScaleFactor, 200); OnPrintPreview(); @@ -1830,7 +1829,7 @@ print_manager()->accessibility_tree_set_count()); #endif - print_settings().SetIntKey(kSettingScaleFactor, 200); + print_settings().Set(kSettingScaleFactor, 200); OnPrintPreviewRerender(); EXPECT_EQ(0u, preview_ui()->print_preview_pages_remaining());
diff --git a/components/safe_browsing/DEPS b/components/safe_browsing/DEPS index f4d1cf2..e7a9e52 100644 --- a/components/safe_browsing/DEPS +++ b/components/safe_browsing/DEPS
@@ -30,6 +30,7 @@ "+third_party/tflite_support", "+third_party/tflite", "+third_party/protobuf", + "+third_party/blink/public/common/associated_interfaces", "+ui/base/resource/resource_bundle.h", "+ui/android/view_android.h",
diff --git a/components/safe_browsing/content/browser/DEPS b/components/safe_browsing/content/browser/DEPS index 5e1c18d..1a19a80b 100644 --- a/components/safe_browsing/content/browser/DEPS +++ b/components/safe_browsing/content/browser/DEPS
@@ -16,6 +16,7 @@ "+content/public/test", "+crypto/sha2.h", "+ipc/ipc_message.h", + "+ipc/ipc_channel_proxy.h", "+net/cookies", "+net/extras", "+net/http",
diff --git a/components/safe_browsing/content/browser/client_side_detection_host.cc b/components/safe_browsing/content/browser/client_side_detection_host.cc index 68ea7b8..c42cf0d 100644 --- a/components/safe_browsing/content/browser/client_side_detection_host.cc +++ b/components/safe_browsing/content/browser/client_side_detection_host.cc
@@ -45,6 +45,7 @@ #include "net/base/ip_endpoint.h" #include "net/http/http_response_headers.h" #include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/mojom/loader/referrer.mojom.h" #include "url/gurl.h" @@ -384,27 +385,12 @@ // be null if safe browsing service is not available in the embedder. ui_manager_ = delegate_->GetSafeBrowsingUIManager(); database_manager_ = delegate_->GetSafeBrowsingDBManager(); - - // We want to accurately track all active RenderFrameHosts, so make sure we - // know about any pre-existings ones. - web_contents()->ForEachRenderFrameHost(base::BindRepeating( - [](ClientSideDetectionHost* csdh, - const content::WebContents* web_contents, - content::RenderFrameHost* rfh) { - // Don't cross into inner WebContents since we wouldn't be notified of - // its changes. See https://crbug.com/1308829 - if (content::WebContents::FromRenderFrameHost(rfh) != web_contents) { - return content::RenderFrameHost::FrameIterationAction::kSkipChildren; - } - csdh->InitializePhishingDetector(rfh); - return content::RenderFrameHost::FrameIterationAction::kContinue; - }, - base::Unretained(this), web_contents())); } ClientSideDetectionHost::~ClientSideDetectionHost() { - if (csd_service_) - csd_service_->RemoveClientSideDetectionHost(this); + if (classification_request_.get()) { + classification_request_->Cancel(); + } } void ClientSideDetectionHost::DidFinishNavigation( @@ -452,71 +438,20 @@ classification_request_->Start(); } -void ClientSideDetectionHost::SetPhishingModel( - const mojo::Remote<mojom::PhishingDetector>& phishing_detector) { - switch (csd_service_->GetModelType()) { - case CSDModelType::kNone: - case CSDModelType::kProtobuf: - phishing_detector->SetPhishingModel( - csd_service_->GetModelStr(), - csd_service_->GetVisualTfLiteModel().Duplicate()); - return; - case CSDModelType::kFlatbuffer: - phishing_detector->SetPhishingFlatBufferModel( - csd_service_->GetModelSharedMemoryRegion(), - csd_service_->GetVisualTfLiteModel().Duplicate()); - return; - } -} - -void ClientSideDetectionHost::SendModelToRenderFrame() { - DCHECK_CURRENTLY_ON(BrowserThread::UI); - if (!web_contents() || web_contents() != tab_ || !csd_service_) - return; - - for (const auto& frame_and_remote : phishing_detectors_) { - SetPhishingModel(frame_and_remote.second); - } -} - -void ClientSideDetectionHost::WebContentsDestroyed() { - // Tell any pending classification request that it is being canceled. - if (classification_request_.get()) { - classification_request_->Cancel(); - } - if (csd_service_) - csd_service_->RemoveClientSideDetectionHost(this); -} - -void ClientSideDetectionHost::RenderFrameCreated( - content::RenderFrameHost* render_frame_host) { - InitializePhishingDetector(render_frame_host); -} - -void ClientSideDetectionHost::RenderFrameDeleted( - content::RenderFrameHost* render_frame_host) { - ClearPhishingDetector(render_frame_host->GetGlobalId()); -} - void ClientSideDetectionHost::OnPhishingPreClassificationDone( bool should_classify) { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (should_classify) { content::RenderFrameHost* rfh = web_contents()->GetMainFrame(); - auto it = phishing_detectors_.find(rfh->GetGlobalId()); - bool remote_valid = - (it != phishing_detectors_.end() && it->second.is_connected()); - base::UmaHistogramBoolean("SBClientPhishing.MainFrameRemoteExists", - it != phishing_detectors_.end()); - if (it != phishing_detectors_.end()) { - base::UmaHistogramBoolean("SBClientPhishing.MainFrameRemoteConnected", - it->second.is_connected()); - } + phishing_detector_.reset(); + rfh->GetRemoteAssociatedInterfaces()->GetInterface(&phishing_detector_); + base::UmaHistogramBoolean("SBClientPhishing.MainFrameRemoteConnected", + phishing_detector_.is_bound()); - if (remote_valid) { + if (phishing_detector_.is_bound()) { phishing_detection_start_time_ = tick_clock_->NowTicks(); - it->second->StartPhishingDetection( + phishing_detector_->StartPhishingDetection( current_url_, base::BindOnce(&ClientSideDetectionHost::PhishingDetectionDone, weak_factory_.GetWeakPtr())); @@ -533,6 +468,8 @@ // if there isn't any service class in the browser. DCHECK(csd_service_); + phishing_detector_.reset(); + UmaHistogramMediumTimes( "SBClientPhishing.PhishingDetectionDuration", base::TimeTicks::Now() - phishing_detection_start_time_); @@ -676,27 +613,6 @@ ClientSideDetectionHost::SendRequest(std::move(verdict), access_token); } -void ClientSideDetectionHost::InitializePhishingDetector( - content::RenderFrameHost* render_frame_host) { - if (render_frame_host->IsRenderFrameCreated()) { - const content::GlobalRenderFrameHostId rfh_id = - render_frame_host->GetGlobalId(); - mojo::Remote<mojom::PhishingDetector> new_detector; - render_frame_host->GetRemoteInterfaces()->GetInterface( - new_detector.BindNewPipeAndPassReceiver()); - new_detector.set_disconnect_handler( - base::BindOnce(&ClientSideDetectionHost::ClearPhishingDetector, - weak_factory_.GetWeakPtr(), rfh_id)); - phishing_detectors_[rfh_id] = std::move(new_detector); - SetPhishingModel(phishing_detectors_[rfh_id]); - } -} - -void ClientSideDetectionHost::ClearPhishingDetector( - content::GlobalRenderFrameHostId rfh_id) { - phishing_detectors_.erase(rfh_id); -} - bool ClientSideDetectionHost::CanGetAccessToken() { if (is_off_the_record_) return false;
diff --git a/components/safe_browsing/content/browser/client_side_detection_host.h b/components/safe_browsing/content/browser/client_side_detection_host.h index 30c50c3..b91d1f3 100644 --- a/components/safe_browsing/content/browser/client_side_detection_host.h +++ b/components/safe_browsing/content/browser/client_side_detection_host.h
@@ -23,6 +23,7 @@ #include "components/safe_browsing/core/common/safe_browsing_prefs.h" #include "content/public/browser/global_routing_id.h" #include "content/public/browser/web_contents_observer.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "services/service_manager/public/cpp/binder_registry.h" #include "url/gurl.h" @@ -39,7 +40,6 @@ // notifies the browser that a URL was classified as phishing. This // class relays this information to the client-side detection service // class which sends a ping to a server to validate the verdict. -// TODO(noelutz): move all client-side detection IPCs to this class. class ClientSideDetectionHost : public content::WebContentsObserver { public: // A callback via which the client of this component indicates whether the @@ -82,8 +82,6 @@ ClientSideDetectionHost(const ClientSideDetectionHost&) = delete; ClientSideDetectionHost& operator=(const ClientSideDetectionHost&) = delete; - // The caller keeps ownership of the tab object and is responsible for - // ensuring that it stays valid until WebContentsDestroyed is called. ~ClientSideDetectionHost() override; // From content::WebContentsObserver. If we navigate away we cancel all @@ -92,9 +90,6 @@ void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; - // Send the model to all the render frame hosts in this WebContents. - void SendModelToRenderFrame(); - protected: explicit ClientSideDetectionHost( content::WebContents* tab, @@ -104,11 +99,6 @@ bool is_off_the_record, const PrimaryAccountSignedIn& account_signed_in_callback); - // From content::WebContentsObserver. - void WebContentsDestroyed() override; - void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; - void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; - // Used for testing. void set_ui_manager(BaseUIManager* ui_manager); void set_database_manager(SafeBrowsingDatabaseManager* database_manager); @@ -172,10 +162,6 @@ // users, who are signed in and not in incognito mode. bool CanGetAccessToken(); - // Set phishing model in PhishingDetector in renderers. - void SetPhishingModel( - const mojo::Remote<mojom::PhishingDetector>& phishing_detector); - // Send the client report to CSD server. void SendRequest(std::unique_ptr<ClientPhishingRequest> verdict, const std::string& access_token); @@ -184,11 +170,6 @@ void OnGotAccessToken(std::unique_ptr<ClientPhishingRequest> verdict, const std::string& access_token); - // Setup a PhishingDetector Mojo connection for the given render frame. - void InitializePhishingDetector(content::RenderFrameHost* render_frame_host); - - void ClearPhishingDetector(content::GlobalRenderFrameHostId rfh_id); - // This pointer may be nullptr if client-side phishing detection is // disabled. raw_ptr<ClientSideDetectionService> csd_service_; @@ -199,17 +180,12 @@ scoped_refptr<BaseUIManager> ui_manager_; // Keep a handle to the latest classification request so that we can cancel // it if necessary. + // TODO(drubery): Make this a std::unique_ptr, for clearer lifetimes. scoped_refptr<ShouldClassifyUrlRequest> classification_request_; // The current URL GURL current_url_; // The current outermost main frame's id. content::GlobalRenderFrameHostId current_outermost_main_frame_id_; - // A map from the live RenderFrameHosts to their PhishingDetector. These - // correspond to the `phishing_detector_receiver_` in the - // PhishingClassifierDelegate. - base::flat_map<content::GlobalRenderFrameHostId, - mojo::Remote<mojom::PhishingDetector>> - phishing_detectors_; // Records the start time of when phishing detection started. base::TimeTicks phishing_detection_start_time_; @@ -231,6 +207,9 @@ // acces_token. PrimaryAccountSignedIn account_signed_in_callback_; + // The remote for the currently active phishing classification. + mojo::AssociatedRemote<mojom::PhishingDetector> phishing_detector_; + base::WeakPtrFactory<ClientSideDetectionHost> weak_factory_{this}; };
diff --git a/components/safe_browsing/content/browser/client_side_detection_service.cc b/components/safe_browsing/content/browser/client_side_detection_service.cc index 1eb518e..2ae8d3f 100644 --- a/components/safe_browsing/content/browser/client_side_detection_service.cc +++ b/components/safe_browsing/content/browser/client_side_detection_service.cc
@@ -38,6 +38,8 @@ #include "content/public/browser/render_process_host.h" #include "crypto/sha2.h" #include "google_apis/google_api_keys.h" +#include "ipc/ipc_channel_proxy.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "net/base/ip_address.h" #include "net/base/load_flags.h" @@ -164,19 +166,6 @@ return !address.IsValid(); } -void ClientSideDetectionService::AddClientSideDetectionHost( - ClientSideDetectionHost* host) { - csd_hosts_.push_back(host); -} - -void ClientSideDetectionService::RemoveClientSideDetectionHost( - ClientSideDetectionHost* host) { - std::vector<ClientSideDetectionHost*>::iterator position = - std::find(csd_hosts_.begin(), csd_hosts_.end(), host); - if (position != csd_hosts_.end()) - csd_hosts_.erase(position); -} - void ClientSideDetectionService::OnURLLoaderComplete( network::SimpleURLLoader* url_loader, base::Time start_time, @@ -199,8 +188,10 @@ } void ClientSideDetectionService::SendModelToRenderers() { - for (ClientSideDetectionHost* host : csd_hosts_) { - host->SendModelToRenderFrame(); + for (content::RenderProcessHost::iterator it( + content::RenderProcessHost::AllHostsIterator()); + !it.IsAtEnd(); it.Advance()) { + SetPhishingModel(it.GetCurrentValue()); } } @@ -456,4 +447,29 @@ url_loader_factory_ = url_loader_factory; } +void ClientSideDetectionService::OnRenderProcessHostCreated( + content::RenderProcessHost* rph) { + SetPhishingModel(rph); +} + +void ClientSideDetectionService::SetPhishingModel( + content::RenderProcessHost* rph) { + if (!rph->GetChannel()) + return; + mojo::AssociatedRemote<mojom::PhishingModelSetter> model_setter; + rph->GetChannel()->GetRemoteAssociatedInterface(&model_setter); + switch (GetModelType()) { + case CSDModelType::kNone: + return; + case CSDModelType::kProtobuf: + model_setter->SetPhishingModel(GetModelStr(), + GetVisualTfLiteModel().Duplicate()); + return; + case CSDModelType::kFlatbuffer: + model_setter->SetPhishingFlatBufferModel( + GetModelSharedMemoryRegion(), GetVisualTfLiteModel().Duplicate()); + return; + } +} + } // namespace safe_browsing
diff --git a/components/safe_browsing/content/browser/client_side_detection_service.h b/components/safe_browsing/content/browser/client_side_detection_service.h index d08877f..3d7250c 100644 --- a/components/safe_browsing/content/browser/client_side_detection_service.h +++ b/components/safe_browsing/content/browser/client_side_detection_service.h
@@ -34,6 +34,7 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" +#include "content/public/browser/render_process_host_creation_observer.h" #include "net/base/ip_address.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "url/gurl.h" @@ -49,7 +50,9 @@ // Main service which pushes models to the renderers, responds to classification // requests. This owns two ModelLoader objects. -class ClientSideDetectionService : public KeyedService { +class ClientSideDetectionService + : public KeyedService, + public content::RenderProcessHostCreationObserver { public: // void(GURL phishing_url, bool is_phishing). typedef base::OnceCallback<void(GURL, bool)> @@ -86,9 +89,6 @@ return enabled_; } - void AddClientSideDetectionHost(ClientSideDetectionHost* host); - void RemoveClientSideDetectionHost(ClientSideDetectionHost* host); - void OnURLLoaderComplete(network::SimpleURLLoader* url_loader, base::Time start_time, std::unique_ptr<std::string> response_body); @@ -153,6 +153,9 @@ void SetURLLoaderFactoryForTesting( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory); + // Sends a model to each renderer. + void SetPhishingModel(content::RenderProcessHost* rph); + private: friend class ClientSideDetectionServiceTest; FRIEND_TEST_ALL_PREFIXES(ClientSideDetectionServiceTest, @@ -219,6 +222,9 @@ // Returns the URL that will be used for phishing requests. static GURL GetClientReportUrl(const std::string& report_url); + // content::RenderProcessHostCreationObserver: + void OnRenderProcessHostCreated(content::RenderProcessHost* rph) override; + // Whether the service is running or not. When the service is not running, // it won't download the model nor report detected phishing URLs. bool enabled_ = false; @@ -252,8 +258,6 @@ // PrefChangeRegistrar used to track when the Safe Browsing pref changes. PrefChangeRegistrar pref_change_registrar_; - std::vector<ClientSideDetectionHost*> csd_hosts_; - std::unique_ptr<Delegate> delegate_; base::CallbackListSubscription update_model_subscription_;
diff --git a/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc b/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc index d4ac1cde9..42dac9e9 100644 --- a/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc +++ b/components/safe_browsing/content/browser/password_protection/password_protection_service_unittest.cc
@@ -136,11 +136,6 @@ mojo::PendingReceiver<mojom::PhishingDetector>(std::move(handle))); } - void SetPhishingModel(const std::string& model, base::File file) override {} - - void SetPhishingFlatBufferModel(base::ReadOnlySharedMemoryRegion region, - base::File file) override {} - void StartPhishingDetection( const GURL& url, StartPhishingDetectionCallback callback) override {
diff --git a/components/safe_browsing/content/browser/safe_browsing_tab_observer.cc b/components/safe_browsing/content/browser/safe_browsing_tab_observer.cc index 0cd12512..13b36f0 100644 --- a/components/safe_browsing/content/browser/safe_browsing_tab_observer.cc +++ b/components/safe_browsing/content/browser/safe_browsing_tab_observer.cc
@@ -47,8 +47,6 @@ delegate_->DoesSafeBrowsingServiceExist() && csd_service) { safebrowsing_detection_host_ = delegate_->CreateClientSideDetectionHost(web_contents); - csd_service->AddClientSideDetectionHost( - safebrowsing_detection_host_.get()); } } #endif @@ -70,8 +68,6 @@ if (!safebrowsing_detection_host_.get()) { safebrowsing_detection_host_ = delegate_->CreateClientSideDetectionHost(&GetWebContents()); - csd_service->AddClientSideDetectionHost( - safebrowsing_detection_host_.get()); } } else { safebrowsing_detection_host_.reset();
diff --git a/components/safe_browsing/content/common/safe_browsing.mojom b/components/safe_browsing/content/common/safe_browsing.mojom index 1f9144fb..44ed3ef2 100644 --- a/components/safe_browsing/content/common/safe_browsing.mojom +++ b/components/safe_browsing/content/common/safe_browsing.mojom
@@ -121,8 +121,21 @@ }; [EnableIf=full_safe_browsing] -// Interface for setting the CSD model and to start phishing classification. +// Interface for starting phishing classification. This is scoped to a +// particular RenderFrame. interface PhishingDetector { + // Tells the renderer to begin phishing detection for the given toplevel URL + // which it has started loading. Returns the serialized request proto and a + // |result| enum to indicate failure. If the URL is phishing the request proto + // will have |is_phishing()| set to true. + StartPhishingDetection(url.mojom.Url url) + => (PhishingDetectorResult result, string request_proto); +}; + +[EnableIf=full_safe_browsing] +// Interface for setting a phishing model. This is scoped to an entire +// RenderProcess. +interface PhishingModelSetter { // A classification model for client-side phishing detection. // The string is an encoded safe_browsing::ClientSideModel protocol buffer, or // empty to disable client-side phishing detection for this renderer. The @@ -139,11 +152,4 @@ // to classify the appearance of pages. SetPhishingFlatBufferModel(mojo_base.mojom.ReadOnlySharedMemoryRegion region, mojo_base.mojom.ReadOnlyFile? tflite_model); - - // Tells the renderer to begin phishing detection for the given toplevel URL - // which it has started loading. Returns the serialized request proto and a - // |result| enum to indicate failure. If the URL is phishing the request proto - // will have |is_phishing()| set to true. - StartPhishingDetection(url.mojom.Url url) - => (PhishingDetectorResult result, string request_proto); };
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn b/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn index df0ebca..cba75f0 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn +++ b/components/safe_browsing/content/renderer/phishing_classifier/BUILD.gn
@@ -23,6 +23,8 @@ "phishing_classifier_delegate.h", "phishing_dom_feature_extractor.cc", "phishing_dom_feature_extractor.h", + "phishing_model_setter_impl.cc", + "phishing_model_setter_impl.h", "phishing_term_feature_extractor.cc", "phishing_term_feature_extractor.h", "phishing_url_feature_extractor.cc",
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc index d93c10e..a2a1ee9 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.cc
@@ -94,7 +94,7 @@ FlatBufferModelScorer::~FlatBufferModelScorer() = default; /* static */ -FlatBufferModelScorer* FlatBufferModelScorer::Create( +std::unique_ptr<FlatBufferModelScorer> FlatBufferModelScorer::Create( base::ReadOnlySharedMemoryRegion region, base::File visual_tflite_model) { std::unique_ptr<FlatBufferModelScorer> scorer(new FlatBufferModelScorer()); @@ -142,7 +142,7 @@ RecordScorerCreationStatus(SCORER_SUCCESS); scorer->flatbuffer_mapping_ = std::move(mapping); - return scorer.release(); + return scorer; } double FlatBufferModelScorer::ComputeRuleScore(
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.h b/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.h index b4622f91..a81c1a1 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.h +++ b/components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.h
@@ -43,8 +43,9 @@ // Factory method which creates a new Scorer object by parsing the given // flatbuffer or tflite model. If parsing fails this method returns NULL. // Use this only if region is valid. - static FlatBufferModelScorer* Create(base::ReadOnlySharedMemoryRegion region, - base::File visual_tflite_model); + static std::unique_ptr<FlatBufferModelScorer> Create( + base::ReadOnlySharedMemoryRegion region, + base::File visual_tflite_model); double ComputeScore(const FeatureMap& features) const override;
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc index 9fcd0153..9c03565 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.cc
@@ -76,7 +76,7 @@ const float PhishingClassifier::kPhishyThreshold = 0.5; PhishingClassifier::PhishingClassifier(content::RenderFrame* render_frame) - : render_frame_(render_frame), scorer_(nullptr) { + : render_frame_(render_frame) { Clear(); } @@ -87,28 +87,8 @@ DCHECK(!page_text_); } -void PhishingClassifier::set_phishing_scorer(const Scorer* scorer) { - DCHECK(done_callback_.is_null()); - DCHECK(!page_text_); - scorer_ = scorer; - if (scorer_) { - url_extractor_ = std::make_unique<PhishingUrlFeatureExtractor>(); - dom_extractor_ = std::make_unique<PhishingDOMFeatureExtractor>(); - term_extractor_ = std::make_unique<PhishingTermFeatureExtractor>( - scorer_->find_page_term_callback(), scorer_->find_page_word_callback(), - scorer_->max_words_per_term(), scorer_->murmurhash3_seed(), - scorer_->max_shingles_per_page(), scorer_->shingle_size()); - } else { - // We're disabling client-side phishing detection, so tear down all - // of the relevant objects. - url_extractor_.reset(); - dom_extractor_.reset(); - term_extractor_.reset(); - } -} - bool PhishingClassifier::is_ready() const { - return !!scorer_; + return !!ScorerStorage::GetInstance()->GetScorer(); } void PhishingClassifier::BeginClassification(const std::u16string* page_text, @@ -125,6 +105,13 @@ // classification so that we can start in a known state. CancelPendingClassification(); + Scorer* scorer = ScorerStorage::GetInstance()->GetScorer(); + url_extractor_ = std::make_unique<PhishingUrlFeatureExtractor>(); + dom_extractor_ = std::make_unique<PhishingDOMFeatureExtractor>(); + term_extractor_ = std::make_unique<PhishingTermFeatureExtractor>( + scorer->find_page_term_callback(), scorer->find_page_word_callback(), + scorer->max_words_per_term(), scorer->murmurhash3_seed(), + scorer->max_shingles_per_page(), scorer->shingle_size()); page_text_ = page_text; done_callback_ = std::move(done_callback); @@ -172,8 +159,8 @@ // Note that cancelling the feature extractors is simply a no-op if they // were not running. DCHECK(is_ready()); - dom_extractor_->CancelPendingExtraction(); - term_extractor_->CancelPendingExtraction(); + dom_extractor_.reset(); + term_extractor_.reset(); weak_factory_.InvalidateWeakPtrs(); Clear(); } @@ -197,7 +184,7 @@ #if BUILDFLAG(FULL_SAFE_BROWSING) ExtractVisualFeatures(); #else - if (scorer_->HasVisualTfLiteModel()) { + if (ScorerStorage::GetInstance()->GetScorer()->HasVisualTfLiteModel()) { ExtractVisualFeatures(); } else { VisualExtractionFinished(true); @@ -280,10 +267,11 @@ // Hash all of the features so that they match the model, then compute // the score. + Scorer* scorer = ScorerStorage::GetInstance()->GetScorer(); FeatureMap hashed_features; std::unique_ptr<ClientPhishingRequest> verdict = std::make_unique<ClientPhishingRequest>(); - verdict->set_model_version(scorer_->model_version()); + verdict->set_model_version(scorer->model_version()); verdict->set_url(main_frame->GetDocument().Url().GetString().Utf8()); for (const auto& it : features_->features()) { bool result = hashed_features.AddRealFeature( @@ -296,9 +284,9 @@ for (const auto& it : *shingle_hashes_) { verdict->add_shingle_hashes(it); } - float score = static_cast<float>(scorer_->ComputeScore(hashed_features)); + float score = static_cast<float>(scorer->ComputeScore(hashed_features)); verdict->set_client_score(score); - bool is_dom_match = (score >= scorer_->threshold_probability()); + bool is_dom_match = (score >= scorer->threshold_probability()); verdict->set_is_phishing(is_dom_match); verdict->set_is_dom_match(is_dom_match); if (visual_features_) { @@ -306,7 +294,7 @@ } #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) - scorer_->ApplyVisualTfLiteModel( + ScorerStorage::GetInstance()->GetScorer()->ApplyVisualTfLiteModel( *bitmap_, base::BindOnce(&PhishingClassifier::OnVisualTfLiteModelDone, weak_factory_.GetWeakPtr(), std::move(verdict))); #else @@ -317,20 +305,21 @@ void PhishingClassifier::OnVisualTfLiteModelDone( std::unique_ptr<ClientPhishingRequest> verdict, std::vector<double> result) { - if (static_cast<int>(result.size()) > scorer_->tflite_thresholds().size()) { + Scorer* scorer = ScorerStorage::GetInstance()->GetScorer(); + if (static_cast<int>(result.size()) > scorer->tflite_thresholds().size()) { // Model is misconfigured, so bail out. RunFailureCallback(); return; } - verdict->set_tflite_model_version(scorer_->tflite_model_version()); + verdict->set_tflite_model_version(scorer->tflite_model_version()); for (size_t i = 0; i < result.size(); i++) { ClientPhishingRequest::CategoryScore* category = verdict->add_tflite_model_scores(); - category->set_label(scorer_->tflite_thresholds().at(i).label()); + category->set_label(scorer->tflite_thresholds().at(i).label()); category->set_value(result[i]); - if (result[i] >= scorer_->tflite_thresholds().at(i).threshold()) { + if (result[i] >= scorer->tflite_thresholds().at(i).threshold()) { verdict->set_is_phishing(true); verdict->set_is_tflite_match(true); }
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.h b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.h index add37ba..5f44a8b 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.h +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier.h
@@ -28,6 +28,7 @@ #include "base/callback.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" +#include "components/safe_browsing/content/renderer/phishing_classifier/scorer.h" #include "third_party/skia/include/core/SkBitmap.h" namespace content { @@ -66,12 +67,6 @@ virtual ~PhishingClassifier(); - // Sets a scorer for the classifier to use in computing the phishiness score. - // This must live at least as long as the PhishingClassifier. The caller is - // expected to cancel any pending classification before setting a phishing - // scorer. - void set_phishing_scorer(const Scorer* scorer); - // Returns true if the classifier is ready to classify pages, i.e. it // has had a scorer set via set_phishing_scorer(). bool is_ready() const; @@ -152,7 +147,6 @@ void Clear(); content::RenderFrame* render_frame_; // owns us - const Scorer* scorer_; // owned by the caller std::unique_ptr<PhishingUrlFeatureExtractor> url_extractor_; std::unique_ptr<PhishingDOMFeatureExtractor> dom_extractor_; std::unique_ptr<PhishingTermFeatureExtractor> term_extractor_;
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.cc b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.cc index 21e546c0..ea93b964 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.cc
@@ -24,6 +24,7 @@ #include "content/public/renderer/render_thread.h" #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/service_manager/public/cpp/interface_provider.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" #include "third_party/blink/public/platform/web_url.h" #include "third_party/blink/public/web/web_document.h" #include "third_party/blink/public/web/web_local_frame.h" @@ -41,14 +42,6 @@ return url.ReplaceComponents(replacements); } -std::set<PhishingClassifierDelegate*>& PhishingClassifierDelegates() { - static base::NoDestructor<std::set<PhishingClassifierDelegate*>> s; - return *s; -} - -base::LazyInstance<std::unique_ptr<const safe_browsing::Scorer>>:: - DestructorAtExit g_phishing_scorer = LAZY_INSTANCE_INITIALIZER; - } // namespace PhishingClassifierDelegate::PhishingClassifierDelegate( @@ -58,57 +51,21 @@ last_main_frame_transition_(ui::PAGE_TRANSITION_LINK), have_page_text_(false), is_classifying_(false) { - PhishingClassifierDelegates().insert(this); if (!classifier) { classifier = new PhishingClassifier(render_frame); } classifier_.reset(classifier); - if (g_phishing_scorer.Get().get()) - SetPhishingScorer(g_phishing_scorer.Get().get()); - - registry_.AddInterface( + render_frame->GetAssociatedInterfaceRegistry()->AddInterface( base::BindRepeating(&PhishingClassifierDelegate::PhishingDetectorReceiver, base::Unretained(this))); + + model_change_observation_.Observe(ScorerStorage::GetInstance()); } PhishingClassifierDelegate::~PhishingClassifierDelegate() { CancelPendingClassification(SHUTDOWN); - PhishingClassifierDelegates().erase(this); -} - -void PhishingClassifierDelegate::SetPhishingModel( - const std::string& model, - base::File tflite_visual_model) { - safe_browsing::Scorer* scorer = nullptr; - // An empty model string means we should disable client-side phishing - // detection. - if (!model.empty()) { - scorer = safe_browsing::ProtobufModelScorer::Create( - model, std::move(tflite_visual_model)); - if (!scorer) - return; - } - for (auto* delegate : PhishingClassifierDelegates()) - delegate->SetPhishingScorer(scorer); - g_phishing_scorer.Get().reset(scorer); -} - -void PhishingClassifierDelegate::SetPhishingFlatBufferModel( - base::ReadOnlySharedMemoryRegion flatbuffer_region, - base::File tflite_visual_model) { - safe_browsing::Scorer* scorer = nullptr; - // An invalid region means we should disable client-side phishing detection. - if (flatbuffer_region.IsValid()) { - scorer = safe_browsing::FlatBufferModelScorer::Create( - std::move(flatbuffer_region), std::move(tflite_visual_model)); - if (!scorer) - return; - } - for (auto* delegate : PhishingClassifierDelegates()) - delegate->SetPhishingScorer(scorer); - g_phishing_scorer.Get().reset(scorer); } // static @@ -120,29 +77,10 @@ return new PhishingClassifierDelegate(render_frame, classifier); } -void PhishingClassifierDelegate::SetPhishingScorer( - const safe_browsing::Scorer* scorer) { - if (is_classifying_) { - // If there is a classification going on right now it means we're - // actually replacing an existing scorer with a new model. In - // this case we simply cancel the current classification. - // TODO(noelutz): if this happens too frequently we could also - // replace the old scorer with the new one once classification is done - // but this would complicate the code somewhat. - CancelPendingClassification(NEW_PHISHING_SCORER); - } - classifier_->set_phishing_scorer(scorer); -} - void PhishingClassifierDelegate::PhishingDetectorReceiver( - mojo::PendingReceiver<mojom::PhishingDetector> receiver) { - phishing_detector_receivers_.Add(this, std::move(receiver)); -} - -void PhishingClassifierDelegate::OnInterfaceRequestForFrame( - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) { - registry_.TryBindInterface(interface_name, interface_pipe); + mojo::PendingAssociatedReceiver<mojom::PhishingDetector> receiver) { + phishing_detector_receiver_.reset(); + phishing_detector_receiver_.Bind(std::move(receiver)); } void PhishingClassifierDelegate::StartPhishingDetection( @@ -307,4 +245,13 @@ delete this; } +void PhishingClassifierDelegate::OnScorerChanged() { + if (is_classifying_) { + // If there is a classification going on right now it means we're + // actually replacing an existing scorer with a new model. In + // this case we simply cancel the current classification. + CancelPendingClassification(NEW_PHISHING_SCORER); + } +} + } // namespace safe_browsing
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.h b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.h index 02a315a2..a219ec6 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.h +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_classifier_delegate.h
@@ -11,9 +11,12 @@ #include <string> #include "base/memory/read_only_shared_memory_region.h" +#include "base/scoped_observation.h" #include "components/safe_browsing/content/common/safe_browsing.mojom.h" +#include "components/safe_browsing/content/renderer/phishing_classifier/scorer.h" #include "content/public/renderer/render_frame_observer.h" #include "content/public/renderer/render_thread_observer.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver_set.h" #include "services/service_manager/public/cpp/binder_registry.h" @@ -39,7 +42,8 @@ }; class PhishingClassifierDelegate : public content::RenderFrameObserver, - public mojom::PhishingDetector { + public mojom::PhishingDetector, + public ScorerStorage::Observer { public: // The RenderFrame owns us. This object takes ownership of the classifier. // Note that if classifier is null, a default instance of PhishingClassifier @@ -53,19 +57,6 @@ ~PhishingClassifierDelegate() override; - // mojom::PhishingDetector - void SetPhishingModel(const std::string& model, - base::File tflite_visual_model) override; - - // mojom::PhishingDetector - void SetPhishingFlatBufferModel( - base::ReadOnlySharedMemoryRegion flatbuffer_region, - base::File tflite_visual_model) override; - - // Called by the RenderFrame once there is a phishing scorer available. - // The scorer is passed on to the classifier. - void SetPhishingScorer(const safe_browsing::Scorer* scorer); - // Called by the RenderFrame once a page has finished loading. Updates the // last-loaded URL and page text, then starts classification if all other // conditions are met (see MaybeStartClassification for details). @@ -99,7 +90,7 @@ }; void PhishingDetectorReceiver( - mojo::PendingReceiver<mojom::PhishingDetector> receiver); + mojo::PendingAssociatedReceiver<mojom::PhishingDetector> receiver); // Cancels any pending classification and frees the page text. void CancelPendingClassification(CancelClassificationReason reason); @@ -109,10 +100,6 @@ void OnDestruct() override; - void OnInterfaceRequestForFrame( - const std::string& interface_name, - mojo::ScopedMessagePipeHandle* interface_pipe) override; - // mojom::PhishingDetector // Called by the RenderFrame when it receives a StartPhishingDetection IPC // from the browser. This signals that it is ok to begin classification @@ -128,6 +115,9 @@ // Shared code to begin classification if all conditions are met. void MaybeStartClassification(); + // ScorerStorage::Observer implementation: + void OnScorerChanged() override; + // The PhishingClassifier to use for the RenderFrame. This is created once // a scorer is made available via SetPhishingScorer(). std::unique_ptr<PhishingClassifier> classifier_; @@ -173,9 +163,11 @@ // The callback from the most recent call to StartPhishingDetection. StartPhishingDetectionCallback callback_; - mojo::ReceiverSet<mojom::PhishingDetector> phishing_detector_receivers_; + mojo::AssociatedReceiver<mojom::PhishingDetector> phishing_detector_receiver_{ + this}; - service_manager::BinderRegistry registry_; + base::ScopedObservation<ScorerStorage, ScorerStorage::Observer> + model_change_observation_{this}; }; } // namespace safe_browsing
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_dom_feature_extractor.cc b/components/safe_browsing/content/renderer/phishing_classifier/phishing_dom_feature_extractor.cc index b9ec877..50d0e92c 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_dom_feature_extractor.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_dom_feature_extractor.cc
@@ -109,11 +109,7 @@ } PhishingDOMFeatureExtractor::~PhishingDOMFeatureExtractor() { - // The RenderView should have called CancelPendingExtraction() before - // we are destroyed. - DCHECK(done_callback_.is_null()); - DCHECK(!cur_frame_data_.get()); - DCHECK(cur_document_.IsNull()); + CancelPendingExtraction(); } void PhishingDOMFeatureExtractor::ExtractFeatures(blink::WebDocument document,
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.cc b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.cc new file mode 100644 index 0000000..8889337 --- /dev/null +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.cc
@@ -0,0 +1,64 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h" + +#include "components/safe_browsing/content/renderer/phishing_classifier/flatbuffer_scorer.h" +#include "components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.h" +#include "components/safe_browsing/content/renderer/phishing_classifier/scorer.h" +#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h" + +namespace safe_browsing { + +PhishingModelSetterImpl::PhishingModelSetterImpl() = default; +PhishingModelSetterImpl::~PhishingModelSetterImpl() = default; + +void PhishingModelSetterImpl::RegisterMojoInterfaces( + blink::AssociatedInterfaceRegistry* associated_interfaces) { + associated_interfaces->AddInterface( + base::BindRepeating(&PhishingModelSetterImpl::OnRendererAssociatedRequest, + base::Unretained(this))); +} + +void PhishingModelSetterImpl::UnregisterMojoInterfaces( + blink::AssociatedInterfaceRegistry* associated_interfaces) { + associated_interfaces->RemoveInterface(mojom::PhishingModelSetter::Name_); +} + +void PhishingModelSetterImpl::SetPhishingModel(const std::string& model, + base::File tflite_visual_model) { + std::unique_ptr<Scorer> scorer; + + // An empty model string means we should disable client-side phishing + // detection. + if (!model.empty()) { + scorer = safe_browsing::ProtobufModelScorer::Create( + model, std::move(tflite_visual_model)); + if (!scorer) + return; + } + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); +} + +void PhishingModelSetterImpl::SetPhishingFlatBufferModel( + base::ReadOnlySharedMemoryRegion flatbuffer_region, + base::File tflite_visual_model) { + std::unique_ptr<Scorer> scorer; + // An invalid region means we should disable client-side phishing detection. + if (flatbuffer_region.IsValid()) { + scorer = safe_browsing::FlatBufferModelScorer::Create( + std::move(flatbuffer_region), std::move(tflite_visual_model)); + if (!scorer) + return; + } + ScorerStorage::GetInstance()->SetScorer(std::move(scorer)); +} + +void PhishingModelSetterImpl::OnRendererAssociatedRequest( + mojo::PendingAssociatedReceiver<mojom::PhishingModelSetter> receiver) { + receiver_.reset(); + receiver_.Bind(std::move(receiver)); +} + +} // namespace safe_browsing
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h new file mode 100644 index 0000000..332f2615 --- /dev/null +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_model_setter_impl.h
@@ -0,0 +1,45 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_SAFE_BROWSING_CONTENT_RENDERER_PHISHING_CLASSIFIER_PHISHING_MODEL_SETTER_IMPL_H_ +#define COMPONENTS_SAFE_BROWSING_CONTENT_RENDERER_PHISHING_CLASSIFIER_PHISHING_MODEL_SETTER_IMPL_H_ + +#include "components/safe_browsing/content/common/safe_browsing.mojom.h" +#include "content/public/renderer/render_thread_observer.h" +#include "mojo/public/cpp/bindings/associated_receiver.h" + +namespace safe_browsing { + +class PhishingModelSetterImpl : public mojom::PhishingModelSetter, + public content::RenderThreadObserver { + public: + PhishingModelSetterImpl(); + + PhishingModelSetterImpl(const PhishingModelSetterImpl&) = delete; + PhishingModelSetterImpl& operator=(const PhishingModelSetterImpl&) = delete; + + ~PhishingModelSetterImpl() override; + + private: + // content::RenderThreadObserver overrides: + void RegisterMojoInterfaces( + blink::AssociatedInterfaceRegistry* associated_interfaces) override; + void UnregisterMojoInterfaces( + blink::AssociatedInterfaceRegistry* associated_interfaces) override; + + // mojom::PhishingModelSetter overrides: + void SetPhishingModel(const std::string& model, + base::File tflite_visual_model) override; + void SetPhishingFlatBufferModel( + base::ReadOnlySharedMemoryRegion flatbuffer_region, + base::File tflite_visual_model) override; + + void OnRendererAssociatedRequest( + mojo::PendingAssociatedReceiver<mojom::PhishingModelSetter> receiver); + + mojo::AssociatedReceiver<mojom::PhishingModelSetter> receiver_{this}; +}; +} // namespace safe_browsing + +#endif // COMPONENTS_SAFE_BROWSING_CONTENT_RENDERER_PHISHING_CLASSIFIER_PHISHING_MODEL_SETTER_IMPL_H_
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/phishing_term_feature_extractor.cc b/components/safe_browsing/content/renderer/phishing_classifier/phishing_term_feature_extractor.cc index 18eb048..f967205 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/phishing_term_feature_extractor.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/phishing_term_feature_extractor.cc
@@ -96,10 +96,7 @@ } PhishingTermFeatureExtractor::~PhishingTermFeatureExtractor() { - // The RenderView should have called CancelPendingExtraction() before - // we are destroyed. - DCHECK(done_callback_.is_null()); - DCHECK(!state_.get()); + CancelPendingExtraction(); } void PhishingTermFeatureExtractor::ExtractFeatures(
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc index cf6e038..48a3314 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.cc
@@ -41,7 +41,7 @@ ProtobufModelScorer::~ProtobufModelScorer() = default; /* static */ -ProtobufModelScorer* ProtobufModelScorer::Create( +std::unique_ptr<ProtobufModelScorer> ProtobufModelScorer::Create( const base::StringPiece& model_str, base::File visual_tflite_model) { std::unique_ptr<ProtobufModelScorer> scorer(new ProtobufModelScorer()); @@ -86,7 +86,7 @@ } RecordScorerCreationStatus(SCORER_SUCCESS); - return scorer.release(); + return scorer; } double ProtobufModelScorer::ComputeScore(const FeatureMap& features) const {
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.h b/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.h index db968ac..0a6bf37e 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.h +++ b/components/safe_browsing/content/renderer/phishing_classifier/protobuf_scorer.h
@@ -41,8 +41,9 @@ // Factory method which creates a new Scorer object by parsing the given // model. If parsing fails this method returns NULL. // Can use this if model_str is empty. - static ProtobufModelScorer* Create(const base::StringPiece& model_str, - base::File visual_tflite_model); + static std::unique_ptr<ProtobufModelScorer> Create( + const base::StringPiece& model_str, + base::File visual_tflite_model); double ComputeScore(const FeatureMap& features) const override;
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc index caf891a2..3c6899f 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer.cc
@@ -234,4 +234,31 @@ Scorer::Scorer() = default; Scorer::~Scorer() = default; +// static +ScorerStorage* ScorerStorage::GetInstance() { + static base::NoDestructor<ScorerStorage> instance; + return instance.get(); +} + +ScorerStorage::ScorerStorage() = default; +ScorerStorage::~ScorerStorage() = default; + +void ScorerStorage::SetScorer(std::unique_ptr<Scorer> scorer) { + scorer_ = std::move(scorer); + for (Observer& obs : observers_) + obs.OnScorerChanged(); +} + +Scorer* ScorerStorage::GetScorer() const { + return scorer_.get(); +} + +void ScorerStorage::AddObserver(ScorerStorage::Observer* observer) { + observers_.AddObserver(observer); +} + +void ScorerStorage::RemoveObserver(ScorerStorage::Observer* observer) { + observers_.RemoveObserver(observer); +} + } // namespace safe_browsing
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer.h b/components/safe_browsing/content/renderer/phishing_classifier/scorer.h index 6a34763..d33e394 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/scorer.h +++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer.h
@@ -26,6 +26,7 @@ #include "base/files/memory_mapped_file.h" #include "base/memory/weak_ptr.h" #include "base/metrics/histogram_macros.h" +#include "base/observer_list.h" #include "base/strings/string_piece.h" #include "build/build_config.h" #include "components/optimization_guide/machine_learning_tflite_buildflags.h" @@ -142,6 +143,33 @@ friend class PhishingScorerTest; }; +// A small wrapper around a Scorer that allows callers to observe for changes in +// the model. +class ScorerStorage { + public: + static ScorerStorage* GetInstance(); + + class Observer : public base::CheckedObserver { + public: + virtual void OnScorerChanged() = 0; + }; + + ScorerStorage(); + ~ScorerStorage(); + ScorerStorage(const ScorerStorage&) = delete; + ScorerStorage& operator=(const ScorerStorage&) = delete; + + void SetScorer(std::unique_ptr<Scorer> scorer); + Scorer* GetScorer() const; + + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + private: + std::unique_ptr<Scorer> scorer_; + base::ObserverList<Observer> observers_; +}; + } // namespace safe_browsing #endif // COMPONENTS_SAFE_BROWSING_CONTENT_RENDERER_PHISHING_CLASSIFIER_SCORER_H_
diff --git a/components/safe_browsing/content/renderer/phishing_classifier/scorer_unittest.cc b/components/safe_browsing/content/renderer/phishing_classifier/scorer_unittest.cc index 559484d..2bbb8af 100644 --- a/components/safe_browsing/content/renderer/phishing_classifier/scorer_unittest.cc +++ b/components/safe_browsing/content/renderer/phishing_classifier/scorer_unittest.cc
@@ -153,36 +153,36 @@ std::string flatbuffer = GetFlatBufferString(); base::MappedReadOnlyRegion mapped_region = GetMappedReadOnlyRegionWithData(flatbuffer); - scorer.reset(FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), - base::File())); + scorer = FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), + base::File()); EXPECT_TRUE(scorer.get() != nullptr); // Invalid region. - scorer.reset(FlatBufferModelScorer::Create(base::ReadOnlySharedMemoryRegion(), - base::File())); + scorer = FlatBufferModelScorer::Create(base::ReadOnlySharedMemoryRegion(), + base::File()); EXPECT_FALSE(scorer.get()); // Invalid buffer in region. mapped_region = GetMappedReadOnlyRegionWithData("bogus string"); - scorer.reset(FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), - base::File())); + scorer = FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), + base::File()); EXPECT_FALSE(scorer.get()); } TEST_F(PhishingScorerTest, HasValidModel) { std::unique_ptr<Scorer> scorer; - scorer.reset( - ProtobufModelScorer::Create(model_.SerializeAsString(), base::File())); + scorer = + ProtobufModelScorer::Create(model_.SerializeAsString(), base::File()); EXPECT_TRUE(scorer.get() != nullptr); // Invalid model string. - scorer.reset(ProtobufModelScorer::Create("bogus string", base::File())); + scorer = ProtobufModelScorer::Create("bogus string", base::File()); EXPECT_FALSE(scorer.get()); // Mode is missing a required field. model_.clear_max_words_per_term(); - scorer.reset(ProtobufModelScorer::Create(model_.SerializePartialAsString(), - base::File())); + scorer = ProtobufModelScorer::Create(model_.SerializePartialAsString(), + base::File()); EXPECT_FALSE(scorer.get()); } @@ -221,8 +221,8 @@ std::string flatbuffer = GetFlatBufferString(); base::MappedReadOnlyRegion mapped_region = GetMappedReadOnlyRegionWithData(flatbuffer); - scorer.reset(FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), - base::File())); + scorer = FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), + base::File()); ASSERT_TRUE(scorer.get()); base::RepeatingCallback<bool(const std::string&)> page_terms_callback( scorer->find_page_term_callback()); @@ -271,8 +271,8 @@ std::string flatbuffer = GetFlatBufferString(); base::MappedReadOnlyRegion mapped_region = GetMappedReadOnlyRegionWithData(flatbuffer); - scorer.reset(FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), - base::File())); + scorer = FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), + base::File()); ASSERT_TRUE(scorer.get()); base::RepeatingCallback<bool(uint32_t)> page_words_callback( scorer->find_page_word_callback()); @@ -321,8 +321,8 @@ std::string flatbuffer = GetFlatBufferString(); base::MappedReadOnlyRegion mapped_region = GetMappedReadOnlyRegionWithData(flatbuffer); - scorer.reset(FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), - base::File())); + scorer = FlatBufferModelScorer::Create(mapped_region.region.Duplicate(), + base::File()); EXPECT_TRUE(scorer.get() != nullptr); // An empty feature map should match the empty rule.
diff --git a/components/url_matcher/BUILD.gn b/components/url_matcher/BUILD.gn index f1d6277..8f3c6d1 100644 --- a/components/url_matcher/BUILD.gn +++ b/components/url_matcher/BUILD.gn
@@ -2,14 +2,24 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -component("url_matcher") { +component("substring_set_matcher") { sources = [ - "regex_set_matcher.cc", - "regex_set_matcher.h", "string_pattern.cc", "string_pattern.h", "substring_set_matcher.cc", "substring_set_matcher.h", + "url_matcher_export.h", + ] + + defines = [ "URL_MATCHER_IMPLEMENTATION" ] + + public_deps = [ "//base" ] +} + +component("url_matcher") { + sources = [ + "regex_set_matcher.cc", + "regex_set_matcher.h", "url_matcher.cc", "url_matcher.h", "url_matcher_constants.cc", @@ -24,6 +34,7 @@ defines = [ "URL_MATCHER_IMPLEMENTATION" ] public_deps = [ + ":substring_set_matcher", "//base", "//base/third_party/dynamic_annotations", "//components/google/core/common", @@ -45,6 +56,7 @@ "url_util_unittest.cc", ] deps = [ + ":substring_set_matcher", ":url_matcher", "//testing/gmock", "//testing/gtest",
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc index 58dc336..f2e493e 100644 --- a/components/viz/service/display/renderer_pixeltest.cc +++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -4736,18 +4736,9 @@ } void Basic() { - // Skip piecewise transfer functions because SkColorSpace (needed for - // CopyOutputResult::AsSkBitmap) doesn't support them.. - if ((src_color_space_.GetTransferID() == TransferID::PIECEWISE_HDR || - dst_color_space_.GetTransferID() == TransferID::PIECEWISE_HDR)) { - LOG(ERROR) << "Skipping piecewise HDR function"; - return; - } - if (src_color_space_.GetTransferID() == TransferID::PQ && !dst_color_space_.IsHDR()) { - LOG(ERROR) << "Skipping tonemapped output"; - return; + GTEST_SKIP() << "Skipping tonemapped output"; } gfx::Rect rect(this->device_viewport_size_); @@ -4850,9 +4841,19 @@ AggregatedRenderPassList pass_list; pass_list.push_back(std::move(pass)); - // Allow a difference of 2 bytes in comparison for shader-based transforms, - // and 4 bytes for LUT-based transforms (determined empirically). - cc::FuzzyPixelComparator comparator(false, 100.f, 0.f, 2.f, 2, 0); + // Allow a difference of 2 bytes in comparison for most cases. + float avg_abs_error_limit = 2.0f; + int max_abs_error_limit = 2; +#if BUILDFLAG(IS_FUCHSIA) + if (src_color_space_.GetTransferID() == TransferID::PQ) { + // Fuchsia+SwiftShader/Vulkan has higher error on some pixels with HDR + // color spaces. See https://crbug.com/1312141. + max_abs_error_limit = 5; + } +#endif + + cc::FuzzyPixelComparator comparator(false, 100.f, 0.f, avg_abs_error_limit, + max_abs_error_limit, 0); EXPECT_TRUE( this->RunPixelTest(&pass_list, &expected_output_colors, comparator)) << " src:" << src_color_space_ << ", dst:" << dst_color_space_; @@ -4863,13 +4864,7 @@ bool premultiplied_alpha_ = false; }; -// crbug.com/1312043 Disable the test due to flaky. -#if BUILDFLAG(IS_FUCHSIA) -#define MAYBE_Basic DISABLED_Basic -#else -#define MAYBE_Basic Basic -#endif -TEST_P(ColorTransformPixelTest, MAYBE_Basic) { +TEST_P(ColorTransformPixelTest, Basic) { #if BUILDFLAG(IS_LINUX) && defined(THREAD_SANITIZER) // Test is flaking with failed large allocations under TSAN when using // SkiaRenderer with GL backend. See https://crbug.com/1320955. @@ -4892,8 +4887,6 @@ gfx::ColorSpace(PrimaryID::BT709, TransferID::SMPTEST428_1), gfx::ColorSpace(PrimaryID::BT709, TransferID::SRGB_HDR), gfx::ColorSpace(PrimaryID::BT709, TransferID::LINEAR_HDR), - // Piecewise HDR transfer functions skipped with SkiaRenderer. - gfx::ColorSpace::CreatePiecewiseHDR(PrimaryID::BT709, 0.5, 1.5), gfx::ColorSpace::CreateHDR10(50.f), gfx::ColorSpace::CreateHDR10(250.f), }; @@ -4909,8 +4902,6 @@ gfx::ColorSpace(PrimaryID::BT709, TransferID::SRGB), gfx::ColorSpace(PrimaryID::BT709, TransferID::SRGB_HDR), gfx::ColorSpace(PrimaryID::BT709, TransferID::LINEAR_HDR), - // Piecewise HDR transfer functions are skipped with SkiaRenderer. - gfx::ColorSpace::CreatePiecewiseHDR(PrimaryID::BT709, 0.25, 2.5), }; gfx::ColorSpace intermediate_color_spaces[] = {
diff --git a/components/webapps/common/android/BUILD.gn b/components/webapps/common/android/BUILD.gn index 82800387..3108fb4 100644 --- a/components/webapps/common/android/BUILD.gn +++ b/components/webapps/common/android/BUILD.gn
@@ -13,7 +13,5 @@ } android_library("webapk_install_java") { - deps = [ "//base:jni_java" ] srcjar_deps = [ ":webapk_install_aidl" ] - annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] }
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 1192036..5a7778c 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -423,8 +423,6 @@ "attribution_reporting/attribution_observer.h", "attribution_reporting/attribution_observer_types.cc", "attribution_reporting/attribution_observer_types.h", - "attribution_reporting/attribution_page_metrics.cc", - "attribution_reporting/attribution_page_metrics.h", "attribution_reporting/attribution_random_generator.h", "attribution_reporting/attribution_report.cc", "attribution_reporting/attribution_report.h",
diff --git a/content/browser/attribution_reporting/attribution_host.cc b/content/browser/attribution_reporting/attribution_host.cc index 76047ec..91182b26 100644 --- a/content/browser/attribution_reporting/attribution_host.cc +++ b/content/browser/attribution_reporting/attribution_host.cc
@@ -7,20 +7,13 @@ #include <utility> #include "base/check.h" +#include "base/check_op.h" #include "base/memory/raw_ptr.h" #include "base/metrics/histogram_macros.h" -#include "base/time/time.h" -#include "build/build_config.h" -#include "content/browser/attribution_reporting/attribution_aggregatable_source.h" #include "content/browser/attribution_reporting/attribution_data_host_manager.h" -#include "content/browser/attribution_reporting/attribution_filter_data.h" #include "content/browser/attribution_reporting/attribution_manager.h" #include "content/browser/attribution_reporting/attribution_manager_provider.h" #include "content/browser/attribution_reporting/attribution_metrics.h" -#include "content/browser/attribution_reporting/attribution_page_metrics.h" -#include "content/browser/attribution_reporting/attribution_source_type.h" -#include "content/browser/attribution_reporting/common_source_info.h" -#include "content/browser/attribution_reporting/storable_source.h" #include "content/browser/renderer_host/frame_tree.h" #include "content/browser/renderer_host/frame_tree_node.h" #include "content/browser/renderer_host/render_frame_host_impl.h" @@ -31,7 +24,6 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/content_client.h" #include "mojo/public/cpp/bindings/message.h" -#include "net/base/schemeful_site.h" #include "services/network/public/cpp/is_potentially_trustworthy.h" #include "third_party/blink/public/common/navigation/impression.h" #include "url/gurl.h" @@ -117,18 +109,6 @@ ->current_origin(); navigation_impression_origins_.emplace(navigation_handle->GetNavigationId(), initiator_root_frame_origin); - - if (auto* initiator_web_contents = - WebContents::FromRenderFrameHost(initiator_frame_host)) { - if (auto* initiator_conversion_host = - AttributionHost::FromWebContents(initiator_web_contents)) { - // This doesn't necessarily mean that the browser will store the report, - // due to the additional logic in DidFinishNavigation(). This records - // that a page /attempted/ to register an impression for a navigation. - initiator_conversion_host->NotifyImpressionInitiatedByPage( - initiator_root_frame_origin, *(navigation_handle->GetImpression())); - } - } } void AttributionHost::DidFinishNavigation(NavigationHandle* navigation_handle) { @@ -167,8 +147,6 @@ return; } - conversion_page_metrics_ = std::make_unique<AttributionPageMetrics>(); - // If we were not able to access the impression origin, ignore the // navigation. if (!navigation_impression_origin_it) { @@ -181,7 +159,6 @@ DCHECK(navigation_handle->GetImpression()); const blink::Impression& impression = *(navigation_handle->GetImpression()); - if (impression.attribution_src_token) { auto* data_host_manager = attribution_manager->GetDataHostManager(); if (!data_host_manager) return; @@ -190,48 +167,8 @@ navigation_handle->GetRenderFrameHost()->GetLastCommittedOrigin(); data_host_manager->NotifyNavigationForDataHost( - *impression.attribution_src_token, impression_origin, + impression.attribution_src_token, impression_origin, destination_origin); - return; - } - - // If the impression's conversion destination does not match the final top - // frame origin of this new navigation ignore it. - if (net::SchemefulSite(impression.conversion_destination) != - net::SchemefulSite( - navigation_handle->GetRenderFrameHost()->GetLastCommittedOrigin())) { - return; - } - - // Convert |impression| into a StorableImpression that can be forwarded to - // storage. If a reporting origin was not provided, default to the impression - // origin for reporting. - const url::Origin& reporting_origin = !impression.reporting_origin - ? impression_origin - : *impression.reporting_origin; - - // Conversion measurement is only allowed in secure contexts. - if (!network::IsOriginPotentiallyTrustworthy(impression_origin) || - !network::IsOriginPotentiallyTrustworthy(reporting_origin) || - !network::IsOriginPotentiallyTrustworthy( - impression.conversion_destination)) { - return; - } - - const AttributionSourceType source_type = AttributionSourceType::kNavigation; - const base::Time impression_time = base::Time::Now(); - - StorableSource storable_impression( - // Impression data doesn't need to be sanitized. - CommonSourceInfo( - impression.impression_data, impression_origin, - impression.conversion_destination, reporting_origin, impression_time, - CommonSourceInfo::GetExpiryTime(impression.expiry, impression_time, - source_type), - source_type, impression.priority, AttributionFilterData(), - /*debug_key=*/absl::nullopt, AttributionAggregatableSource())); - - attribution_manager->HandleSource(std::move(storable_impression)); } void AttributionHost::MaybeNotifyFailedSourceNavigation( @@ -247,24 +184,10 @@ absl::optional<blink::Impression> impression = navigation_handle->GetImpression(); - if (!impression || !impression->attribution_src_token) { - return; - } - - data_host_manager->NotifyNavigationFailure( - *impression->attribution_src_token); -} - -void AttributionHost::NotifyImpressionInitiatedByPage( - const url::Origin& impression_origin, - const blink::Impression& impression) { - if (!conversion_page_metrics_) + if (!impression) return; - const url::Origin& reporting_origin = !impression.reporting_origin - ? impression_origin - : *impression.reporting_origin; - conversion_page_metrics_->OnImpression(reporting_origin); + data_host_manager->NotifyNavigationFailure(impression->attribution_src_token); } void AttributionHost::RegisterDataHost(
diff --git a/content/browser/attribution_reporting/attribution_host.h b/content/browser/attribution_reporting/attribution_host.h index a25963b..b2692f48 100644 --- a/content/browser/attribution_reporting/attribution_host.h +++ b/content/browser/attribution_reporting/attribution_host.h
@@ -19,7 +19,6 @@ namespace content { class AttributionManagerProvider; -class AttributionPageMetrics; class WebContents; // Class responsible for listening to conversion events originating from blink, @@ -56,10 +55,6 @@ void DidStartNavigation(NavigationHandle* navigation_handle) override; void DidFinishNavigation(NavigationHandle* navigation_handle) override; - // Notifies an impression. - void NotifyImpressionInitiatedByPage(const url::Origin& impression_origin, - const blink::Impression& impression); - // Notifies the `AttributionDataHostManager` that a navigation with an // associated `AttributionDataHost` failed, if necessary. void MaybeNotifyFailedSourceNavigation(NavigationHandle* navigation_handle); @@ -83,11 +78,6 @@ // and conversion registrations to. std::unique_ptr<AttributionManagerProvider> attribution_manager_provider_; - // Logs metrics per top-level page load. Created for every top level - // navigation that commits, as long as there is a AttributionManager. - // Excludes the initial about:blank document. - std::unique_ptr<AttributionPageMetrics> conversion_page_metrics_; - RenderFrameHostReceiverSet<blink::mojom::ConversionHost> receivers_; WEB_CONTENTS_USER_DATA_KEY_DECL();
diff --git a/content/browser/attribution_reporting/attribution_host_unittest.cc b/content/browser/attribution_reporting/attribution_host_unittest.cc index bff02877..868f964 100644 --- a/content/browser/attribution_reporting/attribution_host_unittest.cc +++ b/content/browser/attribution_reporting/attribution_host_unittest.cc
@@ -59,15 +59,6 @@ const char kConversionUrl[] = "https://b.com"; -blink::Impression CreateValidImpression() { - blink::Impression result; - result.conversion_destination = url::Origin::Create(GURL(kConversionUrl)); - result.reporting_origin = url::Origin::Create(GURL("https://c.com")); - result.impression_data = 1UL; - result.priority = 10; - return result; -} - class AttributionHostTest : public RenderViewHostTestHarness { public: AttributionHostTest() = default; @@ -103,63 +94,27 @@ render_frame_host); } - protected: + private: MockAttributionManager mock_manager_; + + protected: MockDataHostManager* mock_data_host_manager_; }; -TEST_F(AttributionHostTest, NavigationWithImpression_PerPageImpressionMetrics) { - base::HistogramTester histograms; - - contents()->NavigateAndCommit(GURL("https://www.example.com")); - - // Initial document should not log metrics. - histograms.ExpectTotalCount( - "Conversions.UniqueReportingOriginsPerPage.Impressions", 0); - - blink::Impression impression = CreateValidImpression(); - - for (size_t i = 0u; i < 2u; i++) { - auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( - GURL(kConversionUrl), main_rfh()); - navigation->SetInitiatorFrame(main_rfh()); - navigation->set_impression(impression); - navigation->Commit(); - } - - // Navigate again to trigger histogram code. - contents()->NavigateAndCommit(GURL("https://www.example-next.com")); - - histograms.ExpectBucketCount( - "Conversions.UniqueReportingOriginsPerPage.Impressions", 1, 2); -} - TEST_F(AttributionHostTest, NavigationWithNoImpression_Ignored) { - EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost).Times(0); contents()->NavigateAndCommit(GURL("https://secure_impression.com")); NavigationSimulatorImpl::NavigateAndCommitFromDocument(GURL(kConversionUrl), main_rfh()); } -TEST_F(AttributionHostTest, ValidImpression_ForwardedToManager) { - EXPECT_CALL(mock_manager_, HandleSource); - - contents()->NavigateAndCommit(GURL("https://secure_impression.com")); - auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( - GURL(kConversionUrl), main_rfh()); - navigation->SetInitiatorFrame(main_rfh()); - navigation->set_impression(CreateValidImpression()); - navigation->Commit(); -} - TEST_F(AttributionHostTest, ValidAttributionSrc_ForwardedToManager) { - auto impression = CreateValidImpression(); - impression.attribution_src_token = blink::AttributionSrcToken(); + blink::Impression impression; EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost( - *impression.attribution_src_token, + impression.attribution_src_token, url::Origin::Create(GURL("https://secure_impression.com")), url::Origin::Create(GURL(kConversionUrl)))); @@ -178,12 +133,12 @@ auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL(kConversionUrl), main_rfh()); navigation->SetInitiatorFrame(main_rfh()); - navigation->set_impression(CreateValidImpression()); + navigation->set_impression(blink::Impression()); navigation->Commit(); } TEST_F(AttributionHostTest, ImpressionInSubframe_Ignored) { - EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost).Times(0); contents()->NavigateAndCommit(GURL("https://secure_impression.com")); @@ -196,14 +151,14 @@ auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL(kConversionUrl), subframe); navigation->SetInitiatorFrame(main_rfh()); - navigation->set_impression(CreateValidImpression()); + navigation->set_impression(blink::Impression()); navigation->Commit(); } // Test that if we cannot access the initiator frame of the navigation, we // ignore the associated impression. TEST_F(AttributionHostTest, ImpressionNavigationWithDeadInitiator_Ignored) { - EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost).Times(0); base::HistogramTester histograms; @@ -213,7 +168,7 @@ GURL(kConversionUrl), main_rfh()); // This test explicitly requires no initiator frame being set. navigation->SetInitiatorFrame(nullptr); - navigation->set_impression(CreateValidImpression()); + navigation->set_impression(blink::Impression()); navigation->Commit(); histograms.ExpectUniqueSample( @@ -221,26 +176,24 @@ } TEST_F(AttributionHostTest, ImpressionNavigationCommitsToErrorPage_Ignored) { - EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost).Times(0); contents()->NavigateAndCommit(GURL("https://secure_impression.com")); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL(kConversionUrl), main_rfh()); navigation->SetInitiatorFrame(main_rfh()); - navigation->set_impression(CreateValidImpression()); + navigation->set_impression(blink::Impression()); navigation->Fail(net::ERR_FAILED); navigation->CommitErrorPage(); } TEST_F(AttributionHostTest, AttributionSrcNavigationCommitsToErrorPage_Ignored) { - auto impression = CreateValidImpression(); - impression.attribution_src_token = blink::AttributionSrcToken(); + blink::Impression impression; - EXPECT_CALL( - *mock_data_host_manager_, - NotifyNavigationFailure(impression.attribution_src_token.value())); + EXPECT_CALL(*mock_data_host_manager_, + NotifyNavigationFailure(impression.attribution_src_token)); contents()->NavigateAndCommit(GURL("https://secure_impression.com")); @@ -253,24 +206,22 @@ } TEST_F(AttributionHostTest, ImpressionNavigationAborts_Ignored) { - EXPECT_CALL(mock_manager_, HandleSource).Times(0); + EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost).Times(0); contents()->NavigateAndCommit(GURL("https://secure_impression.com")); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL(kConversionUrl), main_rfh()); navigation->SetInitiatorFrame(main_rfh()); - navigation->set_impression(CreateValidImpression()); + navigation->set_impression(blink::Impression()); navigation->AbortCommit(); } TEST_F(AttributionHostTest, AttributionSrcNavigationAborts_Ignored) { - auto impression = CreateValidImpression(); - impression.attribution_src_token = blink::AttributionSrcToken(); + blink::Impression impression; - EXPECT_CALL( - *mock_data_host_manager_, - NotifyNavigationFailure(impression.attribution_src_token.value())); + EXPECT_CALL(*mock_data_host_manager_, + NotifyNavigationFailure(impression.attribution_src_token)); contents()->NavigateAndCommit(GURL("https://secure_impression.com")); @@ -282,15 +233,15 @@ } TEST_F(AttributionHostTest, - CommittedOriginDiffersFromConversionDesintation_Ignored) { - EXPECT_CALL(mock_manager_, HandleSource).Times(0); + CommittedOriginDiffersFromConversionDesintation_Propagated) { + EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost); contents()->NavigateAndCommit(GURL("https://secure_impression.com")); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL("https://different.com"), main_rfh()); navigation->SetInitiatorFrame(main_rfh()); - navigation->set_impression(CreateValidImpression()); + navigation->set_impression(blink::Impression()); navigation->Commit(); } @@ -300,34 +251,24 @@ struct OriginTrustworthyChecksTestCase { const char* impression_origin; const char* conversion_origin; - const char* reporting_origin; bool impression_expected; }; const OriginTrustworthyChecksTestCase kOriginTrustworthyChecksTestCases[] = { {.impression_origin = kLocalHost, .conversion_origin = kLocalHost, - .reporting_origin = kLocalHost, .impression_expected = true}, {.impression_origin = "http://127.0.0.1", .conversion_origin = "http://127.0.0.1", - .reporting_origin = "http://127.0.0.1", .impression_expected = true}, {.impression_origin = kLocalHost, - .conversion_origin = kLocalHost, - .reporting_origin = "http://insecure.com", - .impression_expected = false}, - {.impression_origin = kLocalHost, .conversion_origin = "http://insecure.com", - .reporting_origin = kLocalHost, - .impression_expected = false}, + .impression_expected = true}, {.impression_origin = "http://insecure.com", .conversion_origin = kLocalHost, - .reporting_origin = kLocalHost, - .impression_expected = false}, + .impression_expected = true}, {.impression_origin = "https://secure.com", .conversion_origin = "https://secure.com", - .reporting_origin = "https://secure.com", .impression_expected = true}, }; @@ -341,18 +282,14 @@ ImpressionNavigation_OriginTrustworthyChecksPerformed) { const OriginTrustworthyChecksTestCase& test_case = GetParam(); - EXPECT_CALL(mock_manager_, HandleSource).Times(test_case.impression_expected); + EXPECT_CALL(*mock_data_host_manager_, NotifyNavigationForDataHost) + .Times(test_case.impression_expected); contents()->NavigateAndCommit(GURL(test_case.impression_origin)); auto navigation = NavigationSimulatorImpl::CreateRendererInitiated( GURL(test_case.conversion_origin), main_rfh()); - blink::Impression impression; - impression.conversion_destination = - url::Origin::Create(GURL(test_case.conversion_origin)); - impression.reporting_origin = - url::Origin::Create(GURL(test_case.reporting_origin)); - navigation->set_impression(impression); + navigation->set_impression(blink::Impression()); navigation->SetInitiatorFrame(main_rfh()); navigation->Commit(); }
diff --git a/content/browser/attribution_reporting/attribution_page_metrics.cc b/content/browser/attribution_reporting/attribution_page_metrics.cc deleted file mode 100644 index 1c94664..0000000 --- a/content/browser/attribution_reporting/attribution_page_metrics.cc +++ /dev/null
@@ -1,39 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/attribution_reporting/attribution_page_metrics.h" - -#include <utility> - -#include "base/metrics/histogram_functions.h" - -namespace content { - -namespace { -constexpr size_t kMaxStoredOrigins = 100; -} // namespace - -AttributionPageMetrics::AttributionPageMetrics() = default; - -AttributionPageMetrics::~AttributionPageMetrics() { - base::UmaHistogramExactLinear("Conversions.RegisteredImpressionsPerPage", - num_impressions_on_current_page_, 100); - - if (!impression_reporting_origins_on_current_page_.empty()) { - base::UmaHistogramExactLinear( - "Conversions.UniqueReportingOriginsPerPage.Impressions", - impression_reporting_origins_on_current_page_.size(), 100); - } -} - -void AttributionPageMetrics::OnImpression(url::Origin reporting_origin) { - num_impressions_on_current_page_++; - if (impression_reporting_origins_on_current_page_.size() < - kMaxStoredOrigins) { - impression_reporting_origins_on_current_page_.insert( - std::move(reporting_origin)); - } -} - -} // namespace content
diff --git a/content/browser/attribution_reporting/attribution_page_metrics.h b/content/browser/attribution_reporting/attribution_page_metrics.h deleted file mode 100644 index a1a2e53..0000000 --- a/content/browser/attribution_reporting/attribution_page_metrics.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_PAGE_METRICS_H_ -#define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_PAGE_METRICS_H_ - -#include "base/containers/flat_set.h" -#include "url/origin.h" - -namespace content { - -// Keeps track of per-page-load metrics for conversion measurement. Lifetime is -// scoped to a single page load. -class AttributionPageMetrics { - public: - AttributionPageMetrics(); - ~AttributionPageMetrics(); - - AttributionPageMetrics(const AttributionPageMetrics& other) = delete; - AttributionPageMetrics& operator=(const AttributionPageMetrics& other) = - delete; - AttributionPageMetrics(AttributionPageMetrics&& other) = delete; - AttributionPageMetrics& operator=(AttributionPageMetrics&& other) = delete; - - // Called when an impression is registered. - void OnImpression(url::Origin reporting_origin); - - private: - // Keeps track of how many impression registrations there have been on the - // current page. - int num_impressions_on_current_page_ = 0; - - // Keeps track of how many unique reporting origins for impression - // registrations there have been on the current page. - base::flat_set<url::Origin> impression_reporting_origins_on_current_page_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_PAGE_METRICS_H_
diff --git a/content/browser/attribution_reporting/attribution_src_browsertest.cc b/content/browser/attribution_reporting/attribution_src_browsertest.cc index cc6a5469..8d1f2e1 100644 --- a/content/browser/attribution_reporting/attribution_src_browsertest.cc +++ b/content/browser/attribution_reporting/attribution_src_browsertest.cc
@@ -183,8 +183,7 @@ blink::Impression last_impression = source_observer.Wait(); // Verify we received the correct token for this source. - EXPECT_TRUE(last_impression.attribution_src_token); - EXPECT_EQ(*last_impression.attribution_src_token, expected_token); + EXPECT_EQ(last_impression.attribution_src_token, expected_token); // Verify the attributionsrc data was registered with the browser process. EXPECT_TRUE(data_host); @@ -222,8 +221,7 @@ blink::Impression last_impression = source_observer.Wait(); // Verify we received the correct token for this source. - EXPECT_TRUE(last_impression.attribution_src_token); - EXPECT_EQ(*last_impression.attribution_src_token, expected_token); + EXPECT_EQ(last_impression.attribution_src_token, expected_token); // Verify the attributionsrc data was registered with the browser process. EXPECT_TRUE(data_host);
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.h b/content/browser/attribution_reporting/attribution_storage_delegate.h index 3f785d65..381f588 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate.h +++ b/content/browser/attribution_reporting/attribution_storage_delegate.h
@@ -9,6 +9,7 @@ #include <vector> #include "base/time/time.h" +#include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_source_type.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -18,7 +19,6 @@ namespace content { -class AttributionReport; class CommonSourceInfo; // Storage delegate that can supplied to extend basic attribution storage @@ -87,12 +87,13 @@ // time for a source top-level origin. virtual int GetMaxSourcesPerOrigin() const = 0; - // Returns the maximum number of reports that can be in storage at any - // time for an attribution top-level origin. Note that since reporting - // origins are the actual entities that invoke attribution registration, we - // could consider changing this limit to be keyed by an <attribution origin, - // reporting origin> tuple. - virtual int GetMaxAttributionsPerOrigin() const = 0; + // Returns the maximum number of reports of the given type that can be in + // storage at any time for an attribution top-level origin. Note that since + // reporting origins are the actual entities that invoke attribution + // registration, we could consider changing this limit to be keyed by an + // <attribution origin, reporting origin> tuple. + virtual int GetMaxAttributionsPerOrigin( + AttributionReport::ReportType) const = 0; // Returns the maximum number of distinct attribution destinations that can // be in storage at any time for sources with the same <source site,
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc index a0e62197..43252161 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
@@ -94,7 +94,8 @@ return 1024; } -int AttributionStorageDelegateImpl::GetMaxAttributionsPerOrigin() const { +int AttributionStorageDelegateImpl::GetMaxAttributionsPerOrigin( + AttributionReport::ReportType) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); return 1024; }
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.h b/content/browser/attribution_reporting/attribution_storage_delegate_impl.h index 95269120..97e56c1 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.h +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.h
@@ -52,7 +52,7 @@ int GetMaxAttributionsPerSource( AttributionSourceType source_type) const override; int GetMaxSourcesPerOrigin() const override; - int GetMaxAttributionsPerOrigin() const override; + int GetMaxAttributionsPerOrigin(AttributionReport::ReportType) const override; int GetMaxDestinationsPerSourceSiteReportingOrigin() const override; RateLimitConfig GetRateLimits() const override; base::TimeDelta GetDeleteExpiredSourcesFrequency() const override;
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc index edcaec9..4c129fe 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -147,6 +147,23 @@ DCHECK_SQL_INDEXED_BY("aggregate_report_time_idx") \ "JOIN sources I ON A.source_id = I.source_id " +// This query should be reasonably optimized via +// `kConversionDestinationIndexSql`. The conversion origin is the third +// column in a multi-column index where the first two columns are just booleans. +// Therefore the third column in the index should be very well-sorted. +// +// Note: to take advantage of this, we need to hint to the query planner that +// |event_level_active| and |aggregatable_active| are booleans, so include +// them in the conditional. +#define ATTRIBUTION_COUNT_REPORTS_SQL(table) \ + "SELECT COUNT(*)FROM " table " R " \ + "JOIN sources I " \ + DCHECK_SQL_INDEXED_BY("sources_by_active_destination_site_reporting_origin") \ + "ON I.source_id=R.source_id " \ + "WHERE I.destination_site=? " \ + "AND(event_level_active BETWEEN 0 AND 1)" \ + "AND(aggregatable_active BETWEEN 0 AND 1)" + // clang-format on void RecordInitializationStatus( @@ -824,18 +841,6 @@ /*new_aggregaable_status=*/absl::nullopt); } - switch (CapacityForStoringReport(trigger)) { - case ConversionCapacityStatus::kHasCapacity: - break; - case ConversionCapacityStatus::kNoCapacity: - return assemble_report_result( - EventLevelResult::kNoCapacityForConversionDestination, - AggregatableResult::kNoCapacityForConversionDestination); - case ConversionCapacityStatus::kError: - return assemble_report_result(EventLevelResult::kInternalError, - AggregatableResult::kInternalError); - } - switch (rate_limit_table_.AttributionAllowedForAttributionLimit( db_.get(), attribution_info)) { case RateLimitResult::kAllowed: @@ -1035,6 +1040,16 @@ return EventLevelResult::kInternalError; } + switch (CapacityForStoringReport( + trigger, AttributionReport::ReportType::kEventLevel)) { + case ConversionCapacityStatus::kHasCapacity: + break; + case ConversionCapacityStatus::kNoCapacity: + return EventLevelResult::kNoCapacityForConversionDestination; + case ConversionCapacityStatus::kError: + return EventLevelResult::kInternalError; + } + const base::Time report_time = delegate_->GetEventLevelReportTime(common_info, attribution_info.time); @@ -1785,31 +1800,28 @@ AttributionStorageSql::ConversionCapacityStatus AttributionStorageSql::CapacityForStoringReport( - const AttributionTrigger& trigger) { - // This query should be reasonably optimized via - // `kConversionDestinationIndexSql`. The conversion origin is the second - // column in a multi-column index where the first column is just a boolean. - // Therefore the second column in the index should be very well-sorted. - // - // Note: to take advantage of this, we need to hint to the query planner that - // |event_level_active| and |aggregatable_active| are booleans, so include - // them in the conditional. - static constexpr char kCountReportsSql[] = - "SELECT COUNT(*)FROM event_level_reports C " - "JOIN sources I " - DCHECK_SQL_INDEXED_BY("sources_by_active_destination_site_reporting_origin") - "ON I.source_id = C.source_id " - "WHERE I.destination_site = ? AND " - "(event_level_active BETWEEN 0 AND 1) AND " - "(aggregatable_active BETWEEN 0 AND 1)"; - sql::Statement statement( - db_->GetCachedStatement(SQL_FROM_HERE, kCountReportsSql)); + const AttributionTrigger& trigger, + AttributionReport::ReportType report_type) { + sql::Statement statement; + switch (report_type) { + case AttributionReport::ReportType::kEventLevel: + statement.Assign(db_->GetCachedStatement( + SQL_FROM_HERE, + ATTRIBUTION_COUNT_REPORTS_SQL(ATTRIBUTION_CONVERSIONS_TABLE))); + break; + case AttributionReport::ReportType::kAggregatableAttribution: + statement.Assign(db_->GetCachedStatement( + SQL_FROM_HERE, ATTRIBUTION_COUNT_REPORTS_SQL( + ATTRIBUTION_AGGREGATABLE_REPORT_METADATA_TABLE))); + break; + } + statement.BindString( 0, net::SchemefulSite(trigger.destination_origin()).Serialize()); if (!statement.Step()) return ConversionCapacityStatus::kError; int64_t count = statement.ColumnInt64(0); - return count < delegate_->GetMaxAttributionsPerOrigin() + return count < delegate_->GetMaxAttributionsPerOrigin(report_type) ? ConversionCapacityStatus::kHasCapacity : ConversionCapacityStatus::kNoCapacity; } @@ -2588,6 +2600,16 @@ if (contributions.empty()) return AggregatableResult::kNoHistograms; + switch (CapacityForStoringReport( + trigger, AttributionReport::ReportType::kAggregatableAttribution)) { + case ConversionCapacityStatus::kHasCapacity: + break; + case ConversionCapacityStatus::kNoCapacity: + return AggregatableResult::kNoCapacityForConversionDestination; + case ConversionCapacityStatus::kError: + return AggregatableResult::kInternalError; + } + base::Time report_time = delegate_->GetAggregatableReportTime(attribution_info.time);
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h index cd4e43bb..e6f3484 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.h +++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -15,6 +15,7 @@ #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/thread_annotations.h" +#include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_storage.h" #include "content/browser/attribution_reporting/attribution_trigger.h" #include "content/browser/attribution_reporting/rate_limit_table.h" @@ -166,8 +167,9 @@ kError, }; - ConversionCapacityStatus CapacityForStoringReport(const AttributionTrigger&) - VALID_CONTEXT_REQUIRED(sequence_checker_); + ConversionCapacityStatus CapacityForStoringReport( + const AttributionTrigger&, + AttributionReport::ReportType) VALID_CONTEXT_REQUIRED(sequence_checker_); enum class MaybeReplaceLowerPriorityEventLevelReportResult { kError,
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc index 1b86b33..a7647fc7 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_unittest.cc
@@ -506,7 +506,8 @@ TEST_F(AttributionStorageSqlTest, MaxAttributionsPerOrigin) { OpenDatabase(); - delegate()->set_max_attributions_per_origin(2); + delegate()->set_max_attributions_per_origin( + AttributionReport::ReportType::kEventLevel, 2); storage()->StoreSource(SourceBuilder().Build()); EXPECT_EQ(AttributionTrigger::EventLevelResult::kSuccess, MaybeCreateAndStoreEventLevelReport(DefaultTrigger()));
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc index 6625c8f..68ebd490 100644 --- a/content/browser/attribution_reporting/attribution_storage_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -566,10 +566,11 @@ SourceEventIdIs(7u), SourceEventIdIs(11u))); } -TEST_F(AttributionStorageTest, MaxConversionsPerOrigin) { +TEST_F(AttributionStorageTest, MaxEventLevelAttributionsPerOrigin) { SourceBuilder source_builder = TestAggregatableSourceProvider().GetBuilder(); - delegate()->set_max_attributions_per_origin(1); + delegate()->set_max_attributions_per_origin( + AttributionReport::ReportType::kEventLevel, 1); storage()->StoreSource(source_builder.Build()); storage()->StoreSource(source_builder.Build()); @@ -580,18 +581,38 @@ CreateReportAggregatableStatusIs( AttributionTrigger::AggregatableResult::kSuccess))); - // Verify that MaxConversionsPerOrigin is enforced. - auto contributions = - DefaultAggregatableHistogramContributions(/*histogram_values=*/{5}); - ASSERT_THAT(contributions, SizeIs(1)); + // Verify that MaxAttributionsPerOrigin is enforced. EXPECT_THAT(storage()->MaybeCreateAndStoreReport( - DefaultAggregatableTriggerBuilder(/*histogram_values=*/{5}) - .SetTriggerData(5) - .Build()), + DefaultAggregatableTriggerBuilder().Build()), AllOf(CreateReportEventLevelStatusIs( AttributionTrigger::EventLevelResult:: kNoCapacityForConversionDestination), CreateReportAggregatableStatusIs( + AttributionTrigger::AggregatableResult::kSuccess), + ReplacedEventLevelReportIs(absl::nullopt))); +} + +TEST_F(AttributionStorageTest, MaxAggregatableAttributionsPerOrigin) { + SourceBuilder source_builder = TestAggregatableSourceProvider().GetBuilder(); + + delegate()->set_max_attributions_per_origin( + AttributionReport::ReportType::kAggregatableAttribution, 1); + storage()->StoreSource(source_builder.Build()); + storage()->StoreSource(source_builder.Build()); + + EXPECT_THAT(storage()->MaybeCreateAndStoreReport( + DefaultAggregatableTriggerBuilder().Build()), + AllOf(CreateReportEventLevelStatusIs( + AttributionTrigger::EventLevelResult::kSuccess), + CreateReportAggregatableStatusIs( + AttributionTrigger::AggregatableResult::kSuccess))); + + // Verify that MaxAttributionsPerOrigin is enforced. + EXPECT_THAT(storage()->MaybeCreateAndStoreReport( + DefaultAggregatableTriggerBuilder().Build()), + AllOf(CreateReportEventLevelStatusIs( + AttributionTrigger::EventLevelResult::kSuccess), + CreateReportAggregatableStatusIs( AttributionTrigger::AggregatableResult:: kNoCapacityForConversionDestination), ReplacedEventLevelReportIs(absl::nullopt)));
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index 6f5123ef..66a8a89 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -152,9 +152,15 @@ return max_sources_per_origin_; } -int ConfigurableStorageDelegate::GetMaxAttributionsPerOrigin() const { +int ConfigurableStorageDelegate::GetMaxAttributionsPerOrigin( + AttributionReport::ReportType report_type) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return max_attributions_per_origin_; + switch (report_type) { + case AttributionReport::ReportType::kEventLevel: + return max_event_level_attributions_per_origin_; + case AttributionReport::ReportType::kAggregatableAttribution: + return max_aggregatable_attributions_per_origin_; + } } int ConfigurableStorageDelegate:: @@ -250,9 +256,18 @@ max_sources_per_origin_ = max; } -void ConfigurableStorageDelegate::set_max_attributions_per_origin(int max) { +void ConfigurableStorageDelegate::set_max_attributions_per_origin( + AttributionReport::ReportType report_type, + int max) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - max_attributions_per_origin_ = max; + switch (report_type) { + case AttributionReport::ReportType::kEventLevel: + max_event_level_attributions_per_origin_ = max; + break; + case AttributionReport::ReportType::kAggregatableAttribution: + max_aggregatable_attributions_per_origin_ = max; + break; + } } void ConfigurableStorageDelegate::
diff --git a/content/browser/attribution_reporting/attribution_test_utils.h b/content/browser/attribution_reporting/attribution_test_utils.h index 42e0465..f077b34 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.h +++ b/content/browser/attribution_reporting/attribution_test_utils.h
@@ -201,7 +201,8 @@ int GetMaxAttributionsPerSource( AttributionSourceType source_type) const override; int GetMaxSourcesPerOrigin() const override; - int GetMaxAttributionsPerOrigin() const override; + int GetMaxAttributionsPerOrigin( + AttributionReport::ReportType report_type) const override; RateLimitConfig GetRateLimits() const override; int GetMaxDestinationsPerSourceSiteReportingOrigin() const override; base::TimeDelta GetDeleteExpiredSourcesFrequency() const override; @@ -222,7 +223,9 @@ void set_max_sources_per_origin(int max); - void set_max_attributions_per_origin(int max); + void set_max_attributions_per_origin( + AttributionReport::ReportType report_type, + int max); void set_max_destinations_per_source_site_reporting_origin(int max); @@ -258,7 +261,8 @@ private: int max_attributions_per_source_ = INT_MAX; int max_sources_per_origin_ = INT_MAX; - int max_attributions_per_origin_ = INT_MAX; + int max_event_level_attributions_per_origin_ = INT_MAX; + int max_aggregatable_attributions_per_origin_ = INT_MAX; int max_destinations_per_source_site_reporting_origin_ = INT_MAX; int64_t aggregatable_budget_per_source_ = std::numeric_limits<int64_t>::max();
diff --git a/content/browser/attribution_reporting/attributions_browsertest.cc b/content/browser/attribution_reporting/attributions_browsertest.cc index 9128f094..34d8c7e 100644 --- a/content/browser/attribution_reporting/attributions_browsertest.cc +++ b/content/browser/attribution_reporting/attributions_browsertest.cc
@@ -154,7 +154,6 @@ // Sets up the blink runtime feature for ConversionMeasurement. command_line->AppendSwitch( switches::kEnableExperimentalWebPlatformFeatures); - command_line->AppendSwitch(switches::kEnableBlinkTestFeatures); } void SetUpOnMainThread() override {
diff --git a/content/browser/attribution_reporting/source_declaration_browsertest.cc b/content/browser/attribution_reporting/source_declaration_browsertest.cc index 2587cd68..0776d61 100644 --- a/content/browser/attribution_reporting/source_declaration_browsertest.cc +++ b/content/browser/attribution_reporting/source_declaration_browsertest.cc
@@ -6,7 +6,6 @@ #include "base/json/json_writer.h" #include "base/run_loop.h" -#include "base/test/metrics/histogram_tester.h" #include "base/threading/platform_thread.h" #include "base/values.h" #include "build/build_config.h" @@ -107,7 +106,6 @@ // Sets up the blink runtime feature for ConversionMeasurement. command_line->AppendSwitch( switches::kEnableExperimentalWebPlatformFeatures); - command_line->AppendSwitch(switches::kEnableBlinkTestFeatures); } }; @@ -130,7 +128,6 @@ SourceObserver source_observer(web_contents()); EXPECT_TRUE(ExecJs(shell(), "simulateClick('link');")); - // Wait for the impression to be seen by the observer. source_observer.Wait(); } @@ -155,8 +152,7 @@ source_observer.StartWatchingNewWebContents(); EXPECT_TRUE(ExecJs(shell(), "simulateClick('link');")); - // Wait for the impression to be seen by the observer. - blink::Impression last_impression = source_observer.Wait(); + source_observer.Wait(); } // Flaky: crbug.com/1077216 @@ -192,8 +188,7 @@ SourceObserver source_observer(remote_web_contents); EXPECT_TRUE(ExecJs(shell(), "simulateClick('link');")); - // Wait for the impression to be seen by the observer. - blink::Impression last_impression = source_observer.Wait(); + source_observer.Wait(); } IN_PROC_BROWSER_TEST_F( @@ -251,7 +246,6 @@ source_observer.StartWatchingNewWebContents(); EXPECT_TRUE(ExecJs(subframe, "simulateMiddleClick(\'link\');")); - // Verify the navigation was annotated with an impression. source_observer.Wait(); } @@ -453,7 +447,6 @@ blink::UntrustworthyContextMenuParams params = context_menu_interceptor->get_params(); EXPECT_TRUE(params.impression); - EXPECT_TRUE(params.impression->attribution_src_token.has_value()); } #endif // !BUILDFLAG(IS_ANDROID) @@ -572,9 +565,6 @@ // Wait for the impression to be seen by the observer. blink::Impression last_impression = source_observer.Wait(); - - // Verify the attributes of the impression are set as expected. - EXPECT_TRUE(last_impression.attribution_src_token.has_value()); } IN_PROC_BROWSER_TEST_F(AttributionSourceDeclarationBrowserTest,
diff --git a/content/browser/renderer_host/scroll_into_view_browsertest.cc b/content/browser/renderer_host/scroll_into_view_browsertest.cc index 43f9a89..ccf21f6 100644 --- a/content/browser/renderer_host/scroll_into_view_browsertest.cc +++ b/content/browser/renderer_host/scroll_into_view_browsertest.cc
@@ -566,8 +566,8 @@ } IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInLocalRoot) { -// Flaky on Mac ARM64. https://crbug.com/1323606 -#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64) +// TODO(crbug.com/1323876) Flaky on Mac. +#if BUILDFLAG(IS_MAC) if (!IsForceLocalFrames()) return; #endif @@ -576,8 +576,8 @@ } IN_PROC_BROWSER_TEST_P(ScrollIntoViewBrowserTest, EditableInDoublyNestedFrame) { -// Flaky on Mac ARM64. https://crbug.com/1323606 -#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64) +// TODO(crbug.com/1323876) Flaky on Mac. +#if BUILDFLAG(IS_MAC) if (!IsForceLocalFrames()) return; #endif @@ -588,8 +588,8 @@ IN_PROC_BROWSER_TEST_P( ScrollIntoViewBrowserTest, CrossesEditableInDoublyNestedFrameLocalAndRemoteBoundaries) { -// Flaky on Mac ARM64. https://crbug.com/1323606 -#if BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64) +// TODO(crbug.com/1323876) Flaky on Mac. +#if BUILDFLAG(IS_MAC) if (!IsForceLocalFrames()) return; #endif
diff --git a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc index 7e76e29..df3ce72 100644 --- a/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc +++ b/content/child/dwrite_font_proxy/dwrite_font_proxy_win.cc
@@ -275,8 +275,13 @@ const blink::WebString& family_name) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (!prewarm_task_runner_) + if (!prewarm_task_runner_) { + // |BindHostReceiverOnMainThread| requires |ChildThread::Get()|, but it may + // not be available in some tests. Disable the prewarmer. + if (UNLIKELY(!ChildThread::Get())) + return; InitializePrewarmer(); + } DCHECK(prewarm_task_runner_); prewarm_task_runner_->PostTask(
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index ff27739..1e60f596 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -170,7 +170,6 @@ #include "third_party/blink/public/mojom/permissions/permission.mojom.h" #include "third_party/blink/public/mojom/widget/platform_widget.mojom.h" #include "third_party/blink/public/platform/file_path_conversion.h" -#include "third_party/blink/public/platform/impression_conversions.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h" #include "third_party/blink/public/platform/resource_load_info_notifier_wrapper.h" #include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h" @@ -5546,10 +5545,7 @@ // navigations performed via OpenURL. params->source_location = network::mojom::SourceLocation::New(); - if (info->impression) { - params->impression = - blink::ConvertWebImpressionToImpression(*info->impression); - } + params->impression = info->impression; if (GetContentClient()->renderer()->AllowPopup()) params->user_gesture = true; @@ -5864,12 +5860,8 @@ info->url_request.TrustTokenParams() ? info->url_request.TrustTokenParams()->Clone() : nullptr, - info->impression - ? absl::make_optional<blink::Impression>( - blink::ConvertWebImpressionToImpression(*info->impression)) - : absl::nullopt, - renderer_before_unload_start, renderer_before_unload_end, - web_bundle_token_params); + info->impression, renderer_before_unload_start, + renderer_before_unload_end, web_bundle_token_params); mojo::PendingAssociatedRemote<mojom::NavigationClient> navigation_client_remote;
diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc index 7c16d13b..017f512 100644 --- a/content/renderer/render_frame_proxy.cc +++ b/content/renderer/render_frame_proxy.cc
@@ -29,7 +29,6 @@ #include "third_party/blink/public/common/permissions_policy/permissions_policy.h" #include "third_party/blink/public/mojom/frame/frame.mojom.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h" -#include "third_party/blink/public/platform/impression_conversions.h" #include "third_party/blink/public/platform/url_conversion.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/platform/web_url_request_util.h"
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 89b0750..5cf3e5a 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc
@@ -30,7 +30,6 @@ #include "content/renderer/render_frame_impl.h" #include "content/renderer/render_frame_proxy.h" #include "third_party/blink/public/mojom/page/page.mojom.h" -#include "third_party/blink/public/platform/impression_conversions.h" #include "third_party/blink/public/platform/modules/video_capture/web_video_capture_impl_manager.h" #include "third_party/blink/public/platform/url_conversion.h" #include "third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h" @@ -258,7 +257,7 @@ network::mojom::WebSandboxFlags sandbox_flags, const blink::SessionStorageNamespaceId& session_storage_namespace_id, bool& consumed_user_gesture, - const absl::optional<blink::WebImpression>& impression) { + const absl::optional<blink::Impression>& impression) { consumed_user_gesture = false; RenderFrameImpl* creator_frame = RenderFrameImpl::FromWebFrame(creator); mojom::CreateNewWindowParamsPtr params = mojom::CreateNewWindowParams::New(); @@ -291,9 +290,7 @@ } params->features = ConvertWebWindowFeaturesToMojoWindowFeatures(features); - if (impression) { - params->impression = blink::ConvertWebImpressionToImpression(*impression); - } + params->impression = impression; params->download_policy.ApplyDownloadFramePolicy( /*is_opener_navigation=*/false, request.HasUserGesture(),
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index fd145f0a..99978b33 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h
@@ -110,7 +110,7 @@ network::mojom::WebSandboxFlags sandbox_flags, const blink::SessionStorageNamespaceId& session_storage_namespace_id, bool& consumed_user_gesture, - const absl::optional<blink::WebImpression>& impression) override; + const absl::optional<blink::Impression>& impression) override; // RenderView implementation -------------------------------------------------
diff --git a/content/test/data/gpu/pixel_video_test.js b/content/test/data/gpu/pixel_video_test.js index d2e3385..6737000 100644 --- a/content/test/data/gpu/pixel_video_test.js +++ b/content/test/data/gpu/pixel_video_test.js
@@ -9,7 +9,7 @@ // 500 ms is supposed to be 15 frames at 30 Hz. However, only ~7 frames or less // are recorded in OverlayModeTraceTest_DirectComposition tests. // Reducing this delay might cause flakes in some tests. -var delayMs = 500; +var delayMs = 1000; function logOutput(s) { if (window.domAutomationController) @@ -31,7 +31,7 @@ })(window.location.search.substr(1).split('&')); function getTimeDelay() { - let delayString = parsedString['delay']; + let delayString = parsedString['delayMs']; if (delayString != undefined) delayMs = delayString;
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py index 45a6ad5..da62a23 100644 --- a/content/test/gpu/gpu_tests/pixel_test_pages.py +++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -967,23 +967,24 @@ other_args={'zero_copy': False}, matching_algorithm=very_permissive_dc_sobel_algorithm), PixelTestPage( - 'pixel_video_underlay.html?width=240&height=136&delay=500', + 'pixel_video_underlay.html?width=240&height=136&delayMs=4000', base_name + '_DirectComposition_Underlay', test_rect=[0, 0, 240, 136], browser_args=browser_args, matching_algorithm=permissive_dc_sobel_algorithm), PixelTestPage( - 'pixel_video_underlay.html?width=240&height=136&delay=500', + 'pixel_video_underlay.html?width=240&height=136&delayMs=2500', base_name + '_DirectComposition_Underlay_DXVA', test_rect=[0, 0, 240, 136], browser_args=browser_args_DXVA, matching_algorithm=permissive_dc_sobel_algorithm), - PixelTestPage('pixel_video_underlay.html?width=960&height=540', - base_name + '_DirectComposition_Underlay_Fullsize', - test_rect=[0, 0, 960, 540], - browser_args=browser_args, - other_args={'full_size': True}, - matching_algorithm=strict_dc_sobel_algorithm), + PixelTestPage( + 'pixel_video_underlay.html?width=960&height=540&delayMs=2500', + base_name + '_DirectComposition_Underlay_Fullsize', + test_rect=[0, 0, 960, 540], + browser_args=browser_args, + other_args={'full_size': True}, + matching_algorithm=strict_dc_sobel_algorithm), PixelTestPage( 'pixel_video_mp4_rounded_corner.html?width=240&height=135', base_name + '_DirectComposition_Video_MP4_Rounded_Corner',
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt index a7ad02b..19d7db3 100644 --- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -173,9 +173,6 @@ # Flaky tests on Windows 10 HD 630 GPUs. Temporarily suppress them all and they will be put back one by one soon. -crbug.com/1278681 [ win10 intel-0x5912 ] OverlayModeTraceTest_DirectComposition_Underlay [ Failure ] -crbug.com/1278681 [ win10 intel-0x5912 ] OverlayModeTraceTest_DirectComposition_Underlay_DXVA [ Failure ] -crbug.com/1278681 [ win10 intel-0x5912 ] OverlayModeTraceTest_DirectComposition_Underlay_Fullsize [ Failure ] crbug.com/1278681 [ win10 intel-0x5912 ] OverlayModeTraceTest_DirectComposition_Video_MP4 [ Failure ] crbug.com/1278681 [ win10 intel-0x5912 ] OverlayModeTraceTest_DirectComposition_Video_MP4_DXVA [ Failure ] crbug.com/1278681 [ win10 intel-0x5912 ] OverlayModeTraceTest_DirectComposition_Video_MP4_FourColors_Aspect_4x3 [ Failure ]
diff --git a/content/test/gpu/gpu_tests/trace_integration_test.py b/content/test/gpu/gpu_tests/trace_integration_test.py index 28afaac..672517de 100644 --- a/content/test/gpu/gpu_tests/trace_integration_test.py +++ b/content/test/gpu/gpu_tests/trace_integration_test.py
@@ -430,20 +430,28 @@ if expected.no_overlay: return + # TODO(crbug.com/1278681): Remove this history after no more flaky tests. + logging.info( + 'SwapChain Presentation Mode History %s', + TraceIntegrationTest._SwapChainPresentationModeListToStr( + presentation_mode_history)) + valid_entry_found = False - for index, mode in enumerate(presentation_mode_history): + for index, mode in enumerate(reversed(presentation_mode_history)): + # Be more tolerant for the beginning frames in non-overlay mode. + # Only check the last three entries. + if index >= 3: + break if mode in (_SWAP_CHAIN_PRESENTATION_MODE_NONE, _SWAP_CHAIN_GET_FRAME_STATISTICS_MEDIA_FAILED): # Be more tolerant to avoid test flakiness continue if (TraceIntegrationTest._SwapChainPresentationModeToStr(mode) != expected.presentation_mode): - if index >= len(presentation_mode_history) // 2: - # Be more tolerant for the first half frames in non-overlay mode. - self.fail('SwapChain presentation mode mismatch, expected %s got %s' % - (expected.presentation_mode, - TraceIntegrationTest._SwapChainPresentationModeListToStr( - presentation_mode_history))) + self.fail('SwapChain presentation mode mismatch, expected %s got %s' % + (expected.presentation_mode, + TraceIntegrationTest._SwapChainPresentationModeListToStr( + presentation_mode_history))) valid_entry_found = True if not valid_entry_found: self.fail(
diff --git a/device/bluetooth/bluetooth_adapter.h b/device/bluetooth/bluetooth_adapter.h index 5cce1a3..9bc215e 100644 --- a/device/bluetooth/bluetooth_adapter.h +++ b/device/bluetooth/bluetooth_adapter.h
@@ -734,9 +734,6 @@ // an identical scanning session, it should discard its newly invalidated // BluetoothLowEnergyScanSession and create a new one by calling // StartLowEnergyScanSession() again. - // - // Returns a nullptr if the BluetoothAdvertisementMonitoring chrome flag is - // not enabled. virtual std::unique_ptr<BluetoothLowEnergyScanSession> StartLowEnergyScanSession( std::unique_ptr<BluetoothLowEnergyScanFilter> filter,
diff --git a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc index 267c079..d246c483 100644 --- a/device/bluetooth/bluez/bluetooth_adapter_bluez.cc +++ b/device/bluetooth/bluez/bluetooth_adapter_bluez.cc
@@ -356,12 +356,10 @@ DCHECK(agent_.get()); #if BUILDFLAG(IS_CHROMEOS) - if (chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) { - advertisement_monitor_application_provider_ = - BluetoothAdvertisementMonitorApplicationServiceProvider::Create( - system_bus, - dbus::ObjectPath(kAdvertisementMonitorApplicationObjectPath)); - } + advertisement_monitor_application_provider_ = + BluetoothAdvertisementMonitorApplicationServiceProvider::Create( + system_bus, + dbus::ObjectPath(kAdvertisementMonitorApplicationObjectPath)); #endif // BUILDFLAG(IS_CHROMEOS) std::vector<dbus::ObjectPath> object_paths = bluez::BluezDBusManager::Get() @@ -1590,10 +1588,6 @@ BluetoothAdapterBlueZ::StartLowEnergyScanSession( std::unique_ptr<device::BluetoothLowEnergyScanFilter> filter, base::WeakPtr<device::BluetoothLowEnergyScanSession::Delegate> delegate) { - if (!chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) { - return nullptr; - } - DCHECK(filter); dbus::ObjectPath monitor_path = dbus::ObjectPath( @@ -1637,9 +1631,6 @@ BluetoothAdapter::LowEnergyScanSessionHardwareOffloadingStatus BluetoothAdapterBlueZ::GetLowEnergyScanSessionHardwareOffloadingStatus() { - if (!chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) - return LowEnergyScanSessionHardwareOffloadingStatus::kNotSupported; - if (!IsPresent()) return LowEnergyScanSessionHardwareOffloadingStatus::kUndetermined; @@ -2184,8 +2175,7 @@ void BluetoothAdapterBlueZ:: RegisterAdvertisementMonitorApplicationServiceProvider() { if (is_advertisement_monitor_application_provider_registered_ || - !IsPresent() || - !chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) { + !IsPresent()) { return; } BLUETOOTH_LOG(EVENT) << __func__;
diff --git a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc index 38f6c46..0802a14 100644 --- a/device/bluetooth/bluez/bluetooth_bluez_unittest.cc +++ b/device/bluetooth/bluez/bluetooth_bluez_unittest.cc
@@ -46,7 +46,6 @@ #if BUILDFLAG(IS_CHROMEOS) #include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" #include "base/time/time.h" #include "chromeos/constants/chromeos_features.h" #include "device/bluetooth/bluetooth_low_energy_scan_filter.h" @@ -262,14 +261,8 @@ class BluetoothBlueZTest : public testing::Test { public: -#if BUILDFLAG(IS_CHROMEOS) - BluetoothBlueZTest() { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/{chromeos::features:: - kBluetoothAdvertisementMonitoring}, - /*disabled_features=*/{}); - } -#endif // BUILDFLAG(IS_CHROMEOS_ASH) || BUILDFLAG(IS_CHROMEOS_LACROS + BluetoothBlueZTest() = default; + static const char kGapUuid[]; static const char kGattUuid[]; static const char kPnpUuid[]; @@ -507,9 +500,6 @@ if (base::RunLoop::IsRunningOnCurrentThread()) base::RunLoop::QuitCurrentWhenIdleDeprecated(); } -#if BUILDFLAG(IS_CHROMEOS) - base::test::ScopedFeatureList scoped_feature_list_; -#endif }; // This class was created to test BluetoothDeviceBluez::Connect() and
diff --git a/device/bluetooth/dbus/bluetooth_dbus_client_bundle.cc b/device/bluetooth/dbus/bluetooth_dbus_client_bundle.cc index 53005f5..3935c4562 100644 --- a/device/bluetooth/dbus/bluetooth_dbus_client_bundle.cc +++ b/device/bluetooth/dbus/bluetooth_dbus_client_bundle.cc
@@ -51,10 +51,8 @@ bluetooth_le_advertising_manager_client_.reset( BluetoothLEAdvertisingManagerClient::Create()); #if BUILDFLAG(IS_CHROMEOS) - if (chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) { - bluetooth_advertisement_monitor_manager_client_ = - BluetoothAdvertisementMonitorManagerClient::Create(); - } + bluetooth_advertisement_monitor_manager_client_ = + BluetoothAdvertisementMonitorManagerClient::Create(); #endif // BUILDFLAG(IS_CHROMEOS) bluetooth_agent_manager_client_.reset( BluetoothAgentManagerClient::Create()); @@ -86,10 +84,8 @@ bluetooth_le_advertising_manager_client_ = std::make_unique<FakeBluetoothLEAdvertisingManagerClient>(); #if BUILDFLAG(IS_CHROMEOS) - if (chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) { - bluetooth_advertisement_monitor_manager_client_ = - std::make_unique<FakeBluetoothAdvertisementMonitorManagerClient>(); - } + bluetooth_advertisement_monitor_manager_client_ = + std::make_unique<FakeBluetoothAdvertisementMonitorManagerClient>(); #endif // BUILDFLAG(IS_CHROMEOS) bluetooth_agent_manager_client_ = std::make_unique<FakeBluetoothAgentManagerClient>();
diff --git a/device/bluetooth/dbus/bluez_dbus_manager.cc b/device/bluetooth/dbus/bluez_dbus_manager.cc index 964b095..699bbb2 100644 --- a/device/bluetooth/dbus/bluez_dbus_manager.cc +++ b/device/bluetooth/dbus/bluez_dbus_manager.cc
@@ -255,10 +255,8 @@ client_bundle_->bluetooth_admin_policy_client()->Init(GetSystemBus(), bluetooth_service_name); #if BUILDFLAG(IS_CHROMEOS) - if (chromeos::features::IsBluetoothAdvertisementMonitoringEnabled()) { - client_bundle_->bluetooth_advertisement_monitor_manager_client()->Init( - GetSystemBus(), bluetooth_service_name); - } + client_bundle_->bluetooth_advertisement_monitor_manager_client()->Init( + GetSystemBus(), bluetooth_service_name); #endif // BUILDFLAG(IS_CHROMEOS) client_bundle_->bluetooth_agent_manager_client()->Init( GetSystemBus(), bluetooth_service_name);
diff --git a/infra/config/dev/subprojects/chromium/ci.star b/infra/config/dev/subprojects/chromium/ci.star index f47e654f..2122b4c8 100644 --- a/infra/config/dev/subprojects/chromium/ci.star +++ b/infra/config/dev/subprojects/chromium/ci.star
@@ -45,7 +45,7 @@ defaults.cpu.set(cpu.X86_64) defaults.executable.set("recipe:swarming/staging") defaults.execution_timeout.set(3 * time.hour) -defaults.os.set(os.LINUX_BIONIC_SWITCH_TO_DEFAULT) +defaults.os.set(os.LINUX_DEFAULT) defaults.service_account.set( "chromium-ci-builder-dev@chops-service-accounts.iam.gserviceaccount.com", )
diff --git a/infra/config/generated/builders/ci/android-weblayer-10-x86-rel-tests/properties.json b/infra/config/generated/builders/ci/android-weblayer-10-x86-rel-tests/properties.json index 404674b..c24952c 100644 --- a/infra/config/generated/builders/ci/android-weblayer-10-x86-rel-tests/properties.json +++ b/infra/config/generated/builders/ci/android-weblayer-10-x86-rel-tests/properties.json
@@ -1,4 +1,91 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-10-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-weblayer-10-x86-rel-tests", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-weblayer-10-x86-rel-tests", + "group": "tryserver.chromium.android" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-weblayer-marshmallow-x86-rel-tests/properties.json b/infra/config/generated/builders/ci/android-weblayer-marshmallow-x86-rel-tests/properties.json index 404674b..c2fab322 100644 --- a/infra/config/generated/builders/ci/android-weblayer-marshmallow-x86-rel-tests/properties.json +++ b/infra/config/generated/builders/ci/android-weblayer-marshmallow-x86-rel-tests/properties.json
@@ -1,4 +1,91 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "group": "tryserver.chromium.android" + } + ] + } + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json b/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json index 432cf6b..b5ec3f7 100644 --- a/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json +++ b/infra/config/generated/builders/ci/android-weblayer-with-aosp-webview-x86-rel/properties.json
@@ -1,4 +1,142 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-10-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "android-weblayer-10-x86-rel-tests", + "project": "chromium" + }, + { + "bucket": "ci", + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-weblayer-10-x86-rel-tests", + "group": "tryserver.chromium.android" + }, + { + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "group": "tryserver.chromium.android" + } + ] + } + }, "$build/goma": { "enable_ats": true, "jobs": 150,
diff --git a/infra/config/generated/builders/try/android-marshmallow-arm64-rel-compilator/properties.json b/infra/config/generated/builders/try/android-marshmallow-arm64-rel-compilator/properties.json index 08e81d1..1331650 100644 --- a/infra/config/generated/builders/try/android-marshmallow-arm64-rel-compilator/properties.json +++ b/infra/config/generated/builders/try/android-marshmallow-arm64-rel-compilator/properties.json
@@ -6,6 +6,9 @@ ], "use_java_coverage": true }, + "$build/flakiness": { + "check_for_flakiness": true + }, "$build/goma": { "enable_ats": true, "jobs": 300,
diff --git a/infra/config/generated/builders/try/android-marshmallow-arm64-rel/properties.json b/infra/config/generated/builders/try/android-marshmallow-arm64-rel/properties.json index 1bce44f..6814727 100644 --- a/infra/config/generated/builders/try/android-marshmallow-arm64-rel/properties.json +++ b/infra/config/generated/builders/try/android-marshmallow-arm64-rel/properties.json
@@ -10,6 +10,9 @@ ], "use_java_coverage": true }, + "$build/flakiness": { + "check_for_flakiness": true + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/builders/try/android-weblayer-10-x86-rel-tests/properties.json b/infra/config/generated/builders/try/android-weblayer-10-x86-rel-tests/properties.json index d90599c..d59dbf39 100644 --- a/infra/config/generated/builders/try/android-weblayer-10-x86-rel-tests/properties.json +++ b/infra/config/generated/builders/try/android-weblayer-10-x86-rel-tests/properties.json
@@ -1,4 +1,92 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-10-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "android-weblayer-10-x86-rel-tests", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/android-weblayer-marshmallow-x86-rel-tests/properties.json b/infra/config/generated/builders/try/android-weblayer-marshmallow-x86-rel-tests/properties.json index d90599c..e2db95c0 100644 --- a/infra/config/generated/builders/try/android-weblayer-marshmallow-x86-rel-tests/properties.json +++ b/infra/config/generated/builders/try/android-weblayer-marshmallow-x86-rel-tests/properties.json
@@ -1,4 +1,92 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + }, + "parent": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + } + }, + { + "builder_id": { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "x86_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 32, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-weblayer-with-aosp-webview-x86-rel", + "project": "chromium" + } + ], + "builder_ids_in_scope_for_testing": [ + { + "bucket": "ci", + "builder": "android-weblayer-marshmallow-x86-rel-tests", + "project": "chromium" + } + ] + } + }, "$build/goma": { "enable_ats": true, "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json b/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json index 1112f12..7a41191 100644 --- a/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json +++ b/infra/config/generated/builders/try/mac_optional_gpu_tests_rel/properties.json
@@ -1,4 +1,45 @@ { + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "try", + "builder": "mac_optional_gpu_tests_rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-gpu-fyi-archive", + "builder_group": "tryserver.chromium.mac", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "angle_internal" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "try", + "builder": "mac_optional_gpu_tests_rel", + "project": "chromium" + } + ] + } + }, "$build/goma": { "rpc_extra_params": "?prod", "server_host": "goma.chromium.org",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index bb5a2654..c35c761 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -8623,7 +8623,7 @@ dimensions: "builder:Libfuzzer Upload Linux UBSan" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -43727,7 +43727,7 @@ dimensions: "builder:Chromium Android ARM 32-bit Goma RBE Staging" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -43776,7 +43776,7 @@ dimensions: "builder:Chromium Android ARM 32-bit Goma RBE ToT" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -43825,7 +43825,7 @@ dimensions: "builder:Chromium Android ARM 32-bit Goma RBE ToT (ATS)" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -43874,7 +43874,7 @@ dimensions: "builder:Chromium Linux Goma RBE Staging" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -43923,7 +43923,7 @@ dimensions: "builder:Chromium Linux Goma RBE Staging (clobber)" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -43972,7 +43972,7 @@ dimensions: "builder:Chromium Linux Goma RBE Staging (dbg)" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -44021,7 +44021,7 @@ dimensions: "builder:Chromium Linux Goma RBE Staging (dbg) (clobber)" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -44070,7 +44070,7 @@ dimensions: "builder:Chromium Linux Goma RBE ToT" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -44119,7 +44119,7 @@ dimensions: "builder:Chromium Linux Goma RBE ToT (ATS)" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -45698,7 +45698,7 @@ dimensions: "builder:chromeos-amd64-generic-rel-goma-rbe-staging" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -45747,7 +45747,7 @@ dimensions: "builder:chromeos-amd64-generic-rel-goma-rbe-tot" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -46802,7 +46802,7 @@ dimensions: "builder:3pp-linux-amd64-packager" dimensions: "cores:8" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.try" exe { cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build" @@ -77785,7 +77785,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:WebRTC Chromium Android Builder" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" cipd_version: "latest" @@ -77832,7 +77832,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:WebRTC Chromium Android Tester" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" cipd_version: "latest" @@ -77879,7 +77879,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:WebRTC Chromium Linux Builder" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" cipd_version: "latest" @@ -77926,7 +77926,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:WebRTC Chromium Linux Tester" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" cipd_version: "latest" @@ -78176,7 +78176,7 @@ name: "WebRTC Chromium FYI Android Builder" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78223,7 +78223,7 @@ name: "WebRTC Chromium FYI Android Builder (dbg)" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78270,7 +78270,7 @@ name: "WebRTC Chromium FYI Android Builder ARM64 (dbg)" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78317,7 +78317,7 @@ name: "WebRTC Chromium FYI Android Tests (dbg) (M Nexus5X)" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78364,7 +78364,7 @@ name: "WebRTC Chromium FYI Android Tests (dbg) (N Nexus5X)" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78411,7 +78411,7 @@ name: "WebRTC Chromium FYI Linux Builder" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78458,7 +78458,7 @@ name: "WebRTC Chromium FYI Linux Builder (dbg)" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78505,7 +78505,7 @@ name: "WebRTC Chromium FYI Linux Tester" swarming_host: "chromium-swarm.appspot.com" dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-16.04|Ubuntu-18.04" + dimensions: "os:Ubuntu-18.04" dimensions: "pool:luci.chromium.webrtc.fyi" exe { cipd_package: "infra/chromium/bootstrapper/${platform}"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 3cf440a..317aba99 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -66,6 +66,11 @@ short_name: "rel" } builders { + name: "buildbucket/luci.chromium.ci/mac-official" + category: "chromium|mac" + short_name: "off" + } + builders { name: "buildbucket/luci.chromium.ci/mac-archive-tagged" category: "chromium|mac" short_name: "tag" @@ -2782,6 +2787,11 @@ short_name: "rel" } builders { + name: "buildbucket/luci.chromium.ci/mac-official" + category: "mac" + short_name: "off" + } + builders { name: "buildbucket/luci.chromium.ci/mac-archive-tagged" category: "mac" short_name: "tag" @@ -6853,11 +6863,6 @@ short_name: "cmp" } builders { - name: "buildbucket/luci.chromium.ci/mac-official" - category: "mac" - short_name: "off" - } - builders { name: "buildbucket/luci.chromium.ci/Mac Builder (reclient)" category: "mac" short_name: "re"
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index 2ce1882..a9f90da 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -66,33 +66,7 @@ LINUX_XENIAL = os_enum("Ubuntu-16.04", os_category.LINUX), LINUX_BIONIC = os_enum("Ubuntu-18.04", os_category.LINUX), LINUX_FOCAL = os_enum("Ubuntu-20.04", os_category.LINUX), - # xenial -> bionic migration - # * If a builder does not already explicitly set an os value, use - # LINUX_BIONIC_REMOVE or LINUX_XENIAL_OR_BIONIC_REMOVE - # * If a builder explicitly sets LINUX_DEFAULT, use - # LINUX_BIONIC_SWITCH_TO_DEFAULT or - # LINUX_XENIAL_OR_BIONIC_SWITCH_TO_DEFAULT - # - # When the migration is complete, LINUX_DEFAULT can be switched to - # Ubunutu-18.04, all instances of LINUX_BIONIC_REMOVE can be removed and all - # instances of LINUX_BIONIC_SWITCH_TO_DEFAULT can be replaced with - # LINUX_DEFAULT, the only changes to the generated files should be - # Ubuntu-16.04|Ubuntu-18.04 -> Ubuntu-18.04 - LINUX_DEFAULT = os_enum("Ubuntu-16.04", os_category.LINUX), - # 100% switch to bionic - LINUX_BIONIC_REMOVE = os_enum("Ubuntu-18.04", os_category.LINUX), - LINUX_BIONIC_SWITCH_TO_DEFAULT = os_enum("Ubuntu-18.04", os_category.LINUX), - # Staged switch to bionic: we can gradually shift the matching capacity - # towards bionic and the builder will continue to run on whatever is - # available - LINUX_XENIAL_OR_BIONIC_REMOVE = os_enum( - "Ubuntu-16.04|Ubuntu-18.04", - os_category.LINUX, - ), - LINUX_XENIAL_OR_BIONIC_SWITCH_TO_DEFAULT = os_enum( - "Ubuntu-16.04|Ubuntu-18.04", - os_category.LINUX, - ), + LINUX_DEFAULT = os_enum("Ubuntu-18.04", os_category.LINUX), MAC_10_12 = os_enum("Mac-10.12", os_category.MAC), MAC_10_13 = os_enum("Mac-10.13", os_category.MAC), MAC_10_14 = os_enum("Mac-10.14", os_category.MAC),
diff --git a/infra/config/lib/ci.star b/infra/config/lib/ci.star index 820476ba..557b741b 100644 --- a/infra/config/lib/ci.star +++ b/infra/config/lib/ci.star
@@ -210,7 +210,7 @@ groups. """ kwargs.setdefault("cores", 8) - kwargs.setdefault("os", os.LINUX_BIONIC_SWITCH_TO_DEFAULT) + kwargs.setdefault("os", os.LINUX_DEFAULT) return ci.builder(name = name, **kwargs) def _gpu_mac_builder(*, name, **kwargs): @@ -264,7 +264,7 @@ cores = defaults.get_value("thin_tester_cores", cores) kwargs.setdefault("goma_backend", None) kwargs.setdefault("reclient_instance", None) - kwargs.setdefault("os", builders.os.LINUX_BIONIC_SWITCH_TO_DEFAULT) + kwargs.setdefault("os", builders.os.LINUX_DEFAULT) return ci.builder( name = name, triggered_by = triggered_by,
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star index 70c8175..8fba65f 100644 --- a/infra/config/lib/try.star +++ b/infra/config/lib/try.star
@@ -257,7 +257,7 @@ * builderless: True on branches, False on main * cores: The orchestrator_cores module-level default. * executable: "recipe:chromium/orchestrator" - * os: os.LINUX_BIONIC_SWITCH_TO_DEFAULT + * os: os.LINUX_DEFAULT * service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com" * ssd: None """ @@ -270,7 +270,7 @@ kwargs.setdefault("executable", "recipe:chromium/orchestrator") kwargs.setdefault("goma_backend", None) - kwargs.setdefault("os", os.LINUX_BIONIC_SWITCH_TO_DEFAULT) + kwargs.setdefault("os", os.LINUX_DEFAULT) kwargs.setdefault("service_account", "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com") kwargs.setdefault("ssd", None)
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star index e3b871f..3a60e800 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -13,7 +13,7 @@ cores = 8, executable = ci.DEFAULT_EXECUTABLE, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = ci.DEFAULT_SERVICE_ACCOUNT, reclient_jobs = rbe_jobs.DEFAULT,
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index 2b01784c..e7dc55a 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -15,7 +15,7 @@ cores = 8, executable = ci.DEFAULT_EXECUTABLE, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, reclient_instance = rbe_instance.DEFAULT, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, @@ -922,6 +922,28 @@ ci.thin_tester( name = "android-weblayer-10-x86-rel-tests", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config( + config = "x86_builder", + ), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "tester|weblayer", short_name = "10", @@ -932,6 +954,28 @@ ci.thin_tester( name = "android-weblayer-marshmallow-x86-rel-tests", + builder_spec = builder_config.builder_spec( + execution_mode = builder_config.execution_mode.TEST, + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config( + config = "x86_builder", + ), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "tester|weblayer", short_name = "M", @@ -1006,6 +1050,28 @@ ci.builder( name = "android-weblayer-with-aosp-webview-x86-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + "enable_reclient", + ], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 32, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config( + config = "x86_builder", + ), + build_gs_bucket = "chromium-android-archive", + ), console_view_entry = consoles.console_view_entry( category = "builder|weblayer_with_aosp_webview", short_name = "x86",
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star index b550940a..f884ece 100644 --- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -16,7 +16,7 @@ executable = ci.DEFAULT_EXECUTABLE, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM, @@ -337,7 +337,6 @@ category = "simple|release|x64", short_name = "rel", ), - os = os.LINUX_BIONIC_REMOVE, cq_mirrors_console_view = "mirrors", main_console_view = "main", goma_backend = None, @@ -414,7 +413,6 @@ category = "simple|release", short_name = "arm", ), - os = os.LINUX_BIONIC_REMOVE, cq_mirrors_console_view = "mirrors", main_console_view = "main", goma_backend = None, @@ -444,7 +442,6 @@ category = "simple|release", short_name = "a64", ), - os = os.LINUX_BIONIC_REMOVE, main_console_view = "main", ) @@ -591,7 +588,6 @@ ), cq_mirrors_console_view = "mirrors", main_console_view = "main", - os = os.LINUX_BIONIC_REMOVE, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -678,7 +674,6 @@ ), cq_mirrors_console_view = "mirrors", main_console_view = "main", - os = os.LINUX_BIONIC_REMOVE, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -693,7 +688,6 @@ ), cq_mirrors_console_view = "mirrors", main_console_view = "main", - os = os.LINUX_BIONIC_REMOVE, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -739,7 +733,6 @@ ), cq_mirrors_console_view = "mirrors", main_console_view = "main", - os = os.LINUX_BIONIC_REMOVE, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT,
diff --git a/infra/config/subprojects/chromium/ci/chromium.clang.star b/infra/config/subprojects/chromium/ci/chromium.clang.star index 8a5efbe..9ebfc83 100644 --- a/infra/config/subprojects/chromium/ci/chromium.clang.star +++ b/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -17,7 +17,7 @@ # Naturally the runtime will be ~4-8h on average, depending on config. # CFI builds will take even longer - around 11h. execution_timeout = 14 * time.hour, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, properties = { "perf_dashboard_machine_group": "ChromiumClang",
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star index 3c86248..64fd8e31 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuchsia.fyi.star
@@ -16,7 +16,7 @@ execution_timeout = 10 * time.hour, goma_backend = goma.backend.RBE_PROD, notifies = ["cr-fuchsia"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = ci.DEFAULT_SERVICE_ACCOUNT, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star index af52c3a6..1848801 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -16,7 +16,7 @@ execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, notifies = ["chromesec-lkgr-failures"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = ci.DEFAULT_SERVICE_ACCOUNT, ) @@ -424,7 +424,6 @@ triggering_policy = scheduler.greedy_batching( max_concurrent_invocations = 5, ), - os = os.LINUX_XENIAL_OR_BIONIC_REMOVE, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT,
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index a6dd69c..5763e2b 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -88,7 +88,7 @@ category = "viz", ), goma_backend = None, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, ) @@ -100,7 +100,7 @@ ), notifies = ["Site Isolation Android"], goma_backend = None, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, ) @@ -112,7 +112,7 @@ category = "linux", ), cq_mirrors_console_view = "mirrors", - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -126,7 +126,7 @@ short_name = "32rel", ), notifies = ["chrome-memory-safety"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -140,7 +140,7 @@ short_name = "64rel", ), notifies = ["chrome-memory-safety"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -179,7 +179,7 @@ ), ], notifies = ["cr-fuchsia-engprod"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -197,7 +197,7 @@ ), ], notifies = ["cr-fuchsia"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -215,7 +215,7 @@ ), ], notifies = ["cr-fuchsia"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -247,7 +247,7 @@ ), ], notifies = ["cr-fuchsia"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -265,7 +265,7 @@ ), ], notifies = ["cr-fuchsia"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -274,7 +274,7 @@ category = "lacros", short_name = "lcr", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -286,7 +286,7 @@ category = "lacros", short_name = "lsf", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -296,7 +296,7 @@ short_name = "lnx", ), notifies = ["annotator-rel"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -311,7 +311,7 @@ short_name = "rel", ), execution_timeout = 3 * time.hour, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -323,7 +323,7 @@ category = "default", short_name = "lcr", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -363,7 +363,7 @@ console_view_entry = consoles.console_view_entry( category = "default", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -375,7 +375,7 @@ category = "linux|blink", short_name = "TD", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -385,7 +385,7 @@ short_name = "VF", ), notifies = ["linux-blink-fyi-bots"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -398,7 +398,7 @@ short_name = "SB", ), notifies = ["v8-sandbox-fyi-bots"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -420,7 +420,7 @@ console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, schedule = "with 12h interval", triggered_by = [], goma_backend = None, @@ -433,7 +433,7 @@ console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -485,7 +485,7 @@ console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -504,7 +504,7 @@ console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -526,7 +526,7 @@ short_name = "64rel", ), notifies = ["chrome-memory-safety"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -537,7 +537,7 @@ console_view_entry = consoles.console_view_entry( category = "linux", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -549,7 +549,7 @@ category = "linux", ), experimental = True, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -561,7 +561,7 @@ category = "linux", ), experimental = True, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -573,7 +573,7 @@ category = "linux", ), experimental = True, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -618,7 +618,7 @@ short_name = "hdls", ), notifies = ["headless-owners"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -701,7 +701,7 @@ category = "perfetto", short_name = "lnx", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -747,7 +747,7 @@ reclient_cache_silo = "Comparison Android - cache siloed", reclient_instance = rbe_instance.DEFAULT, reclient_jobs = 250, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -762,7 +762,7 @@ reclient_cache_silo = "Comparison Linux - cache siloed", reclient_instance = rbe_instance.DEFAULT, reclient_jobs = 250, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -811,7 +811,7 @@ reclient_cache_silo = "Comparison Simple Chrome - cache siloed", reclient_instance = rbe_instance.DEFAULT, reclient_jobs = 250, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -826,7 +826,7 @@ }, reclient_instance = rbe_instance.DEFAULT, reclient_jobs = 500, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, schedule = "triggered", ) @@ -841,7 +841,7 @@ # TODO(thakis): Remove once https://crbug.com/927738 is resolved. execution_timeout = 5 * time.hour, goma_backend = None, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, reclient_jobs = 400, reclient_instance = rbe_instance.DEFAULT, ) @@ -953,7 +953,7 @@ category = "cros x64", short_name = "cgc", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -963,7 +963,7 @@ ), goma_backend = None, reclient_instance = rbe_instance.DEFAULT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, reclient_rewrapper_env = {"RBE_cache_silo": "chromeos-amd64-generic-rel (reclient)"}, ) @@ -976,7 +976,7 @@ ), goma_backend = None, reclient_instance = rbe_instance.DEFAULT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, reclient_rewrapper_env = {"RBE_compare": "true"}, reclient_ensure_verified = True, description_html = "verify artifacts. should be removed after the migration. crbug.com/1235218", @@ -988,7 +988,7 @@ category = "lacros x64", short_name = "cgc", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -998,7 +998,7 @@ ), goma_backend = None, reclient_instance = rbe_instance.DEFAULT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, reclient_rewrapper_env = {"RBE_cache_silo": "lacros-amd64-generic-rel (reclient)"}, ) @@ -1008,7 +1008,7 @@ category = "lacros rel", short_name = "cgc", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) ci.builder( @@ -1018,7 +1018,7 @@ ), goma_backend = None, reclient_instance = rbe_instance.DEFAULT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, reclient_rewrapper_env = {"RBE_cache_silo": "linux-lacros-builder-rel (reclient)"}, ) @@ -1048,7 +1048,7 @@ category = "code_coverage", short_name = "and", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, coverage_test_types = ["overall", "unit"], schedule = "triggered", triggered_by = [], @@ -1064,7 +1064,7 @@ category = "code_coverage", short_name = "ann", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, use_clang_coverage = True, coverage_test_types = ["overall", "unit"], goma_backend = None, @@ -1086,7 +1086,7 @@ short_name = "cov", ), ], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, coverage_test_types = ["overall", "unit"], use_clang_coverage = True, schedule = "triggered", @@ -1113,7 +1113,7 @@ category = "code_coverage", short_name = "lcr", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, use_clang_coverage = True, coverage_test_types = ["overall", "unit"], schedule = "triggered", @@ -1129,7 +1129,7 @@ category = "code_coverage", short_name = "jcr", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, use_javascript_coverage = True, schedule = "triggered", triggered_by = [], @@ -1144,7 +1144,7 @@ category = "code_coverage", short_name = "lnx", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, use_clang_coverage = True, coverage_test_types = ["overall", "unit"], export_coverage_to_zoss = True, @@ -1157,7 +1157,7 @@ category = "code_coverage", short_name = "lac", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, use_clang_coverage = True, coverage_test_types = ["overall", "unit"], goma_backend = None,
diff --git a/infra/config/subprojects/chromium/ci/chromium.linux.star b/infra/config/subprojects/chromium/ci/chromium.linux.star index afb1904c..92d2ee9 100644 --- a/infra/config/subprojects/chromium/ci/chromium.linux.star +++ b/infra/config/subprojects/chromium/ci/chromium.linux.star
@@ -17,7 +17,7 @@ execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, main_console_view = "main", notifies = ["chromium.linux"], - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT,
diff --git a/infra/config/subprojects/chromium/ci/chromium.memory.star b/infra/config/subprojects/chromium/ci/chromium.memory.star index 2f957ba..f03349fc 100644 --- a/infra/config/subprojects/chromium/ci/chromium.memory.star +++ b/infra/config/subprojects/chromium/ci/chromium.memory.star
@@ -15,7 +15,7 @@ cores = 8, executable = ci.DEFAULT_EXECUTABLE, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, main_console_view = "main", pool = ci.DEFAULT_POOL, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, @@ -215,7 +215,6 @@ category = "linux|webkit", short_name = "asn", ), - os = os.LINUX_BIONIC_REMOVE, ) ci.builder( @@ -224,7 +223,6 @@ category = "linux|webkit", short_name = "lk", ), - os = os.LINUX_BIONIC_REMOVE, ) ci.builder( @@ -233,7 +231,6 @@ category = "linux|webkit", short_name = "msn", ), - os = os.LINUX_BIONIC_REMOVE, ) ci.builder( @@ -242,7 +239,7 @@ category = "android", short_name = "asn", ), - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, sheriff_rotations = args.ignore_default(None), tree_closing = False, ) @@ -273,7 +270,6 @@ builderless = 1, cores = 32, tree_closing = False, - os = os.LINUX_BIONIC_REMOVE, reclient_jobs = rbe_jobs.DEFAULT, )
diff --git a/infra/config/subprojects/chromium/ci/chromium.packager.star b/infra/config/subprojects/chromium/ci/chromium.packager.star index 96cdbda..414c230 100644 --- a/infra/config/subprojects/chromium/ci/chromium.packager.star +++ b/infra/config/subprojects/chromium/ci/chromium.packager.star
@@ -11,7 +11,7 @@ builder_group = "chromium.packager", cores = 8, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = "chromium-cipd-builder@chops-service-accounts.iam.gserviceaccount.com", ) @@ -112,7 +112,6 @@ "tools/android/avd/proto/creation/generic_playstore_android32_foldable.textpb", ], }, - os = os.LINUX_BIONIC_REMOVE, # Triggered manually through the scheduler UI # https://luci-scheduler.appspot.com/jobs/chromium/android-avd-packager schedule = "triggered",
diff --git a/infra/config/subprojects/chromium/ci/chromium.rust.star b/infra/config/subprojects/chromium/ci/chromium.rust.star index 365f60e9..7a9e75d3 100644 --- a/infra/config/subprojects/chromium/ci/chromium.rust.star +++ b/infra/config/subprojects/chromium/ci/chromium.rust.star
@@ -17,7 +17,7 @@ reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, service_account = ci.DEFAULT_SERVICE_ACCOUNT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, notifies = ["chrome-rust-experiments"], )
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star index c3cca80..076f32ab 100644 --- a/infra/config/subprojects/chromium/ci/chromium.star +++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -16,6 +16,7 @@ execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, main_console_view = "main", + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = ci.DEFAULT_SERVICE_ACCOUNT, sheriff_rotations = sheriff_rotations.CHROMIUM, @@ -69,7 +70,6 @@ ), cores = 8, execution_timeout = 4 * time.hour, - os = os.LINUX_BIONIC_REMOVE, tree_closing = True, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, @@ -105,7 +105,6 @@ short_name = "rel", ), cores = 32, - os = os.LINUX_BIONIC_REMOVE, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -135,7 +134,6 @@ # See https://crbug.com/1153349#c22, as we update symbol_level=2, build # needs longer time to complete. execution_timeout = 7 * time.hour, - os = os.LINUX_BIONIC_REMOVE, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, reclient_instance = rbe_instance.DEFAULT, @@ -162,7 +160,6 @@ # TODO: Change this back down to something reasonable once these builders # have populated their cached by getting through the compile step execution_timeout = 10 * time.hour, - os = os.LINUX_BIONIC_REMOVE, sheriff_rotations = args.ignore_default(None), ) @@ -196,7 +193,6 @@ ), ), cores = 32, - os = os.LINUX_BIONIC_REMOVE, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -238,7 +234,6 @@ ), # Bump to 32 if needed. cores = 8, - os = os.LINUX_BIONIC_REMOVE, tree_closing = True, goma_backend = None, reclient_jobs = rbe_jobs.HIGH_JOBS_FOR_CI, @@ -270,7 +265,6 @@ ), cores = 32, notifies = ["linux-archive-rel"], - os = os.LINUX_BIONIC_REMOVE, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -297,7 +291,6 @@ ), cores = 32, execution_timeout = 7 * time.hour, - os = os.LINUX_BIONIC_REMOVE, properties = { # The format of these properties is defined at archive/properties.proto "$build/archive": { @@ -361,7 +354,6 @@ ), cores = 32, execution_timeout = 7 * time.hour, - os = os.LINUX_BIONIC_REMOVE, goma_backend = None, reclient_jobs = rbe_jobs.DEFAULT, reclient_instance = rbe_instance.DEFAULT, @@ -502,12 +494,9 @@ ci.builder( name = "mac-official", + branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, builderless = False, - # TODO(crbug.com/1072012) Use the default console view and use the default - # main console view once the build is green - main_console_view = None, console_view_entry = consoles.console_view_entry( - console_view = "chromium.fyi", category = "mac", short_name = "off", ),
diff --git a/infra/config/subprojects/chromium/ci/chromium.updater.star b/infra/config/subprojects/chromium/ci/chromium.updater.star index 29ef64b..649b46275 100644 --- a/infra/config/subprojects/chromium/ci/chromium.updater.star +++ b/infra/config/subprojects/chromium/ci/chromium.updater.star
@@ -14,7 +14,7 @@ executable = ci.DEFAULT_EXECUTABLE, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = ci.DEFAULT_SERVICE_ACCOUNT, )
diff --git a/infra/config/subprojects/chromium/ci/metadata.exporter.star b/infra/config/subprojects/chromium/ci/metadata.exporter.star index 647195d..6503a8f3 100644 --- a/infra/config/subprojects/chromium/ci/metadata.exporter.star +++ b/infra/config/subprojects/chromium/ci/metadata.exporter.star
@@ -10,7 +10,7 @@ ci.defaults.set( cores = 8, execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, )
diff --git a/infra/config/subprojects/chromium/gpu.try.star b/infra/config/subprojects/chromium/gpu.try.star index eb7415b6..6579883 100644 --- a/infra/config/subprojects/chromium/gpu.try.star +++ b/infra/config/subprojects/chromium/gpu.try.star
@@ -47,7 +47,6 @@ builder_group = "tryserver.chromium.android", builderless = True, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_REMOVE, ssd = None, **kwargs ) @@ -93,7 +92,6 @@ builder_group = "tryserver.chromium.chromiumos", builderless = True, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_REMOVE, ssd = None, **kwargs ) @@ -130,7 +128,6 @@ builder_group = "tryserver.chromium.linux", builderless = True, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_REMOVE, ssd = None, **kwargs )
diff --git a/infra/config/subprojects/chromium/swangle.try.star b/infra/config/subprojects/chromium/swangle.try.star index 088653d6..e1efb99 100644 --- a/infra/config/subprojects/chromium/swangle.try.star +++ b/infra/config/subprojects/chromium/swangle.try.star
@@ -38,7 +38,7 @@ def swangle_linux_builder(*, name, **kwargs): kwargs.setdefault("cores", 8) - kwargs.setdefault("os", os.LINUX_BIONIC_SWITCH_TO_DEFAULT) + kwargs.setdefault("os", os.LINUX_DEFAULT) return try_.builder(name = name, **kwargs) def swangle_mac_builder(*, name, **kwargs):
diff --git a/infra/config/subprojects/chromium/try/presubmit.star b/infra/config/subprojects/chromium/try/presubmit.star index 5fe3eb4..d8cd2ec 100644 --- a/infra/config/subprojects/chromium/try/presubmit.star +++ b/infra/config/subprojects/chromium/try/presubmit.star
@@ -15,7 +15,7 @@ execution_timeout = 15 * time.minute, list_view = "presubmit", main_list_view = "try", - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, # Default priority for buildbucket is 30, see # https://chromium.googlesource.com/infra/infra/+/bb68e62b4380ede486f65cd32d9ff3f1bbe288e4/appengine/cr-buildbucket/creation.py#42
diff --git a/infra/config/subprojects/chromium/try/tryserver.blink.star b/infra/config/subprojects/chromium/try/tryserver.blink.star index f16e317e..67a97fee 100644 --- a/infra/config/subprojects/chromium/try/tryserver.blink.star +++ b/infra/config/subprojects/chromium/try/tryserver.blink.star
@@ -37,7 +37,7 @@ try_.builder( name = "linux-blink-optional-highdpi-rel", goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) try_.builder( @@ -61,7 +61,7 @@ ), goma_backend = goma.backend.RBE_PROD, main_list_view = "try", - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, tryjob = try_.job( location_regexp = [ ".+/[+]/cc/.+",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index dc927fb..e4f0cd1d 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -19,7 +19,7 @@ execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, compilator_goma_jobs = goma.jobs.J300, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, ) @@ -201,9 +201,7 @@ try_.orchestrator_builder( name = "android-marshmallow-arm64-rel", - # TODO(crbug.com/1313712): Re-enable check_for_flakiness when ResultDB RPCs - # no longer timeout. - #check_for_flakiness = True, + check_for_flakiness = True, compilator = "android-marshmallow-arm64-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", @@ -215,9 +213,7 @@ try_.compilator_builder( name = "android-marshmallow-arm64-rel-compilator", branch_selector = branches.STANDARD_MILESTONE, - # TODO(crbug.com/1313712): Re-enable check_for_flakiness when ResultDB RPCs - # no longer timeout. - #check_for_flakiness = True, + check_for_flakiness = True, cores = 64 if settings.is_main else 32, main_list_view = "try", ) @@ -359,10 +355,18 @@ try_.builder( name = "android-weblayer-10-x86-rel-tests", + mirrors = [ + "ci/android-weblayer-with-aosp-webview-x86-rel", + "ci/android-weblayer-10-x86-rel-tests", + ], ) try_.builder( name = "android-weblayer-marshmallow-x86-rel-tests", + mirrors = [ + "ci/android-weblayer-with-aosp-webview-x86-rel", + "ci/android-weblayer-marshmallow-x86-rel-tests", + ], ) try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star index 9783efcc..eca6a678 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.angle.star
@@ -15,6 +15,7 @@ execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, goma_jobs = goma.jobs.J150, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.gpu.SERVICE_ACCOUNT, ) @@ -25,46 +26,38 @@ try_.builder( name = "android-angle-chromium-try", - os = os.LINUX_BIONIC_REMOVE, executable = "recipe:angle_chromium_trybot", ) try_.builder( name = "android-angle-try", - os = os.LINUX_BIONIC_REMOVE, executable = "recipe:angle_chromium_trybot", ) try_.builder( name = "android_angle_rel_ng", - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( name = "fuchsia-angle-rel", - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( name = "fuchsia-angle-try", - os = os.LINUX_BIONIC_REMOVE, executable = "recipe:angle_chromium_trybot", ) try_.builder( name = "linux-angle-rel", - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( name = "linux-angle-chromium-try", - os = os.LINUX_BIONIC_REMOVE, executable = "recipe:angle_chromium_trybot", ) try_.builder( name = "linux-angle-try", - os = os.LINUX_BIONIC_REMOVE, executable = "recipe:angle_chromium_trybot", )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index 83e8e804..3a9ef0d 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -18,7 +18,7 @@ executable = try_.DEFAULT_EXECUTABLE, execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, ) @@ -73,7 +73,6 @@ mirrors = ["ci/chromeos-arm-generic-rel"], builderless = not settings.is_main, main_list_view = "try", - os = os.LINUX_BIONIC_REMOVE, tryjob = try_.job(), ) @@ -81,7 +80,6 @@ name = "chromeos-arm64-generic-rel", branch_selector = branches.CROS_LTS_MILESTONE, mirrors = ["ci/chromeos-arm64-generic-rel"], - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( @@ -90,13 +88,11 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( name = "chromeos-amd64-generic-lacros-dbg", branch_selector = branches.STANDARD_MILESTONE, - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( @@ -108,7 +104,6 @@ builderless = not settings.is_main, main_list_view = "try", tryjob = try_.job(), - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( @@ -116,7 +111,6 @@ branch_selector = branches.STANDARD_MILESTONE, builderless = not settings.is_main, main_list_view = "try", - os = os.LINUX_BIONIC_REMOVE, tryjob = try_.job(), ) @@ -195,7 +189,6 @@ goma_jobs = goma.jobs.J300, main_list_view = "try", tryjob = try_.job(), - os = os.LINUX_BIONIC_REMOVE, ) try_.builder( @@ -206,7 +199,6 @@ main_list_view = "try", use_clang_coverage = True, coverage_test_types = ["unit", "overall"], - os = os.LINUX_BIONIC_REMOVE, tryjob = try_.job( experiment_percentage = 3, ),
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star index 2949ce6..168f5d68 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.dawn.star
@@ -14,6 +14,7 @@ executable = try_.DEFAULT_EXECUTABLE, execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.gpu.SERVICE_ACCOUNT, ) @@ -27,7 +28,6 @@ name = "dawn-linux-x64-deps-rel", branch_selector = branches.STANDARD_MILESTONE, main_list_view = "try", - os = os.LINUX_BIONIC_REMOVE, tryjob = try_.job( location_regexp = [ ".+/[+]/content/test/gpu/.+", @@ -125,7 +125,6 @@ try_.builder( name = "linux-dawn-rel", - os = os.LINUX_BIONIC_REMOVE, test_presentation = resultdb.test_presentation( grouping_keys = ["status", "v.test_suite", "v.gpu"], ),
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star index 63c8d70..6187e10 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
@@ -16,7 +16,7 @@ execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, compilator_goma_jobs = goma.jobs.J150, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star index 11c5176..67f423d 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -19,7 +19,7 @@ execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, compilator_goma_jobs = goma.jobs.J150, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star index 88d63c7..ff4d6aa 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -386,6 +386,23 @@ try_.gpu.optional_tests_builder( name = "mac_optional_gpu_tests_rel", branch_selector = branches.DESKTOP_EXTENDED_STABLE_MILESTONE, + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "angle_internal", + ], + ), + chromium_config = builder_config.chromium_config( + config = "chromium", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + ), + build_gs_bucket = "chromium-gpu-fyi-archive", + ), main_list_view = "try", ssd = None, tryjob = try_.job(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star b/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star index a7cd025..d8bce49 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.packager.star
@@ -23,7 +23,7 @@ name = "3pp-linux-amd64-packager", builderless = False, cores = 8, - os = os.LINUX_XENIAL_OR_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, properties = { "$build/chromium_3pp": { "platform": "linux-amd64",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star b/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star index 47ca6d3..e2a7857 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.rust.star
@@ -14,7 +14,7 @@ executable = try_.DEFAULT_EXECUTABLE, execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.star b/infra/config/subprojects/chromium/try/tryserver.chromium.star index b09215e..3702ff9 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.star
@@ -15,7 +15,7 @@ executable = try_.DEFAULT_EXECUTABLE, execution_timeout = try_.DEFAULT_EXECUTION_TIMEOUT, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = try_.DEFAULT_POOL, service_account = try_.DEFAULT_SERVICE_ACCOUNT, )
diff --git a/infra/config/subprojects/codesearch/codesearch.star b/infra/config/subprojects/codesearch/codesearch.star index 5e25620..a051259 100644 --- a/infra/config/subprojects/codesearch/codesearch.star +++ b/infra/config/subprojects/codesearch/codesearch.star
@@ -35,7 +35,7 @@ try_.defaults.execution_timeout.set(9 * time.hour) try_.defaults.expiration_timeout.set(2 * time.hour) try_.defaults.goma_backend.set(goma.backend.RBE_PROD) -try_.defaults.os.set(os.LINUX_BIONIC_SWITCH_TO_DEFAULT) +try_.defaults.os.set(os.LINUX_DEFAULT) try_.defaults.pool.set("luci.chromium.try") try_.defaults.service_account.set("chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com")
diff --git a/infra/config/subprojects/flakiness/flakiness.star b/infra/config/subprojects/flakiness/flakiness.star index 2e476c1..ee158bc9 100644 --- a/infra/config/subprojects/flakiness/flakiness.star +++ b/infra/config/subprojects/flakiness/flakiness.star
@@ -10,7 +10,7 @@ bucket = "flakiness", build_numbers = True, execution_timeout = 3 * time.hour, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, pool = "luci.chromium.ci", # TODO(jeffyoon): replace with smaller scoped service account, and update # below for bucket ACL
diff --git a/infra/config/subprojects/goma/goma.star b/infra/config/subprojects/goma/goma.star index 03b0aae..dd6822c 100644 --- a/infra/config/subprojects/goma/goma.star +++ b/infra/config/subprojects/goma/goma.star
@@ -51,7 +51,7 @@ *, name, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, **kwargs): return builder( name = name, @@ -271,7 +271,7 @@ *, name, goma_backend = goma.backend.RBE_PROD, - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, **kwargs): return builder( name = name, @@ -463,7 +463,7 @@ *, name, builderless = False, - os = os.LINUX_XENIAL_OR_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, **kwargs): return builder( name = name,
diff --git a/infra/config/subprojects/reclient/reclient.star b/infra/config/subprojects/reclient/reclient.star index a8a67b2..ad898d6 100644 --- a/infra/config/subprojects/reclient/reclient.star +++ b/infra/config/subprojects/reclient/reclient.star
@@ -94,7 +94,7 @@ ), ), console_view_category = "linux", - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) fyi_reclient_test_builder( @@ -113,7 +113,7 @@ ), ), console_view_category = "linux", - os = os.LINUX_BIONIC_SWITCH_TO_DEFAULT, + os = os.LINUX_DEFAULT, ) fyi_reclient_staging_builder( @@ -165,7 +165,7 @@ fyi_reclient_staging_builder( name = "Simple Chrome Builder reclient staging", console_view_category = "linux", - os = os.LINUX_BIONIC_REMOVE, + os = os.LINUX_DEFAULT, builder_spec = builder_config.builder_spec( chromium_config = builder_config.chromium_config( config = "chromium", @@ -186,7 +186,7 @@ fyi_reclient_test_builder( name = "Simple Chrome Builder reclient test", console_view_category = "linux", - os = os.LINUX_BIONIC_REMOVE, + os = os.LINUX_DEFAULT, builder_spec = builder_config.builder_spec( chromium_config = builder_config.chromium_config( config = "chromium",
diff --git a/infra/config/subprojects/webrtc/webrtc.fyi.star b/infra/config/subprojects/webrtc/webrtc.fyi.star index d988405..2212402 100644 --- a/infra/config/subprojects/webrtc/webrtc.fyi.star +++ b/infra/config/subprojects/webrtc/webrtc.fyi.star
@@ -40,7 +40,7 @@ defaults.cpu.set(cpu.X86_64) defaults.executable.set("recipe:chromium") defaults.execution_timeout.set(2 * time.hour) -defaults.os.set(os.LINUX_XENIAL_OR_BIONIC_REMOVE) +defaults.os.set(os.LINUX_DEFAULT) defaults.pool.set("luci.chromium.webrtc.fyi") defaults.service_account.set("chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com") defaults.triggered_by.set(["webrtc-gitiles-trigger"])
diff --git a/infra/config/subprojects/webrtc/webrtc.star b/infra/config/subprojects/webrtc/webrtc.star index 3fe908f..df1352f 100644 --- a/infra/config/subprojects/webrtc/webrtc.star +++ b/infra/config/subprojects/webrtc/webrtc.star
@@ -33,7 +33,7 @@ defaults.cpu.set(cpu.X86_64) defaults.executable.set("recipe:chromium") defaults.execution_timeout.set(2 * time.hour) -defaults.os.set(os.LINUX_XENIAL_OR_BIONIC_REMOVE) +defaults.os.set(os.LINUX_DEFAULT) defaults.service_account.set("chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com") defaults.triggered_by.set(["chromium-gitiles-trigger"])
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 98debbc..3c63647 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -3091,6 +3091,9 @@ <message name="IDS_IOS_TOOLS_MENU_BOOKMARKS" desc="The iOS menu item for opening the bookmarks manager [Length: 15em] [iOS only]"> Bookmarks </message> + <message name="IDS_IOS_TOOLS_MENU_CLEAR_BROWSING_DATA" desc="The iOS menu item to open the Clear Browsing Data screen [iOS only]" meaning="[Length: unlimited]"> + Clear Browsing Data + </message> <message name="IDS_IOS_TOOLS_MENU_CLOSE_ALL_INCOGNITO_TABS" desc="The iOS menu item for closing all Incognito tabs [iOS only]" meaning="[Length: unlimited]"> Close All Incognito Tabs </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TOOLS_MENU_CLEAR_BROWSING_DATA.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TOOLS_MENU_CLEAR_BROWSING_DATA.png.sha1 new file mode 100644 index 0000000..3f9dbd1 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_TOOLS_MENU_CLEAR_BROWSING_DATA.png.sha1
@@ -0,0 +1 @@ +68766cad3eb611765cc8ba3dbbe837521d6bed9b \ No newline at end of file
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 4e5da77..e3785ea 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -670,6 +670,10 @@ flag_descriptions::kNewOverflowMenuSettingsActionName, flag_descriptions::kNewOverflowMenuSettingsActionName, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kNewOverflowMenuSettingsAction)}, + {"new-overflow-menu-cbd-action", + flag_descriptions::kNewOverflowMenuCBDActionName, + flag_descriptions::kNewOverflowMenuCBDActionDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(kNewOverflowMenuCBDAction)}, {"enable-new-download-api", flag_descriptions::kEnableNewDownloadAPIName, flag_descriptions::kEnableNewDownloadAPIDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(web::features::kEnableNewDownloadAPI)},
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 0c4a54acd..0b03b47 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -380,6 +380,11 @@ const char kNewMobileIdentityConsistencyFREDescription[] = "New Mobile Identity Consistency FRE"; +const char kNewOverflowMenuCBDActionName[] = + "Clear Browsing Data action in new overflow menu"; +const char kNewOverflowMenuCBDActionDescription[] = + "Adds a Clear Browsing Data action to the new overflow menu"; + const char kNewOverflowMenuName[] = "New Overflow Menu"; const char kNewOverflowMenuDescription[] = "Enables the new overflow menu";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 91ab8cc9..f6e7ffb 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -348,6 +348,11 @@ extern const char kNewMobileIdentityConsistencyFREName[]; extern const char kNewMobileIdentityConsistencyFREDescription[]; +// Title and description for the flag to add a Clear Browsing Data action to +// the new overflow menu. +extern const char kNewOverflowMenuCBDActionName[]; +extern const char kNewOverflowMenuCBDActionDescription[]; + // Title and description for the flag to enable the new overflow menu. extern const char kNewOverflowMenuName[]; extern const char kNewOverflowMenuDescription[];
diff --git a/ios/chrome/browser/ui/activity_services/activities/print_activity.h b/ios/chrome/browser/ui/activity_services/activities/print_activity.h index d1bdde0a..f5421eefe2 100644 --- a/ios/chrome/browser/ui/activity_services/activities/print_activity.h +++ b/ios/chrome/browser/ui/activity_services/activities/print_activity.h
@@ -16,12 +16,14 @@ // Initializes the print activity with the given tab |data| and the |handler|. // Print preview will be presented on top of |baseViewController|. +// TODO(crbug.com/906662): Use id<BrowserCoordinatorCommands> for handler. - (instancetype)initWithData:(ShareToData*)data handler:(id<BrowserCommands>)handler baseViewController:(UIViewController*)baseViewController NS_DESIGNATED_INITIALIZER; // Initializes the print activity with the given |imageData| and the |handler|. // Print preview will be presented on top of |baseViewController|. +// TODO(crbug.com/906662): Use id<BrowserCoordinatorCommands> for handler. - (instancetype)initWithImageData:(ShareImageData*)imageData handler:(id<BrowserCommands>)handler baseViewController:(UIViewController*)baseViewController
diff --git a/ios/chrome/browser/ui/authentication/signin_sync/signin_sync_view_controller.mm b/ios/chrome/browser/ui/authentication/signin_sync/signin_sync_view_controller.mm index 472b8b22..73804c6 100644 --- a/ios/chrome/browser/ui/authentication/signin_sync/signin_sync_view_controller.mm +++ b/ios/chrome/browser/ui/authentication/signin_sync/signin_sync_view_controller.mm
@@ -25,8 +25,7 @@ namespace { -// Width of the identity control if nothing is contraining it. -constexpr CGFloat kIdentityControlMaxWidth = 327; +// Width of the identity control. constexpr CGFloat kIdentityControlMarginDefault = 16; // URL for the Settings link. @@ -128,9 +127,8 @@ l10n_util::GetNSString([self secondaryActionStringID]); // Set constraints specific to the identity control button that don't change. - NSLayoutConstraint* areaWidthConstraint = - [self.identityControlArea.widthAnchor - constraintEqualToConstant:kIdentityControlMaxWidth]; + NSLayoutConstraint* areaWidthConstraint = [self.identityControl.widthAnchor + constraintEqualToAnchor:self.specificContentView.widthAnchor]; areaWidthConstraint.priority = UILayoutPriorityDefaultHigh; int topMargin = self.identityControlInTop ? 0 : kIdentityControlMarginDefault; [NSLayoutConstraint activateConstraints:@[
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h index cd02826..0252ebff 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.h
@@ -48,6 +48,9 @@ @property(nonatomic, weak) id<BookmarkEditViewControllerDelegate> delegate; +// TODO(crbug.com/1323778): This class needs to have an explicit +// id<SnacbarCommands> handler property. + // Designated initializer. // |bookmark|: mustn't be NULL at initialization time. It also mustn't be a // folder.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm index b4c96df..5fba9e0a 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_edit_view_controller.mm
@@ -332,6 +332,8 @@ [self.delegate bookmarkEditorWillCommitTitleOrUrlChange:self]; } + // TODO(crbug.com/906662): This will need to be called on the SnackbarCommands + // handler. [self.dispatcher showSnackbarMessage: bookmark_utils_ios::CreateOrUpdateBookmarkWithUndoToast( self.bookmark, [self inputBookmarkName], url, @@ -439,6 +441,9 @@ // removes the current node. nodes.insert(self.bookmark); } + + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.dispatcher showSnackbarMessage:bookmark_utils_ios::DeleteBookmarksWithUndoToast( nodes, self.bookmarkModel, self.browserState)];
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h index 99e5c31..3a6c323c 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h +++ b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.h
@@ -43,6 +43,9 @@ @property(nonatomic, weak) id<BookmarkFolderEditorViewControllerDelegate> delegate; +// TODO(crbug.com/1323778): This class needs to have an explicit +// id<SnacbarCommands> handler property. + // Designated factory methods. // Returns a view controller set to create a new folder in |parentFolder|.
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm index cd486fa5..5cf299f 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_folder_editor_view_controller.mm
@@ -247,6 +247,8 @@ DCHECK(self.folder); std::set<const BookmarkNode*> editedNodes; editedNodes.insert(self.folder); + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.dispatcher showSnackbarMessage:bookmark_utils_ios::DeleteBookmarksWithUndoToast( editedNodes, self.bookmarkModel, @@ -273,6 +275,8 @@ base::AutoReset<BOOL> autoReset(&_ignoresOwnMove, YES); std::set<const BookmarkNode*> editedNodes; editedNodes.insert(self.folder); + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.dispatcher showSnackbarMessage:bookmark_utils_ios::MoveBookmarksWithUndoToast( editedNodes, self.bookmarkModel,
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm index a07c80f..c8c4a37 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_home_view_controller.mm
@@ -682,6 +682,8 @@ // Deletes the current node. - (void)deleteNodes:(const std::set<const BookmarkNode*>&)nodes { DCHECK_GE(nodes.size(), 1u); + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.handler showSnackbarMessage:bookmark_utils_ios::DeleteBookmarksWithUndoToast( nodes, self.bookmarks, self.browserState)]; @@ -878,6 +880,8 @@ - (void)handleMoveNode:(const bookmarks::BookmarkNode*)node toPosition:(int)position { + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.handler showSnackbarMessage: bookmark_utils_ios::UpdateBookmarkPositionWithUndoToast( @@ -918,6 +922,8 @@ DCHECK(!folder->is_url()); DCHECK_GE(folderPicker.editedNodes.size(), 1u); + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.handler showSnackbarMessage:bookmark_utils_ios::MoveBookmarksWithUndoToast( folderPicker.editedNodes, self.bookmarks, folder, @@ -2520,6 +2526,9 @@ didDropURL:(const GURL&)URL atIndexPath:(NSIndexPath*)indexPath { NSUInteger index = base::checked_cast<NSUInteger>(indexPath.item); + + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.handler showSnackbarMessage: bookmark_utils_ios::CreateBookmarkAtPositionWithUndoToast( base::SysUTF8ToNSString(URL.spec()), URL, _rootNode,
diff --git a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm index 7ac2809..407b2c0a 100644 --- a/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/bookmark_interaction_controller.mm
@@ -130,6 +130,9 @@ @property(nonatomic, strong) BookmarkMediator* mediator; +// TODO(crbug.com/1323778): This should use an explicit (separate) +// SnackbarCommands handler. This can be set from the |browser| used on init, +// although ideally it would be injected by the owning coordinator. @property(nonatomic, readonly, weak) id<ApplicationCommands, BrowserCommands> handler; @@ -218,6 +221,9 @@ void (^editAction)() = ^{ [weakSelf presentBookmarkEditorForURL:bookmarkedURL]; }; + + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.handler showSnackbarMessage:[self.mediator addBookmarkWithTitle:title URL:bookmarkedURL @@ -614,6 +620,8 @@ const bookmarks::BookmarkNode* folder) { BookmarkInteractionController* strongSelf = weakSelf; if (folder && strongSelf) { + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [strongSelf.handler showSnackbarMessage:[strongSelf.mediator addBookmarks:command.URLs toFolder:folder]];
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm index 9acc82c..3ec63a9 100644 --- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm +++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -578,6 +578,14 @@ #pragma mark - Public Properties +// TODO(crbug.com/1323764): This uses PopupMenuCommands via inclusion in +// BrowserCommands. This is also not a public property. Instead of using +// |self.dispatcher| internally, this should use the currect pattern for handler +// injection into a view controller with a dedicated id<PopupMenuCommands> +// public property set externally. +// TODO(crbug.com/1323778): This uses SnackbarCommands via inclusion in +// BrowserCommands. Instead a a dedicated id<SnackbarCommands> property should +// be injected. - (id<ApplicationCommands, BrowserCommands, FindInPageCommands, @@ -1059,6 +1067,8 @@ [self.textZoomHandler closeTextZoom]; } + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:NO]; if (self.presentedViewController) { @@ -2383,6 +2393,9 @@ // be unrecognized. if (_isShutdown) return; + + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:NO]; [self.helpHandler hideAllHelpBubbles]; } @@ -2614,6 +2627,9 @@ message.accessibilityLabel = text; message.duration = 2.0; message.category = kBrowserViewControllerSnackbarCategory; + + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.dispatcher showSnackbarMessage:message]; }
diff --git a/ios/chrome/browser/ui/commands/browser_commands.h b/ios/chrome/browser/ui/commands/browser_commands.h index 47377a1..e36d79a 100644 --- a/ios/chrome/browser/ui/commands/browser_commands.h +++ b/ios/chrome/browser/ui/commands/browser_commands.h
@@ -22,17 +22,20 @@ // Protocol for commands that will generally be handled by the "current tab", // which in practice is the BrowserViewController instance displaying the tab. -// TODO(crbug.com/906662) : Extract BrowserCoordinatorCommands from -// BrowserCommands. -@protocol BrowserCommands <NSObject, - BrowserCoordinatorCommands, - NewTabPageCommands, - PageInfoCommands, - PopupMenuCommands, - QRScannerCommands, - SnackbarCommands, - DefaultPromoCommands, - LensCommands> +@protocol BrowserCommands < + NSObject, + // TODO(crbug.com/906662) : Remove BrowserCoordinatorCommands conformance. + BrowserCoordinatorCommands, + // TODO(crbug.com/1323758):Remove PageInfoCommands conformance. + PageInfoCommands, + // TODO(crbug.com/1323764): Remove PopupMenuCommands conformance. + PopupMenuCommands, + // TODO(crbug.com/1323775): Remove QRScannerCommands conformance. + QRScannerCommands, + // TODO(crbug.com/1323778): Remove SnackbarCommands conformance. + SnackbarCommands, + // TODO(crbug.com/1323783): Remove LensCommands conformance. + LensCommands> // Closes the current tab. // TODO(crbug.com/1272498): Refactor this command away; call sites should close
diff --git a/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm b/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm index f265d9d0..0fb78caf 100644 --- a/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm +++ b/ios/chrome/browser/ui/context_menu/context_menu_configuration_provider.mm
@@ -417,6 +417,8 @@ // Searches an image with Lens using the given |imageData|. - (void)searchImageUsingLensWithData:(NSData*)imageData { + // TODO(crbug.com/1323783): This should be an id<LensCommands> and use + // HandlerForProtocol(). id<BrowserCommands> handler = static_cast<id<BrowserCommands>>(_browser->GetCommandDispatcher()); UIImage* image = [UIImage imageWithData:imageData];
diff --git a/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm b/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm index c16625af..33746841 100644 --- a/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm +++ b/ios/chrome/browser/ui/first_run/signin/signin_screen_view_controller.mm
@@ -25,8 +25,6 @@ namespace { -// Width of the identity control if nothing is contraining it. -constexpr CGFloat kIdentityControlMaxWidth = 327.; // Margin above the identity button. constexpr CGFloat kTopMarginForBottomView = 16.; @@ -105,18 +103,13 @@ if (self.signinStatus != SigninScreenConsumerSigninStatusDisabled) { [self.specificContentView addSubview:self.identityControl]; - NSLayoutConstraint* widthConstraint = [self.identityControl.widthAnchor - constraintEqualToConstant:kIdentityControlMaxWidth]; - widthConstraint.priority = UILayoutPriorityDefaultHigh; [NSLayoutConstraint activateConstraints:@[ [self.identityControl.topAnchor constraintEqualToAnchor:self.specificContentView.topAnchor], [self.identityControl.centerXAnchor constraintEqualToAnchor:self.specificContentView.centerXAnchor], [self.identityControl.widthAnchor - constraintLessThanOrEqualToAnchor:self.specificContentView - .widthAnchor], - widthConstraint, + constraintEqualToAnchor:self.specificContentView.widthAnchor], [self.identityControl.bottomAnchor constraintLessThanOrEqualToAnchor:self.specificContentView .bottomAnchor],
diff --git a/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm b/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm index 5355b15..2e2ba4c 100644 --- a/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/feed_management/follow_management_view_controller.mm
@@ -109,6 +109,11 @@ #pragma mark - UITableViewDelegate +- (void)tableView:(UITableView*)tableView + didSelectRowAtIndexPath:(NSIndexPath*)indexPath { + [tableView deselectRowAtIndexPath:indexPath animated:YES]; +} + - (UISwipeActionsConfiguration*)tableView:(UITableView*)tableView trailingSwipeActionsConfigurationForRowAtIndexPath:(NSIndexPath*)indexPath { UIContextualAction* unfollowSwipeAction = [UIContextualAction @@ -125,6 +130,39 @@ configurationWithActions:@[ unfollowSwipeAction ]]; } +- (UIContextMenuConfiguration*)tableView:(UITableView*)tableView + contextMenuConfigurationForRowAtIndexPath:(NSIndexPath*)indexPath + point:(CGPoint)point { + __weak FollowManagementViewController* weakSelf = self; + + UIContextMenuActionProvider actionProvider = ^( + NSArray<UIMenuElement*>* suggestedActions) { + if (!weakSelf) { + // Return an empty menu. + return [UIMenu menuWithTitle:@"" children:@[]]; + } + FollowManagementViewController* strongSelf = weakSelf; + NSMutableArray<UIMenuElement*>* menuElements = + [[NSMutableArray alloc] init]; + UIAction* unfollowSwipeAction = [UIAction + actionWithTitle:l10n_util::GetNSString( + IDS_IOS_FOLLOW_MANAGEMENT_UNFOLLOW_ACTION) + image:nil + identifier:nil + handler:^(UIAction* action) { + [strongSelf requestUnfollowWebChannelAtIndexPath:indexPath]; + }]; + unfollowSwipeAction.attributes = UIMenuElementAttributesDestructive; + [menuElements addObject:unfollowSwipeAction]; + return [UIMenu menuWithTitle:@"" children:menuElements]; + }; + + return + [UIContextMenuConfiguration configurationWithIdentifier:nil + previewProvider:nil + actionProvider:actionProvider]; +} + #pragma mark - FollowManagementUIUpdater - (void)removeFollowedWebChannel:(FollowedWebChannel*)channel {
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm index 03ba8d8..06eed5d 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_view_controller.mm
@@ -66,6 +66,9 @@ // view. @property(nonatomic, strong) NSArray<NSLayoutConstraint*>* fakeOmniboxConstraints; +// Constraint that pins the fake Omnibox to the top of the view. A subset of +// |fakeOmniboxConstraints|. +@property(nonatomic, strong) NSLayoutConstraint* headerTopAnchor; // Array of constraints used to lay out the fake Omnibox header above the // Content Suggestions, as opposed to pinning it to the top of the view in @@ -284,6 +287,13 @@ if (previousTraitCollection.horizontalSizeClass != self.traitCollection.horizontalSizeClass) { + // Update header constant to cover rotation instances. When the omnibox is + // pinned to the top, the fake omnibox is the one shown only in portrait + // mode, so if the NTP is opened in landscape mode, a rotation to portrait + // mode needs to update the top anchor constant based on the correct header + // height. + self.headerTopAnchor.constant = + -([self stickyOmniboxHeight] + [self feedHeaderHeight]); [[self contentSuggestionsViewController].view setNeedsLayout]; [[self contentSuggestionsViewController].view layoutIfNeeded]; [self.ntpContentDelegate reloadContentSuggestions]; @@ -574,7 +584,7 @@ // Takes the height of the entire header and subtracts the margin to stick the // fake omnibox. Adjusts this for the device by further subtracting the // toolbar height and safe area insets. - return self.headerController.view.frame.size.height - + return [self.headerController headerHeight] - ntp_header::kFakeOmniboxScrolledToTopMargin - ToolbarExpandedHeight( [UIApplication sharedApplication].preferredContentSizeCategory) - @@ -675,12 +685,16 @@ [self.view addSubview:self.headerController.view]; if (IsContentSuggestionsHeaderMigrationEnabled()) { + self.headerTopAnchor = [self.headerController.view.topAnchor + constraintEqualToAnchor:self.discoverFeedWrapperViewController.view + .topAnchor + constant:-([self stickyOmniboxHeight] + + [self feedHeaderHeight])]; + // This issue fundamentally comes down to the topAnchor being set just once + // and if it is set in landscape mode, it never is updated upon rotation. + // And landscape is when it doesn't matter. self.fakeOmniboxConstraints = @[ - [self.headerController.view.topAnchor - constraintEqualToAnchor:self.discoverFeedWrapperViewController.view - .topAnchor - constant:-([self stickyOmniboxHeight] + - [self feedHeaderHeight])], + self.headerTopAnchor, [self.headerController.view.leadingAnchor constraintEqualToAnchor:self.discoverFeedWrapperViewController.view .leadingAnchor],
diff --git a/ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_delegate.h b/ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_delegate.h index 1f699bd..f91ecf33 100644 --- a/ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_delegate.h +++ b/ios/chrome/browser/ui/omnibox/keyboard_assist/omnibox_assistive_keyboard_delegate.h
@@ -31,6 +31,8 @@ @interface OmniboxAssistiveKeyboardDelegateImpl : NSObject <OmniboxAssistiveKeyboardDelegate> +// TODO(crbug.com/1323775): This should just be an id<QRScannerCommands> handler +// (not named 'dispatcher'). @property(nonatomic, weak) id<ApplicationCommands, BrowserCommands> dispatcher; @property(nonatomic, weak) OmniboxTextFieldIOS* omniboxTextField; @property(nonatomic, weak) NamedGuide* voiceSearchButtonGuide;
diff --git a/ios/chrome/browser/ui/page_info/page_info_view_controller.h b/ios/chrome/browser/ui/page_info/page_info_view_controller.h index c985b66..116ecd5 100644 --- a/ios/chrome/browser/ui/page_info/page_info_view_controller.h +++ b/ios/chrome/browser/ui/page_info/page_info_view_controller.h
@@ -27,6 +27,7 @@ - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE; // Handler used to navigate outside the page info. +// TODO(crbug.com/1323758): This should just be id<PageInfoCommands>. @property(nonatomic, weak) id<BrowserCommands> handler; // Delegate used to handle permission actions.
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn index e5490ce..4375fe4 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn
@@ -14,6 +14,7 @@ ":feature_flags", ":overflow_menu_swift", "resources:overflow_menu_action_bookmark", + "resources:overflow_menu_action_clear_browsing_data", "resources:overflow_menu_action_edit_bookmark", "resources:overflow_menu_action_find_in_page", "resources:overflow_menu_action_follow",
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h b/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h index 3270838c..c0dcc0a 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.h
@@ -10,6 +10,9 @@ // Feature to enable the new overflow menu. extern const base::Feature kNewOverflowMenu; +// Feature to add a Clear Browsing Data action to the new overflow menu. +extern const base::Feature kNewOverflowMenuCBDAction; + // Feature to add a Settings action to the new overflow menu. extern const base::Feature kNewOverflowMenuSettingsAction; @@ -19,9 +22,15 @@ // Whether the NewOverflowMenu feature is enabled. bool IsNewOverflowMenuEnabled(); +// Whether or not the NewOverflowMenuCBDAction feature is enabled. +bool IsNewOverflowMenuCBDActionEnabled(); + // Whether or not the NewOverflowMenuSettingsAction feature is enabled. bool IsNewOverflowMenuSettingsActionEnabled(); +// Whether or not the NewOverflowMenuReorderSettings feature is enabled. +bool IsNewOverflowMenuReorderSettingsEnabled(); + // Whether the new Google Password Manager branding is enabled. bool IsPasswordManagerBrandingUpdateEnabled();
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.mm index 39a41e3b..3432a97 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/feature_flags.mm
@@ -13,6 +13,9 @@ const base::Feature kNewOverflowMenu{"NewOverflowMenu", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kNewOverflowMenuCBDAction{ + "NewOverflowMenuCBDAction", base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kNewOverflowMenuSettingsAction{ "NewOverflowMenuSettingsAction", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -28,6 +31,11 @@ return false; } +bool IsNewOverflowMenuCBDActionEnabled() { + return IsNewOverflowMenuEnabled() && + base::FeatureList::IsEnabled(kNewOverflowMenuCBDAction); +} + bool IsNewOverflowMenuSettingsActionEnabled() { return IsNewOverflowMenuEnabled() && base::FeatureList::IsEnabled(kNewOverflowMenuSettingsAction);
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h index d737536..f97b27f 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.h
@@ -39,6 +39,15 @@ @property(nonatomic, assign) WebStateList* webStateList; // Dispatcher. +// TODO(crbug.com/906662): This class uses BrowserCoordinatorCommands via their +// includion in BrowserCommands. That dependency should be explicit, and instead +// of a single parameter for all command protocols, separate handler properties +// should be used for each necessary protocol (see ToolbarButtonActionsHandler +// for an example of this). +// TODO(crbug.com/1323758): This uses PageInfoCommands via inclusion in +// BrowserCommands, and should instead use a dedicated handler. +// TODO(crbug.com/1323764): This uses PopupMenuCommands via inclusion in +// BrowserCommands, and should instead use a dedicated handler. @property(nonatomic, weak) id<ApplicationCommands, BrowserCommands, FindInPageCommands,
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm index d6a0441..63968354 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_mediator.mm
@@ -218,6 +218,7 @@ @property(nonatomic, strong) OverflowMenuAction* openIncognitoTabAction; @property(nonatomic, strong) OverflowMenuAction* openNewWindowAction; +@property(nonatomic, strong) OverflowMenuAction* clearBrowsingDataAction; @property(nonatomic, strong) OverflowMenuAction* followAction; @property(nonatomic, strong) OverflowMenuAction* unfollowAction; @property(nonatomic, strong) OverflowMenuAction* addBookmarkAction; @@ -475,6 +476,12 @@ actions:@[] footer:nil]; + self.clearBrowsingDataAction = + CreateOverflowMenuAction(IDS_IOS_TOOLS_MENU_CLEAR_BROWSING_DATA, + @"overflow_menu_action_clear_browsing_data", + kToolsMenuClearBrowsingData, ^{ + [weakSelf openClearBrowsingData]; + }); self.followAction = CreateOverflowMenuAction( IDS_IOS_TOOLS_MENU_FOLLOW, @"overflow_menu_action_follow", kToolsMenuFollow, ^{ @@ -625,7 +632,7 @@ BOOL pageIsBookmarked = self.webState && self.bookmarkModel && self.bookmarkModel->IsBookmarked(self.webState->GetVisibleURL()); - self.pageActionsGroup.actions = @[ + NSArray<OverflowMenuAction*>* basePageActions = @[ (pageIsBookmarked) ? self.editBookmarkAction : self.addBookmarkAction, self.readLaterAction, self.translateAction, ([self userAgentType] != web::UserAgentType::DESKTOP) @@ -634,6 +641,13 @@ self.findInPageAction, self.textZoomAction ]; + if (IsNewOverflowMenuCBDActionEnabled()) { + self.pageActionsGroup.actions = [@[ self.clearBrowsingDataAction ] + arrayByAddingObjectsFromArray:basePageActions]; + } else { + self.pageActionsGroup.actions = basePageActions; + } + // Add the follow/unfollow action. if (self.followActionState != FollowActionStateHidden) { DCHECK(IsWebChannelsEnabled()); @@ -991,6 +1005,8 @@ // Dismisses the menu and reloads the current page. - (void)reload { RecordAction(UserMetricsAction("MobileMenuReload")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; self.navigationAgent->Reload(); } @@ -998,6 +1014,8 @@ // Dismisses the menu and stops the current page load. - (void)stopLoading { RecordAction(UserMetricsAction("MobileMenuStop")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; self.navigationAgent->StopLoading(); } @@ -1005,6 +1023,8 @@ // Dismisses the menu and opens a new tab. - (void)openTab { RecordAction(UserMetricsAction("MobileMenuNewTab")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher openURLInNewTab:[OpenNewTabCommand commandWithIncognito:NO]]; } @@ -1012,6 +1032,8 @@ // Dismisses the menu and opens a new incognito tab. - (void)openIncognitoTab { RecordAction(UserMetricsAction("MobileMenuNewIncognitoTab")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher openURLInNewTab:[OpenNewTabCommand commandWithIncognito:YES]]; @@ -1020,17 +1042,28 @@ // Dismisses the menu and opens a new window. - (void)openNewWindow { RecordAction(UserMetricsAction("MobileMenuNewWindow")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher openNewWindowWithActivity:ActivityToLoadURL(WindowActivityToolsOrigin, GURL(kChromeUINewTabURL))]; } +// Dismisses the menu and opens the Clear Browsing Data screen. +- (void)openClearBrowsingData { + RecordAction(UserMetricsAction("MobileMenuClearBrowsingData")); + [self.dispatcher dismissPopupMenuAnimated:YES]; + [self.dispatcher showClearBrowsingDataSettings]; +} + // Updates the follow status of the web channel corresponding to |webPageURLs| // to |followStatus|, and dismisses the menu. - (void)updateFollowStatus:(BOOL)followStatus { ios::GetChromeBrowserProvider().GetFollowProvider()->UpdateFollowStatus( self.webPageURLs, followStatus); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; } @@ -1038,6 +1071,8 @@ // bookmark edit screen if the current page is bookmarked. - (void)addOrEditBookmark { RecordAction(UserMetricsAction("MobileMenuAddToBookmarks")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; LogLikelyInterestedDefaultBrowserUserActivity(DefaultPromoTypeAllTabs); [self.dispatcher bookmarkCurrentPage]; @@ -1050,6 +1085,8 @@ // Dismissing the menu disconnects the mediator, so save anything cleaned up // there. web::WebState* webState = self.webState; + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; if (!webState) { @@ -1076,6 +1113,8 @@ // Dismisses the menu and starts translating the current page. - (void)translatePage { base::RecordAction(UserMetricsAction("MobileMenuTranslate")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher showTranslate]; } @@ -1083,6 +1122,8 @@ // Dismisses the menu and requests the desktop version of the current page - (void)requestDesktopSite { RecordAction(UserMetricsAction("MobileMenuRequestDesktopSite")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; self.navigationAgent->RequestDesktopSite(); [self.dispatcher showDefaultSiteViewIPH]; @@ -1091,6 +1132,8 @@ // Dismisses the menu and requests the mobile version of the current page - (void)requestMobileSite { RecordAction(UserMetricsAction("MobileMenuRequestMobileSite")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; self.navigationAgent->RequestMobileSite(); } @@ -1098,6 +1141,8 @@ // Dismisses the menu and opens Find In Page - (void)openFindInPage { RecordAction(UserMetricsAction("MobileMenuFindInPage")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher openFindInPage]; } @@ -1105,6 +1150,8 @@ // Dismisses the menu and opens Text Zoom - (void)openTextZoom { RecordAction(UserMetricsAction("MobileMenuTextZoom")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher openTextZoom]; } @@ -1112,6 +1159,8 @@ // Dismisses the menu and opens the Report an Issue screen. - (void)reportAnIssue { RecordAction(UserMetricsAction("MobileMenuReportAnIssue")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher showReportAnIssueFromViewController:self.baseViewController @@ -1121,6 +1170,8 @@ // Dismisses the menu and opens the help screen. - (void)openHelp { RecordAction(UserMetricsAction("MobileMenuHelp")); + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher showHelpPage]; } @@ -1129,6 +1180,8 @@ // Dismisses the menu and opens bookmarks. - (void)openBookmarks { + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; LogLikelyInterestedDefaultBrowserUserActivity(DefaultPromoTypeAllTabs); [self.dispatcher showBookmarksManager]; @@ -1136,18 +1189,26 @@ // Dismisses the menu and opens history. - (void)openHistory { + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher showHistory]; } // Dismisses the menu and opens reading list. - (void)openReadingList { + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; + // TODO(crbug.com/906662): This will need to be called on the + // BrowserCoordinatorCommands handler. [self.dispatcher showReadingList]; } // Dismisses the menu and opens password list. - (void)openPasswords { + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; [self.dispatcher showSavedPasswordsSettingsFromViewController:self.baseViewController @@ -1162,18 +1223,24 @@ : profile_metrics::BrowserProfileType::kRegular; UmaHistogramEnumeration("Download.OpenDownloadsFromMenu.PerProfileType", type); + // TODO(crbug.com/906662): This will need to be called on the + // BrowserCoordinatorCommands handler. [self.dispatcher showDownloadsFolder]; } // Dismisses the menu and opens recent tabs. - (void)openRecentTabs { [self.dispatcher dismissPopupMenuAnimated:YES]; + // TODO(crbug.com/906662): This will need to be called on the + // BrowserCoordinatorCommands handler. [self.dispatcher showRecentTabs]; } // Dismisses the menu and shows page information. - (void)openSiteInformation { [self.dispatcher dismissPopupMenuAnimated:YES]; + // TODO(crbug.com/1323758): This will need to be called on the + // PageInfoCommands handler. [self.dispatcher showPageInfo]; }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/BUILD.gn b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/BUILD.gn index f2923cfd..b3996e7 100644 --- a/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/BUILD.gn +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/BUILD.gn
@@ -12,6 +12,14 @@ ] } +imageset("overflow_menu_action_clear_browsing_data") { + sources = [ + "overflow_menu_action_clear_browsing_data.imageset/Contents.json", + "overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@2x.png", + "overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@3x.png", + ] +} + imageset("overflow_menu_action_find_in_page") { sources = [ "overflow_menu_action_find_in_page.imageset/Contents.json",
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/Contents.json new file mode 100644 index 0000000..99d52a2 --- /dev/null +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/Contents.json
@@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "overflow_menu_action_clear_browsing_data@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "overflow_menu_action_clear_browsing_data@3x.png", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties": { + "template-rendering-intent": "template" + } +}
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@2x.png b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@2x.png new file mode 100644 index 0000000..f0fa216c --- /dev/null +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@2x.png Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@3x.png b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@3x.png new file mode 100644 index 0000000..be87b32 --- /dev/null +++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/resources/overflow_menu_action_clear_browsing_data.imageset/overflow_menu_action_clear_browsing_data@3x.png Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h index 04ce6e54..a5780f9 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h
@@ -28,6 +28,18 @@ @property(nonatomic, weak) id<PopupMenuActionHandlerDelegate> delegate; // Dispatcher. +// TODO(crbug.com/906662): This class uses BrowserCoordinatorCommands via their +// includion in BrowserCommands. That dependency should be explicit, and instead +// of a single parameter for all command protocols, separate handler properties +// should be used for each necessary protocol (see ToolbarButtonActionsHandler +// for an example of this). +// TODO(crbug.com/1323758): This uses PageInfoCommands via inclusion in +// BrowserCommands, and should instead use a dedicated handler. +// TODO(crbug.com/1323764): This uses PopupMenuCommands via inclusion in +// BrowserCommands, and should instead use a dedicated handler. +// TODO(crbug.com/1323775): This uses QRScannerCommands via inclusion in +// BrowserCommands, and should instead use a dedicated handler. + @property(nonatomic, weak) id<ApplicationCommands, BrowserCommands, FindInPageCommands,
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm index 662a215..3f93b538 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.mm
@@ -95,6 +95,8 @@ break; case PopupMenuActionSiteInformation: RecordAction(UserMetricsAction("MobileMenuSiteInformation")); + // TODO(crbug.com/1323758): This will need to be called on the + // PageInfoCommands handler. [self.dispatcher showPageInfo]; break; case PopupMenuActionReportIssue: @@ -104,6 +106,8 @@ sender:UserFeedbackSender::ToolsMenu]; // Dismisses the popup menu without animation to allow the snapshot to be // taken without the menu presented. + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:NO]; break; case PopupMenuActionHelp: @@ -114,6 +118,8 @@ RecordAction( UserMetricsAction("MobileDownloadFolderUIShownFromToolsMenu")); [self.delegate recordDownloadsMetricsPerProfile]; + // TODO(crbug.com/906662): This will need to be called on the + // BrowserCoordinatorCommands handler. [self.dispatcher showDownloadsFolder]; break; case PopupMenuActionTextZoom: @@ -122,6 +128,8 @@ break; #if !defined(NDEBUG) case PopupMenuActionViewSource: + // TODO(crbug.com/906662): This will need to be called on the + // BrowserCoordinatorCommands handler. [self.dispatcher viewSource]; break; #endif // !defined(NDEBUG) @@ -141,10 +149,14 @@ break; case PopupMenuActionReadingList: RecordAction(UserMetricsAction("MobileMenuReadingList")); + // TODO(crbug.com/906662): This will need to be called on the + // BrowserCoordinatorCommands handler. [self.dispatcher showReadingList]; break; case PopupMenuActionRecentTabs: RecordAction(UserMetricsAction("MobileMenuRecentTabs")); + // TODO(crbug.com/906662): This will need to be called on the + // BrowserCoordinatorCommands handler. [self.dispatcher showRecentTabs]; break; case PopupMenuActionHistory: @@ -184,6 +196,8 @@ } case PopupMenuActionQRCodeSearch: RecordAction(UserMetricsAction("MobileMenuScanQRCode")); + // TODO(crbug.com/1323775): This will need to be called on the + // QRScannerCommands handler. [self.dispatcher showQRScanner]; break; case PopupMenuActionSearchCopiedImage: { @@ -232,6 +246,8 @@ } // Close the tools menu. + // TODO(crbug.com/1323764): This will need to be called on the + // PopupMenuCommands handler. [self.dispatcher dismissPopupMenuAnimated:YES]; }
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h index 7470d3d..6e7b5c7 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.h
@@ -84,5 +84,7 @@ extern NSString* const kToolsMenuFollow; // Unfollow item accessibility Identifier. extern NSString* const kToolsMenuUnfollow; +// Clear Browsing Data item accessibility identifier. +extern NSString* const kToolsMenuClearBrowsingData; #endif // IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_CONSTANTS_H_
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm index 0fb1c8b..b570a1e 100644 --- a/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm +++ b/ios/chrome/browser/ui/popup_menu/popup_menu_constants.mm
@@ -53,3 +53,4 @@ NSString* const kTextMenuEnterpriseInfo = @"kTextMenuEnterpriseInfo"; NSString* const kToolsMenuFollow = @"kToolsMenuFollow"; NSString* const kToolsMenuUnfollow = @"kToolsMenuUnfollow"; +NSString* const kToolsMenuClearBrowsingData = @"kToolsMenuClearBrowsingData";
diff --git a/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.h b/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.h index 0f09c06..59fd960 100644 --- a/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.h
@@ -13,6 +13,9 @@ @interface AboutChromeTableViewController : SettingsRootTableViewController <SettingsControllerProtocol> +// TODO(crbug.com/1323778): This class needs to have an explicit +// id<SnacbarCommands> handler property. + - (instancetype)init NS_DESIGNATED_INITIALIZER; - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm b/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm index c932bda..4403fec5 100644 --- a/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/about_chrome_table_view_controller.mm
@@ -179,6 +179,8 @@ MDCSnackbarMessage* message = [MDCSnackbarMessage messageWithText:messageText]; message.category = @"version copied"; + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.dispatcher showSnackbarMessage:message bottomOffset:0]; }
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h index a250e8d..6e2551d 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.h
@@ -48,6 +48,9 @@ delegate; // Dispatcher for this ViewController. +// TODO(crbug.com/1323778): This class needs to have an explicit +// id<SnacbarCommands> handler property instead of using BrowserCommands. There +// will also be an explicit (separate) ApplicationCommands handler. @property(nonatomic, weak) id<ApplicationCommands, BrowserCommands> commandsHandler;
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm index 82095cd6..89a5414e 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_table_view_controller.mm
@@ -1012,6 +1012,8 @@ TriggerHapticFeedbackForNotification(success ? UINotificationFeedbackTypeSuccess : UINotificationFeedbackTypeError); + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.commandsHandler showSnackbarWithMessage:message buttonText:nil messageAction:nil
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller.h b/ios/chrome/browser/ui/settings/translate_table_view_controller.h index 9c6eee7..baad6d9 100644 --- a/ios/chrome/browser/ui/settings/translate_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/translate_table_view_controller.h
@@ -12,6 +12,9 @@ // Controller for the UI that allows the user to control Translate settings. @interface TranslateTableViewController : SettingsRootTableViewController +// TODO(crbug.com/1323778): This class needs to have an explicit +// id<SnackbarCommands> handler property. + // |prefs| must not be nil. - (instancetype)initWithPrefs:(PrefService*)prefs NS_DESIGNATED_INITIALIZER; - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/translate_table_view_controller.mm b/ios/chrome/browser/ui/settings/translate_table_view_controller.mm index 0028515..994faf56 100644 --- a/ios/chrome/browser/ui/settings/translate_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/translate_table_view_controller.mm
@@ -180,6 +180,8 @@ MDCSnackbarMessage* message = [MDCSnackbarMessage messageWithText:messageText]; message.category = kTranslateSettingsCategory; + // TODO(crbug.com/1323778): This will need to be called on the + // SnackbarCommands handler. [self.dispatcher showSnackbarMessage:message bottomOffset:0]; } [tableView deselectRowAtIndexPath:indexPath animated:NO];
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h index a812f30..8d7e3bd0 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.h
@@ -33,6 +33,9 @@ // Button factory. @property(nonatomic, strong) ToolbarButtonFactory* buttonFactory; // Dispatcher for the ViewController. +// TODO(crbug.com/1323764): The only commands used here are PopupMenuCommands +// and OmniboxCommands; these (and only these) should be provided by separate +// dedicated handlers. @property(nonatomic, weak) id<ApplicationCommands, BrowserCommands> dispatcher; // Delegate for the long press gesture recognizer triggering popup menu. @property(nonatomic, weak) id<PopupMenuLongPressDelegate> longPressDelegate;
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm index 4e08f4c5..fa4767c4 100644 --- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm +++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_view_controller.mm
@@ -399,6 +399,8 @@ // Handles the gseture recognizer on the views. - (void)handleGestureRecognizer:(UILongPressGestureRecognizer*)gesture { if (gesture.state == UIGestureRecognizerStateBegan) { + // TODO(crbug.com/1323764): All of these calls on |self.dispatcher| need to + // go to a dedicated PopupMenyCommands handler. if (gesture.view == self.view.backButton) { [self.dispatcher showNavigationHistoryBackPopupMenu]; } else if (gesture.view == self.view.forwardButton) {
diff --git a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.h b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.h index 7c93d0f..11dbd93 100644 --- a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.h +++ b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.h
@@ -49,9 +49,9 @@ // Returns a dictionary containing the policies supported by Chrome. base::Value GetPolicyNames() const; - // Returns a dictionary containing the current values of the policies + // Returns an array containing the current values of the policies // supported by Chrome. - base::Value GetPolicyValues() const; + base::Value::List GetPolicyValues() const; // Called to handle the "listenPoliciesUpdates" WebUI message. void HandleListenPoliciesUpdates(const base::Value::List& args);
diff --git a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm index 6c376f979..e3af1422a 100644 --- a/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm +++ b/ios/chrome/browser/ui/webui/policy/policy_ui_handler.mm
@@ -203,12 +203,12 @@ return names; } -base::Value PolicyUIHandler::GetPolicyValues() const { +base::Value::List PolicyUIHandler::GetPolicyValues() const { auto client = std::make_unique<PolicyConversionsClientIOS>( ChromeBrowserState::FromWebUIIOS(web_ui())); return policy::ArrayPolicyConversions(std::move(client)) .EnableConvertValues(true) - .ToValue(); + .ToValueList(); } void PolicyUIHandler::HandleListenPoliciesUpdates( @@ -223,7 +223,7 @@ void PolicyUIHandler::SendPolicies() { base::Value names = GetPolicyNames(); - base::Value values = GetPolicyValues(); + base::Value values = base::Value(GetPolicyValues()); std::vector<const base::Value*> args; args.push_back(&names); args.push_back(&values);
diff --git a/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm b/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm index ae8db95..1a5f1d0 100644 --- a/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm +++ b/ios/chrome/common/ui/promo_style/promo_style_view_controller.mm
@@ -29,7 +29,7 @@ constexpr CGFloat kActionsBottomMargin = 10; constexpr CGFloat kTallBannerMultiplier = 0.35; constexpr CGFloat kDefaultBannerMultiplier = 0.25; -constexpr CGFloat kContentWidthMultiplier = 0.65; +constexpr CGFloat kContentWidthMultiplier = 0.8; constexpr CGFloat kContentOptimalWidth = 327; constexpr CGFloat kMoreArrowMargin = 4; constexpr CGFloat kPreviousContentVisibleOnScroll = 0.15; @@ -610,11 +610,13 @@ // Determines which font text style to use depending on the device size, the // size class and if dynamic type is enabled. - (UIFontTextStyle)titleLabelFontTextStyle { + UIViewController* presenter = + self.presentingViewController ? self.presentingViewController : self; BOOL dynamicTypeEnabled = UIContentSizeCategoryIsAccessibilityCategory( - self.traitCollection.preferredContentSizeCategory); + presenter.traitCollection.preferredContentSizeCategory); if (!dynamicTypeEnabled) { - if ([self isRegularXRegularSizeClass:self.traitCollection]) { + if ([self isRegularXRegularSizeClass:presenter.traitCollection]) { return UIFontTextStyleTitle1; } else if (!IsSmallDevice()) { return UIFontTextStyleLargeTitle; @@ -860,7 +862,9 @@ deactivateConstraints:self.buttonsVerticalAnchorConstraints]; self.buttonsVerticalAnchorConstraints = @[ [self.scrollView.bottomAnchor - constraintEqualToAnchor:self.actionStackView.topAnchor], + constraintEqualToAnchor:self.actionStackView.topAnchor + constant:self.tertiaryActionString ? 0 + : -kDefaultMargin], [self.actionStackView.bottomAnchor constraintLessThanOrEqualToAnchor:self.view.bottomAnchor constant:-kActionsBottomMargin],
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 47fc9cc..456b192 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -c8b6de393195e034a957a5f05643444f4ebdf74c \ No newline at end of file +a56afb28a9858935e2d118e3fdee4d932d026631 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index dd7009b..5386c9e 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -aa6f55ba1a5f6d647c03ddb12b2eaeb3f175c2f4 \ No newline at end of file +3ca26b9bee2642635bd47a11f06701a870253afa \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 1d9692e..46ad031 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -f1aa0834438fe7914154329e29f1b6e38a43fcd5 \ No newline at end of file +5de756b8b9d564750d5cc119f1e0a01a007ad4d1 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 0a09b38..ffbf010 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -ae99c3a96d760d593d9c2b1efc4e992566b6d1a5 \ No newline at end of file +28873ff43fcfd8cb064afd0f47b2c5e23d63beda \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index 2a31e65..a93cd884 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -70f5fc06f2c2f7e04ce381ce2e2b5e7c0a0785a7 \ No newline at end of file +e4c589ceac2ea0d1b31ea27d91dae11d389f4398 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 6d55b6a..b76f360 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -2df7ca88e23396753298c1173f720db22d24819b \ No newline at end of file +c769612298b263ff833e32c49241978db915b757 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index f75b195..eea7058 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -3ca4aa09bdd0d13399377e9eefa3c0607874038c \ No newline at end of file +6fe60bb634fab81b616f3112b5a0506b17c5918a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index f3e7e366..6bd2bcb4 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -696279f591c862a743a530d928323699b6542ec9 \ No newline at end of file +95d6862647724546a325fbf33be4eeac64b6bf33 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index fa8b5ddd..376b826 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -ee41f38d887c0c64dd92781adeb07d2df586bc49 \ No newline at end of file +9a0cfd9fcc944d5a95d0af742c367d23c2221f79 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index 32b265a..23968c7 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -b2933d91ac1e41b06f0cda0e0b1fd2db9fb90e56 \ No newline at end of file +fc311b1882f9195aca0da85c622f9c979cc1694b \ No newline at end of file
diff --git a/ipc/ipc_message_unittest.cc b/ipc/ipc_message_unittest.cc index b9dfd39..e7c41964 100644 --- a/ipc/ipc_message_unittest.cc +++ b/ipc/ipc_message_unittest.cc
@@ -91,8 +91,8 @@ } { base::Value list(base::Value::Type::LIST); - list.Append(42); - list.Append("hello"); + list.GetList().Append(42); + list.GetList().Append("hello"); expect_value_equals(list); } @@ -106,9 +106,9 @@ TEST(IPCMessageTest, ListValue) { base::ListValue input; - input.Append(42.42); - input.Append("forty"); - input.Append(std::make_unique<base::Value>()); + input.GetList().Append(42.42); + input.GetList().Append("forty"); + input.GetList().Append(base::Value()); IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL); IPC::WriteParam(&msg, input); @@ -138,9 +138,9 @@ subdict.SetBoolean("bool", false); base::ListValue sublist; - sublist.Append(42.42); - sublist.Append("forty"); - sublist.Append("two"); + sublist.GetList().Append(42.42); + sublist.GetList().Append("forty"); + sublist.GetList().Append("two"); subdict.SetKey("list", std::move(sublist)); input.SetKey("dict", std::move(subdict));
diff --git a/media/base/limits.h b/media/base/limits.h index 80e80fc..c5cb20e 100644 --- a/media/base/limits.h +++ b/media/base/limits.h
@@ -13,78 +13,76 @@ namespace limits { -enum { - // Maximum possible dimension (width or height) for any video. - kMaxDimension = (1 << 15) - 1, // 32767 +// Maximum possible dimension (width or height) for any video. +constexpr int kMaxDimension = (1 << 15) - 1; // 32767 - // Maximum possible canvas size (width multiplied by height) for any video. - kMaxCanvas = (1 << (14 * 2)), // 16384 x 16384 +// Maximum possible canvas size (width multiplied by height) for any video. +constexpr int kMaxCanvas = (1 << (14 * 2)); // 16384 x 16384 - // Total number of video frames which are populating in the pipeline. - kMaxVideoFrames = 4, +// Total number of video frames which are populating in the pipeline. +constexpr int kMaxVideoFrames = 4; - // The following limits are used by AudioParameters::IsValid(). - // - // A few notes on sample rates of common formats: - // - AAC files are limited to 96 kHz. - // - MP3 files are limited to 48 kHz. - // - Vorbis used to be limited to 96 kHz, but no longer has that - // restriction. - // - Most PC audio hardware is limited to 192 kHz, some specialized DAC - // devices will use 768 kHz though. - // - // kMaxSampleRate should be updated with - // blink::audio_utilities::MaxAudioBufferSampleRate() - kMaxSampleRate = 768000, - kMinSampleRate = 3000, - kMaxChannels = 32, - kMaxBytesPerSample = 4, - kMaxBitsPerSample = kMaxBytesPerSample * 8, - kMaxSamplesPerPacket = kMaxSampleRate, - kMaxPacketSizeInBytes = - kMaxBytesPerSample * kMaxChannels * kMaxSamplesPerPacket, +// The following limits are used by AudioParameters::IsValid(). +// +// A few notes on sample rates of common formats: +// - AAC files are limited to 96 kHz. +// - MP3 files are limited to 48 kHz. +// - Vorbis used to be limited to 96 kHz, but no longer has that +// restriction. +// - Most PC audio hardware is limited to 192 kHz, some specialized DAC +// devices will use 768 kHz though. +// +// kMaxSampleRate should be updated with +// blink::audio_utilities::MaxAudioBufferSampleRate() +constexpr int kMaxSampleRate = 768000; +constexpr int kMinSampleRate = 3000; +constexpr int kMaxChannels = 32; +constexpr int kMaxBytesPerSample = 4; +constexpr int kMaxBitsPerSample = kMaxBytesPerSample * 8; +constexpr int kMaxSamplesPerPacket = kMaxSampleRate; +constexpr int kMaxPacketSizeInBytes = + kMaxBytesPerSample * kMaxChannels * kMaxSamplesPerPacket; - // This limit is used by ParamTraits<VideoCaptureParams>. - kMaxFramesPerSecond = 1000, +// This limit is used by ParamTraits<VideoCaptureParams>. +constexpr int kMaxFramesPerSecond = 1000; - // The minimum elapsed amount of time (in seconds) for a playback to be - // considered as having active engagement. - kMinimumElapsedWatchTimeSecs = 7, +// The minimum elapsed amount of time (in seconds) for a playback to be +// considered as having active engagement. +constexpr int kMinimumElapsedWatchTimeSecs = 7; - // Maximum lengths for various EME API parameters. These are checks to - // prevent unnecessarily large parameters from being passed around, and the - // lengths are somewhat arbitrary as the EME spec doesn't specify any limits. - kMinCertificateLength = 128, - kMaxCertificateLength = 16 * 1024, - kMaxSessionIdLength = 512, - kMinKeyIdLength = 1, - kMaxKeyIdLength = 512, - kMaxKeyIds = 128, - kMaxInitDataLength = 64 * 1024, // 64 KB - kMaxSessionResponseLength = 64 * 1024, // 64 KB - kMaxKeySystemLength = 256, +// Maximum lengths for various EME API parameters. These are checks to +// prevent unnecessarily large parameters from being passed around, and the +// lengths are somewhat arbitrary as the EME spec doesn't specify any limits. +constexpr int kMinCertificateLength = 128; +constexpr int kMaxCertificateLength = 16 * 1024; +constexpr int kMaxSessionIdLength = 512; +constexpr int kMinKeyIdLength = 1; +constexpr int kMaxKeyIdLength = 512; +constexpr int kMaxKeyIds = 128; +constexpr int kMaxInitDataLength = 64 * 1024; // 64 KB +constexpr int kMaxSessionResponseLength = 64 * 1024; // 64 KB +constexpr int kMaxKeySystemLength = 256; // Minimum and maximum buffer sizes for certain audio platforms. #if BUILDFLAG(IS_MAC) - kMinAudioBufferSize = 128, - kMaxAudioBufferSize = 4096, +constexpr int kMinAudioBufferSize = 128; +constexpr int kMaxAudioBufferSize = 4096; #elif defined(USE_CRAS) - // Though CRAS has different per-board defaults, allow explicitly requesting - // this buffer size on any board. - kMinAudioBufferSize = 256, - kMaxAudioBufferSize = 8192, +// Though CRAS has different per-board defaults, allow explicitly requesting +// this buffer size on any board. +constexpr int kMinAudioBufferSize = 256; +constexpr int kMaxAudioBufferSize = 8192; #endif - // Maximum buffer size supported by Web Audio. - kMaxWebAudioBufferSize = 8192, +// Maximum buffer size supported by Web Audio. +constexpr int kMaxWebAudioBufferSize = 8192; - // Bounds for the number of threads used for software video decoding. - kMinVideoDecodeThreads = 2, - kMaxVideoDecodeThreads = - 16, // Matches ffmpeg's MAX_AUTO_THREADS. Higher values can result in - // immediate out of memory errors for high resolution content. See - // https://crbug.com/893984 -}; +// Bounds for the number of threads used for software video decoding. +constexpr int kMinVideoDecodeThreads = 2; +constexpr int kMaxVideoDecodeThreads = + 16; // Matches ffmpeg's MAX_AUTO_THREADS. Higher values can result in + // immediate out of memory errors for high resolution content. See + // https://crbug.com/893984 } // namespace limits
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 1559ee3..280a832 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -608,7 +608,7 @@ // tab instead" button is shown for chrome.desktopCapture captures. const base::Feature kShareThisTabInsteadButtonGetDisplayMedia{ "ShareThisTabInsteadButtonGetDisplayMedia", - base::FEATURE_DISABLED_BY_DEFAULT}; + base::FEATURE_ENABLED_BY_DEFAULT}; // If kShareThisTabInsteadButtonGetDisplayMedia is ENABLED, this flag controls // whether a "Share this tab instead" button should be enabled for
diff --git a/media/base/sinc_resampler.h b/media/base/sinc_resampler.h index e3798c4..6d069fb4 100644 --- a/media/base/sinc_resampler.h +++ b/media/base/sinc_resampler.h
@@ -19,22 +19,21 @@ // SincResampler is a high-quality single-channel sample-rate converter. class MEDIA_EXPORT SincResampler { public: - enum { - // The kernel size can be adjusted for quality (higher is better) at the - // expense of performance. Must be a multiple of 32. - // TODO(dalecurtis): Test performance to see if we can jack this up to 64+. - kKernelSize = 32, + // The kernel size can be adjusted for quality (higher is better) at the + // expense of performance. Must be a multiple of 32. + // TODO(dalecurtis): Test performance to see if we can jack this up to 64+. + static constexpr int kKernelSize = 32; - // Default request size. Affects how often and for how much SincResampler - // calls back for input. Must be greater than kKernelSize. - kDefaultRequestSize = 512, + // Default request size. Affects how often and for how much SincResampler + // calls back for input. Must be greater than kKernelSize. + static constexpr int kDefaultRequestSize = 512; - // The kernel offset count is used for interpolation and is the number of - // sub-sample kernel shifts. Can be adjusted for quality (higher is better) - // at the expense of allocating more memory. - kKernelOffsetCount = 32, - kKernelStorageSize = kKernelSize * (kKernelOffsetCount + 1), - }; + // The kernel offset count is used for interpolation and is the number of + // sub-sample kernel shifts. Can be adjusted for quality (higher is better) + // at the expense of allocating more memory. + static constexpr int kKernelOffsetCount = 32; + static constexpr int kKernelStorageSize = + kKernelSize * (kKernelOffsetCount + 1); // Callback type for providing more data into the resampler. Expects |frames| // of data to be rendered into |destination|; zero padded if not enough frames
diff --git a/media/base/sinc_resampler_unittest.cc b/media/base/sinc_resampler_unittest.cc index da56eca..2faaade 100644 --- a/media/base/sinc_resampler_unittest.cc +++ b/media/base/sinc_resampler_unittest.cc
@@ -228,9 +228,7 @@ } private: - enum { - kMinFrequency = 5 - }; + static constexpr int kMinFrequency = 5; double sample_rate_; int total_samples_;
diff --git a/media/cast/common/expanded_value_base.h b/media/cast/common/expanded_value_base.h index 8021a4f..4902e01 100644 --- a/media/cast/common/expanded_value_base.h +++ b/media/cast/common/expanded_value_base.h
@@ -108,12 +108,30 @@ } // Comparison operators. - bool operator==(Subclass rhs) const { return value_ == rhs.value_; } - bool operator!=(Subclass rhs) const { return value_ != rhs.value_; } - bool operator<(Subclass rhs) const { return value_ < rhs.value_; } - bool operator>(Subclass rhs) const { return value_ > rhs.value_; } - bool operator<=(Subclass rhs) const { return value_ <= rhs.value_; } - bool operator>=(Subclass rhs) const { return value_ >= rhs.value_; } + bool operator==( + const ExpandedValueBase<FullWidthInteger, Subclass>& rhs) const { + return value_ == rhs.value_; + } + bool operator!=( + const ExpandedValueBase<FullWidthInteger, Subclass>& rhs) const { + return value_ != rhs.value_; + } + bool operator<( + const ExpandedValueBase<FullWidthInteger, Subclass>& rhs) const { + return value_ < rhs.value_; + } + bool operator>( + const ExpandedValueBase<FullWidthInteger, Subclass>& rhs) const { + return value_ > rhs.value_; + } + bool operator<=( + const ExpandedValueBase<FullWidthInteger, Subclass>& rhs) const { + return value_ <= rhs.value_; + } + bool operator>=( + const ExpandedValueBase<FullWidthInteger, Subclass>& rhs) const { + return value_ >= rhs.value_; + } // (De)Serialize for transmission over IPC. Do not use these to subvert the // valid set of operators allowed by this class or its Subclass.
diff --git a/media/cast/encoding/external_video_encoder.h b/media/cast/encoding/external_video_encoder.h index aba75c9..4f81e16d4 100644 --- a/media/cast/encoding/external_video_encoder.h +++ b/media/cast/encoding/external_video_encoder.h
@@ -123,11 +123,9 @@ // value is related to the complexity of the content of the frame. class QuantizerEstimator { public: - enum { - NO_RESULT = -1, - MIN_VP8_QUANTIZER = 4, - MAX_VP8_QUANTIZER = 63, - }; + static constexpr int NO_RESULT = -1; + static constexpr int MIN_VP8_QUANTIZER = 4; + static constexpr int MAX_VP8_QUANTIZER = 63; QuantizerEstimator();
diff --git a/media/ffmpeg/ffmpeg_common.cc b/media/ffmpeg/ffmpeg_common.cc index 4e3918a..7a47466 100644 --- a/media/ffmpeg/ffmpeg_common.cc +++ b/media/ffmpeg/ffmpeg_common.cc
@@ -526,6 +526,14 @@ // TODO(chcunningham): We need real profiles for all of the codecs below to // actually handle capabilities requests correctly. http://crbug.com/784610 VideoCodecProfile profile = VIDEO_CODEC_PROFILE_UNKNOWN; + + // Prefer the color space found by libavcodec if available + VideoColorSpace color_space = + VideoColorSpace(codec_context->color_primaries, codec_context->color_trc, + codec_context->colorspace, + codec_context->color_range == AVCOL_RANGE_JPEG + ? gfx::ColorSpace::RangeID::FULL + : gfx::ColorSpace::RangeID::LIMITED); switch (codec) { #if BUILDFLAG(USE_PROPRIETARY_CODECS) case VideoCodec::kH264: { @@ -547,32 +555,39 @@ } #if BUILDFLAG(ENABLE_PLATFORM_HEVC) case VideoCodec::kHEVC: { - int hevc_profile = FF_PROFILE_UNKNOWN; - if ((codec_context->profile < FF_PROFILE_HEVC_MAIN || - codec_context->profile > FF_PROFILE_HEVC_REXT) && - codec_context->extradata && codec_context->extradata_size) { + int hevc_profile = -1; + // We need to parse extradata each time, because we wont add ffmpeg + // hevc decoder & parser to chromium and codec_context->profile + // should always be FF_PROFILE_UNKNOWN (-99) here + if (codec_context->extradata && codec_context->extradata_size) { mp4::HEVCDecoderConfigurationRecord hevc_config; if (hevc_config.Parse(codec_context->extradata, codec_context->extradata_size)) { hevc_profile = hevc_config.general_profile_idc; + if (!color_space.IsSpecified()) { + // We should try to parsed color space from SPS if the + // result from libavcodec is not specified in case + // that some encoder not write extra colorspace info to + // the container + color_space = hevc_config.GetColorSpace(); + } } - } else { - hevc_profile = codec_context->profile; } + // The values of general_profile_idc are taken from the HEVC standard, see + // the latest https://www.itu.int/rec/T-REC-H.265/en switch (hevc_profile) { - case FF_PROFILE_HEVC_MAIN: + case 1: profile = HEVCPROFILE_MAIN; break; - case FF_PROFILE_HEVC_MAIN_10: + case 2: profile = HEVCPROFILE_MAIN10; break; - case FF_PROFILE_HEVC_MAIN_STILL_PICTURE: + case 3: profile = HEVCPROFILE_MAIN_STILL_PICTURE; break; - case FF_PROFILE_HEVC_REXT: + case 4: profile = HEVCPROFILE_REXT; break; - // FF will treat the following profiles as FF_PROFILE_UNKNOWN case 5: profile = HEVCPROFILE_HIGH_THROUGHPUT; break; @@ -647,13 +662,6 @@ static_cast<int32_t*>(display_matrix)); } - // Prefer the color space found by libavcodec if available. - VideoColorSpace color_space = - VideoColorSpace(codec_context->color_primaries, codec_context->color_trc, - codec_context->colorspace, - codec_context->color_range == AVCOL_RANGE_JPEG - ? gfx::ColorSpace::RangeID::FULL - : gfx::ColorSpace::RangeID::LIMITED); if (!color_space.IsSpecified()) { // VP9 frames may have color information, but that information cannot // express new color spaces, like HDR. For that reason, color space
diff --git a/media/filters/vp9_compressed_header_parser.cc b/media/filters/vp9_compressed_header_parser.cc index ec21d03..4daae0d8 100644 --- a/media/filters/vp9_compressed_header_parser.cc +++ b/media/filters/vp9_compressed_header_parser.cc
@@ -155,7 +155,7 @@ for (auto& ai : fhdr->frame_context.coef_probs[tx_size]) { for (auto& aj : ai) { for (auto& ak : aj) { - int max_l = (ak == aj[0]) ? 3 : 6; + int max_l = (+ak == +aj[0]) ? 3 : 6; for (int l = 0; l < max_l; l++) { DiffUpdateProbArray(ak[l]); }
diff --git a/media/filters/vp9_parser.cc b/media/filters/vp9_parser.cc index 97e4525..6de3dab 100644 --- a/media/filters/vp9_parser.cc +++ b/media/filters/vp9_parser.cc
@@ -373,7 +373,7 @@ for (auto& ai : a) { for (auto& aj : ai) { for (auto& ak : aj) { - int max_l = (ak == aj[0]) ? 3 : 6; + int max_l = (+ak == +aj[0]) ? 3 : 6; for (int l = 0; l < max_l; l++) { for (auto& x : ak[l]) { if (x == 0) {
diff --git a/media/formats/mp4/avc.cc b/media/formats/mp4/avc.cc index a91f43b..c3a3b29e 100644 --- a/media/formats/mp4/avc.cc +++ b/media/formats/mp4/avc.cc
@@ -17,8 +17,8 @@ namespace media { namespace mp4 { -static const uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; -static const int kAnnexBStartCodeSize = 4; +static constexpr uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; +static constexpr int kAnnexBStartCodeSize = 4; static bool ConvertAVCToAnnexBInPlaceForLengthSize4(std::vector<uint8_t>* buf) { const size_t kLengthSize = 4;
diff --git a/media/formats/mp4/box_definitions.cc b/media/formats/mp4/box_definitions.cc index 4e99b0f..a9de5ea5 100644 --- a/media/formats/mp4/box_definitions.cc +++ b/media/formats/mp4/box_definitions.cc
@@ -1126,6 +1126,7 @@ RCHECK(reader->ReadChild(hevcConfig.get())); video_codec = VideoCodec::kHEVC; video_codec_profile = hevcConfig->GetVideoProfile(); + video_color_space = hevcConfig->GetColorSpace(); frame_bitstream_converter = base::MakeRefCounted<HEVCBitstreamConverter>(std::move(hevcConfig)); #if BUILDFLAG(ENABLE_PLATFORM_DOLBY_VISION) @@ -1166,6 +1167,7 @@ std::unique_ptr<HEVCDecoderConfigurationRecord> hevcConfig( new HEVCDecoderConfigurationRecord()); RCHECK(reader->ReadChild(hevcConfig.get())); + video_color_space = hevcConfig->GetColorSpace(); frame_bitstream_converter = base::MakeRefCounted<HEVCBitstreamConverter>(std::move(hevcConfig)); DVLOG(2) << __func__ << " reading DolbyVisionConfiguration (dvcC/dvvC)";
diff --git a/media/formats/mp4/hevc.cc b/media/formats/mp4/hevc.cc index be9aa80..e56a770d 100644 --- a/media/formats/mp4/hevc.cc +++ b/media/formats/mp4/hevc.cc
@@ -15,11 +15,14 @@ #include "media/formats/mp4/avc.h" #include "media/formats/mp4/box_definitions.h" #include "media/formats/mp4/box_reader.h" -#include "media/video/h265_nalu_parser.h" +#include "media/video/h265_parser.h" namespace media { namespace mp4 { +static constexpr uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; +static constexpr int kAnnexBStartCodeSize = 4; + HEVCDecoderConfigurationRecord::HEVCDecoderConfigurationRecord() : configurationVersion(0), general_profile_space(0), @@ -151,8 +154,44 @@ return VIDEO_CODEC_PROFILE_UNKNOWN; } -static const uint8_t kAnnexBStartCode[] = {0, 0, 0, 1}; -static const int kAnnexBStartCodeSize = 4; +VideoColorSpace HEVCDecoderConfigurationRecord::GetColorSpace() { + if (!arrays.size()) { + DVLOG(1) << "HVCCNALArray not found, fallback to default colorspace"; + return VideoColorSpace(); + } + + std::vector<uint8_t> param_sets; + if (!HEVC::ConvertConfigToAnnexB(*this, ¶m_sets)) + return VideoColorSpace(); + + H265Parser parser; + H265NALU nalu; + parser.SetStream(param_sets.data(), param_sets.size()); + while (true) { + H265Parser::Result result = parser.AdvanceToNextNALU(&nalu); + + if (result != H265Parser::kOk) + return VideoColorSpace(); + + switch (nalu.nal_unit_type) { + case H265NALU::SPS_NUT: { + int sps_id = -1; + result = parser.ParseSPS(&sps_id); + if (result != H265Parser::kOk) { + DVLOG(1) << "Could not parse SPS, fallback to default colorspace"; + return VideoColorSpace(); + } + + const H265SPS* sps = parser.GetSPS(sps_id); + DCHECK(sps); + return sps->GetColorSpace(); + } + default: + break; + } + } + NOTREACHED(); +} // static bool HEVC::InsertParamSetsAnnexB(
diff --git a/media/formats/mp4/hevc.h b/media/formats/mp4/hevc.h index 7ec661a..f84a883 100644 --- a/media/formats/mp4/hevc.h +++ b/media/formats/mp4/hevc.h
@@ -62,6 +62,7 @@ std::vector<HVCCNALArray> arrays; VideoCodecProfile GetVideoProfile() const; + VideoColorSpace GetColorSpace(); private: bool ParseInternal(BufferReader* reader, MediaLog* media_log);
diff --git a/media/gpu/android/ndk_video_encode_accelerator.cc b/media/gpu/android/ndk_video_encode_accelerator.cc index e2e8868..ee72985 100644 --- a/media/gpu/android/ndk_video_encode_accelerator.cc +++ b/media/gpu/android/ndk_video_encode_accelerator.cc
@@ -73,8 +73,11 @@ AMediaFormat_setInt32(result.get(), AMEDIAFORMAT_KEY_I_FRAME_INTERVAL, iframe_interval); AMediaFormat_setInt32(result.get(), AMEDIAFORMAT_KEY_COLOR_FORMAT, format); - if (config.require_low_delay) + if (config.require_low_delay) { AMediaFormat_setInt32(result.get(), AMEDIAFORMAT_KEY_LATENCY, 1); + // MediaCodec supports two priorities: 0 - realtime, 1 - best effort + AMediaFormat_setInt32(result.get(), AMEDIAFORMAT_KEY_PRIORITY, 0); + } constexpr int32_t BITRATE_MODE_VBR = 1; constexpr int32_t BITRATE_MODE_CBR = 2;
diff --git a/media/gpu/windows/d3d11_video_decoder.cc b/media/gpu/windows/d3d11_video_decoder.cc index ad84677..6b9894f 100644 --- a/media/gpu/windows/d3d11_video_decoder.cc +++ b/media/gpu/windows/d3d11_video_decoder.cc
@@ -212,13 +212,14 @@ D3D11Status::Or<ComD3D11VideoDecoder> D3D11VideoDecoder::CreateD3D11Decoder() { // By default we assume outputs are 8-bit for SDR color spaces and 10 bit for - // HDR color spaces (or VP9.2) with HBD capable codecs (the decoder doesn't - // support H264PROFILE_HIGH10PROFILE). We'll get a config change once we know - // the real bit depth if this turns out to be wrong. + // HDR color spaces (or VP9.2, or HEVC Main10) with HBD capable codecs (the + // decoder doesn't support H264PROFILE_HIGH10PROFILE). We'll get a config + // change once we know the real bit depth if this turns out to be wrong. bit_depth_ = accelerated_video_decoder_ ? accelerated_video_decoder_->GetBitDepth() : (config_.profile() == VP9PROFILE_PROFILE2 || + config_.profile() == HEVCPROFILE_MAIN10 || (config_.color_space_info().ToGfxColorSpace().IsHDR() && config_.codec() != VideoCodec::kH264) ? 10
diff --git a/services/network/cookie_access_delegate_impl.h b/services/network/cookie_access_delegate_impl.h index 08c86c8..f5994cfe 100644 --- a/services/network/cookie_access_delegate_impl.h +++ b/services/network/cookie_access_delegate_impl.h
@@ -40,10 +40,11 @@ // expected. |cookie_settings| contains the set of content settings that // describes which cookies should be subject to legacy access rules. // If non-null, |cookie_settings| is expected to outlive this class. If - // non-null, `first_party_sets` must outlive `this`. - CookieAccessDelegateImpl(mojom::CookieAccessDelegateType type, - FirstPartySetsManager* const first_party_sets, - const CookieSettings* cookie_settings = nullptr); + // non-null, `first_party_sets_manager` must outlive `this`. + CookieAccessDelegateImpl( + mojom::CookieAccessDelegateType type, + FirstPartySetsManager* const first_party_sets_manager, + const CookieSettings* cookie_settings = nullptr); ~CookieAccessDelegateImpl() override;
diff --git a/services/network/cookie_manager.h b/services/network/cookie_manager.h index 80a897cc..b3935745 100644 --- a/services/network/cookie_manager.h +++ b/services/network/cookie_manager.h
@@ -38,7 +38,7 @@ public: // Construct a CookieService that can serve mojo requests for the underlying // cookie store. |url_request_context->cookie_store()| must outlive this - // object. `*first_party_sets` must outlive + // object. `*first_party_sets_manager` must outlive // `url_request_context->cookie_store()`. CookieManager( net::URLRequestContext* url_request_context,
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index 12d74d8..4cfe537 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -511,7 +511,7 @@ std::move(on_url_request_context_builder_configured)); url_request_context_ = url_request_context_owner_.url_request_context.get(); cookie_manager_ = std::make_unique<CookieManager>( - url_request_context_, network_service_->first_party_sets(), + url_request_context_, network_service_->first_party_sets_manager(), std::move(session_cleanup_cookie_store), std::move(params_->cookie_manager_params)); @@ -788,7 +788,7 @@ role, url_request_context_->cookie_store(), cookie_manager_->cookie_settings(), origin, isolation_info, std::move(cookie_observer), - network_service_->first_party_sets()->is_enabled(), + network_service_->first_party_sets_manager()->is_enabled(), std::move(first_party_set_metadata)), std::move(receiver)); } @@ -2365,7 +2365,7 @@ std::unique_ptr<net::CookieMonster> cookie_store = std::make_unique<net::CookieMonster>( session_cleanup_cookie_store.get(), net_log, - network_service_->first_party_sets()->is_enabled()); + network_service_->first_party_sets_manager()->is_enabled()); if (params_->persist_session_cookies) cookie_store->SetPersistSessionCookies(true); @@ -2584,7 +2584,7 @@ command_line->GetSwitchValueASCII(switches::kHostResolverRules)); builder.set_first_party_sets_enabled( - network_service_->first_party_sets()->is_enabled()); + network_service_->first_party_sets_manager()->is_enabled()); // If `require_network_isolation_key_` is true, but the features that can // trigger another URLRequest are not set to respect NetworkIsolationKeys,
diff --git a/services/network/network_service.h b/services/network/network_service.h index 41bfe8d1..6683c76 100644 --- a/services/network/network_service.h +++ b/services/network/network_service.h
@@ -253,7 +253,7 @@ } #endif - FirstPartySetsManager* first_party_sets() const { + FirstPartySetsManager* first_party_sets_manager() const { return first_party_sets_manager_.get(); }
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index 1cba6224..1a4616fb 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5919,21 +5919,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "dimension_sets": [ @@ -5945,7 +5945,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "args": [ @@ -6065,21 +6065,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "dimension_sets": [ @@ -6091,7 +6091,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index a43f14e..63586ea 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -87922,28 +87922,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "args": [ @@ -88043,28 +88043,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "isolate_profile_data": true, @@ -89439,20 +89439,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "dimension_sets": [ @@ -89465,7 +89465,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "args": [ @@ -89585,20 +89585,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "dimension_sets": [ @@ -89611,7 +89611,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "merge": { @@ -91144,20 +91144,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "dimension_sets": [ @@ -91170,7 +91170,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "args": [ @@ -91290,20 +91290,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5054.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "dimension_sets": [ @@ -91316,7 +91316,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" }, { "merge": { @@ -92051,20 +92051,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5054.0", + "name": "interactive_ui_tests Lacros version skew testing ash 103.0.5055.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v103.0.5054.0", - "revision": "version:103.0.5054.0" + "location": "lacros_version_skew_tests_v103.0.5055.0", + "revision": "version:103.0.5055.0" } ], "dimension_sets": [ @@ -92077,7 +92077,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 103.0.5054.0" + "variant_id": "Lacros version skew testing ash 103.0.5055.0" } ] },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index d68dfb2..2760de9 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -12872,6 +12872,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -12901,6 +12902,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -12928,6 +12930,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -12955,6 +12958,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -12979,6 +12983,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13003,6 +13008,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13024,6 +13030,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13049,6 +13056,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13087,6 +13095,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13123,6 +13132,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13159,6 +13169,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13195,6 +13206,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13235,6 +13247,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13280,6 +13293,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13325,6 +13339,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13361,6 +13376,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13397,6 +13413,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13442,6 +13459,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13487,6 +13505,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13514,6 +13533,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13550,6 +13570,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13587,6 +13608,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13623,6 +13645,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13661,6 +13684,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13700,6 +13724,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13739,6 +13764,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13777,6 +13803,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13815,6 +13842,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13853,6 +13881,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" } @@ -13890,6 +13919,7 @@ { "cpu": "arm64", "display_attached": "1", + "mac_model": "Macmini9,1", "os": "Mac-11", "pool": "chromium.tests" }
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter index a9dcdd4d..289960d 100644 --- a/testing/buildbot/filters/fuchsia.browser_tests.filter +++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -180,6 +180,8 @@ -MediaEngagementBrowserTest.SessionNewTabNavigateSameURLWithOpener_Typed -MediaEngagementPreloadBrowserTest.EnsureSingletonListIsLoaded -MessagingApiTest.Messaging +-MetricsServiceUserDemographicsBrowserTest.AddSyncedUserBirthYearAndGenderToProtoData/0 +-MetricsServiceUserDemographicsBrowserTest.AddSyncedUserBirthYearAndGenderToProtoData/1 -MyIpAddressProxyScriptBrowserTest.Verify -NetworkingPrivateServiceClientApiTest.OnNetworkListChangedEvent -NetworkingPrivateServiceClientApiTest.OnNetworksChangedEventConnect
diff --git a/testing/buildbot/mixins.pyl b/testing/buildbot/mixins.pyl index 2081460f..b9f5597 100644 --- a/testing/buildbot/mixins.pyl +++ b/testing/buildbot/mixins.pyl
@@ -829,6 +829,7 @@ 'swarming': { 'dimensions': { 'cpu': 'arm64', + 'mac_model': 'Macmini9,1', 'os': 'Mac-11', 'pool': 'chromium.tests', 'display_attached': '1',
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 33af47e..9fc517c 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -7700,5 +7700,101 @@ ], }, }, + + 'win_optional_gpu_tests_rel_gpu_telemetry_tests': { + 'gpu_common_and_optional_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_mediapipe_passthrough_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_webcodecs_telemetry_test': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_webgl2_conformance_d3d11_passthrough_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_webgl_conformance_d3d11_passthrough_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_webgl_conformance_d3d9_passthrough_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_webgl_conformance_gl_passthrough_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_webgl_conformance_vulkan_passthrough_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_webgl_conformance_fast_call_passthrough_telemetry_tests': { + 'variants': [ + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_win_intel_specific_telemetry_tests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + ], + }, + }, + + 'win_optional_gpu_tests_rel_gtests': { + 'gpu_default_and_optional_win_specific_gtests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_fyi_and_optional_non_linux_gtests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_fyi_and_optional_win_specific_gtests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + 'gpu_gles2_conform_gtests': { + 'variants': [ + 'WIN10_INTEL_HD_630_STABLE', + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + }, + + 'win_optional_gpu_tests_rel_isolated_scripts': { + 'gpu_command_buffer_perf_passthrough_isolated_scripts': { + 'variants': [ + 'WIN10_NVIDIA_GTX_1660_STABLE', + ], + }, + }, } }
diff --git a/testing/buildbot/tryserver.chromium.win.json b/testing/buildbot/tryserver.chromium.win.json new file mode 100644 index 0000000..f27a6425 --- /dev/null +++ b/testing/buildbot/tryserver.chromium.win.json
@@ -0,0 +1,1021 @@ +{ + "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {}, + "AAAAA2 See generate_buildbot_json.py to make changes": {}, + "win_optional_gpu_tests_rel": { + "gtest_tests": [ + { + "args": [ + "--use-gpu-in-tests", + "--use-angle=d3d9" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_d3d9_test 10de:2184", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gles2_conform_test", + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "--use-gpu-in-tests", + "--use-angle=d3d9" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_d3d9_test 8086:5912 or 8086:3e92", + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gles2_conform_test", + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "--use-gpu-in-tests", + "--use-angle=gl", + "--disable-gpu-sandbox" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_gl_test 10de:2184", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gles2_conform_test", + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "--use-gpu-in-tests", + "--use-angle=gl", + "--disable-gpu-sandbox" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_gl_test 8086:5912 or 8086:3e92", + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gles2_conform_test", + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_test 10de:2184", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gles2_conform_test", + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gles2_conform_test 8086:5912 or 8086:3e92", + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gles2_conform_test", + "test_id_prefix": "ninja://gpu/gles2_conform_support:gles2_conform_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gpu_unittests 10de:2184", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gpu_unittests", + "test_id_prefix": "ninja://gpu:gpu_unittests/", + "variant_id": "10de:2184" + }, + { + "args": [], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "gpu_unittests 8086:5912 or 8086:3e92", + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gpu_unittests", + "test_id_prefix": "ninja://gpu:gpu_unittests/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "--ignore-runtime-requirements=*" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "xr_browser_tests 10de:2184", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "xr_browser_tests", + "test_id_prefix": "ninja://chrome/test:xr_browser_tests/", + "variant_id": "10de:2184" + }, + { + "args": [ + "--ignore-runtime-requirements=*" + ], + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "xr_browser_tests 8086:5912 or 8086:3e92", + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "xr_browser_tests", + "test_id_prefix": "ninja://chrome/test:xr_browser_tests/", + "variant_id": "8086:5912 or 8086:3e92" + } + ], + "isolated_scripts": [ + { + "args": [ + "info_collection", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--expected-vendor-id", + "10de", + "--expected-device-id", + "2184" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "info_collection_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "info_collection", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", + "--expected-vendor-id", + "8086", + "--expected-device-id", + "3e92", + "--expected-device-id", + "5912" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "info_collection_tests 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "mediapipe", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_higher_performance_gpu --use-cmd-decoder=passthrough --use-gl=angle" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "mediapipe_passthrough_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "mediapipe", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_higher_performance_gpu --use-cmd-decoder=passthrough --use-gl=angle" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "mediapipe_passthrough_tests 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "--gtest-benchmark-name=passthrough_command_buffer_perftests", + "-v", + "--use-cmd-decoder=passthrough", + "--use-angle=gl-null", + "--fast-run" + ], + "isolate_name": "command_buffer_perftests", + "merge": { + "args": [ + "--smoke-test-mode" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "passthrough_command_buffer_perftests 10de:2184", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://gpu:command_buffer_perftests/", + "variant_id": "10de:2184" + }, + { + "args": [ + "power", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "power_measurement_test 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "trace_test", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "trace_test 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "trace_test", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "trace_test 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "webcodecs", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webcodecs_tests 10de:2184", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "webcodecs", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webcodecs_tests 8086:5912 or 8086:3e92", + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--webgl-conformance-version=2.0.1", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl2_conformance_d3d11_passthrough_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 20 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--webgl-conformance-version=2.0.1", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl2_conformance_d3d11_passthrough_tests 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 20 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_d3d11_passthrough_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d11 --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_d3d11_passthrough_tests 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_d3d9_passthrough_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=d3d9 --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_d3d9_passthrough_tests 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --enable-unsafe-fast-js-calls --enable-fake-no-alloc-direct-call-for-testing --use-gl=angle --use-cmd-decoder=passthrough --force_high_performance_gpu" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_fast_call_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_gl_passthrough_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-gl=angle --use-angle=gl --use-cmd-decoder=passthrough --force_high_performance_gpu", + "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl_conformance_tests_output.json" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_gl_passthrough_tests 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_vulkan_passthrough_tests 10de:2184", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "10de:2184" + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release_x64", + "--passthrough", + "-v", + "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --use-angle=vulkan --use-cmd-decoder=passthrough --force_high_performance_gpu" + ], + "isolate_name": "telemetry_gpu_integration_test", + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "webgl_conformance_vulkan_passthrough_tests 8086:5912 or 8086:3e92", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "should_retry_with_patch": false, + "swarming": { + "can_use_on_swarming_builders": true, + "containment_type": "AUTO", + "dimension_sets": [ + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", + "variant_id": "8086:5912 or 8086:3e92" + } + ] + } +}
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 8c51988..472ed80 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5054.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v103.0.5055.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 103.0.5054.0', + 'identifier': 'Lacros version skew testing ash 103.0.5055.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v103.0.5054.0', - 'revision': 'version:103.0.5054.0', + 'location': 'lacros_version_skew_tests_v103.0.5055.0', + 'revision': 'version:103.0.5055.0', }, ], }, @@ -1085,4 +1085,17 @@ ], }, }, -} \ No newline at end of file + 'WIN10_INTEL_HD_630_STABLE': { + 'identifier': '8086:5912 or 8086:3e92', + 'mixins': [ + 'swarming_containment_auto', + 'win10_intel_hd_630_stable', + ], + }, + 'WIN10_NVIDIA_GTX_1660_STABLE': { + 'identifier': '10de:2184', + 'mixins': [ + 'win10_nvidia_gtx_1660_stable', + ], + }, +}
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 8e1b251..a9c2d63 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -6740,6 +6740,21 @@ }, }, { + 'name': 'tryserver.chromium.win', + 'mixins': ['chromium-tester-service-account'], + 'machines': { + 'win_optional_gpu_tests_rel': { + 'os_type': 'win', + 'browser_config': 'release_x64', + 'test_suites': { + 'gpu_telemetry_tests': 'win_optional_gpu_tests_rel_gpu_telemetry_tests', + 'gtest_tests': 'win_optional_gpu_tests_rel_gtests', + 'isolated_scripts': 'win_optional_gpu_tests_rel_isolated_scripts', + }, + }, + }, + }, + { 'name': 'tryserver.devtools-frontend', 'mixins': ['chromium-tester-service-account'], 'machines': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 3d4547d..124b7cc 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -47,6 +47,25 @@ ] } ], + "AndroidContextualSearchM95": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled_With_Partial_Translate_20220509", + "params": { + "promo_card_max_shown": "3" + }, + "enable_features": [ + "ContextualSearchNewSettings", + "ContextualSearchTranslations" + ] + } + ] + } + ], "AndroidDynamicPerformanceFramework": [ { "platforms": [ @@ -4570,24 +4589,6 @@ ] } ], - "MacCAOverlayQuads": [ - { - "platforms": [ - "mac" - ], - "experiments": [ - { - "name": "Enabled_300", - "params": { - "MacCAOverlayQuadMaxNum": "300" - }, - "enable_features": [ - "MacCAOverlayQuads" - ] - } - ] - } - ], "MacWebContentsOcclusion": [ { "platforms": [ @@ -8544,25 +8545,6 @@ ] } ], - "WebRTC-TaskQueuePacer": [ - { - "platforms": [ - "windows", - "mac", - "chromeos", - "chromeos_lacros", - "linux", - "android", - "android_weblayer", - "android_webview" - ], - "experiments": [ - { - "name": "Enabled,holdback_window:5ms,holdback_packets:3,_1" - } - ] - } - ], "WebRTC-VP8ConferenceTemporalLayers": [ { "platforms": [
diff --git a/testing/xvfb_unittest.py b/testing/xvfb_unittest.py index 4d0ab08..f089f4b4 100755 --- a/testing/xvfb_unittest.py +++ b/testing/xvfb_unittest.py
@@ -53,37 +53,46 @@ super(XvfbLinuxTest, self).setUp() if not sys.platform.startswith('linux'): self.skipTest('linux only test') + self._procs = [] def test_no_xvfb_display(self): - proc = launch_process(['--no-xvfb']) - proc.wait() - display = read_subprocess_message(proc, 'Display :') + self._procs.append(launch_process(['--no-xvfb'])) + self._procs[0].wait() + display = read_subprocess_message(self._procs[0], 'Display :') self.assertEqual(display, os.environ.get('DISPLAY', 'None')) def test_xvfb_display(self): - proc = launch_process([]) - proc.wait() - display = read_subprocess_message(proc, 'Display :') - self.assertIsNotNone(display) + self._procs.append(launch_process([])) + self._procs[0].wait() + display = read_subprocess_message(self._procs[0], 'Display :') + self.assertIsNotNone(display) # Openbox likely failed to open DISPLAY self.assertNotEqual(display, os.environ.get('DISPLAY', 'None')) def test_no_xvfb_flag(self): - proc = launch_process(['--no-xvfb']) - proc.wait() + self._procs.append(launch_process(['--no-xvfb'])) + self._procs[0].wait() def test_xvfb_flag(self): - proc = launch_process([]) - proc.wait() + self._procs.append(launch_process([])) + self._procs[0].wait() def test_xvfb_race_condition(self): - proc_list = [launch_process([]) for _ in range(15)] - for proc in proc_list: + self._procs = [launch_process([]) for _ in range(15)] + for proc in self._procs: proc.wait() - display_list = [read_subprocess_message(p, 'Display :') for p in proc_list] + display_list = [read_subprocess_message(p, 'Display :') + for p in self._procs] for display in display_list: - self.assertIsNotNone(display) + self.assertIsNotNone(display) # Openbox likely failed to open DISPLAY self.assertNotEqual(display, os.environ.get('DISPLAY', 'None')) + def tearDown(self): + super(XvfbLinuxTest, self).tearDown() + for proc in self._procs: + if proc.stdout: + proc.stdout.close() + + class XvfbTest(unittest.TestCase): @@ -91,18 +100,27 @@ super(XvfbTest, self).setUp() if sys.platform == 'win32': self.skipTest('non-win32 test') + self._proc = None + def test_send_sigint(self): - proc = launch_process(['--sleep']) - send_signal(proc, signal.SIGINT, 1) - sig = read_subprocess_message(proc, 'Signal :') + self._proc = launch_process(['--sleep']) + send_signal(self._proc, signal.SIGINT, 1) + sig = read_subprocess_message(self._proc, 'Signal :') + self.assertIsNotNone(sig) # OpenBox likely failed to start self.assertEqual(int(sig), int(signal.SIGINT)) def test_send_sigterm(self): - proc = launch_process(['--sleep']) - send_signal(proc, signal.SIGTERM, 1) - sig = read_subprocess_message(proc, 'Signal :') + self._proc = launch_process(['--sleep']) + send_signal(self._proc, signal.SIGTERM, 1) + sig = read_subprocess_message(self._proc, 'Signal :') + self.assertIsNotNone(sig) # OpenBox likely failed to start self.assertEqual(int(sig), int(signal.SIGTERM)) + def tearDown(self): + super(XvfbTest, self).tearDown() + if self._proc.stdout: + self._proc.stdout.close() + if __name__ == '__main__': unittest.main()
diff --git a/third_party/blink/common/BUILD.gn b/third_party/blink/common/BUILD.gn index 18a2d577..7d355f2 100644 --- a/third_party/blink/common/BUILD.gn +++ b/third_party/blink/common/BUILD.gn
@@ -175,7 +175,6 @@ "mime_util/mime_util.cc", "mobile_metrics/mobile_friendliness.cc", "native_io/native_io_utils.cc", - "navigation/impression.cc", "navigation/impression_mojom_traits.cc", "navigation/navigation_params.cc", "navigation/navigation_policy.cc",
diff --git a/third_party/blink/common/navigation/impression.cc b/third_party/blink/common/navigation/impression.cc deleted file mode 100644 index 9409abc..0000000 --- a/third_party/blink/common/navigation/impression.cc +++ /dev/null
@@ -1,17 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/public/common/navigation/impression.h" - -namespace blink { - -Impression::Impression() = default; - -Impression::Impression(const Impression& other) = default; - -Impression& Impression::operator=(const Impression& other) = default; - -Impression::~Impression() = default; - -} // namespace blink
diff --git a/third_party/blink/common/navigation/impression_mojom_traits.cc b/third_party/blink/common/navigation/impression_mojom_traits.cc index 78e70f96..de08066 100644 --- a/third_party/blink/common/navigation/impression_mojom_traits.cc +++ b/third_party/blink/common/navigation/impression_mojom_traits.cc
@@ -4,23 +4,13 @@ #include "third_party/blink/public/common/navigation/impression_mojom_traits.h" -#include "build/build_config.h" - namespace mojo { // static bool StructTraits<blink::mojom::ImpressionDataView, blink::Impression>::Read( blink::mojom::ImpressionDataView data, blink::Impression* out) { - if (!data.ReadConversionDestination(&out->conversion_destination) || - !data.ReadReportingOrigin(&out->reporting_origin) || - !data.ReadExpiry(&out->expiry) || - !data.ReadAttributionSrcToken(&out->attribution_src_token)) - return false; - - out->impression_data = data.impression_data(); - out->priority = data.priority(); - return true; + return data.ReadAttributionSrcToken(&out->attribution_src_token); } } // namespace mojo
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn index 41e9ca5..fb24ad3 100644 --- a/third_party/blink/public/BUILD.gn +++ b/third_party/blink/public/BUILD.gn
@@ -126,7 +126,6 @@ "platform/child_url_loader_factory_bundle.h", "platform/cross_variant_mojo_util.h", "platform/file_path_conversion.h", - "platform/impression_conversions.h", "platform/interface_registry.h", "platform/internet_disconnected_web_url_loader.h", "platform/media/webmediaplayer_delegate.h", @@ -217,7 +216,6 @@ "platform/web_http_header_visitor.h", "platform/web_icon_sizes_parser.h", "platform/web_image_generator.h", - "platform/web_impression.h", "platform/web_inband_text_track.h", "platform/web_inband_text_track_client.h", "platform/web_input_event_result.h",
diff --git a/third_party/blink/public/common/navigation/impression.h b/third_party/blink/public/common/navigation/impression.h index 062b7c8..4a1b364 100644 --- a/third_party/blink/public/common/navigation/impression.h +++ b/third_party/blink/public/common/navigation/impression.h
@@ -5,13 +5,8 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_NAVIGATION_IMPRESSION_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_NAVIGATION_IMPRESSION_H_ -#include <stdint.h> - -#include "base/time/time.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/common/tokens/tokens.h" -#include "url/origin.h" namespace blink { @@ -21,38 +16,10 @@ // When an action is performed on the linked site at a later date, the // impression information is used to provide context about the initial // navigation that resulted in that action. -// -// Used for IPC transport of WebImpression. WebImpression cannot be used -// directly as it contains non-header-only blink types. struct BLINK_COMMON_EXPORT Impression { - Impression(); - Impression(const Impression& other); - Impression& operator=(const Impression& other); - ~Impression(); - - // Intended committed top-level origin of the resulting navigation. Must match - // the committed navigation's origin to be a valid impression. Declared by - // the impression tag. - url::Origin conversion_destination; - - // Optional origin that will receive all conversion measurement reports - // associated with this impression. Declared by the impression tag. - absl::optional<url::Origin> reporting_origin; - - // Data that will be sent in conversion reports to identify this impression. - // Declared by the impression tag. - uint64_t impression_data = 0UL; - - // Optional expiry specifying the amount of time this impression can convert. - // Declared by the impression tag. - absl::optional<base::TimeDelta> expiry; - - // Priority for the attribution source. Declared by the impression tag. - int64_t priority = 0; - - // Indicates the attributionsrc request associated with `this`, if any. If - // provided, data parameters should be used from the attributionsrc response. - absl::optional<AttributionSrcToken> attribution_src_token; + // Indicates the attributionsrc request associated with `this`. + // Data parameters will be used from the attributionsrc response. + AttributionSrcToken attribution_src_token; }; } // namespace blink
diff --git a/third_party/blink/public/common/navigation/impression_mojom_traits.h b/third_party/blink/public/common/navigation/impression_mojom_traits.h index 41e6e843..f60086a 100644 --- a/third_party/blink/public/common/navigation/impression_mojom_traits.h +++ b/third_party/blink/public/common/navigation/impression_mojom_traits.h
@@ -5,43 +5,19 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_COMMON_NAVIGATION_IMPRESSION_MOJOM_TRAITS_H_ #define THIRD_PARTY_BLINK_PUBLIC_COMMON_NAVIGATION_IMPRESSION_MOJOM_TRAITS_H_ -#include "build/build_config.h" -#include "mojo/public/cpp/base/time_mojom_traits.h" #include "mojo/public/cpp/bindings/struct_traits.h" -#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/common/navigation/impression.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/conversions/conversions.mojom.h" -#include "url/mojom/url_gurl_mojom_traits.h" namespace mojo { template <> struct BLINK_COMMON_EXPORT StructTraits<blink::mojom::ImpressionDataView, blink::Impression> { - static const url::Origin& conversion_destination(const blink::Impression& r) { - return r.conversion_destination; - } - - static const absl::optional<url::Origin>& reporting_origin( + static const blink::AttributionSrcToken& attribution_src_token( const blink::Impression& r) { - return r.reporting_origin; - } - - static uint64_t impression_data(const blink::Impression& r) { - return r.impression_data; - } - - static const absl::optional<base::TimeDelta>& expiry( - const blink::Impression& r) { - return r.expiry; - } - - static int64_t priority(const blink::Impression& r) { return r.priority; } - - static const absl::optional<blink::AttributionSrcToken>& - attribution_src_token(const blink::Impression& r) { return r.attribution_src_token; }
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 26520a62..7658949d 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -697,11 +697,8 @@ type AttributionReportingIssueType extends string enum PermissionPolicyDisabled - InvalidAttributionSourceEventId AttributionSourceUntrustworthyOrigin AttributionUntrustworthyOrigin - InvalidAttributionSourceExpiry - InvalidAttributionSourcePriority # Details for issues around "Attribution Reporting API" usage. # Explainer: https://github.com/WICG/conversion-measurement-api
diff --git a/third_party/blink/public/mojom/conversions/conversions.mojom b/third_party/blink/public/mojom/conversions/conversions.mojom index 9835d29..457ba12 100644 --- a/third_party/blink/public/mojom/conversions/conversions.mojom +++ b/third_party/blink/public/mojom/conversions/conversions.mojom
@@ -4,38 +4,15 @@ module blink.mojom; -import "mojo/public/mojom/base/time.mojom"; import "third_party/blink/public/mojom/conversions/attribution_data_host.mojom"; import "third_party/blink/public/mojom/tokens/tokens.mojom"; -import "url/mojom/origin.mojom"; // Mojo struct to represent blink::Impression native struct. struct Impression { - // Intended committed top-level origin of the resulting navigation. Must match - // the committed navigation's origin to be a valid impression. Declared by - // the impression tag. - url.mojom.Origin conversion_destination; - - // Optional origin that will receive all conversion measurement reports - // associated with this impression. Declared by the impression tag. - url.mojom.Origin? reporting_origin; - - // Data that will be sent in conversion reports to identify this impression. - // Declared by the impression tag. - uint64 impression_data; - - // Optional expiry specifying the amount of time this impression can convert. - // Declared by the impression tag. - mojo_base.mojom.TimeDelta? expiry; - - // Priority for the attribution source. 0 is used as a default if none is - // provided. - int64 priority = 0; - - // Indicates the attributionsrc request associated with `this`, if any. If - // provided, API parameters should be used from the the `AttributionDataHost` - // that is associated with `attribution_src_token` rather than from `this`. - AttributionSrcToken? attribution_src_token; + // Indicates the attributionsrc request associated with `this`. + // API parameters will be used from the the `AttributionDataHost` + // that is associated with `attribution_src_token`. + AttributionSrcToken attribution_src_token; }; // Sent from renderer to browser process when a resource request matching the
diff --git a/third_party/blink/public/platform/impression_conversions.h b/third_party/blink/public/platform/impression_conversions.h deleted file mode 100644 index f36ebead..0000000 --- a/third_party/blink/public/platform/impression_conversions.h +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_IMPRESSION_CONVERSIONS_H_ -#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_IMPRESSION_CONVERSIONS_H_ - -#include "third_party/blink/public/common/navigation/impression.h" -#include "third_party/blink/public/platform/web_common.h" -#include "third_party/blink/public/platform/web_impression.h" - -namespace blink { - -BLINK_PLATFORM_EXPORT blink::Impression ConvertWebImpressionToImpression( - const blink::WebImpression& web_impression); - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_IMPRESSION_CONVERSIONS_H_
diff --git a/third_party/blink/public/platform/web_impression.h b/third_party/blink/public/platform/web_impression.h deleted file mode 100644 index 40cd1602..0000000 --- a/third_party/blink/public/platform/web_impression.h +++ /dev/null
@@ -1,49 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMPRESSION_H_ -#define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMPRESSION_H_ - -#include <stdint.h> - -#include "base/time/time.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/common/tokens/tokens.h" -#include "third_party/blink/public/platform/web_security_origin.h" -#include "third_party/blink/public/platform/web_string.h" - -namespace blink { - -// Struct which contains all attributes declared by an impression anchor tag. -// This data is associated with a navigation created by clicking on an anchor -// tag which declares attributes for conversion measurement. -struct WebImpression { - // Origin declared by the impression which is the intended final top-level - // origin of the resulting navigation. - WebSecurityOrigin conversion_destination; - - // Optional origin that will receive all conversion measurement reports - // associated with this impression. Declared by the impression tag. - absl::optional<WebSecurityOrigin> reporting_origin; - - // Data that will be sent in conversion reports to identify this impression. - // Declared by the impression tag. - uint64_t impression_data = 0; - - // Optional expiry specifying the amount of time this impression can convert. - // Declared by the impression tag. - absl::optional<base::TimeDelta> expiry; - - // Priority for the attribution source. Declared by the impression tag. - // This is 64 bits to allow timestamps to be used as a prioirty. - int64_t priority = 0; - - // Indicates the attributionsrc request associated with `this`, if any. If - // provided, data parameters should be used from the attributionsrc response. - absl::optional<AttributionSrcToken> attribution_src_token; -}; - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_IMPRESSION_H_
diff --git a/third_party/blink/public/web/web_navigation_params.h b/third_party/blink/public/web/web_navigation_params.h index 65eb7ded..f8f5c15 100644 --- a/third_party/blink/public/web/web_navigation_params.h +++ b/third_party/blink/public/web/web_navigation_params.h
@@ -17,6 +17,7 @@ #include "services/network/public/mojom/web_client_hints_types.mojom-shared.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/frame/frame_policy.h" +#include "third_party/blink/public/common/navigation/impression.h" #include "third_party/blink/public/common/storage_key/storage_key.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/blob/blob_url_store.mojom-shared.h" @@ -29,7 +30,6 @@ #include "third_party/blink/public/platform/web_data.h" #include "third_party/blink/public/platform/web_fenced_frame_reporting.h" #include "third_party/blink/public/platform/web_http_body.h" -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/public/platform/web_navigation_body_loader.h" #include "third_party/blink/public/platform/web_policy_container.h" #include "third_party/blink/public/platform/web_security_origin.h" @@ -157,7 +157,7 @@ // Optional impression associated with this navigation. This is attached when // a navigation results from a click on an anchor tag that has conversion // measurement attributes. - absl::optional<WebImpression> impression; + absl::optional<Impression> impression; // The frame policy specified by the frame owner element. // For top-level window with no opener, this is the default lax FramePolicy.
diff --git a/third_party/blink/public/web/web_remote_frame_client.h b/third_party/blink/public/web/web_remote_frame_client.h index f611a81..c16a014 100644 --- a/third_party/blink/public/web/web_remote_frame_client.h +++ b/third_party/blink/public/web/web_remote_frame_client.h
@@ -10,7 +10,6 @@ #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/platform/cross_variant_mojo_util.h" -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/public/platform/web_security_origin.h" #include "third_party/blink/public/platform/web_touch_action.h" #include "third_party/blink/public/web/web_dom_message_event.h"
diff --git a/third_party/blink/public/web/web_view_client.h b/third_party/blink/public/web/web_view_client.h index 7b65e9d08..920db3f 100644 --- a/third_party/blink/public/web/web_view_client.h +++ b/third_party/blink/public/web/web_view_client.h
@@ -38,7 +38,6 @@ #include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h" #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/blink/public/mojom/page/page_visibility_state.mojom-forward.h" -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/public/platform/web_string.h" #include "third_party/blink/public/web/web_ax_enums.h" #include "third_party/blink/public/web/web_frame.h" @@ -47,6 +46,7 @@ namespace blink { +struct Impression; class WebURLRequest; class WebView; struct WebWindowFeatures; @@ -72,7 +72,7 @@ network::mojom::WebSandboxFlags, const SessionStorageNamespaceId& session_storage_namespace_id, bool& consumed_user_gesture, - const absl::optional<WebImpression>&) { + const absl::optional<Impression>&) { return nullptr; }
diff --git a/third_party/blink/public/web/web_window_features.h b/third_party/blink/public/web/web_window_features.h index 84d32491..3457016 100644 --- a/third_party/blink/public/web/web_window_features.h +++ b/third_party/blink/public/web/web_window_features.h
@@ -33,7 +33,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/platform/web_impression.h" +#include "third_party/blink/public/common/navigation/impression.h" namespace blink { @@ -67,7 +67,7 @@ // Represents the attribution source declared by Attribution Reporting related // window features, if any. - absl::optional<WebImpression> impression; + absl::optional<Impression> impression; }; } // namespace blink
diff --git a/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl b/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl index 66058e5b..db95081 100644 --- a/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl +++ b/third_party/blink/renderer/build/scripts/core/css/properties/templates/style_builder_functions.tmpl
@@ -374,11 +374,6 @@ {% call(property) apply_value(property) %} ComputedGridTrackList computed_grid_track_list; StyleBuilderConverter::ConvertGridTrackList(value, computed_grid_track_list, state); - const NamedGridAreaMap& named_grid_areas = state.Style()->NamedGridArea(); - if (!named_grid_areas.IsEmpty()) { - StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea( - named_grid_areas, computed_grid_track_list.named_grid_lines, kFor{{type}}s); - } state.Style()->SetGridTemplate{{type}}s(computed_grid_track_list); {% endcall %} {% endif %}
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc index e742a71..098c68c 100644 --- a/third_party/blink/renderer/core/animation/css/css_animations.cc +++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -1494,10 +1494,8 @@ bool any_transition_had_transition_all = false; const ComputedStyle* old_style = animating_element.GetComputedStyle(); - if (RuntimeEnabledFeatures::CSSDelayedAnimationUpdatesEnabled()) { - if (auto* data = PostStyleUpdateScope::CurrentAnimationData()) - old_style = data->GetOldStyle(animating_element); - } + if (auto* data = PostStyleUpdateScope::CurrentAnimationData()) + old_style = data->GetOldStyle(animating_element); if (!animation_style_recalc && style.Display() != EDisplay::kNone && old_style && !old_style->IsEnsuredInDisplayNone()) {
diff --git a/third_party/blink/renderer/core/css/container_query_test.cc b/third_party/blink/renderer/core/css/container_query_test.cc index 2973a50..75c7585 100644 --- a/third_party/blink/renderer/core/css/container_query_test.cc +++ b/third_party/blink/renderer/core/css/container_query_test.cc
@@ -533,8 +533,6 @@ } TEST_F(ContainerQueryTest, OldStyleForTransitions) { - ScopedCSSDelayedAnimationUpdatesForTest scoped(true); - Element* target = nullptr; SetBodyInnerHTML(R"HTML( @@ -606,8 +604,6 @@ } TEST_F(ContainerQueryTest, TransitionAppearingInFinalPass) { - ScopedCSSDelayedAnimationUpdatesForTest scoped(true); - SetBodyInnerHTML(R"HTML( <style> #container { @@ -679,8 +675,6 @@ } TEST_F(ContainerQueryTest, TransitionTemporarilyAppearing) { - ScopedCSSDelayedAnimationUpdatesForTest scoped(true); - SetBodyInnerHTML(R"HTML( <style> #container { @@ -749,8 +743,6 @@ } TEST_F(ContainerQueryTest, RedefiningAnimations) { - ScopedCSSDelayedAnimationUpdatesForTest scoped(true); - SetBodyInnerHTML(R"HTML( <style> @keyframes anim { @@ -825,8 +817,6 @@ } TEST_F(ContainerQueryTest, UnsetAnimation) { - ScopedCSSDelayedAnimationUpdatesForTest scoped(true); - SetBodyInnerHTML(R"HTML( <style> @keyframes anim { @@ -904,8 +894,6 @@ } TEST_F(ContainerQueryTest, OldStylesCount) { - ScopedCSSDelayedAnimationUpdatesForTest scoped(true); - // No container, no animation properties. EXPECT_EQ(0u, GetOldStylesCount(R"HTML( <div></div> @@ -1029,8 +1017,6 @@ } TEST_F(ContainerQueryTest, AllAnimationAffectingPropertiesInConditional) { - ScopedCSSDelayedAnimationUpdatesForTest scoped(true); - CSSPropertyID animation_affecting[] = { CSSPropertyID::kAll, CSSPropertyID::kAnimation,
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index de49bfe..7b2753f 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -2576,9 +2576,6 @@ keywords: ["auto", "min-content", "max-content"], typedom_types: ["Keyword", "Length", "Percentage", "Flex"], separator: " ", - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-auto-flow", @@ -2592,9 +2589,6 @@ converter: "ConvertGridAutoFlow", keywords: ["row", "column"], typedom_types: ["Keyword"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-auto-rows", @@ -2608,9 +2602,6 @@ keywords: ["auto", "min-content", "max-content"], typedom_types: ["Keyword", "Length", "Percentage", "Flex"], separator: " ", - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-column-end", @@ -2623,9 +2614,6 @@ keywords: ["auto"], typedom_types: ["Keyword"], converter: "ConvertGridPosition", - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-column-start", @@ -2638,9 +2626,6 @@ keywords: ["auto"], typedom_types: ["Keyword"], converter: "ConvertGridPosition", - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-row-end", @@ -2653,9 +2638,6 @@ keywords: ["auto"], typedom_types: ["Keyword"], converter: "ConvertGridPosition", - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-row-start", @@ -2668,9 +2650,6 @@ keywords: ["auto"], typedom_types: ["Keyword"], converter: "ConvertGridPosition", - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-template-areas", @@ -2678,9 +2657,6 @@ style_builder_custom_functions: ["initial", "inherit", "value"], keywords: ["none"], typedom_types: ["Keyword"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-template-columns", @@ -2697,9 +2673,6 @@ }, keywords: ["none"], typedom_types: ["Keyword"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-template-rows", @@ -2716,9 +2689,6 @@ }, keywords: ["none"], typedom_types: ["Keyword"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "height", @@ -6469,15 +6439,6 @@ ], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], layout_dependent: true, - // The flow with GridTemplateAreas::ApplyValue() and - // GridTemplate{Columns,Rows}::ApplyValue() is not idempotent: - // If you set grids twice, it may find a previous implicit - // named grid area, wrongly assume it was explicit, and thus set named - // grid lines as explicit, too. Since we don't want to track whether - // the grid was implicit or e.g. explicit from inheritance, we simply - // block out anything related to CSS grids from incremental updates. - supports_incremental_style: false, - idempotent: false, }, { name: "place-content", @@ -6501,56 +6462,36 @@ "grid-column-end" ], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-column", longhands: ["grid-column-start", "grid-column-end"], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-column-gap", longhands: ["column-gap"], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-row-gap", longhands: ["row-gap"], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "gap", longhands: ["row-gap", "column-gap"], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], - // See comment on grid. - supports_incremental_style: false, }, { name: "grid-gap", longhands: ["row-gap", "column-gap"], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-row", longhands: ["grid-row-start", "grid-row-end"], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "grid-template", @@ -6559,9 +6500,6 @@ ], property_methods: ["ParseShorthand", "CSSValueFromComputedStyleInternal"], layout_dependent: true, - // See comment on grid. - supports_incremental_style: false, - idempotent: false, }, { name: "inset",
diff --git a/third_party/blink/renderer/core/css/post_style_update_scope.cc b/third_party/blink/renderer/core/css/post_style_update_scope.cc index 5a437826..c3c36a3 100644 --- a/third_party/blink/renderer/core/css/post_style_update_scope.cc +++ b/third_party/blink/renderer/core/css/post_style_update_scope.cc
@@ -11,7 +11,6 @@ #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/dom/node_computed_style.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" namespace blink { @@ -19,8 +18,6 @@ PostStyleUpdateScope::AnimationData* PostStyleUpdateScope::CurrentAnimationData() { - if (!RuntimeEnabledFeatures::CSSDelayedAnimationUpdatesEnabled()) - return nullptr; return current_ ? ¤t_->animation_data_ : nullptr; } @@ -32,8 +29,7 @@ PostStyleUpdateScope::~PostStyleUpdateScope() { if (current_ == this) { - if (RuntimeEnabledFeatures::CSSDelayedAnimationUpdatesEnabled()) - Apply(); + Apply(); document_.ClearFocusedElementIfNeeded(); current_ = nullptr; }
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_test.cc b/third_party/blink/renderer/core/css/resolver/style_builder_test.cc index e71c66f4..8eb3fb2 100644 --- a/third_party/blink/renderer/core/css/resolver/style_builder_test.cc +++ b/third_party/blink/renderer/core/css/resolver/style_builder_test.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/renderer/core/css/css_identifier_value.h" #include "third_party/blink/renderer/core/css/css_inherited_value.h" #include "third_party/blink/renderer/core/css/css_initial_value.h" +#include "third_party/blink/renderer/core/css/css_test_helpers.h" #include "third_party/blink/renderer/core/css/resolver/style_resolver.h" #include "third_party/blink/renderer/core/css/resolver/style_resolver_state.h" #include "third_party/blink/renderer/core/css/scoped_css_value.h" @@ -106,4 +107,62 @@ EXPECT_TRUE(style->HasExplicitInheritance()); } +TEST_F(StyleBuilderTest, GridTemplateAreasApplyOrder) { + const CSSProperty& grid_template_areas = GetCSSPropertyGridTemplateAreas(); + const CSSProperty& grid_template_rows = GetCSSPropertyGridTemplateRows(); + const CSSProperty& grid_template_columns = + GetCSSPropertyGridTemplateColumns(); + + const CSSValue* grid_template_areas_value = css_test_helpers::ParseLonghand( + GetDocument(), grid_template_areas, "'foo' 'bar' 'baz' 'faz'"); + const CSSValue* grid_template_columns_value = css_test_helpers::ParseLonghand( + GetDocument(), grid_template_columns, "50px 50px"); + const CSSValue* grid_template_rows_value = css_test_helpers::ParseLonghand( + GetDocument(), grid_template_rows, "50px 50px"); + + ASSERT_TRUE(grid_template_areas_value); + ASSERT_TRUE(grid_template_columns_value); + ASSERT_TRUE(grid_template_rows_value); + + scoped_refptr<ComputedStyle> parent_style = + GetDocument().GetStyleResolver().CreateComputedStyle(); + StyleResolverState state(GetDocument(), *GetDocument().body(), + StyleRecalcContext(), + StyleRequest(parent_style.get())); + + scoped_refptr<ComputedStyle> style1; + scoped_refptr<ComputedStyle> style2; + + // grid-template-areas applied first. + state.SetStyle(ComputedStyle::Clone(*parent_style)); + StyleBuilder::ApplyProperty( + grid_template_areas, state, + ScopedCSSValue(*grid_template_areas_value, nullptr)); + StyleBuilder::ApplyProperty( + grid_template_columns, state, + ScopedCSSValue(*grid_template_columns_value, nullptr)); + StyleBuilder::ApplyProperty( + grid_template_rows, state, + ScopedCSSValue(*grid_template_rows_value, nullptr)); + style1 = state.TakeStyle(); + + // grid-template-areas applied last. + state.SetStyle(ComputedStyle::Clone(*parent_style)); + StyleBuilder::ApplyProperty( + grid_template_columns, state, + ScopedCSSValue(*grid_template_columns_value, nullptr)); + StyleBuilder::ApplyProperty( + grid_template_rows, state, + ScopedCSSValue(*grid_template_rows_value, nullptr)); + StyleBuilder::ApplyProperty( + grid_template_areas, state, + ScopedCSSValue(*grid_template_areas_value, nullptr)); + style2 = state.TakeStyle(); + + ASSERT_TRUE(style1); + ASSERT_TRUE(style2); + EXPECT_EQ(*style1, *style2) + << "Application order of grid properties does not affect result"; +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/style_resolver.cc b/third_party/blink/renderer/core/css/resolver/style_resolver.cc index 0e8e204..ff6d19014 100644 --- a/third_party/blink/renderer/core/css/resolver/style_resolver.cc +++ b/third_party/blink/renderer/core/css/resolver/style_resolver.cc
@@ -148,11 +148,9 @@ void SetAnimationUpdateIfNeeded(const StyleRecalcContext& style_recalc_context, StyleResolverState& state, Element& element) { - if (RuntimeEnabledFeatures::CSSDelayedAnimationUpdatesEnabled()) { - if (auto* data = PostStyleUpdateScope::CurrentAnimationData()) { - if (ShouldStoreOldStyle(style_recalc_context, state)) - data->StoreOldStyleIfNeeded(element); - } + if (auto* data = PostStyleUpdateScope::CurrentAnimationData()) { + if (ShouldStoreOldStyle(style_recalc_context, state)) + data->StoreOldStyleIfNeeded(element); } // If any changes to CSS Animations were detected, stash the update away for @@ -161,13 +159,8 @@ if (!ShouldSetPendingUpdate(state, element)) return; - if (RuntimeEnabledFeatures::CSSDelayedAnimationUpdatesEnabled()) { - if (auto* data = PostStyleUpdateScope::CurrentAnimationData()) - data->SetPendingUpdate(element, state.AnimationUpdate()); - } else { - element.EnsureElementAnimations().CssAnimations().SetPendingUpdate( - state.AnimationUpdate()); - } + if (auto* data = PostStyleUpdateScope::CurrentAnimationData()) + data->SetPendingUpdate(element, state.AnimationUpdate()); } bool HasAnimationsOrTransitions(const StyleResolverState& state) {
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.cc b/third_party/blink/renderer/core/display_lock/display_lock_context.cc index 7da5f943..494494e 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.cc
@@ -24,6 +24,7 @@ #include "third_party/blink/renderer/core/frame/local_frame_view.h" #include "third_party/blink/renderer/core/html/html_object_element.h" #include "third_party/blink/renderer/core/html_element_type_helpers.h" +#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h" #include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/page/page.h" @@ -45,6 +46,9 @@ "Element has unsupported display type (display: contents)."; } // namespace rejection_names +const char kForcedRendering[] = + "Rendering was performed in a subtree hidden by content-visibility:hidden."; + ScrollableArea* GetScrollableArea(Node* node) { if (!node) return nullptr; @@ -478,7 +482,8 @@ return IsActivatable(reason) && IsLocked(); } -void DisplayLockContext::NotifyForcedUpdateScopeStarted(ForcedPhase phase) { +void DisplayLockContext::NotifyForcedUpdateScopeStarted(ForcedPhase phase, + bool emit_warnings) { forced_info_.start(phase); if (IsLocked()) { // Now that the update is forced, we should ensure that style layout, and @@ -496,6 +501,20 @@ MarkForLayoutIfNeeded(); if (forced_info_.is_forced(ForcedPhase::kPrePaint)) MarkAncestorsForPrePaintIfNeeded(); + + if (emit_warnings && v8::Isolate::GetCurrent()->InContext() && + !IsActivatable(DisplayLockActivationReason::kAny) && document_ && + element_) { + // Note that this is a verbose level message, since it can happen + // frequently and is not necessarily a problem if the developer is + // accessing content-visibility: hidden subtrees intentionally. + auto* console_message = MakeGarbageCollected<ConsoleMessage>( + mojom::blink::ConsoleMessageSource::kJavaScript, + mojom::blink::ConsoleMessageLevel::kVerbose, kForcedRendering); + console_message->SetNodes(document_->GetFrame(), + {DOMNodeIds::IdForNode(element_)}); + document_->AddConsoleMessage(console_message); + } } }
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context.h b/third_party/blink/renderer/core/display_lock/display_lock_context.h index de7711c..4b8af7c 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_context.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_context.h
@@ -237,7 +237,7 @@ void RequestUnlock(); // Called in |DisplayLockUtilities| to notify the state of scope. - void NotifyForcedUpdateScopeStarted(ForcedPhase phase); + void NotifyForcedUpdateScopeStarted(ForcedPhase phase, bool emit_warnings); void NotifyForcedUpdateScopeEnded(ForcedPhase phase); // Records the locked context counts on the document as well as context that
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc index 04fc525..b5320121 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc +++ b/third_party/blink/renderer/core/display_lock/display_lock_utilities.cc
@@ -16,7 +16,6 @@ #include "third_party/blink/renderer/core/editing/editing_boundary.h" #include "third_party/blink/renderer/core/editing/editing_utilities.h" #include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/core/inspector/inspector_trace_events.h" #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" #include "third_party/blink/renderer/core/layout/layout_shift_tracker.h" @@ -31,20 +30,6 @@ namespace { -void WarnOnForcedUpdateInNonActivatableContext(Document& document) { - if (!v8::Isolate::GetCurrent()->InContext()) - return; - String message = - "Rendering was performed in a subtree hidden by " - "content-visibility:hidden."; - // Note that this is a verbose level message, since it can happen - // frequently and is not necessarily a problem if the developer is - // accessing content-visibility: hidden subtrees intentionally. - document.AddConsoleMessage(MakeGarbageCollected<ConsoleMessage>( - mojom::blink::ConsoleMessageSource::kJavaScript, - mojom::blink::ConsoleMessageLevel::kVerbose, message)); -} - // Returns the nearest non-inclusive ancestor of |node| that is display // locked. Element* NearestLockedExclusiveAncestor(const Node& node) { @@ -250,8 +235,12 @@ DisplayLockUtilities::ScopedForcedUpdate::Impl::Impl( const Range* range, DisplayLockContext::ForcedPhase phase, - bool only_cv_auto) - : node_(range->FirstNode()), phase_(phase), only_cv_auto_(only_cv_auto) { + bool only_cv_auto, + bool emit_warnings) + : node_(range->FirstNode()), + phase_(phase), + only_cv_auto_(only_cv_auto), + emit_warnings_(emit_warnings) { if (!node_) return; @@ -306,11 +295,7 @@ } } for (DisplayLockContext* context : forced_context_set_) { - if (context->IsLocked() && - !context->IsActivatable(DisplayLockActivationReason::kAny)) { - WarnOnForcedUpdateInNonActivatableContext(node_->GetDocument()); - } - context->NotifyForcedUpdateScopeStarted(phase_); + context->NotifyForcedUpdateScopeStarted(phase_, emit_warnings_); } } @@ -320,7 +305,10 @@ bool include_self, bool only_cv_auto, bool emit_warnings) - : node_(node), phase_(phase), only_cv_auto_(only_cv_auto) { + : node_(node), + phase_(phase), + only_cv_auto_(only_cv_auto), + emit_warnings_(emit_warnings) { if (!node_) return; @@ -365,10 +353,6 @@ if (!ancestor_node) continue; if (auto* context = ancestor_node->GetDisplayLockContext()) { - if (emit_warnings && context->IsLocked() && - !context->IsActivatable(DisplayLockActivationReason::kAny)) { - WarnOnForcedUpdateInNonActivatableContext(node->GetDocument()); - } ForceDisplayLockIfNeeded(context); } } @@ -381,7 +365,7 @@ return; for (auto context : forced_context_set_) { context->NotifyForcedUpdateScopeEnded(phase_); - context->NotifyForcedUpdateScopeStarted(phase); + context->NotifyForcedUpdateScopeStarted(phase, emit_warnings_); } phase_ = phase; } @@ -409,7 +393,7 @@ if (!only_cv_auto_ || context->IsActivatable(DisplayLockActivationReason::kViewport)) { forced_context_set_.insert(context); - context->NotifyForcedUpdateScopeStarted(phase_); + context->NotifyForcedUpdateScopeStarted(phase_, emit_warnings_); } }
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_utilities.h b/third_party/blink/renderer/core/display_lock/display_lock_utilities.h index 439990ac..6f66fde 100644 --- a/third_party/blink/renderer/core/display_lock/display_lock_utilities.h +++ b/third_party/blink/renderer/core/display_lock/display_lock_utilities.h
@@ -84,7 +84,8 @@ emit_warnings)) {} explicit ScopedForcedUpdate(const Range* range, DisplayLockContext::ForcedPhase phase, - bool only_cv_auto = false) + bool only_cv_auto = false, + bool emit_warnings = true) : impl_(MakeGarbageCollected<Impl>(range, phase)) {} friend class DisplayLockDocumentState; @@ -98,7 +99,8 @@ bool emit_warnings = true); Impl(const Range* range, DisplayLockContext::ForcedPhase phase, - bool only_cv_auto = false); + bool only_cv_auto = false, + bool emit_warnings = true); // Adds another display-lock scope to this chain. Added when a new lock is // created in the ancestor chain of this chain's node. @@ -122,6 +124,7 @@ HeapHashSet<Member<DisplayLockContext>> forced_context_set_; Member<Impl> parent_frame_impl_; bool only_cv_auto_; + bool emit_warnings_; }; Impl* impl_ = nullptr;
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 480e27b..5a9afbf4 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3405,12 +3405,6 @@ return nullptr; } - if (ElementAnimations* element_animations = GetElementAnimations()) { - // See also PostStyleUpdateScope. - if (!RuntimeEnabledFeatures::CSSDelayedAnimationUpdatesEnabled()) - element_animations->CssAnimations().MaybeApplyPendingUpdate(this); - } - style->UpdateIsStackingContextWithoutContainment( this == GetDocument().documentElement(), IsInTopLayer(), IsA<SVGForeignObjectElement>(*this));
diff --git a/third_party/blink/renderer/core/dom/element.idl b/third_party/blink/renderer/core/dom/element.idl index 9eda33b..0cfe351 100644 --- a/third_party/blink/renderer/core/dom/element.idl +++ b/third_party/blink/renderer/core/dom/element.idl
@@ -149,7 +149,7 @@ // The Popup API [MeasureAs=ElementShowPopup,RuntimeEnabled=HTMLPopupAttribute,RaisesException] void showPopup(); [MeasureAs=ElementHidePopup,RuntimeEnabled=HTMLPopupAttribute,RaisesException] void hidePopup(); - [Unscopable,CEReactions,RuntimeEnabled=HTMLPopupAttribute,Reflect] attribute DOMString popup; + [Unscopable,CEReactions,RuntimeEnabled=HTMLPopupAttribute,Reflect,ReflectOnly=("popup","hint","async"),ReflectMissing="",ReflectInvalid=""] attribute DOMString popup; [CEReactions,RuntimeEnabled=HTMLPopupAttribute,Reflect] attribute boolean defaultOpen; // Experimental accessibility API
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc index 0fc1b1d3..80880220 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -3824,7 +3824,7 @@ network::mojom::blink::WebSandboxFlags, const SessionStorageNamespaceId&, bool& consumed_user_gesture, - const absl::optional<WebImpression>&) override { + const absl::optional<Impression>&) override { return web_view_helper_.InitializeWithOpener(opener); } void DidFocus() override { did_focus_called_ = true; } @@ -3907,7 +3907,7 @@ network::mojom::blink::WebSandboxFlags, const SessionStorageNamespaceId&, bool& consumed_user_gesture, - const absl::optional<WebImpression>&) override { + const absl::optional<Impression>&) override { return web_view_; }
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.cc b/third_party/blink/renderer/core/frame/attribution_src_loader.cc index e2222e4..f6cfe4c 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.cc +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.cc
@@ -13,12 +13,12 @@ #include "mojo/public/cpp/bindings/remote.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" +#include "third_party/blink/public/common/navigation/impression.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/conversions/attribution_data_host.mojom-blink.h" #include "third_party/blink/public/mojom/conversions/conversions.mojom-blink.h" #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/renderer/core/frame/attribution_response_parsing.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" @@ -177,7 +177,7 @@ return result; } -absl::optional<WebImpression> AttributionSrcLoader::RegisterNavigation( +absl::optional<Impression> AttributionSrcLoader::RegisterNavigation( const KURL& src_url, HTMLElement* element) { // TODO(apaseltiner): Add tests to ensure that this method can't be used to @@ -190,9 +190,8 @@ return absl::nullopt; DCHECK(client->attribution_src_token()); - blink::WebImpression source; - source.attribution_src_token = client->attribution_src_token(); - return source; + return blink::Impression{.attribution_src_token = + *client->attribution_src_token()}; } AttributionSrcLoader::ResourceClient*
diff --git a/third_party/blink/renderer/core/frame/attribution_src_loader.h b/third_party/blink/renderer/core/frame/attribution_src_loader.h index acbaad5..e70ca62 100644 --- a/third_party/blink/renderer/core/frame/attribution_src_loader.h +++ b/third_party/blink/renderer/core/frame/attribution_src_loader.h
@@ -23,7 +23,8 @@ class LocalFrame; class ResourceRequest; class ResourceResponse; -struct WebImpression; + +struct Impression; class CORE_EXPORT AttributionSrcLoader : public GarbageCollected<AttributionSrcLoader> { @@ -56,12 +57,11 @@ const ResourceResponse& response); // Registers an attributionsrc which is associated with a top-level - // navigation, for example a click on an anchor tag. Returns a WebImpression + // navigation, for example a click on an anchor tag. Returns an Impression // which identifies the attributionsrc request and notifies the browser to // begin tracking it. - absl::optional<WebImpression> RegisterNavigation( - const KURL& attribution_src, - HTMLElement* element = nullptr); + absl::optional<Impression> RegisterNavigation(const KURL& attribution_src, + HTMLElement* element = nullptr); void Trace(Visitor* visitor) const;
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc index a62b2353..cd03746 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -942,7 +942,7 @@ network::mojom::blink::WebSandboxFlags, const SessionStorageNamespaceId&, bool& consumed_user_gesture, - const absl::optional<WebImpression>&) { + const absl::optional<Impression>&) { auto webview_helper = std::make_unique<WebViewHelper>(); WebView* result = webview_helper->InitializeWithOpener(opener); child_web_views_.push_back(std::move(webview_helper));
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h index bd5b3f04..b95e93a 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.h +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -299,7 +299,7 @@ network::mojom::blink::WebSandboxFlags, const SessionStorageNamespaceId&, bool& consumed_user_gesture, - const absl::optional<WebImpression>&) override; + const absl::optional<Impression>&) override; private: WTF::Vector<std::unique_ptr<WebViewHelper>> child_web_views_;
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc index a1804ac..47eb4bf 100644 --- a/third_party/blink/renderer/core/frame/local_dom_window.cc +++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -100,7 +100,6 @@ #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/frame/viewport_data.h" #include "third_party/blink/renderer/core/frame/visual_viewport.h" -#include "third_party/blink/renderer/core/html/conversion_measurement_parsing.h" #include "third_party/blink/renderer/core/html/custom/custom_element_registry.h" #include "third_party/blink/renderer/core/html/fenced_frame/fence.h" #include "third_party/blink/renderer/core/html/forms/form_controller.h"
diff --git a/third_party/blink/renderer/core/frame/local_frame_client.h b/third_party/blink/renderer/core/frame/local_frame_client.h index 8107267..6fb2409 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client.h +++ b/third_party/blink/renderer/core/frame/local_frame_client.h
@@ -54,7 +54,6 @@ #include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h" #include "third_party/blink/public/platform/web_content_settings_client.h" #include "third_party/blink/public/platform/web_effective_connection_type.h" -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/public/platform/web_worker_fetch_context.h" #include "third_party/blink/public/web/web_frame_load_type.h" #include "third_party/blink/public/web/web_history_commit_type.h" @@ -110,6 +109,7 @@ class WebTextCheckClient; class ResourceLoadInfoNotifierWrapper; enum class SyncCondition; +struct Impression; struct MobileFriendliness; class CORE_EXPORT LocalFrameClient : public FrameClient { @@ -172,7 +172,7 @@ mojo::PendingRemote<mojom::blink::BlobURLToken>, base::TimeTicks input_start_time, const String& href_translate, - const absl::optional<WebImpression>& impression, + const absl::optional<Impression>& impression, const LocalFrameToken* initiator_frame_token, std::unique_ptr<SourceLocation> source_location, mojo::PendingRemote<mojom::blink::PolicyContainerHostKeepAliveHandle>
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc index 354c8c50..40042e1 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client_impl.cc +++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.cc
@@ -506,7 +506,7 @@ mojo::PendingRemote<mojom::blink::BlobURLToken> blob_url_token, base::TimeTicks input_start_time, const String& href_translate, - const absl::optional<WebImpression>& impression, + const absl::optional<Impression>& impression, const LocalFrameToken* initiator_frame_token, std::unique_ptr<SourceLocation> source_location, mojo::PendingRemote<mojom::blink::PolicyContainerHostKeepAliveHandle>
diff --git a/third_party/blink/renderer/core/frame/local_frame_client_impl.h b/third_party/blink/renderer/core/frame/local_frame_client_impl.h index 7af12804..1f929d9 100644 --- a/third_party/blink/renderer/core/frame/local_frame_client_impl.h +++ b/third_party/blink/renderer/core/frame/local_frame_client_impl.h
@@ -130,7 +130,7 @@ mojo::PendingRemote<mojom::blink::BlobURLToken>, base::TimeTicks input_start_time, const String& href_translate, - const absl::optional<WebImpression>& impression, + const absl::optional<Impression>& impression, const LocalFrameToken* initiator_frame_token, std::unique_ptr<SourceLocation> source_location, mojo::PendingRemote<mojom::blink::PolicyContainerHostKeepAliveHandle>
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc index 604aafc..224cfd8 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.cc +++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -16,7 +16,6 @@ #include "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom-blink.h" #include "third_party/blink/public/mojom/loader/referrer.mojom-blink.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink.h" -#include "third_party/blink/public/platform/impression_conversions.h" #include "third_party/blink/public/platform/interface_registry.h" #include "third_party/blink/public/platform/platform.h" #include "third_party/blink/public/platform/url_conversion.h" @@ -292,10 +291,7 @@ params->source_location->column = source_location->ColumnNumber(); } - if (frame_request.Impression()) { - params->impression = - blink::ConvertWebImpressionToImpression(*frame_request.Impression()); - } + params->impression = frame_request.Impression(); // Note: For the AdFrame/Sandbox download policy here it only covers the case // where the navigation initiator frame is ad. The download_policy may be
diff --git a/third_party/blink/renderer/core/frame/remote_frame_client.h b/third_party/blink/renderer/core/frame/remote_frame_client.h index 4fa5f89..f2218e2 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_client.h +++ b/third_party/blink/renderer/core/frame/remote_frame_client.h
@@ -7,7 +7,6 @@ #include "cc/paint/paint_canvas.h" #include "third_party/blink/public/common/tokens/tokens.h" -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/public/web/web_frame_load_type.h" #include "third_party/blink/renderer/core/frame/frame_client.h" #include "third_party/blink/renderer/core/frame/frame_types.h"
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc index 5180e24f..212d624 100644 --- a/third_party/blink/renderer/core/frame/web_frame_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -7478,7 +7478,7 @@ network::mojom::blink::WebSandboxFlags, const SessionStorageNamespaceId&, bool& consumed_user_gesture, - const absl::optional<WebImpression>&) override { + const absl::optional<Impression>&) override { EXPECT_TRUE(false); return nullptr; }
diff --git a/third_party/blink/renderer/core/html/build.gni b/third_party/blink/renderer/core/html/build.gni index 30eaac3..1220fd9 100644 --- a/third_party/blink/renderer/core/html/build.gni +++ b/third_party/blink/renderer/core/html/build.gni
@@ -45,8 +45,6 @@ "closewatcher/close_watcher.h", "collection_items_cache.h", "collection_type.h", - "conversion_measurement_parsing.cc", - "conversion_measurement_parsing.h", "cross_origin_attribute.cc", "cross_origin_attribute.h", "custom/ce_reactions_scope.cc",
diff --git a/third_party/blink/renderer/core/html/conversion_measurement_parsing.cc b/third_party/blink/renderer/core/html/conversion_measurement_parsing.cc deleted file mode 100644 index 83d2882b..0000000 --- a/third_party/blink/renderer/core/html/conversion_measurement_parsing.cc +++ /dev/null
@@ -1,199 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/html/conversion_measurement_parsing.h" - -#include <stdint.h> - -#include "base/metrics/histogram_macros.h" -#include "base/time/time.h" -#include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-blink.h" -#include "third_party/blink/public/platform/web_impression.h" -#include "third_party/blink/renderer/core/execution_context/execution_context.h" -#include "third_party/blink/renderer/core/execution_context/security_context.h" -#include "third_party/blink/renderer/core/frame/frame.h" -#include "third_party/blink/renderer/core/frame/local_dom_window.h" -#include "third_party/blink/renderer/core/frame/local_frame.h" -#include "third_party/blink/renderer/core/frame/web_feature.h" -#include "third_party/blink/renderer/core/html/html_anchor_element.h" -#include "third_party/blink/renderer/core/html_names.h" -#include "third_party/blink/renderer/core/inspector/inspector_audits_issue.h" -#include "third_party/blink/renderer/platform/instrumentation/use_counter.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" -#include "third_party/blink/renderer/platform/weborigin/security_origin.h" - -namespace blink { - -namespace { - -absl::optional<int64_t> ParseInt64(const String& string, - LocalFrame* frame, - HTMLElement* element, - AttributionReportingIssueType issue_type) { - if (string.IsNull()) - return absl::nullopt; - - bool valid = false; - int64_t value = string.ToInt64Strict(&valid); - - if (valid) - return value; - - if (frame) { - AuditsIssue::ReportAttributionIssue(frame->DomWindow(), issue_type, - frame->GetDevToolsFrameToken(), element, - absl::nullopt, string); - } - - return absl::nullopt; -} - -absl::optional<int64_t> ParseExpiry(const String& string, - LocalFrame* frame, - HTMLElement* element = nullptr) { - return ParseInt64( - string, frame, element, - AttributionReportingIssueType::kInvalidAttributionSourceExpiry); -} - -absl::optional<int64_t> ParsePriority(const String& string, - LocalFrame* frame, - HTMLElement* element = nullptr) { - return ParseInt64( - string, frame, element, - AttributionReportingIssueType::kInvalidAttributionSourcePriority); -} - -LocalFrame* GetFrame(ExecutionContext* execution_context) { - auto* window = DynamicTo<LocalDOMWindow>(execution_context); - return window ? window->GetFrame() : nullptr; -} - -absl::optional<WebImpression> GetImpression( - ExecutionContext* execution_context, - const String& impression_data_string, - const String& conversion_destination_string, - const String& reporting_origin_string, - absl::optional<int64_t> impression_expiry_milliseconds, - absl::optional<int64_t> attribution_source_priority, - HTMLAnchorElement* element) { - if (!RuntimeEnabledFeatures::ConversionMeasurementEnabled( - execution_context)) { - return absl::nullopt; - } - - LocalFrame* frame = GetFrame(execution_context); - if (!frame) { - return absl::nullopt; - } - - const bool feature_policy_enabled = execution_context->IsFeatureEnabled( - mojom::blink::PermissionsPolicyFeature::kAttributionReporting); - UMA_HISTOGRAM_BOOLEAN("Conversions.ImpressionIgnoredByFeaturePolicy", - !feature_policy_enabled); - - if (!feature_policy_enabled) { - AuditsIssue::ReportAttributionIssue( - frame->DomWindow(), - AttributionReportingIssueType::kPermissionPolicyDisabled, - frame->GetDevToolsFrameToken(), element); - return absl::nullopt; - } - - // Conversion measurement is only allowed in secure context. - if (!execution_context->IsSecureContext()) { - AuditsIssue::ReportAttributionIssue( - frame->DomWindow(), - AttributionReportingIssueType::kAttributionSourceUntrustworthyOrigin, - frame->GetDevToolsFrameToken(), element, absl::nullopt, - frame->GetSecurityContext()->GetSecurityOrigin()->ToString()); - return absl::nullopt; - } - - scoped_refptr<const SecurityOrigin> conversion_destination = - SecurityOrigin::CreateFromString(conversion_destination_string); - if (!conversion_destination->IsPotentiallyTrustworthy()) { - AuditsIssue::ReportAttributionIssue( - frame->DomWindow(), - AttributionReportingIssueType::kAttributionSourceUntrustworthyOrigin, - absl::nullopt, element, absl::nullopt, conversion_destination_string); - return absl::nullopt; - } - - bool impression_data_is_valid = false; - uint64_t impression_data = - impression_data_string.ToUInt64Strict(&impression_data_is_valid); - - // For source registrations where there is no mechanism to raise an error, - // such as on an anchor element, it is more useful to log the source with - // default data so that a reporting origin can learn the failure mode. - if (!impression_data_is_valid) { - AuditsIssue::ReportAttributionIssue( - frame->DomWindow(), - AttributionReportingIssueType::kInvalidAttributionSourceEventId, - frame->GetDevToolsFrameToken(), element, absl::nullopt, - impression_data_string); - } - - // Provide a default of 0 if the impression data was not valid. - impression_data = impression_data_is_valid ? impression_data : 0UL; - - // Reporting origin is an optional attribute. Reporting origins must be - // secure. - absl::optional<WebSecurityOrigin> reporting_origin; - if (!reporting_origin_string.IsNull()) { - reporting_origin = - SecurityOrigin::CreateFromString(reporting_origin_string); - - if (!reporting_origin->IsPotentiallyTrustworthy()) { - AuditsIssue::ReportAttributionIssue( - frame->DomWindow(), - AttributionReportingIssueType::kAttributionSourceUntrustworthyOrigin, - absl::nullopt, element, absl::nullopt, reporting_origin_string); - return absl::nullopt; - } - } - - absl::optional<base::TimeDelta> expiry; - if (impression_expiry_milliseconds) - expiry = base::Milliseconds(*impression_expiry_milliseconds); - - UseCounter::Count(execution_context, - mojom::blink::WebFeature::kConversionAPIAll); - UseCounter::Count(execution_context, - mojom::blink::WebFeature::kImpressionRegistration); - - return WebImpression{conversion_destination, reporting_origin, - impression_data, expiry, - attribution_source_priority.value_or(0)}; -} - -} // namespace - -absl::optional<WebImpression> GetImpressionForAnchor( - HTMLAnchorElement* element) { - DCHECK(element->FastHasAttribute(html_names::kAttributiondestinationAttr)); - DCHECK(element->FastHasAttribute(html_names::kAttributionsourceeventidAttr)); - - LocalFrame* frame = GetFrame(element->GetExecutionContext()); - - return GetImpression( - element->GetExecutionContext(), - element->FastGetAttribute(html_names::kAttributionsourceeventidAttr) - .GetString(), - element->FastGetAttribute(html_names::kAttributiondestinationAttr) - .GetString(), - element->FastGetAttribute(html_names::kAttributionreporttoAttr) - .GetString(), - ParseExpiry(element->FastGetAttribute(html_names::kAttributionexpiryAttr) - .GetString(), - frame, element), - ParsePriority( - element->FastGetAttribute(html_names::kAttributionsourcepriorityAttr) - .GetString(), - frame, element), - element); -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/html/conversion_measurement_parsing.h b/third_party/blink/renderer/core/html/conversion_measurement_parsing.h deleted file mode 100644 index 8172576..0000000 --- a/third_party/blink/renderer/core/html/conversion_measurement_parsing.h +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CONVERSION_MEASUREMENT_PARSING_H_ -#define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CONVERSION_MEASUREMENT_PARSING_H_ - -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace blink { - -class HTMLAnchorElement; - -struct WebImpression; - -// Returns the WebImpression struct with all data declared by impression -// related attributes on |element|. If the impression attributes do not contain -// allowed values, absl::nullopt is returned. -absl::optional<WebImpression> GetImpressionForAnchor( - HTMLAnchorElement* element); - -} // namespace blink - -#endif // THIRD_PARTY_BLINK_RENDERER_CORE_HTML_CONVERSION_MEASUREMENT_PARSING_H_
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc index 4f6dbdb..46ed344 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.cc +++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -43,7 +43,6 @@ #include "third_party/blink/renderer/core/frame/local_frame_client.h" #include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/html/anchor_element_metrics_sender.h" -#include "third_party/blink/renderer/core/html/conversion_measurement_parsing.h" #include "third_party/blink/renderer/core/html/html_image_element.h" #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h" #include "third_party/blink/renderer/core/html_names.h" @@ -362,11 +361,6 @@ return IsLink() && !HasEditableStyle(*this); } -bool HTMLAnchorElement::HasImpression() const { - return hasAttribute(html_names::kAttributionsourceeventidAttr) && - hasAttribute(html_names::kAttributiondestinationAttr); -} - void HTMLAnchorElement::SendPings(const KURL& destination_url) const { const AtomicString& ping_value = FastGetAttribute(html_names::kPingAttr); if (ping_value.IsNull() || !GetDocument().GetSettings() || @@ -520,7 +514,8 @@ frame->MaybeLogAdClickNavigation(); - if (request.HasUserGesture()) { + if (request.HasUserGesture() && + FastHasAttribute(html_names::kAttributionsrcAttr)) { // An impression must be attached prior to the // FindOrCreateFrameForNavigation() call, as that call may result in // performing a navigation if the call results in creating a new window with @@ -530,22 +525,14 @@ // set `target_frame` to `frame`, but end up targeting a new window. // Attach the impression regardless, the embedder will be able to drop // impressions for subframe navigations. - absl::optional<WebImpression> impression; - // Favor the attributionsrc API over the html attribute data API for - // Attribution Reporting. - if (FastHasAttribute(html_names::kAttributionsrcAttr)) { - const AtomicString& attribution_src_value = - FastGetAttribute(html_names::kAttributionsrcAttr); - if (!attribution_src_value.IsNull()) { - impression = frame->GetAttributionSrcLoader()->RegisterNavigation( - GetDocument().CompleteURL(attribution_src_value), this); - } - } else if (HasImpression()) { - impression = GetImpressionForAnchor(this); + const AtomicString& attribution_src_value = + FastGetAttribute(html_names::kAttributionsrcAttr); + if (!attribution_src_value.IsNull()) { + frame_request.SetImpression( + frame->GetAttributionSrcLoader()->RegisterNavigation( + GetDocument().CompleteURL(attribution_src_value), this)); } - if (impression) - frame_request.SetImpression(*impression); } Frame* target_frame =
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.h b/third_party/blink/renderer/core/html/html_anchor_element.h index c9e4b45..162c874 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.h +++ b/third_party/blink/renderer/core/html/html_anchor_element.h
@@ -24,7 +24,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_ANCHOR_ELEMENT_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_HTML_HTML_ANCHOR_ELEMENT_H_ -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/html/html_element.h" @@ -96,10 +95,6 @@ LinkHash VisitedLinkHash() const; void InvalidateCachedVisitedLinkHash() { cached_visited_link_hash_ = 0; } - // Returns whether this element is a valid impression declaration tag. This is - // determined by looking at the presence of required attributes. - bool HasImpression() const; - void SendPings(const KURL& destination_url) const; void Trace(Visitor*) const override;
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.idl b/third_party/blink/renderer/core/html/html_anchor_element.idl index 1ae36239..f9cac26 100644 --- a/third_party/blink/renderer/core/html/html_anchor_element.idl +++ b/third_party/blink/renderer/core/html/html_anchor_element.idl
@@ -36,11 +36,6 @@ [CEReactions, ImplementedAs=textContent] attribute DOMString text; // Attribution Reporting - [RuntimeEnabled=ConversionMeasurement, CEReactions,Reflect] attribute DOMString attributionSourceEventId; - [RuntimeEnabled=ConversionMeasurement, CEReactions,Reflect] attribute USVString attributionDestination; - [RuntimeEnabled=ConversionMeasurement, CEReactions,Reflect] attribute USVString attributionReportTo; - [RuntimeEnabled=ConversionMeasurement, CEReactions,Reflect] attribute DOMString attributionExpiry; - [RuntimeEnabled=ConversionMeasurement, CEReactions,Reflect] attribute DOMString attributionSourcePriority; [RuntimeEnabled=AttributionReporting, CEReactions,Reflect] attribute USVString attributionSrc; // obsolete members
diff --git a/third_party/blink/renderer/core/html/html_attribute_names.json5 b/third_party/blink/renderer/core/html/html_attribute_names.json5 index 2f5e605..479a25f 100644 --- a/third_party/blink/renderer/core/html/html_attribute_names.json5 +++ b/third_party/blink/renderer/core/html/html_attribute_names.json5
@@ -24,11 +24,6 @@ "archive", "as", "async", - "attributiondestination", - "attributionexpiry", - "attributionreportto", - "attributionsourceeventid", - "attributionsourcepriority", "attributionsrc", "autocapitalize", "autocomplete",
diff --git a/third_party/blink/renderer/core/html/keywords.json5 b/third_party/blink/renderer/core/html/keywords.json5 index 33f7376..29a9e56 100644 --- a/third_party/blink/renderer/core/html/keywords.json5 +++ b/third_party/blink/renderer/core/html/keywords.json5
@@ -73,6 +73,12 @@ "eager", "auto", + // popup attribute (experimental) + // https://github.com/openui/open-ui/blob/main/research/src/pages/popup/popup.research.explainer.mdx + "popup", + "hint", + "async", + // referrerpolicy attribute // https://w3c.github.io/webappsec-referrer-policy/#referrer-policies "no-referrer",
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css index 7034f340..08a9051 100644 --- a/third_party/blink/renderer/core/html/resources/html.css +++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -1393,6 +1393,7 @@ max-width: calc(100% - 6px - 2em); max-height: calc(100% - 6px - 2em); user-select: text; + visibility: visible; } /* TODO(foolip): In the Fullscreen spec, there's a ::backdrop block with the
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc index ad8cebd9..bd751c0 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc +++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.cc
@@ -143,21 +143,12 @@ case AttributionReportingIssueType::kPermissionPolicyDisabled: return protocol::Audits::AttributionReportingIssueTypeEnum:: PermissionPolicyDisabled; - case AttributionReportingIssueType::kInvalidAttributionSourceEventId: - return protocol::Audits::AttributionReportingIssueTypeEnum:: - InvalidAttributionSourceEventId; case AttributionReportingIssueType::kAttributionSourceUntrustworthyOrigin: return protocol::Audits::AttributionReportingIssueTypeEnum:: AttributionSourceUntrustworthyOrigin; case AttributionReportingIssueType::kAttributionUntrustworthyOrigin: return protocol::Audits::AttributionReportingIssueTypeEnum:: AttributionUntrustworthyOrigin; - case AttributionReportingIssueType::kInvalidAttributionSourceExpiry: - return protocol::Audits::AttributionReportingIssueTypeEnum:: - InvalidAttributionSourceExpiry; - case AttributionReportingIssueType::kInvalidAttributionSourcePriority: - return protocol::Audits::AttributionReportingIssueTypeEnum:: - InvalidAttributionSourcePriority; } }
diff --git a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h index ec118f5..e201bf9 100644 --- a/third_party/blink/renderer/core/inspector/inspector_audits_issue.h +++ b/third_party/blink/renderer/core/inspector/inspector_audits_issue.h
@@ -103,11 +103,8 @@ enum class AttributionReportingIssueType { kPermissionPolicyDisabled, - kInvalidAttributionSourceEventId, kAttributionSourceUntrustworthyOrigin, kAttributionUntrustworthyOrigin, - kInvalidAttributionSourceExpiry, - kInvalidAttributionSourcePriority, }; enum class SharedArrayBufferIssueType {
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc index 4e0af3b..84d6c09c 100644 --- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc +++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -914,41 +914,52 @@ std::unique_ptr<protocol::ListValue> lines = protocol::ListValue::create(); - const NamedGridLinesMap& named_lines_map = - (direction == kForColumns) - ? grid_container_style.GridTemplateColumns().named_grid_lines - : grid_container_style.GridTemplateRows().named_grid_lines; LayoutUnit gap = grid_interface->GridGap(direction); LayoutUnit alt_axis_pos = GetPositionForFirstTrack( layout_object, direction == kForRows ? kForColumns : kForRows, alt_axis_positions); - for (const auto& item : named_lines_map) { - const String& name = item.key; + auto process_grid_lines_map = [&](const NamedGridLinesMap& named_lines_map) { + for (const auto& item : named_lines_map) { + const String& name = item.key; - for (const wtf_size_t index : item.value) { - LayoutUnit track = - GetPositionForTrackAt(layout_object, index, direction, positions); + for (const wtf_size_t index : item.value) { + LayoutUnit track = + GetPositionForTrackAt(layout_object, index, direction, positions); - LayoutUnit gap_offset = - index > 0 && index < positions.size() - 1 ? gap / 2 : LayoutUnit(); - if (is_rtl) - gap_offset *= -1; + LayoutUnit gap_offset = + index > 0 && index < positions.size() - 1 ? gap / 2 : LayoutUnit(); + if (is_rtl) + gap_offset *= -1; - LayoutUnit main_axis_pos = track - gap_offset; - PhysicalOffset line_name_pos(main_axis_pos, alt_axis_pos); + LayoutUnit main_axis_pos = track - gap_offset; + PhysicalOffset line_name_pos(main_axis_pos, alt_axis_pos); - if (direction == kForRows) - line_name_pos = Transpose(line_name_pos); + if (direction == kForRows) + line_name_pos = Transpose(line_name_pos); - std::unique_ptr<protocol::DictionaryValue> line = - BuildPosition(LocalToAbsolutePoint(node, line_name_pos, scale)); + std::unique_ptr<protocol::DictionaryValue> line = + BuildPosition(LocalToAbsolutePoint(node, line_name_pos, scale)); - line->setString("name", name); + line->setString("name", name); - lines->pushValue(std::move(line)); + lines->pushValue(std::move(line)); + } } - } + }; + + const NamedGridLinesMap& explicit_lines_map = + (direction == kForColumns) + ? grid_container_style.GridTemplateColumns().named_grid_lines + : grid_container_style.GridTemplateRows().named_grid_lines; + + const NamedGridLinesMap& implicit_lines_map = + (direction == kForColumns) + ? grid_container_style.ImplicitNamedGridColumnLines() + : grid_container_style.ImplicitNamedGridRowLines(); + + process_grid_lines_map(explicit_lines_map); + process_grid_lines_map(implicit_lines_map); return lines; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc index 4476b0a..b3fc87e 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_absolute_utils.cc
@@ -387,19 +387,16 @@ } else if (!style.LogicalWidth().IsAuto()) { inline_size = ResolveMainInlineLength( space, style, border_padding, MinMaxSizesFunc, style.LogicalWidth()); - } else if (!style.AspectRatio().IsAuto()) { - const bool stretch_inline_size = !node.IsTable() && - !style.LogicalLeft().IsAuto() && - !style.LogicalRight().IsAuto(); + } else if (!style.AspectRatio().IsAuto() && + can_compute_block_size_without_layout) { + const bool stretch_inline_size = + !style.LogicalLeft().IsAuto() && !style.LogicalRight().IsAuto(); - // The aspect-ratio applies from the block-axis if: - // - Our auto inline-size would have stretched but we have an explicit - // block-size. - // - Our auto inline-size doesn't stretch but we can compute our - // block-size without layout. - if ((stretch_inline_size && - !style.LogicalHeight().IsAutoOrContentOrIntrinsic()) || - (!stretch_inline_size && can_compute_block_size_without_layout)) { + // The aspect-ratio applies from the block-axis if we can compute our + // block-size without invoking layout, and: + // - We aren't stretching our auto inline-size. + // - We are stretching our auto inline-size, but the block-size isn't auto. + if (!stretch_inline_size || !style.LogicalHeight().IsAuto()) { is_shrink_to_fit = true; // Apply the automatic minimum size.
diff --git a/third_party/blink/renderer/core/loader/empty_clients.cc b/third_party/blink/renderer/core/loader/empty_clients.cc index 0dfbe43..0c81aa1 100644 --- a/third_party/blink/renderer/core/loader/empty_clients.cc +++ b/third_party/blink/renderer/core/loader/empty_clients.cc
@@ -110,7 +110,7 @@ mojo::PendingRemote<mojom::blink::BlobURLToken>, base::TimeTicks, const String&, - const absl::optional<WebImpression>&, + const absl::optional<Impression>&, const LocalFrameToken* initiator_frame_token, std::unique_ptr<SourceLocation>, mojo::PendingRemote<mojom::blink::PolicyContainerHostKeepAliveHandle>) {}
diff --git a/third_party/blink/renderer/core/loader/empty_clients.h b/third_party/blink/renderer/core/loader/empty_clients.h index acd3b33c..a9bd5283 100644 --- a/third_party/blink/renderer/core/loader/empty_clients.h +++ b/third_party/blink/renderer/core/loader/empty_clients.h
@@ -289,7 +289,7 @@ mojo::PendingRemote<mojom::blink::BlobURLToken>, base::TimeTicks, const String&, - const absl::optional<WebImpression>&, + const absl::optional<Impression>&, const LocalFrameToken* initiator_frame_token, std::unique_ptr<SourceLocation>, mojo::PendingRemote<mojom::blink::PolicyContainerHostKeepAliveHandle>)
diff --git a/third_party/blink/renderer/core/loader/frame_load_request.h b/third_party/blink/renderer/core/loader/frame_load_request.h index 3fe233a6..444b25c8 100644 --- a/third_party/blink/renderer/core/loader/frame_load_request.h +++ b/third_party/blink/renderer/core/loader/frame_load_request.h
@@ -31,11 +31,11 @@ #include "mojo/public/cpp/bindings/remote.h" #include "services/network/public/mojom/referrer_policy.mojom-blink.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/public/common/navigation/impression.h" #include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink.h" #include "third_party/blink/public/mojom/frame/policy_container.mojom-blink.h" #include "third_party/blink/public/mojom/frame/triggering_event_info.mojom-blink.h" #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom-blink.h" -#include "third_party/blink/public/platform/web_impression.h" #include "third_party/blink/public/web/web_picture_in_picture_window_options.h" #include "third_party/blink/public/web/web_window_features.h" #include "third_party/blink/renderer/bindings/core/v8/source_location.h" @@ -175,13 +175,11 @@ // Impressions are set when a FrameLoadRequest is created for a click on an // anchor tag that has conversion measurement attributes. - void SetImpression(const absl::optional<WebImpression>& impression) { + void SetImpression(const absl::optional<Impression>& impression) { impression_ = impression; } - const absl::optional<WebImpression>& Impression() const { - return impression_; - } + const absl::optional<Impression>& Impression() const { return impression_; } bool CanDisplay(const KURL&) const; @@ -215,7 +213,7 @@ WebWindowFeatures window_features_; absl::optional<WebPictureInPictureWindowOptions> picture_in_picture_window_options_; - absl::optional<WebImpression> impression_; + absl::optional<blink::Impression> impression_; absl::optional<LocalFrameToken> initiator_frame_token_; mojo::PendingRemote<mojom::blink::PolicyContainerHostKeepAliveHandle> initiator_policy_container_keep_alive_handle_;
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc index 67c6245..d09b6b17 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
@@ -75,7 +75,7 @@ network::mojom::blink::WebSandboxFlags, const SessionStorageNamespaceId&, bool& consumed_user_gesture, - const absl::optional<WebImpression>&) override { + const absl::optional<Impression>&) override { return web_view_helper_.InitializeWithOpener(opener); }
diff --git a/third_party/blink/renderer/core/page/context_menu_controller.cc b/third_party/blink/renderer/core/page/context_menu_controller.cc index 3136b6a..32786cdf 100644 --- a/third_party/blink/renderer/core/page/context_menu_controller.cc +++ b/third_party/blink/renderer/core/page/context_menu_controller.cc
@@ -40,7 +40,6 @@ #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/input/web_menu_source_type.h" #include "third_party/blink/public/mojom/context_menu/context_menu.mojom-blink.h" -#include "third_party/blink/public/platform/impression_conversions.h" #include "third_party/blink/public/web/web_local_frame_client.h" #include "third_party/blink/public/web/web_plugin.h" #include "third_party/blink/public/web/web_text_check_client.h" @@ -742,14 +741,10 @@ const AtomicString& attribution_src_value = anchor->FastGetAttribute(html_names::kAttributionsrcAttr); if (!attribution_src_value.IsNull()) { - absl::optional<WebImpression> web_impression = + data.impression = selected_frame->GetAttributionSrcLoader()->RegisterNavigation( selected_frame->GetDocument()->CompleteURL( attribution_src_value)); - if (web_impression.has_value()) { - data.impression = - ConvertWebImpressionToImpression(web_impression.value()); - } } } }
diff --git a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc index 9dbb7d1..1fa00f7b 100644 --- a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc +++ b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc
@@ -149,7 +149,9 @@ // Technically speaking, 16-byte aligned size doesn't mean 16-byte aligned // address, but this heuristics works with the current implementation of // PartitionAlloc (and PartitionAlloc doesn't support a better way for now). - if (base::kAlignment < 16) { // base::kAlignment is a compile-time constant. + // + // `partition_alloc::internal::kAlignment` is a compile-time constant. + if (partition_alloc::internal::kAlignment < 16) { size_t aligned_size = base::bits::AlignUp(size, 16); if (size == 0) { aligned_size = 16; @@ -171,7 +173,7 @@ } void* data = WTF::Partitions::ArrayBufferPartition()->AllocWithFlags( flags, size, WTF_HEAP_PROFILER_TYPE_NAME(ArrayBufferContents)); - if (base::kAlignment < 16) { + if (partition_alloc::internal::kAlignment < 16) { char* ptr = reinterpret_cast<char*>(data); DCHECK_EQ(base::bits::AlignUp(ptr, 16), ptr) << "Pointer " << ptr << " not 16B aligned for size " << size;
diff --git a/third_party/blink/renderer/modules/webusb/usb_device.cc b/third_party/blink/renderer/modules/webusb/usb_device.cc index 2811b1b..a8888b5 100644 --- a/third_party/blink/renderer/modules/webusb/usb_device.cc +++ b/third_party/blink/renderer/modules/webusb/usb_device.cc
@@ -810,43 +810,44 @@ ExceptionState& exception_state) const { auto mojo_parameters = device::mojom::blink::UsbControlTransferParams::New(); - if (parameters->requestType() == "standard") { - mojo_parameters->type = UsbControlTransferType::STANDARD; - } else if (parameters->requestType() == "class") { - mojo_parameters->type = UsbControlTransferType::CLASS; - } else if (parameters->requestType() == "vendor") { - mojo_parameters->type = UsbControlTransferType::VENDOR; - } else { - exception_state.ThrowDOMException( - DOMExceptionCode::kTypeMismatchError, - "The control transfer requestType parameter is invalid."); - return nullptr; + switch (parameters->requestType().AsEnum()) { + case V8USBRequestType::Enum::kStandard: + mojo_parameters->type = UsbControlTransferType::STANDARD; + break; + case V8USBRequestType::Enum::kClass: + mojo_parameters->type = UsbControlTransferType::CLASS; + break; + case V8USBRequestType::Enum::kVendor: + mojo_parameters->type = UsbControlTransferType::VENDOR; + break; } - if (parameters->recipient() == "device") { - mojo_parameters->recipient = UsbControlTransferRecipient::DEVICE; - } else if (parameters->recipient() == "interface") { - uint8_t interface_number = parameters->index() & 0xff; - EnsureInterfaceClaimed(interface_number, exception_state); - if (exception_state.HadException()) - return nullptr; + switch (parameters->recipient().AsEnum()) { + case V8USBRecipient::Enum::kDevice: + mojo_parameters->recipient = UsbControlTransferRecipient::DEVICE; + break; + case V8USBRecipient::Enum::kInterface: { + uint8_t interface_number = parameters->index() & 0xff; + EnsureInterfaceClaimed(interface_number, exception_state); + if (exception_state.HadException()) + return nullptr; - mojo_parameters->recipient = UsbControlTransferRecipient::INTERFACE; - } else if (parameters->recipient() == "endpoint") { - bool in_transfer = parameters->index() & 0x80; - uint8_t endpoint_number = parameters->index() & 0x0f; - EnsureEndpointAvailable(in_transfer, endpoint_number, exception_state); - if (exception_state.HadException()) - return nullptr; + mojo_parameters->recipient = UsbControlTransferRecipient::INTERFACE; + break; + } + case V8USBRecipient::Enum::kEndpoint: { + bool in_transfer = parameters->index() & 0x80; + uint8_t endpoint_number = parameters->index() & 0x0f; + EnsureEndpointAvailable(in_transfer, endpoint_number, exception_state); + if (exception_state.HadException()) + return nullptr; - mojo_parameters->recipient = UsbControlTransferRecipient::ENDPOINT; - } else if (parameters->recipient() == "other") { - mojo_parameters->recipient = UsbControlTransferRecipient::OTHER; - } else { - exception_state.ThrowDOMException( - DOMExceptionCode::kTypeMismatchError, - "The control transfer recipient parameter is invalid."); - return nullptr; + mojo_parameters->recipient = UsbControlTransferRecipient::ENDPOINT; + break; + } + case V8USBRecipient::Enum::kOther: + mojo_parameters->recipient = UsbControlTransferRecipient::OTHER; + break; } mojo_parameters->request = parameters->request();
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn index 824ee83..8ba1bb0 100644 --- a/third_party/blink/renderer/platform/BUILD.gn +++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -480,7 +480,6 @@ "disk_data_allocator.h", "disk_data_metadata.h", "exported/file_path_conversion.cc", - "exported/impression_conversions.cc", "exported/interface_registry.cc", "exported/mediastream/web_media_stream.cc", "exported/mediastream/web_media_stream_source.cc",
diff --git a/third_party/blink/renderer/platform/exported/impression_conversions.cc b/third_party/blink/renderer/platform/exported/impression_conversions.cc deleted file mode 100644 index 40df0ba..0000000 --- a/third_party/blink/renderer/platform/exported/impression_conversions.cc +++ /dev/null
@@ -1,30 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/public/platform/impression_conversions.h" - -#include <algorithm> -#include <iterator> - -#include "third_party/blink/public/platform/web_security_origin.h" -#include "third_party/blink/public/platform/web_string.h" - -namespace blink { - -blink::Impression ConvertWebImpressionToImpression( - const blink::WebImpression& web_impression) { - blink::Impression result; - - result.impression_data = web_impression.impression_data; - result.expiry = web_impression.expiry; - result.reporting_origin = web_impression.reporting_origin; - if (!web_impression.conversion_destination.IsNull()) - result.conversion_destination = web_impression.conversion_destination; - result.priority = web_impression.priority; - result.attribution_src_token = web_impression.attribution_src_token; - - return result; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 6da87bd..6c85fe23 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -462,10 +462,6 @@ status: "experimental", }, { - name: "ConversionMeasurement", - status: "test", - }, - { name: "CooperativeScheduling" }, { @@ -563,13 +559,6 @@ status: "experimental" }, { - // CSS animation/transition updates occur outside style recalc. - // - // https://crbug.com/1180159 - name: "CSSDelayedAnimationUpdates", - status: "stable", - }, - { name: "CSSDynamicRangeMediaQueries", status: "stable" },
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py index 71a22ca..d166827 100755 --- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py +++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -120,7 +120,7 @@ 'base::PassKey', # //base/allocator/partition_allocator/partition_alloc_constants.h - 'base::kAlignment', + 'partition_alloc::internal::kAlignment', # //base/task/bind_post_task.h 'base::BindPostTask',
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials index cb232ff..ac5243e 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials +++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -35,7 +35,6 @@ http/tests/inspector-protocol/target/target-setAutoAttach-oopif-multisession.js [ Skip ] http/tests/inspector-protocol/target/target-setAutoAttach-oopif-multisession-existing.js [ Skip ] http/tests/inspector-protocol/target/target-setAutoAttach-oopif-multisession-wait.js [ Skip ] -http/tests/inspector-protocol/conversion/impression-insecure-main-frame-with-iframe.js [ Skip ] http/tests/inspector-protocol/target/auto-attach-sub-sub-frame.js [ Skip ] http/tests/inspector-protocol/target/message-to-detached-session.js [ Skip ] virtual/fenced-frame-mparch/http/tests/inspector-protocol/fenced-frame/fenced-frame-in-oopif-auto-attach.js [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 2ff4182..b70c6e8 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -80,6 +80,8 @@ # Activation v2 (UAv2). crbug.com/906791 external/wpt/fullscreen/api/element-ready-check-allowed-cross-origin-manual.sub.html [ Timeout ] +crbug.com/1293083 external/wpt/fullscreen/api/delegate-request.https.sub.tentative.html [ Failure ] + # These two are left over from crbug.com/881040, I rebaselined them twice and # they continue to fail. crbug.com/881040 media/controls/lazy-loaded-style.html [ Failure Pass ] @@ -3202,9 +3204,9 @@ # ====== New tests from wpt-importer added here ====== crbug.com/626703 [ Win11 ] external/wpt/css/css-text-decor/text-decoration-thickness-fixed.html [ Failure ] crbug.com/626703 [ Win11 ] external/wpt/css/css-text-decor/text-underline-offset-variable.html [ Failure ] -crbug.com/626703 [ Win11 ] external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Timeout Failure ] +crbug.com/626703 [ Win11 ] external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Failure Timeout ] crbug.com/626703 [ Win11 ] external/wpt/navigation-timing/nav2_test_response_end_and_duration_before_during_and_after_load_event.html [ Timeout ] -crbug.com/626703 [ Win11 ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Timeout Failure ] +crbug.com/626703 [ Win11 ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Failure Timeout ] crbug.com/626703 [ Linux ] external/wpt/css/mediaqueries/mq-invalid-media-type-layer-001.html [ Failure ] crbug.com/626703 [ Mac10.15 ] external/wpt/css/mediaqueries/mq-invalid-media-type-layer-001.html [ Failure ] crbug.com/626703 [ Mac11 ] external/wpt/css/mediaqueries/mq-invalid-media-type-layer-001.html [ Failure ] @@ -6883,3 +6885,6 @@ crbug.com/1323626 [ Mac11-arm64 ] compositing/lots-of-img-layers.html [ Failure Pass ] crbug.com/1323626 [ Mac11-arm64 ] compositing/lots-of-img-layers-with-opacity.html [ Failure Pass ] crbug.com/1323627 [ Mac11-arm64 ] virtual/gpu-rasterization/images/color-profile-svg-foreign-object.html [ Failure Pass ] + +# Sheriff 2022-05-10 +crbug.com/1280621 [ Linux Debug ] http/tests/devtools/persistence/persistence-move-breakpoints.js [ Failure ] \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index 3ef67f13..a74d691 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: 7a993c06ce53ac52d65728cff2e4472ce40d7ecd +Version: 4c7be82200fe3118d8fea0860ec26831350c2264
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 08c66e0..834c0f14 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -1822,6 +1822,13 @@ {} ] ], + "nested-multicol-fieldset-tall-trailing-border-freeze.html": [ + "014073a9e8c1513dbd38dc0ee66e4547a6b3be36", + [ + null, + {} + ] + ], "nested-multicol-fieldset-tall-trailing-padding.html": [ "b155a4d7f42283c18e6ea113dc2000393752c72a", [ @@ -96324,6 +96331,19 @@ {} ] ], + "inner-first-line-non-matching.html": [ + "5f39124e514bcfc2b7293b6e36c7e3c3f4bbd5df", + [ + null, + [ + [ + "/css/css-contain/container-queries/inner-first-line-non-matching-ref.html", + "==" + ] + ], + {} + ] + ], "multicol-inside-container.html": [ "9fc8393a513f236996d60fdc39e2401a3dba0376", [ @@ -148936,6 +148956,19 @@ {} ] ], + "first-line-nested-gcs.html": [ + "6777e5468f57b507f96f4e92fbba4393002d15e7", + [ + null, + [ + [ + "/css/css-pseudo/first-line-green-ref.html", + "==" + ] + ], + {} + ] + ], "first-line-on-ancestor-block.html": [ "6b797107df80156b511b9dc58c5ee40d6114cfc4", [ @@ -156625,6 +156658,19 @@ {} ] ], + "block-aspect-ratio-037.html": [ + "26b795b2a0ba30fa61d16ef595107398bb605106", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "block-aspect-ratio-with-margin-collapsing-001.html": [ "78a0418fe285da58030cdd863460add0533e6af5", [ @@ -261016,6 +261062,10 @@ "ecd72b7516c41c83b6e8d320c9b0b87f9c231781", [] ], + "inner-first-line-non-matching-ref.html": [ + "99e9c334bf2c856535c7643911a3050390658a6f", + [] + ], "pseudo-elements-002-ref.html": [ "9dc6c572b303678e8f9b9f76eb3e527318a0ed81", [] @@ -278379,6 +278429,10 @@ "84becd9a78d186ba3c0e658746fd56aef8039b74", [] ], + "first-line-green-ref.html": [ + "99e9c334bf2c856535c7643911a3050390658a6f", + [] + ], "first-line-line-height-001-ref.html": [ "13e9b20f34d44cbe436b6bbcbdd6e85884ee71ca", [] @@ -316142,6 +316196,10 @@ "3be2852348ba800662fa2caf626654b2f40b5902", [] ], + "png-with-early-hints.h2.py": [ + "0785d512c1b024acf7e349735764ac341e219d4b", + [] + ], "preconnect-in-early-hints.h2.py": [ "e448fd0af71abf850786437f818d4a74d74060c0", [] @@ -322056,7 +322114,7 @@ [] ], "nested-contexts.js": [ - "31bc97bb119399be0d8ebb283e01ac32c2a9ec0f", + "c0822943e86a68f43d003e03166fbc987014946e", [] ], "nested.css": [ @@ -481414,6 +481472,24 @@ } ] ], + "embed-object.h2.window.js": [ + "82365fafddbb8df1ea80cecdf2d24db65e3ef379", + [ + "loading/early-hints/embed-object.h2.window.html", + { + "script_metadata": [ + [ + "script", + "/common/utils.js" + ], + [ + "script", + "resources/early-hints-helpers.sub.js" + ] + ] + } + ] + ], "invalid-headers-in-early-hints.h2.window.js": [ "6c5161dc8bf72d193c843860f24024f753075314", [ @@ -510112,7 +510188,7 @@ ] ], "nested-context-navigations-embed.html": [ - "5c8a62a9ae281d7f4823e27ae7fe37032de8cb2e", + "f804adbb8a99e44bd0f7d0c543ceea3f09e6ea62", [ null, { @@ -510121,7 +510197,7 @@ ] ], "nested-context-navigations-iframe.html": [ - "6e5cdd85c30d3ecbdb68c987a40b7eda5370fd4b", + "32ab21633c669ccf1db59f3cd4667dd2ce810e79", [ null, { @@ -510130,7 +510206,7 @@ ] ], "nested-context-navigations-object.html": [ - "8d63c5e3d44e5d722861d3c8fed19f9b76080d0d", + "1508d8829fd2695918d891a9ef7bf9d03fa285f8", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html index 1facc17..500fb403 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/backdrop-animate-002.html
@@ -5,6 +5,9 @@ <link rel="help" href="https://fullscreen.spec.whatwg.org/#::backdrop-pseudo-element"> <link rel="match" href="backdrop-animate-002-ref.html"> <dialog id="target">Dialog contents</dialog> +<!-- This test fails on WPT.fyi with off-by-one on the green background: --> +<meta name=fuzzy content="maxDifference=1;totalPixels=472272"> + <style> #target::backdrop { will-change: transform;
diff --git a/third_party/blink/web_tests/external/wpt/fullscreen/api/delegate-request.https.sub.tentative.html b/third_party/blink/web_tests/external/wpt/fullscreen/api/delegate-request.https.sub.tentative.html new file mode 100644 index 0000000..3760461d15 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fullscreen/api/delegate-request.https.sub.tentative.html
@@ -0,0 +1,83 @@ +<!DOCTYPE html> +<!-- + Tentative due to: + https://github.com/WICG/capability-delegation/issues/10 +--> +<title>Fullscreen request delegation test</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<script src="/resources/testdriver-vendor.js"></script> + +<div> + Verifies that element.requestFullscreen() call from a cross-origin subframe without user + activation works if and only if the top frame has user activation and it delegates the capability + to the subframe. +</div> + +<iframe allow="fullscreen" width="300px" height="50px" + src="https://{{hosts[alt][www]}}:{{ports[https][0]}}/fullscreen/api/resources/delegate-request-subframe.html"> +</iframe> + +<script> + // Returns a |Promise| that gets resolved with |event.data| when |window| + // receives from |source| a "message" event whose |event.data.type| matches the string + // |message_data_type|. + function getMessageData(message_data_type, source) { + return new Promise(resolve => { + function waitAndRemove(e) { + if (e.source != source || !e.data || e.data.type != message_data_type) + return; + window.removeEventListener("message", waitAndRemove); + resolve(e.data); + } + window.addEventListener("message", waitAndRemove); + }); + } + + promise_setup(async () => { + // Make sure the iframe has loaded. + await getMessageData("subframe-loaded", frames[0]); + }); + + const target_origin = "https://{{hosts[alt][www]}}:{{ports[https][0]}}"; + const request = {"type": "make-fullscreen-request"}; + + promise_test(async () => { + let result_promise = getMessageData("result", frames[0]); + frames[0].postMessage(request, {targetOrigin: target_origin}); + let data = await result_promise; + + assert_equals(data.result, "failure"); + }, "Fullscreen-request from a subframe fails without delegation when the top frame has no user activation"); + + promise_test(async () => { + let result_promise = getMessageData("result", frames[0]); + frames[0].postMessage(request, {targetOrigin: target_origin, + delegate: "fullscreen"}); + let data = await result_promise; + + assert_equals(data.result, "failure"); + }, "Fullscreen-request from a subframe fails with delegation when the top frame has no user activation"); + + promise_test(async () => { + let result_promise = getMessageData("result", frames[0]); + await test_driver.bless(); + frames[0].postMessage(request, {targetOrigin: target_origin}); + let data = await result_promise; + + assert_equals(data.result, "failure"); + }, "Fullscreen-request from a subframe fails without delegation when the top frame has user activation"); + + promise_test(async () => { + let result_promise = getMessageData("result", frames[0]); + await test_driver.bless(); + frames[0].postMessage(request, {targetOrigin: target_origin, + delegate: "fullscreen"}); + let data = await result_promise; + + assert_equals(data.result, "success"); + }, "Fullscreen-request from a subframe succeeds with delegation when the top frame has user activation"); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/fullscreen/api/resources/delegate-request-subframe.html b/third_party/blink/web_tests/external/wpt/fullscreen/api/resources/delegate-request-subframe.html new file mode 100644 index 0000000..9bb9d781 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fullscreen/api/resources/delegate-request-subframe.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<title>Fullscreen request delegation test: subframe</title> +<body>Subframe body</body> + +<script> + function reportResult(msg) { + window.top.postMessage({"type": "result", "result": msg}, "*"); + } + + document.addEventListener('fullscreenchange', () => { + if (document.fullscreenElement) { + reportResult("success"); + document.exitFullscreen(); + } + }); + + document.addEventListener('fullscreenerror', () => { + reportResult("failure"); + }); + + window.addEventListener("message", e => { + if (e.data.type == "make-fullscreen-request") { + document.body.requestFullscreen(); + } + }); + + window.top.postMessage({"type": "subframe-loaded"}, "*"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-attribute-basic.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-attribute-basic.tentative.html index a1815b5..9d74476 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-attribute-basic.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-attribute-basic.tentative.html
@@ -80,19 +80,27 @@ popup.setAttribute('popup','hint'); assert_equals(popup.popup,'hint'); popup.setAttribute('popup','invalid'); - assert_equals(popup.popup,'invalid'); + assert_equals(popup.popup,'','Invalid values should reflect as empty string'); popup.setAttribute('popup','HiNt'); - assert_equals(popup.popup,'HiNt'); + assert_equals(popup.popup,'hint','Case is normalized'); popup.removeAttribute('popup'); - assert_equals(popup.popup,''); + assert_equals(popup.popup,'','No value should reflect as empty string'); popup.popup='hint'; assert_equals(popup.getAttribute('popup'),'hint'); popup.popup='popup'; assert_equals(popup.getAttribute('popup'),'popup'); popup.popup='invalid'; - assert_equals(popup.getAttribute('popup'),'invalid'); + assert_equals(popup.getAttribute('popup'),'invalid','IDL setter allows any value'); + assert_equals(popup.popup,'','but IDL getter does not re-reflect invalid values'); popup.popup=''; - assert_equals(popup.getAttribute('popup'),''); + assert_equals(popup.getAttribute('popup'),'','Empty should map to empty'); + assert_equals(popup.popup,'','Empty should map to empty in IDL'); + popup.popup=null; + assert_equals(popup.getAttribute('popup'),'null','Attribute for "null" should still get set'); + assert_equals(popup.popup,'','Null should map to empty in IDL'); + popup.popup=undefined; + assert_equals(popup.getAttribute('popup'),'undefined','Attribute for "undefined" should still get set'); + assert_equals(popup.popup,'','undefined should map to empty in IDL'); },'IDL attribute reflection'); test(() => { @@ -110,6 +118,8 @@ assertIsFunctionalPopup(popup); popup.popup = 'PoPuP'; assertIsFunctionalPopup(popup); + popup.popup = 'invalid'; + assertNotAPopup(popup); },'Popup attribute value should be case insensitive'); test(() => {
diff --git a/third_party/blink/web_tests/external/wpt/mediacapture-region/MediaDevices-produceCropId.https.html b/third_party/blink/web_tests/external/wpt/mediacapture-region/MediaDevices-produceCropId.https.html index 682caad7..8b381b8 100644 --- a/third_party/blink/web_tests/external/wpt/mediacapture-region/MediaDevices-produceCropId.https.html +++ b/third_party/blink/web_tests/external/wpt/mediacapture-region/MediaDevices-produceCropId.https.html
@@ -1,65 +1,83 @@ <!doctype html> <html> + <head> -<title>Test navigator.mediaDevices.produceCropId()</title> -<meta name='assert' content='Test the produceCropId() method.'/> + <title>Test navigator.mediaDevices.produceCropId()</title> + <meta name='assert' content='Test the produceCropId() method.' /> </head> <body> -<h1 class="instructions">Description</h1> -<p class="instructions">This test checks for the behavior of the -<code>navigator.mediaDevices.produceCropId()</code> method.</p> + <h1 class="instructions">Description</h1> + <p class="instructions">This test checks for the behavior of the + <code>navigator.mediaDevices.produceCropId()</code> method. + </p> -<div id='test-div'></div> -<iframe id='test-iframe' src="about:blank" /> -<a id='test-a'></a> -<div id='log'></div> + <div id='test-div'></div> + <iframe id='test-iframe' src="about:blank"></iframe> + <a id='test-a'></a> + <div id='log'></div> -<script src=/resources/testharness.js></script> -<script src=/resources/testharnessreport.js></script> + <script src=/resources/testharness.js></script> + <script src=/resources/testharnessreport.js></script> -<script> -"use strict"; + <script> + "use strict"; -// Regex that matches a string only if it is exactly 32 valid hex characters. -const HEX_REGEX = /^[0-9A-Fa-f]{32}$/g; -test(() => { - const div_id = document.getElementById('test-div').produceCropId(); - assert_true(HEX_REGEX.test(div_id)); -}, "produces valid id for div"); + // Regex that matches a Universally Unique IDentifer composed of hex + // characters separated by dashes in the form 8-4-4-4-12 for a total + // of 36 characters. + const GUID_REGEX = /^[0-9A-Fa-f]{8}(?:-[0-9A-Fa-f]{4}){3}-[0-9A-Fa-f]{12}$/; -test(() => { - const iframe_id = document.getElementById('test-iframe').produceCropId(); - assert_true(HEX_REGEX.test(iframe_id)); -}, "produces valid id for iframe"); + promise_test(async () => { + assert_true(!!navigator.mediaDevices.produceCropId); + const iframe_id = await navigator.mediaDevices.produceCropId( + document.getElementById('test-iframe')); + assert_true(GUID_REGEX.test(iframe_id)); + }, "produces valid IDs for iframe"); -test(() => { - const iframe_id = document.getElementById('test-iframe').produceCropId(); - const second_iframe_id = document.getElementById('test-iframe').produceCropId(); - assert_equals(iframe_id, second_iframe_id); -}, "repeated calls return the same value"); + promise_test(async () => { + assert_true(!!navigator.mediaDevices.produceCropId); + const div_id = await navigator.mediaDevices.produceCropId( + document.getElementById('test-div')); + assert_true(GUID_REGEX.test(div_id)); + }, "produces valid id for div"); -test(() => { - assert_throws_js(TypeError, function() { - await document.getElementById('test-a').produceCropId(); - }); -}, "invalid element types cause an error"); + promise_test(async () => { + const iframe_id = await navigator.mediaDevices.produceCropId( + document.getElementById('test-iframe')); + const second_iframe_id = await navigator.mediaDevices.produceCropId( + document.getElementById('test-iframe')); + assert_equals(iframe_id, second_iframe_id); + }, "repeated calls return the same value"); -test(() => { - const div_id = document.getElementById('test-div').produceCropId(); - const iframe_id = document.getElementById('test-iframe').produceCropId(); - assert_not_equals(div_id, iframe_id); -}, "two elements have different IDs"); + promise_test(t => { + return promise_rejects_js(t, TypeError, + navigator.mediaDevices.produceCropId(123)); + }, "rejects an invalid element with a TypeError"); -test(() => { - const div = document.getElementById('test-div'); - const div_id = div.produceCropId(); - const clone = div.cloneNode(true); - document.querySelector('body').appendChild(clone); - const clone_id = clone.produceCropId(); - assert_not_equals(div_id, clone_id); -}, "cloned elements have different IDs"); + promise_test(function (t) { + return promise_rejects_js(t, TypeError, + navigator.mediaDevices.produceCropId(document.getElementById("test-a"))); + }, "rejects an incorrectly typed element with a TypeError"); -</script> + promise_test(async () => { + const div_id = await navigator.mediaDevices.produceCropId( + document.getElementById('test-div')); + const iframe_id = await navigator.mediaDevices.produceCropId( + document.getElementById('test-iframe')); + assert_not_equals(div_id, iframe_id); + }, "two elements have different IDs"); + + promise_test(async () => { + const div = document.getElementById('test-div'); + const div_id = await navigator.mediaDevices.produceCropId(div); + const clone = div.cloneNode(true); + document.querySelector('body').appendChild(clone); + const clone_id = await navigator.mediaDevices.produceCropId(clone); + assert_not_equals(div_id, clone_id); + }, "cloned elements have different IDs"); + + </script> </body> -</html> + +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-embed.html b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-embed.html index 5c8a62a..f804adb 100644 --- a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-embed.html +++ b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-embed.html
@@ -15,13 +15,22 @@ open_test_window("resources/embed-navigate-back.html?crossorigin", "Test that crossorigin embed navigations are not observable by the " + "parent, even after history navigations by the parent"); + open_test_window("resources/embed-navigate-back.html?cross-site", + "Test that cross-site embed navigations are not observable by the " + + "parent, even after history navigations by the parent"); + open_test_window("resources/embed-navigate.html", "Test that embed navigations are not observable by the parent"); open_test_window("resources/embed-navigate.html?crossorigin", "Test that crossorigin embed navigations are not observable by the parent"); + open_test_window("resources/embed-navigate.html?cross-site", + "Test that cross-site embed navigations are not observable by the parent"); open_test_window("resources/embed-refresh.html", "Test that embed refreshes are not observable by the parent"); open_test_window("resources/embed-refresh.html?crossorigin", "Test that crossorigin embed refreshes are not observable by the parent"); + open_test_window("resources/embed-refresh.html?cross-site", + "Test that cross-site embed refreshes are not observable by the parent"); + </script>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html index 6e5cdd8..32ab2163 100644 --- a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html +++ b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-iframe.html
@@ -10,19 +10,23 @@ <script src="resources/nested-contexts.js"></script> <script> open_test_window("resources/iframe-navigate-back.html", - "Test that iframe navigations are not observable by the parent, even " + - "after history navigations by the parent"); + "Test that iframe navigations are not observable by the parent, even after history navigations by the parent"); open_test_window("resources/iframe-navigate-back.html?crossorigin", - "Test that crossorigin iframe navigations are not observable by the " + - "parent, even after history navigations by the parent"); + "Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent"); + open_test_window("resources/iframe-navigate-back.html?cross-site", + "Test that cross-site iframe navigations are not observable by the parent, even after history navigations by the parent"); open_test_window("resources/iframe-navigate.html", "Test that iframe navigations are not observable by the parent"); open_test_window("resources/iframe-navigate.html?crossorigin", - "Test that crossorigin iframe navigations are not observable by the " + - "parent"); + "Test that crossorigin iframe navigations are not observable by the parent"); + open_test_window("resources/iframe-navigate.html?cross-site", + "Test that cross-site iframe navigations are not observable by the parent"); open_test_window("resources/iframe-refresh.html", "Test that iframe refreshes are not observable by the parent"); open_test_window("resources/iframe-refresh.html?crossorigin", "Test that crossorigin iframe refreshes are not observable by the parent"); + open_test_window("resources/iframe-refresh.html?cross-site", + "Test that cross-site iframe refreshes are not observable by the parent"); + </script>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-object.html b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-object.html index 8d63c5e3..1508d88 100644 --- a/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-object.html +++ b/third_party/blink/web_tests/external/wpt/resource-timing/nested-context-navigations-object.html
@@ -15,14 +15,23 @@ open_test_window("resources/object-navigate-back.html?crossorigin", "Test that crossorigin object navigations are not observable by the " + "parent, even after history navigations by the parent"); + open_test_window("resources/object-navigate-back.html?cross-site", + "Test that cross-site object navigations are not observable by the " + + "parent, even after history navigations by the parent"); open_test_window("resources/object-navigate.html", "Test that object navigations are not observable by the parent"); open_test_window("resources/object-navigate.html?crossorigin", "Test that crossorigin object navigations are not observable by the " + "parent"); + open_test_window("resources/object-navigate.html?cross-site", + "Test that cross-site object navigations are not observable by the " + + "parent"); open_test_window("resources/object-refresh.html", "Test that object refreshes are not observable by the parent"); open_test_window("resources/object-refresh.html?crossorigin", "Test that crossorigin object refreshes are not observable by the parent"); + open_test_window("resources/object-refresh.html?cross-site", + "Test that cross-site object refreshes are not observable by the parent"); + </script>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/resources/nested-contexts.js b/third_party/blink/web_tests/external/wpt/resource-timing/resources/nested-contexts.js index 31bc97bb..c082294 100644 --- a/third_party/blink/web_tests/external/wpt/resource-timing/resources/nested-contexts.js +++ b/third_party/blink/web_tests/external/wpt/resource-timing/resources/nested-contexts.js
@@ -1,7 +1,10 @@ let destination = location; -if (location.search == "?crossorigin") { - const {REMOTE_HOST} = get_host_info(); - destination = `${location.protocol}//${REMOTE_HOST}:${location.port}`; + +if (location.search == "?cross-site") { + const https = destination.protocol.startsWith("https"); + destination = get_host_info()[https ? 'HTTPS_NOTSAMESITE_ORIGIN' : 'HTTP_NOTSAMESITE_ORIGIN']; +} else if (location.search == "?crossorigin") { + destination = get_host_info().REMOTE_ORIGIN; } const pre_navigate_url =
diff --git a/third_party/blink/web_tests/fast/css/content-visibility-console-messages.html b/third_party/blink/web_tests/fast/css/content-visibility-console-messages.html new file mode 100644 index 0000000..2ec59323 --- /dev/null +++ b/third_party/blink/web_tests/fast/css/content-visibility-console-messages.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> + +<div style="content-visibility:hidden"> + <div id=cvhidden>hello</div> +</div> +<div style="content-visibility:hidden"> + <div id=cvhidden2>hello</div> +</div> +<div style="height:10000px"></div> +<div style="content-visibility:auto"> + <div id=cvauto>hello</div> +</div> +<div style="content-visibility:auto"> + <div id=cvauto2>hello</div> +</div> +<div style="content-visibility:auto"> + <div style="content-visibility:hidden"> + <div id=cvnested>hello</div> + </div> +</div> + +<script> + testRunner.dumpAsText(); + testRunner.setDumpConsoleMessages(true); + + console.log('forcing layout on c-v:hidden should make a console warning.'); + cvhidden.getBoundingClientRect(); + + console.log('forcing layout on c-v:auto should NOT make a console warning.'); + cvauto.getBoundingClientRect(); + + console.log('calling isVisible should NOT make a console warning.'); + cvhidden.isVisible({}); + + console.log('forcing layout via range APIs on c-v:hidden should make a console warning.'); + const range = new Range(); + range.selectNode(cvhidden2); + range.getBoundingClientRect(); + + console.log('forcing layout via range APIs on c-v:auto should NOT make a console warning.'); + const range2 = new Range(); + range2.selectNode(cvauto2); + range2.getBoundingClientRect(); + + console.log('forcing layout on c-v:hidden inside c-v:auto should make a console warning.'); + cvnested.getBoundingClientRect(); +</script>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-disabled-permission-policy-issue.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-disabled-permission-policy-issue.js deleted file mode 100644 index c0a8e189..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-disabled-permission-policy-issue.js +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, dp} = await testRunner.startBlank( - `Test that a site with disabled conversion measurement Permissions Policy reports an issue when an attribution link is clicked`); - - await dp.Audits.enable(); - await page.navigate('https://devtools.test:8443/inspector-protocol/conversion/resources/permissions-policy-no-conversion-measurement.php'); - - await page.loadHTML(` - <a id="adlink" href="https://a.com" - attributiondestination="https://does-not-matter.com" - attributionsourceeventid="12" target="_blank">Impression (ad) - </a>`); - - const issuePromise = dp.Audits.onceIssueAdded(); - await dp.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-destination.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-destination.js deleted file mode 100644 index df2ac953..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-destination.js +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, dp} = await testRunner.startBlank( - `Test that clicking an attribution link with an insecure destination triggers an issue.`); - - await dp.Audits.enable(); - await page.navigate('https://devtools.test:8443/inspector-protocol/conversion/resources/impression.html'); - - await dp.Runtime.evaluate({expression: ` - createImpressionAnchor('adlink', 'https://a.com', 42, 'http://insecure-destination.com', '_blank');`}); - - const issuePromise = dp.Audits.onceIssueAdded(); - await dp.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-with-iframe.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-with-iframe.js deleted file mode 100644 index 6fc1b1c6..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-with-iframe.js +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, session, dp} = await testRunner.startBlank( - `Test that clicking an attribution link in a secure iframe thats embedded in an insecure main frame triggers an issue.`); - - await dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: false, flatten: true}); - await page.navigate('http://devtools.test:8000/inspector-protocol/resources/empty.html'); - - session.evaluate(` - const frame = document.createElement('iframe'); - frame.src = 'https://devtools.test:8443/inspector-protocol/conversion/resources/impression.html'; - frame.allow = 'attribution-reporting'; - document.body.appendChild(frame); - `); - - const {params} = await dp.Target.onceAttachedToTarget(); - const dpFrame = session.createChild(params.sessionId).protocol; - - // Wait for the script tag in 'impression.html' to be parsed. - dpFrame.Page.enable(); - await dpFrame.Page.onceLoadEventFired(); - - await dpFrame.Runtime.evaluate({ - expression: ` - createImpressionAnchor('adlink', 'https://a.com', 42, 'https://does-not-matter.com', '_blank');`, - }); - - await dpFrame.Audits.enable(); - const issuePromise = dpFrame.Audits.onceIssueAdded(); - await dpFrame.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - - const violatingFrameId = issue.params.issue.details.attributionReportingIssueDetails.frame.frameId; - const reportingFrameId = params.targetInfo.targetId; - if (violatingFrameId === reportingFrameId) { - testRunner.log("Success: violating frame and reporting frame match"); - } else { - testRunner.log("Failure: violating frame and reporting frame do not match, but are expected to be the same"); - } - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-main-frame.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-main-frame.js deleted file mode 100644 index 7187ef1e..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-main-frame.js +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, dp} = await testRunner.startBlank( - `Test that clicking an attribution link in insecure contexts triggers an issue.`); - - await dp.Audits.enable(); - await page.navigate('http://devtools.test:8000/inspector-protocol/conversion/resources/impression.html'); - - await dp.Runtime.evaluate({expression: ` - createImpressionAnchor('adlink', 'https://a.com', 42, 'https://does-not-matter.com', '_blank');`}); - - const issuePromise = dp.Audits.onceIssueAdded(); - await dp.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-reporting-origin.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-reporting-origin.js deleted file mode 100644 index ed5f21f7..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-insecure-reporting-origin.js +++ /dev/null
@@ -1,20 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, dp} = await testRunner.startBlank( - `Test that clicking an attribution link with an insecure reporting origin triggers an issue.`); - - await dp.Audits.enable(); - await page.navigate('https://devtools.test:8443/inspector-protocol/conversion/resources/impression.html'); - - await dp.Runtime.evaluate({expression: ` - createImpressionAnchor('adlink', 'https://a.com', 42, 'https://destination.com', '_blank', 'http://insecure-reporting-endpoint.com');`}); - - const issuePromise = dp.Audits.onceIssueAdded(); - await dp.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-data.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-data.js deleted file mode 100644 index bac4091..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-data.js +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, dp} = await testRunner.startBlank( - `Test that an attribution link with invalid attribution data triggers an issue.`); - - await dp.Audits.enable(); - await page.navigate('https://devtools.test:8443/inspector-protocol/resources/empty.html'); - - await page.loadHTML(` - <a id="adlink" href="https://a.com" - attributiondestination="https://does-not-matter.com" - attributionsourceeventid="Must be a number, not a string" target="_blank">Impression (ad) - </a>`); - - const issuePromise = dp.Audits.onceIssueAdded(); - await dp.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-expiry.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-expiry.js deleted file mode 100644 index 0ae7eb1..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-expiry.js +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, dp} = await testRunner.startBlank( - `Test that an attribution link with invalid attribution expiry triggers an issue.`); - - await dp.Audits.enable(); - await page.navigate('https://devtools.test:8443/inspector-protocol/resources/empty.html'); - - await page.loadHTML(` - <a id="adlink" href="https://a.com" - attributiondestination="https://does-not-matter.com" - attributionsourceeventid="1" - attributionexpiry="Must be a number, not a string" target="_blank">Impression (ad) - </a>`); - - const issuePromise = dp.Audits.onceIssueAdded(); - await dp.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-priority.js b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-priority.js deleted file mode 100644 index 03914e9d..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/impression-invalid-priority.js +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -(async function(testRunner) { - const {page, dp} = await testRunner.startBlank( - `Test that an attribution link with invalid attribution priority triggers an issue.`); - - await dp.Audits.enable(); - await page.navigate('https://devtools.test:8443/inspector-protocol/resources/empty.html'); - - await page.loadHTML(` - <a id="adlink" href="https://a.com" - attributiondestination="https://does-not-matter.com" - attributionsourceeventid="1" - attributionsourcepriority="Must be a number, not a string" target="_blank">Impression (ad) - </a>`); - - const issuePromise = dp.Audits.onceIssueAdded(); - await dp.Runtime.evaluate({expression: `document.getElementById('adlink').click()`, userGesture: true}); - const issue = await issuePromise; - testRunner.log(issue.params.issue, "Issue reported: ", ['frame', 'violatingNodeId']); - testRunner.completeTest(); -})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/resources/impression.html b/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/resources/impression.html deleted file mode 100644 index a834020..0000000 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/conversion/resources/impression.html +++ /dev/null
@@ -1,20 +0,0 @@ -<!doctype html> -<!-- Test site that creates arbitrary impression anchor elements --> - -<script> - function createImpressionAnchor(id, url, data, destination, target, reportingOrigin) { - const anchor = document.createElement("a"); - anchor.href = url; - anchor.setAttribute("attributionsourceeventid", data); - anchor.setAttribute("attributiondestination", destination); - anchor.setAttribute("target", target); - if (reportingOrigin) - anchor.setAttribute("attributionreportto", reportingOrigin); - anchor.id = id; - anchor.textContent = "Adlink"; - - document.body.appendChild(anchor); - - return anchor; - } -</script>
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden-expected.txt deleted file mode 100644 index 52d249ce..0000000 --- a/third_party/blink/web_tests/platform/generic/external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-in-visibility-hidden-expected.txt +++ /dev/null
@@ -1,6 +0,0 @@ -This is a testharness.js-based test. -PASS Non-modal dialog should let parent visibility inherit -FAIL Modal dialog should have visibility: visible by default in UA sheet assert_equals: expected "visible" but got "hidden" -PASS Modal dialog visibility should be overridable -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/generic/fast/css/content-visibility-console-messages-expected.txt b/third_party/blink/web_tests/platform/generic/fast/css/content-visibility-console-messages-expected.txt new file mode 100644 index 0000000..8f91f50 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/fast/css/content-visibility-console-messages-expected.txt
@@ -0,0 +1,10 @@ +CONSOLE MESSAGE: forcing layout on c-v:hidden should make a console warning. +CONSOLE DEBUG: Rendering was performed in a subtree hidden by content-visibility:hidden. +CONSOLE MESSAGE: forcing layout on c-v:auto should NOT make a console warning. +CONSOLE MESSAGE: calling isVisible should NOT make a console warning. +CONSOLE MESSAGE: forcing layout via range APIs on c-v:hidden should make a console warning. +CONSOLE DEBUG: Rendering was performed in a subtree hidden by content-visibility:hidden. +CONSOLE MESSAGE: forcing layout via range APIs on c-v:auto should NOT make a console warning. +CONSOLE MESSAGE: forcing layout on c-v:hidden inside c-v:auto should make a console warning. +CONSOLE DEBUG: Rendering was performed in a subtree hidden by content-visibility:hidden. +
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt index 2abd0644..46f164ff 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt
@@ -312,8 +312,70 @@ "Z" ] }, - "rowLineNameOffsets": [], - "columnLineNameOffsets": [], + "rowLineNameOffsets": [ + { + "x": 0, + "y": 601, + "name": "sidebar-end" + }, + { + "x": 0, + "y": 300.5, + "name": "sidebar-start" + }, + { + "x": 0, + "y": 300.5, + "name": "header-end" + }, + { + "x": 0, + "y": 601, + "name": "main-end" + }, + { + "x": 0, + "y": 300.5, + "name": "main-start" + }, + { + "x": 0, + "y": 0, + "name": "header-start" + } + ], + "columnLineNameOffsets": [ + { + "x": 200.5, + "y": 0, + "name": "sidebar-end" + }, + { + "x": 0, + "y": 0, + "name": "sidebar-start" + }, + { + "x": 401, + "y": 0, + "name": "header-end" + }, + { + "x": 401, + "y": 0, + "name": "main-end" + }, + { + "x": 200.5, + "y": 0, + "name": "main-start" + }, + { + "x": 0, + "y": 0, + "name": "header-start" + } + ], "gridBorder": [ "M", 0,
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt index 195b565..2aff520 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt
@@ -289,7 +289,38 @@ "name": "header-start" } ], - "columnLineNameOffsets": [], + "columnLineNameOffsets": [ + { + "x": 223, + "y": 98, + "name": "sidebar-end" + }, + { + "x": 98, + "y": 98, + "name": "sidebar-start" + }, + { + "x": 223, + "y": 98, + "name": "content-start" + }, + { + "x": 478, + "y": 98, + "name": "header-end" + }, + { + "x": 478, + "y": 98, + "name": "content-end" + }, + { + "x": 223, + "y": 98, + "name": "header-start" + } + ], "gridBorder": [ "M", 98,
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-disabled-permission-policy-issue-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-disabled-permission-policy-issue-expected.txt deleted file mode 100644 index 3250ff0a..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-disabled-permission-policy-issue-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -Test that a site with disabled conversion measurement Permissions Policy reports an issue when an attribution link is clicked -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - frame : <object> - violatingNodeId : <number> - violationType : PermissionPolicyDisabled - } - } -} -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-destination-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-destination-expected.txt deleted file mode 100644 index ed95c68..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-destination-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -Test that clicking an attribution link with an insecure destination triggers an issue. -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - invalidParameter : http://insecure-destination.com - violatingNodeId : <number> - violationType : AttributionSourceUntrustworthyOrigin - } - } -} -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-expected.txt deleted file mode 100644 index bff6069..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -Test that clicking an attribution link in insecure contexts triggers an issue. -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - frame : <object> - invalidParameter : http://devtools.test:8000 - violatingNodeId : <number> - violationType : AttributionSourceUntrustworthyOrigin - } - } -} -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-with-iframe-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-with-iframe-expected.txt deleted file mode 100644 index c6c19b8..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-main-frame-with-iframe-expected.txt +++ /dev/null
@@ -1,14 +0,0 @@ -Test that clicking an attribution link in a secure iframe thats embedded in an insecure main frame triggers an issue. -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - frame : <object> - invalidParameter : https://devtools.test:8443 - violatingNodeId : <number> - violationType : AttributionSourceUntrustworthyOrigin - } - } -} -Success: violating frame and reporting frame match -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-reporting-origin-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-reporting-origin-expected.txt deleted file mode 100644 index 59cdaa6..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-insecure-reporting-origin-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -Test that clicking an attribution link with an insecure reporting origin triggers an issue. -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - invalidParameter : http://insecure-reporting-endpoint.com - violatingNodeId : <number> - violationType : AttributionSourceUntrustworthyOrigin - } - } -} -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-data-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-data-expected.txt deleted file mode 100644 index 7a7278a..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-data-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -Test that an attribution link with invalid attribution data triggers an issue. -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - frame : <object> - invalidParameter : Must be a number, not a string - violatingNodeId : <number> - violationType : InvalidAttributionSourceEventId - } - } -} -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-expiry-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-expiry-expected.txt deleted file mode 100644 index d8a3454..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-expiry-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -Test that an attribution link with invalid attribution expiry triggers an issue. -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - frame : <object> - invalidParameter : Must be a number, not a string - violatingNodeId : <number> - violationType : InvalidAttributionSourceExpiry - } - } -} -
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-priority-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-priority-expected.txt deleted file mode 100644 index 4a740ab67..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/conversion/impression-invalid-priority-expected.txt +++ /dev/null
@@ -1,13 +0,0 @@ -Test that an attribution link with invalid attribution priority triggers an issue. -Issue reported: { - code : AttributionReportingIssue - details : { - attributionReportingIssueDetails : { - frame : <object> - invalidParameter : Must be a number, not a string - violatingNodeId : <number> - violationType : InvalidAttributionSourcePriority - } - } -} -
diff --git a/third_party/blink/web_tests/platform/generic/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/platform/generic/webexposed/element-instance-property-listing-expected.txt index 417ed37a..1c97661 100644 --- a/third_party/blink/web_tests/platform/generic/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/webexposed/element-instance-property-listing-expected.txt
@@ -339,11 +339,6 @@ property webkitRequestFullScreen property webkitRequestFullscreen html element a - property attributionDestination - property attributionExpiry - property attributionReportTo - property attributionSourceEventId - property attributionSourcePriority property attributionSrc property charset property coords
diff --git a/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt index 2c13278..454f386 100644 --- a/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/webexposed/global-interface-listing-expected.txt
@@ -2881,11 +2881,6 @@ method namedItem interface HTMLAnchorElement : HTMLElement attribute @@toStringTag - getter attributionDestination - getter attributionExpiry - getter attributionReportTo - getter attributionSourceEventId - getter attributionSourcePriority getter attributionSrc getter charset getter coords @@ -2915,11 +2910,6 @@ getter username method constructor method toString - setter attributionDestination - setter attributionExpiry - setter attributionReportTo - setter attributionSourceEventId - setter attributionSourcePriority setter attributionSrc setter charset setter coords
diff --git a/third_party/dav1d/BUILD.gn b/third_party/dav1d/BUILD.gn index 933c8f2..82c828c 100644 --- a/third_party/dav1d/BUILD.gn +++ b/third_party/dav1d/BUILD.gn
@@ -200,6 +200,8 @@ sources += arm_template_sources } else if (current_cpu == "arm64") { sources += arm_template_sources + } else if (current_cpu == "ppc64") { + sources += ppc64_template_sources } cflags = dav1d_copts @@ -230,6 +232,8 @@ sources += arm_template_sources } else if (current_cpu == "arm64") { sources += arm_template_sources + } else if (current_cpu == "ppc64") { + sources += ppc64_template_sources } cflags = dav1d_copts @@ -293,6 +297,23 @@ deps = [ ":dav1d_headers" ] allow_circular_includes_from = [ ":dav1d_headers" ] } +} else if (current_cpu == "ppc64") { + static_library("dav1d_ppc64") { + sources = [ + "libdav1d/src/ppc/cpu.c", + "libdav1d/src/ppc/cpu.h", + ] + + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ + "//build/config/compiler:no_chromium_code", + ":dav1d_config", + ] + cflags = dav1d_copts + + deps = [ ":dav1d_headers" ] + allow_circular_includes_from = [ ":dav1d_headers" ] + } } static_library("dav1d") { @@ -321,5 +342,7 @@ } } else if (current_cpu == "arm" || current_cpu == "arm64") { deps += [ ":dav1d_arm" ] + } else if (current_cpu == "ppc64") { + deps += [ ":dav1d_ppc64" ] } }
diff --git a/third_party/dav1d/dav1d_generated.gni b/third_party/dav1d/dav1d_generated.gni index 478811d2..3fe2668 100644 --- a/third_party/dav1d/dav1d_generated.gni +++ b/third_party/dav1d/dav1d_generated.gni
@@ -109,6 +109,11 @@ "libdav1d/src/arm/mc_init_tmpl.c", ] +ppc64_template_sources = [ + "libdav1d/src/ppc/cdef_init_tmpl.c", + "libdav1d/src/ppc/looprestoration_init_tmpl.c", +] + template_sources = [ "libdav1d/src/cdef_apply_tmpl.c", "libdav1d/src/cdef_tmpl.c",
diff --git a/third_party/dav1d/generate_configs.py b/third_party/dav1d/generate_configs.py index ad5d693f..609b11e 100755 --- a/third_party/dav1d/generate_configs.py +++ b/third_party/dav1d/generate_configs.py
@@ -202,6 +202,8 @@ GenerateConfig('config/linux/arm64', linux_env, ['--cross-file', '../crossfiles/arm64.crossfile']) + GenerateConfig('config/linux/ppc64', linux_env) + win_x86_env = SetupWindowsCrossCompileToolchain('x86') GenerateConfig('config/win/x86', win_x86_env, ['--cross-file', '../crossfiles/win32.crossfile'] + [
diff --git a/third_party/dav1d/generate_source.py b/third_party/dav1d/generate_source.py index ed60ea7e..1a19429e 100755 --- a/third_party/dav1d/generate_source.py +++ b/third_party/dav1d/generate_source.py
@@ -61,6 +61,8 @@ _Glob("libdav1d/src/arm/64/*_tmpl.S") + ["libdav1d/src/arm/64/util.S"]) _WriteArray(fd, "arm_template_sources", _Glob("libdav1d/src/arm/*_tmpl.c")) + _WriteArray(fd, "ppc64_template_sources", _Glob("libdav1d/src/ppc/*_tmpl.c")) + template_sources = _Glob("libdav1d/src/*_tmpl.c") _WriteArray(fd, "template_sources", template_sources)
diff --git a/third_party/libvpx/BUILD.gn b/third_party/libvpx/BUILD.gn index 758aca15..a972e1f1 100644 --- a/third_party/libvpx/BUILD.gn +++ b/third_party/libvpx/BUILD.gn
@@ -399,6 +399,8 @@ sources = libvpx_srcs_arm64 public_deps = [ ":libvpx_arm64_headers" ] } + } else if (current_cpu == "ppc64") { + sources = libvpx_srcs_ppc64 } configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/libvpx/generate_gni.sh b/third_party/libvpx/generate_gni.sh index b937b96..74290800 100755 --- a/third_party/libvpx/generate_gni.sh +++ b/third_party/libvpx/generate_gni.sh
@@ -374,6 +374,7 @@ gen_config_files linux/arm64-highbd "--target=armv8-linux-gcc ${all_platforms} ${HIGHBD}" gen_config_files linux/mipsel "--target=mips32-linux-gcc ${all_platforms}" gen_config_files linux/mips64el "--target=mips64-linux-gcc ${all_platforms}" +gen_config_files linux/ppc64 "--target=ppc64le-linux-gcc ${all_platforms}" gen_config_files linux/generic "--target=generic-gnu $HIGHBD ${all_platforms}" gen_config_files win/arm64 "--target=arm64-win64-vs15 ${all_platforms} ${HIGHBD}" gen_config_files win/ia32 "--target=x86-win32-vs14 ${all_platforms} ${x86_platforms}" @@ -399,6 +400,7 @@ lint_config linux/arm64-highbd lint_config linux/mipsel lint_config linux/mips64el +lint_config linux/ppc64 lint_config linux/generic lint_config win/arm64 lint_config win/ia32 @@ -428,6 +430,7 @@ gen_rtcd_header linux/arm64-highbd armv8 gen_rtcd_header linux/mipsel mipsel gen_rtcd_header linux/mips64el mips64el +gen_rtcd_header linux/ppc64 ppc gen_rtcd_header linux/generic generic gen_rtcd_header win/arm64 armv8 gen_rtcd_header win/ia32 x86 "${require_sse2}" @@ -513,6 +516,13 @@ echo "MIPS64 source list is identical to MIPS source list. No need to generate it." + echo "Generate ppc64 source list." + config=$(print_config_basic linux/ppc64) + make_clean + make libvpx_srcs.txt target=libs $config > /dev/null + convert_srcs_to_project_files libvpx_srcs.txt libvpx_srcs_ppc64 + + echo "Generate NaCl source list." config=$(print_config_basic nacl) make_clean
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index ea7195a..ff2ee68 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -17556,6 +17556,11 @@ <description>User pressed the back icon in the app menu.</description> </action> +<action name="MobileMenuClearBrowsingData"> + <owner>rkgibson@google.com</owner> + <description>User pressed 'Clear Browsing Data' in the app menu.</description> +</action> + <action name="MobileMenuCloseAllIncognitoTabs"> <owner>gambard@chromium.org</owner> <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 50ba7204..718083af 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -31401,6 +31401,9 @@ <int value="980" label="ProjectorDogfoodForFamilyLinkEnabled"/> <int value="981" label="UrlParamFilterEnabled"/> <int value="982" label="ScreenTimeEnabled"/> + <int value="983" label="DefaultClipboardSetting"/> + <int value="984" label="ClipboardAllowedForUrls"/> + <int value="985" label="ClipboardBlockedForUrls"/> </enum> <enum name="EnterprisePoliciesSources"> @@ -85951,6 +85954,11 @@ <int value="0" label="Tap on side search toolbar button"/> </enum> +<enum name="SideSearchPageActionLabelVisibility"> + <int value="0" label="Label not visible"/> + <int value="1" label="Label visible"/> +</enum> + <enum name="SignedExchangeLoadResult"> <int value="0" label="Loaded successfully"/> <int value="1" label="Served from non-secure origin"/>
diff --git a/tools/metrics/histograms/metadata/bookmarks/histograms.xml b/tools/metrics/histograms/metadata/bookmarks/histograms.xml index aba47e0..232e9a2be 100644 --- a/tools/metrics/histograms/metadata/bookmarks/histograms.xml +++ b/tools/metrics/histograms/metadata/bookmarks/histograms.xml
@@ -670,6 +670,36 @@ </summary> </histogram> +<histogram name="Bookmarks.Storage.FileSizeAtStartup" units="KB" + expires_after="2023-04-21"> + <owner>wylieb@chromium.org</owner> + <owner>chrome-collections@google.com</owner> + <component>UI>Browser>Bookmarks</component> + <summary>Size of the bookmarks file, recorded at startup.</summary> +</histogram> + +<histogram name="Bookmarks.Storage.TimeSinceLastScheduledSave" units="ms" + expires_after="2023-04-21"> + <owner>wylieb@chromium.org</owner> + <owner>chrome-collections@google.com</owner> + <component>UI>Browser>Bookmarks</component> + <summary> + Time delta between bookmark file saves, recorded when a save occurs. + Recorded on the first save as the time since startup. + </summary> +</histogram> + +<histogram name="Bookmarks.Storage.TimeToLoadAtStartup" units="ms" + expires_after="2023-04-21"> + <owner>wylieb@chromium.org</owner> + <owner>chrome-collections@google.com</owner> + <component>UI>Browser>Bookmarks</component> + <summary> + Duration of loading the bookmarks file, recorded when the bookmark model is + loaded. + </summary> +</histogram> + <histogram name="Bookmarks.UsageCountPerProfileType" enum="BrowserProfileType" expires_after="2022-10-16"> <owner>rhalavati@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index e99e5fe7..c6d49650 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -80,6 +80,17 @@ summary="the message introducing price chips"/> </variants> +<variants name="ImportantFileClients"> + <variant name="" summary="Unknown file"/> + <variant name=".BookmarkStorage" summary="Bookmarks file"/> + <variant name=".FeedbackReport" summary="Feedback Report file"/> + <variant name=".Local_State" summary="Local State file"/> + <variant name=".Preferences" summary="Preferences file"/> + <variant name=".Secure_Preferences" summary="Secure Preferences file"/> + <variant name=".StructuredMetricsPersistentProto" + summary="Structured metrics persistent proto"/> +</variants> + <variants name="InterestGroupRequestType"> <variant name="BiddingScriptJS" summary="buyer JavaScript bidding script"/> <variant name="BiddingScriptWasm" summary="buyer WebAssembly bidding script"/> @@ -3511,6 +3522,9 @@ <histogram name="Conversions.RegisteredImpressionsPerPage" units="impressions" expires_after="2022-10-04"> + <obsolete> + Only tracked in obsolete Attribution Reporting API surface. Removed 04/22. + </obsolete> <owner>johnidel@chromium.org</owner> <owner>csharrison@chromium.org</owner> <owner>linnan@chromium.org</owner> @@ -3776,6 +3790,9 @@ <histogram name="Conversions.UniqueReportingOriginsPerPage.Impressions" units="origins" expires_after="2022-10-09"> + <obsolete> + Only tracked in obsolete Attribution Reporting API surface. Removed 04/22. + </obsolete> <owner>linnan@chromium.org</owner> <owner>johnidel@chromium.org</owner> <owner>measurement-api-dev+metrics@google.com</owner> @@ -6395,8 +6412,8 @@ </summary> </histogram> -<histogram name="ImportantFile.SerializationDuration{File}" units="ms" - expires_after="2022-12-12"> +<histogram name="ImportantFile.SerializationDuration{ImportantFileClients}" + units="ms" expires_after="2022-12-12"> <owner>battre@chromium.org</owner> <owner>gab@chromium.org</owner> <summary> @@ -6406,16 +6423,7 @@ serialization (e.g. bookmarks), it excludes the time spent on the background thread, and only logs the time spent on the foreground thread. </summary> - <token key="File"> - <variant name="" summary="Unknown file"/> - <variant name=".BookmarkStorage" summary="Bookmarks file"/> - <variant name=".FeedbackReport" summary="Feedback Report file"/> - <variant name=".Local_State" summary="Local State file"/> - <variant name=".Preferences" summary="Preferences file"/> - <variant name=".Secure_Preferences" summary="Secure Preferences file"/> - <variant name=".StructuredMetricsPersistentProto" - summary="Structured metrics persistent proto"/> - </token> + <token key="ImportantFileClients" variants="ImportantFileClients"/> </histogram> <histogram name="ImportantFile.TempFileFailures" enum="TempFileFailure" @@ -6431,6 +6439,17 @@ </summary> </histogram> +<histogram name="ImportantFile.WriteDuration{ImportantFileClients}" units="ms" + expires_after="2023-04-21"> + <owner>wylieb@chromium.org</owner> + <owner>chrome-collections@google.com</owner> + <summary> + CPU time used in the background thread to write serialized data into an + important file. Recorded when the file is written. + </summary> + <token key="ImportantFileClients" variants="ImportantFileClients"/> +</histogram> + <histogram name="Incognito.ClearBrowsingDataDialog.ActionType" enum="IncognitoClearBrowsingDataDialogActionType" expires_after="2022-09-01">
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml index b920dbc..579ada7 100644 --- a/tools/metrics/histograms/metadata/sb_client/histograms.xml +++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -621,6 +621,10 @@ <histogram name="SBClientPhishing.MainFrameRemoteExists" enum="BooleanExists" expires_after="2022-08-29"> + <obsolete> + Removed 04-2022 since the logic for how PhishingDetectors are managed + changed. + </obsolete> <owner>drubery@chromium.org</owner> <owner>chrome-safebrowsing-alerts@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/side_search/histograms.xml b/tools/metrics/histograms/metadata/side_search/histograms.xml index dd32b6d..59a60234 100644 --- a/tools/metrics/histograms/metadata/side_search/histograms.xml +++ b/tools/metrics/histograms/metadata/side_search/histograms.xml
@@ -104,6 +104,17 @@ </summary> </histogram> +<histogram name="SideSearch.PageActionIcon.LabelVisibleWhenToggled" + enum="SideSearchPageActionLabelVisibility" expires_after="2022-09-29"> + <owner>yuhengh@chromium.org</owner> + <owner>tluk@chromium.org</owner> + <summary> + This metric tracks whether the SideSearchIconView's label is visible when + the page action is toggled. The label is considered visible if it is fully + expanded as well as if it is animating in and out. + </summary> +</histogram> + <histogram name="SideSearch.RedirectionToTabCountPerJourney" units="navigations" expires_after="2022-09-29"> <owner>yuhengh@chromium.org</owner>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv index dfbb58d..0b6af29e 100644 --- a/tools/perf/benchmark.csv +++ b/tools/perf/benchmark.csv
@@ -2,6 +2,10 @@ See the following link for directions for making changes to this data:,https://bit.ly/update-benchmarks-info Googlers can view additional information about internal perf infrastructure at,https://goto.google.com/chrome-benchmarking-sheet Benchmark name,Individual owners,Component,Documentation,Tags +UNSCHEDULED_GP-desktop,"vahl@chromium.org, cbruni@chromium.org",Blink>JavaScript,https://docs.google.com/document/d/1azH3HnV0IIbd1NtcX_8K_E_s_aJVS45MqkRCg-DT8tE/edit?usp=sharing&resourcekey=0-mW7mSVdRfxbQezL6ZdF3Fg,all +UNSCHEDULED_GP-desktop-future,"vahl@chromium.org, cbruni@chromium.org",Blink>JavaScript,https://docs.google.com/document/d/1azH3HnV0IIbd1NtcX_8K_E_s_aJVS45MqkRCg-DT8tE/edit?usp=sharing&resourcekey=0-mW7mSVdRfxbQezL6ZdF3Fg,all +UNSCHEDULED_GP-mobile,"vahl@chromium.org, cbruni@chromium.org",Blink>JavaScript,https://docs.google.com/document/d/1azH3HnV0IIbd1NtcX_8K_E_s_aJVS45MqkRCg-DT8tE/edit?usp=sharing&resourcekey=0-mW7mSVdRfxbQezL6ZdF3Fg,all +UNSCHEDULED_GP-mobile-future,"vahl@chromium.org, cbruni@chromium.org",Blink>JavaScript,https://docs.google.com/document/d/1azH3HnV0IIbd1NtcX_8K_E_s_aJVS45MqkRCg-DT8tE/edit?usp=sharing&resourcekey=0-mW7mSVdRfxbQezL6ZdF3Fg,all UNSCHEDULED_blink_perf.performance_apis,yoavweiss@chromium.org,Blink>PerformanceAPIs,https://bit.ly/blink-perf-benchmarks,all UNSCHEDULED_blink_perf.service_worker,"shimazu@chromium.org, falken@chromium.org, ting.shao@intel.com",Blink>ServiceWorker,https://bit.ly/blink-perf-benchmarks, UNSCHEDULED_loading.mbi,blink-isolation-dev@chromium.org,Blink>Internals>Modularization,https://bit.ly/loading-benchmarks,many_agents
diff --git a/tools/perf/benchmarks/gp.py b/tools/perf/benchmarks/gp.py new file mode 100644 index 0000000..5976df8 --- /dev/null +++ b/tools/perf/benchmarks/gp.py
@@ -0,0 +1,161 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""GP performance benchmark. +""" + +from benchmarks import press + +from telemetry import story +from telemetry import benchmark +from telemetry.timeline import chrome_trace_category_filter +from telemetry.web_perf import timeline_based_measurement + +import page_sets + +DOC_URL_ = ("https://docs.google.com/document/d/" + "1azH3HnV0IIbd1NtcX_8K_E_s_aJVS45MqkRCg-DT8tE/edit?" + "usp=sharing&resourcekey=0-mW7mSVdRfxbQezL6ZdF3Fg") + + +class _GP(press._PressBenchmark): # pylint: disable=protected-access + """GP Benchmark. + """ + + enable_smoke_test_mode = False + enable_systrace = False + extra_chrome_categories = False + enable_rcs = False + iteration_count = None + show_iteration_metrics = False + + def CreateStorySet(self, options): + # For a smoke test one iteration is sufficient + if self.enable_smoke_test_mode and not self.iteration_count: + iteration_count = 1 + else: + iteration_count = self.iteration_count + + if self.PLATFORM == 'mobile': + page_set_cls = page_sets.GPMobileStorySet2022 + elif self.PLATFORM == 'desktop': + page_set_cls = page_sets.GPDesktopStorySet2022 + else: + raise Exception("Unknown platform: %s" % self.PLATFORM) + return page_set_cls(iteration_count=iteration_count, + show_iteration_metrics=self.show_iteration_metrics) + + def CreateCoreTimelineBasedMeasurementOptions(self): + if not self.enable_systrace: + return timeline_based_measurement.Options() + + cat_filter = chrome_trace_category_filter.ChromeTraceCategoryFilter() + + # "blink.console" is used for marking ranges in + # cache_temperature.MarkTelemetryInternal. + cat_filter.AddIncludedCategory('blink.console') + + # "toplevel" category is used to capture TaskQueueManager events. + cat_filter.AddIncludedCategory('toplevel') + + if self.extra_chrome_categories: + cat_filter.AddFilterString(self.extra_chrome_categories) + + if self.enable_rcs: + # V8 needed categories + cat_filter.AddIncludedCategory('v8') + cat_filter.AddDisabledByDefault('disabled-by-default-v8.runtime_stats') + + tbm_options = timeline_based_measurement.Options( + overhead_level=cat_filter) + tbm_options.SetTimelineBasedMetrics(['runtimeStatsTotalMetric']) + return tbm_options + + tbm_options = timeline_based_measurement.Options(overhead_level=cat_filter) + tbm_options.SetTimelineBasedMetrics(['tracingMetric']) + return tbm_options + + def SetExtraBrowserOptions(self, options): + if self.enable_rcs: + options.AppendExtraBrowserArgs( + '--enable-blink-features=BlinkRuntimeCallStats') + + @classmethod + def AddBenchmarkCommandLineArgs(cls, parser): + parser.add_option('--enable-rcs', + action="store_true", + help="Enables runtime call stats") + parser.add_option('--show-iteration-metrics', + action="store_true", + help="Show the total metrics for each iteration") + parser.add_option('--iteration-count', + type="int", + help="Override the default number of iterations") + + @classmethod + def ProcessCommandLineArgs(cls, parser, args): + if args.enable_systrace or args.enable_rcs: + cls.enable_systrace = True + if args.extra_chrome_categories: + cls.extra_chrome_categories = args.extra_chrome_categories + if args.enable_rcs: + cls.enable_rcs = True + if args.show_iteration_metrics: + cls.show_iteration_metrics = False + if args.iteration_count: + cls.iteration_count = args.iteration_count + + +@benchmark.Info(emails=['vahl@chromium.org', 'cbruni@chromium.org'], + component='Blink>JavaScript', + documentation_url=DOC_URL_) +class GP2022Desktop(_GP): + PLATFORM = 'desktop' + SUPPORTED_PLATFORMS = [story.expectations.ALL_DESKTOP] + + @classmethod + def Name(cls): + return 'UNSCHEDULED_GP-desktop' + + +@benchmark.Info(emails=['vahl@chromium.org', 'cbruni@chromium.org'], + component='Blink>JavaScript', + documentation_url=DOC_URL_) +class GP2022Mobile(_GP): + PLATFORM = 'mobile' + SUPPORTED_PLATFORMS = [story.expectations.ALL_MOBILE] + + @classmethod + def Name(cls): + return 'UNSCHEDULED_GP-mobile' + + +class _V8FutureMixin(object): + def SetExtraBrowserOptions(self, options): + options.AppendExtraBrowserArgs('--enable-features=V8VmFuture') + + +@benchmark.Info(emails=['vahl@chromium.org', 'cbruni@chromium.org'], + component='Blink>JavaScript', + documentation_url=DOC_URL_) +class V8GP2022FutureDesktop(GP2022Desktop, _V8FutureMixin): + """GP benchmark with the V8 flag --future. + Shows the performance of upcoming V8 VM features. + """ + + @classmethod + def Name(cls): + return 'UNSCHEDULED_GP-desktop-future' + + +@benchmark.Info(emails=['vahl@chromium.org', 'cbruni@chromium.org'], + component='Blink>JavaScript', + documentation_url=DOC_URL_) +class V8GP2022FutureMobile(GP2022Mobile, _V8FutureMixin): + """GP benchmark with the V8 flag --future. + Shows the performance of upcoming V8 VM features. + """ + + @classmethod + def Name(cls): + return 'UNSCHEDULED_GP-mobile-future'
diff --git a/tools/perf/core/minidump_unittest.py b/tools/perf/core/minidump_unittest.py index 7da66c3..61f51f20 100644 --- a/tools/perf/core/minidump_unittest.py +++ b/tools/perf/core/minidump_unittest.py
@@ -29,6 +29,7 @@ FORCED_RENDERER_CRASH_SIGNATURES = [ 'base::debug::BreakDebugger', 'blink::DevToolsSession::IOSession::DispatchProtocolCommand', + 'blink::HandleChromeDebugURL', 'chrome!DispatchProtocolCommand', 'logging::LogMessage::~LogMessage', ] @@ -63,7 +64,6 @@ # still read-only, so skip the test in that case. @decorators.Disabled( 'chromeos-local', - 'mac', # https://crbug.com/1271097 'win7' # https://crbug.com/1084931 ) def testSymbolizeMinidump(self): @@ -109,7 +109,6 @@ # still read-only, so skip the test in that case. @decorators.Disabled( 'chromeos-local', - 'mac', # https://crbug.com/1271097 'win7' # https://crbug.com/1084931 ) def testMultipleCrashMinidumps(self): @@ -202,9 +201,7 @@ # Minidump symbolization doesn't work in ChromeOS local mode if the rootfs is # still read-only, so skip the test in that case. @decorators.Disabled( - 'chromeos', # https://crbug.com/1247948 'chromeos-local', - 'mac', # https://crbug.com/1271097 'win7' # https://crbug.com/1084931 ) def testMinidumpFromRendererHang(self):
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index a6b4de4a..4c63323 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "de08f614a53968ff4f03fe9b53a7e065f64dfbc5", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/e2b6ce31bd4460d7b4ba56c378c5cbc62aa5234d/trace_processor_shell" + "hash": "1664e057453fd87d920d20cd4a991e55867aef00", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/6f088f4e829de8d845bf57e04bbb713336f3aa0b/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/page_sets/gp_pages.py b/tools/perf/page_sets/gp_pages.py new file mode 100644 index 0000000..bcdbad9a7 --- /dev/null +++ b/tools/perf/page_sets/gp_pages.py
@@ -0,0 +1,108 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""GrandPrix performance benchmark pages +""" +from telemetry import story +from page_sets import press_story +from page_sets.system_health import platforms + +_GP_PAGE_ALL = 'All' +_GP_SCORE_METRIC = 'Score' +_GP_TOPLEVEL_METRICS = ('Total', _GP_SCORE_METRIC) + +_GP_PAGES = [ + 'Vanilla-HTML-TodoMVC', 'Vanilla-TodoMVC', 'Preact-TodoMVC', + 'Preact-TodoMVC-Modern', 'React-TodoMVC', 'Elm-TodoMVC', 'Rust-Yew-TodoMVC', + 'Hydration-Preact', 'Scroll-Windowing-React', 'Monaco-Editor', + 'Monaco-Syntax-Highlight', 'React-Stockcharts', 'React-Stockcharts-SVG', + 'Leaflet-Fractal', 'SVG-UI', 'Proxx-Tables', 'Proxx-Tables-Lit', + 'Proxx-Tables-Canvas', _GP_PAGE_ALL +] + + +class GPStory(press_story.PressStory): + BASE_URL = 'http://localhost:8000/?suites={suite}&sandbox=none&unit=ms'\ + '&viewport={viewport}&headless=1' + NAME = 'GP' + + def __init__(self, + page_set, + name, + iterations, + viewport, + skip_iteration_metrics=False): + super(GPStory, self).__init__(page_set, + url=self.BASE_URL.format(suite=name, + viewport=viewport), + name=name) + self._iterations = iterations or 10 + self._skip_iteration_metrics = skip_iteration_metrics + + def ExecuteTest(self, action_runner): + action_runner.tab.WaitForDocumentReadyStateToBeComplete() + action_runner.Wait(1) + action_runner.EvaluateJavaScript(""" + globalThis.runner.configure({ + iterations: {{ iterations }} + }); + globalThis.runner.run(); // returns a Promise + """, + promise=True, + timeout=30, + iterations=self._iterations) + + def ParseTestResults(self, action_runner): + metrics = action_runner.EvaluateJavaScript( + "Object.keys(globalThis.results.metrics)") + for metric_name in metrics: + if self._skip_iteration_metrics and metric_name.startswith('Iteration-'): + continue + unit = 'ms_smallerIsBetter' + if metric_name == _GP_SCORE_METRIC: + unit = 'unitless_biggerIsBetter' + reported_name = metric_name + # if self.name == _GP_PAGE_ALL: + # reported_name = "All-%s" % metric_name + # else: + # if metric_name in _GP_TOPLEVEL_METRICS: + # if metric_name == _GP_SCORE_METRIC: + # reported_name = "%s-%s" % (self.name, metric_name) + # else: + # # Only report top-level metrics + # continue + self.AddJavaScriptMeasurement( + reported_name, unit, + 'globalThis.results.metrics["%s"].values' % metric_name) + + +class _GPStorySet(story.StorySet): + def __init__(self, iteration_count, viewport, show_iteration_metrics=False): + super(_GPStorySet, + self).__init__(archive_data_file='data/GP.json', + cloud_storage_bucket=story.INTERNAL_BUCKET) + suites = _GP_PAGES + for name in suites: + self.AddStory( + GPStory(self, name, iteration_count, viewport, + show_iteration_metrics)) + + +class GPDesktopStorySet2022(_GPStorySet): + SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY + + def __init__(self, iteration_count, show_iteration_metrics): + super(GPDesktopStorySet2022, + self).__init__(iteration_count, + viewport="2000x1000", + show_iteration_metrics=show_iteration_metrics) + + +class GPMobileStorySet2022(_GPStorySet): + SUPPORTED_PLATFORMS = platforms.MOBILE_ONLY + + def __init__(self, iteration_count, show_iteration_metrics): + super(GPMobileStorySet2022, + self).__init__(iteration_count, + viewport="1000x2000", + show_iteration_metrics=show_iteration_metrics)
diff --git a/tools/perf/page_sets/press_story.py b/tools/perf/page_sets/press_story.py index b31e8c8..0210698b 100644 --- a/tools/perf/page_sets/press_story.py +++ b/tools/perf/page_sets/press_story.py
@@ -29,13 +29,18 @@ DETERMINISTIC_JS = False NAME = None - def __init__(self, page_set, tags=None, extra_browser_args=None): + def __init__(self, + page_set, + tags=None, + extra_browser_args=None, + url=None, + name=None): super(PressStory, - self).__init__(self.URL, + self).__init__(url or self.URL, page_set, base_dir=page_set.base_dir, make_javascript_deterministic=self.DETERMINISTIC_JS, - name=self.NAME if self.NAME else self.URL, + name=name or self.NAME or self.URL, tags=self.PreprocessTags(tags), extra_browser_args=extra_browser_args) self._measurements = []
diff --git a/tools/perf/pylintrc b/tools/perf/pylintrc index 4c52de84..41007dc 100644 --- a/tools/perf/pylintrc +++ b/tools/perf/pylintrc
@@ -52,3 +52,7 @@ # We suppress long line check for lines that contain only the URL (with or # without quote). ignore-long-lines=^\s*'?https?://\S+'?$ + + +[DESIGN] +max-parents=10
diff --git a/tools/polymer/html_to_wrapper.py b/tools/polymer/html_to_wrapper.py index 9855203..55e7e05 100644 --- a/tools/polymer/html_to_wrapper.py +++ b/tools/polymer/html_to_wrapper.py
@@ -2,9 +2,21 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -# Genaretes a file that exports an HTML Polymer template from a JS/TS file. This -# is useful for implementing Web Components using JS modules, where all the HTML -# needs to reside in the JS file (no more HTML imports). +# Genaretes a wrapper TS file around a source HTML file holding either +# 1) a Polymer element template or +# 2) an <iron-iconset-svg> definitions +# +# Note: The HTML file must be named either 'icons.html' or be suffixed with +# '_icons.html' for this tool to treat them as #2. Consequently, files holding +# Polymer element templates should not use such naming to be treated as #1. +# +# In case #1 the wrapper exports a getTemplate() function that can be used at +# runtime to import the template. This is useful for implementing Web Components +# using JS modules, where all the HTML needs to reside in a JS file (no more +# HTML imports). +# +# In case #2 the wrapper adds the <iron-iconset-svg> element to <head>, so that +# it can be used by <iron-icon> instances. import argparse import sys @@ -13,12 +25,17 @@ _CWD = getcwd() -_EXPORT_TEMPLATE = 'import {html} from \ -\'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js\';\n\ -export function getTemplate() {\n\ - return html`<!--_html_template_start_-->%s\ -<!--_html_template_end_-->`;\n\ -}' +_ELEMENT_TEMPLATE = """import {html} from \'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js\'; +export function getTemplate() { + return html`<!--_html_template_start_-->%s<!--_html_template_end_-->`; +}""" + +_ICONS_TEMPLATE = """import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; +import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +const template = html`%s`; +document.head.appendChild(template.content); +""" def main(argv): @@ -37,13 +54,21 @@ for in_file in args.in_files: with io.open(path.join(in_folder, in_file), encoding='utf-8', mode='r') as f: - html_template = f.read() - js_export = _EXPORT_TEMPLATE % html_template + html_content = f.read() + + wrapper = None + template = _ELEMENT_TEMPLATE + + filename = path.basename(in_file) + if filename == 'icons.html' or filename.endswith('_icons.html'): + template = _ICONS_TEMPLATE + + wrapper = template % html_content out_folder_for_file = path.join(out_folder, path.dirname(in_file)) makedirs(out_folder_for_file, exist_ok=True) with io.open(path.join(out_folder, in_file) + extension, mode='wb') as f: - f.write(js_export.encode('utf-8')) + f.write(wrapper.encode('utf-8')) return
diff --git a/tools/polymer/html_to_wrapper_test.py b/tools/polymer/html_to_wrapper_test.py index f609ef82..2f30b0f 100755 --- a/tools/polymer/html_to_wrapper_test.py +++ b/tools/polymer/html_to_wrapper_test.py
@@ -40,10 +40,15 @@ expected_wrapper = f.read() self.assertMultiLineEqual(str(expected_wrapper), str(actual_wrapper)) - def testHtmlToWrapper(self): + def testHtmlToWrapperElement(self): self._run_test('html_to_wrapper/foo.html', 'html_to_wrapper/foo.html.ts', 'html_to_wrapper/foo_expected.html.ts') + def testHtmlToWrapperIcons(self): + self._run_test('html_to_wrapper/icons.html', + 'html_to_wrapper/icons.html.ts', + 'html_to_wrapper/icons_expected.html.ts') + if __name__ == '__main__': unittest.main()
diff --git a/tools/polymer/tests/html_to_wrapper/icons.html b/tools/polymer/tests/html_to_wrapper/icons.html new file mode 100644 index 0000000..79ad105 --- /dev/null +++ b/tools/polymer/tests/html_to_wrapper/icons.html
@@ -0,0 +1,7 @@ +<iron-iconset-svg name="dummy" size="24"> + <svg> + <defs> + <g id="foo"><path d="M12 2C6.48 2 2 6.48 2"></path></g> + </defs> + </svg> +</iron-iconset-svg>
diff --git a/tools/polymer/tests/html_to_wrapper/icons_expected.html.ts b/tools/polymer/tests/html_to_wrapper/icons_expected.html.ts new file mode 100644 index 0000000..1e0e97f --- /dev/null +++ b/tools/polymer/tests/html_to_wrapper/icons_expected.html.ts
@@ -0,0 +1,12 @@ +import 'chrome://resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; +import {html} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +const template = html`<iron-iconset-svg name="dummy" size="24"> + <svg> + <defs> + <g id="foo"><path d="M12 2C6.48 2 2 6.48 2"></path></g> + </defs> + </svg> +</iron-iconset-svg> +`; +document.head.appendChild(template.content);
diff --git a/tools/visual_debugger/OWNERS b/tools/visual_debugger/OWNERS index 4a8dc1f..5a02699d 100644 --- a/tools/visual_debugger/OWNERS +++ b/tools/visual_debugger/OWNERS
@@ -1,3 +1,3 @@ +fangzhoug@chromium.org petermcneeley@google.com sadrul@chromium.org -
diff --git a/ui/events/event_switches.cc b/ui/events/event_switches.cc index 477aff1..a28b059 100644 --- a/ui/events/event_switches.cc +++ b/ui/events/event_switches.cc
@@ -14,6 +14,13 @@ const char kCompensateForUnstablePinchZoom[] = "compensate-for-unstable-pinch-zoom"; +// Overrides touch slop distance for gesture detection. The touch slop distance +// is the maximum distance from the starting point of a touch sequence that a +// gesture can travel before it can no longer be considered a tap. Scroll +// gestures can only begin after this distance has been travelled. The switch +// value is a floating point number that is interpreted as a distance in pixels. +const char kTouchSlopDistance[] = "touch-slop-distance"; + #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // Tells chrome to interpret events from these devices as touch events. Only // available with XInput 2 (i.e. X server 1.8 or above). The id's of the
diff --git a/ui/events/event_switches.h b/ui/events/event_switches.h index 158766a..08a45c3 100644 --- a/ui/events/event_switches.h +++ b/ui/events/event_switches.h
@@ -11,6 +11,7 @@ namespace switches { EVENTS_BASE_EXPORT extern const char kCompensateForUnstablePinchZoom[]; +EVENTS_BASE_EXPORT extern const char kTouchSlopDistance[]; #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) EVENTS_BASE_EXPORT extern const char kTouchDevices[];
diff --git a/ui/events/gesture_detection/gesture_configuration_aura.cc b/ui/events/gesture_detection/gesture_configuration_aura.cc index b79927ff..5dabd73 100644 --- a/ui/events/gesture_detection/gesture_configuration_aura.cc +++ b/ui/events/gesture_detection/gesture_configuration_aura.cc
@@ -6,6 +6,7 @@ #include "base/command_line.h" #include "base/memory/singleton.h" +#include "base/strings/string_number_conversions.h" #include "build/chromeos_buildflags.h" #include "ui/events/event_switches.h" @@ -38,6 +39,15 @@ // details. set_max_touch_move_in_pixels_for_click(6); #endif + double touch_slop_distance; + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + if (command_line->HasSwitch(switches::kTouchSlopDistance) && + base::StringToDouble( + command_line->GetSwitchValueASCII(switches::kTouchSlopDistance), + &touch_slop_distance)) { + set_max_touch_move_in_pixels_for_click(touch_slop_distance); + } + set_double_tap_enabled(kDoubleTapAuraSupport); set_double_tap_timeout_in_ms(double_tap_timeout_in_ms()); set_gesture_begin_end_types_enabled(true);
diff --git a/ui/views/controls/table/table_view.cc b/ui/views/controls/table/table_view.cc index 4671220..e98dd55f 100644 --- a/ui/views/controls/table/table_view.cc +++ b/ui/views/controls/table/table_view.cc
@@ -319,6 +319,8 @@ : *selection_model_.selected_indices().begin(); } +// TODO(dpenning) : Prevent the last column from being closed. See +// crbug.com/1324306 for details. void TableView::SetColumnVisibility(int id, bool is_visible) { if (is_visible == IsColumnVisible(id)) return;
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn index c83069b..ce220f6 100644 --- a/ui/webui/resources/BUILD.gn +++ b/ui/webui/resources/BUILD.gn
@@ -150,19 +150,6 @@ } } -group("modulize") { - public_deps = [ - "cr_elements:custom_elements", - "js:modulize", - "js/cr:modulize", - "js/cr/ui:modulize", - ] - - if (include_polymer) { - public_deps += [ "cr_components:polymer3_elements" ] - } -} - # TypeScript targets preprocessed_folder = "$target_gen_dir/preprocessed" @@ -262,7 +249,6 @@ "cr_elements/cr_actionable_row_style.m.js", "cr_elements/cr_icons_css.m.js", "cr_elements/cr_input/cr_input_style_css.m.js", - "cr_elements/cr_page_host_style_css.js", "cr_elements/cr_radio_button/cr_radio_button_style_css.m.js", "cr_elements/hidden_style_css.m.js", "cr_elements/icons.m.js", @@ -327,9 +313,13 @@ if (include_polymer) { in_files += [ + "cr_components/iph_bubble/iph_bubble.html.ts", "cr_components/iph_bubble/iph_bubble.ts", + "cr_components/localized_link/localized_link.html.ts", "cr_components/localized_link/localized_link.ts", + "cr_components/managed_footnote/managed_footnote.html.ts", "cr_components/managed_footnote/managed_footnote.ts", + "cr_components/managed_dialog/managed_dialog.html.ts", "cr_components/managed_dialog/managed_dialog.ts", "cr_elements/cr_auto_img/cr_auto_img.ts", "cr_elements/cr_grid/cr_grid.html.ts", @@ -344,7 +334,8 @@ "cr_elements/cr_link_row/cr_link_row.html.ts", "cr_elements/cr_link_row/cr_link_row.ts", "cr_elements/cr_menu_selector/cr_menu_selector.ts", - "cr_elements/cr_nav_menu_item_style.ts", + "cr_elements/cr_nav_menu_item_style.css.ts", + "cr_elements/cr_page_host_style.css.ts", "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.html.ts", "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector_grid.ts", "cr_elements/cr_profile_avatar_selector/cr_profile_avatar_selector.html.ts", @@ -371,11 +362,11 @@ "cr_elements/cr_view_manager/cr_view_manager.ts", "cr_elements/find_shortcut_mixin.ts", "cr_elements/mouse_hoverable_mixin.ts", - "cr_elements/mwb_element_shared_style.ts", - "cr_elements/mwb_shared_icons.ts", - "cr_elements/mwb_shared_style.ts", - "cr_elements/mwb_shared_vars.ts", - "cr_elements/search_highlight_style_css.ts", + "cr_elements/mwb_element_shared_style.css.ts", + "cr_elements/mwb_shared_icons.html.ts", + "cr_elements/mwb_shared_style.css.ts", + "cr_elements/mwb_shared_vars.css.ts", + "cr_elements/search_highlight_style.css.ts", "js/i18n_mixin.ts", "js/list_property_update_mixin.ts", "js/web_ui_listener_mixin.ts",
diff --git a/ui/webui/resources/cr_components/BUILD.gn b/ui/webui/resources/cr_components/BUILD.gn index e60ee7a..e8fdf4b 100644 --- a/ui/webui/resources/cr_components/BUILD.gn +++ b/ui/webui/resources/cr_components/BUILD.gn
@@ -5,6 +5,7 @@ import("//build/config/chromeos/ui_mode.gni") import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/preprocess_if_expr.gni") +import("//tools/polymer/html_to_wrapper.gni") import("//ui/webui/resources/tools/generate_grd.gni") import("//ui/webui/webui_features.gni") @@ -79,6 +80,7 @@ public_deps = [ ":preprocess_generated_ts", ":preprocess_src", + ":preprocess_src_ts", ] if (is_chromeos_ash) { @@ -109,7 +111,7 @@ if (is_chromeos_ash) { preprocess_if_expr("preprocess_generated") { - deps = [ ":polymer3_elements" ] + deps = [ "chromeos:polymer3_elements" ] in_folder = target_gen_dir out_folder = preprocess_folder out_manifest = "$target_gen_dir/$preprocess_gen_manifest" @@ -208,9 +210,8 @@ # TS files are passed to a separate target so that they are not listed in the # |out_manifest|. -preprocess_if_expr("preprocess_generated_ts") { - deps = [ ":polymer3_elements" ] - in_folder = target_gen_dir +preprocess_if_expr("preprocess_src_ts") { + in_folder = "." out_folder = preprocess_folder in_files = [ "iph_bubble/iph_bubble.ts", @@ -220,6 +221,20 @@ ] } +# TS files are passed to a separate target so that they are not listed in the +# |out_manifest|. +preprocess_if_expr("preprocess_generated_ts") { + deps = [ ":html_wrapper_files" ] + in_folder = target_gen_dir + out_folder = preprocess_folder + in_files = [ + "iph_bubble/iph_bubble.html.ts", + "localized_link/localized_link.html.ts", + "managed_dialog/managed_dialog.html.ts", + "managed_footnote/managed_footnote.html.ts", + ] +} + if (is_chromeos_ash) { preprocess_if_expr("preprocess_polymer2") { in_folder = "./" @@ -365,15 +380,11 @@ } } -group("polymer3_elements") { - public_deps = [ - "iph_bubble:web_components", - "localized_link:web_components", - "managed_dialog:web_components", - "managed_footnote:web_components", +html_to_wrapper("html_wrapper_files") { + in_files = [ + "iph_bubble/iph_bubble.html", + "localized_link/localized_link.html", + "managed_dialog/managed_dialog.html", + "managed_footnote/managed_footnote.html", ] - - if (is_chromeos_ash) { - public_deps += [ "chromeos:polymer3_elements" ] - } }
diff --git a/ui/webui/resources/cr_components/app_management/util.ts b/ui/webui/resources/cr_components/app_management/util.ts index 6734317..c9ec38d 100644 --- a/ui/webui/resources/cr_components/app_management/util.ts +++ b/ui/webui/resources/cr_components/app_management/util.ts
@@ -94,8 +94,7 @@ } } -export function getUserActionHistogramNameForAppType_(appType: AppType): - string { +function getUserActionHistogramNameForAppType(appType: AppType): string { switch (appType) { case AppType.kArc: return 'AppManagement.AppDetailViews.ArcApp'; @@ -119,7 +118,7 @@ export function recordAppManagementUserAction( appType: AppType, userAction: AppManagementUserAction) { - const histogram = getUserActionHistogramNameForAppType_(appType); + const histogram = getUserActionHistogramNameForAppType(appType); const enumLength = Object.keys(AppManagementUserAction).length; BrowserProxy.getInstance().recordEnumerationValue( histogram, userAction, enumLength);
diff --git a/ui/webui/resources/cr_components/iph_bubble/BUILD.gn b/ui/webui/resources/cr_components/iph_bubble/BUILD.gn deleted file mode 100644 index b8c2d7ef..0000000 --- a/ui/webui/resources/cr_components/iph_bubble/BUILD.gn +++ /dev/null
@@ -1,9 +0,0 @@ -# Copyright 2021 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//tools/polymer/html_to_js.gni") - -html_to_js("web_components") { - js_files = [ "iph_bubble.ts" ] -}
diff --git a/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts b/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts index f35a328..0b77e1b 100644 --- a/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts +++ b/ui/webui/resources/cr_components/iph_bubble/iph_bubble.ts
@@ -6,7 +6,9 @@ * use. */ import {assert} from '//resources/js/assert.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './iph_bubble.html.js'; const ANCHOR_HIGHLIGHT_CLASS = 'iph-anchor-highlight'; @@ -29,7 +31,7 @@ } static get template() { - return html`{__html_template__}`; + return getTemplate(); } static get properties() {
diff --git a/ui/webui/resources/cr_components/localized_link/BUILD.gn b/ui/webui/resources/cr_components/localized_link/BUILD.gn deleted file mode 100644 index a0468756..0000000 --- a/ui/webui/resources/cr_components/localized_link/BUILD.gn +++ /dev/null
@@ -1,9 +0,0 @@ -# Copyright 2019 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//tools/polymer/html_to_js.gni") - -html_to_js("web_components") { - js_files = [ "localized_link.ts" ] -}
diff --git a/ui/webui/resources/cr_components/localized_link/localized_link.ts b/ui/webui/resources/cr_components/localized_link/localized_link.ts index 7d04f90..2b323dad 100644 --- a/ui/webui/resources/cr_components/localized_link/localized_link.ts +++ b/ui/webui/resources/cr_components/localized_link/localized_link.ts
@@ -24,7 +24,9 @@ import '../../cr_elements/shared_style_css.m.js'; import {assert, assertNotReached} from '//resources/js/assert.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './localized_link.html.js'; interface LocalizedLinkElement { $: { @@ -37,6 +39,10 @@ return 'localized-link'; } + static get template() { + return getTemplate(); + } + static get properties() { return { /** @@ -173,10 +179,6 @@ } anchorTag.tabIndex = this.linkDisabled ? -1 : 0; } - - static get template() { - return html`{__html_template__}`; - } } declare global {
diff --git a/ui/webui/resources/cr_components/managed_dialog/BUILD.gn b/ui/webui/resources/cr_components/managed_dialog/BUILD.gn deleted file mode 100644 index e836bb5..0000000 --- a/ui/webui/resources/cr_components/managed_dialog/BUILD.gn +++ /dev/null
@@ -1,9 +0,0 @@ -# Copyright 2021 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//tools/polymer/html_to_js.gni") - -html_to_js("web_components") { - js_files = [ "managed_dialog.ts" ] -}
diff --git a/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts b/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts index 4ff9191..f4b87ad2 100644 --- a/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts +++ b/ui/webui/resources/cr_components/managed_dialog/managed_dialog.ts
@@ -12,11 +12,13 @@ import '../../cr_elements/shared_vars_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; -import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {CrDialogElement} from '../../cr_elements/cr_dialog/cr_dialog.m.js'; import {I18nMixin} from '../../js/i18n_mixin.js'; +import {getTemplate} from './managed_dialog.html.js'; + export interface ManagedDialogElement { $: { dialog: CrDialogElement, @@ -31,7 +33,7 @@ } static get template() { - return html`{__html_template__}`; + return getTemplate(); } static get properties() {
diff --git a/ui/webui/resources/cr_components/managed_footnote/BUILD.gn b/ui/webui/resources/cr_components/managed_footnote/BUILD.gn deleted file mode 100644 index c9801e83..0000000 --- a/ui/webui/resources/cr_components/managed_footnote/BUILD.gn +++ /dev/null
@@ -1,9 +0,0 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//tools/polymer/html_to_js.gni") - -html_to_js("web_components") { - js_files = [ "managed_footnote.ts" ] -}
diff --git a/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts b/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts index 9b63fa3..38eb5486 100644 --- a/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts +++ b/ui/webui/resources/cr_components/managed_footnote/managed_footnote.ts
@@ -16,12 +16,14 @@ import '../../cr_elements/icons.m.js'; import '../../cr_elements/shared_vars_css.m.js'; -import {html, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {I18nMixin} from '../../js/i18n_mixin.js'; import {loadTimeData} from '../../js/load_time_data.m.js'; import {WebUIListenerMixin} from '../../js/web_ui_listener_mixin.js'; +import {getTemplate} from './managed_footnote.html.js'; + const ManagedFootnoteElementBase = I18nMixin(WebUIListenerMixin(PolymerElement)); @@ -31,7 +33,7 @@ } static get template() { - return html`{__html_template__}`; + return getTemplate(); } static get properties() {
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn index a419f3c..4de81aa 100644 --- a/ui/webui/resources/cr_elements/BUILD.gn +++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -5,6 +5,7 @@ import("//build/config/chromeos/ui_mode.gni") import("//third_party/closure_compiler/compile_js.gni") import("//tools/grit/preprocess_if_expr.gni") +import("//tools/polymer/css_to_wrapper.gni") import("//tools/polymer/html_to_js.gni") import("//tools/polymer/html_to_wrapper.gni") import("//tools/polymer/polymer.gni") @@ -196,7 +197,6 @@ "cr_input/cr_input_style_css.m.js", "cr_lazy_render/cr_lazy_render.m.js", "cr_lottie/cr_lottie.m.js", - "cr_page_host_style_css.js", "cr_radio_button/cr_card_radio_button.m.js", "cr_radio_button/cr_radio_button_behavior.m.js", "cr_radio_button/cr_radio_button.m.js", @@ -235,30 +235,34 @@ out_folder = preprocess_folder in_files = [ "cr_tab_box/cr_tab_box.ts" ] if (include_polymer) { - deps += [ ":html_wrapper_files" ] + deps += [ + ":css_wrapper_files", + ":html_wrapper_files", + ] in_files += [ "cr_a11y_announcer/cr_a11y_announcer.html.ts", "cr_action_menu/cr_action_menu.html.ts", "cr_drawer/cr_drawer.html.ts", "cr_grid/cr_grid.html.ts", "cr_link_row/cr_link_row.html.ts", - "cr_nav_menu_item_style.ts", + "cr_nav_menu_item_style.css.ts", + "cr_page_host_style.css.ts", "cr_profile_avatar_selector/cr_profile_avatar_selector_grid.html.ts", "cr_profile_avatar_selector/cr_profile_avatar_selector.html.ts", "cr_search_field/cr_search_field.html.ts", "cr_slider/cr_slider.html.ts", "cr_tabs/cr_tabs.html.ts", - "cr_toast/cr_toast_manager.html.ts", "cr_toast/cr_toast.html.ts", + "cr_toast/cr_toast_manager.html.ts", + "cr_toolbar/cr_toolbar.html.ts", "cr_toolbar/cr_toolbar_search_field.html.ts", "cr_toolbar/cr_toolbar_selection_overlay.html.ts", - "cr_toolbar/cr_toolbar.html.ts", "cr_view_manager/cr_view_manager.html.ts", - "mwb_element_shared_style.ts", - "mwb_shared_icons.ts", - "mwb_shared_style.ts", - "mwb_shared_vars.ts", - "search_highlight_style_css.ts", + "mwb_element_shared_style.css.ts", + "mwb_shared_icons.html.ts", + "mwb_shared_style.css.ts", + "mwb_shared_vars.css.ts", + "search_highlight_style.css.ts", ] if (is_chromeos) { @@ -475,6 +479,7 @@ "cr_toolbar/cr_toolbar_search_field.html", "cr_toolbar/cr_toolbar_selection_overlay.html", "cr_view_manager/cr_view_manager.html", + "mwb_shared_icons.html", ] if (is_chromeos) { @@ -483,18 +488,19 @@ } } -html_to_js("web_components") { - js_files = [ "cr_tab_box/cr_tab_box.ts" ] - if (include_polymer) { - js_files += [ - # Local files - "cr_nav_menu_item_style.ts", - "cr_page_host_style_css.js", - "mwb_shared_icons.ts", - "mwb_element_shared_style.ts", - "mwb_shared_style.ts", - "mwb_shared_vars.ts", - "search_highlight_style_css.ts", +if (include_polymer) { + css_to_wrapper("css_wrapper_files") { + in_files = [ + "cr_nav_menu_item_style.css", + "mwb_element_shared_style.css", + "mwb_shared_style.css", + "mwb_shared_vars.css", + "search_highlight_style.css", + "cr_page_host_style.css", ] } } + +html_to_js("web_components") { + js_files = [ "cr_tab_box/cr_tab_box.ts" ] +}
diff --git a/ui/webui/resources/cr_elements/cr_nav_menu_item_style.css b/ui/webui/resources/cr_elements/cr_nav_menu_item_style.css new file mode 100644 index 0000000..09be145e --- /dev/null +++ b/ui/webui/resources/cr_elements/cr_nav_menu_item_style.css
@@ -0,0 +1,98 @@ +/* Copyright 2022 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=style + * #import=chrome://resources/cr_elements/shared_vars_css.m.js + * #css_wrapper_metadata_end */ + +.cr-nav-menu-item { + --iron-icon-fill-color: var(--google-grey-700); + align-items: center; + border-end-end-radius: 100px; + border-start-end-radius: 100px; + box-sizing: border-box; + color: var(--google-grey-900); + display: flex; + font-size: 14px; + font-weight: 500; + margin-inline-end: 2px; + margin-inline-start: 1px; + min-height: 40px; + overflow: hidden; + padding-block-end: 10px; + padding-block-start: 10px; + padding-inline-start: 23px; + position: relative; +} + +:host-context(cr-drawer) .cr-nav-menu-item { + border-end-end-radius: 0; + border-start-end-radius: 0; + font-size: inherit; +} + +.cr-nav-menu-item:hover { + background: var(--google-grey-200); +} + +:host-context(cr-drawer) .cr-nav-menu-item:hover { + background: transparent; +} + +.cr-nav-menu-item[selected] { + --iron-icon-fill-color: var(--google-blue-600); + background: var(--google-blue-50); + color: var(--google-blue-700); +} + +@media (prefers-color-scheme: dark) { + .cr-nav-menu-item { + --iron-icon-fill-color: var(--google-grey-500); + color: white; + } + + .cr-nav-menu-item:hover { + --iron-icon-fill-color: white; + background: var(--google-grey-800); + } + + .cr-nav-menu-item[selected] { + --iron-icon-fill-color: black; + background: var(--google-blue-300); + color: var(--google-grey-900); + } + + :host-context(cr-drawer) .cr-nav-menu-item[selected] { + --iron-icon-fill-color: var(--cr-link-color); + color: var(--cr-link-color); + } +} + +:host-context(cr-drawer) .cr-nav-menu-item[selected] { + background: transparent; +} + +.cr-nav-menu-item:focus { + outline: auto 5px -webkit-focus-ring-color; + /** + * A non-zero z-index to force the outline to appear above the fill + * background of selected item. + */ + z-index: 1; +} + +.cr-nav-menu-item:focus:not([selected]):not(:hover) { + background: transparent; /* Override iron-list selectable item CSS. */ +} + +.cr-nav-menu-item iron-icon { + margin-inline-end: 20px; + pointer-events: none; + vertical-align: top; +} + +:host-context(cr-drawer) .cr-nav-menu-item paper-ripple { + display: none; +}
diff --git a/ui/webui/resources/cr_elements/cr_nav_menu_item_style.html b/ui/webui/resources/cr_elements/cr_nav_menu_item_style.html deleted file mode 100644 index f8fb724..0000000 --- a/ui/webui/resources/cr_elements/cr_nav_menu_item_style.html +++ /dev/null
@@ -1,93 +0,0 @@ -<template> - <style> - .cr-nav-menu-item { - --iron-icon-fill-color: var(--google-grey-700); - align-items: center; - border-end-end-radius: 100px; - border-start-end-radius: 100px; - box-sizing: border-box; - color: var(--google-grey-900); - display: flex; - font-size: 14px; - font-weight: 500; - margin-inline-end: 2px; - margin-inline-start: 1px; - min-height: 40px; - overflow: hidden; - padding-block-end: 10px; - padding-block-start: 10px; - padding-inline-start: 23px; - position: relative; - } - - :host-context(cr-drawer) .cr-nav-menu-item { - border-end-end-radius: 0; - border-start-end-radius: 0; - font-size: inherit; - } - - .cr-nav-menu-item:hover { - background: var(--google-grey-200); - } - - :host-context(cr-drawer) .cr-nav-menu-item:hover { - background: transparent; - } - - .cr-nav-menu-item[selected] { - --iron-icon-fill-color: var(--google-blue-600); - background: var(--google-blue-50); - color: var(--google-blue-700); - } - - @media (prefers-color-scheme: dark) { - .cr-nav-menu-item { - --iron-icon-fill-color: var(--google-grey-500); - color: white; - } - - .cr-nav-menu-item:hover { - --iron-icon-fill-color: white; - background: var(--google-grey-800); - } - - .cr-nav-menu-item[selected] { - --iron-icon-fill-color: black; - background: var(--google-blue-300); - color: var(--google-grey-900); - } - - :host-context(cr-drawer) .cr-nav-menu-item[selected] { - --iron-icon-fill-color: var(--cr-link-color); - color: var(--cr-link-color); - } - } - - :host-context(cr-drawer) .cr-nav-menu-item[selected] { - background: transparent; - } - - .cr-nav-menu-item:focus { - outline: auto 5px -webkit-focus-ring-color; - /** - * A non-zero z-index to force the outline to appear above the fill - * background of selected item. - */ - z-index: 1; - } - - .cr-nav-menu-item:focus:not([selected]):not(:hover) { - background: transparent; /* Override iron-list selectable item CSS. */ - } - - .cr-nav-menu-item iron-icon { - margin-inline-end: 20px; - pointer-events: none; - vertical-align: top; - } - - :host-context(cr-drawer) .cr-nav-menu-item paper-ripple { - display: none; - } - </style> -</template>
diff --git a/ui/webui/resources/cr_elements/cr_page_host_style.css b/ui/webui/resources/cr_elements/cr_page_host_style.css new file mode 100644 index 0000000..19beceb --- /dev/null +++ b/ui/webui/resources/cr_elements/cr_page_host_style.css
@@ -0,0 +1,20 @@ +/* Copyright 2022 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=style + * #import=./shared_vars_css.m.js + * #css_wrapper_metadata_end */ + +/* Common CSS properties for WebUI pages, such as an entire page or a standalone + * dialog. The CSS here is in its own file so that the properties can be + * imported independently and applied directly to the :host element without + * having to import other shared CSS. */ + +:host { + color: var(--cr-primary-text-color); + line-height: 154%; /* Apply 20px default line-height to all text. */ + overflow: hidden; /* Prevent double scroll bar bugs. */ + user-select: text; +}
diff --git a/ui/webui/resources/cr_elements/cr_page_host_style_css.html b/ui/webui/resources/cr_elements/cr_page_host_style_css.html deleted file mode 100644 index de8491f44..0000000 --- a/ui/webui/resources/cr_elements/cr_page_host_style_css.html +++ /dev/null
@@ -1,16 +0,0 @@ -<!-- - Common CSS properties for WebUI pages, such as an entire page or a standalone - dialog. The CSS here is in its own file so that the properties can be imported - independently and applied directly to the :host element without having to - import other shared CSS. ---> -<template> - <style> - :host { - color: var(--cr-primary-text-color); - line-height: 154%; /* Apply 20px default line-height to all text. */ - overflow: hidden; /* Prevent double scroll bar bugs. */ - user-select: text; - } - </style> -</template>
diff --git a/ui/webui/resources/cr_elements/cr_page_host_style_css.js b/ui/webui/resources/cr_elements/cr_page_host_style_css.js deleted file mode 100644 index 4f209358..0000000 --- a/ui/webui/resources/cr_elements/cr_page_host_style_css.js +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import './shared_vars_css.m.js'; - -const styleMod = document.createElement('dom-module'); -styleMod.innerHTML = `{__html_template__}`; -styleMod.register('cr-page-host-style');
diff --git a/ui/webui/resources/cr_elements/mwb_element_shared_style.css b/ui/webui/resources/cr_elements/mwb_element_shared_style.css new file mode 100644 index 0000000..d73022d --- /dev/null +++ b/ui/webui/resources/cr_elements/mwb_element_shared_style.css
@@ -0,0 +1,28 @@ +/* Copyright 2022 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=style + * #import=./mwb_shared_vars.css.js + * #css_wrapper_metadata_end */ + +a, +cr-button, +cr-icon-button, +div { + cursor: default; +} + +cr-icon-button { + --cr-icon-button-icon-size: var(--mwb-icon-size); + --cr-icon-button-size: calc(var(--mwb-icon-size) * 1.5); +} + +cr-icon-button:hover { + background-color: var(--mwb-icon-button-hover-background-color); +} + +cr-icon-button:focus { + box-shadow: 0 0 0 2px var(--mwb-icon-button-focus-ring-color); +}
diff --git a/ui/webui/resources/cr_elements/mwb_element_shared_style.html b/ui/webui/resources/cr_elements/mwb_element_shared_style.html deleted file mode 100644 index 657e298..0000000 --- a/ui/webui/resources/cr_elements/mwb_element_shared_style.html +++ /dev/null
@@ -1,23 +0,0 @@ -<template> - <style> - a, - cr-button, - cr-icon-button, - div { - cursor: default; - } - - cr-icon-button { - --cr-icon-button-icon-size: var(--mwb-icon-size); - --cr-icon-button-size: calc(var(--mwb-icon-size) * 1.5); - } - - cr-icon-button:hover { - background-color: var(--mwb-icon-button-hover-background-color); - } - - cr-icon-button:focus { - box-shadow: 0 0 0 2px var(--mwb-icon-button-focus-ring-color); - } - </style> -</template>
diff --git a/ui/webui/resources/cr_elements/mwb_element_shared_style.ts b/ui/webui/resources/cr_elements/mwb_element_shared_style.ts deleted file mode 100644 index dae85ea..0000000 --- a/ui/webui/resources/cr_elements/mwb_element_shared_style.ts +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import './mwb_shared_vars.js'; - -const styleMod = document.createElement('dom-module'); -styleMod.innerHTML = `{__html_template__}`; -styleMod.register('mwb-element-shared-style');
diff --git a/ui/webui/resources/cr_elements/mwb_shared_icons.ts b/ui/webui/resources/cr_elements/mwb_shared_icons.ts deleted file mode 100644 index 3bbd8cbf..0000000 --- a/ui/webui/resources/cr_elements/mwb_shared_icons.ts +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import '//resources/polymer/v3_0/iron-iconset-svg/iron-iconset-svg.js'; - -const template = document.createElement('template'); -template.innerHTML = `{__html_template__}`; -document.head.appendChild(template.content);
diff --git a/ui/webui/resources/cr_elements/mwb_shared_style.css b/ui/webui/resources/cr_elements/mwb_shared_style.css new file mode 100644 index 0000000..c9a42396 --- /dev/null +++ b/ui/webui/resources/cr_elements/mwb_shared_style.css
@@ -0,0 +1,43 @@ +/* Copyright 2022 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=style + * #import=./shared_vars_css.m.js + * #import=./mwb_shared_vars.css.js + * #css_wrapper_metadata_end */ + +::-webkit-scrollbar-thumb { + background-color: var(--mwb-scrollbar-thumb-color); +} + +::-webkit-scrollbar-thumb:hover { + background-color: var(--mwb-scrollbar-thumb-hover-color); +} + +::-webkit-scrollbar-track { + background-color: var(--mwb-scrollbar-track-color); +} + +::-webkit-scrollbar { + width: var(--mwb-scrollbar-width); +} + +.mwb-list-item { + align-items: center; + background-color: var(--mwb-background-color); + contain-intrinsic-size: var(--mwb-item-height); + content-visibility: auto; + display: flex; + height: var(--mwb-item-height); + padding: 0 var(--mwb-list-item-horizontal-margin); +} + +.mwb-list-item.hovered { + background-color: var(--mwb-list-item-hover-background-color); +} + +.mwb-list-item.selected { + background-color: var(--mwb-list-item-selected-background-color); +}
diff --git a/ui/webui/resources/cr_elements/mwb_shared_style.html b/ui/webui/resources/cr_elements/mwb_shared_style.html deleted file mode 100644 index 62a71dc..0000000 --- a/ui/webui/resources/cr_elements/mwb_shared_style.html +++ /dev/null
@@ -1,37 +0,0 @@ -<template> - <style> - ::-webkit-scrollbar-thumb { - background-color: var(--mwb-scrollbar-thumb-color); - } - - ::-webkit-scrollbar-thumb:hover { - background-color: var(--mwb-scrollbar-thumb-hover-color); - } - - ::-webkit-scrollbar-track { - background-color: var(--mwb-scrollbar-track-color); - } - - ::-webkit-scrollbar { - width: var(--mwb-scrollbar-width); - } - - .mwb-list-item { - align-items: center; - background-color: var(--mwb-background-color); - contain-intrinsic-size: var(--mwb-item-height); - content-visibility: auto; - display: flex; - height: var(--mwb-item-height); - padding: 0 var(--mwb-list-item-horizontal-margin); - } - - .mwb-list-item.hovered { - background-color: var(--mwb-list-item-hover-background-color); - } - - .mwb-list-item.selected { - background-color: var(--mwb-list-item-selected-background-color); - } - </style> -</template>
diff --git a/ui/webui/resources/cr_elements/mwb_shared_style.ts b/ui/webui/resources/cr_elements/mwb_shared_style.ts deleted file mode 100644 index 90ee01f2..0000000 --- a/ui/webui/resources/cr_elements/mwb_shared_style.ts +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import './shared_vars_css.m.js'; -import './mwb_shared_vars.js'; - -const styleMod = document.createElement('dom-module'); -styleMod.innerHTML = `{__html_template__}`; -styleMod.register('mwb-shared-style');
diff --git a/ui/webui/resources/cr_elements/mwb_shared_vars.css b/ui/webui/resources/cr_elements/mwb_shared_vars.css new file mode 100644 index 0000000..85cec99 --- /dev/null +++ b/ui/webui/resources/cr_elements/mwb_shared_vars.css
@@ -0,0 +1,41 @@ +/* Copyright 2022 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=vars + * #import=./shared_vars_css.m.js + * #css_wrapper_metadata_end */ + +html { + --mwb-background-color: white; + --mwb-icon-button-fill-color: var(--google-grey-700); + --mwb-icon-button-focus-ring-color: var(--google-blue-600); + --mwb-icon-button-hover-background-color: rgba(var(--google-grey-900-rgb), 0.1); + --mwb-icon-size: 16px; + --mwb-item-height: 56px; + --mwb-list-item-horizontal-margin: 16px; + --mwb-list-item-hover-background-color: rgba(var(--google-grey-900-rgb), 0.1); + --mwb-list-item-selected-background-color: rgba(var(--google-grey-900-rgb), 0.14); + --mwb-list-section-title-font-size: 11px; + --mwb-list-section-title-height: 40px; + --mwb-primary-text-font-size: 13px; + --mwb-scrollbar-thumb-color: var(--google-grey-300); + --mwb-scrollbar-thumb-hover-color: var(--google-grey-500); + --mwb-scrollbar-track-color: var(--mwb-background-color); + --mwb-scrollbar-width: 4px; + --mwb-secondary-text-font-size: 12px; +} + +@media (prefers-color-scheme: dark) { + html { + --mwb-background-color: var(--google-grey-900); + --mwb-icon-button-fill-color: var(--google-grey-300); + --mwb-icon-button-focus-ring-color: var(--google-blue-300); + --mwb-icon-button-hover-background-color: rgba(255, 255, 255, 0.1); + --mwb-list-item-hover-background-color: rgb(55, 56, 58); /* #37383a */ + --mwb-list-item-selected-background-color: rgb(68, 69, 71); /* #444547 */ + --mwb-scrollbar-thumb-color: var(--google-grey-500); + --mwb-scrollbar-thumb-hover-color: var(--google-grey-300); + } +}
diff --git a/ui/webui/resources/cr_elements/mwb_shared_vars.html b/ui/webui/resources/cr_elements/mwb_shared_vars.html deleted file mode 100644 index 27f26e1..0000000 --- a/ui/webui/resources/cr_elements/mwb_shared_vars.html +++ /dev/null
@@ -1,36 +0,0 @@ -<custom-style> - <style> - html { - --mwb-background-color: white; - --mwb-icon-button-fill-color: var(--google-grey-700); - --mwb-icon-button-focus-ring-color: var(--google-blue-600); - --mwb-icon-button-hover-background-color: rgba(var(--google-grey-900-rgb), 0.1); - --mwb-icon-size: 16px; - --mwb-item-height: 56px; - --mwb-list-item-horizontal-margin: 16px; - --mwb-list-item-hover-background-color: rgba(var(--google-grey-900-rgb), 0.1); - --mwb-list-item-selected-background-color: rgba(var(--google-grey-900-rgb), 0.14); - --mwb-list-section-title-font-size: 11px; - --mwb-list-section-title-height: 40px; - --mwb-primary-text-font-size: 13px; - --mwb-scrollbar-thumb-color: var(--google-grey-300); - --mwb-scrollbar-thumb-hover-color: var(--google-grey-500); - --mwb-scrollbar-track-color: var(--mwb-background-color); - --mwb-scrollbar-width: 4px; - --mwb-secondary-text-font-size: 12px; - } - - @media (prefers-color-scheme: dark) { - html { - --mwb-background-color: var(--google-grey-900); - --mwb-icon-button-fill-color: var(--google-grey-300); - --mwb-icon-button-focus-ring-color: var(--google-blue-300); - --mwb-icon-button-hover-background-color: rgba(255, 255, 255, 0.1); - --mwb-list-item-hover-background-color: rgb(55, 56, 58); /* #37383a */ - --mwb-list-item-selected-background-color: rgb(68, 69, 71); /* #444547 */ - --mwb-scrollbar-thumb-color: var(--google-grey-500); - --mwb-scrollbar-thumb-hover-color: var(--google-grey-300); - } - } - </style> -</custom-style>
diff --git a/ui/webui/resources/cr_elements/mwb_shared_vars.ts b/ui/webui/resources/cr_elements/mwb_shared_vars.ts deleted file mode 100644 index a5cccf04..0000000 --- a/ui/webui/resources/cr_elements/mwb_shared_vars.ts +++ /dev/null
@@ -1,10 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import './shared_vars_css.m.js'; - -const $_documentContainer = document.createElement('template'); -$_documentContainer.innerHTML = `{__html_template__}`; -document.head.appendChild($_documentContainer.content);
diff --git a/ui/webui/resources/cr_elements/search_highlight_style.css b/ui/webui/resources/cr_elements/search_highlight_style.css new file mode 100644 index 0000000..f9b03e59b --- /dev/null +++ b/ui/webui/resources/cr_elements/search_highlight_style.css
@@ -0,0 +1,49 @@ +/* Copyright 2022 The Chromium Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=style + * #import=./shared_vars_css.m.js + * #css_wrapper_metadata_end */ + +.search-bubble { + --search-bubble-color: var(--paper-yellow-500); + position: absolute; + z-index: 1; +} + +.search-bubble-innards { + align-items: center; + background-color: var(--search-bubble-color); + border-radius: 2px; + color: var(--google-grey-900); + max-width: 100px; + min-width: 64px; + overflow: hidden; + padding: 4px 10px; + text-align: center; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* Provides the arrow which points at the anchor element. */ +.search-bubble-innards::after { + background-color: var(--search-bubble-color); + content: ''; + height: 10px; + left: calc(50% - 5px); + position: absolute; + top: -5px; + transform: rotate(-45deg); + width: 10px; + z-index: -1; +} + +/* Turns the arrow direction downwards, when the bubble is placed above + * the anchor element */ +.search-bubble-innards.above::after { + bottom: -5px; + top: auto; + transform: rotate(-135deg); +}
diff --git a/ui/webui/resources/cr_elements/search_highlight_style_css.html b/ui/webui/resources/cr_elements/search_highlight_style_css.html deleted file mode 100644 index 4b2b6db..0000000 --- a/ui/webui/resources/cr_elements/search_highlight_style_css.html +++ /dev/null
@@ -1,44 +0,0 @@ - <template> - <style> - .search-bubble { - --search-bubble-color: var(--paper-yellow-500); - position: absolute; - z-index: 1; - } - - .search-bubble-innards { - align-items: center; - background-color: var(--search-bubble-color); - border-radius: 2px; - color: var(--google-grey-900); - max-width: 100px; - min-width: 64px; - overflow: hidden; - padding: 4px 10px; - text-align: center; - text-overflow: ellipsis; - white-space: nowrap; - } - - /* Provides the arrow which points at the anchor element. */ - .search-bubble-innards::after { - background-color: var(--search-bubble-color); - content: ''; - height: 10px; - left: calc(50% - 5px); - position: absolute; - top: -5px; - transform: rotate(-45deg); - width: 10px; - z-index: -1; - } - - /* Turns the arrow direction downwards, when the bubble is placed above - * the anchor element */ - .search-bubble-innards.above::after { - bottom: -5px; - top: auto; - transform: rotate(-135deg); - } - </style> - </template>