media/css/firefox/new/desktop/download.scss (1,014 lines of code) (raw):
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
@use 'sass:math';
$font-path: '/media/protocol/fonts';
$image-path: '/media/protocol/img';
@import '~@mozilla-protocol/core/protocol/css/includes/lib';
@import '~@mozilla-protocol/core/protocol/css/components/logos/wordmark';
@import '~@mozilla-protocol/core/protocol/css/components/logos/wordmark-product-firefox';
@import '~@mozilla-protocol/core/protocol/css/components/notification-bar';
@import '~@mozilla-protocol/core/protocol/css/components/section-heading';
@import '~@mozilla-protocol/core/protocol/css/components/zap';
@import '../../../protocol/components/sub-navigation';
// --------------------------------------------------------------------------
// Protocol over-rides
// https://github.com/mozilla/protocol/issues/345
// https://github.com/mozilla/protocol/issues/536
// https://github.com/mozilla/bedrock/pull/9096
// xs
$v-grid-xs: $layout-md;
$h-grid-xs: $layout-xs;
// md
$v-grid-md: $layout-xl * 0.5;
$h-grid-md: 64px;
// lg
$v-grid-lg: 192px * 0.5;
$h-grid-lg: 80px;
main {
background-color: $color-white; // for IE6
color: $color-dark-gray-30;
h2,
h3,
h4 {
color: $color-marketing-gray-99;
margin-bottom: $spacing-md;
}
img {
.mzp-c-card & {
display: block;
margin-bottom: $spacing-lg;
}
}
}
// notification
.mzp-c-notification-bar {
a:link {
margin: 0;
}
}
// emphasis box
.mzp-c-emphasis-box {
padding-left: $h-grid-xs;
padding-right: $h-grid-xs;
@media #{$mq-md} {
padding-left: $h-grid-md;
padding-right: $h-grid-md;
}
@media #{$mq-md} {
padding-left: $h-grid-lg;
padding-right: $h-grid-lg;
}
}
// button container
.mzp-c-button-download-container {
.main-download & { // target main to avoid conflicting with nav
margin-bottom: 0;
}
.t-intro & {
@include bidi(((text-align, left, right),));
}
.t-features &,
.t-discover & {
display: block;
}
}
// cta link
button.mzp-c-cta-link {
background: none;
border: 0;
color: $color-link;
cursor: pointer;
padding: 0;
text-decoration: underline;
&:hover {
color: $color-link-hover;
}
}
// cards
// https://github.com/mozilla/protocol/issues/536
// https://github.com/mozilla/bedrock/pull/9096
.mzp-c-card {
background-color: transparent;
margin-bottom: $v-grid-xs;
@media #{$mq-md} {
margin-bottom: $v-grid-md;
}
@media #{$mq-lg} {
margin-bottom: $v-grid-lg;
}
.t-discover & {
margin-bottom: $layout-xl;
}
}
.mzp-l-card-third {
margin: 0 auto;
max-width: $content-lg;
.mzp-c-card {
@media #{$mq-sm} {
@include bidi((
(margin-left, 0, $h-grid-xs),
(margin-right, $h-grid-xs, 0),
));
width: calc(50% - (#{$h-grid-xs} * 0.5));
&:nth-child(even) {
margin-left: 0;
margin-right: 0;
}
}
@media #{$mq-md} {
@include bidi((
(margin-left, 0, $h-grid-md),
(margin-right, $h-grid-md, 0),
));
width: calc(50% - (#{$h-grid-md} * 0.5));
&:nth-child(even) {
margin-left: 0;
margin-right: 0;
}
}
@media #{$mq-lg} {
width: calc(33.3% - (#{$h-grid-lg} - #{math.div($h-grid-lg, 3)}));
&:nth-child(even) {
@include bidi((
(margin-left, 0, $h-grid-lg),
(margin-right, $h-grid-lg, 0),
));
}
&:nth-child(3n) {
@include bidi(((margin-right, 0, margin-left, 0),));
}
}
}
}
.mzp-l-card-half {
.mzp-c-card {
max-width: 100%;
@media #{$mq-sm} {
@include bidi((
(margin-left, 0, $h-grid-xs),
(margin-right, $h-grid-xs, 0),
));
width: calc(50% - (#{$h-grid-xs} - (#{$h-grid-xs} * 0.5)));
main &:nth-child(2n) { // bump the specificity so later media queries don't over write it
margin-left: 0;
margin-right: 0;
}
}
@media #{$mq-md} {
@include bidi((
(margin-left, 0, $h-grid-md),
(margin-right, $h-grid-md, 0),
));
width: calc(50% - (#{$h-grid-md} - (#{$h-grid-md} * 0.5)));
}
@media #{$mq-lg} {
@include bidi((
(float, left, right),
(margin-left, 0, $h-grid-lg),
(margin-right, $h-grid-lg, 0),
));
width: calc(50% - (#{$h-grid-lg} - (#{$h-grid-lg} * 0.5)));
&:nth-child(2n+1) {
@include bidi(((clear, left, right),));
}
}
}
}
// --------------------------------------------------------------------------
// conditional content classes
.show-android,
.show-ios {
display: none !important; /* stylelint-disable-line declaration-no-important */
}
.ios .show-ios {
display: block !important; /* stylelint-disable-line declaration-no-important */
}
.android .show-android {
display: block !important; /* stylelint-disable-line declaration-no-important */
}
.ios,
.android {
#download-features,
#download-discover {
display: none;
}
}
.show-else {
.android &,
.ios & {
display: none !important; /* stylelint-disable-line declaration-no-important */
}
}
// --------------------------------------------------------------------------
.u-visually-hidden {
@include visually-hidden;
}
// --------------------------------------------------------------------------
// section titles
.mzp-c-section-heading {
@include text-title-md;
}
// --------------------------------------------------------------------------
// trio
// different from card row of 3 because of behaviour at mq-md
.c-trio {
@include clearfix;
margin: 0 auto;
li {
margin-bottom: $layout-lg;
.t-custom &:last-child {
margin-bottom: 0;
}
}
img {
display: block;
margin: 0 auto;
text-align: center;
}
p {
margin-bottom: 0;
}
@media #{$mq-md} {
img {
float: left;
margin-left: 0;
margin-right: $layout-sm;
}
}
@media #{$mq-lg} {
max-width: $content-lg;
li {
float: left;
width: calc(33.3% - (#{$h-grid-lg} - #{math.div($h-grid-lg, 3)}));
&:nth-child(2n) {
margin-left: $h-grid-lg;
margin-right: $h-grid-lg;
}
.t-custom & {
margin-bottom: 0;
}
}
img {
float: none;
}
}
}
// --------------------------------------------------------------------------
// Blocks
// used for highlights, hero, and mobile
.c-block {
margin: 0 auto;
overflow-x: hidden;
padding: $v-grid-xs 0;
position: relative;
@media #{$mq-md} {
padding: $v-grid-md 0;
}
@media #{$mq-lg} {
padding: $v-grid-lg 0;
}
}
.c-block-container {
@include clearfix;
@include border-box;
margin: 0 auto;
max-width: $content-xl + $layout-xl * 2;
min-width: $content-xs;
padding: 0 $layout-sm;
.c-block-media-img {
margin: 0 auto;
}
@media #{$mq-lg} {
padding: 0 $layout-xl;
}
// vertical and horizontal aligment for body or media
// text align works for float fallback
// justify positioning works for no constraint
// absolute positioning works on constrain-height
@media #{$mq-md} {
padding: 0 $layout-lg;
.l-h-start {
@include bidi(((text-align, left, right),));
justify-self: start;
.c-block-media-img {
@include bidi((
(margin-right, auto, margin-left, 0),
(margin-left, 0, margin-right, 0),
));
}
}
.l-h-center {
justify-self: center;
text-align: center;
.c-block-media-img {
margin: 0 auto;
}
@supports (display:grid) {
&.l-media-constrain-height .c-block-media-img {
left: 50%;
transform: translateX(-50%);
}
}
}
.l-h-end {
justify-self: end;
.c-block-media-img {
@include bidi((
(margin-left, auto, margin-right, 0),
(margin-right, 0, margin-left, 0),
));
}
@supports (display:grid) {
&.l-media-constrain-height .c-block-media-img {
right: 0;
left: auto;
}
}
}
}
// vertical alignment only browsers with grid support
@supports (display:grid) {
.l-v-start {
align-self: start;
}
.l-v-center {
align-self: center;
&.l-media-constrain-height .c-block-media-img {
top: 50%;
transform: translateY(-50%);
}
&.l-h-center.l-media-constrain-height .c-block-media-img {
transform: translateY(-50%) translateX(-50%);
}
}
.l-v-end {
align-self: end;
&.l-media-constrain-height .c-block-media-img {
top: auto;
}
}
}
}
.c-block-media-img {
display: block;
}
.c-block-body {
position: relative;
// vertical spacing between body and media before side by side display kicks in
@media all and (max-width: #{$screen-md - 1}) {
&:first-child {
margin-bottom: $v-grid-xs;
}
&:last-child {
margin-top: $v-grid-xs;
}
.mzp-has-media-hide-on-sm & {
margin-bottom: 0;
margin-top: 0;
}
}
}
.c-block-media {
position: relative;
@media (max-width: #{$content-md - 1px}) {
.mzp-has-media-hide-on-sm & {
display: none;
}
}
// constraints on height or width of media
@media all and (max-width: #{$screen-md - 1}) {
// center image & constrain width
&.l-media-constrain-on-sm {
text-align: center;
.c-block-media-img {
margin: 0 auto;
width: $content-sm;
}
}
}
@media #{$mq-md} {
@supports ( display:grid ) {
&.l-media-constrain-height {
height: 100%;
justify-self: auto !important; /* stylelint-disable-line declaration-no-important */
.c-block-media-img {
bottom: 0;
left: 0;
max-height: 100%;
max-width: auto;
position: absolute;
top: 0;
width: auto;
[dir='rtl'] &,
.l-reversed & {
left: auto;
right: 0;
}
}
}
}
}
}
// --------------------------------------
// side by side layout, float based fall back
@media #{$mq-md} {
.c-block-body {
@include border-box;
@include bidi(((float, left, right),));
width: 50%;
padding: 0 ($h-grid-lg * 0.5);
> *:first-child {
margin-top: 0;
}
> *:last-child {
margin-bottom: 0;
}
.l-reversed & {
@include bidi(((float, right, left),));
}
}
.c-block-media {
@include border-box;
@include bidi(((float, right, left),));
width: 50%;
padding: 0 ($h-grid-lg * 0.5);
.l-reversed & {
@include bidi(((float, left, right),));
}
}
}
// --------------------------------------
// side by side layout, grid based
@media #{$mq-md} {
@supports (display:grid) {
.c-block-container {
// grid is all start/end based we don't need bidi declarations for RTL support \o/
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-areas: 'body media';
grid-column-gap: $h-grid-lg;
.l-reversed > & {
grid-template-areas: 'media body';
}
}
.c-block-body,
.c-block-media {
.c-block-container & { // extra specificitly to over-ride the styles that make the float fall-back work
float: none;
min-width: 0; // because of https://stackoverflow.com/questions/43311943/prevent-content-from-expanding-grid-items
padding: 0;
width: auto;
}
}
.c-block-body {
grid-area: body;
}
.c-block-media {
align-self: stretch;
grid-area: media;
.c-block-media-img {
display: block;
max-width: none;
}
}
}
}
// --------------------------------------------------------------------------
// intro banner
.t-intro {
&.c-block {
@include text-body-md;
padding-top: $layout-sm;
@media #{$mq-lg} {
@include text-body-lg;
padding-top: $layout-lg;
}
}
.c-block-container {
max-width: $content-xl + $layout-xl * 2;
}
.c-block-body > p {
margin-bottom: $v-grid-md;
}
[lang='ar'] & h2 {
@include font-size(40px);
}
.mzp-c-wordmark {
margin-bottom: $v-grid-md;
}
// issue 13317
.fx-unsupported-message {
@include bidi(((text-align, left, right),));
}
}
.c-intro-download-alt {
@include text-body-xs;
color: $color-dark-gray-30;
display: block;
margin-top: $spacing-md;
a:link,
a:visited {
color: inherit;
text-decoration: none;
}
a:hover,
a:active,
a:focus {
text-decoration: underline;
}
}
// --------------------------------------
// noodles
.c-noodles {
left: 0;
position: relative;
top: 0;
.t-intro & {
height: 536px; // height of the image plus padding
left: 30px;
width: 537px; // width of image
}
}
.noodle-browser {
background-color: $color-light-gray-10;
border-radius: 4px;
box-shadow: $box-shadow-md;
height: 371px;
left: -30px;
max-width: none;
position: absolute;
top: 100px;
width: 514px;
}
// animated shapes
.noodle-pill {
border: 1px solid transparent;
border-radius: 500px;
position: absolute;
}
.noodle-svg {
animation: curl 10s infinite alternate;
position: absolute;
transform-origin: top right;
}
.noodle-circle {
animation: round 9s infinite linear;
border-radius: 100%;
border: 1px solid transparent;
height: 20px;
left: 296px;
position: absolute;
top: 40px;
transform-origin: 5px;
width: 20px;
}
.noodle-circle.t-fill-orange,
.noodle-circle.t-fill-yellow-orange {
animation-duration: 10s;
animation-delay: -3s;
height: 165px;
left: 135px;
top: 342px;
transform-origin: 80px 80px;
width: 165px;
}
.noodle-pill.t-outline-pink {
animation: pill 7s infinite alternate;
animation-delay: -5s;
height: 145px;
top: 320px;
transform: rotate(-34deg);
width: 348px;
}
.noodle-pill.t-fill-blue {
animation: pill 7s infinite alternate;
height: 145px;
left: 100px;
top: 120px;
transform: rotate(-34deg);
width: 370px;
}
@media screen and (prefers-reduced-motion: reduce) {
.noodle-pill,
.noodle-circle,
.noodle-svg {
animation: none;
}
}
@keyframes round {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes pill {
from {
transform: rotate(-34deg) translate(7px, 0);
}
to {
transform: rotate(-34deg) translate(-7px, 0);
}
}
@keyframes curl {
from {
transform: rotate(0deg);
}
to {
transform: rotate(-2deg);
}
}
// colours
.t-outline-pink {
border-color: #ff008b;
}
.t-fill-pink-yellow {
background: linear-gradient(to left, #ff4ca1, #ffde67);
}
.t-fill-yellow-orange {
background: linear-gradient(to left, #ffde67, #ff671e);
}
.t-fill-blue {
background: linear-gradient(to left, #00e1ff, #005fe7);
}
.t-outline-yellow {
border-color: #ffa437;
}
// --------------------------------------------------------------------------
// releases
.t-releases {
position: relative;
max-width: $content-xl + $layout-xl * 2;
&::before {
background-image: url('/media/img/firefox/new/desktop/release-noodles.svg');
content: '';
display: block;
height: 212px;
left: 0;
position: absolute;
top: 0;
width: 287px;
z-index: 0;
}
.mzp-c-emphasis-box {
margin: 0 auto;
position: relative;
z-index: 1;
}
.c-section-title {
padding-top: $spacing-sm;
}
img {
margin-bottom: $spacing-lg;
}
}
.c-notes {
margin-bottom: $layout-sm;
text-align: center;
}
// --------------------------------------------------------------------------
// highlights
// includes t-compare, t-block, t-everone, and t-devices block components
.t-highlights {
p {
margin-bottom: $spacing-xl;
}
@supports (display:grid) {
@media #{$mq-lg} {
.c-block-body {
max-width: ($content-lg - $h-grid-lg) * 0.5;
}
}
}
}
// --------------------------------------
.t-compare {
padding-top: 0;
.mzp-c-emphasis-box {
margin: 0 (-$layout-2xs);
padding: $layout-2xs;
@media #{$mq-sm} {
margin: 0 auto;
padding: $layout-sm;
}
}
}
.t-compare .c-block-media-img {
@include bidi(((background-position, top left, top right),));
background-image: url('/media/img/firefox/new/desktop/comparison-noodles-mr1.svg');
background-repeat: no-repeat;
background-size: contain;
// IE 8 doesn't have the noodles, so don't push it down
@media all and (min-width: 0) {
padding: 65px 0 0;
}
@media #{$mq-md} {
background-size: 600px;
padding: 65px $layout-sm 0;
width: 100%;
}
@media #{$mq-lg} {
background-size: contain;
}
}
.c-chart {
margin: 0;
}
.c-compare-table {
caption-side: bottom;
background: $color-white;
border-radius: $border-radius-md;
box-shadow: $box-shadow-sm;
border-collapse: separate;
border: $spacing-xl solid $color-white;
margin-left: auto;
margin-right: auto;
max-width: $content-lg;
width: 100%;
caption {
display: table-caption;
}
thead {
th {
@include text-title-xs;
border-bottom: 3px solid $color-marketing-gray-20;
font-weight: bold;
@media #{$mq-sm} {
position: static;
}
img {
@include text-body-xs;
height: auto;
max-height: 36px;
max-width: 36px;
min-width: 1rem;
width: 100%;
}
}
}
th,
td {
@include text-body-sm;
@include bidi((
(border-left, 1px solid $color-marketing-gray-20, border-right, 0),
(text-align, center, center), /* needs higher specificity for RTL*/
));
border-top: 1px solid $color-marketing-gray-20;
font-weight: normal;
padding: $spacing-xs;
&:first-child {
@include bidi(((border-left-width, 0, border-right-width, 1px),));
text-align: start;
}
@media #{$mq-sm} {
padding: $spacing-sm;
}
}
tbody {
td {
width: 64px; // need fixed width to avoid content moving when switching tabs
}
tr:nth-child(2n - 1) {
background-color: $color-marketing-gray-10;
}
}
tr > *:nth-child(1n+4) {
// hide all columns after Chrome
display: none;
}
}
.c-compare-buttons {
margin-top: $layout-sm;
text-align: center;
.no-js & {
opacity: 0;
}
button {
margin: 0;
}
}
.c-compare-button {
@include text-body-sm;
background: transparent;
border-bottom: 4px solid $color-marketing-gray-20;
border-left: none;
border-right: none;
border-top: none;
color: $color-dark-gray-30;
cursor: pointer;
padding: 0 $spacing-md $spacing-sm;
&:focus {
border-bottom-color: $color-link-hover;
font-weight: bold;
outline: none;
}
&[aria-pressed='true'] {
border-bottom-color: $color-link;
font-weight: bold;
}
}
// --------------------------------------
#protection-report {
display: none;
.state-firefox-desktop-70 & {
display: block;
}
}
// --------------------------------------
.t-everyone {
.c-block-media-img {
width: 330px;
@media #{$mq-lg} {
width: auto;
}
}
}
// --------------------------------------
.t-devices .mobile-download-buttons li {
display: inline-block;
margin-right: $spacing-md;
}
// --------------------------------------------------------------------------
.t-features {
background-color: $color-light-gray-10;
background-repeat: no-repeat;
background-position:
80% 63%,
top left,
bottom 10% right,
bottom left calc(50vw - 600px),
bottom 30% left,
top right;
margin-bottom: $v-grid-xs;
margin-top: $v-grid-xs;
@media #{$mq-md} {
margin-bottom: $v-grid-md;
margin-top: $v-grid-md;
}
@media #{$mq-lg} {
margin-bottom: $v-grid-lg;
margin-top: $v-grid-lg;
}
.loaded & {
background-image:
url('/media/img/firefox/new/desktop/features/one.svg'),
url('/media/img/firefox/new/desktop/features/two.svg'),
url('/media/img/firefox/new/desktop/features/oval-one.svg'),
url('/media/img/firefox/new/desktop/features/oval-two.svg'),
url('/media/img/firefox/new/desktop/features/rect-one.svg'),
url('/media/img/firefox/new/desktop/features/rect-two.svg');
}
img {
margin-bottom: $spacing-lg;
}
.mzp-u-list-styled {
@include bidi(((margin-left, $spacing-md, margin-right, 0),));
margin-bottom: 0;
}
}
// --------------------------------------------------------------------------
// customization
.c-screen {
position: relative;
text-align: center;
margin-bottom: $layout-sm;
margin-left: -$layout-xs;
margin-right: -$layout-xs;
@media #{$mq-md} {
margin-left: -$layout-md;
margin-right: -$layout-md;
}
svg {
display: block;
width: $content-xl;
max-width: 100%;
height: auto;
margin: 0 auto;
}
}
.c-screenshot {
@include bidi(((left, 0, right, auto),));
@include border-box;
margin: 0 auto;
display: block;
position: absolute;
bottom: 0;
width: 100%;
text-align: center;
padding-left: $layout-xs;
padding-right: $layout-xs;
@media #{$mq-md} {
padding-left: $layout-md;
padding-right: $layout-md;
}
@media #{$mq-lg} {
padding-left: $layout-xl;
padding-right: $layout-xl;
}
img {
display: block;
margin: 0 auto;
background-color: #303035;
border-radius: 4px 4px 0 0;
width: $content-lg;
}
}
// --------------------------------------------------------------------------
.t-company {
img {
margin: 0 auto $spacing-xl;
width: $content-xs;
}
p {
margin-bottom: 0;
}
.mzp-c-card {
&:last-child {
margin-bottom: 0;
}
}
// put the images under the text for supporting browsers
@media all and (max-width: #{$screen-sm - 1}) {
@supports (display: flex) {
.mzp-c-card {
@include flexbox;
flex-direction: column;
&:last-child img {
margin-bottom: 0;
}
}
img {
margin: $v-grid-xs auto;
order: 10;
}
}
}
@media #{$mq-sm} {
.mzp-c-card {
margin-bottom: 0;
}
img {
width: auto;
}
}
}
// --------------------------------------------------------------------------
.t-discover {
img {
display: block;
margin: 0 auto $spacing-lg;
text-align: center;
@media #{$mq-sm} {
margin: 0 0 $spacing-lg;
text-align: left;
}
}
}
// --------------------------------------------------------------------------
.c-support {
@include text-title-xs;
background-color: $color-light-gray-10;
display: block; // IE8
font-weight: bold;
padding: $spacing-lg;
text-align: center;
}
// --------------------------------------------------------------------------
// mobile
.android main,
.ios main {
@include flexbox;
flex-direction: column;
}
#mobile-banner {
order: -1;
}
.c-mobile {
@include light-links;
background-color: $color-violet-70;
color: $color-white;
position: relative;
overflow-x: hidden;
h2 {
color: $color-white;
}
p {
margin-bottom: $layout-md;
}
@media #{$mq-sm} {
&::after {
@include bidi((
(left, 60%, right, auto),
(margin-left, $h-grid-xs * 0.5, margin-left, 0),
));
background-position: top center;
background-repeat: no-repeat;
border-radius: $border-radius-sm;
bottom: $layout-lg;
content: '';
display: block;
position: absolute;
top: $layout-lg;
width: 40%;
&,
.android & {
@include at2x('/media/img/firefox/new/desktop/android.png', contain);
}
.ios & {
@include at2x('/media/img/firefox/new/desktop/ios.png', contain);
}
}
.c-mobile-text {
@include bidi(((padding-right, $h-grid-xs * 0.5, padding-left, 0),));
@include border-box;
max-width: 60%;
}
}
@media #{$mq-md} {
&::after {
@include bidi((
(left, 50%, right, auto),
(margin-left, $h-grid-md * 0.5, margin-right, 0),
));
}
.c-mobile-text {
@include bidi(((padding-right, $h-grid-md * 0.5, padding-left, 0),));
max-width: 50%;
}
}
@media #{$mq-lg} {
&::after {
@include bidi(((margin-left, $h-grid-lg * 0.5, margin-right, 0),));
}
.c-mobile-text {
@include bidi(((padding-right, $h-grid-lg * 0.5, padding-left, 0),));
}
}
}
.c-desktop a {
@include text-title-xs;
background-image: url('/media/img/firefox/new/desktop/mobile-arrow.svg');
background-position: bottom center;
background-repeat: no-repeat;
color: $color-purple-50;
display: block;
font-weight: bold;
padding: $spacing-md $h-grid-xs #{$spacing-lg + 64px};
text-align: center;
text-decoration: none;
}
// --------------------------------------------------------------------------
// scroll animation
@supports (animation-fill-mode: forwards) {
.has-animate {
opacity: 0;
transform-origin: bottom center;
}
.is-animated {
animation-duration: 1s;
animation-fill-mode: forwards;
animation-iteration-count: 1;
animation-name: zoom;
}
@keyframes zoom {
from {
opacity: 0;
transform: scaleX(0.8) scaleY(0.8);
}
to {
opacity: 1;
transform: scaleX(1) scaleY(1);
}
}
}