summaryrefslogtreecommitdiffstats
path: root/browser/components/aboutwelcome
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--browser/components/aboutwelcome/.eslintrc.js185
-rw-r--r--browser/components/aboutwelcome/actors/AboutWelcomeChild.sys.mjs898
-rw-r--r--browser/components/aboutwelcome/actors/AboutWelcomeParent.sys.mjs299
-rw-r--r--browser/components/aboutwelcome/assets/confetti.svg55
-rw-r--r--browser/components/aboutwelcome/assets/device-migration.svg36
-rw-r--r--browser/components/aboutwelcome/assets/fox-doodle-tail.pngbin0 -> 34903 bytes
-rw-r--r--browser/components/aboutwelcome/assets/fox-doodle-waving-static.pngbin0 -> 10017 bytes
-rw-r--r--browser/components/aboutwelcome/assets/fox-doodle-waving.gifbin0 -> 45426 bytes
-rw-r--r--browser/components/aboutwelcome/assets/heart.webpbin0 -> 100396 bytes
-rw-r--r--browser/components/aboutwelcome/assets/long-zap.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mobile-download-qr-existing-user-cn.svg5
-rw-r--r--browser/components/aboutwelcome/assets/mobile-download-qr-existing-user.svg7
-rw-r--r--browser/components/aboutwelcome/assets/mobile-download-qr-new-user-cn.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mobile-download-qr-new-user.svg7
-rw-r--r--browser/components/aboutwelcome/assets/mr-amo-collection.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-gratitude.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-import.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-mobilecrosspromo.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-pinprivate.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-pintaskbar.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-privacysegmentation.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-rtamo-background-image.svg4
-rw-r--r--browser/components/aboutwelcome/assets/mr-settodefault.svg4
-rw-r--r--browser/components/aboutwelcome/assets/noodle-C.svg6
-rw-r--r--browser/components/aboutwelcome/assets/noodle-outline-L.svg13
-rw-r--r--browser/components/aboutwelcome/assets/noodle-solid-L.svg6
-rw-r--r--browser/components/aboutwelcome/assets/person-typing.svg4
-rw-r--r--browser/components/aboutwelcome/assets/short-zap.svg4
-rw-r--r--browser/components/aboutwelcome/content-src/aboutwelcome.jsx144
-rw-r--r--browser/components/aboutwelcome/content-src/aboutwelcome.scss1940
-rw-r--r--browser/components/aboutwelcome/content-src/components/AdditionalCTA.jsx42
-rw-r--r--browser/components/aboutwelcome/content-src/components/AddonsPicker.jsx116
-rw-r--r--browser/components/aboutwelcome/content-src/components/CTAParagraph.jsx45
-rw-r--r--browser/components/aboutwelcome/content-src/components/EmbeddedMigrationWizard.jsx40
-rw-r--r--browser/components/aboutwelcome/content-src/components/HelpText.jsx54
-rw-r--r--browser/components/aboutwelcome/content-src/components/HeroImage.jsx26
-rw-r--r--browser/components/aboutwelcome/content-src/components/LanguageSwitcher.jsx308
-rw-r--r--browser/components/aboutwelcome/content-src/components/LinkParagraph.jsx59
-rw-r--r--browser/components/aboutwelcome/content-src/components/MRColorways.jsx200
-rw-r--r--browser/components/aboutwelcome/content-src/components/MSLocalized.jsx114
-rw-r--r--browser/components/aboutwelcome/content-src/components/MobileDownloads.jsx73
-rw-r--r--browser/components/aboutwelcome/content-src/components/MultiSelect.jsx158
-rw-r--r--browser/components/aboutwelcome/content-src/components/MultiStageAboutWelcome.jsx568
-rw-r--r--browser/components/aboutwelcome/content-src/components/MultiStageProtonScreen.jsx620
-rw-r--r--browser/components/aboutwelcome/content-src/components/OnboardingVideo.jsx34
-rw-r--r--browser/components/aboutwelcome/content-src/components/ReturnToAMO.jsx105
-rw-r--r--browser/components/aboutwelcome/content-src/components/SubmenuButton.jsx149
-rw-r--r--browser/components/aboutwelcome/content-src/components/Themes.jsx52
-rw-r--r--browser/components/aboutwelcome/content-src/components/Zap.jsx60
-rw-r--r--browser/components/aboutwelcome/content-src/lib/aboutwelcome-utils.mjs122
-rw-r--r--browser/components/aboutwelcome/content-src/lib/addUtmParams.mjs32
-rw-r--r--browser/components/aboutwelcome/content/aboutwelcome.bundle.js2678
-rw-r--r--browser/components/aboutwelcome/content/aboutwelcome.css2536
-rw-r--r--browser/components/aboutwelcome/content/aboutwelcome.html50
-rw-r--r--browser/components/aboutwelcome/content/onboarding.ftl13
-rw-r--r--browser/components/aboutwelcome/docs/index.rst97
-rw-r--r--browser/components/aboutwelcome/jar.mn38
-rw-r--r--browser/components/aboutwelcome/karma.mc.config.js246
-rw-r--r--browser/components/aboutwelcome/modules/AWScreenUtils.sys.mjs74
-rw-r--r--browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs902
-rw-r--r--browser/components/aboutwelcome/modules/AboutWelcomeTelemetry.sys.mjs276
-rw-r--r--browser/components/aboutwelcome/moz.build25
-rw-r--r--browser/components/aboutwelcome/package-lock.json11051
-rw-r--r--browser/components/aboutwelcome/package.json80
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser.toml57
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_attribution.js214
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_configurable_ui.js724
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_fxa_signin_flow.js303
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_glean.js162
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_import.js94
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_mobile_downloads.js112
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_addonspicker.js178
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_default.js794
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_experimentAPI.js641
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_languageSwitcher.js708
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_mr.js770
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_video.js97
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_observer.js73
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_rtamo.js299
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_screen_targeting.js274
-rw-r--r--browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_upgrade_multistage_mr.js320
-rw-r--r--browser/components/aboutwelcome/tests/browser/head.js149
-rw-r--r--browser/components/aboutwelcome/tests/unit/AWScreenUtils.test.jsx140
-rw-r--r--browser/components/aboutwelcome/tests/unit/CTAParagraph.test.jsx49
-rw-r--r--browser/components/aboutwelcome/tests/unit/HelpText.test.jsx41
-rw-r--r--browser/components/aboutwelcome/tests/unit/HeroImage.test.jsx40
-rw-r--r--browser/components/aboutwelcome/tests/unit/LinkParagraph.test.jsx102
-rw-r--r--browser/components/aboutwelcome/tests/unit/MRColorways.test.jsx328
-rw-r--r--browser/components/aboutwelcome/tests/unit/MSLocalized.test.jsx48
-rw-r--r--browser/components/aboutwelcome/tests/unit/MobileDownloads.test.jsx69
-rw-r--r--browser/components/aboutwelcome/tests/unit/MultiSelect.test.jsx221
-rw-r--r--browser/components/aboutwelcome/tests/unit/MultiStageAWProton.test.jsx571
-rw-r--r--browser/components/aboutwelcome/tests/unit/MultiStageAboutWelcome.test.jsx859
-rw-r--r--browser/components/aboutwelcome/tests/unit/OnboardingVideoTest.test.jsx45
-rw-r--r--browser/components/aboutwelcome/tests/unit/addUtmParams.test.js34
-rw-r--r--browser/components/aboutwelcome/tests/unit/unit-entry.js716
-rw-r--r--browser/components/aboutwelcome/webpack.aboutwelcome.config.js24
-rw-r--r--browser/components/aboutwelcome/yamscripts.yml45
98 files changed, 33997 insertions, 0 deletions
diff --git a/browser/components/aboutwelcome/.eslintrc.js b/browser/components/aboutwelcome/.eslintrc.js
new file mode 100644
index 0000000000..d5f33683e5
--- /dev/null
+++ b/browser/components/aboutwelcome/.eslintrc.js
@@ -0,0 +1,185 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+module.exports = {
+ // When adding items to this file please check for effects on sub-directories.
+ plugins: ["import", "react", "jsx-a11y"],
+ settings: {
+ react: {
+ version: "16.2.0",
+ },
+ },
+ extends: ["plugin:jsx-a11y/recommended"],
+ overrides: [
+ {
+ // TODO: Bug 1773467 - Move these to .mjs or figure out a generic way
+ // to identify these as modules.
+ files: ["tests/unit/**/*.js"],
+ parserOptions: {
+ sourceType: "module",
+ },
+ },
+ {
+ // These files use fluent-dom to insert content
+ files: [
+ "content-src/components/Zap.jsx",
+ "content-src/components/MultiStageAboutWelcome.jsx",
+ "content-src/components/MultiStageScreen.jsx",
+ "content-src/components/MultiStageProtonScreen.jsx",
+ "content-src/components/MultiSelect.jsx",
+ "content-src/components/ReturnToAMO.jsx",
+ ],
+ rules: {
+ "jsx-a11y/anchor-has-content": "off",
+ "jsx-a11y/heading-has-content": "off",
+ "jsx-a11y/label-has-associated-control": "off",
+ "jsx-a11y/no-onchange": "off",
+ },
+ },
+ {
+ files: ["content-src/**", "tests/unit/**"],
+ env: {
+ node: true,
+ },
+ },
+ {
+ // Use a configuration that's appropriate for modules, workers and
+ // non-production files.
+ files: ["modules/*.jsm", "tests/**"],
+ rules: {
+ "no-implicit-globals": "off",
+ },
+ },
+ {
+ files: ["content-src/**", "tests/unit/**"],
+ rules: {
+ // Disallow commonjs in these directories.
+ "import/no-commonjs": 2,
+ },
+ },
+ {
+ // These tests simulate the browser environment.
+ files: "tests/unit/**",
+ env: {
+ browser: true,
+ mocha: true,
+ },
+ globals: {
+ assert: true,
+ chai: true,
+ sinon: true,
+ },
+ },
+ {
+ files: "tests/**",
+ rules: {
+ "func-name-matching": 0,
+ "lines-between-class-members": 0,
+ },
+ },
+ ],
+ rules: {
+ "fetch-options/no-fetch-credentials": "error",
+
+ "react/jsx-boolean-value": ["error", "always"],
+ "react/jsx-key": "error",
+ "react/jsx-no-bind": [
+ "error",
+ { allowArrowFunctions: true, allowFunctions: true },
+ ],
+ "react/jsx-no-comment-textnodes": "error",
+ "react/jsx-no-duplicate-props": "error",
+ "react/jsx-no-target-blank": "error",
+ "react/jsx-no-undef": "error",
+ "react/jsx-pascal-case": "error",
+ "react/jsx-uses-react": "error",
+ "react/jsx-uses-vars": "error",
+ "react/no-access-state-in-setstate": "error",
+ "react/no-danger": "error",
+ "react/no-deprecated": "error",
+ "react/no-did-mount-set-state": "error",
+ "react/no-did-update-set-state": "error",
+ "react/no-direct-mutation-state": "error",
+ "react/no-is-mounted": "error",
+ "react/no-unknown-property": [
+ "error",
+ {
+ // Custom HTML properties used in aboutwelcome React components.
+ ignore: [
+ "flow",
+ "alignment",
+ "button-size",
+ "layout",
+ "pos",
+ "hide-secondary-section",
+ ],
+ },
+ ],
+ "react/require-render-return": "error",
+
+ "accessor-pairs": ["error", { setWithoutGet: true, getWithoutSet: false }],
+ "array-callback-return": "error",
+ "block-scoped-var": "error",
+ "consistent-this": ["error", "use-bind"],
+ eqeqeq: "error",
+ "func-name-matching": "error",
+ "getter-return": "error",
+ "guard-for-in": "error",
+ "max-depth": ["error", 4],
+ "max-nested-callbacks": ["error", 4],
+ "max-params": ["error", 6],
+ "max-statements": ["error", 50],
+ "new-cap": ["error", { newIsCap: true, capIsNew: false }],
+ "no-alert": "error",
+ "no-console": ["error", { allow: ["error"] }],
+ "no-div-regex": "error",
+ "no-duplicate-imports": "error",
+ "no-eq-null": "error",
+ "no-extend-native": "error",
+ "no-extra-label": "error",
+ "no-implicit-coercion": ["error", { allow: ["!!"] }],
+ "no-implicit-globals": "error",
+ "no-loop-func": "error",
+ "no-multi-assign": "error",
+ "no-multi-str": "error",
+ "no-new": "error",
+ "no-new-func": "error",
+ "no-octal-escape": "error",
+ "no-param-reassign": "error",
+ "no-proto": "error",
+ "no-prototype-builtins": "error",
+ "no-return-assign": ["error", "except-parens"],
+ "no-script-url": "error",
+ "no-shadow": "error",
+ "no-template-curly-in-string": "error",
+ "no-undef-init": "error",
+ "no-unmodified-loop-condition": "error",
+ "no-unused-expressions": "error",
+ "no-use-before-define": "error",
+ "no-useless-computed-key": "error",
+ "no-useless-constructor": "error",
+ "no-useless-rename": "error",
+ "no-var": "error",
+ "no-void": ["error", { allowAsStatement: true }],
+ "one-var": ["error", "never"],
+ "operator-assignment": ["error", "always"],
+ "prefer-destructuring": [
+ "error",
+ {
+ AssignmentExpression: { array: true },
+ VariableDeclarator: { array: true, object: true },
+ },
+ ],
+ "prefer-numeric-literals": "error",
+ "prefer-promise-reject-errors": "error",
+ "prefer-rest-params": "error",
+ "prefer-spread": "error",
+ "prefer-template": "error",
+ radix: ["error", "always"],
+ "sort-vars": "error",
+ "symbol-description": "error",
+ "vars-on-top": "error",
+ yoda: ["error", "never"],
+ },
+};
diff --git a/browser/components/aboutwelcome/actors/AboutWelcomeChild.sys.mjs b/browser/components/aboutwelcome/actors/AboutWelcomeChild.sys.mjs
new file mode 100644
index 0000000000..24bf73c80a
--- /dev/null
+++ b/browser/components/aboutwelcome/actors/AboutWelcomeChild.sys.mjs
@@ -0,0 +1,898 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ AboutWelcomeDefaults:
+ "resource:///modules/aboutwelcome/AboutWelcomeDefaults.sys.mjs",
+ ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs",
+ NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs",
+});
+
+ChromeUtils.defineLazyGetter(lazy, "log", () => {
+ const { Logger } = ChromeUtils.importESModule(
+ "resource://messaging-system/lib/Logger.sys.mjs"
+ );
+ return new Logger("AboutWelcomeChild");
+});
+
+export class AboutWelcomeChild extends JSWindowActorChild {
+ // Can be used to avoid accesses to the document/contentWindow after it's
+ // destroyed, which may throw unhandled exceptions.
+ _destroyed = false;
+
+ didDestroy() {
+ this._destroyed = true;
+ }
+
+ actorCreated() {
+ this.exportFunctions();
+ }
+
+ /**
+ * Send event that can be handled by the page
+ *
+ * @param {{type: string, data?: any}} action
+ */
+ sendToPage(action) {
+ lazy.log.debug(`Sending to page: ${action.type}`);
+ const win = this.document.defaultView;
+ const event = new win.CustomEvent("AboutWelcomeChromeToContent", {
+ detail: Cu.cloneInto(action, win),
+ });
+ win.dispatchEvent(event);
+ }
+
+ /**
+ * Export functions that can be called by page js
+ */
+ exportFunctions() {
+ let window = this.contentWindow;
+
+ Cu.exportFunction(this.AWAddScreenImpression.bind(this), window, {
+ defineAs: "AWAddScreenImpression",
+ });
+
+ Cu.exportFunction(this.AWGetFeatureConfig.bind(this), window, {
+ defineAs: "AWGetFeatureConfig",
+ });
+
+ Cu.exportFunction(this.AWGetFxAMetricsFlowURI.bind(this), window, {
+ defineAs: "AWGetFxAMetricsFlowURI",
+ });
+
+ Cu.exportFunction(this.AWGetSelectedTheme.bind(this), window, {
+ defineAs: "AWGetSelectedTheme",
+ });
+
+ Cu.exportFunction(this.AWSelectTheme.bind(this), window, {
+ defineAs: "AWSelectTheme",
+ });
+
+ Cu.exportFunction(this.AWEvaluateScreenTargeting.bind(this), window, {
+ defineAs: "AWEvaluateScreenTargeting",
+ });
+
+ Cu.exportFunction(this.AWSendEventTelemetry.bind(this), window, {
+ defineAs: "AWSendEventTelemetry",
+ });
+
+ Cu.exportFunction(this.AWSendToParent.bind(this), window, {
+ defineAs: "AWSendToParent",
+ });
+
+ Cu.exportFunction(this.AWWaitForMigrationClose.bind(this), window, {
+ defineAs: "AWWaitForMigrationClose",
+ });
+
+ Cu.exportFunction(this.AWFinish.bind(this), window, {
+ defineAs: "AWFinish",
+ });
+
+ Cu.exportFunction(this.AWEnsureAddonInstalled.bind(this), window, {
+ defineAs: "AWEnsureAddonInstalled",
+ });
+
+ Cu.exportFunction(this.AWEnsureLangPackInstalled.bind(this), window, {
+ defineAs: "AWEnsureLangPackInstalled",
+ });
+
+ Cu.exportFunction(
+ this.AWNegotiateLangPackForLanguageMismatch.bind(this),
+ window,
+ {
+ defineAs: "AWNegotiateLangPackForLanguageMismatch",
+ }
+ );
+
+ Cu.exportFunction(this.AWSetRequestedLocales.bind(this), window, {
+ defineAs: "AWSetRequestedLocales",
+ });
+
+ Cu.exportFunction(this.AWSendToDeviceEmailsSupported.bind(this), window, {
+ defineAs: "AWSendToDeviceEmailsSupported",
+ });
+
+ Cu.exportFunction(this.AWNewScreen.bind(this), window, {
+ defineAs: "AWNewScreen",
+ });
+ }
+
+ /**
+ * Wrap a promise so content can use Promise methods.
+ */
+ wrapPromise(promise) {
+ return new this.contentWindow.Promise((resolve, reject) =>
+ promise.then(resolve, reject)
+ );
+ }
+
+ /**
+ * Clones the result of the query into the content window.
+ */
+ sendQueryAndCloneForContent(...sendQueryArgs) {
+ return this.wrapPromise(
+ (async () => {
+ return Cu.cloneInto(
+ await this.sendQuery(...sendQueryArgs),
+ this.contentWindow
+ );
+ })()
+ );
+ }
+
+ AWSelectTheme(data) {
+ return this.wrapPromise(
+ this.sendQuery("AWPage:SELECT_THEME", data.toUpperCase())
+ );
+ }
+
+ AWEvaluateScreenTargeting(data) {
+ return this.sendQueryAndCloneForContent(
+ "AWPage:EVALUATE_SCREEN_TARGETING",
+ data
+ );
+ }
+
+ AWAddScreenImpression(screen) {
+ return this.wrapPromise(
+ this.sendQuery("AWPage:ADD_SCREEN_IMPRESSION", screen)
+ );
+ }
+
+ /**
+ * Send initial data to page including experiment information
+ */
+ async getAWContent() {
+ let attributionData = await this.sendQuery("AWPage:GET_ATTRIBUTION_DATA");
+
+ // Return to AMO gets returned early.
+ if (attributionData?.template) {
+ lazy.log.debug("Loading about:welcome with RTAMO attribution data");
+ return Cu.cloneInto(attributionData, this.contentWindow);
+ } else if (attributionData?.ua) {
+ lazy.log.debug("Loading about:welcome with UA attribution");
+ }
+
+ let experimentMetadata =
+ lazy.ExperimentAPI.getExperimentMetaData({
+ featureId: "aboutwelcome",
+ }) || {};
+
+ lazy.log.debug(
+ `Loading about:welcome with ${
+ experimentMetadata?.slug ?? "no"
+ } experiment`
+ );
+
+ let featureConfig = lazy.NimbusFeatures.aboutwelcome.getAllVariables();
+ featureConfig.needDefault = await this.sendQuery("AWPage:NEED_DEFAULT");
+ featureConfig.needPin = await this.sendQuery("AWPage:DOES_APP_NEED_PIN");
+ if (featureConfig.languageMismatchEnabled) {
+ featureConfig.appAndSystemLocaleInfo = await this.sendQuery(
+ "AWPage:GET_APP_AND_SYSTEM_LOCALE_INFO"
+ );
+ }
+
+ // FeatureConfig (from experiments) has higher precendence
+ // to defaults. But the `screens` property isn't defined we shouldn't
+ // override the default with `null`
+ let defaults = lazy.AboutWelcomeDefaults.getDefaults();
+
+ const content = await lazy.AboutWelcomeDefaults.prepareContentForReact({
+ ...attributionData,
+ ...experimentMetadata,
+ ...defaults,
+ ...featureConfig,
+ screens: featureConfig.screens ?? defaults.screens,
+ backdrop: featureConfig.backdrop ?? defaults.backdrop,
+ });
+
+ return Cu.cloneInto(content, this.contentWindow);
+ }
+
+ AWGetFeatureConfig() {
+ return this.wrapPromise(this.getAWContent());
+ }
+
+ AWGetFxAMetricsFlowURI() {
+ return this.wrapPromise(this.sendQuery("AWPage:FXA_METRICS_FLOW_URI"));
+ }
+
+ AWGetSelectedTheme() {
+ return this.wrapPromise(this.sendQuery("AWPage:GET_SELECTED_THEME"));
+ }
+
+ /**
+ * Send Event Telemetry
+ *
+ * @param {object} eventData
+ */
+ AWSendEventTelemetry(eventData) {
+ this.AWSendToParent("TELEMETRY_EVENT", {
+ ...eventData,
+ event_context: {
+ ...eventData.event_context,
+ },
+ });
+ }
+
+ /**
+ * Send message that can be handled by AboutWelcomeParent.jsm
+ *
+ * @param {string} type
+ * @param {any=} data
+ * @returns {Promise<unknown>}
+ */
+ AWSendToParent(type, data) {
+ return this.sendQueryAndCloneForContent(`AWPage:${type}`, data);
+ }
+
+ AWWaitForMigrationClose() {
+ return this.wrapPromise(this.sendQuery("AWPage:WAIT_FOR_MIGRATION_CLOSE"));
+ }
+
+ AWFinish() {
+ const shouldFocusNewtabUrlBar =
+ lazy.NimbusFeatures.aboutwelcome.getVariable("newtabUrlBarFocus");
+
+ this.contentWindow.location.href = "about:home";
+ if (shouldFocusNewtabUrlBar) {
+ this.AWSendToParent("SPECIAL_ACTION", {
+ type: "FOCUS_URLBAR",
+ });
+ }
+ }
+
+ AWEnsureAddonInstalled(addonId) {
+ return this.wrapPromise(
+ this.sendQuery("AWPage:ENSURE_ADDON_INSTALLED", addonId)
+ );
+ }
+
+ AWEnsureLangPackInstalled(negotiated, screenContent) {
+ const content = Cu.cloneInto(screenContent, {});
+ return this.wrapPromise(
+ this.sendQuery(
+ "AWPage:ENSURE_LANG_PACK_INSTALLED",
+ negotiated.langPack
+ ).then(() => {
+ const formatting = [];
+ const l10n = new Localization(
+ ["branding/brand.ftl", "browser/newtab/onboarding.ftl"],
+ false,
+ undefined,
+ // Use the system-ish then app then default locale.
+ [...negotiated.requestSystemLocales, "en-US"]
+ );
+
+ // Add the negotiated language name as args.
+ function addMessageArgsAndUseLangPack(obj) {
+ for (const value of Object.values(obj)) {
+ if (value?.string_id) {
+ value.args = {
+ ...value.args,
+ negotiatedLanguage: negotiated.langPackDisplayName,
+ };
+
+ // Expose fluent strings wanting lang pack as raw.
+ if (value.useLangPack) {
+ formatting.push(
+ l10n.formatValue(value.string_id, value.args).then(raw => {
+ delete value.string_id;
+ value.raw = raw;
+ })
+ );
+ }
+ }
+ }
+ }
+ addMessageArgsAndUseLangPack(content.languageSwitcher);
+ addMessageArgsAndUseLangPack(content);
+ return Promise.all(formatting).then(() =>
+ Cu.cloneInto(content, this.contentWindow)
+ );
+ })
+ );
+ }
+
+ AWSetRequestedLocales(requestSystemLocales) {
+ return this.sendQueryAndCloneForContent(
+ "AWPage:SET_REQUESTED_LOCALES",
+ requestSystemLocales
+ );
+ }
+
+ AWNegotiateLangPackForLanguageMismatch(appAndSystemLocaleInfo) {
+ return this.sendQueryAndCloneForContent(
+ "AWPage:NEGOTIATE_LANGPACK",
+ appAndSystemLocaleInfo
+ );
+ }
+
+ AWSendToDeviceEmailsSupported() {
+ return this.wrapPromise(
+ this.sendQuery("AWPage:SEND_TO_DEVICE_EMAILS_SUPPORTED")
+ );
+ }
+
+ AWNewScreen(screenId) {
+ return this.wrapPromise(this.sendQuery("AWPage:NEW_SCREEN", screenId));
+ }
+
+ /**
+ * @param {{type: string, detail?: any}} event
+ * @override
+ */
+ handleEvent(event) {
+ lazy.log.debug(`Received page event ${event.type}`);
+ }
+}
+
+const OPTIN_DEFAULT = {
+ id: "FAKESPOT_OPTIN_DEFAULT",
+ template: "multistage",
+ backdrop: "transparent",
+ aria_role: "alert",
+ UTMTerm: "opt-in",
+ screens: [
+ {
+ id: "FS_OPT_IN",
+ content: {
+ position: "split",
+ title: { string_id: "shopping-onboarding-headline" },
+ // We set the dynamic subtitle ID below at the same time as the args;
+ // to prevent intermittents caused by the args loading too late.
+ subtitle: { string_id: "" },
+ above_button_content: [
+ {
+ type: "text",
+ text: {
+ string_id: "shopping-onboarding-body",
+ },
+ link_keys: ["learn_more"],
+ },
+ {
+ type: "image",
+ url: "chrome://browser/content/shopping/assets/optInLight.avif",
+ darkModeImageURL:
+ "chrome://browser/content/shopping/assets/optInDark.avif",
+ marginInline: "24px",
+ },
+ {
+ type: "text",
+ text: {
+ string_id:
+ "shopping-onboarding-opt-in-privacy-policy-and-terms-of-use3",
+ },
+ link_keys: ["privacy_policy", "terms_of_use"],
+ font_styles: "legal",
+ },
+ ],
+ learn_more: {
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://support.mozilla.org/1/firefox/%VERSION%/%OS%/%LOCALE%/review-checker-review-quality?utm_source=review-checker&utm_campaign=learn-more&utm_medium=in-product",
+ where: "tab",
+ },
+ },
+ },
+ privacy_policy: {
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://www.mozilla.org/privacy/firefox?utm_source=review-checker&utm_campaign=privacy-policy&utm_medium=in-product&utm_term=opt-in-screen",
+ where: "tab",
+ },
+ },
+ },
+ terms_of_use: {
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://www.fakespot.com/terms?utm_source=review-checker&utm_campaign=terms-of-use&utm_medium=in-product",
+ where: "tab",
+ },
+ },
+ },
+ primary_button: {
+ should_focus_button: true,
+ label: { string_id: "shopping-onboarding-opt-in-button" },
+ action: {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "browser.shopping.experience2023.optedIn",
+ value: 1,
+ },
+ },
+ },
+ },
+ additional_button: {
+ label: {
+ string_id: "shopping-onboarding-not-now-button",
+ },
+ style: "link",
+ flow: "column",
+ action: {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "browser.shopping.experience2023.active",
+ value: false,
+ },
+ },
+ },
+ },
+ },
+ },
+ ],
+};
+
+const SHOPPING_MICROSURVEY = {
+ id: "SHOPPING_MICROSURVEY",
+ template: "multistage",
+ backdrop: "transparent",
+ transitions: true,
+ UTMTerm: "survey",
+ screens: [
+ {
+ id: "SHOPPING_MICROSURVEY_SCREEN_1",
+ above_button_steps_indicator: true,
+ content: {
+ position: "split",
+ layout: "survey",
+ steps_indicator: {
+ string_id: "shopping-onboarding-welcome-steps-indicator-label",
+ },
+ title: {
+ string_id: "shopping-survey-headline",
+ },
+ primary_button: {
+ label: {
+ string_id: "shopping-survey-next-button-label",
+ paddingBlock: "5px",
+ marginBlock: "0 12px",
+ },
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ data: {
+ actions: [],
+ },
+ navigate: true,
+ },
+ disabled: "hasActiveMultiSelect",
+ },
+ additional_button: {
+ label: {
+ string_id: "shopping-survey-terms-link",
+ },
+ style: "link",
+ flow: "column",
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://www.mozilla.org/about/legal/terms/mozilla/?utm_source=review-checker&utm_campaign=terms-of-use-screen-1&utm_medium=in-product",
+ where: "tab",
+ },
+ },
+ },
+ dismiss_button: {
+ action: {
+ dismiss: true,
+ },
+ label: {
+ string_id: "shopping-onboarding-dialog-close-button",
+ },
+ },
+ tiles: {
+ type: "multiselect",
+ style: {
+ flexDirection: "column",
+ alignItems: "flex-start",
+ },
+ label: {
+ string_id: "shopping-survey-question-one",
+ },
+ data: [
+ {
+ id: "radio-1",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q1-radio-1-label" },
+ },
+ {
+ id: "radio-2",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q1-radio-2-label" },
+ },
+ {
+ id: "radio-3",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q1-radio-3-label" },
+ },
+ {
+ id: "radio-4",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q1-radio-4-label" },
+ },
+ {
+ id: "radio-5",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q1-radio-5-label" },
+ },
+ ],
+ },
+ },
+ },
+ {
+ id: "SHOPPING_MICROSURVEY_SCREEN_2",
+ above_button_steps_indicator: true,
+ content: {
+ position: "split",
+ layout: "survey",
+ steps_indicator: {
+ string_id: "shopping-onboarding-welcome-steps-indicator-label",
+ },
+ title: {
+ string_id: "shopping-survey-headline",
+ },
+ primary_button: {
+ label: {
+ string_id: "shopping-survey-submit-button-label",
+ paddingBlock: "5px",
+ marginBlock: "0 12px",
+ },
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ data: {
+ actions: [],
+ },
+ navigate: true,
+ },
+ disabled: "hasActiveMultiSelect",
+ },
+ additional_button: {
+ label: {
+ string_id: "shopping-survey-terms-link",
+ },
+ style: "link",
+ flow: "column",
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://www.mozilla.org/about/legal/terms/mozilla/?utm_source=review-checker&utm_campaign=terms-of-use-screen-2&utm_medium=in-product",
+ where: "tab",
+ },
+ },
+ },
+ dismiss_button: {
+ action: {
+ dismiss: true,
+ },
+ label: {
+ string_id: "shopping-onboarding-dialog-close-button",
+ },
+ },
+ tiles: {
+ type: "multiselect",
+ style: {
+ flexDirection: "column",
+ alignItems: "flex-start",
+ },
+ label: {
+ string_id: "shopping-survey-question-two",
+ },
+ data: [
+ {
+ id: "radio-1",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q2-radio-1-label" },
+ },
+ {
+ id: "radio-2",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q2-radio-2-label" },
+ },
+ {
+ id: "radio-3",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { string_id: "shopping-survey-q2-radio-3-label" },
+ },
+ ],
+ },
+ },
+ },
+ ],
+};
+
+const OPTED_IN_TIME_PREF = "browser.shopping.experience2023.survey.optedInTime";
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "isSurveySeen",
+ "browser.shopping.experience2023.survey.hasSeen",
+ false
+);
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "pdpVisits",
+ "browser.shopping.experience2023.survey.pdpVisits",
+ 0
+);
+
+XPCOMUtils.defineLazyPreferenceGetter(
+ lazy,
+ "optedInTime",
+ OPTED_IN_TIME_PREF,
+ 0
+);
+
+let optInDynamicContent;
+// Limit pref increase to 5 as we don't need to count any higher than that
+const MIN_VISITS_TO_SHOW_SURVEY = 5;
+// Wait 24 hours after opt in to show survey
+const MIN_TIME_AFTER_OPT_IN = 24 * 60 * 60;
+
+export class AboutWelcomeShoppingChild extends AboutWelcomeChild {
+ // Static state used to track session in which user opted-in
+ static optedInSession = false;
+
+ // Static used to track PDP visits per session for showing survey
+ static eligiblePDPvisits = [];
+
+ constructor() {
+ super();
+ this.surveyEnabled =
+ lazy.NimbusFeatures.shopping2023.getVariable("surveyEnabled");
+
+ // Used by tests
+ this.resetChildStates = () => {
+ AboutWelcomeShoppingChild.eligiblePDPvisits.length = 0;
+ AboutWelcomeShoppingChild.optedInSession = false;
+ };
+ }
+
+ computeEligiblePDPCount(data) {
+ // Increment our pref if this isn't a page we've already seen this session
+ if (lazy.pdpVisits < MIN_VISITS_TO_SHOW_SURVEY) {
+ this.AWSendToParent("SPECIAL_ACTION", {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "browser.shopping.experience2023.survey.pdpVisits",
+ value: lazy.pdpVisits + 1,
+ },
+ },
+ });
+ }
+
+ // Add this product to our list of unique eligible PDPs visited
+ // to prevent errors caused by multiple events being fired simultaneously
+ AboutWelcomeShoppingChild.eligiblePDPvisits.push(data?.product_id);
+ }
+
+ evaluateAndShowSurvey() {
+ // Re-evaluate if we should show the survey
+ // Render survey if user is opted-in and has met survey seen conditions
+ const now = Date.now() / 1000;
+ const hasBeen24HrsSinceOptin =
+ lazy.optedInTime && now - lazy.optedInTime >= MIN_TIME_AFTER_OPT_IN;
+
+ this.showMicroSurvey =
+ this.surveyEnabled &&
+ !lazy.isSurveySeen &&
+ !AboutWelcomeShoppingChild.optedInSession &&
+ lazy.pdpVisits >= MIN_VISITS_TO_SHOW_SURVEY &&
+ hasBeen24HrsSinceOptin;
+
+ if (this.showMicroSurvey) {
+ this.renderMessage();
+ }
+ }
+
+ setOptInTime() {
+ const now = Date.now() / 1000;
+ this.AWSendToParent("SPECIAL_ACTION", {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: OPTED_IN_TIME_PREF,
+ value: now,
+ },
+ },
+ });
+ }
+
+ handleEvent(event) {
+ // Decide when to show/hide onboarding and survey message
+ const { productUrl, showOnboarding, data } = event.detail;
+
+ // Display onboarding if a user hasn't opted-in
+ const optInReady = showOnboarding && productUrl;
+ if (optInReady) {
+ // Render opt-in message
+ AboutWelcomeShoppingChild.optedInSession = true;
+ this.AWSetProductURL(new URL(productUrl).hostname);
+ this.renderMessage();
+ return;
+ }
+
+ //Store timestamp if user opts in
+ if (
+ Object.hasOwn(event.detail, "showOnboarding") &&
+ !event.detail.showOnboarding &&
+ !lazy.optedInTime
+ ) {
+ this.setOptInTime();
+ }
+ // Hide the container until the user is eligible to see the survey
+ // or user has just completed opt-in
+ if (!lazy.isSurveySeen || AboutWelcomeShoppingChild.optedInSession) {
+ this.document.getElementById("multi-stage-message-root").hidden = true;
+ }
+
+ // Early exit if user has seen survey, if we have no data, encountered
+ // an error, or if pdp is ineligible or not unique
+ if (
+ lazy.isSurveySeen ||
+ !data ||
+ data.error ||
+ !productUrl ||
+ (data.needs_analysis &&
+ (!data.product_id || !data.grade || !data.adjusted_rating)) ||
+ AboutWelcomeShoppingChild.eligiblePDPvisits.includes(data.product_id)
+ ) {
+ return;
+ }
+
+ this.computeEligiblePDPCount(data, productUrl);
+ this.evaluateAndShowSurvey();
+ }
+
+ renderMessage() {
+ this.document.getElementById("multi-stage-message-root").hidden = false;
+ this.document.dispatchEvent(
+ new this.contentWindow.CustomEvent("RenderWelcome", {
+ bubbles: true,
+ })
+ );
+ }
+
+ // TODO - Move messages into an ASRouter message provider. See bug 1848251.
+ AWGetFeatureConfig() {
+ let messageContent = optInDynamicContent;
+ if (this.showMicroSurvey) {
+ messageContent = SHOPPING_MICROSURVEY;
+ this.setShoppingSurveySeen();
+ }
+ return Cu.cloneInto(messageContent, this.contentWindow);
+ }
+
+ setShoppingSurveySeen() {
+ this.AWSendToParent("SPECIAL_ACTION", {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "browser.shopping.experience2023.survey.hasSeen",
+ value: true,
+ },
+ },
+ });
+ }
+
+ // TODO - Add dismiss: true to the primary CTA so it cleans up the React
+ // content, which will stop being rendered on opt-in. See bug 1848429.
+ AWFinish() {
+ if (this._destroyed) {
+ return;
+ }
+ const root = this.document.getElementById("multi-stage-message-root");
+ if (root) {
+ root.innerHTML = "";
+ root
+ .appendChild(this.document.createElement("shopping-message-bar"))
+ .setAttribute("type", "thank-you-for-feedback");
+ this.contentWindow.setTimeout(() => {
+ root.hidden = true;
+ }, 5000);
+ }
+ }
+
+ AWSetProductURL(productUrl) {
+ let content = JSON.parse(JSON.stringify(OPTIN_DEFAULT));
+ const [optInScreen] = content.screens;
+
+ if (productUrl) {
+ optInScreen.content.subtitle.string_id =
+ "shopping-onboarding-dynamic-subtitle-1";
+
+ switch (
+ productUrl // Insert the productUrl into content
+ ) {
+ case "www.amazon.fr":
+ case "www.amazon.de":
+ optInScreen.content.subtitle.string_id =
+ "shopping-onboarding-single-subtitle";
+ optInScreen.content.subtitle.args = {
+ currentSite: "Amazon",
+ };
+ break;
+ case "www.amazon.com":
+ optInScreen.content.subtitle.args = {
+ currentSite: "Amazon",
+ secondSite: "Walmart",
+ thirdSite: "Best Buy",
+ };
+ break;
+ case "www.walmart.com":
+ optInScreen.content.subtitle.args = {
+ currentSite: "Walmart",
+ secondSite: "Amazon",
+ thirdSite: "Best Buy",
+ };
+ break;
+ case "www.bestbuy.com":
+ optInScreen.content.subtitle.args = {
+ currentSite: "Best Buy",
+ secondSite: "Amazon",
+ thirdSite: "Walmart",
+ };
+ break;
+ default:
+ optInScreen.content.subtitle.args = {
+ currentSite: "Amazon",
+ secondSite: "Walmart",
+ thirdSite: "Best Buy",
+ };
+ }
+ }
+
+ optInDynamicContent = content;
+ }
+
+ AWEnsureLangPackInstalled() {}
+}
diff --git a/browser/components/aboutwelcome/actors/AboutWelcomeParent.sys.mjs b/browser/components/aboutwelcome/actors/AboutWelcomeParent.sys.mjs
new file mode 100644
index 0000000000..1eb77da0d8
--- /dev/null
+++ b/browser/components/aboutwelcome/actors/AboutWelcomeParent.sys.mjs
@@ -0,0 +1,299 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ AboutWelcomeDefaults:
+ "resource:///modules/aboutwelcome/AboutWelcomeDefaults.sys.mjs",
+ AboutWelcomeTelemetry:
+ "resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs",
+ AddonManager: "resource://gre/modules/AddonManager.sys.mjs",
+ AWScreenUtils: "resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs",
+ BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
+ BuiltInThemes: "resource:///modules/BuiltInThemes.sys.mjs",
+ FxAccounts: "resource://gre/modules/FxAccounts.sys.mjs",
+ LangPackMatcher: "resource://gre/modules/LangPackMatcher.sys.mjs",
+ ShellService: "resource:///modules/ShellService.sys.mjs",
+ SpecialMessageActions:
+ "resource://messaging-system/lib/SpecialMessageActions.sys.mjs",
+});
+
+ChromeUtils.defineLazyGetter(lazy, "log", () => {
+ const { Logger } = ChromeUtils.importESModule(
+ "resource://messaging-system/lib/Logger.sys.mjs"
+ );
+ return new Logger("AboutWelcomeParent");
+});
+
+ChromeUtils.defineLazyGetter(
+ lazy,
+ "Telemetry",
+ () => new lazy.AboutWelcomeTelemetry()
+);
+
+const DID_SEE_ABOUT_WELCOME_PREF = "trailhead.firstrun.didSeeAboutWelcome";
+const AWTerminate = {
+ WINDOW_CLOSED: "welcome-window-closed",
+ TAB_CLOSED: "welcome-tab-closed",
+ APP_SHUT_DOWN: "app-shut-down",
+ ADDRESS_BAR_NAVIGATED: "address-bar-navigated",
+};
+const LIGHT_WEIGHT_THEMES = {
+ AUTOMATIC: "default-theme@mozilla.org",
+ DARK: "firefox-compact-dark@mozilla.org",
+ LIGHT: "firefox-compact-light@mozilla.org",
+ ALPENGLOW: "firefox-alpenglow@mozilla.org",
+};
+
+class AboutWelcomeObserver {
+ constructor() {
+ Services.obs.addObserver(this, "quit-application");
+
+ this.win = Services.focus.activeWindow;
+ if (!this.win) {
+ return;
+ }
+
+ this.terminateReason = AWTerminate.ADDRESS_BAR_NAVIGATED;
+
+ this.onWindowClose = () => {
+ this.terminateReason = AWTerminate.WINDOW_CLOSED;
+ };
+
+ this.onTabClose = () => {
+ this.terminateReason = AWTerminate.TAB_CLOSED;
+ };
+
+ this.win.addEventListener("TabClose", this.onTabClose, { once: true });
+ this.win.addEventListener("unload", this.onWindowClose, { once: true });
+ }
+
+ observe(aSubject, aTopic, aData) {
+ switch (aTopic) {
+ case "quit-application":
+ this.terminateReason = AWTerminate.APP_SHUT_DOWN;
+ break;
+ }
+ }
+
+ // Added for testing
+ get AWTerminate() {
+ return AWTerminate;
+ }
+
+ stop() {
+ lazy.log.debug(`Terminate reason is ${this.terminateReason}`);
+ Services.obs.removeObserver(this, "quit-application");
+ if (!this.win) {
+ return;
+ }
+ this.win.removeEventListener("TabClose", this.onTabClose);
+ this.win.removeEventListener("unload", this.onWindowClose);
+ this.win = null;
+ }
+}
+
+export class AboutWelcomeParent extends JSWindowActorParent {
+ constructor() {
+ super();
+ this.startAboutWelcomeObserver();
+ }
+
+ startAboutWelcomeObserver() {
+ this.AboutWelcomeObserver = new AboutWelcomeObserver();
+ }
+
+ // Static methods that calls into ShellService to check
+ // if Firefox is pinned or already default
+ static doesAppNeedPin() {
+ return lazy.ShellService.doesAppNeedPin();
+ }
+
+ static isDefaultBrowser() {
+ return lazy.ShellService.isDefaultBrowser();
+ }
+
+ didDestroy() {
+ if (this.AboutWelcomeObserver) {
+ this.AboutWelcomeObserver.stop();
+ }
+ this.RegionHomeObserver?.stop();
+
+ lazy.Telemetry.sendTelemetry({
+ event: "SESSION_END",
+ event_context: {
+ reason: this.AboutWelcomeObserver.terminateReason,
+ page: "about:welcome",
+ },
+ message_id: this.AWMessageId,
+ });
+ }
+
+ /**
+ * Handle messages from AboutWelcomeChild.jsm
+ *
+ * @param {string} type
+ * @param {any=} data
+ * @param {Browser} the xul:browser rendering the page
+ */
+ async onContentMessage(type, data, browser) {
+ lazy.log.debug(`Received content event: ${type}`);
+ switch (type) {
+ case "AWPage:SET_WELCOME_MESSAGE_SEEN":
+ this.AWMessageId = data;
+ try {
+ Services.prefs.setBoolPref(DID_SEE_ABOUT_WELCOME_PREF, true);
+ } catch (e) {
+ lazy.log.debug(`Fails to set ${DID_SEE_ABOUT_WELCOME_PREF}.`);
+ }
+ break;
+ case "AWPage:SPECIAL_ACTION":
+ return lazy.SpecialMessageActions.handleAction(data, browser);
+ case "AWPage:FXA_METRICS_FLOW_URI":
+ return lazy.FxAccounts.config.promiseMetricsFlowURI("aboutwelcome");
+ case "AWPage:TELEMETRY_EVENT":
+ lazy.Telemetry.sendTelemetry(data);
+ break;
+ case "AWPage:GET_ATTRIBUTION_DATA":
+ let attributionData =
+ await lazy.AboutWelcomeDefaults.getAttributionContent();
+ return attributionData;
+ case "AWPage:ENSURE_ADDON_INSTALLED":
+ return new Promise(resolve => {
+ let listener = {
+ onInstallEnded(install, addon) {
+ if (addon.id === data) {
+ lazy.AddonManager.removeInstallListener(listener);
+ resolve("complete");
+ }
+ },
+ onInstallCancelled() {
+ lazy.AddonManager.removeInstallListener(listener);
+ resolve("install cancelled");
+ },
+ onInstallFailed() {
+ lazy.AddonManager.removeInstallListener(listener);
+ resolve("install failed");
+ },
+ };
+ lazy.AddonManager.addInstallListener(listener);
+ });
+ case "AWPage:GET_ADDON_DETAILS":
+ let addonDetails =
+ await lazy.AboutWelcomeDefaults.getAddonFromRepository(data);
+
+ return {
+ label: addonDetails.name,
+ icon: addonDetails.iconURL,
+ type: addonDetails.type,
+ screenshots: addonDetails.screenshots,
+ url: addonDetails.url,
+ };
+ case "AWPage:SELECT_THEME":
+ await lazy.BuiltInThemes.ensureBuiltInThemes();
+ return lazy.AddonManager.getAddonByID(LIGHT_WEIGHT_THEMES[data]).then(
+ addon => addon.enable()
+ );
+ case "AWPage:GET_SELECTED_THEME":
+ let themes = await lazy.AddonManager.getAddonsByTypes(["theme"]);
+ let activeTheme = themes.find(addon => addon.isActive);
+ // Store the current theme ID so user can restore their previous theme.
+ if (activeTheme?.id) {
+ LIGHT_WEIGHT_THEMES.AUTOMATIC = activeTheme.id;
+ }
+ // convert this to the short form name that the front end code
+ // expects
+ let themeShortName = Object.keys(LIGHT_WEIGHT_THEMES).find(
+ key => LIGHT_WEIGHT_THEMES[key] === activeTheme?.id
+ );
+ return themeShortName?.toLowerCase();
+ case "AWPage:DOES_APP_NEED_PIN":
+ return AboutWelcomeParent.doesAppNeedPin();
+ case "AWPage:NEED_DEFAULT":
+ // Only need to set default if we're supposed to check and not default.
+ return (
+ Services.prefs.getBoolPref("browser.shell.checkDefaultBrowser") &&
+ !AboutWelcomeParent.isDefaultBrowser()
+ );
+ case "AWPage:WAIT_FOR_MIGRATION_CLOSE":
+ // Support multiples types of migration: 1) content modal 2) old
+ // migration modal 3) standalone content modal
+ return new Promise(resolve => {
+ const topics = [
+ "MigrationWizard:Closed",
+ "MigrationWizard:Destroyed",
+ ];
+ const observer = () => {
+ topics.forEach(t => Services.obs.removeObserver(observer, t));
+ resolve();
+ };
+ topics.forEach(t => Services.obs.addObserver(observer, t));
+ });
+ case "AWPage:GET_APP_AND_SYSTEM_LOCALE_INFO":
+ return lazy.LangPackMatcher.getAppAndSystemLocaleInfo();
+ case "AWPage:EVALUATE_SCREEN_TARGETING":
+ return lazy.AWScreenUtils.evaluateTargetingAndRemoveScreens(data);
+ case "AWPage:ADD_SCREEN_IMPRESSION":
+ return lazy.AWScreenUtils.addScreenImpression(data);
+ case "AWPage:NEGOTIATE_LANGPACK":
+ return lazy.LangPackMatcher.negotiateLangPackForLanguageMismatch(data);
+ case "AWPage:ENSURE_LANG_PACK_INSTALLED":
+ return lazy.LangPackMatcher.ensureLangPackInstalled(data);
+ case "AWPage:SET_REQUESTED_LOCALES":
+ return lazy.LangPackMatcher.setRequestedAppLocales(data);
+ case "AWPage:SEND_TO_DEVICE_EMAILS_SUPPORTED": {
+ return lazy.BrowserUtils.sendToDeviceEmailsSupported();
+ }
+ default:
+ lazy.log.debug(`Unexpected event ${type} was not handled.`);
+ }
+
+ return undefined;
+ }
+
+ /**
+ * @param {{name: string, data?: any}} message
+ * @override
+ */
+ receiveMessage(message) {
+ const { name, data } = message;
+ let browser;
+
+ if (this.manager.rootFrameLoader) {
+ browser = this.manager.rootFrameLoader.ownerElement;
+ return this.onContentMessage(name, data, browser);
+ }
+
+ lazy.log.warn(`Not handling ${name} because the browser doesn't exist.`);
+ return null;
+ }
+}
+
+export class AboutWelcomeShoppingParent extends AboutWelcomeParent {
+ /**
+ * Handle messages from AboutWelcomeChild.jsm
+ *
+ * @param {string} type
+ * @param {any=} data
+ * @param {Browser} the xul:browser rendering the page
+ */
+ onContentMessage(type, data, browser) {
+ // Only handle the messages that are relevant to the shopping page.
+ switch (type) {
+ case "AWPage:SPECIAL_ACTION":
+ case "AWPage:TELEMETRY_EVENT":
+ case "AWPage:EVALUATE_SCREEN_TARGETING":
+ case "AWPage:ADD_SCREEN_IMPRESSION":
+ return super.onContentMessage(type, data, browser);
+ }
+
+ return undefined;
+ }
+
+ // Override unnecessary methods
+ startAboutWelcomeObserver() {}
+
+ didDestroy() {}
+}
diff --git a/browser/components/aboutwelcome/assets/confetti.svg b/browser/components/aboutwelcome/assets/confetti.svg
new file mode 100644
index 0000000000..e00cd95120
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/confetti.svg
@@ -0,0 +1,55 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="574" height="210" xmlns="http://www.w3.org/2000/svg">
+<path d="M569.854 103.202C564.294 103.202 559.781 98.6802 559.781 93.1295C559.781 87.5788 564.303 83.0566 569.854 83.0566C575.413 83.0566 579.926 87.5788 579.926 93.1295C579.926 98.6802 575.404 103.202 569.854 103.202ZM569.854 83.9345C564.791 83.9345 560.668 88.0576 560.668 93.1206C560.668 98.1837 564.791 102.307 569.854 102.307C574.917 102.307 579.039 98.1837 579.039 93.1206C579.039 88.0576 574.917 83.9345 569.854 83.9345Z" fill="#FFF4DE"/>
+<path d="M577.231 23.4883C574.642 23.4883 572.531 21.378 572.531 18.7888C572.531 16.1997 574.642 14.0894 577.231 14.0894C579.82 14.0894 581.93 16.1997 581.93 18.7888C581.93 21.378 579.82 23.4883 577.231 23.4883ZM577.231 14.9761C575.129 14.9761 573.418 16.6874 573.418 18.7888C573.418 20.8903 575.129 22.6016 577.231 22.6016C579.332 22.6016 581.043 20.8903 581.043 18.7888C581.043 16.6874 579.332 14.9761 577.231 14.9761Z" fill="#F68FFF"/>
+<path d="M561.395 60.6054C558.806 60.6054 556.695 58.4951 556.695 55.9059C556.695 53.3168 558.806 51.2064 561.395 51.2064C563.984 51.2064 566.094 53.3168 566.094 55.9059C566.094 58.4951 563.984 60.6054 561.395 60.6054Z" fill="#F770FF"/>
+<path d="M498.691 109.897C496.102 109.897 493.992 107.787 493.992 105.197C493.992 102.608 496.102 100.498 498.691 100.498C501.281 100.498 503.391 102.608 503.391 105.197C503.391 107.787 501.281 109.897 498.691 109.897ZM498.691 101.385C496.59 101.385 494.879 103.096 494.879 105.197C494.879 107.299 496.59 109.01 498.691 109.01C500.793 109.01 502.504 107.299 502.504 105.197C502.504 103.096 500.793 101.385 498.691 101.385Z" fill="#073072"/>
+<path d="M499.471 57.8478C499.205 57.8478 498.939 57.8301 498.673 57.7946C495.569 57.3601 493.37 54.4872 493.769 51.3749L495.782 35.6538C495.977 34.1109 496.766 32.7543 498.008 31.8232C499.24 30.8922 500.774 30.5109 502.308 30.7415L517.975 33.1533C521.07 33.6321 523.224 36.5405 522.79 39.635C522.577 41.1602 521.779 42.4991 520.547 43.4124C519.314 44.3257 517.798 44.6981 516.282 44.4675L506.395 42.9513L505.128 52.8734C504.932 54.3985 504.152 55.7463 502.937 56.6773C501.918 57.4488 500.712 57.8478 499.471 57.8478ZM501.412 31.5661C500.375 31.5661 499.373 31.903 498.531 32.5326C497.485 33.3218 496.82 34.4656 496.651 35.769L494.638 51.4902C494.301 54.1148 496.163 56.5532 498.788 56.9168C500.074 57.0941 501.35 56.766 502.379 55.9769C503.407 55.1877 504.064 54.0527 504.232 52.7581L505.615 41.9316L516.397 43.5897C517.674 43.7848 518.959 43.4744 519.997 42.703C521.034 41.9316 521.708 40.7966 521.894 39.5109C522.267 36.8863 520.44 34.4301 517.824 34.0311L502.157 31.6193C501.909 31.5838 501.661 31.5661 501.412 31.5661Z" fill="#FF4AA2"/>
+<path d="M530.708 98.0773C529.316 98.0773 527.915 97.9 526.541 97.5364C522.285 96.428 518.712 93.7325 516.486 89.9374C511.893 82.1079 514.518 71.9996 522.347 67.4065C525.096 65.7927 528.687 66.6882 530.345 69.4104L530.442 69.5789C532.012 72.3542 531.107 75.8301 528.385 77.4882L528.234 77.5769C526.053 78.9069 525.335 81.7798 526.63 83.9788C527.924 86.1778 530.779 86.9493 533.005 85.6902L533.155 85.6015C535.931 84.032 539.504 84.9897 541.118 87.7384C542.758 90.5315 541.818 94.1404 539.025 95.7808C536.454 97.3059 533.599 98.0773 530.708 98.0773ZM525.309 67.4952C524.448 67.4952 523.588 67.7168 522.799 68.1779C515.396 72.5316 512.904 82.0902 517.258 89.4941C519.368 93.0852 522.737 95.63 526.771 96.6852C530.797 97.7315 534.991 97.1463 538.582 95.0448C540.958 93.6527 541.747 90.5847 540.355 88.2172C538.981 85.8852 535.957 85.0695 533.599 86.3995L533.448 86.4882C530.806 87.9867 527.401 87.0734 525.867 84.4488C524.333 81.833 525.184 78.4192 527.782 76.8409L527.933 76.7523C530.238 75.3424 531.01 72.3986 529.68 70.04L529.591 69.8892C528.651 68.3464 526.993 67.4952 525.309 67.4952Z" fill="#FFFF98"/>
+<path d="M543.095 28.5248C542.075 28.5248 541.037 28.2588 540.098 27.7002L524.838 18.6027C522.107 16.9712 521.167 13.4067 522.755 10.649L522.852 10.4806C524.528 7.77613 528.11 6.90717 530.841 8.52982L546.1 17.6273C547.448 18.4254 548.397 19.7111 548.778 21.2273C549.159 22.7436 548.929 24.3219 548.131 25.6697C547.04 27.5051 545.09 28.5248 543.095 28.5248ZM523.615 10.9416L523.526 11.0835C522.178 13.4244 522.976 16.448 525.29 17.8313L540.55 26.9288C542.908 28.3298 545.967 27.5583 547.368 25.2086C548.051 24.0648 548.246 22.7258 547.918 21.4401C547.59 20.1544 546.783 19.0638 545.639 18.3899L530.38 9.29238C528.074 7.90914 525.033 8.65396 523.615 10.9416Z" fill="#2AC3A2"/>
+<path d="M551.004 128.163C548.415 128.163 546.305 126.053 546.305 123.463C546.305 120.874 548.415 118.764 551.004 118.764C553.593 118.764 555.703 120.874 555.703 123.463C555.703 126.053 553.593 128.163 551.004 128.163ZM551.004 119.651C548.903 119.651 547.191 121.362 547.191 123.463C547.191 125.565 548.903 127.276 551.004 127.276C553.105 127.276 554.817 125.565 554.817 123.463C554.817 121.362 553.105 119.651 551.004 119.651Z" fill="#FF8A50"/>
+<path d="M575.12 176.08C574.517 176.08 573.897 175.982 573.294 175.778L558.282 170.698C556.811 170.201 555.631 169.155 554.966 167.763C554.301 166.371 554.221 164.792 554.753 163.338L560.206 148.459C561.288 145.515 564.56 143.981 567.513 145.019C568.958 145.533 570.119 146.579 570.767 147.963C571.423 149.355 571.485 150.907 570.962 152.352L567.521 161.742L576.991 164.943C578.445 165.431 579.615 166.468 580.289 167.842C580.963 169.217 581.052 170.777 580.546 172.232C579.731 174.599 577.488 176.08 575.12 176.08Z" fill="#FFD567"/>
+<path d="M525.033 151.625C523.57 151.625 522.107 151.093 520.981 150.011L520.839 149.878C518.605 147.599 518.578 144.008 520.777 141.703L520.901 141.579C522.666 139.734 522.612 136.773 520.795 134.982C518.977 133.182 516.016 133.182 514.189 134.973L514.065 135.097C511.786 137.331 508.089 137.331 505.819 135.088C503.514 132.809 503.487 129.085 505.757 126.78C508.843 123.65 512.966 121.903 517.363 121.876C521.744 121.867 525.902 123.525 529.041 126.611C535.505 132.986 535.575 143.432 529.209 149.896C528.074 151.048 526.549 151.625 525.033 151.625ZM521.469 149.257L521.593 149.373C523.544 151.235 526.682 151.19 528.589 149.257C534.618 143.139 534.547 133.261 528.429 127.232C525.494 124.341 521.619 122.745 517.496 122.745C517.461 122.745 517.417 122.745 517.381 122.745C513.223 122.772 509.321 124.421 506.404 127.383C504.471 129.342 504.498 132.508 506.458 134.441C508.382 136.338 511.52 136.347 513.453 134.45L513.577 134.325C515.741 132.197 519.261 132.206 521.424 134.334C523.588 136.462 523.641 139.982 521.548 142.182L521.424 142.306C519.554 144.274 519.571 147.324 521.469 149.257Z" fill="#FFA436"/>
+<path d="M479.211 22.7346C473.652 22.7346 469.139 18.2125 469.139 12.6617C469.139 7.11102 473.661 2.58887 479.211 2.58887C484.762 2.58887 489.284 7.11102 489.284 12.6617C489.284 18.2125 484.77 22.7346 479.211 22.7346ZM479.211 3.46669C474.148 3.46669 470.025 7.58983 470.025 12.6529C470.025 17.7159 474.148 21.839 479.211 21.839C484.274 21.839 488.397 17.7159 488.397 12.6529C488.397 7.58983 484.274 3.46669 479.211 3.46669Z" fill="#D1FFEE"/>
+<path d="M383.354 103.202C377.794 103.202 373.281 98.6802 373.281 93.1295C373.281 87.5788 377.803 83.0566 383.354 83.0566C388.913 83.0566 393.426 87.5788 393.426 93.1295C393.426 98.6802 388.904 103.202 383.354 103.202ZM383.354 83.9345C378.291 83.9345 374.168 88.0576 374.168 93.1206C374.168 98.1837 378.291 102.307 383.354 102.307C388.417 102.307 392.539 98.1837 392.539 93.1206C392.539 88.0576 388.417 83.9345 383.354 83.9345Z" fill="#CB9EFF"/>
+<path d="M390.731 23.4883C388.141 23.4883 386.031 21.378 386.031 18.7888C386.031 16.1997 388.141 14.0894 390.731 14.0894C393.32 14.0894 395.43 16.1997 395.43 18.7888C395.43 21.378 393.32 23.4883 390.731 23.4883Z" fill="#0090ED"/>
+<path d="M451.6 39.3248C449.011 39.3248 446.9 37.2144 446.9 34.6253C446.9 32.0361 449.011 29.9258 451.6 29.9258C454.189 29.9258 456.299 32.0361 456.299 34.6253C456.299 37.2144 454.189 39.3248 451.6 39.3248ZM451.6 30.8125C449.498 30.8125 447.787 32.5238 447.787 34.6253C447.787 36.7267 449.498 38.4381 451.6 38.4381C453.701 38.4381 455.412 36.7267 455.412 34.6253C455.412 32.5238 453.701 30.8125 451.6 30.8125Z" fill="#E3FFF3"/>
+<path d="M374.895 60.6054C372.306 60.6054 370.195 58.4951 370.195 55.9059C370.195 53.3168 372.306 51.2064 374.895 51.2064C377.484 51.2064 379.594 53.3168 379.594 55.9059C379.594 58.4951 377.484 60.6054 374.895 60.6054ZM374.895 52.0931C372.793 52.0931 371.082 53.8044 371.082 55.9059C371.082 58.0074 372.793 59.7187 374.895 59.7187C376.996 59.7187 378.707 58.0074 378.707 55.9059C378.707 53.8044 376.996 52.0931 374.895 52.0931Z" fill="#241F20"/>
+<path d="M435.268 95.2487C432.679 95.2487 430.568 93.1384 430.568 90.5492C430.568 87.9601 432.679 85.8497 435.268 85.8497C437.857 85.8497 439.967 87.9601 439.967 90.5492C439.967 93.1384 437.857 95.2487 435.268 95.2487Z" fill="#FF298A"/>
+<path d="M421.826 7.33274C420.478 7.33274 419.121 6.87166 418.022 5.94063L417.88 5.81649C415.53 3.67068 415.335 -0.00910568 417.437 -2.39432L429.185 -15.7214C430.222 -16.8918 431.65 -17.6012 433.219 -17.6898C434.78 -17.7874 436.287 -17.2731 437.466 -16.2356C439.887 -14.0987 440.117 -10.3835 437.98 -7.96277L426.223 5.36427C425.071 6.66772 423.448 7.33274 421.826 7.33274ZM418.474 5.16033L418.598 5.2756C420.646 7.03126 423.767 6.80959 425.558 4.77905L437.307 -8.54799C439.124 -10.6051 438.92 -13.7529 436.872 -15.5706C435.879 -16.4485 434.593 -16.8918 433.272 -16.8031C431.942 -16.7233 430.728 -16.1292 429.85 -15.1273L418.102 -1.80023C416.319 0.212566 416.488 3.3426 418.474 5.16033Z" fill="#FF298A"/>
+<path d="M312.971 57.8478C312.705 57.8478 312.439 57.8301 312.173 57.7946C309.069 57.3601 306.87 54.4872 307.269 51.3749L309.282 35.6538C309.477 34.1109 310.266 32.7543 311.508 31.8232C312.749 30.8922 314.274 30.5109 315.808 30.7415L331.475 33.1533C334.57 33.6321 336.724 36.5405 336.29 39.635C336.077 41.1602 335.279 42.4991 334.047 43.4124C332.814 44.3257 331.298 44.6981 329.782 44.4675L319.895 42.9513L318.628 52.8734C318.432 54.3985 317.652 55.7463 316.437 56.6773C315.418 57.4488 314.212 57.8478 312.971 57.8478ZM314.912 31.5661C313.875 31.5661 312.873 31.903 312.031 32.5326C310.985 33.3218 310.32 34.4656 310.151 35.769L308.138 51.4902C307.801 54.1148 309.663 56.5532 312.288 56.9168C313.574 57.0941 314.85 56.766 315.879 55.9769C316.907 55.1877 317.564 54.0527 317.732 52.7581L319.115 41.9316L329.897 43.5897C331.183 43.7848 332.459 43.4744 333.497 42.703C334.534 41.9316 335.208 40.7966 335.394 39.5109C335.767 36.8863 333.94 34.4301 331.324 34.0311L315.657 31.6193C315.409 31.5838 315.161 31.5661 314.912 31.5661Z" fill="#E7DFFF"/>
+<path d="M414.654 74.3758C413.678 74.3758 412.685 74.1276 411.772 73.6221C407.942 71.4586 405.184 67.9384 404.005 63.7C402.826 59.4616 403.366 55.0193 405.53 51.1976C409.99 43.2971 420.053 40.4952 427.962 44.9464C430.738 46.5158 431.757 50.0626 430.241 52.8646L430.144 53.033C428.53 55.7818 425.072 56.7483 422.27 55.2232L422.119 55.1345C419.876 53.9198 417.03 54.7355 415.771 56.9611C414.512 59.1867 415.283 62.0508 417.491 63.3365L417.642 63.4251C420.39 65.0389 421.357 68.6034 419.787 71.3877C418.697 73.3029 416.702 74.3758 414.654 74.3758ZM419.894 43.7139C414.45 43.7139 409.156 46.569 406.301 51.6321C404.253 55.2587 403.748 59.4616 404.865 63.4606C405.982 67.4596 408.589 70.8025 412.215 72.8419C414.609 74.1985 417.659 73.3473 419.016 70.9443C420.346 68.5857 419.53 65.5532 417.198 64.1877L417.048 64.099C414.423 62.565 413.51 59.1601 414.999 56.5178C416.489 53.8754 419.876 52.9001 422.545 54.3454L422.696 54.434C425.072 55.7286 428.007 54.9129 429.381 52.572L429.47 52.4212C430.755 50.0449 429.895 47.0301 427.537 45.7001C425.107 44.3523 422.483 43.7139 419.894 43.7139Z" fill="#E7DFFF"/>
+<path d="M356.595 28.5247C355.575 28.5247 354.537 28.2587 353.598 27.7001L338.338 18.6026C335.607 16.9711 334.667 13.4066 336.255 10.6489L336.352 10.4805C338.028 7.78491 341.61 6.90709 344.341 8.52974L359.6 17.6272C360.948 18.4253 361.897 19.711 362.278 21.2272C362.659 22.7435 362.429 24.3218 361.631 25.6696C360.54 27.505 358.59 28.5247 356.595 28.5247ZM337.115 10.9416L337.026 11.0834C335.678 13.4243 336.476 16.4479 338.79 17.8312L354.05 26.9287C356.408 28.3297 359.467 27.5582 360.868 25.2085C361.551 24.0647 361.746 22.7257 361.418 21.44C361.09 20.1543 360.283 19.0637 359.139 18.3898L343.88 9.2923C341.575 7.90905 338.542 8.65388 337.115 10.9416Z" fill="#D74CF0"/>
+<path d="M467.729 91.8792C465.965 91.8792 464.209 91.09 463.065 89.5915L452.248 75.5019C451.29 74.2605 450.882 72.7177 451.086 71.1659C451.29 69.6142 452.088 68.231 453.33 67.2822C455.892 65.3137 459.581 65.8014 461.549 68.364L472.366 82.4536C474.308 84.9807 473.856 88.6427 471.364 90.6201L471.214 90.7353C470.167 91.5068 468.944 91.8792 467.729 91.8792Z" fill="#3FE1B0"/>
+<path d="M417.25 142.421C411.691 142.421 407.178 137.899 407.178 132.348C407.178 126.797 411.7 122.275 417.25 122.275C422.801 122.275 427.323 126.797 427.323 132.348C427.323 137.899 422.81 142.421 417.25 142.421ZM417.25 123.162C412.187 123.162 408.064 127.285 408.064 132.348C408.064 137.411 412.187 141.534 417.25 141.534C422.313 141.534 426.436 137.411 426.436 132.348C426.436 127.285 422.313 123.162 417.25 123.162Z" fill="#FFDEF0"/>
+<path d="M364.504 128.163C361.915 128.163 359.805 126.053 359.805 123.463C359.805 120.874 361.915 118.764 364.504 118.764C367.093 118.764 369.203 120.874 369.203 123.463C369.203 126.053 367.093 128.163 364.504 128.163ZM364.504 119.651C362.403 119.651 360.691 121.362 360.691 123.463C360.691 125.565 362.403 127.276 364.504 127.276C366.605 127.276 368.317 125.565 368.317 123.463C368.317 121.362 366.605 119.651 364.504 119.651Z" fill="#FFB587"/>
+<path d="M469.387 157.805C467.969 157.805 466.541 157.282 465.433 156.236L453.942 145.32C452.816 144.256 452.186 142.811 452.168 141.259C452.151 139.708 452.745 138.253 453.835 137.154L465.034 125.937C467.25 123.72 470.868 123.703 473.111 125.884C474.211 126.957 474.823 128.393 474.831 129.927C474.84 131.461 474.246 132.907 473.165 133.988L466.098 141.064L473.351 147.954C474.468 149.009 475.097 150.437 475.124 151.971C475.151 153.505 474.583 154.959 473.51 156.058C472.384 157.22 470.886 157.805 469.387 157.805ZM469.095 125.157C467.845 125.157 466.603 125.627 465.655 126.576L454.456 137.792C453.534 138.723 453.028 139.947 453.046 141.259C453.064 142.572 453.596 143.786 454.545 144.691L466.036 155.606C467.96 157.433 471.019 157.371 472.863 155.464C473.767 154.533 474.246 153.31 474.229 152.015C474.211 150.72 473.67 149.514 472.73 148.619L464.821 141.109L472.535 133.385C473.448 132.472 473.954 131.249 473.945 129.954C473.936 128.659 473.422 127.445 472.491 126.54C471.551 125.609 470.327 125.157 469.095 125.157Z" fill="#FFBD4F"/>
+<path d="M292.711 22.7346C287.152 22.7346 282.639 18.2125 282.639 12.6617C282.639 7.11102 287.161 2.58887 292.711 2.58887C298.262 2.58887 302.784 7.11102 302.784 12.6617C302.784 18.2125 298.262 22.7346 292.711 22.7346ZM292.711 3.46669C287.648 3.46669 283.525 7.58983 283.525 12.6529C283.525 17.7159 287.648 21.839 292.711 21.839C297.774 21.839 301.897 17.7159 301.897 12.6529C301.897 7.58983 297.774 3.46669 292.711 3.46669Z" fill="#80EBFF"/>
+<path d="M196.854 103.202C191.294 103.202 186.781 98.6802 186.781 93.1295C186.781 87.5788 191.303 83.0566 196.854 83.0566C202.404 83.0566 206.926 87.5788 206.926 93.1295C206.926 98.6802 202.404 103.202 196.854 103.202ZM196.854 83.9345C191.791 83.9345 187.668 88.0576 187.668 93.1206C187.668 98.1837 191.791 102.307 196.854 102.307C201.917 102.307 206.04 98.1837 206.04 93.1206C206.04 88.0576 201.917 83.9345 196.854 83.9345Z" fill="#E7DFFF"/>
+<path d="M204.231 23.4883C201.641 23.4883 199.531 21.378 199.531 18.7888C199.531 16.1997 201.641 14.0894 204.231 14.0894C206.82 14.0894 208.93 16.1997 208.93 18.7888C208.93 21.378 206.82 23.4883 204.231 23.4883ZM204.231 14.9761C202.129 14.9761 200.418 16.6874 200.418 18.7888C200.418 20.8903 202.129 22.6016 204.231 22.6016C206.332 22.6016 208.043 20.8903 208.043 18.7888C208.043 16.6874 206.332 14.9761 204.231 14.9761Z" fill="#F7E2FF"/>
+<path d="M265.1 39.3248C262.511 39.3248 260.4 37.2144 260.4 34.6253C260.4 32.0361 262.511 29.9258 265.1 29.9258C267.689 29.9258 269.799 32.0361 269.799 34.6253C269.799 37.2144 267.689 39.3248 265.1 39.3248ZM265.1 30.8125C262.998 30.8125 261.287 32.5238 261.287 34.6253C261.287 36.7267 262.998 38.4381 265.1 38.4381C267.201 38.4381 268.912 36.7267 268.912 34.6253C268.912 32.5238 267.201 30.8125 265.1 30.8125Z" fill="#FFD567"/>
+<path d="M188.395 60.6054C185.806 60.6054 183.695 58.4951 183.695 55.9059C183.695 53.3168 185.806 51.2064 188.395 51.2064C190.984 51.2064 193.094 53.3168 193.094 55.9059C193.094 58.4951 190.984 60.6054 188.395 60.6054ZM188.395 52.0931C186.293 52.0931 184.582 53.8044 184.582 55.9059C184.582 58.0074 186.293 59.7187 188.395 59.7187C190.496 59.7187 192.207 58.0074 192.207 55.9059C192.207 53.8044 190.496 52.0931 188.395 52.0931Z" fill="#FFB587"/>
+<path d="M125.691 109.897C123.102 109.897 120.992 107.787 120.992 105.197C120.992 102.608 123.102 100.498 125.691 100.498C128.281 100.498 130.391 102.608 130.391 105.197C130.391 107.787 128.281 109.897 125.691 109.897ZM125.691 101.385C123.59 101.385 121.879 103.096 121.879 105.197C121.879 107.299 123.59 109.01 125.691 109.01C127.793 109.01 129.504 107.299 129.504 105.197C129.504 103.096 127.793 101.385 125.691 101.385Z" fill="#45278D"/>
+<path d="M235.325 7.33274C233.978 7.33274 232.621 6.87166 231.522 5.94063L231.38 5.81649C229.03 3.67068 228.835 -0.00910568 230.937 -2.39432L242.685 -15.7214C243.722 -16.8918 245.15 -17.6012 246.719 -17.6898C248.288 -17.7874 249.787 -17.2731 250.966 -16.2356C253.387 -14.0987 253.617 -10.3835 251.48 -7.96277L239.732 5.36427C238.571 6.66772 236.948 7.33274 235.325 7.33274Z" fill="#FF6A75"/>
+<path d="M126.471 57.8478C126.205 57.8478 125.939 57.8301 125.673 57.7946C122.569 57.3601 120.37 54.4872 120.769 51.3749L122.782 35.6538C122.977 34.1109 123.766 32.7543 125.008 31.8232C126.249 30.8922 127.774 30.5109 129.308 30.7415L144.975 33.1533C148.07 33.6321 150.233 36.5405 149.79 39.635C149.577 41.1602 148.779 42.4991 147.547 43.4124C146.314 44.3257 144.798 44.6981 143.282 44.4675L133.395 42.9513L132.128 52.8734C131.932 54.3985 131.152 55.7463 129.937 56.6773C128.909 57.4488 127.712 57.8478 126.471 57.8478ZM128.412 31.5661C127.375 31.5661 126.373 31.903 125.531 32.5326C124.485 33.3218 123.82 34.4656 123.651 35.769L121.638 51.4902C121.301 54.1148 123.163 56.5532 125.788 56.9168C127.074 57.0941 128.35 56.766 129.379 55.9769C130.407 55.1877 131.064 54.0527 131.232 52.7581L132.615 41.9316L143.397 43.5897C144.683 43.7848 145.959 43.4656 146.997 42.703C148.034 41.9316 148.708 40.7966 148.894 39.5109C149.267 36.8863 147.44 34.4301 144.824 34.0311L129.157 31.6193C128.909 31.5838 128.661 31.5661 128.412 31.5661Z" fill="#54FFBD"/>
+<path d="M225.262 73.6222C226.176 74.1276 227.169 74.3759 228.144 74.3759C230.201 74.3759 232.196 73.303 233.278 71.3878C234.847 68.6035 233.881 65.039 231.132 63.4252L230.981 63.3365C228.773 62.0508 228.002 59.1868 229.261 56.9612C230.52 54.7356 233.366 53.9198 235.61 55.1346L235.76 55.2233C238.562 56.7484 242.02 55.7819 243.634 53.0331L243.731 52.8647C245.248 50.0627 244.228 46.5159 241.453 44.9465C233.544 40.4864 223.48 43.2883 219.02 51.1977C216.857 55.0193 216.316 59.4617 217.495 63.7001C218.674 67.9385 221.432 71.4587 225.262 73.6222Z" fill="#592ACB"/>
+<path d="M157.708 98.0773C156.316 98.0773 154.915 97.9 153.541 97.5364C149.285 96.428 145.712 93.7325 143.486 89.9374C138.893 82.1079 141.518 71.9996 149.347 67.4065C152.096 65.7927 155.678 66.6882 157.336 69.4104L157.433 69.5789C159.003 72.3542 158.098 75.8301 155.376 77.4882L155.226 77.5769C153.044 78.9069 152.326 81.7798 153.621 83.9788C154.915 86.1778 157.779 86.9493 159.996 85.6902L160.147 85.6015C162.922 84.032 166.495 84.9897 168.109 87.7384C169.749 90.5315 168.809 94.1404 166.016 95.7808C163.454 97.3059 160.599 98.0773 157.708 98.0773ZM152.309 67.4952C151.448 67.4952 150.588 67.7168 149.799 68.1779C142.396 72.5316 139.904 82.0902 144.258 89.4941C146.368 93.0852 149.737 95.63 153.771 96.6852C157.797 97.7315 161.991 97.1463 165.582 95.0448C167.958 93.6527 168.747 90.5847 167.355 88.2172C165.981 85.8852 162.957 85.0695 160.599 86.3995L160.448 86.4882C157.806 87.9867 154.401 87.0734 152.867 84.4488C151.333 81.833 152.184 78.4192 154.782 76.8409L154.933 76.7523C157.238 75.3424 158.01 72.3986 156.68 70.04L156.591 69.8892C155.642 68.3464 153.993 67.4952 152.309 67.4952Z" fill="#FF6BBA"/>
+<path d="M170.095 28.5247C169.075 28.5247 168.037 28.2587 167.098 27.7001L151.838 18.6026C149.107 16.9711 148.167 13.4066 149.755 10.6489L149.852 10.4805C151.528 7.78491 155.11 6.90709 157.841 8.52974L173.1 17.6272C174.448 18.4253 175.397 19.711 175.778 21.2272C176.159 22.7435 175.929 24.3218 175.131 25.6696C174.04 27.505 172.089 28.5247 170.095 28.5247ZM150.615 10.9416L150.526 11.0834C149.178 13.4243 149.976 16.4479 152.29 17.8312L167.55 26.9287C169.908 28.3297 172.967 27.5582 174.368 25.2085C175.051 24.0647 175.246 22.7257 174.918 21.44C174.59 20.1543 173.783 19.0637 172.639 18.3898L157.38 9.2923C155.075 7.90905 152.033 8.65388 150.615 10.9416Z" fill="#FFFFCC"/>
+<path d="M178.004 128.163C175.415 128.163 173.305 126.053 173.305 123.463C173.305 120.874 175.415 118.764 178.004 118.764C180.593 118.764 182.703 120.874 182.703 123.463C182.703 126.053 180.593 128.163 178.004 128.163ZM178.004 119.651C175.903 119.651 174.191 121.362 174.191 123.463C174.191 125.565 175.903 127.276 178.004 127.276C180.105 127.276 181.817 125.565 181.817 123.463C181.817 121.362 180.105 119.651 178.004 119.651Z" fill="#241F20"/>
+<path d="M152.025 151.625C150.562 151.625 149.099 151.093 147.973 150.011L147.831 149.878C145.597 147.599 145.57 144.008 147.769 141.703L147.893 141.578C149.658 139.734 149.605 136.773 147.787 134.981C145.969 133.181 143.008 133.181 141.181 134.973L141.057 135.097C138.779 137.331 135.081 137.331 132.811 135.088C130.506 132.818 130.479 129.085 132.749 126.78C135.835 123.649 139.958 121.903 144.356 121.876C144.4 121.876 144.435 121.876 144.48 121.876C148.833 121.876 152.93 123.552 156.033 126.611C162.497 132.986 162.568 143.432 156.201 149.896C155.075 151.048 153.55 151.625 152.025 151.625ZM148.47 149.257L148.594 149.373C150.553 151.243 153.692 151.19 155.59 149.266C161.619 143.148 161.548 133.27 155.43 127.241C152.495 124.35 148.62 122.754 144.498 122.754C144.462 122.754 144.418 122.754 144.382 122.754C140.224 122.781 136.323 124.43 133.405 127.391C131.472 129.351 131.499 132.516 133.459 134.449C135.383 136.356 138.521 136.356 140.454 134.458L140.578 134.334C142.742 132.206 146.262 132.206 148.425 134.343C150.589 136.471 150.642 140 148.55 142.19L148.425 142.314C146.555 144.274 146.572 147.324 148.47 149.257Z" fill="#C689FF"/>
+<path d="M106.211 22.7346C100.652 22.7346 96.1387 18.2125 96.1387 12.6617C96.1387 7.11102 100.661 2.58887 106.211 2.58887C111.762 2.58887 116.284 7.11102 116.284 12.6617C116.284 18.2125 111.762 22.7346 106.211 22.7346ZM106.211 3.46669C101.148 3.46669 97.0253 7.58983 97.0253 12.6529C97.0253 17.7159 101.148 21.839 106.211 21.839C111.274 21.839 115.397 17.7159 115.397 12.6529C115.397 7.58983 111.274 3.46669 106.211 3.46669Z" fill="#FF6BBA"/>
+<path d="M10.3459 103.202C4.78654 103.202 0.273438 98.6802 0.273438 93.1295C0.273438 87.5788 4.7954 83.0566 10.3459 83.0566C15.8964 83.0566 20.4184 87.5788 20.4184 93.1295C20.4184 98.6802 15.9053 103.202 10.3459 103.202ZM10.3459 83.9345C5.28307 83.9345 1.1601 88.0576 1.1601 93.1206C1.1601 98.1837 5.28307 102.307 10.3459 102.307C15.4087 102.307 19.5317 98.1837 19.5317 93.1206C19.5317 88.0576 15.4176 83.9345 10.3459 83.9345Z" fill="#87FFD1"/>
+<path d="M17.7305 23.4883C15.1415 23.4883 13.0312 21.378 13.0312 18.7888C13.0312 16.1997 15.1415 14.0894 17.7305 14.0894C20.3196 14.0894 22.4298 16.1997 22.4298 18.7888C22.4298 21.378 20.3196 23.4883 17.7305 23.4883ZM17.7305 14.9761C15.6292 14.9761 13.9179 16.6874 13.9179 18.7888C13.9179 20.8903 15.6292 22.6016 17.7305 22.6016C19.8319 22.6016 21.5432 20.8903 21.5432 18.7888C21.5432 16.6874 19.8319 14.9761 17.7305 14.9761Z" fill="#C45A27"/>
+<path d="M78.5997 39.3248C76.0106 39.3248 73.9004 37.2144 73.9004 34.6253C73.9004 32.0361 76.0106 29.9258 78.5997 29.9258C81.1887 29.9258 83.299 32.0361 83.299 34.6253C83.299 37.2144 81.1887 39.3248 78.5997 39.3248ZM78.5997 30.8125C76.4983 30.8125 74.7871 32.5238 74.7871 34.6253C74.7871 36.7267 76.4983 38.4381 78.5997 38.4381C80.7011 38.4381 82.4123 36.7267 82.4123 34.6253C82.4123 32.5238 80.7011 30.8125 78.5997 30.8125Z" fill="#45278D"/>
+<path d="M62.2677 95.2487C59.6786 95.2487 57.5684 93.1384 57.5684 90.5492C57.5684 87.9601 59.6786 85.8497 62.2677 85.8497C64.8567 85.8497 66.967 87.9601 66.967 90.5492C66.967 93.1384 64.8567 95.2487 62.2677 95.2487ZM62.2677 86.7364C60.1663 86.7364 58.455 88.4478 58.455 90.5492C58.455 92.6507 60.1663 94.362 62.2677 94.362C64.369 94.362 66.0803 92.6507 66.0803 90.5492C66.0803 88.4478 64.369 86.7364 62.2677 86.7364Z" fill="#241F20"/>
+<path d="M48.8166 7.33274C47.4689 7.33274 46.1123 6.87166 45.0217 5.94063L44.8798 5.81649C42.5302 3.67068 42.3351 -0.00910568 44.4365 -2.39432L56.1848 -15.7214C57.2221 -16.8918 58.6497 -17.6012 60.2191 -17.6898C61.7796 -17.7874 63.2869 -17.2731 64.4662 -16.2356C66.8867 -14.0987 67.1173 -10.3835 64.9804 -7.96277L53.2322 5.36427C52.0707 6.66772 50.4481 7.33274 48.8166 7.33274Z" fill="#87FFD1"/>
+<path d="M41.6439 74.3759C40.6686 74.3759 39.6755 74.1276 38.7622 73.6222C34.9319 71.4587 32.1744 67.9385 30.9951 63.7001C29.8158 59.4617 30.3567 55.0193 32.5202 51.1977C36.9801 43.2883 47.0436 40.4864 54.9526 44.9465C57.7279 46.5159 58.7476 50.0627 57.2314 52.8647L57.1338 53.0331C55.5201 55.7819 52.0621 56.7484 49.2603 55.2233L49.1096 55.1346C46.8663 53.9198 44.0201 54.7356 42.7611 56.9612C41.502 59.1868 42.2734 62.0508 44.4812 63.3365L44.6319 63.4252C47.3806 65.039 48.347 68.6035 46.7776 71.3878C45.6959 73.303 43.7009 74.3759 41.6439 74.3759ZM46.884 43.714C41.44 43.714 36.1466 46.5691 33.2915 51.6321C31.2434 55.2587 30.738 59.4617 31.8552 63.4607C32.9723 67.4686 35.5791 70.8025 39.2056 72.8419C41.5995 74.1986 44.6497 73.3474 46.0062 70.9444C47.3362 68.5858 46.5205 65.5533 44.1886 64.1878L44.0379 64.0991C41.4133 62.5651 40.5001 59.1602 41.9897 56.5179C43.4793 53.8755 46.8663 52.9001 49.5351 54.3454L49.6859 54.4341C52.0621 55.7287 54.997 54.9129 56.3713 52.5721L56.46 52.4213C57.7456 50.045 56.8856 47.0302 54.527 45.7002C52.1065 44.3524 49.482 43.714 46.884 43.714Z" fill="#FFA266"/>
+<path d="M94.729 91.8792C92.9646 91.8792 91.209 91.09 90.0652 89.5915L79.248 75.5019C78.2904 74.2605 77.8825 72.7177 78.0864 71.1659C78.2904 69.6142 79.0884 68.231 80.3297 67.2822C82.8921 65.3137 86.5806 65.8014 88.549 68.364L99.3662 82.4536C101.308 84.9807 100.856 88.6427 98.3643 90.6201L98.2136 90.7353C97.1585 91.5068 95.9437 91.8792 94.729 91.8792ZM83.8852 66.963C82.8301 66.963 81.7661 67.2999 80.8617 67.9916C79.8066 68.7985 79.1327 69.9689 78.9554 71.2901C78.778 72.6113 79.1327 73.9147 79.9396 74.9699L90.7568 89.0595C92.3971 91.1964 95.5004 91.6309 97.6639 90.026L97.7969 89.9196C99.9071 88.2437 100.288 85.1403 98.6481 82.9945L87.8308 68.9049C86.8644 67.6369 85.3836 66.963 83.8852 66.963Z" fill="#FF6A75"/>
+<path d="M44.2502 142.421C38.6908 142.421 34.1777 137.899 34.1777 132.348C34.1777 126.797 38.6997 122.275 44.2502 122.275C49.8007 122.275 54.3226 126.797 54.3226 132.348C54.3226 137.899 49.8007 142.421 44.2502 142.421ZM44.2502 123.162C39.1874 123.162 35.0644 127.285 35.0644 132.348C35.0644 137.411 39.1874 141.534 44.2502 141.534C49.313 141.534 53.436 137.411 53.436 132.348C53.436 127.285 49.313 123.162 44.2502 123.162Z" fill="#FF4AA2"/>
+<path d="M17.7305 209.828C15.1415 209.828 13.0312 207.717 13.0312 205.128C13.0312 202.539 15.1415 200.429 17.7305 200.429C20.3196 200.429 22.4298 202.539 22.4298 205.128C22.4298 207.717 20.3196 209.828 17.7305 209.828ZM17.7305 201.306C15.6292 201.306 13.9179 203.018 13.9179 205.119C13.9179 207.221 15.6292 208.932 17.7305 208.932C19.8319 208.932 21.5432 207.221 21.5432 205.119C21.5432 203.018 19.8319 201.306 17.7305 201.306Z" fill="#AB71FF"/>
+<path d="M48.8166 193.672C47.4689 193.672 46.1123 193.211 45.0217 192.28L44.8798 192.156C42.5302 190.01 42.3351 186.33 44.4365 183.945L56.1848 170.618C57.2221 169.447 58.6497 168.738 60.2191 168.649C61.7796 168.552 63.2869 169.066 64.4662 170.104C66.8867 172.241 67.1173 175.956 64.9804 178.376L53.2322 191.704C52.0707 192.998 50.4481 193.672 48.8166 193.672ZM45.4739 191.491L45.598 191.606C47.6462 193.353 50.7673 193.14 52.5583 191.109L64.3066 177.782C66.1242 175.725 65.9203 172.577 63.8721 170.76C62.879 169.882 61.5934 169.43 60.2723 169.518C58.9423 169.598 57.7275 170.192 56.8497 171.194L45.1015 184.521C43.3105 186.543 43.4789 189.673 45.4739 191.491Z" fill="#AB71FF"/>
+<path d="M15.6289 176.089C15.0171 176.089 14.3965 175.991 13.7935 175.787L-1.21762 170.707C-2.68948 170.21 -3.86874 169.164 -4.53373 167.772C-5.19873 166.371 -5.27853 164.801 -4.74653 163.347L0.706426 148.468C1.78815 145.524 5.05993 143.99 8.01251 145.028C9.45776 145.542 10.6193 146.588 11.2665 147.972C11.9138 149.355 11.9847 150.915 11.4616 152.361L8.02137 161.751L17.4909 164.952C18.945 165.44 20.1154 166.477 20.7893 167.851C21.4631 169.226 21.5518 170.786 21.0464 172.241C20.8868 172.684 20.6829 173.101 20.4257 173.491C19.344 175.149 17.5264 176.089 15.6289 176.089ZM6.11505 145.586C4.12893 145.586 2.25808 146.81 1.53989 148.77L-3.91307 163.648C-4.36527 164.881 -4.3032 166.202 -3.73574 167.381C-3.16827 168.561 -2.17522 169.439 -0.933894 169.864L14.0773 174.945C16.1698 175.654 18.4751 174.856 19.6898 173.012C19.9026 172.684 20.0799 172.329 20.2129 171.948C20.6385 170.724 20.5676 169.412 20.0001 168.241C19.4327 167.071 18.4396 166.211 17.216 165.794L6.87758 162.301L10.637 152.059C11.0803 150.836 11.0271 149.523 10.4774 148.353C9.92769 147.182 8.95237 146.296 7.72878 145.861C7.18791 145.675 6.64704 145.586 6.11505 145.586Z" fill="#F770FF"/>
+<path d="M96.3873 157.805C94.9686 157.805 93.5411 157.282 92.4328 156.236L80.9417 145.32C79.8156 144.247 79.1861 142.811 79.1684 141.259C79.1506 139.708 79.7447 138.253 80.8353 137.154L92.0338 125.937C94.2416 123.72 97.868 123.703 100.111 125.884C101.211 126.957 101.823 128.393 101.831 129.927C101.84 131.461 101.246 132.907 100.164 133.988L93.0978 141.064L100.351 147.954C101.468 149.009 102.097 150.437 102.124 151.971C102.151 153.505 101.583 154.959 100.51 156.058C99.3842 157.22 97.8857 157.805 96.3873 157.805ZM96.0947 125.157C94.8445 125.157 93.6032 125.627 92.6545 126.576L81.4559 137.792C80.5338 138.723 80.0284 139.947 80.0462 141.259C80.0639 142.572 80.5959 143.786 81.5446 144.691L93.0357 155.606C94.9598 157.424 98.0187 157.362 99.863 155.464C100.767 154.533 101.246 153.31 101.228 152.015C101.202 150.72 100.67 149.514 99.73 148.619L91.821 141.109L99.5349 133.385C100.448 132.463 100.954 131.249 100.945 129.954C100.936 128.659 100.422 127.445 99.4906 126.54C98.5507 125.609 97.3183 125.157 96.0947 125.157Z" fill="#F6B8FF"/>
+</svg>
diff --git a/browser/components/aboutwelcome/assets/device-migration.svg b/browser/components/aboutwelcome/assets/device-migration.svg
new file mode 100644
index 0000000000..d4beba87d9
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/device-migration.svg
@@ -0,0 +1,36 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg fill="none" xmlns="http://www.w3.org/2000/svg" width="341" height="400" viewBox="0 0 341 215">
+ <g clip-path="url(#a)">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="m68 23.5 3.5 65 6.5 40 3.5 8v5.5l45 54 17.5 17.5h6l108-51 18-12.5 2-13.5v-8l-44.5-30v-55l-2-30-2-10.5L182 6l-76.5 7.5L73 19l-5 4.5Zm18 1L84 30v20l3.5 40.5 2 20 6 4 24-2 48.5-10 45-12 12.5-5.5 2-13-2-36.5-3-23L213 11l-64 5.5-49 4.5-14 3.5Z" fill="url(#b)"/>
+ <path d="M195.462 93.1709c-1.298.4447-2.726.6375-4.02 1.1121-1.865.6857-3.946.6082-5.686 1.6711-.03.0197-.058.0464-.087.0506-2.241.1511-4.472.9891-6.723.1476-1.412-.5314-1.683-1.9152-2.119-3.1264-.579-1.5954-.821-3.3083-1.647-4.8297-.368-.6797-.097-1.461-.283-2.1819-.494-1.9163-.938-3.8461-1.417-5.7663-.082-.3343-.148-.6535-.07-.9961-1.351-1.6748-1.376-2.9231-.2-4.8221 1.158-1.8789 1.829-3.9835 2.639-6.0207.105-.2721.175-.5619.339-.8151.514-.7999.864-1.6487.733-2.6283-1.221.1141-2.043 1.0043-3.018 1.5715-1.424.8272-2.834 1.6658-4.308 2.4093-1.17.5886-2.258 1.3991-3.25 2.2652-1.049.9124-2.075 1.9115-2.855 3.0463-.869 1.2668-1.984 2.3245-2.807 3.6178-.518.8126-1.334 1.3646-1.891 2.1916-.861 1.2803-1.408 2.6351-1.768 4.1102-.148.605-.543 1.1371-.624 1.7747.688 1.4111.78 3.071.278 4.3326-.442 1.1135-1.818 1.9471-3.169 2.3827-1.186.3839-2.469.6422-3.431 1.4578-.503.4215-.898.783-1.587.7854-.881.0077-1.581-.2074-2.149-.9655-.342-.4543-.719-.9805-1.357-1.135-.782-.4331-1.468.0873-2.172.249-.875.2035-1.733.0347-2.582.0762-1.53.0693-3.083.071-4.591.5719-.824.2753-1.778.1434-2.649.315-1.341.2587-2.667.5986-3.988.9294-1.794.4457-3.584 1.0068-5.278 1.7359-1.458.6306-2.86 1.4092-4.256 2.1978-1.461.8212-2.591 2.0805-4.089 2.8075-.284.138-.411.331-.442.618.424.471.963.183 1.453.207 2.726.114 5.478.007 8.135.759.545.156.986-.121 1.537-.032 1.023.163 2.006.868 3.059.52.826-.271 1.519-.055 2.254.202.517.179 1.169.043 1.429-.248.709-.778.981.094 1.379.277.507.229.315.671.171 1.128-.319 1.007-.443 2.063-.822 3.063-.624 1.646-.986 3.37-1.277 5.106-.005.024-.007.044-.013.065l67.243-18.02c.057-1.2624.265-2.5071.74-3.7147-1.594.4969-3.185 1.0082-4.764 1.5476Zm-43.856 7.6401c-1.077.447-2.196.782-3.385.737-2.244-.022-3.012-.576-3.505-2.3568-.159-.5653-.009-.9853.35-1.2943.377-.3295.866-.2824 1.331-.0353.433.2287.801.5637 1.328.6355.848.1136 1.625.1686 2.443-.3062 1.316-.7552 1.988-.5017 2.597.7603.339.6993-.051 1.3998-1.159 1.8598Z" fill="#fff"/>
+ <path d="M152.764 98.9514c.339.6994-.051 1.4006-1.159 1.8596-1.077.448-2.195.782-3.385.737-2.244-.022-3.012-.576-3.505-2.3566-.159-.5653-.008-.9852.35-1.2943.377-.3295.866-.2824 1.331-.0353.433.2287.801.5637 1.328.6355.848.1137 1.625.1687 2.443-.3061 1.316-.7552 1.988-.5017 2.597.7602Z" fill="#F69322"/>
+ <path d="M202.439 78.2929c.18 2.2755.359 4.5783.627 6.8612.2 1.7589.17 3.5134-.057 5.3094-.175 1.3713-.387 2.7331-.6 4.0915l-2.923.7834c.057-1.2623.265-2.5071.74-3.7147-1.594.497-3.185 1.0082-4.764 1.5476-1.298.4448-2.726.6375-4.02 1.1122-1.865.6856-3.946.6082-5.686 1.671-.03.0197-.058.0464-.087.0506-2.241.1512-4.472.9891-6.723.1476-1.412-.5313-1.683-1.9152-2.119-3.1264-.579-1.5954-.821-3.3082-1.647-4.8297-.368-.6797-.097-1.461-.283-2.1819-.494-1.9162-.938-3.8461-1.417-5.7662-.082-.3344-.148-.6536-.07-.9961-1.351-1.6749-1.376-2.9232-.2-4.8222 1.158-1.8789 1.829-3.9834 2.639-6.0207.105-.2721.175-.5619.339-.8151.514-.7999.864-1.6487.733-2.6283-1.221.1141-2.043 1.0043-3.018 1.5716-1.424.8272-2.834 1.6657-4.308 2.4092-1.17.5887-2.258 1.3991-3.25 2.2653-1.049.9123-2.075 1.9114-2.855 3.0462-.869 1.2668-1.984 2.3246-2.807 3.6179-.518.8126-1.334 1.3645-1.891 2.1915-.861 1.2803-1.408 2.6351-1.768 4.1103-.148.605-.543 1.137-.624 1.7746.688 1.4111.78 3.071.278 4.3326-.442 1.1136-1.818 1.9471-3.169 2.3827-1.186.3839-2.469.6423-3.431 1.4579-.503.4214-.898.7829-1.587.7854-.881.0076-1.581-.2074-2.149-.9656-.342-.4543-.719-.9804-1.357-1.135-.782-.4331-1.468.0874-2.172.249-.875.2035-1.733.0347-2.582.0763-1.53.0692-3.083.0709-4.591.5718-.824.2753-1.778.1435-2.649.3151-1.341.2586-2.667.5985-3.988.9293-1.794.4457-3.584 1.0069-5.278 1.7359-1.458.6306-2.86 1.4092-4.256 2.1978-1.461.8213-2.591 2.0811-4.089 2.8071-.284.139-.411.331-.442.618.424.471.963.184 1.453.207 2.726.114 5.478.008 8.135.76.545.156.986-.121 1.537-.033 1.023.164 2.006.869 3.059.521.826-.272 1.519-.055 2.254.201.517.179 1.169.043 1.429-.247.709-.779.981.093 1.379.277.507.228.315.671.171 1.128-.319 1.007-.443 2.062-.822 3.062-.624 1.647-.986 3.371-1.277 5.106-.005.025-.007.045-.013.066l-1.431.383c-.214-.063-.375-.201-.402-.531-.024-.292-.059-.569.005-.877.355-1.71.656-3.436 1.014-5.147.129-.62-.077-.897-.68-.934-2.512-.14-5.021-.311-7.537-.408-1.46-.058-2.832-.554-4.269-.699-1.402-.144-2.869-.777-4.182-.328-2.117.726-3.917-.267-5.854-.546-.455-.064-.575-.295-.63-.613-.231-1.34-.517-2.681-.619-4.0324-.119-1.6295-.395-3.2518-.224-4.9087.203-1.9326.376-3.8729.537-5.802.115-1.3785.361-2.7265.498-4.0954.128-1.2852-.949-1.9529-1.492-2.8649-.544-.9154-1.11-1.8596-1.751-2.7027-1.328-1.7506-2.08-3.7605-3.032-5.6936-.866-1.7585-1.569-3.5723-2.3532-5.3566-1.0161-2.303-1.8258-4.6886-3.0286-6.9224-.7801-1.4368-1.0827-3.1295-1.1955-4.7645-.0596-.8437-.5725-1.3995-.7737-2.1356-.7552-2.7604 1.3821-4.7273 3.8956-4.7271 3.2444-.002 6.4694.3384 9.5844 1.3121 2.104.6559 4.141 1.5663 6.274 2.0947 1.704.4187 3.06 1.3911 4.543 2.171.956.5029 1.747.4343 2.72-.2137 1.308-.8695 2.797-1.4972 4.186-2.2565 1.374-.7517 2.888-1.0568 4.309-1.6234 1.252-.5019 2.689-.6587 4.052-.9348 2.002-.4049 3.8-1.3245 5.678-2.0484.386-.1499.395-.5665.359-.8745-.225-2.0814.604-4.0308.743-6.055.13-1.9013.43-3.7864.563-5.6888.096-1.3619.654-2.6461 1.296-3.8792.376-.7204.836-1.4324.801-2.341-.046-1.3159 1.188-3.1106 2.249-3.5768.887-.3886 1.575-.1472 2.153.5072.715.8038 1.4 1.6388 2.061 2.4879 1.508 1.9273 3.21 3.6825 4.813 5.5184.915 1.0445 1.954 1.986 2.54 3.3935.893 2.1619 2.001 4.2583 3.107 6.3167 1.066 1.9839 2.331 3.9024 3.541 5.8284.601.9581 1.054 2.0566 1.337 3.0962.538 1.9783 1.689 2.8779 3.609 3.1497 2.302.324 4.516 1.0707 6.773 1.5581 2.031.4395 3.671 1.4325 5.367 2.4538.655.3937.561 1.3598-.238 2.2789-.966 1.107-1.451 2.3447-1.477 3.8386-.011.6536-.397 1.3225-.686 1.9498-.932 2.043-1.905 4.062-2.847 6.0958-.375.813-.61 1.6817-.71 2.5682-.09.8064.175 1.4753.847 2.0191.574.4658 1.027 1.0725 1.559 1.5962.532.5273 1.082.5117 1.554-.0834.266-.3346.5-.7071.691-1.0914 1.325-2.729 2.708-5.4583 3.475-8.3902.548-2.0756 1.584-3.9333 2.201-5.9653.273-.9021.067-1.8186.335-2.6806.685-2.1857 1.345-4.3882 3.414-5.7596 1.424-.9433 3.649-.7185 4.929.3288.804.6597 1.586 1.2944 2.288 2.0785.625.6999.994 1.426 1.227 2.2967.178.6613.507 1.2818.749 1.9257.416 1.1044.957 2.1407.895 3.412-.04.8474.357 1.6782.693 2.5137 1.192 2.9761 1.892 6.0648 2.143 9.3127Z" fill="#F69322"/>
+ <path d="M177.325 59.9162c-2.298-.8289-4.729-1.0291-7.086-1.5864-1.687-.3964-3.45-.5009-5.184-.6714-.723-.0693-1.297-.3028-1.45-1.0172-.283-1.3182-1.041-2.2382-2.157-2.9191-.85.0925-1.432-.4757-2.06-.8807-1.056-.6738-2.278-.7992-3.43-1.1646-.379.3768-.764.7471-1.139 1.1227-.504.5066-1.055 1.0069-1.814.761-.83-.2654-1.387-.8832-1.556-1.775-.092-.502-.141-1.0156-.208-1.5246-.39.004-.776.0069-1.166.0107-.31 1.0278-1.191.9892-1.989 1.0054-.55.012-.624-.5222-.765-.9337-.767-2.2419-.956-4.5924-1.318-6.912-.367-2.3377-.103-4.705-.246-7.0599-.599 2.0426-1.049 4.0918-1.257 6.235-.212 2.214-.123 4.4827-.895 6.6455-.336.942-1.107 1.4196-1.816 1.5051-2.502.2871-4.817 1.3025-7.263 1.714-1.574.267-3.059.8238-4.649 1.0637-1.67.2541-3.289 1.0056-4.477 2.3813-.402.4678-.953.6812-1.551.7448-.282.0328-.425.1913-.637.341-2.105 1.4511-3.76 2.6459-6.384.8472-.489-.3375-1.063-.1954-1.6-.2643-1.627-.2031-3.249-.663-4.654-1.4832-.979-.5742-2.012-.3246-2.989-.6783-1.314-.4805-2.721-.7155-4.009-1.3153-1.08-.5044-2.271-.0924-3.453-.2248.844.4901 1.651 1.0718 2.54 1.4569 3.123 1.3476 6.05 3.0649 8.98 4.7659 1.763 1.0265 3.403 2.2484 4.907 3.654.531.4929 1.304.704 1.452 1.5743.111.6478.009 1.2058-.609 1.4722-.478.2095-1.026.275-1.521-.0687-.243-.1712-.498-.3274-.747-.4893-.206.9807-.415 1.9625-.621 2.9431.181.2539.383.49.54.7577.728 1.2263-.262 2.4018-1.988 2.4381-.408 2.3944-1.274 4.6675-1.958 6.9847-.089.3028-.094.5904-.135.8842 1.235 1.4854.907 3.2387.412 4.7615-.461 1.4133-.313 2.8182-.473 4.201-.308 2.6385-.033 5.3261-.08 7.9955-.023 1.1874-.037 2.407.159 3.6018.144.898.562 1.491 1.601 1.538.792.036 1.576.372 2.355-.042.032-.288.158-.48.443-.618 1.497-.727 2.628-1.9866 4.088-2.8079 1.396-.7886 2.799-1.5672 4.256-2.1978 1.695-.729 3.485-1.2902 5.278-1.7359 1.321-.3308 2.648-.6707 3.988-.9293.872-.1716 1.825-.0398 2.65-.3151 1.508-.5009 3.06-.5026 4.591-.5718.848-.0415 1.707.1272 2.582-.0763.704-.1616 1.389-.6821 2.171-.249-.084-.9068.385-1.6289.848-2.3144 1.465-2.1626 3.665-3.3057 5.959-4.3817 1.577-.736 3.052-.7092 4.608-.1619.081-.6375.477-1.1696.624-1.7746.36-1.4752.907-2.83 1.769-4.1103.557-.8269 1.373-1.3789 1.891-2.1915.823-1.2933 1.938-2.3511 2.806-3.6179.781-1.1348 1.806-2.1339 2.855-3.0462.992-.8662 2.08-1.6766 3.251-2.2653 1.473-.7435 2.883-1.582 4.307-2.4092.975-.5673 1.798-1.4575 3.018-1.5716l.004-.001c.071-.1237.138-.25.197-.378.058-.128.118-.2525.172-.3831.035-.0869.07-.1736.104-.2605.067-.1725.127-.3514.18-.5283.277-.8913.436-1.8132.663-2.7144.083-.3281-.46-.6201-.915-.7848Zm-40.101 21.1487c-.347 1.5375-1.32 2.0112-2.901 1.9507-2.862-.0614-3.78-1.9534-3.93-4.2484-.14-2.0811 2.857-3.097 4.666-2.211 1.204.5912 2.463 3.1934 2.165 4.5087Zm17.634-10.0392c.006 1.4391-1.17 2.947-2.496 3.2871-.971.2485-1.593-.4832-2.178-.9578-1.191-.9627-1.671-2.3947-1.779-3.8955-.077-1.0215.852-1.8356 1.907-1.886 1.816-.0877 3.986 1.333 4.427 2.8337.07.2329.102.4528.119.6185Z" fill="#F69322"/>
+ <path d="M199.896 81.4336c.002-.0007.005-.0001.008.0017l.003.0118-.011-.0135Z" fill="#383431"/>
+ <path d="M202.439 78.2929c.18 2.2755.359 4.5783.627 6.8612.2 1.7588.17 3.5134-.057 5.3094-.175 1.3713-.387 2.7331-.6 4.0915-.089.5622-.179 1.1245-.268 1.6869-.238 1.4967-.607 2.0291-1.732 1.9783-.485-.0209-.871-.2004-.901-.7036-.044-.7278-.057-1.4563-.022-2.1782.057-1.2623.265-2.5071.74-3.7147.079-.2536.202-.5034.23-.7588.316-3.0398-.282-6.0667-.166-9.103.01-.2815-.168-.323-.386-.3266-.019-.0567-.051-.1179-.052-.1797-.128-2.2853-.662-4.5084-.991-6.7633.446-.5029-.214-.8838-.143-1.3713.244-1.6765-.405-3.2454-.762-4.8227-.541-2.3801-1.321-4.7271-2.504-6.8732-.558-1.0124-.984-2.153-1.982-2.9156-.997-.759-1.745-.6592-2.701.081-1.353 1.0482-1.854 2.5338-2.191 4.0223-.585 2.5694-1.238 5.1067-2.342 7.49-.635 1.3709-1.02 2.7404-.97 4.2413-.117.2405-.296.4704-.341.7226-.329 1.7767-1.528 3.1707-2.122 4.8403-.482 1.353-1.914 2.1511-2.523 3.4916-.087.1938-.257.1813-.424.195-1.693.1284-3.103-.4811-4.142-1.7867-.719-.9035-1.224-1.9802-2.304-2.5545-1.351-1.6749-1.376-2.9232-.2-4.8222 1.158-1.8788 1.829-3.9834 2.639-6.0206.105-.2722.175-.562.339-.8152.514-.7999.864-1.6487.733-2.6283l-.001-.0035c.071-.1239.138-.2502.201-.3755.059-.128.118-.2526.172-.3832.035-.0868.07-.1735.105-.2604.066-.1725.127-.3514.18-.5283.276-.8913.436-1.8132.663-2.7144.082-.3281-.461-.6201-.916-.7848-2.297-.8289-4.729-1.0292-7.086-1.5864-1.686-.3964-3.449-.5009-5.183-.6714-.724-.0693-1.298-.3028-1.45-1.0172-.284-1.3182-1.042-2.2382-2.157-2.9191-.02-.231.058-.5771-.071-.6819-1.138-.9655-1.163-2.4922-1.861-3.6919-1.055-1.816-1.85-3.7988-2.817-5.6854-.754-1.471-1.695-2.8297-2.552-4.2345-.843-1.3849-2.011-2.563-2.879-3.9649-.619-.9959-1.51-1.822-2.486-2.9623-.012 2.8303-.081 5.3349-.011 7.8336.06 2.2068.25 4.4021.719 6.5847.231 1.0959.693 2.1842.584 3.3521-.309 1.0278-1.191.9892-1.988 1.0054-.551.012-.624-.5222-.765-.9337-.768-2.2419-.956-4.5924-1.318-6.912-.367-2.3377-.103-4.705-.246-7.0599-.599 2.0426-1.049 4.0918-1.257 6.235-.213 2.2139-.123 4.4827-.895 6.6455-.337.942-1.107 1.4196-1.816 1.5051-2.503.2871-4.817 1.3025-7.263 1.7139-1.575.2671-3.06.8239-4.649 1.0638-1.671.2541-3.29 1.0056-4.478 2.3813-.401.4678-.952.6812-1.551.7448-.281.0327-.425.1913-.636.341-2.106 1.4511-3.761 2.6459-6.384.8472-.49-.3375-1.063-.1954-1.601-.2643-1.627-.2031-3.249-.663-4.653-1.4832-.979-.5743-2.012-.3246-2.99-.6783-1.314-.4805-2.721-.7155-4.008-1.3153-1.08-.5044-2.271-.0924-3.453-.2248.844.4901 1.65 1.0718 2.54 1.4569 3.122 1.3476 6.049 3.0649 8.98 4.7659 1.762 1.0265 3.402 2.2484 4.906 3.654.531.4929 1.304.704 1.452 1.5743.112.6478.009 1.2058-.608 1.4722-.479.2095-1.027.275-1.521-.0688-.244-.1711-.499-.3273-.747-.4892-1.536-1.3932-3.289-2.5034-5.05-3.5381-3.042-1.7835-6.318-3.1556-9.307-5.0461-.18-.1104-.36-.3334-.637-.2552-.1974.1612-.1507.4509-.066.5519.881 1.0186.85 2.3904 1.32 3.5657.625 1.5674 1.086 3.2446 1.664 4.8365.514 1.4115 1.016 2.8801 2.003 4.1801.734.9614 1.211 2.2508 1.749 3.4196.945 2.0357 2.332 3.8018 3.386 5.7694.142.268.34.6175.776.524 1.234 1.4854.906 3.2387.412 4.7614-.462 1.4134-.314 2.8183-.474 4.2011-.307 2.6385-.032 5.3261-.08 7.9955-.023 1.1874-.037 2.407.16 3.602.144.898.562 1.491 1.601 1.538.792.036 1.575.372 2.355-.043.424.471.963.184 1.453.207 2.726.114 5.478.008 8.135.76.545.156.986-.121 1.537-.033 1.023.164 2.006.869 3.059.521.826-.272 1.519-.055 2.254.201.517.179 1.169.043 1.429-.247.709-.779.981.093 1.379.277.507.228.315.671.171 1.128-.319 1.007-.443 2.062-.822 3.062-.624 1.647-.986 3.371-1.277 5.106-.005.025-.007.045-.013.066-.12.504-.558.432-.938.429-.171-.001-.342-.005-.493-.046-.214-.063-.375-.201-.402-.531-.024-.292-.059-.569.005-.877.355-1.71.656-3.436 1.014-5.147.129-.62-.077-.897-.68-.934-2.512-.14-5.021-.311-7.537-.408-1.46-.058-2.832-.554-4.269-.699-1.402-.143-2.869-.777-4.182-.328-2.117.726-3.917-.267-5.854-.546-.455-.064-.575-.295-.63-.613-.231-1.34-.517-2.681-.619-4.0324-.119-1.6295-.395-3.2518-.224-4.9087.203-1.9326.376-3.8729.537-5.802.115-1.3785.361-2.7265.498-4.0954.128-1.2852-.949-1.9529-1.492-2.8649-.544-.9154-1.11-1.8596-1.751-2.7027-1.328-1.7506-2.08-3.7605-3.032-5.6936-.866-1.7585-1.569-3.5723-2.3532-5.3566-1.0161-2.303-1.8258-4.6886-3.0286-6.9224-.7801-1.4369-1.0827-3.1295-1.1955-4.7645-.0596-.8437-.5725-1.3995-.7737-2.1356-.7552-2.7604 1.3821-4.7273 3.8956-4.7271 3.2444-.002 6.4694.3384 9.5844 1.3121 2.104.6559 4.141 1.5663 6.274 2.0947 1.704.4187 3.06 1.3911 4.543 2.171.956.5029 1.747.4343 2.72-.2137 1.308-.8695 2.797-1.4972 4.186-2.2565 1.374-.7517 2.888-1.0568 4.309-1.6234 1.252-.5019 2.689-.6587 4.052-.9348 2.002-.4049 3.8-1.3245 5.678-2.0484.386-.1499.395-.5665.359-.8745-.225-2.0814.604-4.0308.743-6.055.13-1.9013.43-3.7864.563-5.6888.096-1.3619.654-2.6461 1.296-3.8792.376-.7204.836-1.4324.801-2.341-.046-1.3159 1.188-3.1106 2.249-3.5768.887-.3886 1.575-.1472 2.153.5072.715.8038 1.4 1.6388 2.061 2.4879 1.508 1.9273 3.21 3.6825 4.813 5.5184.915 1.0445 1.954 1.986 2.54 3.3935.893 2.1619 2.001 4.2583 3.107 6.3167 1.066 1.9839 2.331 3.9024 3.541 5.8284.601.9581 1.054 2.0566 1.337 3.0962.538 1.9783 1.689 2.8779 3.609 3.1497 2.302.324 4.516 1.0707 6.773 1.5581 2.031.4395 3.671 1.4325 5.367 2.4538.655.3937.561 1.3598-.238 2.2789-.966 1.107-1.451 2.3447-1.477 3.8386-.011.6536-.397 1.3225-.686 1.9498-.932 2.043-1.905 4.062-2.847 6.0958-.375.813-.61 1.6817-.71 2.5682-.09.8064.175 1.4753.847 2.0191.574.4659 1.027 1.0725 1.559 1.5962.532.5273 1.082.5117 1.554-.0834.266-.3346.5-.7071.691-1.0914 1.325-2.729 2.708-5.4583 3.476-8.3902.547-2.0756 1.583-3.9333 2.2-5.9653.273-.9021.067-1.8186.335-2.6806.685-2.1857 1.345-4.3882 3.414-5.7596 1.424-.9433 3.649-.7185 4.929.3288.804.6597 1.586 1.2944 2.288 2.0785.625.6998.994 1.426 1.227 2.2967.178.6613.507 1.2819.749 1.9257.416 1.1044.957 2.1407.895 3.412-.04.8474.357 1.6782.693 2.5137 1.192 2.9761 1.892 6.0648 2.143 9.3127Z" fill="#000"/>
+ <path d="M200.29 81.7618c-.116 3.0362.482 6.0632.166 9.103-.028.2553-.151.5051-.23.7587-1.595.497-3.185 1.0083-4.764 1.5477-1.298.4447-2.726.6375-4.02 1.1121-1.865.6857-3.946.6082-5.686 1.6711-.03.0196-.058.0463-.088.0505-2.24.1512-4.471.9891-6.722.1476-1.412-.5313-1.683-1.9152-2.12-3.1263-.578-1.5955-.82-3.3083-1.646-4.8297-.368-.6797-.097-1.4611-.283-2.182-.494-1.9162-.938-3.8461-1.417-5.7662-.082-.3343-.148-.6536-.07-.9961 1.08.5743 1.585 1.651 2.304 2.5545 1.039 1.3056 2.449 1.9151 4.142 1.7867.167-.0137.337-.0012.424-.195.609-1.3405 2.041-2.1386 2.523-3.4915.594-1.6696 1.793-3.0637 2.122-4.8404.045-.2522.224-.4821.341-.7226.739.3014 1.427.6555 2.023 1.2199.659.6213 1.434 1.1608 2.351 1.287 1.384.1908 2.783-.0062 4.158-.1654 1.014-.117 2.068-.6084 2.762-1.2824.72-.6963 1.442-.8473 2.301-.9109.329 2.2549.863 4.478.991 6.7633.001.0618.033.123.052.1797.218.0037.396.0451.386.3267Z" fill="#F69322"/>
+ <path d="M156.677 90.2854c-.441 1.1135-1.817 1.9471-3.168 2.3827-1.187.3838-2.469.6422-3.432 1.4578-.503.4215-.898.783-1.586.7854-.881.0077-1.582-.2074-2.149-.9655-.342-.4544-.72-.9805-1.357-1.135-.085-.9069.384-1.6289.847-2.3144 1.465-2.1627 3.665-3.3058 5.959-4.3818 1.577-.736 3.052-.7092 4.608-.1618.688 1.411.781 3.071.278 4.3326ZM151.606 100.811c-1.077.448-2.195.782-3.385.737-2.244-.022-3.012-.576-3.505-2.3566-.159-.5653-.008-.9852.35-1.2943.377-.3295.866-.2824 1.331-.0353.433.2287.801.5637 1.328.6355.848.1137 1.625.1687 2.443-.3061 1.316-.7552 1.988-.5017 2.597.7602.339.6994-.051 1.4006-1.159 1.8596Z" fill="#000"/>
+ <path d="M110.964 80.2559c-.436.092-.634-.2556-.777-.523-1.052-1.9678-2.44-3.735-3.383-5.772-.54-1.1657-1.019-2.4582-1.749-3.418-.989-1.2993-1.489-2.7675-2.003-4.1813-.579-1.5912-1.041-3.2688-1.666-4.8367-.47-1.1751-.437-2.5454-1.319-3.5664-.0847-.0984-.1304-.3878.066-.5503.276-.0792.457.1435.635.2561 2.993 1.8903 6.267 3.2625 9.308 5.0467 1.762 1.0336 3.516 2.1449 5.05 3.5372-.207.9812-.414 1.9625-.621 2.9434-.137.108-.262.0482-.352-.0559-1.153-1.321-2.39-2.5536-3.727-3.6898-.417-.3545-.913-.4176-1.339-.2653-.464.1657-.745.541-.724 1.1735.038 1.1138.718 1.8308 1.479 2.3622.762.5313.499.8218-.002 1.1826-.624.4499-.315 1.1174-.459 1.6768.626.0087.529 1.1676 1.493.8299.65-.2278 1.45-.0287 2.183-.0206-.409 2.3969-1.274 4.6675-1.957 6.9878-.089.3013-.095.5887-.136.8831ZM150.075 50.2704c.111-1.1669-.351-2.2553-.586-3.3516-.466-2.1828-.656-4.3781-.718-6.5854-.07-2.4985 0-5.0009.011-7.833.977 1.143 1.868 1.9677 2.486 2.9622.87 1.4012 2.037 2.5827 2.881 3.9661.856 1.404 1.798 2.7651 2.552 4.2354.965 1.8845 1.761 3.8689 2.815 5.6848.698 1.2013.725 2.7259 1.864 3.6907.126.1064.051.4498.069.6832-.85.093-1.431-.4771-2.061-.8798-1.055-.6748-2.279-.8009-3.43-1.165.177-.311.366-.6162.53-.9341.405-.7855-.034-1.7339-.861-1.8601-.513-.0783-.984.0838-1.438.3079-.064-.4428-.144-.87-.184-1.3009-.042-.4563-.042-.9163-.068-1.3741-.057-.9774-.657-1.7247-1.406-1.7592-.642-.0296-1.31.7782-1.464 1.6063-.246 1.3211.174 2.5964.175 3.8969-.389.0032-.778.0065-1.167.0097Z" fill="#fff"/>
+ <path d="M134.322 83.0147c-2.861-.0621-3.778-1.9535-3.93-4.247-.139-2.0796 2.857-3.0984 4.666-2.2119 1.208.5915 2.467 3.195 2.168 4.5091-.35 1.5365-1.319 2.0118-2.904 1.9498ZM154.856 71.0253c.006 1.4386-1.168 2.9465-2.494 3.286-.972.2489-1.591-.4814-2.177-.9555-1.191-.9648-1.671-2.3952-1.781-3.8962-.074-1.0238.853-1.8374 1.906-1.8875 1.819-.0865 3.99 1.3345 4.43 2.8347.068.2328.099.4531.116.6185ZM151.241 50.2605c-.001-1.3004-.421-2.5758-.175-3.8969.155-.828.822-1.6359 1.465-1.6062.748.0345 1.348.7818 1.405 1.7591.027.4579.027.9179.069 1.3741.04.4309.12.8582.184 1.3009.453-.224.925-.3861 1.438-.3078.827.1261 1.266 1.0745.861 1.8601-.164.3179-.353.6231-.53.9341-.38.3741-.764.7449-1.14 1.1232-.502.5057-1.056 1.0041-1.812.7606-.831-.2677-1.389-.8845-1.555-1.7756-.094-.5041-.141-1.0168-.21-1.5256ZM113.056 72.3855c-.733-.0081-1.533-.2072-2.183.0205-.964.3378-.866-.8211-1.493-.8298.145-.5594-.165-1.2269.459-1.6768.501-.3608.764-.6513.003-1.1826-.762-.5314-1.442-1.2484-1.479-2.3623-.021-.6324.259-1.0077.723-1.1734.426-.1524.922-.0892 1.339.2653 1.337 1.1362 2.574 2.3688 3.727 3.6898.091.1041.215.1639.352.0559.181.2518.383.4911.54.7569.726 1.2255-.263 2.402-1.988 2.4365Z" fill="#000"/>
+ <path d="M195.452 61.4251c-.558-1.0123-.984-2.1529-1.982-2.9156-.997-.759-1.745-.6592-2.701.081-1.353 1.0482-1.854 2.5338-2.191 4.0223-.585 2.5694-1.237 5.1067-2.341 7.49-.636 1.371-1.02 2.7404-.971 4.2413.74.3014 1.427.6555 2.024 1.2199.658.6214 1.434 1.1608 2.351 1.287 1.383.1908 2.782-.0061 4.157-.1654 1.015-.117 2.068-.6084 2.762-1.2824.72-.6963 1.443-.8473 2.301-.9109.446-.5029-.214-.8837-.143-1.3713.244-1.6765-.405-3.2453-.762-4.8227-.541-2.38-1.321-4.7271-2.504-6.8732Zm-6.62 4.4464c.009-1.1527.423-1.5425 1.651-1.5151.625.2081.867.0425.533-.6814-.08-.1684-.022-.4006-.033-.6029-.025-.5548-.004-1.1413.547-1.413.438-.2142.842.1537 1.188.4019.488.3494.636.8868.564 1.4561-.106.8456-.527 1.3417-1.473 1.1772-.663-.1169-.893.3824-.514.7145.635.562.178 1.0523-.024 1.3697-.339.5285-1.053.4488-1.577.287-.493-.1505-.866-.5887-.862-1.194Zm7.586 4.8953c.038.7063-.536.8177-1.114.8874-.636.0813-1.266.2308-1.9.3505l-.011.0029c-.013.0111-.023.0175-.035.0286-.049.0362-.101.0734-.145.1087-.004-.0416-.006-.0798-.005-.1188-.001-.0036.003-.0045.002-.0082l-.001-.0037c-1.141-.0079-2.184-.4023-3.234-.7949-.637-.236-.789-.776-.674-1.2869.103-.4656.387-.8977 1.006-1.0442 1.118-.2648 2.221-.15 3.248.1984.609.2084 1.19.0335 1.793.2167.826.2509 1.033.8038 1.07 1.4635Zm-.503-5.2597c.002 1.0489-.32 1.4371-1.249 1.423-.805.0608-1.346-.3094-1.226-1.2207.091-.6866.048-1.5697 1.078-1.6561.69-.057 1.392.7152 1.397 1.4538Z" fill="#fff"/>
+ <path d="M199.897 81.4334c-.021.0168-.042.0337-.063.0505.025-.0123.05-.0246.075-.0365 0 .0004-.012-.014-.012-.014Z" fill="#383431"/>
+ <path d="M193.208 72.0144c-1.14-.0089-2.184-.4004-3.232-.7934-.639-.2392-.791-.7791-.676-1.2899.103-.4633.386-.8978 1.006-1.0443 1.12-.2647 2.224-.1482 3.249.2003.611.2075 1.19.033 1.794.2161.824.2502 1.031.8037 1.068 1.4629.039.7071-.535.8164-1.113.8893-.642.0811-1.275.233-1.912.354l.016.0292c-.005-.0479-.01-.0957-.015-.1435-.066.0431-.133.0862-.199.1293l.014-.01ZM190.484 64.3566c.623.2085.865.0419.532-.6802-.079-.1699-.022-.401-.032-.6038-.026-.5538-.004-1.1406.544-1.4115.441-.2175.844.1511 1.191.3995.486.3481.636.8872.564 1.4564-.107.8461-.526 1.3428-1.473 1.1773-.663-.116-.894.3809-.515.7145.635.56.179 1.0514-.024 1.3696-.338.5294-1.054.4475-1.577.287-.494-.1518-.867-.5903-.862-1.1939.009-1.1514.422-1.5427 1.652-1.5149ZM194.665 66.9316c-.803.0584-1.343-.3106-1.223-1.2227.089-.6849.047-1.5715 1.077-1.6567.688-.0569 1.392.7141 1.395 1.4535.003 1.0518-.317 1.4394-1.249 1.4259Z" fill="#000"/>
+ <path d="M193.392 72.0093c-.06.045-.121.09-.181.135-.001-.0431-.003-.0863-.004-.1297.001-.0002-.013.0098-.013.0098.071.0047.143.0095.214.0142l-.016-.0293Z" fill="#383431"/>
+ <path d="M193.409 72.0387c-.072-.0048-.143-.0095-.215-.0143.067-.0433.133-.0866.2-.1299.005.048.01.0961.015.1442Z" fill="#fff"/>
+ <path d="M290.558 44.9806c-.958.1884-1.914.3913-2.875.5612-.974.1721-1.961.2758-2.929.4736-1.522.3111-3.033.6818-4.551 1.0161-1.229.2706-2.477.4672-3.688.8007-1.552.4277-3.064 1.0041-4.616 1.4323-1.192.3287-2.431.4869-3.63.7925-2.324.5923-4.634 1.2401-6.953 1.855-1.624.4309-3.248.8688-4.882 1.2605-1.5.3596-3.009.6921-4.525.979-1.176.2225-2.399-.6111-2.35-1.627.039-.7941.692-1.2928 1.369-1.5026 1.558-.4821 3.243-.6375 4.715-1.2877 2.069-.9134 4.307-1.1507 6.405-1.9604 1.914-.7385 4.058-.8592 6.07-1.3741 2.918-.747 5.802-1.6239 8.712-2.4021.96-.2566 1.964-.344 2.934-.5698 2.077-.4837 4.138-1.0388 6.219-1.5014 1.108-.2462 2.254-.3206 3.368-.5433 1.842-.3681 3.676-.7747 5.504-1.2057.572-.1348 1.098-.4761 1.671-.5864.652-.1253.985.1944.995.922.033 2.2631-.564 2.9579-2.999 3.4942-1.144.2519-2.266.6055-3.399.908-.182.0487-.372.0706-.558.1049-.002-.0131-.005-.0263-.007-.0395ZM21.6416 103.126c1.2027-.27 2.4018-.558 3.6093-.806 1.1539-.236 2.3118-.463 3.4767-.634 1.3661-.202 2.7597-.222 4.032-.89.3099-.163.7497-.081 1.1298-.111.2992-.024.6104-.003.8956-.079 1.0186-.272 2.0205-.6075 3.0432-.8615 2.1172-.5258 4.2418-1.0223 6.367-1.515.9115-.2113 1.8362-.3657 2.7474-.5782.786-.1833 1.3557.1975 1.6942.7832.3724.6445-.0204 2.1015-.5977 2.3685-.981.454-1.9807.916-3.0224 1.179-1.5931.403-3.237.601-4.8441.955-2.2334.492-4.4452 1.083-6.6813 1.561-1.1257.241-2.2955.273-3.4262.496-2.1099.415-4.2008.926-6.309 1.35-1.9933.401-4.0073.702-5.9962 1.122-1.7038.36-3.3748.875-5.0792 1.231-1.5967.333-3.22721.504-4.82652.827-1.48255.299-2.93352.756-4.41813 1.042-.78085.15-1.62961.213-2.3978.062-.42241-.083-.9735104-.656-1.03471026-1.071-.05052644-.342.45004726-.957.85046926-1.143 2.100941-.975 4.279561-1.721 6.579681-2.142 2.84191-.52 5.66851-1.135 8.48211-1.792 1.766-.413 3.4952-.981 5.2437-1.469.144-.04.3091-.005.4644-.005l.0177.12ZM53.1678 124.427c1.0383.08 1.9326 1.009 1.5897 1.899-.3025.784-.799 1.584-1.4239 2.137-1.4683 1.299-3.1162 2.395-4.598 3.681-2.7855 2.416-5.5274 4.884-8.2438 7.377-1.6999 1.56-3.2968 3.232-4.9835 4.807-1.3706 1.279-2.8102 2.485-4.2119 3.732-2.5456 2.265-5.0834 4.538-7.6292 6.803-1.0134.901-2.0214 1.81-3.0662 2.674-.6623.548-1.3075 1.089-2.3359.898-.7068-.131-.8699-.444-.7649-1.021.1716-.942.5545-1.733 1.345-2.391 1.0311-.858 1.9071-1.899 2.877-2.833 1.0344-.996 2.0902-1.971 3.1547-2.935 2.3629-2.141 4.7258-4.283 7.1132-6.397.7663-.678 1.6499-1.226 2.4039-1.916.5922-.543 1.0327-1.246 1.6042-1.815.6185-.615 1.3242-1.142 1.9685-1.732 2.0325-1.864 4.0481-3.746 6.0819-5.608 1.2801-1.172 2.5642-2.34 3.8775-3.475 1.2006-1.037 2.4239-2.051 3.6766-3.025.4639-.36 1.0401-.578 1.5651-.86ZM247.792 31.6815c.058-1.0706.831-1.7639 1.506-2.4391.99-.9896 2.104-1.856 3.17-2.7691 1.382-1.1842 2.778-2.3534 4.153-3.546 2.034-1.7648 4.04-3.5632 6.09-5.3105 1.147-.9781 2.375-1.862 3.535-2.8251 1.147-.9514 2.259-1.9451 3.379-2.9279.701-.6154 1.367-1.2728 2.089-1.8628 2.042-1.66876 4.086-3.33646 6.172-4.9503.564-.43694 1.264-.71584 1.929-1.00418.698-.30253 1.829.12231 2.155.74798.348.66698.051 1.67089-.56 2.15317-1.709 1.34878-3.396 2.72606-5.092 4.09083-.379.3046-.772.5916-1.141.9079-1.522 1.3064-3.031 2.6269-4.556 3.9306-1.216 1.0399-2.447 2.0624-3.67 3.0933-1.965 1.6553-3.939 3.3009-5.892 4.9697-1.94 1.657-3.82 3.3867-5.803 4.9901-1.272 1.0286-2.69 1.8767-4.027 2.8266-.427.303-.777.7154-1.212 1.0044-1.13.7513-2.102.268-2.225-1.0796ZM54.1316 73.4234c-.0704.8109-1.0111 1.6943-1.7702 1.6464-.8113-.0512-1.6286-.0609-2.4323-.1695-2.3586-.3185-4.7087-.7008-7.0686-1.0093-1.0723-.1402-2.1608-.1537-3.2402-.2456-1.4979-.1276-2.9956-.4043-4.4905-.3854-2.6717.0338-5.2388-.9413-7.9476-.6422-1.0362.1145-2.1285-.3697-3.2051-.5006-1.4013-.1705-2.8144-.2428-4.2187-.3921-.9314-.0991-1.8535-.2846-2.7848-.3853-1.2266-.1327-2.4736-.1374-3.6815-.3601-.6548-.1208-1.3538-.4665-1.8364-.9188-.4719-.4424-.7535-1.265-.1902-1.7885.4795-.4456 1.2459-.8564 1.8666-.8308 2.2688.0932 4.5302.3703 6.7935.5877 2.2734.2184 4.5488.4205 6.8175.6801 2.6175.2994 5.2241.6983 7.8442.9699 1.99.2062 3.999.2286 5.9898.4288 1.9444.1955 3.873.5424 5.8153.7633.9079.1033 1.8442-.0176 2.7457.113 1.3239.1918 2.6473.4506 3.9335.8131.7246.2042 1.1713.7959 1.06 1.6259ZM106.292 137.204c-.58-.091-1.21-.39-1.485-.194-.633.451-1.114.012-1.519-.163-.426-.185-.99-.82-.931-1.163.083-.487.602-1.038 1.079-1.282.504-.258 1.184-.153 1.774-.27.702-.138 1.399-.319 2.084-.526 1.4-.423 2.783-.901 4.187-1.31 1.603-.467 3.224-.871 4.83-1.329 1.207-.343 2.397-.743 3.606-1.075.16-.044.392.169.516.228 1.345-1.251 3.188-.935 4.725-1.579.066.226.133.451.227.771.136-.147.198-.201.246-.267.176-.24.302-.632.529-.701 1.488-.453 2.994-.847 4.499-1.241 2.111-.552 4.221-1.107 6.341-1.623 1.839-.447 3.695-.819 5.534-1.264 1.416-.342 2.812-.761 4.224-1.118 2.022-.511 4.046-1.013 6.077-1.488 1.111-.26 2.242-.433 3.353-.691.663-.155 1.296-.434 1.958-.597 2.201-.545 4.403-1.087 6.616-1.582 1.426-.319 2.871-.555 4.308-.822.844-.157 1.694-.282 2.53-.472.161-.036.269-.305.416-.485.121.189.203.318.176.277.548-.138.981-.258 1.419-.354.706-.155 1.419-.274 2.121-.442 1.551-.372 3.087-.806 4.645-1.137 1.837-.391 3.694-.685 5.537-1.049 1.455-.288 2.899-.632 4.353-.927 1.299-.263 2.602-.512 3.909-.73 1.178-.197 2.451-.125 3.528-.556 2.126-.853 4.451-.67 6.569-1.481.449-.171 1.021-.025 1.765-.025.76-.214 1.779-.559 2.825-.78 1.058-.224 2.143-.326 3.176-.502.718-.11 1.442-.191 2.152-.336 1.9-.389 3.795-.807 5.692-1.21.362-.077.728-.142 1.093-.209 1.713-.311 3.417-.71 5.144-.912 2.864-.334 5.755-.7 8.386 1.037.804.531 1.799.817 2.51 1.439 1.267 1.108 2.705 1.94 4.062 2.903 2.115 1.501 4.171 3.095 6.16 4.758.662.552 1.069 1.422 1.536 2.181.116.188.053.519.003.77-.477 2.378-2.195 3.512-4.309 4.259-.704.25-1.381.577-2.077.852-1.227.486-2.411.965-3.799 1.08-1.324.11-2.597.842-3.894 1.297-.408.143-.814.299-1.232.406-1.286.329-2.575.647-3.867.951-1.143.268-2.308.459-3.435.782-.978.279-1.903.738-2.876 1.039-1.358.419-2.756.715-4.106 1.157-1.624.531-3.21 1.176-4.825 1.738-1.022.356-2.066.651-3.102.968-.168.052-.354.052-.516.117-1.523.607-2.995 1.424-4.574 1.79-2.63.61-5.008 1.869-7.578 2.627-2.336.688-4.573 1.704-6.854 2.575-1.754.67-3.49 1.395-5.269 1.992-1.371.46-2.861.609-4.18 1.172-1.359.58-2.67 1.157-4.147 1.442-1.084.209-2.075.876-3.12 1.309-.931.386-1.882.721-2.818 1.096-1.719.691-3.43 1.406-5.152 2.091-1.962.78-3.936 1.528-5.897 2.31-1.552.619-3.08 1.302-4.641 1.898-2.387.91-4.803 1.742-7.186 2.661-1.538.593-3.011 1.356-4.561 1.91-1.564.558-3.304.729-4.746 1.487-1.174.616-2.4.897-3.604 1.31-1.03.354-2.114.552-3.176.811-.667.162-1.367.235-2 .48-1.208.47-2.359.012-3.522-.117-1.566-.173-2.862-.864-3.96-2.06-1.003-1.092-2.222-1.984-3.314-2.999-.378-.352-.637-.828-.991-1.209-.273-.295-.615-.524-.916-.793-.606-.542-1.198-1.1-1.809-1.636-.81-.71-1.684-1.354-2.438-2.118-.847-.859-1.585-1.826-2.382-2.735-.961-1.098-1.977-2.153-2.889-3.29-.586-.728-1.04-1.563-1.529-2.365-.319-.523-.566-1.09-.894-1.608-.999-1.581-1.429-3.2-.3-5.149Zm52.059-13.129c-1.36.355-2.818.768-4.293 1.114-1.982.464-3.981.857-5.964 1.318-1.815.423-3.62.889-5.425 1.351-1.344.343-2.68.716-4.023 1.065-1.731.448-3.459.912-5.2 1.319-1.639.383-3.295.688-4.939 1.049-.718.158-1.43.349-2.136.558-1.873.554-3.736 1.145-5.614 1.683-1.593.456-3.238.757-4.789 1.32-1.049.381-1.951.843-2.614-.189-.279.377-.501.991-.834 1.058-.676.137-1.223.238-1.495.968-.104.281-.375.519-.614.729-1.181 1.036-1.353 1.992-.515 3.372.727 1.2 1.417 2.437 2.283 3.534 1.299 1.646 2.716 3.203 4.123 4.762 1.012 1.122 2.061 2.213 3.145 3.265.923.897 1.961 1.678 2.873 2.585.956.951 1.747 2.075 2.749 2.968 1.093.974 2.239 2.009 3.888 1.894 1.166-.082 2.396-.017 3.472-.385 1.061-.363 2.064-.852 3.209-.938.392-.03.789-.138 1.159-.275.839-.311 1.648-.704 2.495-.987 1.211-.404 2.458-.703 3.662-1.123.543-.189.995-.631 1.535-.835.853-.324 1.752-.527 2.621-.814 1.053-.346 2.106-.698 3.139-1.1.793-.309 1.544-.722 2.332-1.046.897-.369 1.82-.674 2.72-1.038.998-.403 1.972-.869 2.976-1.255.776-.298 1.602-.47 2.373-.778 1.944-.777 3.868-1.608 5.806-2.402 2.205-.904 4.414-1.8 6.628-2.685 2.066-.826 4.135-1.648 6.214-2.441 1.222-.467 2.441-1.081 3.71-1.236.879-.108 1.407-.69 2.163-.892.717-.191 1.406-.485 2.115-.711 1.031-.328 2.077-.609 3.1-.959.987-.337 1.953-.735 2.928-1.108 1.266-.485 2.527-.987 3.8-1.456 1.813-.668 3.635-1.312 5.453-1.967.637-.23 1.268-.482 1.912-.692 1.66-.541 3.334-1.04 4.988-1.599 2.199-.744 4.38-1.544 6.579-2.289.742-.251 1.536-.355 2.271-.621 1.03-.372 2-.923 3.045-1.235 1.626-.487 3.299-.819 4.942-1.255.815-.216 1.596-.56 2.412-.772 2.668-.696 5.346-1.355 8.018-2.037.456-.116.9-.277 1.35-.417 1.26-.392 2.554-.702 3.769-1.201 1.088-.447 2.387-.577 3.144-1.64-.795-.779-1.486-1.561-2.283-2.214-1.231-1.008-2.534-1.929-3.808-2.883-.552-.413-1.093-.845-1.671-1.218-.921-.595-1.926-1.074-2.794-1.735-1.257-.958-2.511-1.794-4.198-1.582-2.12.267-4.249.47-6.36.792-1.325.202-2.618.608-3.938.855-1.231.23-2.539.196-3.705.592-1.906.649-3.949.605-5.829 1.343-.552.216-1.245.045-1.855.154-1.489.266-2.962.62-4.451.885-1.575.28-3.164.474-4.74.749-2.267.396-4.532.803-6.788 1.257-1.922.387-3.831.844-5.744 1.277-1.192.27-2.372.6-3.572.819-1.56.285-3.146.431-4.7.739-1.547.308-3.059.787-4.603 1.109-1.932.404-3.895.666-5.821 1.098-2.034.456-4.036 1.058-6.06 1.56-.75.185-1.525.268-2.259.393.714 1.229 1.287 2.306 1.945 3.329.999 1.554 1.859 1.878 3.273 1.437 1.137-.355 2.295-.644 3.447-.95.865-.231 1.735-.443 2.805-.714-.327-.403-.532-.628-.705-.874-.38-.542-.067-1.44.532-1.39.555.047 1.213-.055 1.561.745.19.435.862.92 1.322.925.888.009 1.787-.274 2.667-.494 2.722-.679 5.433-1.406 8.159-2.074 1.205-.296 1.499-1.22.714-2.254-.19-.249-.147-.674-.212-1.018.501-.015.975-.774 1.472-.159.464.574.919 1.214 1.146 1.901.225.677.572.588 1.036.46.305-.084.601-.2.908-.276 2.573-.635 5.148-1.265 7.712-1.894-.04-.212-.041-.283-.068-.344-.381-.864-.06-1.518.743-1.827.643-.248.886.272 1.188.81.244.433.637.998 1.488.612.812-.368 1.766-.429 2.658-.619 1.085-.232 2.172-.461 3.259-.686 1.337-.276 2.675-.544 4.012-.82.701-.145 1.396-.32 2.1-.446.848-.152 1.287-.533.878-1.405.389-.273.723-.507 1.067-.749.409.547.787 1.052 1.152 1.539 1.406-.276 2.781-.598 4.174-.803 1.018-.15 2.068-.254 3.084-.16.425.039 1.015.588 1.128 1.012.099.372-.242 1.092-.6 1.306-.691.413-1.52.613-2.312.833-1.108.308-2.233.553-3.431.845.463.844.81 1.692 1.348 2.395.575.751 1.244 1.499 2.03 2.001.794.507.049.888.042 1.291-.003.198-.542.516-.866.556-.879.107-1.801-.035-2.652.158-1.33.303-2.609.819-3.921 1.208-1.806.536-3.622 1.042-5.435 1.552-.803.226-1.775.256-2.139 1.137-.308.747-.793.709-1.261.429-.748-.448-1.458-.102-2.16-.017-.652.078-1.273.398-1.915.589-1.848.551-3.684 1.155-5.557 1.605-.929.223-1.564.446-1.177 1.514-.745.552-1.449.884-2.138.061-.379-.452-.831-.466-1.325-.3-.615.207-1.212.475-1.835.651-1.201.34-2.419.619-3.621.953-1.149.318-2.281.694-3.432 1.004-.672.181-1.367.282-2.056.42.086.335.085.41.12.459.562.764.383 1.58-.277 2.009-.589.383-1.403.445-1.999-.36-.568-.765-1.274-1.44-2.379-.862-.211.111-.401.3-.623.348-1.577.339-3.163.639-4.735.999-.112.025-.245.462-.184.649.224.692.687 1.345.745 2.038.045.531-.306 1.157-.642 1.626-.127.177-.874.192-1.05.007-.766-.804-1.563-1.636-2.075-2.602-.319-.603-.68-.598-1.101-.524-.551.096-1.065.386-1.613.509-1.245.278-2.515.455-3.743.788-.292.079-.708.675-.641.918.211.774.507 1.582.989 2.211.565.737.312 1.216-.259 1.615-.494.345-1.105.638-1.65.009-.449-.518-.913-1.027-1.313-1.582-.462-.642-.861-1.33-1.158-1.794-2.102.541-3.968 1.02-5.903 1.518.062.181.156.499.278.805.137.343.317.669.447 1.014.254.671-.151 1.938-.658 2.113-.855.297-2.275-.424-2.551-1.294-.3-.944-1.242-1.508-2.191-1.249-1.161.318-2.302.705-3.461 1.031-1.046.294-2.108.529-3.151.83-.219.063-.387.302-.538.427 1.073 1.896 2.866 3.349 2.784 5.731h-1.509l.512-.47c-.538-.233-1.19-.348-1.587-.728-.639-.61-1.106-1.398-1.652-2.106-.205-.267-.522-.487-.629-.785-.335-.936-.951-1.026-1.795-.768-1.132.347-2.267.709-3.426.937-1.658.327-3.339.538-4.91.783-.165-.496-.273-.821-.408-1.229 1.326-.323 2.731-.625 4.053-1.258 1.39-.666 2.884-1.118 4.229-1.625-.767-1.156-1.375-2.096-2.011-3.017-.249-.361-.591-.66-.832-1.025-.492-.744-.913-1.537-1.438-2.257-.122-.166-.573-.221-.82-.149-1.325.384-2.613.915-3.953 1.225-2.267.525-4.559.945-6.85 1.362-.974.177-1.792-.437-1.514-1.14.165-.419.761-.774 1.24-.943 1.195-.425 2.444-.694 3.652-1.087 1.213-.394 2.405-.852 3.598-1.303.81-.306 1.606-.649 2.519-1.021-.91-1.326-1.748-2.546-2.619-3.815.44-.212.706-.339 1.126-.542.908 1.035 1.832 2.088 2.754 3.142.406.463.694.893 1.512.47 1.02-.528 2.173-.826 3.295-1.126 1.997-.533 4.014-.993 6.015-1.483-.245-1.319-1.19-2.492-.274-3.786 1.753.175 2.322 1.654 3.207 2.981 2.563-.607 5.202-1.233 7.95-1.884-1.217-1.554-1.37-2.495-.471-3.299.537.635 1.225 1.193 1.552 1.913.299.658.63.95 1.279.841.822-.137 1.631-.351 2.445-.535.901-.203 1.8-.414 2.702-.613.762-.167 1.527-.321 2.166-.455-.822-1.851-1.544-3.474-2.275-5.121Zm-13.068 18.962c-1.061-1.922-2.043-3.733-3.071-5.517-.107-.187-.508-.353-.726-.307-1.672.353-3.341.727-4.993 1.163-1.464.387-2.905.861-4.347 1.294.113.177.358.544.584.922.325.544.508 1.281.981 1.608 1.15.798 1.837 1.888 2.513 3.047.229.394.613.724 1.31.419 1.45-.635 2.976-1.103 4.48-1.61 1.083-.365 2.182-.682 3.269-1.019Zm30.273-13.82c.888 1.458 1.637 2.771 2.488 4.016.161.236.758.351 1.09.269 1.59-.392 3.156-.88 4.735-1.318 1.66-.46 3.33-.883 4.982-1.366.408-.119.795-.374 1.128-.644.12-.098.138-.581.062-.621-1.134-.587-1.295-1.856-1.993-2.737-.161-.203-.497-.451-.697-.41-1.094.224-2.166.549-3.253.808-2.831.673-5.666 1.33-8.542 2.003Zm39.794-9.328c-4.362.915-8.658 1.816-12.953 2.717l-.12.35c.846.948 1.668 1.92 2.56 2.824.184.186.649.218.946.151 1.114-.251 2.213-.569 3.316-.869 2.69-.733 5.379-1.469 8.03-2.194-.571-.956-1.177-1.97-1.779-2.979Zm-70.149 16.259c1.337 2.069 2.538 3.93 3.816 5.909.13-.206.171-.357.249-.379 1.596-.456 3.203-.88 4.793-1.356.311-.093.671-.326.804-.595.09-.181-.171-.542-.292-.816-.053-.12-.163-.215-.221-.334-.574-1.164-1.115-2.346-1.735-3.485-.119-.22-.566-.428-.815-.384-.989.177-1.954.475-2.936.693-1.154.256-2.317.475-3.663.747Zm19.625 1.051c-.101-.299-.168-.648-.328-.948-.496-.931-.992-1.865-1.557-2.754-.277-.436-.662-1.021-1.08-1.098-.585-.108-1.252.173-1.873.327-1.248.309-2.477.718-3.738.951-1.339.248-1.4.269-.729 1.502.153.282.362.532.531.805.442.712.965 1.392 1.287 2.155.283.669.794 1.03 1.516.825.597-.169 1.213-.267 1.821-.396-.019-.028-.039-.055-.058-.082 1.388-.425 2.775-.849 4.208-1.287Zm3.448-6.139-.045-.165c-.814.187-1.651.313-2.43.597-.235.086-.526.731-.423.911.646 1.127 1.436 2.171 2.094 3.292.339.578.712.688 1.31.515 1.569-.456 3.152-.869 4.722-1.32 1.487-.428 1.53-.46 1.012-1.679-.406-.957-.899-1.888-1.456-2.766-.176-.277-.713-.519-1.037-.47-.829.125-1.632.417-2.442.655-.439.13-.87.286-1.305.43Zm31.075-7.633c-2.862.692-5.803 1.403-8.981 2.172.953 1.478 1.811 2.811 2.537 3.936 3.167-.897 6.019-1.704 8.96-2.536-.935-1.327-1.693-2.404-2.516-3.572ZM223.329 150.075c.291-.222.636.031 2.125 1.633.687.739 1.476 1.396 2.085 2.191.648.847 1.137 1.814 1.624 2.611-.217.514-.279 1.084-.597 1.342-1.341 1.091-2.706 2.17-4.162 3.097-1.479.941-3.073 1.704-4.623 2.532-2.048 1.095-4.087 2.209-6.16 3.256-1.718.869-3.485 1.643-5.221 2.478-1.511.727-2.999 1.503-4.516 2.217-1.786.842-3.6 1.625-5.389 2.462-2.248 1.054-4.441 2.239-6.737 3.175-1.911.778-3.955 1.225-5.903 1.922-1.279.457-1.984-.404-2.655-1.081-.766-.773-1.325-1.76-1.917-2.69-.536-.844-.98-1.745-1.493-2.603-.671-1.121-1.3-2.276-2.072-3.325-1.419-1.928-2.954-3.77-4.393-5.684-1.145-1.524-2.269-3.07-3.307-4.667-.848-1.305-1.595-2.681-2.291-4.073-.143-.286.003-.94.25-1.151.592-.504 1.3-.894 2.007-1.236.535-.259 1.142-.368 1.714-.553 1.145-.37 2.282-.766 3.433-1.115.938-.284 1.898-.496 2.837-.777.878-.262 1.735-.59 2.611-.855.565-.169 1.15-.267 1.722-.414.331-.086.652-.213.981-.312 1.319-.396 2.637-.797 3.96-1.181 2.271-.659 4.553-1.286 6.818-1.966 1.551-.467 3.08-1.006 4.623-1.503 1.12-.361 2.252-.687 3.368-1.064.955-.322 1.869-.834 2.847-1.014 1.993-.366 3.785-1.872 5.953-1.159.659.216 1.267.673 1.815 1.121 1.497 1.223 2.926 2.528 4.427 3.746 1.165.945 2.395 1.811 3.6 2.706.847.629 1.701 1.249 2.636 1.934Zm1.614 6.304c-.218-.67-.233-1.327-.569-1.624-.8-.707-1.791-1.194-2.631-1.862-.816-.649-1.975-.792-2.526-1.874-.203-.4-.91-.519-1.329-.842-1.346-1.041-2.662-2.121-3.995-3.179-.857-.681-1.693-1.396-2.596-2.011-.916-.624-1.896-1.203-3.091-.806-.461.153-.888.405-1.348.561-1.472.499-2.958.959-4.428 1.465-1.887.65-3.754 1.361-5.65 1.986-1.279.421-2.591.746-3.89 1.104-1.244.342-2.491.674-3.737 1.006-.647.173-1.3.323-1.943.509-.919.265-1.823.578-2.746.823-.751.198-1.546.251-2.276.5-1.913.652-3.781 1.445-5.709 2.05-1.51.475-3.089.732-4.624 1.138-.268.07-.506.371-.673.621-.038.057.274.354.436.531.31.337.65.65.939 1.004 1.559 1.911 3.053 3.879 4.675 5.737 1.546 1.769 3.154 3.451 4.197 5.617.811 1.687 1.991 3.196 2.845 4.865.931 1.818 1.001 1.923 2.866 1.286 1.383-.473 2.818-.821 4.149-1.407 2.584-1.136 5.118-2.387 7.66-3.617 1.512-.732 2.982-1.553 4.505-2.263 1.331-.621 2.732-1.095 4.062-1.718 1.752-.822 3.468-1.722 5.195-2.598 1.925-.977 3.851-1.951 5.764-2.952 1.596-.836 3.2-1.665 4.748-2.584.659-.39 1.186-1.002 1.72-1.466ZM134.823 114.077c-.421.68-1.069.957-2.139.898-1.06-.058-2.147.438-3.229.657-1.341.271-2.745.854-4.018.651-1.016-.162-1.68.542-2.644.371-.855-.151-1.809.343-2.731.449-.884.102-1.788.026-2.674.115-.691.07-1.362.341-2.053.404-1.576.144-3.163.175-4.738.327-1.232.119-2.449.388-3.68.519-.809.086-1.632.049-2.448.06-1.129.017-2.259.003-3.386.046-1.046.04-2.0884.185-3.1332.195-.6932.006-1.386-.186-2.0822-.217-1.4842-.068-2.8785-.394-4.0826-1.301-.9737-.733-1.8382-1.541-2.1872-2.792-.1213-.436-.562-.772-.7904-1.19-1.0668-1.95-1.3941-4.116-1.7077-6.266-.3731-2.557-.6458-5.129-.9218-7.6985-.3003-2.7964-.5716-5.5962-.8231-8.3975-.2003-2.231-.3097-4.4706-.5384-6.6984-.1865-1.8163-.4923-3.6204-.7407-5.4305-.291-2.1199-.6113-4.2366-.8546-6.362-.1905-1.6647-.2991-3.3395-.4153-5.0117-.1484-2.1382-.2739-4.2781-.3981-6.4178-.1193-2.055-.2216-4.111-.3364-6.1662-.091-1.6278-.2216-3.2541-.2755-4.8831-.0506-1.5275-.0106-3.0577-.0341-4.5864-.0262-1.7095-.0388-3.4208-.1327-5.1272-.0751-1.3624-.2729-2.7178-.3954-4.0783-.0373-.4145-.0363-.8379.0004-1.2526.1807-2.0413.3265-4.0885.6171-6.1148.0567-.3955.7003-.7074.8738-.8705.1214-.5522.0866-1.0093.2989-1.2504.7961-.9041 1.572-1.8867 2.5536-2.5475.6986-.4703 1.7046-.5637 2.5918-.6644 2.1857-.2482 4.3841-.3825 6.5734-.6018 2.65-.2655 5.2974-.5602 7.9424-.8668.729-.0845 1.443-.3039 2.173-.3771 1.234-.1238 2.477-.1627 3.714-.2722.755-.0669 1.502-.2229 2.257-.2964 1.458-.1417 2.926-.1999 4.377-.3922 1.52-.2016 3.02-.5553 4.539-.7715.715-.1018 1.462.0235 2.182-.0598 2.066-.2388 4.127-.5318 6.189-.8023.067-.0087.152-.032.2-.0026 1.124.6829 2.155-.0875 3.22-.2193.811-.1002 1.568-.2161 2.428-.1061 1.022.1306 2.108-.345 3.176-.4482 1.801-.1739 3.613-.2239 5.413-.4002.957-.0936 1.891-.3974 2.847-.5108 1.823-.2165 3.653-.3876 5.483-.5355 2.726-.2202 5.453-.4172 8.181-.5964 1.067-.07 2.143-.0085 3.206-.1084 1.301-.1223 2.588-.4037 3.889-.5199 1.429-.1275 2.872-.0981 4.301-.2271.973-.0879 1.926-.4148 2.898-.4826 1.171-.0817 2.36.0837 3.528-.0169 1.124-.0968 2.224-.4385 3.346-.5926.836-.1149 1.694-.0622 2.535-.1543 1.961-.2149 3.916-.496 5.878-.7028 1.123-.1183 2.26-.1016 3.383-.2208 1.543-.1637 3.076-.4134 4.617-.5948.515-.0607 1.042-.0127 1.563-.0357.781-.0344 1.561-.0824 2.341-.135.377-.0254.754-.073 1.131-.1133.958-.1027 1.916-.212 2.875-.3083.452-.0453.906-.0736 1.36-.098 1.67-.0898 3.34-.2279 5.012-.2477 2.047-.0243 4.111-.0926 6.137.13 1.658.182 3.287.7121 4.894 1.2002.438.133.781.6473 1.115 1.0313.326.3744.681.7695.856 1.2201.371.9594.747 1.9415.918 2.9486.388 2.2807.763 4.5737.94 6.8773.247 3.198.309 6.4101.446 9.6163.033.7631.045 1.5271.074 2.2904.068 1.7752.148 3.5499.209 5.3254.068 1.9936.113 3.9881.183 5.9817.076 2.1695.109 4.3429.274 6.5061.123 1.6089.467 3.1999.634 4.807.104.9977.024 2.0133.096 3.0157.092 1.262.263 2.5181.385 3.7781.092.9464.19 1.8937.233 2.8429.064 1.4429.092 2.8876.12 4.3318.04 2.1547.249 4.3268.048 6.4597-.21 2.2179-.638 4.4565-1.317 6.5761-.55 1.7178-1.688 3.1266-3.281 4.2549-2.124 1.5057-4.605 1.9216-6.93 2.8052-1.898.7213-3.829 1.3694-5.776 1.9442-1.162.343-2.393.4462-3.577.7228-1.136.2651-2.26.5884-3.374.9357-.96.2995-1.891.693-2.848 1.0016-1.631.5256-3.272 1.0215-4.911 1.5218-1.928.5883-3.86 1.1613-5.787 1.7533-1.7.524-3.387 1.089-5.094 1.589-.875.256-1.782.4-2.67.613-1.242.298-2.478.62-3.72.919-1.002.242-2.011.452-3.011.697-1.366.335-2.717.732-4.092 1.023-1.473.313-2.969.52-4.45.799-1.16.219-2.309.498-3.469.714-1.146.213-2.26.398-3.39.825-1.793.677-3.763.885-5.654 1.309-2.1.47-4.204.924-6.288 1.454-1.304.331-2.567.821-3.865 1.179-.617.17-1.281.157-1.909.294-1.396.306-2.776.683-4.175.976-1.02.213-2.056.37-3.093.484-.289.032-.604-.179-.985-.304ZM93.638 26.2674c-.1926.1375-.4595.4852-.7544.5106-1.1097.0953-2.2295.0662-3.3432.1258-.4043.0216-1.0089.0259-1.1694.2692-.9939 1.5065-2.2468 2.8423-2.7184 4.6925-.494 1.938-.5357 3.8926-.5805 5.8503-.0489 2.1362.0397 4.2757.077 6.4135.0435 2.4889.0713 4.9784.1532 7.4661.0641 1.9449.1937 3.8877.3069 5.8308.0826 1.4161.1946 2.8305.2751 4.2467.0292.5141-.0328 1.035.021 1.5451.0277.2632.2999.503.3209.7645.1037 1.2885.1226 2.5842.2433 3.8706.1437 1.5323.3598 3.0578.546 4.586.1968 1.616.3992 3.2313.5914 4.8478.0775.6513.1496 1.3041.1933 1.9582.0176.2638-.0853.5359-.066.7994.0302.4136.1828.8259.1654 1.2338-.026.6113.2389 1.1507.2081 1.8114-.0685 1.4655.3772 2.951.5684 4.4341.1009.7834.0889 1.5805.1608 2.3684.1706 1.8707.3468 3.7412.5477 5.6089.1648 1.533.3673 3.062.5552 4.5929.292 2.377.4886 4.772.9053 7.128.4474 2.529.9957 5.074 2.8966 7.017.3915.4.9229.883 1.4206.921 1.5896.119 3.1937.045 4.7922.049 1.6555.004 3.3145.071 4.9675 0 1.248-.054 2.492-.255 3.731-.437 1.365-.201 2.715-.522 4.085-.671 1.639-.179 3.322-.074 4.929-.386 1.467-.284 2.971-.237 4.424-.713 1.282-.419 2.667-.546 4.015-.732 1.173-.162 2.37-.155 3.536-.348 1.868-.309 3.726-.691 5.576-1.098 1.55-.342 3.078-1.051 4.625-1.081 2.117-.04 3.959-.966 5.966-1.321 2.429-.43 4.799-1.194 7.2-1.789 1.358-.336 2.725-.642 4.096-.927 1.383-.287 2.781-.502 4.162-.801 1.381-.3 2.746-.678 4.124-.991.419-.095.875-.034 1.29-.139.971-.246 1.916-.601 2.893-.817 1.022-.227 2.08-.294 3.103-.519 1.846-.406 3.684-.851 5.513-1.327 2.71-.707 5.415-1.4346 8.11-2.1952 1.266-.3574 2.501-.8265 3.758-1.2196 1.327-.415 2.66-.8128 3.998-1.1938 1.174-.3344 2.311-.7762 3.462-1.1673 2.246-.7629 4.568-1.3063 6.866-1.915 1.474-.3905 2.972-.6953 4.438-1.1129 1.232-.3509 2.425-.838 3.65-1.2134 1.842-.5642 3.709-1.0467 5.542-1.6365.977-.3144 1.894-.8083 2.857-1.1736 1.931-.7333 3.029-2.139 3.533-4.1028.567-2.213.408-4.4736.549-6.716.202-3.2138-.049-6.402-.398-9.5916-.13-1.1966-.151-2.405-.226-3.6077-.067-1.0831-.142-2.1656-.207-3.2488-.015-.2549-.002-.5115-.002-.7674-.008-.3373-.257-.6684-.307-1.027-.133-.9553-.189-1.9217-.261-2.8848-.17-2.28-.325-4.5612-.503-6.8406-.056-.7153-.234-1.4253-.244-2.1392-.035-2.7444-.033-5.4895-.029-8.2343.003-1.4095.086-2.8202.051-4.2282-.044-1.7305-.17-3.459-.269-5.1878-.024-.4133-.034-.8365-.134-1.2347-.281-1.1312-.093-2.2906-.324-3.4436-.435-2.171-.552-4.4047-.972-6.5795-.251-1.3025-.572-2.7475-2.356-2.9183-.565-.0541-1.126-.179-1.691-.1933-1.932-.0489-3.866-.1287-5.795-.071-1.782.0533-3.559.3544-5.341.3872-1.683.031-3.34.1694-5.007.4046-1.809.2553-3.645.3268-5.468.4891-1.909.1699-3.818.3417-5.725.5328-1.452.1455-2.899.3391-4.352.4797-.918.0889-1.843.1023-2.762.1801-1.791.1517-3.579.3324-5.369.4865-1.268.1091-2.539.1889-3.807.2916-1.326.1072-2.652.3283-3.976.3097-1.207-.0169-2.358.6678-3.632.1257-.44-.1875-1.129.276-1.715.3404-1.222.1342-2.452.1948-3.678.2962-1.34.1109-2.681.215-4.018.3563-1.597.1688-3.185.4231-4.785.5513-2.217.1777-4.447.2119-6.661.4199-2.199.2067-4.382.5877-6.579.8274-2.346.2558-4.701.4224-7.049.6531-1.911.1877-3.818.419-5.728.6187-1.32.138-2.645.2372-3.964.3866-1.385.1568-2.762.3815-4.149.5234-1.415.1449-2.844.173-4.256.3474-1.584.1959-3.152.5301-4.735.7446-1.325.1796-2.663.2604-3.993.4095-1.025.115-2.043.2904-3.069.3984-1.089.1147-2.1864.1545-3.2745.2763-1.3201.1479-2.6326.3644-3.9533.5051-.1863.0198-.4007-.2217-.6022-.3423Z" fill="#000"/>
+ <path d="M230.65 122.39c-.336.199-.59.349-1.037.612-.451-.578-.907-1.191-1.393-1.78-.446-.54-.975-1.019-1.373-1.59-.531-.765-.996-1.578-1.441-2.397-.543-.998-1.136-1.988-1.511-3.05-.214-.606-.039-1.35-.039-2.062.227-.07.543-.169 1.058-.33.963 1.714 1.852 3.514 2.945 5.181 1.129 1.722 2.466 3.309 2.791 5.416Z" fill="#000"/>
+ <path d="M287.826 105.728c-.194-.026-.59-.082-.987-.136-.245-.033-.495-.043-.735-.097-1.33-.299-2.644-.391-3.911-1.229-.728-.481-1.555-1.061-2.152-1.602-.802-.726-1.111-2.024-1.548-3.1103-.7-1.7351-.768-3.529-.462-5.3751.193-1.1693.536-2.1435 1.609-2.8148.431-.2694.635-.8784 1.043-1.2092 1.073-.8703 2.227-1.6415 3.302-2.5101 1.483-1.1979 2.922-2.4489 4.38-3.6774.403-.3395.812-.6716 1.206-1.0213 1.64-1.4576 2.934-3.235 3.816-5.1823.75-1.6579.662-3.5174-.209-5.2655-.688-1.3805-1.382-2.7604-2.528-3.8005-.989-.8969-2.02-1.8643-3.214-2.392-1.562-.6905-3.282-1.2242-4.973-1.3716-1.689-.1471-3.451.1426-5.135.4717-1.37.2675-2.742.7389-3.985 1.3714-1.332.6782-2.519 1.643-3.758 2.4977-.463.3193-.913.662-1.341 1.0271-1.037.8858-2.124 1.7283-3.066 2.7078-.795.8277-1.485 1.78-2.094 2.756-.716 1.1453-1.071 2.4052-1.345 3.7704-.379 1.8814.774 3.2398 1.084 4.8584.14.7283 1.034 1.2823 1.447 1.9953.889 1.537 1.481 3.292 2.58 4.6482 1.185 1.4636 1.306 3.2631 2.12 4.818.314.5979.182 1.414.439 2.0565.653 1.6301-.021 3.1926-.167 4.7706-.046.488-.589.936-.918 1.392-1.675 2.323-5.764 3.093-8.265 1.547-1.682-1.041-3.286-2.232-5.045-3.118-1.569-.79-3.341-1.119-4.928.036-.628.457-.547 1.293-.526 2.062.019.692-.208 1.391-.366 2.32 1.402.921 3.229 1.878 4.751 3.189 1.458 1.256 3.17 2.055 4.68 3.168 1.524 1.123 3.336 1.854 4.711 3.057 1.372 1.2 3.039 1.768 4.451 2.827 1.975 1.482 4.171 2.666 6.213 4.064 1.602 1.096 3.062 2.399 4.68 3.467 1.339.885 1.679 2.219 2.1 3.583.515 1.665.496 3.336.427 5.061-.055 1.394.449 2.8.545 4.211.177 2.629.212 5.245-1.489 7.537-.588.793-.912 1.784-1.521 2.556-.604.767-1.429 1.358-2.129 2.054-1 .994-1.926 2.067-2.973 3.008-1.212 1.09-2.369 2.242-3.944 2.899-.97.405-1.774 1.191-2.681 1.759-1.337.837-2.71 1.617-4.049 2.452-1.072.669-2.067 1.479-3.183 2.058-1.734.9-3.553 1.635-5.316 2.482-1.385.664-2.731 1.408-4.109 2.087-1.097.54-2.223 1.023-3.326 1.553-1.744.837-3.464 1.724-5.223 2.526-.924.421-1.93.663-2.863 1.068-.769.334-1.468.825-2.229 1.183-1.887.889-3.787 1.753-5.691 2.606-1.084.485-2.196.91-3.28 1.398-.969.436-1.899.958-2.877 1.371-.714.301-1.506.424-2.212.74-.96.43-1.872.969-2.806 1.458-1.195.627-2.384 1.268-3.591 1.871-1.858.929-3.718 1.854-5.599 2.737-1.191.559-2.429 1.016-3.629 1.557-1.728.779-3.434 1.608-5.163 2.386-.985.443-2.002.817-2.997 1.239-1.457.617-2.909 1.246-4.359 1.877-1.869.812-3.752 1.597-5.598 2.459-1.433.67-2.803 1.474-4.234 2.151-.91.431-1.891.711-2.818 1.108-.692.296-1.366.643-2.018 1.019-1.344.775-2.591 1.795-4.023 2.317-1.227.448-2.176 1.537-3.668 1.459-.491-.025-.986.758-1.539 1.06-1.732.946-3.499 1.829-5.241 2.756-1.576.839-3.124 1.732-4.711 2.55-1.761.909-3.538 1.794-5.338 2.625-1.13.521-2.302.966-3.484 1.359-.454.152-1.004.154-1.484.071-1.1-.191-2.193-.172-3.301-.179-.773-.005-1.593-.278-2.303-.616-.788-.375-1.534-.894-2.194-1.469-.899-.782-1.631-1.762-2.558-2.502-1.467-1.17-2.215-3.041-3.952-3.925-.059-.03-.151-.049-.169-.096-.59-1.521-2.038-2.327-2.99-3.549-.92-1.181-1.984-2.249-2.97-3.378-1.007-1.153-1.988-2.328-3-3.476-.255-.289-.614-.486-.877-.769-1.242-1.339-2.484-2.678-3.69-4.048-.563-.639-1.01-1.378-1.573-2.016-.377-.428-.912-.716-1.294-1.141-2.006-2.229-3.98-4.487-5.982-6.721-.363-.406-.846-.709-1.197-1.123-.732-.866-1.255-2.021-2.16-2.593-.854-.541-1.212-1.356-1.839-1.997-1.151-1.177-2.159-2.492-3.292-3.689-.906-.955-1.941-1.79-2.856-2.737-.484-.501-.806-1.154-1.254-1.694-1.0989-1.327-2.4417-2.51-3.271-3.984-.5444-.967-1.3588-1.572-1.9666-2.403-.4063-.556-.6983-1.196-1.1159-1.742-.9516-1.244-1.9664-2.44-2.9207-3.682-.5147-.67-.9224-1.422-1.4405-2.089-.9381-1.208-1.948-2.36-2.8785-3.574-.5659-.738-1.0416-1.545-1.5535-2.324-.6983-1.062-1.4822-2.081-2.0661-3.203-.761-1.463-1.3352-3.014-1.4331-4.696-.0479-.821-.1659-1.641-.1666-2.461-.0002-.225.3086-.451.5736-.808-.0788-.032-.3511-.142-.6868-.277.0657-.089.2683-.338.2561-.349-1.0745-.962-.536-2.623-1.6003-3.604-.704-.649-.8129-1.747-1.3475-2.399-.8482-1.034-.8415-2.251-1.2765-3.35-.5285-1.335-.813-2.771-1.1403-4.178-.1309-.562-.0391-1.174-.1436-1.746-.4767-2.609-1.0045-5.209-1.4759-7.819-.1609-.89-.1733-1.807-.3208-2.701-.1807-1.095-.4697-2.173-.645-3.268-.3521-2.201-.6634-4.408-.9821-6.614-.1305-.903-.5091-1.8839-.2862-2.6962.2975-1.0838-.4008-1.8624-.4066-2.8143-.0061-1.0011-.1246-2.003-.224-3.0017-.2823-2.8377-.6228-5.6705-.8541-8.5122-.1234-1.517-.0382-3.0499-.1087-4.5727-.0298-.6453-.2856-1.2795-.3215-1.9253-.1125-2.0256-.1391-4.0562-.2621-6.0811-.0521-.8579-.3015-1.7023-.3893-2.5602-.1083-1.0588-.1368-2.1255-.2089-3.1881-.0679-.9999-.1881-1.998-.2098-2.9985-.0186-.8571.097-1.7163.1021-2.5749.0042-.7062-.0516-1.414-.1077-2.1189-.0839-1.0542-.2215-2.1048-.2825-3.16-.1193-2.0628-.2107-4.1274-.2953-6.192-.0416-1.0149-.0046-2.0341-.0721-3.0467-.0681-1.0216-.2242-2.0373-.3371-3.0561-.2821-2.5464-.5594-5.0932-.8429-7.6394-.212-1.9044-.497-3.8035-.6299-5.7132-.1706-2.4504-.0061-4.8901.9359-7.1974.5727-1.4032 2.0129-1.4948 3.2238-1.8998.1546-.0517.3307-.0395.5545-.063-.048-.2428-.0901-.4553-.1325-.6698.8105-.2783 1.5922-.6771 2.4162-.8046 2.2802-.3529 4.5844-.5503 6.8668-.8904 1.7991-.268 3.5764-.6779 5.3704-.9833.9966-.1696 2.0071-.2594 3.0125-.3759 2.8061-.3252 5.6162-.619 8.4177-.9794 1.322-.1701 2.6209-.5151 3.9429-.6881 1.329-.174 2.677-.2094 4.011-.3503.874-.0922 1.736-.3538 2.608-.3786 1.251-.0356 2.402-.5531 3.737-.3824 1.164.1487 2.413-.4848 3.64-.6687 1.839-.2757 3.692-.4561 5.538-.6859.718-.0893 1.432-.2083 2.149-.3043 2.256-.302 4.514-.5838 6.766-.90373 1.667-.23665 3.323-.54387 4.991-.77378.846-.11675 1.709-.10872 2.561-.19813 2.004-.21043 4.005-.44485 6.007-.67111.443-.05009.887-.09917 1.328-.16142 1.531-.2158 3.056-.47868 4.592-.64569 1.806-.19638 3.622-.30168 5.432-.46485 1.434-.12936 2.867-.28226 4.3-.4322 1.937-.20277 3.874-.41316 5.811-.61945 1.611-.17154 3.221-.35642 4.834-.50921 2.174-.20596 4.366-.28359 6.521-.61342 1.527-.23381 3.096-.09762 4.6-.64666.676-.24697 1.51-.04999 2.271-.08784.91-.04525 1.818-.1355 2.727-.18989 2.337-.13973 4.68-.21377 7.01-.42265 1.858-.16655 3.702-.49279 5.552-.74958.101-.01391.207-.07647.297-.05689 2.151.46591 4.25-.5661 6.422-.19163.739.12742 1.565-.34392 2.363-.43379 1.134-.12767 2.281-.13649 3.42-.23172 1.098-.09182 2.192-.2273 3.288-.34642 1.95-.21198 3.9-.4178 5.849-.641642 1.96-.225277 3.914-.530295 5.88-.685338 1.491-.1175587 3.003-.1466914 4.492-.037299.894.065712 1.663 1.227849 1.793 2.212789.248 1.86964.725 3.73771.709 5.60301-.01 1.17119.408 2.22704.391 3.37494-.022 1.4888.069 2.9913.263 4.468.25 1.896.7 3.7654.971 5.6593.194 1.3513.306 2.7231.325 4.0875.016 1.1531-.224 2.309-.22 3.4633.003 1.2256.188 2.4495.243 3.6764.075 1.67.083 3.3429.155 5.0131.066 1.5377.2 3.0725.268 4.6101.099 2.2445.159 4.4907.251 6.7355.063 1.524.198 3.0463.215 4.5702.018 1.5855-.089 3.1719-.102 4.7582-.008 1.037.093 2.0753.074 3.1117-.018 1.0118-.338 2.0646-.145 3.0229.283 1.3968.095 2.7707.156 4.1498.095 2.1773.008 4.3619.065 6.5416.075 2.8301.219 5.6582.328 8.4874.075 1.9334.105 3.8693.222 5.7999.122 2.0017.37 3.9963.468 5.9986.038.7558-.188 1.5244-.301 2.3408 1.471.9985 3.056 1.9904 4.545 3.1087 1.26.947 2.405 2.045 3.613 3.062.126.107.383.211.489.152.147-.081.33-.36.288-.479-.437-1.22.314-2.231.83-3.089.451-.7499 1.506-1.2847 2.406-1.5847 1.21-.4037 2.478-.5598 3.833-.3972 1.699.2038 3.197.7932 4.627 1.6099 1.155.661 2.185 1.54 3.352 2.175.667.362 1.499.594 2.25.578.552-.012 1.109-.496 1.636-.816 1.074-.651.931-1.859 1.105-2.8365.125-.6978-.224-1.5114-.473-2.2353-.349-1.0162-.751-2.0222-1.227-2.9853-.403-.8167-.962-1.5559-1.42-2.3476-.999-1.7263-2.065-3.4215-2.937-5.2104-.736-1.5106-1.328-3.1078-1.815-4.7173-.481-1.5875-.237-3.1358.419-4.7168.513-1.2332.852-2.5456 1.652-3.6337.866-1.1781 1.819-2.2938 2.747-3.4262.317-.3875.673-.7441 1.013-1.113 1.246-1.3508 2.677-2.452 4.311-3.3116.639-.3362 1.147-.9266 1.793-1.2421 1.125-.5494 2.289-1.0417 3.478-1.4345 1.17-.3869 2.384-.6569 3.593-.9086.79-.1644 1.603-.2388 2.41-.292 1.004-.0662 2.046-.2442 3.011-.0615 1.803.3409 3.688.3653 5.37 1.2703 1.147.6173 2.48.9644 3.491 1.7406 1.083.8313 1.926 1.9928 2.798 3.0706.556.6872.998 1.4707 1.444 2.2387.181.3115.213.7049.35 1.0464.657 1.6405 1.096 3.3161.941 5.1065-.147 1.6898-.323 3.3446-1.466 4.7541-.562.6941-.869 1.5895-1.403 2.313-.355.4822-.933.795-1.357 1.2355-.235.2439-.292.6698-.542.8851-1.722 1.4875-3.46 2.9576-5.22 4.4002-1.228 1.0063-2.477 1.9913-3.759 2.9272-1.033.7539-1.909 1.555-2.13 2.909-.291 1.7829.301 3.2056 1.414 4.5902.899 1.12 2.216 1.506 3.319 2.242.65.435 1.645.531 2.461.47.401-.03.924-.705 1.088-1.189.534-1.579 1.471-2.7915 2.841-3.7167.843-.5698 1.653-1.1895 2.482-1.7811 1.73-1.2354 3.656-1.9774 5.703-2.574 1.698-.4947 3.379-.8736 5.131-.9428 2.727-.1078 5.411.2465 8.031.9824 1.476.4145 2.915.959 4.367 1.4549.574.1958 1.318.2645 1.665.6654.526.6068 1.222.7457 1.845 1.0709.817.4261 1.695.734 2.516 1.1513 1.837.9332 3.645 1.9234 5.487 2.8457.65.326 1.404.452 2.043.793 1.445.773 2.987 1.458 4.228 2.49 1.111.924 1.984 2.197 2.76 3.441.925 1.483 1.223 3.211 1.62 4.915.623 2.681.765 5.37.569 8.07-.131 1.807-.529 3.606-.939 5.379-.28 1.211-.656 2.44-1.236 3.532-.419.789-1.154 1.496-1.907 2.007-1.433.972-2.946 1.844-4.493 2.626-.838.423-1.992.348-2.688.896-1.131.89-2.469.788-3.682 1.103-2.176.564-4.423.91-6.719.329-1.426-.36-2.931-.398-4.377-.694-1.681-.344-3.367-.718-4.994-1.25-1.765-.578-3.447-1.405-5.2-2.025-1.242-.439-2.537-.736-3.818-1.055-.795-.198-1.476-.43-2.008-1.175-.386-.541-1.125-.832-1.71-1.23-1.354-.923-2.784-1.753-4.038-2.794-.812-.674-1.415-1.623-2.027-2.505-.69-.995-1.416-1.998-1.893-3.098-.704-1.624-1.432-3.297-1.731-5.022-.373-2.157-.412-4.386-.414-6.585 0-.953.451-1.907.782-3.187ZM73.5908 55.1454c-.0281-.9707-.0562-1.9415-.0843-2.9122l-.3509.0163c0 .9214-.0071 1.843.0142 2.764.0016.069.2056.1335.3155.2-.0571.3151-.1693.6323-.1577.9448.0148.4007.1897.7978.1889 1.1963-.0021 1.0608-.11 2.1226-.0849 3.1819.0273 1.1539.1837 2.3045.2256 3.4586.0128.3528-.1664.7125-.1957.8269.1687 1.0917.3588 2.0254.4475 2.9685.1208 1.2839.1428 2.5769.2491 3.8625.056.6765.2615 1.3428.2935 2.0187.0609 1.2856.0085 2.5765.0722 3.8618.0657 1.3246.2119 2.6454.3261 3.9676.0887 1.0261.2064 2.0504.2683 3.0781.0945 1.5676.1555 3.1372.2239 4.7063.0491 1.1268-.1513 2.3335.1931 3.3601.3855 1.1493.2363 2.2565.3286 3.3802.0332.4047-.0208.8162.0079 1.2217.0344.486.1146.9687.1909 1.581.5313.2046.7456-.078.6742-.8649-.1913-2.1093-.3493-4.2224-.4736-6.3367-.1332-2.2651-.1858-4.535-.3242-6.7998-.1114-1.8245-.3243-3.6427-.4434-5.4668-.098-1.5029-.0933-3.0124-.1903-4.5154-.1307-2.0253-.3408-4.0455-.4695-6.0708-.1252-1.969-.1858-3.9419-.2841-5.9126-.0691-1.3848-.086-2.7769-.2521-4.1506-.145-1.1995-.4657-2.3778-.7088-3.5655ZM108.75 157.874c1.533.118 1.692 1.933 2.771 2.788.444.351.674.96 1.043 1.419 1.123 1.402 2.278 2.779 3.397 4.183.654.82 1.227 1.704 1.902 2.505 1.137 1.348 2.35 2.633 3.486 3.982 1.119 1.329 2.167 2.718 3.275 4.057.844 1.019 1.75 1.987 2.6 3.001 1.222 1.457 2.382 2.967 3.635 4.396 1.419 1.617 2.929 3.154 4.362 4.759.567.635.893 1.6 1.573 1.993 1.346.775 2.121 2.032 3.139 3.079 1.079 1.111 2.027 2.356 3.164 3.401.993.914 2.087 1.686 2.15 3.194.002.051.085.099.133.146 1.002.949 2.269 1.268 3.524.962 1.548-.377 3.048-.994 4.525-1.612 2.452-1.025 4.868-2.135 7.301-3.205 1.891-.832 3.783-1.659 5.677-2.483.604-.263 1.232-.476 1.817-.774 1.236-.631 2.432-1.338 3.676-1.949 2.2-1.08 4.434-2.092 6.633-3.173 1.057-.519 2.063-1.14 3.1-1.7 1.01-.545 2.024-1.08 3.046-1.602.727-.372 1.473-.71 2.206-1.072.716-.354 1.429-.714 2.141-1.077 1.256-.641 2.511-1.282 3.763-1.929 1.33-.687 2.666-1.365 3.981-2.081.771-.42 1.478-.963 2.264-1.348 1.529-.752 3.095-1.43 4.644-2.142 1.235-.568 2.489-1.098 3.694-1.724 1.25-.651 2.434-1.427 3.677-2.092 1.274-.68 2.611-1.243 3.872-1.944 1.847-1.027 3.658-2.115 5.655-2.845.252-.092.485-.237.72-.37 2.073-1.176 4.131-2.377 6.221-3.52.863-.473 1.819-.775 2.686-1.239 1.505-.805 2.97-1.685 4.461-2.518 1.019-.569 2.054-1.111 3.082-1.664 1.136-.611 2.266-1.236 3.413-1.827 1.019-.525 2.083-.97 3.085-1.527 1.825-1.014 3.612-2.098 5.429-3.128 1.177-.668 2.399-1.258 3.563-1.947 1.317-.779 2.574-1.659 3.889-2.441 1.215-.722 2.479-1.363 3.711-2.058 2.659-1.499 5.309-3.015 7.969-4.513.759-.427 1.55-.796 2.31-1.223 1.15-.647 2.277-1.335 3.43-1.977.519-.289 1.157-.413 1.598-.781.572-.479 1.369-1.112 1.393-1.705.025-.618.162-1.129.348-1.678.267-.785-.719-3.204-1.348-3.571-1.475-.864-2.939-1.749-4.366-2.688-1.306-.86-2.534-1.838-3.839-2.698-1.093-.72-2.26-1.326-3.372-2.017-1.163-.723-2.297-1.493-3.449-2.233-1.577-1.013-3.167-2.007-4.737-3.031-1.298-.845-2.591-1.701-3.857-2.593-.734-.517-1.339-1.257-2.126-1.649-1.637-.814-2.693-2.343-4.331-3.193-1.196-.62-2.048-1.868-3.139-2.727-1.052-.828-2.252-1.468-3.314-2.283-.777-.596-1.336-1.545-2.178-1.968-.946-.476-1.568-1.153-2.237-1.897-.471-.523-1.134-.9959-1.799-1.1862-.52-.1489-1.187.1282-1.767.2909-1.013.2835-1.992.7033-3.016.9223-1.419.305-2.874.441-4.3.716-1.835.354-3.658.775-5.487 1.164-2.154.458-4.303.948-6.466 1.359-2.143.406-4.208 1.23-6.434 1.195-.153-.003-.308.051-.459.09-1.058.276-2.106.603-3.176.821-1.996.407-4.009.727-6.006 1.129-1.646.332-3.274.747-4.917 1.094-1.053.223-2.12.378-3.174.593-.316.064-.601.269-.916.339-2.006.44-4.017.854-6.022 1.294-.369.081-.711.306-1.08.36-1.014.146-2.048.179-3.054.365-1.083.199-2.139.535-3.214.783-.704.162-1.422.261-2.128.412-1.004.215-2 .472-3.007.672-.707.141-1.434.183-2.139.332-1.195.253-2.37.601-3.569.827-1.297.245-2.606.491-3.897.713-1.181.204-2.373.734-3.617 1.009-2.692.595-5.338 1.394-8.009 2.083-1.24.319-2.525.487-3.732.894-.729.245-1.406.608-2.2.689-.642.065-1.278.231-1.904.397-.459.122-.885.38-1.347.47-2.573.501-5.178.815-7.686 1.652-1.028.343-2.163.356-3.24.568-1.773.348-3.535.752-5.307 1.104-2.487.494-4.982.949-7.468 1.446-1.508.302-3.001.679-4.511.972-1.596.31-3.21.531-4.806.847-1.247.247-2.475.59-3.719.857-.108.023-.272-.207-.41-.32.013.09.025.181.038.271-5.0749 1.117-10.1806 2.094-15.2162 2.986.9646 1.015 1.9123 1.982 2.8258 2.98 1.6591 1.813 3.4485 3.534 4.8972 5.503 1.138 1.547 2.3324 3.045 3.4688 4.585.8262 1.12 1.4951 2.334 2.5844 3.256.453.383.78.918 1.143 1.4.392.522.725 1.092 1.145 1.59.753.895 1.568 1.738 2.327 2.627.556.652 1.05 1.357 1.597 2.017.73.881 1.499 1.731 2.216 2.622.125.156.075.453.116.761ZM76.06 40.1386c.0482.1613.2254.5513.2745.9566.141 1.1642.2371 2.3341.3382 3.5029.1175 1.3588.2391 2.7176.3273 4.0785.1282 1.9805.2161 3.9636.3454 5.944.062.9492.1933 1.8937.2681 2.8422.0621.7877.0616 1.5806.1359 2.3667.077.8137.2659 1.6193.3065 2.4334.0598 1.1956-.1428 2.4288.0798 3.5861.3654 1.8991.2028 3.8041.3508 5.7009.0986 1.2627-.0901 2.5872.229 3.7836.4338 1.6269-.0991 3.2782.4881 4.9169.3761 1.0495.0611 2.3356.1077 3.5137.0897 2.2651.2229 4.5284.3242 6.793.0415.9275-.1587 1.9241.1207 2.7677.3513 1.0607.365 2.1136.4664 3.179.1283 1.3484.2391 2.6987.3814 4.0452.1864 1.764.4096 3.523.5923 5.287.2044 1.972.3786 3.947.5707 5.921.3491 3.586.6165 7.183 1.1075 10.749.1375.999.3177 2.205 1.2977 2.914.5937.429 1.3108.707 1.8515 1.188.883.785 1.6945.648 2.565.057.0736-.05.1851-.046.2796-.064 2.246-.428 4.4974-.829 6.7368-1.288 2.6939-.553 5.3709-1.187 8.0689-1.72 1.114-.221 2.206-.509 3.385-.53 1.089-.019 2.155-.617 3.255-.853 1.623-.349 3.268-.6 4.902-.902.611-.113 1.212-.304 1.828-.373.841-.093 1.705-.028 2.536-.169.986-.167 1.941-.503 2.92-.723.568-.127 1.17-.115 1.733-.261 1.419-.368 2.828-.777 4.233-1.194 1.844-.548 3.798-.452 5.646-1.073 1.376-.463 2.877-.544 4.301-.881 1.032-.243 2.017-.675 3.044-.941 1.995-.517 4.009-.962 6.007-1.466 1-.252 1.975-.601 2.976-.846 1.913-.468 3.88-.766 5.74-1.385 1.017-.339 2.078-.314 3.105-.734.924-.377 2.093-.26 3.077-.754.185-.093.455-.004.683-.024.521-.047 1.207.077 1.526-.205.673-.596 1.305-.546 2.07-.385.278.058.625-.164.929-.289.276-.113.523-.335.806-.392 1.494-.298 3-.535 4.494-.837 2.664-.539 5.327-1.092 7.981-1.678.659-.146 1.322-.707 1.915-.62 1.231.181 2.28-.32 3.396-.546 1.375-.279 2.722-.696 4.095-.992 2.067-.447 4.142-.855 6.219-1.252 1.49-.285 2.986-.55 4.486-.767.459-.067 1.192.263 1.377.05.869-1.007 2.144-.625 3.181-1.032 1.655-.649 3.499-.818 5.265-1.181 2.204-.454 4.41-.8948 6.613-1.3491 1.513-.3118 3.023-.6369 4.534-.9569 1.548-.3279 3.087-.7078 4.646-.9698 1.359-.2284 2.78-.1772 4.1-.5249 1.075-.2829 2.044-.9679 3.05-1.4936.086-.0449.129-.2309.137-.3548.028-.454.076-.9125.041-1.3637-.161-2.1134-.385-4.2226-.512-6.3377-.138-2.2925-.215-4.5893-.275-6.8853-.04-1.497-.056-2.9986.014-4.4935.129-2.7185-.251-5.4301.039-8.159.172-1.6257-.063-3.2926-.088-4.9414-.034-2.3001-.026-4.6009-.068-6.9008-.052-2.8796-.101-5.7599-.214-8.6375-.124-3.1847-.345-6.3657-.474-9.5503-.09-2.2111-.077-4.4262-.148-6.6383-.043-1.3271-.171-2.6512-.238-3.9777-.036-.7161.02-1.4384-.041-2.1514-.157-1.8258-.355-3.6483-.541-5.4716-.204-1.9986-.436-3.9946-.613-5.9955-.228-2.5885-.414-5.18071-.621-7.81424-.418-.32335-.942-.75597-1.495-1.14882-.387-.27484-.819-.71188-1.22-.70057-1.347.03799-2.689.2413-4.033.38775-.707.07713-1.438.07954-2.114.2712-1.213.34374-2.476.08609-3.709.52507-.978.34829-2.129.21685-3.203.29015-.415.02828-.831.04107-1.247.04803-.748.0125-1.504-.05046-2.243.03486-1.951.22535-3.892.54271-5.844.76458-1.084.12318-2.184.09362-3.271.19501-1.707.15919-3.407.39017-5.114.5512-.716.06763-1.447-.0134-2.164.05656-1.611.1574-3.215.39715-4.827.54776-2.151.20093-4.307.34015-6.46.52252-1.956.16577-3.911.36061-5.867.53006-1.83.15858-3.668.25427-5.493.46181-2.24.25478-4.466.63188-6.706.88936-1.553.17844-3.141.1192-4.671.39661-1.42.2574-2.855.2632-4.278.5058-2.108.3596-4.27.407-6.409.5912-1.49.1285-2.986.2188-4.469.4079-1.578.2011-3.138.536-4.716.7432-1.544.2028-3.105.279-4.649.4818-2.14.2812-4.267.6575-6.407.9387-1.673.2199-3.36.3308-5.035.5391-1.378.1714-2.743.436-4.12.6128-.401.0513-.839-.147-1.23-.0733-.71.1341-1.388.4505-2.099.575-1.316.23-2.65.3583-3.971.5633-1.154.1792-2.293.4703-3.452.5978-2.507.2758-5.025.4434-7.53.729-.952.1085-1.883.2372-2.8509.2755-1.5875.0627-3.1441.6812-4.7348.9345-2.1415.3409-4.3006.5771-6.4563.8227-2.838.3235-5.679.623-8.5209.9098-.8814.089-1.917-.1683-2.6237.2109-1.2822.6881-1.8639 2.127-2.2106 3.4541-.228.8724.1514 1.9094.2904 2.8681.1311.9035.3745 1.7965.4335 2.7028.0408.6262-.1478 1.2672-.216 1.7702.1865.4073.4454.7566.4993 1.1348.1189.8331.1185 1.6823.1956 2.5223.1239 1.3491.2919 2.6945.3944 4.045.0268.3532-.1195.7195-.22 1.2615Zm73.935 164.9144c.184 2.243.357 4.358.536 6.534.461-.097.807-.108 1.095-.241 1.596-.738 3.216-1.436 4.754-2.281 1.533-.842 2.974-1.834 4.63-2.463.908-.345 1.74-.898 2.585-1.394.813-.477 1.564-1.068 2.402-1.491 1.699-.858 3.448-1.616 5.158-2.45 1.997-.974 3.985-1.967 5.958-2.988 1.014-.526 1.896-1.226 3.106-1.457.859-.164 1.584-.953 2.409-1.387.517-.272 1.336-.238 1.62-.629.697-.958 1.86-.84 2.725-1.428 1.108-.754 2.545-1.015 3.812-1.555.843-.359 1.619-1.141 2.457-1.19 1.447-.084 2.28-1.192 3.498-1.615 1.715-.597 3.381-1.342 5.044-2.077 1.118-.494 2.194-1.083 3.29-1.625.822-.405 1.638-.821 2.473-1.196.819-.367 1.67-.664 2.486-1.036.609-.278 1.172-.654 1.778-.938.894-.417 1.825-.757 2.708-1.193.942-.465 1.829-1.044 2.774-1.503 1.251-.608 2.547-1.125 3.802-1.727.649-.312 1.322-.43 1.94-1.02.685-.654 1.967-.643 2.924-1.065 2.008-.886 3.959-1.899 5.96-2.8 1.88-.846 3.799-1.606 5.692-2.423 1.321-.57 2.633-1.161 3.939-1.765 1.09-.503 2.166-1.036 3.245-1.561.387-.189.764-.397 1.147-.594.896-.459 1.783-.938 2.692-1.369 1.153-.548 2.341-1.025 3.484-1.591 1.168-.58 2.298-1.237 3.45-1.85 1.331-.709 2.666-1.411 4.005-2.105.448-.232.904-.455 1.373-.639.429-.169 1.12-.147 1.281-.438.62-1.114 1.843-1.323 2.742-1.993 1.576-1.177 3.407-2.034 4.907-3.29 1.097-.919 2.35-1.671 3.224-2.928.827-1.188 2.136-2.031 3.122-3.126.652-.723 1.288-1.557 1.608-2.456.493-1.381.54-2.869.307-4.342-.065-.412-.092-.831-.126-1.147-2.221 1.162-4.455 2.347-6.706 3.5-.885.454-1.846.77-2.702 1.269-1.348.785-2.606 1.724-3.957 2.502-1.673.964-3.428 1.786-5.099 2.752-2.036 1.176-3.996 2.485-6.038 3.651-2.322 1.326-4.702 2.552-7.052 3.832-1.611.878-3.21 1.778-4.82 2.657-2.076 1.132-4.155 2.26-6.239 3.375-1.739.931-3.478 1.863-5.241 2.748-.674.339-1.681.347-2.072.858-1.044 1.365-2.721 1.586-3.995 2.519-1.195.875-2.672 1.362-4.012 2.046-.948.483-1.865 1.029-2.813 1.511-1.295.658-2.616 1.265-3.909 1.927-.949.486-1.842 1.086-2.81 1.526-1.272.577-2.581 1.038-3.701 1.938-.513.412-1.27.517-1.905.787-.726.309-1.468.599-2.152.986-.918.518-1.753 1.187-2.685 1.673-1.609.84-3.278 1.562-4.897 2.382-1.332.675-2.622 1.432-3.943 2.129-1.659.876-3.334 1.721-4.995 2.594-.812.427-1.563 1.119-2.419 1.281-1.514.285-2.587 1.378-4.018 1.829-1.335.422-2.481 1.411-3.749 2.079-1.433.755-2.899 1.45-4.368 2.136-1.153.538-2.333 1.019-3.498 1.531-1.648.725-3.299 1.442-4.936 2.19-.949.435-1.856.965-2.811 1.384-2.263.992-4.54 1.953-6.824 2.896-.258.107-.6.015-.916.015-.493 1.319-2.103.6-2.734 1.329Zm151.805-77.14c.834.191 1.663.299 2.433.574 1.409.502 2.762 1.161 4.176 1.645 1.546.53 3.134.943 4.707 1.395 1.235.356 2.463.912 3.715.977 1.173.06 2.192.78 3.462.476 1.102-.263 2.309-.06 3.466-.125 2.381-.134 4.608-.895 6.765-1.837 1.247-.545 2.576-1.074 3.594-1.932 1.35-1.138 2.245-2.69 2.648-4.471.461-2.033.714-4.097.688-6.169-.023-1.893-.187-3.794-.441-5.671-.267-1.979-1.145-3.836-2.604-5.115-1.666-1.461-3.54-2.756-5.677-3.561-.851-.321-1.674-.718-2.499-1.101-.783-.363-1.557-.745-2.327-1.134-.651-.33-1.291-.682-2.002-1.059-2.489 1.225-5.215 2.394-7.413 4.451-.416.348-.864.696-1.255 1.1-1.112 1.147-2.261 2.265-3.279 3.492-.86 1.037-1.548 2.215-2.328 3.32-.425.603-.657 1.438-1.032 1.89-1.186 1.428-1.701 3.084-2.272 4.745-.326.948-.522 1.94-.816 2.9-.442 1.442-.917 2.874-1.38 4.309-.07.215-.155.425-.329.901Zm-216.7177 5.863-.294.198c.0976.531.213 1.059.2881 1.592.091.648.1565 1.299.2175 1.95.0801.855.0105 1.734.4293 2.531.4576.871.8633 1.775 1.3887 2.603.6935 1.094 1.5026 2.114 2.2223 3.191.6048.906 1.103 1.885 1.741 2.765.5463.753 1.2436 1.396 1.8356 2.12.3297.402.5781.871.8678 1.307.7057 1.062 1.3535 2.169 2.1372 3.17.9141 1.169 1.9789 2.218 2.9228 3.365 1.4644 1.779 2.8614 3.613 4.3264 5.39.747.905 1.616 1.71 2.366 2.613.631.761 1.175 1.595 1.748 2.403.467.659.917 1.33 1.381 1.99.053.076.149.175.224.174.97-.021 1.232.934 1.798 1.407 1.132.949 2.006 2.201 3.018 3.3.477.519 1.066.937 1.533 1.464 1.032 1.162 1.991 2.39 3.032 3.544 1.287 1.427 2.646 2.79 3.94 4.211 1.79 1.964 3.552 3.953 5.32 5.938.883.992 1.741 2.007 2.629 2.994 1.328 1.477 2.68 2.932 4.007 4.409.578.644 1.097 1.341 1.684 1.976.715.772 1.496 1.483 2.209 2.258.854.929 1.639 1.921 2.503 2.841.908.967 1.871 1.883 2.815 2.816.923.911 1.844 1.826 2.79 2.713.142.133.419.162.633.161.075 0 .21-.235.213-.366.045-1.654.093-3.309.07-4.963-.003-.205-.383-.476-.644-.595-1.089-.493-2.463-.689-3.218-1.481-.607-.635-1.111-1.545-1.693-2.31-.689-.905-1.314-1.869-2.081-2.701-1.319-1.431-2.745-2.764-4.092-4.171-.741-.775-1.405-1.623-2.116-2.428-.865-.98-1.742-1.95-2.617-2.92-.858-.951-1.74-1.882-2.577-2.85-.836-.965-1.613-1.98-2.447-2.947-.62-.719-1.319-1.371-1.925-2.099-.366-.44-1.123-.658-.929-1.457-1.221-.043-1.117-1.317-1.767-1.898-.407-.364-.714-.837-1.086-1.242-.577-.628-1.209-1.208-1.748-1.865-.802-.98-1.516-2.032-2.319-3.011-.693-.845-1.496-1.6-2.18-2.451-.889-1.105-1.674-2.283-2.656-3.328-.948-1.01-1.696-2.205-2.557-3.299-1.404-1.783-2.799-3.574-4.251-5.318-1.325-1.591-2.731-3.115-4.075-4.691-.2484-.292-.3085-.746-.5618-1.031-.6389-.721-1.3361-1.39-2.0149-2.074-.2466-.249-.6365-.44-.7367-.734-.2799-.82-.7707-1.396-1.3685-2.039-1.2795-1.376-2.2835-3.008-3.3931-4.54-.4903-.677-.9359-1.387-1.4488-2.046-1.3601-1.747-2.7318-3.486-4.1304-5.203-.3992-.49-.906-.893-1.3635-1.336Zm214.8887-7.493c.065-1.143.019-2.148.198-3.112.371-1.992.823-3.971 1.325-5.935.163-.637.608-1.198.885-1.812.505-1.119.885-2.305 1.497-3.359.506-.87 1.289-1.577 1.919-2.38.986-1.253 1.947-2.525 2.957-3.84-.522-.344-1.191-.976-1.986-1.264-1.44-.522-2.943-.893-4.442-1.229-2.375-.533-4.786-.913-7.144-1.507-.929-.234-1.579-.258-2.043.639-.088.168-.06.408-.17.551-.842 1.099-1.552 2.248-1.831 3.639-.254 1.27-.439 2.537-.526 3.834-.176 2.584.097 5.081 1.121 7.471.199.465.487.896.769 1.321.769 1.159 1.42 2.436 2.371 3.427 1.313 1.368 2.93 2.418 4.554 3.419.211.13.505.128.546.137Zm-2.383-27.6112c.675.1921 1.381.6404 1.957.5119 1.942-.4327 3.608.545 5.259 1.0713 2.048.654 4.184 1.385 5.931 2.772.543.431.904.455 1.397-.047.389-.396.897-.674 1.348-1.011 1.359-1.014 2.715-2.0301 4.152-3.1048-.874-.3548-1.807-.7378-2.744-1.1136-2.178-.8738-4.415-1.5289-6.774-1.6392-1.739-.0812-3.444-.0022-5.192.3127-2.052.3697-3.878.9714-5.334 2.2477ZM76.8825 99.9056c-.1233-.0081-.2466-.0161-.3699-.0242.048.8566.096 1.7126.144 2.5686.0753.004.1506.009.2259.014v-2.5584Z" fill="#000"/>
+ </g>
+ <defs>
+ <linearGradient id="b" x1="68" y1="3" x2="278" y2="3" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#9059FF"/>
+ <stop offset=".520833" stop-color="#FF4AA2"/>
+ <stop offset="1" stop-color="#FFBD4F"/>
+ </linearGradient>
+ <clipPath id="a">
+ <path fill="#fff" d="M0 0h341v215H0z"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/browser/components/aboutwelcome/assets/fox-doodle-tail.png b/browser/components/aboutwelcome/assets/fox-doodle-tail.png
new file mode 100644
index 0000000000..7f8fa37fa7
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/fox-doodle-tail.png
Binary files differ
diff --git a/browser/components/aboutwelcome/assets/fox-doodle-waving-static.png b/browser/components/aboutwelcome/assets/fox-doodle-waving-static.png
new file mode 100644
index 0000000000..6ce8c828c7
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/fox-doodle-waving-static.png
Binary files differ
diff --git a/browser/components/aboutwelcome/assets/fox-doodle-waving.gif b/browser/components/aboutwelcome/assets/fox-doodle-waving.gif
new file mode 100644
index 0000000000..1db8fc9ab6
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/fox-doodle-waving.gif
Binary files differ
diff --git a/browser/components/aboutwelcome/assets/heart.webp b/browser/components/aboutwelcome/assets/heart.webp
new file mode 100644
index 0000000000..fb9f7fdca5
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/heart.webp
Binary files differ
diff --git a/browser/components/aboutwelcome/assets/long-zap.svg b/browser/components/aboutwelcome/assets/long-zap.svg
new file mode 100644
index 0000000000..757a5483f9
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/long-zap.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 16" width="400" height="16"><defs><linearGradient id="a" y1="13.69" x2="435.45" y2="13.69" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.91716 0 0 .7708 .27 .687)"><stop offset="0" stop-color="#616eb3"/><stop offset=".5" stop-color="#ec1067"/><stop offset="1" stop-color="#f6901e"/></linearGradient></defs><path d="M4.45 2.81c96.1 9.33 158.63 4.37 195.55 2.68 51.53-2.35 183.67-4.32 193.85-1.91 9.32 2.21-81.45-.12-114.57 7.08C258 15.28 315.1 7.17 322.94 14" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke="url(#a)"/></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mobile-download-qr-existing-user-cn.svg b/browser/components/aboutwelcome/assets/mobile-download-qr-existing-user-cn.svg
new file mode 100644
index 0000000000..99d174a259
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mobile-download-qr-existing-user-cn.svg
@@ -0,0 +1,5 @@
+
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M136 1H14C6.82 1 1 6.82 1 14v122c0 7.18 5.82 13 13 13h122c7.18 0 13-5.82 13-13V14c0-7.18-5.82-13-13-13Z" fill="#fff" stroke="#DCDCDC" stroke-width="2"/><path d="M16 16h3.576v3.576H16V16Zm3.576 0h3.575v3.576h-3.575V16Zm3.575 0h3.576v3.576h-3.576V16Zm3.576 0h3.576v3.576h-3.576V16Zm3.576 0h3.576v3.576h-3.576V16Zm3.576 0h3.576v3.576h-3.576V16Zm3.576 0h3.575v3.576h-3.575V16Zm17.878 0h3.576v3.576h-3.576V16Zm17.88 0h3.575v3.576h-3.576V16Zm10.726 0h3.576v3.576H83.94V16Zm3.576 0h3.576v3.576h-3.576V16Zm3.576 0h3.576v3.576H91.09V16Zm3.576 0h3.575v3.576h-3.575V16Zm7.151 0h3.576v3.576h-3.576V16Zm7.152 0h3.575v3.576h-3.575V16Zm3.575 0h3.576v3.576h-3.576V16Zm3.576 0h3.576v3.576h-3.576V16Zm3.576 0h3.576v3.576h-3.576V16Zm3.576 0h3.575v3.576h-3.575V16Zm3.575 0h3.576v3.576h-3.576V16Zm3.576 0H134v3.576h-3.576V16ZM16 19.576h3.576v3.575H16v-3.575Zm21.455 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm10.727 0h3.576v3.575H83.94v-3.575Zm25.031 0h3.575v3.575h-3.575v-3.575Zm21.454 0H134v3.575h-3.576v-3.575ZM16 23.15h3.576v3.576H16v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576H83.94v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576H91.09v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0H134v3.576h-3.576v-3.576ZM16 26.727h3.576v3.576H16v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm17.878 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576H91.09v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0H134v3.576h-3.576v-3.576ZM16 30.303h3.576v3.576H16v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576H91.09v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0H134v3.576h-3.576v-3.576ZM16 33.879h3.576v3.576H16v-3.576Zm21.455 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm17.88 0h3.575v3.576h-3.576v-3.576Zm3.575 0h3.576v3.576H91.09v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm21.454 0H134v3.576h-3.576v-3.576ZM16 37.455h3.576v3.575H16v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0H134v3.575h-3.576v-3.575ZM51.758 41.03h3.575v3.576h-3.575V41.03Zm3.575 0h3.576v3.576h-3.576V41.03Zm10.728 0h3.575v3.576h-3.575V41.03Zm3.575 0h3.576v3.576h-3.576V41.03Zm14.303 0h3.576v3.576H83.94V41.03Zm14.303 0h3.576v3.576h-3.576V41.03Zm3.576 0h3.576v3.576h-3.576V41.03Zm-78.666 3.576h3.575v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576H41.03v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm28.606 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576H83.94v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576ZM16 48.182h3.576v3.576H16v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm17.879 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm14.303 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0H134v3.576h-3.576v-3.576ZM16 51.758h3.576v3.575H16v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575H41.03v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm10.727 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575H83.94v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575H91.09v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm10.727 0H134v3.575h-3.576v-3.575ZM16 55.333h3.576v3.576H16v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm21.455 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm14.303 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576ZM16 58.91h3.576v3.576H16v-3.576Zm21.455 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576H91.09v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576ZM16 62.485h3.576v3.576H16v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576Zm17.879 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576H91.09v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm21.454 0H134v3.576h-3.576v-3.576ZM16 66.06h3.576v3.575H16v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm10.728 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm10.727 0h3.576v3.575h-3.576v-3.575Zm10.727 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm10.727 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm7.151 0H134v3.575h-3.576v-3.575ZM16 69.636h3.576v3.576H16v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576H41.03v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576H83.94v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm17.878 0h3.576v3.576h-3.576v-3.576Zm3.576 0H134v3.576h-3.576v-3.576ZM19.576 73.212h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm21.455 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576ZM16 76.788h3.576v3.576H16v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576H41.03v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576H91.09v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm10.728 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0H134v3.576h-3.576v-3.576ZM16 80.364h3.576v3.575H16v-3.575Zm17.879 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm14.303 0h3.575v3.575h-3.575v-3.575Zm14.303 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.576v3.575h-3.576v-3.575Zm21.454 0h3.576v3.575h-3.576v-3.575Zm17.879 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0H134v3.575h-3.576v-3.575ZM19.576 83.939h3.575v3.576h-3.575V83.94Zm3.575 0h3.576v3.576h-3.576V83.94Zm3.576 0h3.576v3.576h-3.576V83.94Zm21.455 0h3.576v3.576h-3.576V83.94Zm14.303 0h3.576v3.576h-3.576V83.94Zm3.576 0h3.575v3.576h-3.575V83.94Zm7.151 0h3.576v3.576h-3.576V83.94Zm7.152 0h3.575v3.576h-3.575V83.94Zm17.878 0h3.576v3.576h-3.576V83.94Zm10.728 0h3.575v3.576h-3.575V83.94Zm3.575 0h3.576v3.576h-3.576V83.94Zm3.576 0h3.576v3.576h-3.576V83.94Zm3.576 0h3.576v3.576h-3.576V83.94Zm7.151 0h3.576v3.576h-3.576V83.94ZM16 87.515h3.576v3.576H16v-3.576Zm21.455 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576H41.03v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576Zm-92.97 3.576h3.576v3.576h-3.575V91.09Zm7.152 0h3.576v3.576h-3.576V91.09Zm3.576 0h3.576v3.576h-3.576V91.09Zm21.455 0h3.575v3.576h-3.575V91.09Zm7.151 0h3.576v3.576h-3.576V91.09Zm3.576 0h3.576v3.576h-3.576V91.09Zm3.576 0h3.575v3.576h-3.575V91.09Zm3.575 0h3.576v3.576h-3.576V91.09Zm7.152 0h3.576v3.576h-3.576V91.09Zm35.757 0h3.576v3.576h-3.576V91.09Zm7.152 0h3.576v3.576h-3.576V91.09Zm3.576 0h3.575v3.576h-3.575V91.09Zm7.151 0H134v3.576h-3.576V91.09ZM16 94.667h3.576v3.575H16v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575H41.03v-3.575Zm7.152 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm17.879 0h3.576v3.575h-3.576v-3.575Zm7.151 0h3.576v3.575H83.94v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm17.879 0H134v3.575h-3.576v-3.575ZM26.727 98.242h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm17.88 0h3.575v3.576h-3.576v-3.576Zm28.605 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0H134v3.576h-3.576v-3.576ZM16 101.818h3.576v3.576H16v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0H134v3.576h-3.576v-3.576Zm-85.818 3.576h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm17.88 0h3.575v3.576h-3.576v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576H83.94v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576H91.09v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm7.151 0H134v3.576h-3.576v-3.576ZM16 108.97h3.576v3.575H16v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm10.727 0h3.576v3.575h-3.576v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575H83.94v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm14.303 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm14.303 0H134v3.575h-3.576v-3.575ZM16 112.545h3.576v3.576H16v-3.576Zm21.455 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576H91.09v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm14.303 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0H134v3.576h-3.576v-3.576ZM16 116.121h3.576v3.576H16v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm14.303 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576H83.94v-3.576Zm7.152 0h3.576v3.576H91.09v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576ZM16 119.697h3.576v3.576H16v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm17.879 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576H91.09v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm3.575 0h3.576v3.576h-3.576v-3.576ZM16 123.273h3.576v3.575H16v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm7.152 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm10.728 0h3.575v3.575h-3.575v-3.575Zm3.575 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm21.454 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm14.303 0h3.576v3.575h-3.576v-3.575Zm3.576 0h3.576v3.575h-3.576v-3.575Zm7.151 0h3.576v3.575h-3.576v-3.575Zm3.576 0H134v3.575h-3.576v-3.575ZM16 126.848h3.576v3.576H16v-3.576Zm21.455 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm7.152 0h3.575v3.576h-3.575v-3.576Zm7.151 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576Zm10.727 0h3.576v3.576h-3.576v-3.576Zm3.576 0h3.575v3.576h-3.575v-3.576ZM16 130.424h3.576V134H16v-3.576Zm3.576 0h3.575V134h-3.575v-3.576Zm3.575 0h3.576V134h-3.576v-3.576Zm3.576 0h3.576V134h-3.576v-3.576Zm3.576 0h3.576V134h-3.576v-3.576Zm3.576 0h3.576V134h-3.576v-3.576Zm3.576 0h3.575V134h-3.575v-3.576Zm10.727 0h3.576V134h-3.576v-3.576Zm3.576 0h3.575V134h-3.575v-3.576Zm3.575 0h3.576V134h-3.576v-3.576Zm3.576 0h3.576V134h-3.576v-3.576Zm3.576 0h3.576V134h-3.576v-3.576Zm14.303 0h3.576V134h-3.576v-3.576Zm25.03 0h3.576V134h-3.576v-3.576Zm3.576 0h3.576V134h-3.576v-3.576Zm3.576 0h3.575V134h-3.575v-3.576Zm7.151 0h3.576V134h-3.576v-3.576Zm3.576 0h3.576V134h-3.576v-3.576Zm3.576 0h3.575V134h-3.575v-3.576Zm7.151 0H134V134h-3.576v-3.576Z" fill="#000"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h150v150H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mobile-download-qr-existing-user.svg b/browser/components/aboutwelcome/assets/mobile-download-qr-existing-user.svg
new file mode 100644
index 0000000000..8c1662bf48
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mobile-download-qr-existing-user.svg
@@ -0,0 +1,7 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="150" height="150" viewBox="0 0 150 150" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect x="1" y="1" width="148" height="148" rx="13" fill="white" stroke="#DCDCDC" stroke-width="2"/>
+<path d="M16 16H20.069V20.069H16V16ZM20.069 16H24.1379V20.069H20.069V16ZM24.1379 16H28.2069V20.069H24.1379V16ZM28.2069 16H32.2759V20.069H28.2069V16ZM32.2759 16H36.3448V20.069H32.2759V16ZM36.3448 16H40.4138V20.069H36.3448V16ZM40.4138 16H44.4828V20.069H40.4138V16ZM64.8276 16H68.8966V20.069H64.8276V16ZM68.8966 16H72.9655V20.069H68.8966V16ZM77.0345 16H81.1034V20.069H77.0345V16ZM81.1034 16H85.1724V20.069H81.1034V16ZM85.1724 16H89.2414V20.069H85.1724V16ZM89.2414 16H93.3103V20.069H89.2414V16ZM93.3103 16H97.3793V20.069H93.3103V16ZM105.517 16H109.586V20.069H105.517V16ZM109.586 16H113.655V20.069H109.586V16ZM113.655 16H117.724V20.069H113.655V16ZM117.724 16H121.793V20.069H117.724V16ZM121.793 16H125.862V20.069H121.793V16ZM125.862 16H129.931V20.069H125.862V16ZM129.931 16H134V20.069H129.931V16ZM16 20.069H20.069V24.1379H16V20.069ZM40.4138 20.069H44.4828V24.1379H40.4138V20.069ZM48.5517 20.069H52.6207V24.1379H48.5517V20.069ZM56.6897 20.069H60.7586V24.1379H56.6897V20.069ZM68.8966 20.069H72.9655V24.1379H68.8966V20.069ZM72.9655 20.069H77.0345V24.1379H72.9655V20.069ZM77.0345 20.069H81.1034V24.1379H77.0345V20.069ZM81.1034 20.069H85.1724V24.1379H81.1034V20.069ZM97.3793 20.069H101.448V24.1379H97.3793V20.069ZM105.517 20.069H109.586V24.1379H105.517V20.069ZM129.931 20.069H134V24.1379H129.931V20.069ZM16 24.1379H20.069V28.2069H16V24.1379ZM24.1379 24.1379H28.2069V28.2069H24.1379V24.1379ZM28.2069 24.1379H32.2759V28.2069H28.2069V24.1379ZM32.2759 24.1379H36.3448V28.2069H32.2759V24.1379ZM40.4138 24.1379H44.4828V28.2069H40.4138V24.1379ZM52.6207 24.1379H56.6897V28.2069H52.6207V24.1379ZM56.6897 24.1379H60.7586V28.2069H56.6897V24.1379ZM60.7586 24.1379H64.8276V28.2069H60.7586V24.1379ZM81.1034 24.1379H85.1724V28.2069H81.1034V24.1379ZM85.1724 24.1379H89.2414V28.2069H85.1724V24.1379ZM93.3103 24.1379H97.3793V28.2069H93.3103V24.1379ZM97.3793 24.1379H101.448V28.2069H97.3793V24.1379ZM105.517 24.1379H109.586V28.2069H105.517V24.1379ZM113.655 24.1379H117.724V28.2069H113.655V24.1379ZM117.724 24.1379H121.793V28.2069H117.724V24.1379ZM121.793 24.1379H125.862V28.2069H121.793V24.1379ZM129.931 24.1379H134V28.2069H129.931V24.1379ZM16 28.2069H20.069V32.2759H16V28.2069ZM24.1379 28.2069H28.2069V32.2759H24.1379V28.2069ZM28.2069 28.2069H32.2759V32.2759H28.2069V28.2069ZM32.2759 28.2069H36.3448V32.2759H32.2759V28.2069ZM40.4138 28.2069H44.4828V32.2759H40.4138V28.2069ZM56.6897 28.2069H60.7586V32.2759H56.6897V28.2069ZM60.7586 28.2069H64.8276V32.2759H60.7586V28.2069ZM68.8966 28.2069H72.9655V32.2759H68.8966V28.2069ZM72.9655 28.2069H77.0345V32.2759H72.9655V28.2069ZM77.0345 28.2069H81.1034V32.2759H77.0345V28.2069ZM93.3103 28.2069H97.3793V32.2759H93.3103V28.2069ZM105.517 28.2069H109.586V32.2759H105.517V28.2069ZM113.655 28.2069H117.724V32.2759H113.655V28.2069ZM117.724 28.2069H121.793V32.2759H117.724V28.2069ZM121.793 28.2069H125.862V32.2759H121.793V28.2069ZM129.931 28.2069H134V32.2759H129.931V28.2069ZM16 32.2759H20.069V36.3448H16V32.2759ZM24.1379 32.2759H28.2069V36.3448H24.1379V32.2759ZM28.2069 32.2759H32.2759V36.3448H28.2069V32.2759ZM32.2759 32.2759H36.3448V36.3448H32.2759V32.2759ZM40.4138 32.2759H44.4828V36.3448H40.4138V32.2759ZM60.7586 32.2759H64.8276V36.3448H60.7586V32.2759ZM64.8276 32.2759H68.8966V36.3448H64.8276V32.2759ZM68.8966 32.2759H72.9655V36.3448H68.8966V32.2759ZM72.9655 32.2759H77.0345V36.3448H72.9655V32.2759ZM77.0345 32.2759H81.1034V36.3448H77.0345V32.2759ZM81.1034 32.2759H85.1724V36.3448H81.1034V32.2759ZM89.2414 32.2759H93.3103V36.3448H89.2414V32.2759ZM105.517 32.2759H109.586V36.3448H105.517V32.2759ZM113.655 32.2759H117.724V36.3448H113.655V32.2759ZM117.724 32.2759H121.793V36.3448H117.724V32.2759ZM121.793 32.2759H125.862V36.3448H121.793V32.2759ZM129.931 32.2759H134V36.3448H129.931V32.2759ZM16 36.3448H20.069V40.4138H16V36.3448ZM40.4138 36.3448H44.4828V40.4138H40.4138V36.3448ZM48.5517 36.3448H52.6207V40.4138H48.5517V36.3448ZM52.6207 36.3448H56.6897V40.4138H52.6207V36.3448ZM56.6897 36.3448H60.7586V40.4138H56.6897V36.3448ZM60.7586 36.3448H64.8276V40.4138H60.7586V36.3448ZM68.8966 36.3448H72.9655V40.4138H68.8966V36.3448ZM77.0345 36.3448H81.1034V40.4138H77.0345V36.3448ZM89.2414 36.3448H93.3103V40.4138H89.2414V36.3448ZM93.3103 36.3448H97.3793V40.4138H93.3103V36.3448ZM97.3793 36.3448H101.448V40.4138H97.3793V36.3448ZM105.517 36.3448H109.586V40.4138H105.517V36.3448ZM129.931 36.3448H134V40.4138H129.931V36.3448ZM16 40.4138H20.069V44.4828H16V40.4138ZM20.069 40.4138H24.1379V44.4828H20.069V40.4138ZM24.1379 40.4138H28.2069V44.4828H24.1379V40.4138ZM28.2069 40.4138H32.2759V44.4828H28.2069V40.4138ZM32.2759 40.4138H36.3448V44.4828H32.2759V40.4138ZM36.3448 40.4138H40.4138V44.4828H36.3448V40.4138ZM40.4138 40.4138H44.4828V44.4828H40.4138V40.4138ZM48.5517 40.4138H52.6207V44.4828H48.5517V40.4138ZM56.6897 40.4138H60.7586V44.4828H56.6897V40.4138ZM64.8276 40.4138H68.8966V44.4828H64.8276V40.4138ZM72.9655 40.4138H77.0345V44.4828H72.9655V40.4138ZM81.1034 40.4138H85.1724V44.4828H81.1034V40.4138ZM89.2414 40.4138H93.3103V44.4828H89.2414V40.4138ZM97.3793 40.4138H101.448V44.4828H97.3793V40.4138ZM105.517 40.4138H109.586V44.4828H105.517V40.4138ZM109.586 40.4138H113.655V44.4828H109.586V40.4138ZM113.655 40.4138H117.724V44.4828H113.655V40.4138ZM117.724 40.4138H121.793V44.4828H117.724V40.4138ZM121.793 40.4138H125.862V44.4828H121.793V40.4138ZM125.862 40.4138H129.931V44.4828H125.862V40.4138ZM129.931 40.4138H134V44.4828H129.931V40.4138ZM48.5517 44.4828H52.6207V48.5517H48.5517V44.4828ZM52.6207 44.4828H56.6897V48.5517H52.6207V44.4828ZM56.6897 44.4828H60.7586V48.5517H56.6897V44.4828ZM72.9655 44.4828H77.0345V48.5517H72.9655V44.4828ZM77.0345 44.4828H81.1034V48.5517H77.0345V44.4828ZM85.1724 44.4828H89.2414V48.5517H85.1724V44.4828ZM89.2414 44.4828H93.3103V48.5517H89.2414V44.4828ZM93.3103 44.4828H97.3793V48.5517H93.3103V44.4828ZM32.2759 48.5517H36.3448V52.6207H32.2759V48.5517ZM36.3448 48.5517H40.4138V52.6207H36.3448V48.5517ZM40.4138 48.5517H44.4828V52.6207H40.4138V48.5517ZM44.4828 48.5517H48.5517V52.6207H44.4828V48.5517ZM52.6207 48.5517H56.6897V52.6207H52.6207V48.5517ZM60.7586 48.5517H64.8276V52.6207H60.7586V48.5517ZM64.8276 48.5517H68.8966V52.6207H64.8276V48.5517ZM68.8966 48.5517H72.9655V52.6207H68.8966V48.5517ZM77.0345 48.5517H81.1034V52.6207H77.0345V48.5517ZM81.1034 48.5517H85.1724V52.6207H81.1034V48.5517ZM89.2414 48.5517H93.3103V52.6207H89.2414V48.5517ZM97.3793 48.5517H101.448V52.6207H97.3793V48.5517ZM105.517 48.5517H109.586V52.6207H105.517V48.5517ZM109.586 48.5517H113.655V52.6207H109.586V48.5517ZM125.862 48.5517H129.931V52.6207H125.862V48.5517ZM16 52.6207H20.069V56.6897H16V52.6207ZM20.069 52.6207H24.1379V56.6897H20.069V52.6207ZM28.2069 52.6207H32.2759V56.6897H28.2069V52.6207ZM36.3448 52.6207H40.4138V56.6897H36.3448V52.6207ZM44.4828 52.6207H48.5517V56.6897H44.4828V52.6207ZM48.5517 52.6207H52.6207V56.6897H48.5517V52.6207ZM56.6897 52.6207H60.7586V56.6897H56.6897V52.6207ZM60.7586 52.6207H64.8276V56.6897H60.7586V52.6207ZM68.8966 52.6207H72.9655V56.6897H68.8966V52.6207ZM93.3103 52.6207H97.3793V56.6897H93.3103V52.6207ZM97.3793 52.6207H101.448V56.6897H97.3793V52.6207ZM109.586 52.6207H113.655V56.6897H109.586V52.6207ZM113.655 52.6207H117.724V56.6897H113.655V52.6207ZM117.724 52.6207H121.793V56.6897H117.724V52.6207ZM121.793 52.6207H125.862V56.6897H121.793V52.6207ZM125.862 52.6207H129.931V56.6897H125.862V52.6207ZM129.931 52.6207H134V56.6897H129.931V52.6207ZM16 56.6897H20.069V60.7586H16V56.6897ZM20.069 56.6897H24.1379V60.7586H20.069V56.6897ZM24.1379 56.6897H28.2069V60.7586H24.1379V56.6897ZM28.2069 56.6897H32.2759V60.7586H28.2069V56.6897ZM32.2759 56.6897H36.3448V60.7586H32.2759V56.6897ZM40.4138 56.6897H44.4828V60.7586H40.4138V56.6897ZM44.4828 56.6897H48.5517V60.7586H44.4828V56.6897ZM52.6207 56.6897H56.6897V60.7586H52.6207V56.6897ZM60.7586 56.6897H64.8276V60.7586H60.7586V56.6897ZM64.8276 56.6897H68.8966V60.7586H64.8276V56.6897ZM68.8966 56.6897H72.9655V60.7586H68.8966V56.6897ZM72.9655 56.6897H77.0345V60.7586H72.9655V56.6897ZM77.0345 56.6897H81.1034V60.7586H77.0345V56.6897ZM81.1034 56.6897H85.1724V60.7586H81.1034V56.6897ZM85.1724 56.6897H89.2414V60.7586H85.1724V56.6897ZM89.2414 56.6897H93.3103V60.7586H89.2414V56.6897ZM101.448 56.6897H105.517V60.7586H101.448V56.6897ZM113.655 56.6897H117.724V60.7586H113.655V56.6897ZM117.724 56.6897H121.793V60.7586H117.724V56.6897ZM129.931 56.6897H134V60.7586H129.931V56.6897ZM16 60.7586H20.069V64.8276H16V60.7586ZM24.1379 60.7586H28.2069V64.8276H24.1379V60.7586ZM28.2069 60.7586H32.2759V64.8276H28.2069V60.7586ZM32.2759 60.7586H36.3448V64.8276H32.2759V60.7586ZM48.5517 60.7586H52.6207V64.8276H48.5517V60.7586ZM56.6897 60.7586H60.7586V64.8276H56.6897V60.7586ZM64.8276 60.7586H68.8966V64.8276H64.8276V60.7586ZM72.9655 60.7586H77.0345V64.8276H72.9655V60.7586ZM85.1724 60.7586H89.2414V64.8276H85.1724V60.7586ZM89.2414 60.7586H93.3103V64.8276H89.2414V60.7586ZM101.448 60.7586H105.517V64.8276H101.448V60.7586ZM125.862 60.7586H129.931V64.8276H125.862V60.7586ZM129.931 60.7586H134V64.8276H129.931V60.7586ZM20.069 64.8276H24.1379V68.8966H20.069V64.8276ZM24.1379 64.8276H28.2069V68.8966H24.1379V64.8276ZM32.2759 64.8276H36.3448V68.8966H32.2759V64.8276ZM36.3448 64.8276H40.4138V68.8966H36.3448V64.8276ZM40.4138 64.8276H44.4828V68.8966H40.4138V64.8276ZM48.5517 64.8276H52.6207V68.8966H48.5517V64.8276ZM64.8276 64.8276H68.8966V68.8966H64.8276V64.8276ZM68.8966 64.8276H72.9655V68.8966H68.8966V64.8276ZM72.9655 64.8276H77.0345V68.8966H72.9655V64.8276ZM85.1724 64.8276H89.2414V68.8966H85.1724V64.8276ZM93.3103 64.8276H97.3793V68.8966H93.3103V64.8276ZM109.586 64.8276H113.655V68.8966H109.586V64.8276ZM117.724 64.8276H121.793V68.8966H117.724V64.8276ZM129.931 64.8276H134V68.8966H129.931V64.8276ZM20.069 68.8966H24.1379V72.9655H20.069V68.8966ZM24.1379 68.8966H28.2069V72.9655H24.1379V68.8966ZM28.2069 68.8966H32.2759V72.9655H28.2069V68.8966ZM36.3448 68.8966H40.4138V72.9655H36.3448V68.8966ZM44.4828 68.8966H48.5517V72.9655H44.4828V68.8966ZM48.5517 68.8966H52.6207V72.9655H48.5517V68.8966ZM52.6207 68.8966H56.6897V72.9655H52.6207V68.8966ZM68.8966 68.8966H72.9655V72.9655H68.8966V68.8966ZM77.0345 68.8966H81.1034V72.9655H77.0345V68.8966ZM85.1724 68.8966H89.2414V72.9655H85.1724V68.8966ZM89.2414 68.8966H93.3103V72.9655H89.2414V68.8966ZM105.517 68.8966H109.586V72.9655H105.517V68.8966ZM113.655 68.8966H117.724V72.9655H113.655V68.8966ZM121.793 68.8966H125.862V72.9655H121.793V68.8966ZM129.931 68.8966H134V72.9655H129.931V68.8966ZM16 72.9655H20.069V77.0345H16V72.9655ZM28.2069 72.9655H32.2759V77.0345H28.2069V72.9655ZM40.4138 72.9655H44.4828V77.0345H40.4138V72.9655ZM44.4828 72.9655H48.5517V77.0345H44.4828V72.9655ZM48.5517 72.9655H52.6207V77.0345H48.5517V72.9655ZM52.6207 72.9655H56.6897V77.0345H52.6207V72.9655ZM64.8276 72.9655H68.8966V77.0345H64.8276V72.9655ZM68.8966 72.9655H72.9655V77.0345H68.8966V72.9655ZM72.9655 72.9655H77.0345V77.0345H72.9655V72.9655ZM77.0345 72.9655H81.1034V77.0345H77.0345V72.9655ZM81.1034 72.9655H85.1724V77.0345H81.1034V72.9655ZM97.3793 72.9655H101.448V77.0345H97.3793V72.9655ZM113.655 72.9655H117.724V77.0345H113.655V72.9655ZM129.931 72.9655H134V77.0345H129.931V72.9655ZM16 77.0345H20.069V81.1034H16V77.0345ZM20.069 77.0345H24.1379V81.1034H20.069V77.0345ZM24.1379 77.0345H28.2069V81.1034H24.1379V77.0345ZM28.2069 77.0345H32.2759V81.1034H28.2069V77.0345ZM44.4828 77.0345H48.5517V81.1034H44.4828V77.0345ZM48.5517 77.0345H52.6207V81.1034H48.5517V77.0345ZM52.6207 77.0345H56.6897V81.1034H52.6207V77.0345ZM56.6897 77.0345H60.7586V81.1034H56.6897V77.0345ZM72.9655 77.0345H77.0345V81.1034H72.9655V77.0345ZM77.0345 77.0345H81.1034V81.1034H77.0345V77.0345ZM85.1724 77.0345H89.2414V81.1034H85.1724V77.0345ZM97.3793 77.0345H101.448V81.1034H97.3793V77.0345ZM101.448 77.0345H105.517V81.1034H101.448V77.0345ZM109.586 77.0345H113.655V81.1034H109.586V77.0345ZM117.724 77.0345H121.793V81.1034H117.724V77.0345ZM125.862 77.0345H129.931V81.1034H125.862V77.0345ZM129.931 77.0345H134V81.1034H129.931V77.0345ZM24.1379 81.1034H28.2069V85.1724H24.1379V81.1034ZM28.2069 81.1034H32.2759V85.1724H28.2069V81.1034ZM36.3448 81.1034H40.4138V85.1724H36.3448V81.1034ZM40.4138 81.1034H44.4828V85.1724H40.4138V81.1034ZM48.5517 81.1034H52.6207V85.1724H48.5517V81.1034ZM64.8276 81.1034H68.8966V85.1724H64.8276V81.1034ZM68.8966 81.1034H72.9655V85.1724H68.8966V81.1034ZM81.1034 81.1034H85.1724V85.1724H81.1034V81.1034ZM89.2414 81.1034H93.3103V85.1724H89.2414V81.1034ZM109.586 81.1034H113.655V85.1724H109.586V81.1034ZM113.655 81.1034H117.724V85.1724H113.655V81.1034ZM125.862 81.1034H129.931V85.1724H125.862V81.1034ZM129.931 81.1034H134V85.1724H129.931V81.1034ZM16 85.1724H20.069V89.2414H16V85.1724ZM24.1379 85.1724H28.2069V89.2414H24.1379V85.1724ZM44.4828 85.1724H48.5517V89.2414H44.4828V85.1724ZM48.5517 85.1724H52.6207V89.2414H48.5517V85.1724ZM52.6207 85.1724H56.6897V89.2414H52.6207V85.1724ZM64.8276 85.1724H68.8966V89.2414H64.8276V85.1724ZM68.8966 85.1724H72.9655V89.2414H68.8966V85.1724ZM72.9655 85.1724H77.0345V89.2414H72.9655V85.1724ZM77.0345 85.1724H81.1034V89.2414H77.0345V85.1724ZM93.3103 85.1724H97.3793V89.2414H93.3103V85.1724ZM101.448 85.1724H105.517V89.2414H101.448V85.1724ZM105.517 85.1724H109.586V89.2414H105.517V85.1724ZM109.586 85.1724H113.655V89.2414H109.586V85.1724ZM113.655 85.1724H117.724V89.2414H113.655V85.1724ZM129.931 85.1724H134V89.2414H129.931V85.1724ZM24.1379 89.2414H28.2069V93.3103H24.1379V89.2414ZM28.2069 89.2414H32.2759V93.3103H28.2069V89.2414ZM32.2759 89.2414H36.3448V93.3103H32.2759V89.2414ZM40.4138 89.2414H44.4828V93.3103H40.4138V89.2414ZM44.4828 89.2414H48.5517V93.3103H44.4828V89.2414ZM64.8276 89.2414H68.8966V93.3103H64.8276V89.2414ZM81.1034 89.2414H85.1724V93.3103H81.1034V89.2414ZM85.1724 89.2414H89.2414V93.3103H85.1724V89.2414ZM97.3793 89.2414H101.448V93.3103H97.3793V89.2414ZM109.586 89.2414H113.655V93.3103H109.586V89.2414ZM113.655 89.2414H117.724V93.3103H113.655V89.2414ZM117.724 89.2414H121.793V93.3103H117.724V89.2414ZM121.793 89.2414H125.862V93.3103H121.793V89.2414ZM129.931 89.2414H134V93.3103H129.931V89.2414ZM32.2759 93.3103H36.3448V97.3793H32.2759V93.3103ZM44.4828 93.3103H48.5517V97.3793H44.4828V93.3103ZM48.5517 93.3103H52.6207V97.3793H48.5517V93.3103ZM52.6207 93.3103H56.6897V97.3793H52.6207V93.3103ZM56.6897 93.3103H60.7586V97.3793H56.6897V93.3103ZM68.8966 93.3103H72.9655V97.3793H68.8966V93.3103ZM77.0345 93.3103H81.1034V97.3793H77.0345V93.3103ZM81.1034 93.3103H85.1724V97.3793H81.1034V93.3103ZM85.1724 93.3103H89.2414V97.3793H85.1724V93.3103ZM93.3103 93.3103H97.3793V97.3793H93.3103V93.3103ZM109.586 93.3103H113.655V97.3793H109.586V93.3103ZM125.862 93.3103H129.931V97.3793H125.862V93.3103ZM16 97.3793H20.069V101.448H16V97.3793ZM20.069 97.3793H24.1379V101.448H20.069V97.3793ZM24.1379 97.3793H28.2069V101.448H24.1379V97.3793ZM32.2759 97.3793H36.3448V101.448H32.2759V97.3793ZM36.3448 97.3793H40.4138V101.448H36.3448V97.3793ZM40.4138 97.3793H44.4828V101.448H40.4138V97.3793ZM44.4828 97.3793H48.5517V101.448H44.4828V97.3793ZM52.6207 97.3793H56.6897V101.448H52.6207V97.3793ZM60.7586 97.3793H64.8276V101.448H60.7586V97.3793ZM68.8966 97.3793H72.9655V101.448H68.8966V97.3793ZM72.9655 97.3793H77.0345V101.448H72.9655V97.3793ZM77.0345 97.3793H81.1034V101.448H77.0345V97.3793ZM85.1724 97.3793H89.2414V101.448H85.1724V97.3793ZM89.2414 97.3793H93.3103V101.448H89.2414V97.3793ZM97.3793 97.3793H101.448V101.448H97.3793V97.3793ZM101.448 97.3793H105.517V101.448H101.448V97.3793ZM105.517 97.3793H109.586V101.448H105.517V97.3793ZM109.586 97.3793H113.655V101.448H109.586V97.3793ZM113.655 97.3793H117.724V101.448H113.655V97.3793ZM125.862 97.3793H129.931V101.448H125.862V97.3793ZM48.5517 101.448H52.6207V105.517H48.5517V101.448ZM56.6897 101.448H60.7586V105.517H56.6897V101.448ZM72.9655 101.448H77.0345V105.517H72.9655V101.448ZM77.0345 101.448H81.1034V105.517H77.0345V101.448ZM81.1034 101.448H85.1724V105.517H81.1034V101.448ZM85.1724 101.448H89.2414V105.517H85.1724V101.448ZM89.2414 101.448H93.3103V105.517H89.2414V101.448ZM93.3103 101.448H97.3793V105.517H93.3103V101.448ZM97.3793 101.448H101.448V105.517H97.3793V101.448ZM113.655 101.448H117.724V105.517H113.655V101.448ZM121.793 101.448H125.862V105.517H121.793V101.448ZM129.931 101.448H134V105.517H129.931V101.448ZM16 105.517H20.069V109.586H16V105.517ZM20.069 105.517H24.1379V109.586H20.069V105.517ZM24.1379 105.517H28.2069V109.586H24.1379V105.517ZM28.2069 105.517H32.2759V109.586H28.2069V105.517ZM32.2759 105.517H36.3448V109.586H32.2759V105.517ZM36.3448 105.517H40.4138V109.586H36.3448V105.517ZM40.4138 105.517H44.4828V109.586H40.4138V105.517ZM48.5517 105.517H52.6207V109.586H48.5517V105.517ZM64.8276 105.517H68.8966V109.586H64.8276V105.517ZM68.8966 105.517H72.9655V109.586H68.8966V105.517ZM89.2414 105.517H93.3103V109.586H89.2414V105.517ZM93.3103 105.517H97.3793V109.586H93.3103V105.517ZM97.3793 105.517H101.448V109.586H97.3793V105.517ZM105.517 105.517H109.586V109.586H105.517V105.517ZM113.655 105.517H117.724V109.586H113.655V105.517ZM129.931 105.517H134V109.586H129.931V105.517ZM16 109.586H20.069V113.655H16V109.586ZM40.4138 109.586H44.4828V113.655H40.4138V109.586ZM48.5517 109.586H52.6207V113.655H48.5517V109.586ZM52.6207 109.586H56.6897V113.655H52.6207V109.586ZM72.9655 109.586H77.0345V113.655H72.9655V109.586ZM85.1724 109.586H89.2414V113.655H85.1724V109.586ZM89.2414 109.586H93.3103V113.655H89.2414V109.586ZM93.3103 109.586H97.3793V113.655H93.3103V109.586ZM97.3793 109.586H101.448V113.655H97.3793V109.586ZM113.655 109.586H117.724V113.655H113.655V109.586ZM117.724 109.586H121.793V113.655H117.724V109.586ZM125.862 109.586H129.931V113.655H125.862V109.586ZM16 113.655H20.069V117.724H16V113.655ZM24.1379 113.655H28.2069V117.724H24.1379V113.655ZM28.2069 113.655H32.2759V117.724H28.2069V113.655ZM32.2759 113.655H36.3448V117.724H32.2759V113.655ZM40.4138 113.655H44.4828V117.724H40.4138V113.655ZM48.5517 113.655H52.6207V117.724H48.5517V113.655ZM52.6207 113.655H56.6897V117.724H52.6207V113.655ZM68.8966 113.655H72.9655V117.724H68.8966V113.655ZM72.9655 113.655H77.0345V117.724H72.9655V113.655ZM77.0345 113.655H81.1034V117.724H77.0345V113.655ZM85.1724 113.655H89.2414V117.724H85.1724V113.655ZM93.3103 113.655H97.3793V117.724H93.3103V113.655ZM97.3793 113.655H101.448V117.724H97.3793V113.655ZM101.448 113.655H105.517V117.724H101.448V113.655ZM105.517 113.655H109.586V117.724H105.517V113.655ZM109.586 113.655H113.655V117.724H109.586V113.655ZM113.655 113.655H117.724V117.724H113.655V113.655ZM125.862 113.655H129.931V117.724H125.862V113.655ZM129.931 113.655H134V117.724H129.931V113.655ZM16 117.724H20.069V121.793H16V117.724ZM24.1379 117.724H28.2069V121.793H24.1379V117.724ZM28.2069 117.724H32.2759V121.793H28.2069V117.724ZM32.2759 117.724H36.3448V121.793H32.2759V117.724ZM40.4138 117.724H44.4828V121.793H40.4138V117.724ZM56.6897 117.724H60.7586V121.793H56.6897V117.724ZM60.7586 117.724H64.8276V121.793H60.7586V117.724ZM81.1034 117.724H85.1724V121.793H81.1034V117.724ZM85.1724 117.724H89.2414V121.793H85.1724V117.724ZM89.2414 117.724H93.3103V121.793H89.2414V117.724ZM109.586 117.724H113.655V121.793H109.586V117.724ZM117.724 117.724H121.793V121.793H117.724V117.724ZM121.793 117.724H125.862V121.793H121.793V117.724ZM125.862 117.724H129.931V121.793H125.862V117.724ZM16 121.793H20.069V125.862H16V121.793ZM24.1379 121.793H28.2069V125.862H24.1379V121.793ZM28.2069 121.793H32.2759V125.862H28.2069V121.793ZM32.2759 121.793H36.3448V125.862H32.2759V121.793ZM40.4138 121.793H44.4828V125.862H40.4138V121.793ZM56.6897 121.793H60.7586V125.862H56.6897V121.793ZM64.8276 121.793H68.8966V125.862H64.8276V121.793ZM72.9655 121.793H77.0345V125.862H72.9655V121.793ZM81.1034 121.793H85.1724V125.862H81.1034V121.793ZM85.1724 121.793H89.2414V125.862H85.1724V121.793ZM89.2414 121.793H93.3103V125.862H89.2414V121.793ZM93.3103 121.793H97.3793V125.862H93.3103V121.793ZM97.3793 121.793H101.448V125.862H97.3793V121.793ZM101.448 121.793H105.517V125.862H101.448V121.793ZM117.724 121.793H121.793V125.862H117.724V121.793ZM121.793 121.793H125.862V125.862H121.793V121.793ZM125.862 121.793H129.931V125.862H125.862V121.793ZM129.931 121.793H134V125.862H129.931V121.793ZM16 125.862H20.069V129.931H16V125.862ZM40.4138 125.862H44.4828V129.931H40.4138V125.862ZM52.6207 125.862H56.6897V129.931H52.6207V125.862ZM60.7586 125.862H64.8276V129.931H60.7586V125.862ZM64.8276 125.862H68.8966V129.931H64.8276V125.862ZM72.9655 125.862H77.0345V129.931H72.9655V125.862ZM77.0345 125.862H81.1034V129.931H77.0345V125.862ZM89.2414 125.862H93.3103V129.931H89.2414V125.862ZM101.448 125.862H105.517V129.931H101.448V125.862ZM105.517 125.862H109.586V129.931H105.517V125.862ZM109.586 125.862H113.655V129.931H109.586V125.862ZM117.724 125.862H121.793V129.931H117.724V125.862ZM125.862 125.862H129.931V129.931H125.862V125.862ZM129.931 125.862H134V129.931H129.931V125.862ZM16 129.931H20.069V134H16V129.931ZM20.069 129.931H24.1379V134H20.069V129.931ZM24.1379 129.931H28.2069V134H24.1379V129.931ZM28.2069 129.931H32.2759V134H28.2069V129.931ZM32.2759 129.931H36.3448V134H32.2759V129.931ZM36.3448 129.931H40.4138V134H36.3448V129.931ZM40.4138 129.931H44.4828V134H40.4138V129.931ZM52.6207 129.931H56.6897V134H52.6207V129.931ZM56.6897 129.931H60.7586V134H56.6897V129.931ZM64.8276 129.931H68.8966V134H64.8276V129.931ZM72.9655 129.931H77.0345V134H72.9655V129.931ZM81.1034 129.931H85.1724V134H81.1034V129.931ZM89.2414 129.931H93.3103V134H89.2414V129.931ZM97.3793 129.931H101.448V134H97.3793V129.931ZM113.655 129.931H117.724V134H113.655V129.931ZM121.793 129.931H125.862V134H121.793V129.931ZM125.862 129.931H129.931V134H125.862V129.931Z" fill="black"/>
+</svg>
diff --git a/browser/components/aboutwelcome/assets/mobile-download-qr-new-user-cn.svg b/browser/components/aboutwelcome/assets/mobile-download-qr-new-user-cn.svg
new file mode 100644
index 0000000000..cf25a0e18d
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mobile-download-qr-new-user-cn.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="98" height="98" viewBox="0 0 98 98" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M90 0H8a8 8 0 0 0-8 8v82a8 8 0 0 0 8 8h82a8 8 0 0 0 8-8V8a8 8 0 0 0-8-8Z" fill="#fff"/><path d="M11 11h2.328v2.328H11V11Zm2.328 0h2.327v2.328h-2.327V11Zm2.327 0h2.328v2.328h-2.328V11Zm2.328 0h2.327v2.328h-2.327V11Zm2.327 0h2.328v2.328H20.31V11Zm2.328 0h2.327v2.328h-2.327V11Zm2.327 0h2.328v2.328h-2.328V11Zm11.638 0h2.328v2.328h-2.328V11Zm11.638 0h2.328v2.328H48.24V11Zm6.983 0h2.328v2.328h-2.328V11Zm2.328 0h2.327v2.328h-2.328V11Zm2.327 0h2.328v2.328h-2.328V11Zm2.328 0h2.327v2.328h-2.327V11Zm4.655 0h2.327v2.328h-2.327V11Zm4.655 0h2.328v2.328h-2.328V11Zm2.328 0h2.327v2.328h-2.328V11Zm2.327 0H78.5v2.328h-2.328V11Zm2.328 0h2.327v2.328H78.5V11Zm2.327 0h2.328v2.328h-2.328V11Zm2.328 0h2.327v2.328h-2.327V11Zm2.327 0h2.328v2.328h-2.328V11ZM11 13.328h2.328v2.327H11v-2.327Zm13.965 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327H38.93v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327H48.24v-2.327Zm6.983 0h2.328v2.327h-2.328v-2.327Zm16.293 0h2.328v2.327h-2.328v-2.327Zm13.965 0h2.328v2.327h-2.328v-2.327ZM11 15.655h2.328v2.328H11v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.656 0h2.327v2.328h-2.327v-2.328Zm9.31 0h2.328v2.328H38.93v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328Zm6.982 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.655 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328ZM11 17.983h2.328v2.327H11v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327H20.31v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.327v2.327h-2.327v-2.327Zm11.638 0h2.327v2.327h-2.327v-2.327Zm6.982 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm6.983 0h2.328v2.327h-2.328v-2.327Zm4.655 0H78.5v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327H78.5v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327ZM11 20.31h2.328v2.328H11V20.31Zm4.655 0h2.328v2.328h-2.328V20.31Zm2.328 0h2.327v2.328h-2.327V20.31Zm2.327 0h2.328v2.328H20.31V20.31Zm4.655 0h2.328v2.328h-2.328V20.31Zm4.656 0h2.327v2.328h-2.327V20.31Zm4.655 0h2.327v2.328h-2.327V20.31Zm2.327 0h2.328v2.328h-2.328V20.31Zm2.328 0h2.328v2.328H38.93V20.31Zm4.655 0h2.328v2.328h-2.328V20.31Zm4.655 0h2.328v2.328H48.24V20.31Zm2.328 0h2.327v2.328H50.57V20.31Zm2.327 0h2.328v2.328h-2.328V20.31Zm2.328 0h2.328v2.328h-2.328V20.31Zm2.328 0h2.327v2.328h-2.328V20.31Zm2.327 0h2.328v2.328h-2.328V20.31Zm2.328 0h2.327v2.328h-2.327V20.31Zm2.327 0h2.328v2.328h-2.328V20.31Zm6.983 0h2.328v2.328h-2.328V20.31Zm4.655 0H78.5v2.328h-2.328V20.31Zm2.328 0h2.327v2.328H78.5V20.31Zm2.327 0h2.328v2.328h-2.328V20.31Zm4.655 0h2.328v2.328h-2.328V20.31ZM11 22.638h2.328v2.327H11v-2.327Zm13.965 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.328v2.327H38.93v-2.327Zm9.31 0h2.328v2.327H48.24v-2.327Zm11.638 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm6.983 0h2.328v2.327h-2.328v-2.327Zm13.965 0h2.328v2.327h-2.328v-2.327ZM11 24.965h2.328v2.328H11v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.656 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.328v2.328H38.93v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328H48.24v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.656 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm2.327 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm-51.206 2.328h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm9.31 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm6.982 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm-51.207 2.328h2.328v2.327h-2.328v-2.327Zm6.983 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm6.982 0h2.328v2.327h-2.328v-2.327Zm9.31 0h2.328v2.327h-2.327v-2.327Zm2.328 0h2.328v2.327H48.24v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm9.31 0h2.328v2.327h-2.327v-2.327Zm6.983 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.328v-2.327Zm2.327 0H78.5v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327H78.5v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327ZM11 31.948h2.328v2.328H11v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328Zm11.638 0h2.327v2.328h-2.327v-2.328Zm11.638 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H48.24v-2.328Zm2.328 0h2.327v2.328H50.57v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm9.31 0h2.328v2.328h-2.327v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm4.655 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328ZM11 34.276h2.328v2.327H11v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327H20.31v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm6.982 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327H48.24v-2.327Zm6.983 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.328v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.328v-2.327Zm2.327 0H78.5v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327H78.5v-2.327Zm6.982 0h2.328v2.327h-2.328v-2.327ZM11 36.603h2.328v2.328H11v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm11.638 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328H38.93v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328H48.24v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm9.31 0h2.328v2.328h-2.327v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm4.656 0h2.327v2.328h-2.328v-2.328Zm9.31 0h2.327v2.328h-2.327v-2.328ZM11 38.931h2.328v2.328H11V38.93Zm13.965 0h2.328v2.328h-2.328V38.93Zm4.656 0h2.327v2.328h-2.327V38.93Zm2.327 0h2.328v2.328h-2.328V38.93Zm2.328 0h2.327v2.328h-2.327V38.93Zm2.327 0h2.328v2.328h-2.328V38.93Zm9.31 0h2.328v2.328h-2.327V38.93Zm2.328 0h2.328v2.328H48.24V38.93Zm2.328 0h2.327v2.328H50.57V38.93Zm9.31 0h2.328v2.328h-2.328V38.93Zm2.328 0h2.327v2.328h-2.327V38.93Zm2.327 0h2.328v2.328h-2.328V38.93Zm2.328 0h2.327v2.328h-2.327V38.93Zm4.655 0h2.328v2.328h-2.328V38.93Zm4.655 0H78.5v2.328h-2.328V38.93Zm2.328 0h2.327v2.328H78.5V38.93ZM11 41.259h2.328v2.327H11v-2.328Zm6.983 0h2.327v2.327h-2.327v-2.328Zm2.327 0h2.328v2.327H20.31v-2.328Zm9.31 0h2.328v2.327h-2.327v-2.328Zm2.328 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.327v2.327h-2.327v-2.328Zm2.327 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.328v2.327H38.93v-2.328Zm6.983 0h2.327v2.327h-2.327v-2.328Zm6.982 0h2.328v2.327h-2.328v-2.328Zm6.983 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.327v2.327h-2.327v-2.328Zm2.327 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.327v2.327h-2.327v-2.328Zm4.655 0h2.328v2.327h-2.328v-2.328Zm13.965 0h2.328v2.327h-2.328v-2.328ZM11 43.585h2.328v2.328H11v-2.328Zm13.965 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.327v2.328h-2.327v-2.328Zm6.982 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328H48.24v-2.328Zm2.328 0h2.327v2.328H50.57v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm4.655 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328ZM11 45.914h2.328v2.327H11v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm6.982 0h2.328v2.327H20.31v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm6.983 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327H48.24v-2.327Zm2.328 0h2.327v2.327H50.57v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.328v-2.327Zm4.655 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm11.638 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327ZM13.328 48.24h2.327v2.328h-2.327V48.24Zm2.327 0h2.328v2.328h-2.328V48.24Zm2.328 0h2.327v2.328h-2.327V48.24Zm6.982 0h2.328v2.328h-2.328V48.24Zm2.328 0h2.328v2.328h-2.328V48.24Zm2.328 0h2.327v2.328h-2.327V48.24Zm2.327 0h2.328v2.328h-2.328V48.24Zm4.655 0h2.328v2.328h-2.328V48.24Zm2.328 0h2.328v2.328H38.93V48.24Zm2.328 0h2.327v2.328h-2.328V48.24Zm4.655 0h2.327v2.328h-2.327V48.24Zm2.327 0h2.328v2.328H48.24V48.24Zm13.966 0h2.327v2.328h-2.327V48.24Zm6.982 0h2.328v2.328h-2.328V48.24Zm2.328 0h2.328v2.328h-2.328V48.24Zm6.983 0h2.327v2.328H78.5V48.24Zm2.327 0h2.328v2.328h-2.328V48.24Zm2.328 0h2.327v2.328h-2.327V48.24ZM13.328 50.57h2.327v2.327h-2.327V50.57Zm4.655 0h2.327v2.327h-2.327V50.57Zm2.327 0h2.328v2.327H20.31V50.57Zm2.328 0h2.327v2.327h-2.327V50.57Zm4.655 0h2.328v2.327h-2.328V50.57Zm2.328 0h2.327v2.327h-2.327V50.57Zm6.982 0h2.328v2.327h-2.328V50.57Zm6.983 0h2.328v2.327h-2.328V50.57Zm6.983 0h2.327v2.327H50.57V50.57Zm6.982 0h2.328v2.327h-2.328V50.57Zm2.328 0h2.328v2.327h-2.328V50.57Zm4.655 0h2.328v2.327h-2.328V50.57Zm4.655 0h2.328v2.327h-2.328V50.57Zm2.328 0h2.328v2.327h-2.328V50.57Zm2.328 0h2.327v2.327h-2.328V50.57Zm6.982 0h2.328v2.327h-2.328V50.57Zm2.328 0h2.327v2.327h-2.327V50.57Zm2.327 0h2.328v2.327h-2.328V50.57Zm-72.154 2.327h2.327v2.328h-2.327v-2.328Zm6.982 0h2.328v2.328H20.31v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm9.31 0h2.328v2.328h-2.327v-2.328Zm9.311 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.327v2.328H50.57v-2.328Zm13.965 0h2.328v2.328h-2.328v-2.328Zm11.638 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328ZM11 55.224h2.328v2.328H11v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm9.31 0h2.328v2.328h-2.328v-2.328Zm9.31 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328H48.24v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm11.638 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm2.327 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328ZM11 57.552h2.328v2.327H11v-2.328Zm2.328 0h2.327v2.327h-2.327v-2.328Zm11.637 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.327v2.327h-2.327v-2.328Zm6.982 0h2.328v2.327h-2.328v-2.328Zm4.655 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.327v2.327h-2.327v-2.328Zm6.982 0h2.328v2.327h-2.328v-2.328Zm11.638 0h2.328v2.327h-2.328v-2.328Zm9.31 0h2.328v2.327h-2.328v-2.328Zm-55.861 2.327h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm13.966 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.327v2.328H50.57v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm18.62 0h2.328v2.328h-2.328v-2.328Zm4.656 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328ZM11 62.207h2.328v2.327H11v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327H20.31v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm11.638 0h2.328v2.327H48.24v-2.327Zm2.328 0h2.327v2.327H50.57v-2.327Zm11.638 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.328v-2.327Zm11.637 0h2.328v2.327h-2.328v-2.327Zm-67.5 2.327h2.328v2.328h-2.327v-2.328Zm4.656 0h2.327v2.328h-2.327v-2.328Zm9.31 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328H38.93v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H48.24v-2.328Zm9.31 0h2.328v2.328h-2.328v-2.328Zm18.621 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328ZM11 66.862h2.328v2.327H11v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm9.31 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.327v2.327H50.57v-2.327Zm6.982 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.327v2.327h-2.328v-2.327Zm2.327 0H78.5v2.327h-2.328v-2.327Zm6.983 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm-55.861 2.327h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm11.638 0h2.328v2.328H48.24v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm9.31 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328ZM11 71.517h2.328v2.328H11v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.656 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm11.638 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H48.24v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm9.31 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.655 0H78.5v2.328h-2.328v-2.328Zm9.31 0h2.328v2.328h-2.328v-2.328ZM11 73.845h2.328v2.327H11v-2.328Zm13.965 0h2.328v2.327h-2.328v-2.328Zm4.656 0h2.327v2.327h-2.327v-2.328Zm2.327 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.327v2.327h-2.327v-2.328Zm4.655 0h2.328v2.327H38.93v-2.328Zm2.328 0h2.327v2.327h-2.328v-2.328Zm2.327 0h2.328v2.327h-2.328v-2.328Zm4.655 0h2.328v2.327H48.24v-2.328Zm9.31 0h2.328v2.327h-2.328v-2.328Zm2.328 0h2.328v2.327h-2.328v-2.328Zm6.983 0h2.327v2.327h-2.327v-2.328Zm9.31 0H78.5v2.327h-2.328v-2.328Zm2.328 0h2.327v2.327H78.5v-2.328Zm4.655 0h2.327v2.327h-2.327v-2.328Zm2.327 0h2.328v2.327h-2.328v-2.328ZM11 76.171h2.328V78.5H11v-2.328Zm4.655 0h2.328V78.5h-2.328v-2.328Zm2.328 0h2.327V78.5h-2.327v-2.328Zm2.327 0h2.328V78.5H20.31v-2.328Zm4.655 0h2.328V78.5h-2.328v-2.328Zm11.638 0h2.328V78.5h-2.328v-2.328Zm11.638 0h2.328V78.5H48.24v-2.328Zm6.983 0h2.328V78.5h-2.328v-2.328Zm4.655 0h2.328V78.5h-2.328v-2.328Zm4.655 0h2.328V78.5h-2.328v-2.328Zm2.328 0h2.327V78.5h-2.327v-2.328Zm2.327 0h2.328V78.5h-2.328v-2.328Zm2.328 0h2.328V78.5h-2.328v-2.328Zm2.328 0h2.327V78.5h-2.328v-2.328Zm2.327 0H78.5V78.5h-2.328v-2.328Zm2.328 0h2.327V78.5H78.5v-2.328ZM11 78.5h2.328v2.327H11V78.5Zm4.655 0h2.328v2.327h-2.328V78.5Zm2.328 0h2.327v2.327h-2.327V78.5Zm2.327 0h2.328v2.327H20.31V78.5Zm4.655 0h2.328v2.327h-2.328V78.5Zm6.983 0h2.328v2.327h-2.328V78.5Zm2.328 0h2.327v2.327h-2.327V78.5Zm13.965 0h2.328v2.327H48.24V78.5Zm11.638 0h2.328v2.327h-2.328V78.5Zm6.983 0h2.327v2.327h-2.327V78.5Zm2.327 0h2.328v2.327h-2.328V78.5Zm4.656 0h2.327v2.327h-2.328V78.5Zm2.327 0H78.5v2.327h-2.328V78.5Zm2.328 0h2.327v2.327H78.5V78.5Zm2.327 0h2.328v2.327h-2.328V78.5Zm2.328 0h2.327v2.327h-2.327V78.5ZM11 80.827h2.328v2.328H11v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Zm4.656 0h2.327v2.328h-2.327v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H48.24v-2.328Zm2.328 0h2.327v2.328H50.57v-2.328Zm13.965 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm9.31 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm4.655 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328ZM11 83.155h2.328v2.327H11v-2.327Zm13.965 0h2.328v2.327h-2.328v-2.327Zm6.983 0h2.328v2.327h-2.328v-2.327Zm4.655 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327H38.93v-2.327Zm6.983 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327H48.24v-2.327Zm2.328 0h2.327v2.327H50.57v-2.327Zm6.982 0h2.328v2.327h-2.328v-2.327Zm4.656 0h2.327v2.327h-2.327v-2.327Zm4.655 0h2.327v2.327h-2.327v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327Zm2.328 0h2.328v2.327h-2.328v-2.327Zm6.983 0h2.327v2.327H78.5v-2.327Zm2.327 0h2.328v2.327h-2.328v-2.327ZM11 85.482h2.328v2.328H11v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328H20.31v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm6.983 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328H38.93v-2.328Zm2.328 0h2.327v2.328h-2.328v-2.328Zm9.31 0h2.327v2.328H50.57v-2.328Zm16.293 0h2.327v2.328h-2.327v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm2.328 0h2.328v2.328h-2.328v-2.328Zm4.655 0H78.5v2.328h-2.328v-2.328Zm2.328 0h2.327v2.328H78.5v-2.328Zm2.327 0h2.328v2.328h-2.328v-2.328Zm4.655 0h2.328v2.328h-2.328v-2.328Z" fill="#000"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h98v98H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mobile-download-qr-new-user.svg b/browser/components/aboutwelcome/assets/mobile-download-qr-new-user.svg
new file mode 100644
index 0000000000..9a8f61a95c
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mobile-download-qr-new-user.svg
@@ -0,0 +1,7 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="98" height="98" viewBox="0 0 98 98" fill="none" xmlns="http://www.w3.org/2000/svg">
+<rect width="98" height="98" rx="8" fill="white"/>
+<path d="M10.5945 10.5947H13.2431V13.2434H10.5945V10.5947ZM13.2431 10.5947H15.8918V13.2434H13.2431V10.5947ZM15.8918 10.5947H18.5404V13.2434H15.8918V10.5947ZM18.5404 10.5947H21.1891V13.2434H18.5404V10.5947ZM21.1891 10.5947H23.8377V13.2434H21.1891V10.5947ZM23.8377 10.5947H26.4864V13.2434H23.8377V10.5947ZM26.4864 10.5947H29.135V13.2434H26.4864V10.5947ZM34.4323 10.5947H37.081V13.2434H34.4323V10.5947ZM42.3783 10.5947H45.0269V13.2434H42.3783V10.5947ZM45.0269 10.5947H47.6756V13.2434H45.0269V10.5947ZM50.3242 10.5947H52.9729V13.2434H50.3242V10.5947ZM52.9729 10.5947H55.6215V13.2434H52.9729V10.5947ZM58.2702 10.5947H60.9188V13.2434H58.2702V10.5947ZM60.9188 10.5947H63.5675V13.2434H60.9188V10.5947ZM68.8648 10.5947H71.5134V13.2434H68.8648V10.5947ZM71.5134 10.5947H74.1621V13.2434H71.5134V10.5947ZM74.1621 10.5947H76.8107V13.2434H74.1621V10.5947ZM76.8107 10.5947H79.4593V13.2434H76.8107V10.5947ZM79.4593 10.5947H82.108V13.2434H79.4593V10.5947ZM82.108 10.5947H84.7566V13.2434H82.108V10.5947ZM84.7566 10.5947H87.4053V13.2434H84.7566V10.5947ZM10.5945 13.2434H13.2431V15.892H10.5945V13.2434ZM26.4864 13.2434H29.135V15.892H26.4864V13.2434ZM37.081 13.2434H39.7296V15.892H37.081V13.2434ZM39.7296 13.2434H42.3783V15.892H39.7296V13.2434ZM45.0269 13.2434H47.6756V15.892H45.0269V13.2434ZM47.6756 13.2434H50.3242V15.892H47.6756V13.2434ZM50.3242 13.2434H52.9729V15.892H50.3242V13.2434ZM63.5675 13.2434H66.2161V15.892H63.5675V13.2434ZM68.8648 13.2434H71.5134V15.892H68.8648V13.2434ZM84.7566 13.2434H87.4053V15.892H84.7566V13.2434ZM10.5945 15.892H13.2431V18.5407H10.5945V15.892ZM15.8918 15.892H18.5404V18.5407H15.8918V15.892ZM18.5404 15.892H21.1891V18.5407H18.5404V15.892ZM21.1891 15.892H23.8377V18.5407H21.1891V15.892ZM26.4864 15.892H29.135V18.5407H26.4864V15.892ZM31.7837 15.892H34.4323V18.5407H31.7837V15.892ZM34.4323 15.892H37.081V18.5407H34.4323V15.892ZM37.081 15.892H39.7296V18.5407H37.081V15.892ZM45.0269 15.892H47.6756V18.5407H45.0269V15.892ZM50.3242 15.892H52.9729V18.5407H50.3242V15.892ZM58.2702 15.892H60.9188V18.5407H58.2702V15.892ZM63.5675 15.892H66.2161V18.5407H63.5675V15.892ZM68.8648 15.892H71.5134V18.5407H68.8648V15.892ZM74.1621 15.892H76.8107V18.5407H74.1621V15.892ZM76.8107 15.892H79.4593V18.5407H76.8107V15.892ZM79.4593 15.892H82.108V18.5407H79.4593V15.892ZM84.7566 15.892H87.4053V18.5407H84.7566V15.892ZM10.5945 18.5407H13.2431V21.1893H10.5945V18.5407ZM15.8918 18.5407H18.5404V21.1893H15.8918V18.5407ZM18.5404 18.5407H21.1891V21.1893H18.5404V18.5407ZM21.1891 18.5407H23.8377V21.1893H21.1891V18.5407ZM26.4864 18.5407H29.135V21.1893H26.4864V18.5407ZM31.7837 18.5407H34.4323V21.1893H31.7837V18.5407ZM34.4323 18.5407H37.081V21.1893H34.4323V18.5407ZM37.081 18.5407H39.7296V21.1893H37.081V18.5407ZM42.3783 18.5407H45.0269V21.1893H42.3783V18.5407ZM45.0269 18.5407H47.6756V21.1893H45.0269V18.5407ZM50.3242 18.5407H52.9729V21.1893H50.3242V18.5407ZM55.6215 18.5407H58.2702V21.1893H55.6215V18.5407ZM58.2702 18.5407H60.9188V21.1893H58.2702V18.5407ZM60.9188 18.5407H63.5675V21.1893H60.9188V18.5407ZM63.5675 18.5407H66.2161V21.1893H63.5675V18.5407ZM68.8648 18.5407H71.5134V21.1893H68.8648V18.5407ZM74.1621 18.5407H76.8107V21.1893H74.1621V18.5407ZM76.8107 18.5407H79.4593V21.1893H76.8107V18.5407ZM79.4593 18.5407H82.108V21.1893H79.4593V18.5407ZM84.7566 18.5407H87.4053V21.1893H84.7566V18.5407ZM10.5945 21.1893H13.2431V23.838H10.5945V21.1893ZM15.8918 21.1893H18.5404V23.838H15.8918V21.1893ZM18.5404 21.1893H21.1891V23.838H18.5404V21.1893ZM21.1891 21.1893H23.8377V23.838H21.1891V21.1893ZM26.4864 21.1893H29.135V23.838H26.4864V21.1893ZM42.3783 21.1893H45.0269V23.838H42.3783V21.1893ZM45.0269 21.1893H47.6756V23.838H45.0269V21.1893ZM47.6756 21.1893H50.3242V23.838H47.6756V21.1893ZM52.9729 21.1893H55.6215V23.838H52.9729V21.1893ZM55.6215 21.1893H58.2702V23.838H55.6215V21.1893ZM58.2702 21.1893H60.9188V23.838H58.2702V21.1893ZM60.9188 21.1893H63.5675V23.838H60.9188V21.1893ZM68.8648 21.1893H71.5134V23.838H68.8648V21.1893ZM74.1621 21.1893H76.8107V23.838H74.1621V21.1893ZM76.8107 21.1893H79.4593V23.838H76.8107V21.1893ZM79.4593 21.1893H82.108V23.838H79.4593V21.1893ZM84.7566 21.1893H87.4053V23.838H84.7566V21.1893ZM10.5945 23.838H13.2431V26.4866H10.5945V23.838ZM26.4864 23.838H29.135V26.4866H26.4864V23.838ZM50.3242 23.838H52.9729V26.4866H50.3242V23.838ZM52.9729 23.838H55.6215V26.4866H52.9729V23.838ZM55.6215 23.838H58.2702V26.4866H55.6215V23.838ZM58.2702 23.838H60.9188V26.4866H58.2702V23.838ZM68.8648 23.838H71.5134V26.4866H68.8648V23.838ZM84.7566 23.838H87.4053V26.4866H84.7566V23.838ZM10.5945 26.4866H13.2431V29.1353H10.5945V26.4866ZM13.2431 26.4866H15.8918V29.1353H13.2431V26.4866ZM15.8918 26.4866H18.5404V29.1353H15.8918V26.4866ZM18.5404 26.4866H21.1891V29.1353H18.5404V26.4866ZM21.1891 26.4866H23.8377V29.1353H21.1891V26.4866ZM23.8377 26.4866H26.4864V29.1353H23.8377V26.4866ZM26.4864 26.4866H29.135V29.1353H26.4864V26.4866ZM31.7837 26.4866H34.4323V29.1353H31.7837V26.4866ZM37.081 26.4866H39.7296V29.1353H37.081V26.4866ZM42.3783 26.4866H45.0269V29.1353H42.3783V26.4866ZM47.6756 26.4866H50.3242V29.1353H47.6756V26.4866ZM52.9729 26.4866H55.6215V29.1353H52.9729V26.4866ZM58.2702 26.4866H60.9188V29.1353H58.2702V26.4866ZM63.5675 26.4866H66.2161V29.1353H63.5675V26.4866ZM68.8648 26.4866H71.5134V29.1353H68.8648V26.4866ZM71.5134 26.4866H74.1621V29.1353H71.5134V26.4866ZM74.1621 26.4866H76.8107V29.1353H74.1621V26.4866ZM76.8107 26.4866H79.4593V29.1353H76.8107V26.4866ZM79.4593 26.4866H82.108V29.1353H79.4593V26.4866ZM82.108 26.4866H84.7566V29.1353H82.108V26.4866ZM84.7566 26.4866H87.4053V29.1353H84.7566V26.4866ZM37.081 29.1353H39.7296V31.7839H37.081V29.1353ZM39.7296 29.1353H42.3783V31.7839H39.7296V29.1353ZM42.3783 29.1353H45.0269V31.7839H42.3783V29.1353ZM52.9729 29.1353H55.6215V31.7839H52.9729V29.1353ZM63.5675 29.1353H66.2161V31.7839H63.5675V29.1353ZM18.5404 31.7839H21.1891V34.4326H18.5404V31.7839ZM21.1891 31.7839H23.8377V34.4326H21.1891V31.7839ZM26.4864 31.7839H29.135V34.4326H26.4864V31.7839ZM29.135 31.7839H31.7837V34.4326H29.135V31.7839ZM34.4323 31.7839H37.081V34.4326H34.4323V31.7839ZM37.081 31.7839H39.7296V34.4326H37.081V31.7839ZM39.7296 31.7839H42.3783V34.4326H39.7296V31.7839ZM58.2702 31.7839H60.9188V34.4326H58.2702V31.7839ZM76.8107 31.7839H79.4593V34.4326H76.8107V31.7839ZM79.4593 31.7839H82.108V34.4326H79.4593V31.7839ZM10.5945 34.4326H13.2431V37.0812H10.5945V34.4326ZM13.2431 34.4326H15.8918V37.0812H13.2431V34.4326ZM21.1891 34.4326H23.8377V37.0812H21.1891V34.4326ZM23.8377 34.4326H26.4864V37.0812H23.8377V34.4326ZM37.081 34.4326H39.7296V37.0812H37.081V34.4326ZM39.7296 34.4326H42.3783V37.0812H39.7296V34.4326ZM47.6756 34.4326H50.3242V37.0812H47.6756V34.4326ZM63.5675 34.4326H66.2161V37.0812H63.5675V34.4326ZM71.5134 34.4326H74.1621V37.0812H71.5134V34.4326ZM74.1621 34.4326H76.8107V37.0812H74.1621V34.4326ZM79.4593 34.4326H82.108V37.0812H79.4593V34.4326ZM82.108 34.4326H84.7566V37.0812H82.108V34.4326ZM13.2431 37.0812H15.8918V39.7299H13.2431V37.0812ZM15.8918 37.0812H18.5404V39.7299H15.8918V37.0812ZM18.5404 37.0812H21.1891V39.7299H18.5404V37.0812ZM26.4864 37.0812H29.135V39.7299H26.4864V37.0812ZM29.135 37.0812H31.7837V39.7299H29.135V37.0812ZM31.7837 37.0812H34.4323V39.7299H31.7837V37.0812ZM34.4323 37.0812H37.081V39.7299H34.4323V37.0812ZM37.081 37.0812H39.7296V39.7299H37.081V37.0812ZM39.7296 37.0812H42.3783V39.7299H39.7296V37.0812ZM45.0269 37.0812H47.6756V39.7299H45.0269V37.0812ZM50.3242 37.0812H52.9729V39.7299H50.3242V37.0812ZM55.6215 37.0812H58.2702V39.7299H55.6215V37.0812ZM66.2161 37.0812H68.8648V39.7299H66.2161V37.0812ZM68.8648 37.0812H71.5134V39.7299H68.8648V37.0812ZM74.1621 37.0812H76.8107V39.7299H74.1621V37.0812ZM76.8107 37.0812H79.4593V39.7299H76.8107V37.0812ZM79.4593 37.0812H82.108V39.7299H79.4593V37.0812ZM15.8918 39.7299H18.5404V42.3785H15.8918V39.7299ZM21.1891 39.7299H23.8377V42.3785H21.1891V39.7299ZM31.7837 39.7299H34.4323V42.3785H31.7837V39.7299ZM34.4323 39.7299H37.081V42.3785H34.4323V39.7299ZM37.081 39.7299H39.7296V42.3785H37.081V39.7299ZM39.7296 39.7299H42.3783V42.3785H39.7296V39.7299ZM42.3783 39.7299H45.0269V42.3785H42.3783V39.7299ZM47.6756 39.7299H50.3242V42.3785H47.6756V39.7299ZM55.6215 39.7299H58.2702V42.3785H55.6215V39.7299ZM60.9188 39.7299H63.5675V42.3785H60.9188V39.7299ZM63.5675 39.7299H66.2161V42.3785H63.5675V39.7299ZM71.5134 39.7299H74.1621V42.3785H71.5134V39.7299ZM74.1621 39.7299H76.8107V42.3785H74.1621V39.7299ZM84.7566 39.7299H87.4053V42.3785H84.7566V39.7299ZM13.2431 42.3785H15.8918V45.0272H13.2431V42.3785ZM15.8918 42.3785H18.5404V45.0272H15.8918V42.3785ZM18.5404 42.3785H21.1891V45.0272H18.5404V42.3785ZM26.4864 42.3785H29.135V45.0272H26.4864V42.3785ZM29.135 42.3785H31.7837V45.0272H29.135V42.3785ZM31.7837 42.3785H34.4323V45.0272H31.7837V42.3785ZM34.4323 42.3785H37.081V45.0272H34.4323V42.3785ZM37.081 42.3785H39.7296V45.0272H37.081V42.3785ZM42.3783 42.3785H45.0269V45.0272H42.3783V42.3785ZM45.0269 42.3785H47.6756V45.0272H45.0269V42.3785ZM47.6756 42.3785H50.3242V45.0272H47.6756V42.3785ZM52.9729 42.3785H55.6215V45.0272H52.9729V42.3785ZM66.2161 42.3785H68.8648V45.0272H66.2161V42.3785ZM68.8648 42.3785H71.5134V45.0272H68.8648V42.3785ZM76.8107 42.3785H79.4593V45.0272H76.8107V42.3785ZM82.108 42.3785H84.7566V45.0272H82.108V42.3785ZM13.2431 45.0272H15.8918V47.6758H13.2431V45.0272ZM15.8918 45.0272H18.5404V47.6758H15.8918V45.0272ZM18.5404 45.0272H21.1891V47.6758H18.5404V45.0272ZM23.8377 45.0272H26.4864V47.6758H23.8377V45.0272ZM29.135 45.0272H31.7837V47.6758H29.135V45.0272ZM31.7837 45.0272H34.4323V47.6758H31.7837V45.0272ZM34.4323 45.0272H37.081V47.6758H34.4323V45.0272ZM50.3242 45.0272H52.9729V47.6758H50.3242V45.0272ZM55.6215 45.0272H58.2702V47.6758H55.6215V45.0272ZM58.2702 45.0272H60.9188V47.6758H58.2702V45.0272ZM68.8648 45.0272H71.5134V47.6758H68.8648V45.0272ZM74.1621 45.0272H76.8107V47.6758H74.1621V45.0272ZM79.4593 45.0272H82.108V47.6758H79.4593V45.0272ZM84.7566 45.0272H87.4053V47.6758H84.7566V45.0272ZM10.5945 47.6758H13.2431V50.3245H10.5945V47.6758ZM13.2431 47.6758H15.8918V50.3245H13.2431V47.6758ZM18.5404 47.6758H21.1891V50.3245H18.5404V47.6758ZM21.1891 47.6758H23.8377V50.3245H21.1891V47.6758ZM26.4864 47.6758H29.135V50.3245H26.4864V47.6758ZM31.7837 47.6758H34.4323V50.3245H31.7837V47.6758ZM37.081 47.6758H39.7296V50.3245H37.081V47.6758ZM39.7296 47.6758H42.3783V50.3245H39.7296V47.6758ZM50.3242 47.6758H52.9729V50.3245H50.3242V47.6758ZM52.9729 47.6758H55.6215V50.3245H52.9729V47.6758ZM55.6215 47.6758H58.2702V50.3245H55.6215V47.6758ZM60.9188 47.6758H63.5675V50.3245H60.9188V47.6758ZM63.5675 47.6758H66.2161V50.3245H63.5675V47.6758ZM71.5134 47.6758H74.1621V50.3245H71.5134V47.6758ZM76.8107 47.6758H79.4593V50.3245H76.8107V47.6758ZM84.7566 47.6758H87.4053V50.3245H84.7566V47.6758ZM13.2431 50.3245H15.8918V52.9731H13.2431V50.3245ZM21.1891 50.3245H23.8377V52.9731H21.1891V50.3245ZM23.8377 50.3245H26.4864V52.9731H23.8377V50.3245ZM29.135 50.3245H31.7837V52.9731H29.135V50.3245ZM34.4323 50.3245H37.081V52.9731H34.4323V50.3245ZM39.7296 50.3245H42.3783V52.9731H39.7296V50.3245ZM42.3783 50.3245H45.0269V52.9731H42.3783V50.3245ZM47.6756 50.3245H50.3242V52.9731H47.6756V50.3245ZM58.2702 50.3245H60.9188V52.9731H58.2702V50.3245ZM66.2161 50.3245H68.8648V52.9731H66.2161V50.3245ZM68.8648 50.3245H71.5134V52.9731H68.8648V50.3245ZM74.1621 50.3245H76.8107V52.9731H74.1621V50.3245ZM76.8107 50.3245H79.4593V52.9731H76.8107V50.3245ZM79.4593 50.3245H82.108V52.9731H79.4593V50.3245ZM84.7566 50.3245H87.4053V52.9731H84.7566V50.3245ZM13.2431 52.9731H15.8918V55.6218H13.2431V52.9731ZM15.8918 52.9731H18.5404V55.6218H15.8918V52.9731ZM18.5404 52.9731H21.1891V55.6218H18.5404V52.9731ZM21.1891 52.9731H23.8377V55.6218H21.1891V52.9731ZM23.8377 52.9731H26.4864V55.6218H23.8377V52.9731ZM26.4864 52.9731H29.135V55.6218H26.4864V52.9731ZM29.135 52.9731H31.7837V55.6218H29.135V52.9731ZM34.4323 52.9731H37.081V55.6218H34.4323V52.9731ZM39.7296 52.9731H42.3783V55.6218H39.7296V52.9731ZM42.3783 52.9731H45.0269V55.6218H42.3783V52.9731ZM50.3242 52.9731H52.9729V55.6218H50.3242V52.9731ZM55.6215 52.9731H58.2702V55.6218H55.6215V52.9731ZM60.9188 52.9731H63.5675V55.6218H60.9188V52.9731ZM63.5675 52.9731H66.2161V55.6218H63.5675V52.9731ZM76.8107 52.9731H79.4593V55.6218H76.8107V52.9731ZM84.7566 52.9731H87.4053V55.6218H84.7566V52.9731ZM10.5945 55.6218H13.2431V58.2704H10.5945V55.6218ZM18.5404 55.6218H21.1891V58.2704H18.5404V55.6218ZM21.1891 55.6218H23.8377V58.2704H21.1891V55.6218ZM31.7837 55.6218H34.4323V58.2704H31.7837V55.6218ZM34.4323 55.6218H37.081V58.2704H34.4323V55.6218ZM39.7296 55.6218H42.3783V58.2704H39.7296V55.6218ZM47.6756 55.6218H50.3242V58.2704H47.6756V55.6218ZM50.3242 55.6218H52.9729V58.2704H50.3242V55.6218ZM52.9729 55.6218H55.6215V58.2704H52.9729V55.6218ZM55.6215 55.6218H58.2702V58.2704H55.6215V55.6218ZM63.5675 55.6218H66.2161V58.2704H63.5675V55.6218ZM68.8648 55.6218H71.5134V58.2704H68.8648V55.6218ZM74.1621 55.6218H76.8107V58.2704H74.1621V55.6218ZM76.8107 55.6218H79.4593V58.2704H76.8107V55.6218ZM79.4593 55.6218H82.108V58.2704H79.4593V55.6218ZM10.5945 58.2704H13.2431V60.9191H10.5945V58.2704ZM13.2431 58.2704H15.8918V60.9191H13.2431V58.2704ZM21.1891 58.2704H23.8377V60.9191H21.1891V58.2704ZM26.4864 58.2704H29.135V60.9191H26.4864V58.2704ZM29.135 58.2704H31.7837V60.9191H29.135V58.2704ZM42.3783 58.2704H45.0269V60.9191H42.3783V58.2704ZM45.0269 58.2704H47.6756V60.9191H45.0269V58.2704ZM47.6756 58.2704H50.3242V60.9191H47.6756V58.2704ZM52.9729 58.2704H55.6215V60.9191H52.9729V58.2704ZM55.6215 58.2704H58.2702V60.9191H55.6215V58.2704ZM58.2702 58.2704H60.9188V60.9191H58.2702V58.2704ZM60.9188 58.2704H63.5675V60.9191H60.9188V58.2704ZM71.5134 58.2704H74.1621V60.9191H71.5134V58.2704ZM84.7566 58.2704H87.4053V60.9191H84.7566V58.2704ZM10.5945 60.9191H13.2431V63.5677H10.5945V60.9191ZM13.2431 60.9191H15.8918V63.5677H13.2431V60.9191ZM23.8377 60.9191H26.4864V63.5677H23.8377V60.9191ZM31.7837 60.9191H34.4323V63.5677H31.7837V60.9191ZM42.3783 60.9191H45.0269V63.5677H42.3783V60.9191ZM47.6756 60.9191H50.3242V63.5677H47.6756V60.9191ZM52.9729 60.9191H55.6215V63.5677H52.9729V60.9191ZM58.2702 60.9191H60.9188V63.5677H58.2702V60.9191ZM60.9188 60.9191H63.5675V63.5677H60.9188V60.9191ZM63.5675 60.9191H66.2161V63.5677H63.5675V60.9191ZM66.2161 60.9191H68.8648V63.5677H66.2161V60.9191ZM68.8648 60.9191H71.5134V63.5677H68.8648V60.9191ZM76.8107 60.9191H79.4593V63.5677H76.8107V60.9191ZM79.4593 60.9191H82.108V63.5677H79.4593V60.9191ZM84.7566 60.9191H87.4053V63.5677H84.7566V60.9191ZM10.5945 63.5677H13.2431V66.2164H10.5945V63.5677ZM13.2431 63.5677H15.8918V66.2164H13.2431V63.5677ZM15.8918 63.5677H18.5404V66.2164H15.8918V63.5677ZM18.5404 63.5677H21.1891V66.2164H18.5404V63.5677ZM23.8377 63.5677H26.4864V66.2164H23.8377V63.5677ZM26.4864 63.5677H29.135V66.2164H26.4864V63.5677ZM29.135 63.5677H31.7837V66.2164H29.135V63.5677ZM31.7837 63.5677H34.4323V66.2164H31.7837V63.5677ZM37.081 63.5677H39.7296V66.2164H37.081V63.5677ZM45.0269 63.5677H47.6756V66.2164H45.0269V63.5677ZM50.3242 63.5677H52.9729V66.2164H50.3242V63.5677ZM52.9729 63.5677H55.6215V66.2164H52.9729V63.5677ZM55.6215 63.5677H58.2702V66.2164H55.6215V63.5677ZM58.2702 63.5677H60.9188V66.2164H58.2702V63.5677ZM60.9188 63.5677H63.5675V66.2164H60.9188V63.5677ZM63.5675 63.5677H66.2161V66.2164H63.5675V63.5677ZM66.2161 63.5677H68.8648V66.2164H66.2161V63.5677ZM68.8648 63.5677H71.5134V66.2164H68.8648V63.5677ZM71.5134 63.5677H74.1621V66.2164H71.5134V63.5677ZM74.1621 63.5677H76.8107V66.2164H74.1621V63.5677ZM79.4593 63.5677H82.108V66.2164H79.4593V63.5677ZM84.7566 63.5677H87.4053V66.2164H84.7566V63.5677ZM31.7837 66.2164H34.4323V68.865H31.7837V66.2164ZM47.6756 66.2164H50.3242V68.865H47.6756V66.2164ZM50.3242 66.2164H52.9729V68.865H50.3242V66.2164ZM58.2702 66.2164H60.9188V68.865H58.2702V66.2164ZM63.5675 66.2164H66.2161V68.865H63.5675V66.2164ZM74.1621 66.2164H76.8107V68.865H74.1621V66.2164ZM76.8107 66.2164H79.4593V68.865H76.8107V66.2164ZM79.4593 66.2164H82.108V68.865H79.4593V66.2164ZM10.5945 68.865H13.2431V71.5136H10.5945V68.865ZM13.2431 68.865H15.8918V71.5136H13.2431V68.865ZM15.8918 68.865H18.5404V71.5136H15.8918V68.865ZM18.5404 68.865H21.1891V71.5136H18.5404V68.865ZM21.1891 68.865H23.8377V71.5136H21.1891V68.865ZM23.8377 68.865H26.4864V71.5136H23.8377V68.865ZM26.4864 68.865H29.135V71.5136H26.4864V68.865ZM31.7837 68.865H34.4323V71.5136H31.7837V68.865ZM34.4323 68.865H37.081V71.5136H34.4323V68.865ZM37.081 68.865H39.7296V71.5136H37.081V68.865ZM47.6756 68.865H50.3242V71.5136H47.6756V68.865ZM52.9729 68.865H55.6215V71.5136H52.9729V68.865ZM60.9188 68.865H63.5675V71.5136H60.9188V68.865ZM63.5675 68.865H66.2161V71.5136H63.5675V68.865ZM68.8648 68.865H71.5134V71.5136H68.8648V68.865ZM74.1621 68.865H76.8107V71.5136H74.1621V68.865ZM79.4593 68.865H82.108V71.5136H79.4593V68.865ZM10.5945 71.5136H13.2431V74.1623H10.5945V71.5136ZM26.4864 71.5136H29.135V74.1623H26.4864V71.5136ZM42.3783 71.5136H45.0269V74.1623H42.3783V71.5136ZM50.3242 71.5136H52.9729V74.1623H50.3242V71.5136ZM58.2702 71.5136H60.9188V74.1623H58.2702V71.5136ZM60.9188 71.5136H63.5675V74.1623H60.9188V71.5136ZM63.5675 71.5136H66.2161V74.1623H63.5675V71.5136ZM74.1621 71.5136H76.8107V74.1623H74.1621V71.5136ZM76.8107 71.5136H79.4593V74.1623H76.8107V71.5136ZM10.5945 74.1623H13.2431V76.8109H10.5945V74.1623ZM15.8918 74.1623H18.5404V76.8109H15.8918V74.1623ZM18.5404 74.1623H21.1891V76.8109H18.5404V74.1623ZM21.1891 74.1623H23.8377V76.8109H21.1891V74.1623ZM26.4864 74.1623H29.135V76.8109H26.4864V74.1623ZM31.7837 74.1623H34.4323V76.8109H31.7837V74.1623ZM34.4323 74.1623H37.081V76.8109H34.4323V74.1623ZM37.081 74.1623H39.7296V76.8109H37.081V74.1623ZM39.7296 74.1623H42.3783V76.8109H39.7296V74.1623ZM52.9729 74.1623H55.6215V76.8109H52.9729V74.1623ZM55.6215 74.1623H58.2702V76.8109H55.6215V74.1623ZM60.9188 74.1623H63.5675V76.8109H60.9188V74.1623ZM63.5675 74.1623H66.2161V76.8109H63.5675V74.1623ZM66.2161 74.1623H68.8648V76.8109H66.2161V74.1623ZM68.8648 74.1623H71.5134V76.8109H68.8648V74.1623ZM71.5134 74.1623H74.1621V76.8109H71.5134V74.1623ZM74.1621 74.1623H76.8107V76.8109H74.1621V74.1623ZM10.5945 76.8109H13.2431V79.4596H10.5945V76.8109ZM15.8918 76.8109H18.5404V79.4596H15.8918V76.8109ZM18.5404 76.8109H21.1891V79.4596H18.5404V76.8109ZM21.1891 76.8109H23.8377V79.4596H21.1891V76.8109ZM26.4864 76.8109H29.135V79.4596H26.4864V76.8109ZM31.7837 76.8109H34.4323V79.4596H31.7837V76.8109ZM39.7296 76.8109H42.3783V79.4596H39.7296V76.8109ZM52.9729 76.8109H55.6215V79.4596H52.9729V76.8109ZM55.6215 76.8109H58.2702V79.4596H55.6215V76.8109ZM71.5134 76.8109H74.1621V79.4596H71.5134V76.8109ZM76.8107 76.8109H79.4593V79.4596H76.8107V76.8109ZM79.4593 76.8109H82.108V79.4596H79.4593V76.8109ZM82.108 76.8109H84.7566V79.4596H82.108V76.8109ZM10.5945 79.4596H13.2431V82.1082H10.5945V79.4596ZM15.8918 79.4596H18.5404V82.1082H15.8918V79.4596ZM18.5404 79.4596H21.1891V82.1082H18.5404V79.4596ZM21.1891 79.4596H23.8377V82.1082H21.1891V79.4596ZM26.4864 79.4596H29.135V82.1082H26.4864V79.4596ZM37.081 79.4596H39.7296V82.1082H37.081V79.4596ZM45.0269 79.4596H47.6756V82.1082H45.0269V79.4596ZM47.6756 79.4596H50.3242V82.1082H47.6756V79.4596ZM52.9729 79.4596H55.6215V82.1082H52.9729V79.4596ZM63.5675 79.4596H66.2161V82.1082H63.5675V79.4596ZM66.2161 79.4596H68.8648V82.1082H66.2161V79.4596ZM71.5134 79.4596H74.1621V82.1082H71.5134V79.4596ZM74.1621 79.4596H76.8107V82.1082H74.1621V79.4596ZM79.4593 79.4596H82.108V82.1082H79.4593V79.4596ZM82.108 79.4596H84.7566V82.1082H82.108V79.4596ZM84.7566 79.4596H87.4053V82.1082H84.7566V79.4596ZM10.5945 82.1082H13.2431V84.7569H10.5945V82.1082ZM26.4864 82.1082H29.135V84.7569H26.4864V82.1082ZM39.7296 82.1082H42.3783V84.7569H39.7296V82.1082ZM42.3783 82.1082H45.0269V84.7569H42.3783V82.1082ZM50.3242 82.1082H52.9729V84.7569H50.3242V82.1082ZM52.9729 82.1082H55.6215V84.7569H52.9729V82.1082ZM55.6215 82.1082H58.2702V84.7569H55.6215V82.1082ZM63.5675 82.1082H66.2161V84.7569H63.5675V82.1082ZM66.2161 82.1082H68.8648V84.7569H66.2161V82.1082ZM74.1621 82.1082H76.8107V84.7569H74.1621V82.1082ZM76.8107 82.1082H79.4593V84.7569H76.8107V82.1082ZM79.4593 82.1082H82.108V84.7569H79.4593V82.1082ZM84.7566 82.1082H87.4053V84.7569H84.7566V82.1082ZM10.5945 84.7569H13.2431V87.4055H10.5945V84.7569ZM13.2431 84.7569H15.8918V87.4055H13.2431V84.7569ZM15.8918 84.7569H18.5404V87.4055H15.8918V84.7569ZM18.5404 84.7569H21.1891V87.4055H18.5404V84.7569ZM21.1891 84.7569H23.8377V87.4055H21.1891V84.7569ZM23.8377 84.7569H26.4864V87.4055H23.8377V84.7569ZM26.4864 84.7569H29.135V87.4055H26.4864V84.7569ZM37.081 84.7569H39.7296V87.4055H37.081V84.7569ZM42.3783 84.7569H45.0269V87.4055H42.3783V84.7569ZM45.0269 84.7569H47.6756V87.4055H45.0269V84.7569ZM47.6756 84.7569H50.3242V87.4055H47.6756V84.7569ZM52.9729 84.7569H55.6215V87.4055H52.9729V84.7569ZM55.6215 84.7569H58.2702V87.4055H55.6215V84.7569ZM58.2702 84.7569H60.9188V87.4055H58.2702V84.7569ZM60.9188 84.7569H63.5675V87.4055H60.9188V84.7569ZM63.5675 84.7569H66.2161V87.4055H63.5675V84.7569ZM68.8648 84.7569H71.5134V87.4055H68.8648V84.7569ZM71.5134 84.7569H74.1621V87.4055H71.5134V84.7569ZM74.1621 84.7569H76.8107V87.4055H74.1621V84.7569ZM76.8107 84.7569H79.4593V87.4055H76.8107V84.7569Z" fill="black"/>
+</svg>
diff --git a/browser/components/aboutwelcome/assets/mr-amo-collection.svg b/browser/components/aboutwelcome/assets/mr-amo-collection.svg
new file mode 100644
index 0000000000..3e2fd6bd7b
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-amo-collection.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" id="a" width="282.411" height="400.481" data-name="Layer 2"><defs><linearGradient id="b" x1="50.722" x2="103.98" y1="40.307" y2="106.917" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9059ff"/><stop offset=".417" stop-color="#ff5d96"/><stop offset=".567" stop-color="#ff5e96"/><stop offset="1" stop-color="#ffbd4f"/></linearGradient><linearGradient id="c" x1="101.892" x2="103.538" y1="221.431" y2="223.49" gradientTransform="matrix(1 0 0 -1 0 346.426)" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9059ff"/><stop offset=".257" stop-color="#ff5d96"/><stop offset=".91" stop-color="#ff5e96"/><stop offset="1" stop-color="#ffbd4f"/></linearGradient><linearGradient id="d" x1="65.272" x2="91.49" y1="114.061" y2="143.854" gradientUnits="userSpaceOnUse"><stop offset=".038" stop-color="#ff5d96"/><stop offset=".127" stop-color="#ff5e96"/><stop offset=".79" stop-color="#ffbd4f"/></linearGradient><linearGradient id="e" x1="33.831" x2="260.447" y1="32.504" y2="315.937" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9059ff"/><stop offset=".257" stop-color="#ff5d96"/><stop offset=".91" stop-color="#ff5e96"/><stop offset="1" stop-color="#ffbd4f"/></linearGradient><linearGradient id="f" x1="39.45" x2="268.14" y1="27.1" y2="313.127" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9059ff"/><stop offset=".257" stop-color="#ff5d96"/><stop offset=".91" stop-color="#ff5e96"/><stop offset="1" stop-color="#ffbd4f"/></linearGradient><linearGradient id="g" x1="44.322" x2="272.975" y1="23.274" y2="309.256" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#9059ff"/><stop offset=".257" stop-color="#ff5d96"/><stop offset=".91" stop-color="#ff5e96"/><stop offset="1" stop-color="#ffbd4f"/></linearGradient><style>.n{fill:#fff}.o{fill:#825923}.p{fill:#3d2020}</style></defs><path d="m180.138 87.13 5.702-.063c1.652-5.059 5.876-15.064 8.21-19.878l-2.554-50.843-170.1-.87c1.226 11.07-1.273 153.72 2.129 154.819 0 0-13.891-1.582-20.839 6.244 0 0 15.642 12.123 17.706 13.626 2.064 1.504 1.708 52.446 1.708 52.446l-14.738.46.704 14.86 151.472.05 5.566-35.865-6.909-5.297 9.212-32.7 2.109-25.768-14.706 13.112-19.492-6.418-19.729-16.877-18.065-4.041-1.643-3.335-1.286-11.304-2.6-4.88-6.568-1.283-11.567-18.374 20.614-15.126c9.385 16.797 9.37 12.155 10.066 31.888l8.311 4.852 7.578 9.195 25.792 14.508 21.07-26.653 18.863-2.28 1.057-7.912-5.537-6.385-1.536-19.907Zm-85.649 2.255-19.866 14.44 2.619-3.156-4.474-7.58-6.016-1.55-4.578-6.396-5.162-.094-4.99-3.217-15.3.997-.22-34.41 3.19.76 44.774-3.103.725-6.727-11.981-2.764-5.739-7.725 23.62 1.31 7.943 64.463-4.545-5.248Z" class="n"/><path d="M99.07 110.842c-2.87 1.756-8.546 5.903-11.648 5.493-1.835-12.435-3.225-6.74-8.993-14.8-.716-1.806-1.497-6.052-3.98-8.126-2.678-2.236-7.05-2.235-7.308-2.235.04-4.67-5.12-10.28-9.75-6.48-5.04-6.38-13.5-3.41-20.29-2.22.723-45.862-7.63-28.745 33.053-36.242 8.43 1.139 24.26-.687 11.823-10.421-2.95-.317-8.903 1.977-8.978-2.612-.435-2.298-3.614-1.584-3.748-4.095H89.1c3.993 27.159 6.096 54.574 9.97 81.738Z" style="fill:url(#b)"/><path d="M194.918 25.082c-.45-2.34.95-10.07-1.48-10.71-57.147-1.8-113.793-.52-170.99-1.18-4.43.4-1.24 19.91-2.05 24.22.119 38.423 1.408 76.836 1.28 115.27-3.75 3.76-.83 10.16-.39 14.83-6.17-.64-9.24.92-14.39 3.33-14.13 4.44 1.3 13.13 7.11 17.31 1.45 1.48 5.46 1.23 5.63 3.55-.5 17.01-.52 33.98-1.3 50.96-4.22-.18-8.09-1.23-12.2-.07-.98 3.21.18 6.56-.54 9.82-1 6.49.68 8.27 7.23 7.34 49.043.07 98.156.14 147.25.05.11-.78.23-1.55.34-2.32-50.463-1.868-100.932 2.123-151.47-.05-1.91-3.17-.35-7.9-.87-11.58-.04-1.64.67-1.77 1.78-1.7 9.43.27 18.95.37 28.38.15 7.4 1 3.03 6.69 17.78 5.13 4.14-.37 8.15-1.35 11.64-3.51 8.22-.9 16.39-.38 24.62-.36 23.313.113 46.626.095 69.94-.24l.39-2.62c-15.851-.24-54.46.21-56.62-.06-.14.32-24.057.717-35.64-.02 3.3-6.97 3.61-14.31 3.72-21.37 9.13-8.59 7.33.92 12.13-.4 1.45-.96 3.25-2.83 4.85-1.06 2.68 2.4 3.43-8.33 9.98-5.38 1.4.6 2.46 1.26 3.97.4.19-.11.57 0 .94.2 1.65.6 1.67 3.87 3.72 3.29 1.76-.66 3.93-2.41 5.58-.63 1.62 1.71 3.57-.17 5.23-.5 1.64.17 2.69-.92 3.71-1.83 1.56-1.7 2.75-3.46 4.74-1.34 1.06.09 2.5.38 3.12-.76 1.388-1.945 7.105-3.704 8.59-1.16 4.37 5.15 5.84-6.4 10.04-3.77.7.42 1.55-.83 1.97.14 3.17-1.2 4.61-6.1 8.69-3.83.13-.61.25-1.22.36-1.82-5.18-3.12-7.82 3.53-10.29 2.45-4.11-1.88-6.39 2.81-8.38 5.61-1.721-5.496-10.31-4.102-12.88-.24-1.29 1.08-3.16-1.02-5.39.41-3.722 5.684-9.884 1.792-15.1 4.03-.687-2.385-3.451-5.031-5.9-3.2-.93.68-1.81.95-3.09.53-3.67-1.01-8.15 1.56-9.35 5.17-2.01-.66-3.97-.9-5.69.5-3.68-4.82-7.76-2.29-11.66.71-.37-2.41-.89-4.63-2.68-6.43-.852-1.934-2.278-.353-3.87-.37 9.26-11.162 8.496-1.792 19.86-4.14 6.86-1.68 11.72-8.66 13.14-15.34-.74-3.14-9.12-2-11.94-2.43 3.565-1.322 6.01-4.198 9.239-5.411 2.89-.4 6.45.59 8.81-1.41 9.895-4.228 16.812-13.145 27.01-17.17 12.157 7.652 22.376 11.741 33.41-.15.68 13.031-2.79 24.4-5.25 36.88.954.612 1.932.527 2.82-.1.01 0 .02 0 .03-.02.21-.13.43-.3.65-.48 2.27-12.099 5.28-24.38 5.78-36.659-1.04-3.94 2.16-3.35 1.57-7.33-1.42-.21-2.86-.53-4.29-.68-.86 1.28-.71 3-2.58 3.79-4.44 2.97-8.12 9.29-14.18 6.83-12.96-3.34-23-6.88-32.03-17.31-.58.07-1.15.17-1.71.29 4.13 4.93 7.21 10.68 13.48 13.52-11.177 4.207-18.988 16.704-31.89 16.97.95-2.54 6.08-7.76 2.25-9.37-5.01.21-10.18-.58-15.09.49l-.09-.3c8.54-4.31 9.27-13.82 11.29-22.16 6.56 1.19 13.46 3.03 20.05.85-.54-.49-1.12-.94-1.76-1.32-6.07.333-12.433.33-18.07-2.06-.613-3.71-3.353-2.916-6.28-2.18-2.028-1.39-4.763-.866-6.72-1.87-.29-.46-.812-.55-1.05.08-1.29-1.33-3.11-.63-4.68-1.33 4.027-6.068 9.87-10.203 16.29-13.46.01-.02.03-.03.05-.03.34-.75.75-1.48 1.19-2.2-.16-.33-.31-.61-.44-.87-.62.16-1.24.32-1.85.48-.51-.74-1.02-1.48-1.52-2.21-.8.05-1.87.2-2.71.16.645 1.026 1.308 2.022 1.96 3.04-4.28 2.27-8.09 5.22-11.44 8.73-9.143-3.304-17.103-9.93-25.69-14.72 8.291-2.439 17.386-1.051 25.76-3.12-.53-.579-1.139-1.18-1.37-1.94-7.693 1.84-15.901 1.318-23.79 2.31.122.211.239.37.37.59-.634.102-.715-.871-1.33-.53-5.564 1.535-11.706.879-17.43 1.5v-24.71c4.978-.778 7.893 4.874 13.56 3.009 4.728-.74 4.731.955 8.01 2.552 1.485.054 3.548.146 4.43.599 6.368 4.259-3.527 6.41 12.06 4.56-.687-1.24-1.036-3.32.5-4.06l.28-.67c.075.093.134.19.21.28.44-.34.87-.68 1.31-1.01-.088-.132-.18-.278-.29-.43-.493-5.195-1.729-6.01-5.5-9.27-3.34-6.253-7.078-12.3-11.07-18.15-4.342-6.672-9.532-12.614-14.36-18.93-1.016-1.574-2.26-3.958-4.54-3.02 9.02 13.57 20.109 26.071 27.89 40.24h-2.91c.077-4.67-5.111-10.275-9.74-6.49-5.044-6.375-13.502-3.384-20.29-2.22v-32.2c.98-.48 1.97-.97 2.97-1.45.03.11.06.32.09.5a331.885 331.885 0 0 1 29.57-1.962c.617.148.527-.61.41-.978 5.903-.516 19.67 2.139 15.43-7.39-.25-2.1-3.66-1.45-3.47-3.1-2.364-.423-7.643 1.166-8.88-1.05-.27-.84.22-1.84-.58-2.52-1.21-1.52-3.26-.77-3.38-3.21h19.85c5.401 22.209.914 48.068 11.59 68.17-1.41-8.093-3.232-24.6-3.16-24.62-2.13-14.25-2.02-28.94-6.07-42.85-.19-1.135 4.401-.883 7.97-.68 12.476.07 24.24.003 36.64.04-1.24 3.3-2.33 6.59-2.76 10.3-4.252 2.341-2.332 2.695-7.99 2.4-5.772 1.274-8.896 7.183-15.28 7.25-6.78.33-16.09 1.79-11.79 10.8 8.251 5.446 18.952 2.372 28.18 2.28-4.292 20.365-9.167 40.648-15.41 60.51 1.251.873 2.256 2.066 3.05 3.36 10.691-.347 17.94 8.93 22.57 17.42-.26.1-.51.2-.77.3.82.53 1.64 1.03 2.51 1.49 4.37-2.105 12.402-2.954 16.19-5.54-5.25.564-10.488 1.487-15.53 3.08-1.29-6.43-6.72-5.39.99-9.79 2.455-2.141 17.71-8.95 18.35-8.73 7.59-3.56 16.35-6.44 22.94-11.64-.01 2.778-.021 5.757-.02 8.54.6-.03 1.19-.07 1.79-.11.405-9.13-.274-18.295-1.77-27.31-.136 4.225.225 8.52-.14 12.73-6.214 1.059-12.547.46-18.82-.07-6.14-.926-13.503.523-18.9-3-3.138-2.108-3.225-8.176 1.33-8.76 11.524-.6 10.141-4.954 18.02-7.752 7.348.092 11.074-7.576 18.51-7.308v7.03c.574-.535 1.201-.317 1.89-.35-.807-19.318 1.771-39.966-.88-58.71-48.548-.047-97.876-1.039-146.36.109-2.563 44.112.966 89.533.38 134.2-.1.05-.2.1-.3.14-3.24-4.31-7.4-7.21-12.52-8.3.75-46.18-.18-92.56-.96-138.76 53.782.765 107.306.149 161.12.511 14.076-1.034 8.591 2.76 9.58 13.22-.032 12.25-.001 24.495-.15 36.74a24.969 24.969 0 0 1 2.1-2.39c0-12.66.08-25.32 0-37.97Zm-77.36 35.07c-5.701.354-11.75.763-17.15-1.34-4.797-7.579 10.86-5.886 14.289-7.97 3.82-1.223 6.08-4.918 9.89-6.15 2.55-.64 5.69.07 7.74-1.75 3.654-2.53 8.254-.617 9.72 3.52 0 0 .01 0 .01.01 4.89 2.894 7.633-2.371 10.41 7.43 1.248-.081 5.036.73 2.73 2.55-.88.65-1.79 1.41-3 .71-11.432 1.093-23.045 3.137-34.64 2.99Zm25.39 46.98c.22-.26.29-.64.46-1.04 4.09 1.26 8.32 2.37 12.62 2.57-.003.011.034.017.03 0q.01.01.02 0c0 .01.01.01.02 0 .07.02.13.02.2.01 0 0 .01.01.02 0-.001.01.02.016.03 0 0 .01.01.01.02 0h.01q.01.01.02 0h.01c7.243-.793 14.48.348 21.46 2.22-14.76 7.18-29.46 14.55-43.7 22.78-1.66 1.4-5.5-5.4-9.39-6.25 5.837-6.946 12.03-13.588 18.17-20.29Zm38.22-38.38c.08 3.06.01 6.12.01 9.31-4.08-1.28-8.64.79-11.61 3.65-2.47 2.77-2.43 2-7.72 2.38 5.69-8.69 13.37-15.72 19.23-24.25.46 3.01.01 5.96.09 8.91Zm-44.89-31.03c1.204-2.41.797-7.106 3.34-8.53 13.105-.239 26.191.36 39.28-.12 4.62-1.35 1.265 22.287 2.41 26.41-8.589 12.004-17.986 24.07-28.94 33.89-2.972 2.56-7.367 1.324-10.59 3.35-4.07 2.583-3.441 9.004-.32 12.09-6.35 7.13-13.24 13.64-18.62 21.47-3.13-2-6.56-2.34-10.14-2.53 6.578-20.136 10.212-42.83 17.257-61.91 8.086-.268 15.845-1.635 23.873-2.46 4.675-.621 6.433-7.294.57-7.47v-.01c-2.241-4.784-3.7-9.416-10.27-7.04-1.677-1.307-2.451-3.304-4.05-4.64 0-.01-.01-.01-.02-.01-1.137-.91-2.578-1.209-4.11-1.3.11-.41.23-.8.33-1.19Zm-116.78 150.94c-5.522-4.015-10.989-7.866-15.93-12.62 10.098-6.722 16.798-10.185 24.449 1.07 6.403 4.155 6.652 2.103 7.16 10.75-.12.02-.25.02-.37.04-1.15-1.563-22.07-17.258-18.82-9.91 6.362 2.648 12.428 6.42 17.1 11.51v.01c-4.505.782-9.62 2.194-13.59-.85Zm18.51-31.27c-.596-4.715 1.125-7.834 6.24-8.78-3.793 7.63-4.026 16.773-.82 24.64-1.482.026-1.662-.867-1.97-1.88-3.622-6.807-3.926-6.221-3.45-13.98Zm30.94 22.14c.703.264 1.469.5 2.21.71-3.766 4.29-3.342 10.112-5.63 14.83-3.455 5.22-5.491 11.432-5.96 17.71h-2.25c-.06-9.253 1.534-18.749 5.9-26.97 1.71-1.96 2.346-7.002 5.73-6.28Zm-5.36 1.27c-3.263 5.477-6.318 11.232-7.55 17.54-.864-4.998-2.812-9.85.63-13.67v-.01c1.114-1.517 2.29-4.82 2.79-7.24 1.69.51 3.41 1.02 5.21 1.57-.36.6-.73 1.2-1.08 1.81Zm-5.53-7.76c-.06 4.134-1.02 8.385-3.55 11.73-.875-4.604.194-12.847-5.06-15.18-1.844 3.37 2.554 8.68 2.45 12.56-.74-.715-1.46-1.428-2.1-2.23v-.01c-6.646-8.78-7.6-21.468-3.17-31.44 8.93 4.961 11.993 14.808 11.43 24.57Zm-4.08 38.94c-.119 1.393-1.269 1.06-2.4.95-.77-3.482-1.525-6.966-2.28-10.44 2.138 1.443 4.452 2.768 4.89 5.39 0 0 .01.01 0 .02.258 1.028-.276 2.86-.21 4.08Zm-1.03-20.99c.01.09.03.19.05.27-2.014-1.33-8.358-9.626-8.65-3.45-2.58-3.62-2.11-7.39-1.6-11.62 2.878-1.712 6.025 7.424 8.8 9.19 2.146.941 1.097 3.82 1.4 5.61Zm-6.05-3.11c3.946 2.439 6.684 6.917 6.47 11.62-.94-.86-1.551-6.328-3.78-4.33.615 2.851 2.869 5.177 3.12 8.13-4.572-3.944-6.695-10.029-6.67-15.97.29.18.58.36.86.55Zm-7.44-6.07c3.975 8.178 8.175 16.84 8.79 26.08-3.358-9.1-10.159-17.112-11.91-26.49.913.092 2.162.21 3.07.29v.01c.02.03.03.07.05.11Zm-1.95 12.96c.558.835 1.276 2.209 2.21 3.04 0 0 0 .01.01.01.9 1.075 1.244 2.512.68 3.78-2.496-2.295-4.411-8.113-8.71-7.41.233.627-.67 1.341-.02 1.88 2.88 1.53 4.53 4.3 6.39 6.85-.09.11-.18.21-.26.32-3.98-.03-11.74-7-9.55-10.73 4.209-1.112 7.16-2.067 9.25 2.26Zm-17.11 47.79c.321-16.918.653-33.877.97-50.81 1.22.289 2.466.599 3.71.89.789 2.173.763 5.143 2.6 6.68.598 2.89 3.445 4.227 5.82 5.46.153 12.61.324 25.126.49 37.78h-13.59Zm14.94-32.78c.172-1.074-.464-2.767-.41-3.81-.01-.01-.01-.02 0-.02-.3-1.343 4.143-1.02 4.71-.23 0 .01.01.01.01.01 1.047 2.124 1.79 4.345 2.76 6.51-6.485-.303-6.055 3.562-6.67 8.23-.787-3.474-.089-7.184-.4-10.69Zm3.42 32.77v.01h-3.02v-14.19c.02-.01.05-.01.07-.01.2 4.88.084 10.047 2.96 14.19h-.01Zm29.3-28.04c4.29 6.799 3.844 17.866.41 25.35h-.01c-1.41 2.435-3.085 5.741-6.08 6.31 0 .01-.01.01-.01 0-21.24 5.749-28.16-13.123-23.63-30.75 9.525 2.204 19.878 2.042 29.32-.91Zm3.48-10.54c-.338.698-.502 1.537-1.04 2.13v.01c-3.13 2.08-4.618 6.62-8.81 6.45 1.23-6.831 3.302-13.393 8.11-18.58 3.303-1.318 7.336-.224 10.8-1.46.06.085.08.175.14.26-1.303.748-2.606 1.569-3.55 2.75v.01c-.01 0-.02.01-.03.02h-.01c-2.836 2.132-4.298 5.218-5.61 8.41Zm17.06-11.16c2.699-.019 5.455.017 8.14 0-.627 8.608-10.838 16.025-18.87 11.31 0 0 .01 0 .01-.01 3.172-2.74 7.429-2.98 11.24-3.98 0 0 0-.01.01-.01 1.44-5.001-13.19 1.11-14.65 2.88l-.32-.23c.55-1.27 1.29-2.46 2.17-3.56 0-.01.01-.01.01-.02 2.973-3.709 7.541-6.184 12.26-6.38Zm-.55-18.03c4.139-.515 8.312-.158 12.44.34-5.248 11.67-16.562 14.553-28.39 15.9v-.01h-.01c2.028-3.174 5.533-4.835 8.74-6.54.922-2.746-2.332-.962-3.92-.06v.01c-2.115 1.246-4.167 2.724-6.01 4.22h-.01c-.331.272-.657.555-.96.82v.01a4.093 4.093 0 0 0-.36.36c2.846-8.897 8.684-15.46 18.48-15.05Zm-2.97-25.22c3.18-.515 7.073-2.105 9.97.1 1.763 14.864-10.464 23.414-23.85 25.06l-.13-.28c2.07-2.635 4.66-4.816 6.94-7.26 2.259-2.885 8.578-4.485 8.38-8.85-4.593.308-13.005 9.965-16.3 12.93-1.19-9.493 5.691-19.578 14.99-21.7Zm-4.75-3.74c1.592.273 2.992.748 4.58 1.21-11.725 2.69-17.484 13.629-17.16 25.27.438 1.62-.27 3.255-1.44 4.38h-.01c0 .01 0 .02-.01.01-2.232.146-4.281-1.345-6.5-1.59.524-9.808-.668-20.713-8.97-27.14 0 0-.01 0-.01-.01a31.959 31.959 0 0 0-2.49-1.82c4.477-2.15 9.68-.777 14.45-.82 5.844.31 11.78-.524 17.56.51Zm-43.05-23.94c.24-.08.57-.18.93-.29.565 1.156 1.65 1.833 2.82 1.01 8.687-4.152 15.277 3.385 22.51 7.36 5.244 2.844 10.79 5.372 15.68 8.79-1.246.565-2.375 2.212-1.62 3.59-13.413-.214-27.495-1.025-40.01 4.65.15-8.42-.48-16.66-.31-25.11Zm-.35-35.55c.71-4.32 7.91-1.698 10.91-3.32 4.83-1.883 6.701 4.783 11.22 3.32 7.516-1.702 4.44 5.276 7.01 7 7.178-.18 12.291 3.644 6.33 10.04-1.434.831-3.37.363-4.9 1.03-.773-3.598-3.588-6.681-7.57-5.49a20.575 20.575 0 0 1-2.29-1.21h-.01c-5.439-4.59-7.908-.039-12.96-2.139-1.525-1.04-6.679-4.433-6.8-.851-.017 0-.306.075-.35.08-1.1-2.673-.454-5.683-.59-8.46Zm-.36-57.35c9.497.148 19.779-.24 29.43.02 1.743.11 1.001 2.203 2.01 2.9 1.538 1.036 3.496 1.663 3.69 3.82 1.02 3.61 14.209-.806 11.92 7.32-11.922 2.683-24.584 1.348-36.44 4.03a14.894 14.894 0 0 1-.13-.62c-3.543.508-6.96 1.032-10.48 1.6v-19.07Zm-14.24 127.05c9.797 1.77 16.027 11.08 16.72 20.59-.09.04-.19.07-.29.12-1.155-1.385-7.82-13.443-9.78-7.9 4.179 2.588 6.721 7.12 9.61 11.02-9.928-2.902-18.476-12.944-16.26-23.83Z"/><path d="M102.615 124.513v.007c-.279.072-.565.143-.858.215.293-.072.58-.15.858-.222Z" style="fill:url(#c)"/><path d="M91.835 127.464c-4.284 2.269-8.1 5.221-11.44 8.732-8.94-3.176-17.226-10.01-25.694-14.72 9.435-2.545 19.98-1.059 30.603-4.08.046.092.116.17.171.265-.596.242-1.183.487-1.786.714.741 2.06 2.314 2.83 4.08 2.815 1.347 2.094 2.714 4.183 4.066 6.274Z" style="fill:url(#d)"/><path d="M100.66 143.814c-.1-.01-.2-.03-.3-.03.19.02.37.04.56.07-.08-.01-.17-.03-.26-.04Zm-.94-.11c-.06 0-.11-.01-.17-.01l.81.09c-.21-.03-.43-.06-.64-.08ZM255.87 255.424a.085.085 0 0 0-.07 0c.04-.004.058.01.09.01q-.01-.01-.02-.01Z"/><path d="M146.33 151.634a.44.44 0 0 1-.06.1.3.3 0 0 1 .06-.1Z" class="n"/><path d="M230.4 73.554c-.09-.09-.19-.18-.29-.26.104.085.217.16.29.26Z" class="p"/><path d="M89.125 121.07h-.007l-.837-1.287c.286.429.565.858.844 1.286ZM103 108.754l-.13.1v-.01c.04-.03.09-.06.13-.09ZM106.916 126.721v.007c-.278.022-.557.05-.829.072.28-.029.55-.05.83-.079Z" class="n"/><path d="M254.35 266.53c-.52.57-.94 1.04-1.66 1.85-1.289-2.57-2.667-5.364-2.16-8.34.19-.09.38-.17.57-.25 1.09 2.26 2.18 4.53 3.25 6.74ZM249.37 268.14l-.49.26c-1.59-2.06-2.45-4.32-2.7-6.91l.8-.2c2.17 1.56 1.913 4.5 2.39 6.85ZM257.28 264.31c-2.05-1.44-3.31-4.5-2.07-6.37.69 2.13 1.38 4.25 2.07 6.37ZM261.34 261.6c-.21.13-.42.27-.63.41-1.06-1.47-2.28-2.89-2.75-4.68.27-.14.54-.27.8-.41l2.58 4.68ZM118.923 138.627c-.887 2.983-1.648 5.566-2.62 8.81-2.749-1.284-5.55-2.568-8.31-3.85-.11.05-.17.07-.22.1-.02 0-.03.01-.05.02l.25.28c-3.423 1.648-7.192 0-10.78.04l1.27-2.8c-1.554-.107-2.626-1.346-2.65-2.88.953-.734 2.333-.809 3.48-.97-1.245-1.325-4.495-1.577-3.26-4.03 1.472.335 2.924.688 4.39 1.02.097-.3.192-.6.28-.9-2.627-.727-6.463-3.467-1.54-4.29 3.281-.195 6.855 3.084 10.37 2.39 1.508-3.584-2.786-5.405-3.48-8.54 7.722 1.943 8.406 10.28 12.87 15.6Z" class="o"/><path d="M99.013 98.52c-.519.44-1.223 1.006-1.63 1.34-6.088-4.777-8.906-2.655-6.29 5.64-.17.13-.34.25-.51.38-5.522-4.697-4.929.848-8.56 3.42-2.103-.394-6.187-6.378-2.47-6.591 5.776-2.968 9.271-8.81 15.95-10.76 1.178 2.224 2.325 4.363 3.51 6.57Z" style="fill:url(#e)"/><path d="M264.936 294.974c-.668 2.024-.779 4.233-1.35 6.31-2.463-1.463-3.922-1.982-5.69-.67h-.01c-2.61 2.73-2.251 7.81-2.43 11.15-5.19-4.262-3.166-11.55-4.4-17.34 2.798 3.244 7.31 2.009 10.57-.08-.245-.549-.264-.93-.15-1.22q-.01-.01.01-.02c.107-.229.356-.38.6-.42l.01-.01c.18-.04.37-.04.58 0 .033-.015.075.018.11.01v.01c.623.107 1.234.488 1.64.97.01 0 .01.01.01.02.067.066.111.135.16.21v.01c.219.306.326.688.34 1.07Z" style="fill:url(#f)"/><path d="M266.636 289.253c-6.12 4.84-12.37 2.36-18.58.91 6.023-1.678 12.435-2.151 18.58-.91Z" style="fill:url(#g)"/><path d="M231.112 81.575c-3.91 6.93.25 18.45-4.38 23.15-4.37 3.69-10.24 3.64-15.07 6.53-2.338 1.268-4.976.452-7.36-.23-3.328-7.49-1.67-5.535 1.961-11.34 1.67-4.518-.65-11.634-6.97-10.36q-.01-.01-.02 0c-.84.22-1.54.62-2.27 1v.01c-.03.02-.06.03-.09.04-.038-2.661 1.35-5.83-.17-8.32-.02.21-.03.42-.04.63-.013-1.93-1.677-2.862-2.641-4.42-1.84-3.895-2.342-8.907 1.6-11.58-.12.12-.26.24-.37.35 2.722-3.643 7.18-5.529 11.69-3.13 3.73.68 8.01-1.38 11.06 1.17 1.932 2.885 3.984 6.019 7.36 7.1v.01c1.956.57 4.273 2.323 5.76 4.05v.01c.93 1.444.541 3.064-.05 5.33Z" class="p"/><path d="M243.416 312.994a.349.349 0 0 1-.04.16c.017-.052.007-.118.04-.16ZM255.596 326.843c-.11-.02-.22-.05-.33-.08.112.021.222.048.33.08Z" class="n"/><path d="M275.826 319.293c-.67 4.21-5.68 5.02-8.65 7.17-7.138 3.298-15.249-1.158-22.13-2.75-.94-11.01-3.99-21.73-6.1-32.55.909.139 1.425.587 1.73 1.39.01 0 .01.01.01.01 6.271 3.676 8.17.412 8.23 9.7h.01c.312 3.17.461 6.619 2.21 9.38h.01c.05.08.11.15.16.22v.01c.06.07.12.14.17.21h.01v.01c.12.13.24.25.37.38 0 0 .01 0 .01.01.91.81 1.92 1.14 3.34 1.03.015-.022.034-.039.05-.06.464.085.885.103 1.38.06 2.24-2.76.73-6.97 2.23-10.3 10.517 6.482 6.51-8.027 11.99-12.25 3.03 9.14 2.39 19.08 4.97 28.33ZM268.856 284.843c.051.57-.04 1.25-.67 1.42v.01c-8.293-2.614-17.412-1.36-25.39 1.93-.487-.198-.93-.49-1.43-.74.134-1.498 1.666-2.677 2.81-3.76-.26.23-.5.48-.74.76 3.412-2.322 7.404-2.931 11.58-3.41-.34.01-.67.04-.98.06 4.68-.818 15.312.135 14.82 3.73ZM226.606 384.632c-3.474 1.757-7.71 2.001-11.35.59 3.78-.206 7.575-.39 11.35-.59ZM175.795 386.542c-3.582 1.034-8.115.857-11.86 1.19h.42c-6.973.086-14.115.805-20.9-1.26 4.11 2.65 9.51 2.52 14.26 2.68q.01.01.02 0c1.57-.01 3.18-.11 4.74-.33l-.06.09c5.987-1.165 13.142-.144 18.53-3.58-1.72.4-3.43.8-5.15 1.21Zm-3.03.7.15-.03c-.05.02-.1.03-.15.04v-.01Z" class="n"/><path d="M257.787 256.953c-.787-.233-1.492-.77-2.28-.93l-.01-.01c-.232-.02-.433.022-.62.17h-.01c-.626.603-.956 1.45-1.36 2.2-3.078-1.837-3.632-.737-4.11 1.86-1.634.508-2.925.947-4.44 1.39a75.08 75.08 0 0 0-.97-1.48c2.432-2.427 4.062-5.95 3.5-9.43-.593.16-1.17.32-1.76.48-.23 7.46-5.56 7.94-2.94 10.6 1.34 1.61 3.07 3.05 2.65 5.54a19.214 19.214 0 0 1-1.82-1.28h-.01c-.995-.8-1.862-1.694-2.54-2.75.002-.017-.002-.008-.01-.01-4.194-7.756 4.292-16.086.58-24.22 2.208-1 4.645-2.182 7.41-3.46 1.35 3.31 2.69 6.57 2.16 10.32-.18 1.26.77 2.45 1.44 3.47v.01c1.671 2.547 3.519 4.953 5.14 7.53ZM207.837 118.967c-.15 2.937-1.36 6.676-4.87 6.22l-.02-.12c-3.264-.189-6.804.539-9.93-.74v-.01c-3.021-1.622-5.037-9.162-.22-9.64 3.54 1.09 7.351-.101 10.72-.71 1.494 1.804 4.991 1.955 4.32 5ZM171.648 374.772c-1.955.814-3.723 1.563-5.76 2.41.2-1.53.36-2.83.56-4.43 1.75.47 3.45.93 5.15 1.39.014.198.035.424.05.63ZM202.916 93.671c-1.335-3.823-5.906-.413-6.41 2.2-.01 0-.01.02-.01.02h-.01c-.152.18-.352.343-.56.47-.01 0-.01.01-.01.01a1.561 1.561 0 0 1-1.12.08c.25-4.94-3.09-8.91-.47-13.61-1.34-.79-2.59-1.57-3.96-2.38-5.198 14.66-12.547-.662-5.08 20.68 1.27-.25 2.9-.58 4.75-.95.91 3.66-2.95 2.72-5.25 3.79-.203 4.463 4.187 7.196 8.28 7.33v.01c2.303.965 4.742-.166 7.07-.44v-.01c2.393-3.178-.951-7.145-1.66-10.07.838-.846 2.304-.74 3.16-1.58v-.01h.01c1.48-1.245 1.798-3.816 1.27-5.54Zm-10.87-8.2c-.298.648-.739 1.22-1.11 1.83-.17-.16-.33-.31-.46-.45q0-.01-.01-.01c-1.315-1.128.105-2.409 1-3.27.193.676 1.02 1.139.58 1.9Z" class="o"/><path d="M191.474 83.732c1.358 1.805.31 2.275-.52 3.733-1.713-1.571-1.108-2.082.52-3.733Z"/><path d="M279.215 314.996c-1.15-9.47-3.07-18.41-3.63-27.85-.9-2.52.68-8.31-2.05-9.02-6.02-30.76-9.14-11.57-19.06-33.98-4.69-26.88-6.82-48.05-12.81-73.64-.88-20.62-12.17-35.16-29.67-45.19-3.07-1.74-.36-6.06-.56-8.91 15.67-12.19 20.89.43 21.52-26.66-.29-.05-.53-.08-.62-.1 8.4-18.6-5.71-15.95-10.64-25.26-4.61-7.67-9.39-.67-14.68-3.53-3.85-2.34-9.07-1.64-11.9 1.94-3.4 3.95-8.14 8.56-6.18 14.16.63 2.31-2.56 8.38-5.09 8.87-5.53.25-3.71 4.79-2.48 8.34 1.21 4.6.02 9.74 2.23 14.12 3.04 3.6 5.62 7.41 3.63 12.3-33.3-3.42-26.8 25.43-43.47 26.44-9.19-1.14-16.27-12.68-24.37-13.28-6.02-4.3-3.31-9.51-13.16-14.57 3.55-12.28-3.98-18.39-9.48-28.44-.01 0-.01-.01-.01-.01-.27-.44-.55-.89-.85-1.37-7.19 3.81-13.42 7.85-19.55 12.8v.01h-.01c-3.42 2.59 3.4 10.53 3.63 14.18h.01c6.55 12.28 10.91 4.57 16.57 9.42-7.483 26.143 5.393 16.017 22.87 24.9-2.04-20.48 11.88-5.29 20.36-.45 1.16-2.34 3.7.41 5.25.84.3-.05.63.27.6.48 12.34-6.69 15.66-22.55 28.51-26.38 6.71-1.36 12.03-2.91 18.05.94 5.52 1.68 11.36 1.85 16.9.38 35.59 14.39 31.22 69.75 39.64 103.91-3.39 1.89-10.66 7.26-13.3 1.46-1.5-7.87-2.46-15.81-3.25-23.78-1.9-12.22-4.64-24.74-7.55-37.06.26-6.85.87-4.03-4.26-8.91-4.15 2.81-1.34 11.27-1.26 15.67 1.22 13.87 2.1 27.24 4.25 41.13-20 4.79-41.62 4.68-60.92-2.58-.65-.4-.65-.76-.48-1.13 1.84-4.09 2.2-8.9 3.44-13.24-1.01.89-2.25 1.44-3.5.6-.237 9.446-9.428 12.792 2.56 20.25-5.635 46.238-9.762 94.635-11.45 141.59-2.28.54.55 3.02 1 4.24-3.45 6.31-14.02 3.98-14.99 12.46-7.12 17.5 25.14 10.55 34.32 10.38 2.66-.12 5.04-1.77 7.62-2.05 3.71-.37 4.99-1.65 4.76-5.37.33-8.3-3.28-8.81 5.16-11.34 4.04-1.36 2.08-4.89 1.62-7.97-1.8-31.21 4.42-62.05 8.12-92.91.08 0 .17.01.24.01 2.69 30.98 3.61 61.97 2.69 93.04.05 3.55-.77 7.6 3.24 9.8.68 4.26-1.98 11.67 2.27 13.85 6.08 1.83 21.96 3.06 22.88-5.63-2.55-17.23.36-6.59 7.24-17.88-9.81-46.1-4.65-95.11-13.81-141.36-.31-4.66 4.27-1.88 2.07-10.42-2.45-10.15-3.44-20.75-4.28-31.16 4.18 14.75 5.57 30.01 7.71 45.14 1.56 7.44-.55 9.27 8.46 11.2 2.63 8.23-5.94 20.98-.96 25.29 2.09 5.16-5.84 7.28-2.34 21.82-1.26 1.16-.4 2.2-.01 3.32 2.04 12.59 3.98 25.15 6.09 37.77 9.67 9.17 40.89 7.11 37.12-11.62Zm-199.37-206.51c-.33-.46-.66-.91-.93-1.4h-.01c-.54-1.1-1.66-2.46-.59-3.36v-.01c4.19-.86 6.29-4.77 9.59-7.11h.01c2.34-1.64 4.89-2.77 7.47-4.02 1.18 2.21 2.33 4.35 3.51 6.57-.4.34-.77.64-1.15.95v.01c-.16.12-.31.25-.47.38-5.79-4.83-8.97-2.44-6.29 5.64-.18.12-.33.25-.51.38-6.88-6.5-6 7.42-10.63 1.97Zm3.48 7.4c-1.23-.88-1.5-2.49-2.25-3.7 3.328 1.14 5.083-2.215 6.2-4.73 5.95 5.12 6.31-3.14 5.31-7.33 1.84.93 3.21 3.86 5.56 2.56v-.01c.42-.28.94-.57 1.38-.67-.01-.09-.03-.17-.04-.26 2.8.23 3.33 4.49.51 5.31 0 .12-10.47 7.85-16.67 8.83Zm1.22 2.41c1.57-.6 3.12-1.25 4.66-1.92v-.01c4.01-1.77 11.45-6.63 11.45-6.81.94-.66 1.86-1.31 2.79-1.96 5.26 8.06-6.88 12.21 4.53 21.07.21.29.34.8 0 .91-2.75-1.63-7.08-1.33-8.93-4.22.07-.02.13-.03.2-.05-.07-.17-.14-.33-.21-.48.03.07.08.15.12.22-2.15-7.91-11.52-.28-14.61-6.75Zm33.8 21.6c-.67 2.25-1.28 4.33-2.05 6.89-2.75-1.28-5.55-2.57-8.31-3.85-.11.05-.17.07-.22.1-.02 0-.03.01-.05.02l.25.28c-3.42 1.65-7.2 0-10.78.05.52-1.17.87-1.93 1.27-2.81-1.51-.07-2.68-1.38-2.65-2.88.95-.73 2.33-.81 3.48-.97-1.21-1.26-4.57-1.65-3.26-4.03 1.47.34 2.92.69 4.39 1.02.1-.3.19-.6.28-.9-2.68-.5-6.42-3.8-1.54-4.29 3.32-.14 6.75 2.97 10.37 2.39 1.22-2.82-1.41-4.66-2.73-6.76v-.01c-.36-.52-.6-1.13-.75-1.77 2.62.73 4.2 1.96 5.76 3.62h.01c3.27 3.46 3.86 8.43 7.1 11.98-.18.61-.37 1.25-.57 1.92Zm111.15-66.66c.03.02.05.06.07.08a3.6 3.6 0 0 0-.29-.26c.08.06.15.12.22.18Zm-42.42 35.82c-1.59-1.2-2.43-3.18-2.37-5.18 2.3-1.07 6.16-.13 5.25-3.79-1.85.37-3.48.7-4.75.95-7.47-21.35-.12-6.01 5.08-20.68 1.37.81 2.62 1.59 3.96 2.38-2.62 4.7.72 8.67.47 13.61.377.078.775.09 1.12-.08.2-.13.41-.29.57-.48h.01s0-.02.01-.02c2.89-7.87 10.02-2.27 5.14 3.34h-.01v.01c-.85.84-2.33.73-3.16 1.58.74 2.846 4.205 7.175 1.66 10.07v.01c-4.16 1.23-9.45 1.03-12.98-1.72Zm19.52 14.38c-.77 1.19-2.18 1.78-3.58 1.6l-.02-.12c-3.27-.19-6.81.53-9.93-.74v-.01c-3.06-1.36-5.02-9.58-.22-9.64 0 0 .01-.01.02 0 3.29.67 6.94.69 10.09-.88.79 0 1.08.8 1.72 1.13-.01-.02-.03-.03-.04-.05.02.01.03.02.05.04h.01v.01c4.19 1.406 3.768 5.408 1.9 8.66Zm2.43-10.7c-.1 0-.21 0-.32-.01.05 0 .09 0 .14-.01-1.02-.09-3.83-.48-4.61-2 .03.12.03.23.05.35-.07-.2-.14-.41-.2-.64.01 0 .03.01.04.01-.68-2.55-3.13-5.45-.93-7.78 7.37-4.86 1.98-17.11-6.49-11.07-.38-3.33 1.54-6.92-.14-10.11-8.99-7.52-1.17-23.15 10.24-18.16 3.73.68 8.01-1.38 11.06 1.17 2.667 6.35 9.584 6.658 13.47 11.72-.11-.49-.28-.93-.5-1.33 3.54 4.81-1.05 10.08-1.06 15.17 1.4 17.41-5.44 18.53-20.89 22.67.05.01.1.01.14.02Zm-15.93 114.65c.56.05 1.12.11 1.68.16l-1.68-.15v-.01Zm-27.75-3.61v.03c0-.01-.01-.02-.01-.03h.01Zm-16.89 153.08c.1-.02.19-.05.28-.07-.12.03-.24.06-.36.1a.16.16 0 0 1 .08-.03Zm26.81 10.33c-4.49 1.15-9.9 1.11-14.36 1.78l.06-.09c-1.56.22-3.17.32-4.74.33q-.01.01-.02 0c-4.75-.16-10.15-.03-14.26-2.68v-.01c12.24 2.65 25.33 1.54 37.49-1.13-1.26 1.08-2.69 1.53-4.17 1.8Zm-18.3-16.36c.11-.16.23-.3.35-.45h.01c-.12.15-.24.29-.36.45Zm8.49 6.41c.2-1.53.36-2.83.56-4.43 1.75.47 3.45.93 5.15 1.39.01.2.03.43.05.63-1.96.82-3.72 1.57-5.76 2.41Zm59.95 7.61c-2.9 1.31-6.22 1.73-9.32.99q-.01.01-.02 0c-.61-.14-1.2-.34-1.78-.56v-.01c3.78-.18 7.57-.38 11.35-.58-.07.05-.14.11-.23.16Zm2.42-7.06c-.01-.02-.01-.03 0-.04.01.01.01.03.01.04h-.01Zm-.36-111.48c2.27 31.88 3.28 64.05 8.19 95.63-1.27 11.34-29.8 7.55-28.58 7.54a.99.99 0 0 1-.84-.46c.57-35.04-.61-70.12-3.5-105.11-1.3-5.16 3.19-29.8-1.48-29.99-3.36.24-1.49 9.31-2.28 11.98.96 38-9.87 75.67-9.84 113.79-2.33 2.55-.33 5.06-.3 7.88-5.31 2.68-11.82 5.31-17.9 2.71-3.96-1.92-15.18-1.57-14.9-7.16 1.87-34.58.7-69.25 6.57-103.57 8.16-63.97 2.33-19.26 61.3-35.08 3.54 13.77 2.8 27.82 3.56 41.84Zm42.14 19.93c-.45.44-.94.57-1.68.5.03.02.07.03.1.04-8.49-2.783-17.707-1.553-25.83 1.79-.49-.21-.95-.5-1.43-.74.12-1.34 1.35-2.41 2.43-3.4-.12.13-.24.26-.36.4 1.03-.73 2.15-1.3 3.36-1.76-.34.14-.68.29-1 .44 2.89-1.21 5.92-1.75 9.22-2.09-.34.01-.67.04-.98.06 4.96-.47 10.92-.64 15.3 1.67-.27-.12-.55-.24-.84-.35.64.38 1.24.79 1.69 1.33.11.69.17 1.43.02 2.11Zm-8.73 7.26v-.01q-.01-.01.01-.02c.1-.23.35-.38.6-.42.203-.083.469-.025.7 0v.01c4.03.8 1.05 5.97.8 8.59-1.586-.797-3.573-1.944-5.28-.98-.15.1-.28.2-.41.31h-.01c-2.76 2.87-1.97 7.53-2.43 11.15-5.2-4.25-3.17-11.55-4.4-17.34 2.8 3.25 7.31 2.01 10.57-.08-.27-.44-.43-.85-.15-1.21Zm-13.42-2.97c6.02-1.68 12.43-2.15 18.58-.91-6.12 4.84-12.37 2.36-18.58.91Zm11.36-33.53 2.58 4.68c-.21.13-.42.27-.63.42v-.01c-1.06-1.47-2.28-2.89-2.75-4.68.27-.14.54-.27.8-.41Zm-19.37-1.06c1.35-5.83 3.97-11.59 1.79-17.67 2.21-1 4.64-2.18 7.41-3.46 1.35 3.31 2.69 6.57 2.16 10.32-.18 1.26.77 2.45 1.44 3.47v.01c1.67 2.55 3.52 4.96 5.14 7.53v.01c-.945-.195-1.943-1.335-2.91-.78h-.01c-.63.61-.96 1.45-1.36 2.2-3.08-1.83-3.63-.73-4.11 1.86-1.64.51-2.93.95-4.44 1.39-.31-.48-.65-.99-.97-1.48 2.42-2.42 4.07-5.95 3.49-9.43-.59.17-1.17.32-1.75.48-.23 7.46-5.56 7.94-2.94 10.6 1.34 1.61 3.07 3.05 2.65 5.54-.63-.39-1.25-.82-1.82-1.28h-.01c-1-.8-1.86-1.69-2.54-2.75 0-.01-.01-.01-.01-.01-1.18-1.98-1.85-4.14-1.21-6.55Zm17.89 8.45c-2.05-1.44-3.31-4.5-2.07-6.37.69 2.13 1.38 4.25 2.07 6.37Zm-2.93 2.22c-.52.57-.94 1.04-1.66 1.85-1.3-2.57-2.66-5.37-2.16-8.35l.57-.24c1.09 2.26 2.18 4.53 3.25 6.74Zm-4.98 1.61-.49.26c-1.59-2.06-2.45-4.32-2.7-6.91l.8-.2c1.573 1.11 1.913 3.105 2.1 4.89q.01.01 0 .02v.01c.1.65.15 1.3.29 1.93Zm-7.97-.87c7.14 1.49 6.87 7.24 10.28 1.85 2.32 3.06 4.17-.61 4.76-2.92 2.62.62 3.02.28 3.52-2.9 2.23 2.22 3.11.97 4.19-1.39.67 3.18 3.32 4.94 3.34 8.23-.11 2.47 1.41 4.98 1.48 7.44-1.3 1.78-4.76-.65-6.75-.45-4.26.25-8.83.02-13.18.62.31-.02.63-.03.95-.03-.29.02-.56.05-.83.07-.01-.01-.02 0-.02 0-4.54.19-8.38 2.33-11.44 5.86.11-6.04 1.56-11.45 3.7-16.38Zm1.35 46.08c0 .03-.01.07-.03.09.01-.05 0-.11.04-.16 0 .02 0 .04-.01.07Zm23.77 13.4c-3.69 1.86-7.86 1.15-11.76.33.06.02.12.03.18.05-.11-.02-.22-.05-.33-.08l.15.03c-3.56-.94-7.08-2.29-10.37-3.08-.96-11.1-4.03-21.91-6.16-32.83 1.33.27 2.82.28 3.22 1.67.01 0 .01.01.01.01 1.86 2 5.43 1.44 7.29 3.1 1.58 5.27.21 11.41 3.33 16.2v.01l.18.21v.01c.12.13.24.25.37.38h.01c.89.85 2.12 1.16 3.34 1.04 2.39-2.94.51-7.64 2.6-11 10.054 7.66 6.165-7.48 11.62-11.55 3.03 9.14 2.39 19.08 4.97 28.33-.67 4.21-5.68 5.02-8.65 7.17Z"/><path d="M107.975 129.576c-2.75-1.63-7.08-1.33-8.93-4.22.07-.02.13-.03.2-.05-.07-.17-.14-.33-.21-.48.03.07.08.15.12.22-2.15-7.91-11.52-.28-14.61-6.75 1.57-.6 3.12-1.25 4.66-1.92v-.01c4.01-1.77 11.45-6.63 11.45-6.81.94-.66 1.86-1.31 2.79-1.96 5.26 8.06-6.88 12.21 4.53 21.07.21.29.34.8 0 .91ZM99.995 107.056c0 .12-10.47 7.85-16.67 8.83-1.23-.88-1.5-2.49-2.25-3.7 3.328 1.14 5.083-2.215 6.2-4.73 5.95 5.12 6.31-3.14 5.31-7.33 1.84.93 3.21 3.86 5.56 2.56v-.01c.42-.28.94-.57 1.38-.67-.01-.09-.03-.17-.04-.26 2.8.23 3.33 4.49.51 5.31Z" class="n"/></svg>
diff --git a/browser/components/aboutwelcome/assets/mr-gratitude.svg b/browser/components/aboutwelcome/assets/mr-gratitude.svg
new file mode 100644
index 0000000000..f490d454c9
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-gratitude.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="365" height="400" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M298.245 44.383c-.198-6.014 0-12.09-.025-18.103 0-2.296-1.01-3.327-3.314-3.363-6.578-.025-13.168.036-19.771.036-8.081 0-16.174-.06-24.255-.06s-15.472-.173-23.171-.087c-8.278.062-16.543-.11-24.797 0-5.247.062-10.47.025-15.718-.024-4.41-.062-8.82-.062-13.23.049-3.93.122-7.884-.197-11.813-.221-5.457-.025-10.927.086-16.408.061-7.663 0-15.325-.147-22.987-.086-9.473.05-18.933.11-28.394.05-10.125-.062-20.423.048-30.623-.038 4.656.921 9.017 2.91 13.353 2.983 2.944.025 5.95.282 9.042-.417 1.712-.393 4.04.27 6.122.392 3.338.197 6.689.025 10.027-.282 2.131-.196 3.474.982 4.102 3.277.271 1.031 1.06 1.902 2.131 2.492 1.121.613 2.156 1.313 3.289 1.976.776.478 1.207 1.215 1.368 2.11.653 3.265 1.379 3.965 4.779 3.94 2.525-.024 5.051-.171 7.527.418 3.055.736 6.06 1.657 7.908 4.54.85 1.314 1.183 2.652.481 4.137-.641 1.375-2.021 1.46-3.289 1.546-3.302.221-6.615.221-9.904.528-7.194.724-14.376 1.375-21.57 2.074-6.984.7-13.981 1.142-20.941 1.817-.986.11-1.947.368-2.957.22-1.06-.134-1.65.369-1.761 1.768-.308-1.043-.505-1.4-1.515-1.46-3.29-.11-6.468.736-9.658 1.067-2.107.246-7.046.59-9.608 1.682.049 8.873.074 17.735.135 26.584.074 11.45.11 22.902.296 34.328 2.513-.785 9.288-2.589 11.924-2.332 3.597.393 7.021-.503 10.446-1.264 3.178-.724 5.642.651 8.08 2.16 1.27.81 2.501 1.731 3.487 2.958 1.293 1.657 3.227 1.264 4.78.565 1.872-.872 3.757-.921 5.666-.786.53 0 1.183.197 1.49.54 1.885 2.234 3.708 4.443 3.474 7.72-.221 3.253.85 4.198 4.053 4.345 3.93.135 7.798.332 11.062 3.154 1.934 1.657 1.934 3.498 1.367 5.572-.726 2.664-2.045 5.094-3.732 7.279-.813 1.067-2.181.785-3.252.92-1.294.172-2.636.258-3.819.7-1.515.564-2.045-.246-2.193-1.338-.899-6.358-6.233-8.788-11.505-7.757-1.355.282-2.279.025-3.178-.982-4.016-4.59-9.3-4.872-14.684-3.805-3.843.725-7.157.614-10.224-2.209-1.798-1.681-4.3-2.184-6.738-2.233-1.06-.037-6.184 0-6.295 2.147v.086c.012 1.031.025 2.05.025 3.081.086-1.645 4.816-1.215 5.284-2.16 1.121 1.288 2.809.81 4.189 1.374 1.995.81 3.486 2.32 5.334 3.326 3.055 1.682 6.454 1.093 9.632.896 2.895-.159 5.778.037 8.648.062 1.035 0 2.242 1.485 3.055 2.54 1.047 1.436 2.451 1.854 3.991 1.768 1.996-.086 3.88.307 5.753.699 3.4.7 4.41 3.449 4.582 6.444.111 2.405 1.602 2.516 3.289 2.455 4.127-.136 8.167-.835 12.319-.811 1.971 0 3.572 1.154 5.371.872 1.404-.197 2.217.699 3.116 1.227 1.096.7 2.378 1.51 3.388 1.768 1.687.417 1.909 1.755 2.845 2.602 1.996 1.816 1.06 7.584-1.182 8.677-1.577.785-3.376 1.313-5.002 1.288-3.252-.085-6.344.921-9.571 1.031-3.425.111-6.824.651-10.224 1.068-6.258.749-12.577.724-18.835 1.534-3.29.418-6.627.54-9.941.761-4.275.307-8.487.749-12.725 1.203-3.277.356-12.799.319-12.799.319s0 .233.05 4.185c.036 4.615-.087 9.267-.087 13.882-.025 4.651.086 9.291.037 13.942-.037 4.308.591 8.591.283 12.899l7.995-.245c1.996-.626 3.991-1.129 6.036-1.657.591-.172 2.058-3.277 2.058-3.277l11.286-3.694h36.053c-2.279 0 6.96.994 7.527 0 2.697-4.701 5.925-8.898 10.273-12.286 1.429-1.117 2.833-2.798 4.262-3.719 2.304-1.46 4.694-2.908 7.194-4.148 5.987-2.958 12.269-4.787 18.897-5.486 6.824-.7 13.649-1.448 20.584-.749 5.531.552 10.224 3.044 14.905 5.646 7.354 4.087 12.897 10.138 18.034 16.655 1.454 1.902.801 5.854 2.71 7.781l15.047-7.781h43.897l13.957 5.511s1.293-.037 1.293-.025l1.688-.049c.419-3.952-.062-7.867.135-11.819.148-2.578.111-5.143.148-7.745.074-4.197-.456-8.407-.123-12.605.283-3.129.172-6.296.172-9.426 0-4.013-.049-8.026-.074-12.027-1.712-1.363-6.183-1.805-7.649-1.89-3.314-.16-6.394-1.203-9.547-2.124-4.829-1.374-9.83-1.423-14.77-1.878-3.757-.331-7.489.234-11.259.43-3.314.196-6.652-.319-9.904-1.092-3.375-.823-6.775-1.633-10.089-2.639-6.085-1.903-7.354-7.168-5.974-12.2.246-.957.838-1.767 1.737-2.381 2.722-1.816 5.814-2.798 9.017-2.798 6.147 0 11.345-2.099 15.496-6.554 4.041-4.308 9.178-5.953 14.832-6.321 3.141-.196 5.642-1.51 7.711-3.719 3.88-4.087 8.734-6.222 14.265-6.775 1.072-.11 5.531-1.399 6.233-.454 0-7.977-.074-15.955.037-23.92.111-8.432-.037-16.852.16-25.284.111-5.142.037-10.346-.135-15.562Zm-45.381 25.835c-1.232 1.853-3.696 2.406-5.692 1.657-1.01-.393-1.995-.147-2.981 0-7.021.982-13.956 2.32-21.003 3.13-12.244 1.374-24.513 1.816-36.807 2.05-3.967.073-7.921.466-11.875.27-3.769-.16-7.527-.614-11.296-1.032-2.858-.306-4.829-2.43-4.767-5.375.246-2.455 2.377-3.805 4.681-4.922 3.621-1.792 7.563-1.792 11.493-2.16 2.772-.245 5.494-.638 8.229-1.927 1.429-.675 3.387-.982 5.026-1.73 1.65-.786 3.141-1.768 4.483-3.081 3.006-2.946 6.578-5.069 10.619-6.1 1.49-.368 3.289-.037 4.94-.086 2.87-.086 4.939-1.988 7.391-3.031 3.363-1.363 6.504-1.817 9.854.257 2.329 1.4 3.647 3.302 4.657 5.658.677 1.56 1.934 2.345 3.843 2.013 3.314-.613 6.43-.196 9.239 1.903 1.158.896 2.673 1.227 3.535 2.65.234.344.173.565.259.847.37 1.179.172 2.381.641 3.584.85 2.185 1.01 2.43 3.35 1.755 2.267-.638 3.622.197 3.56 2.05-.024 1.031-.985 1.031-1.379 1.62Z" fill="url(#b)"/><path d="M58.285 61.355v-33.77h51.378l1.209 4.222 4.836 2.412 1.813 6.03 12.089.603 6.649 4.824v7.84l-23.574 1.809-30.827 2.412-18.133 1.809-5.44 1.809ZM159.228 67.385l10.88-4.221 15.112-2.412 16.32-9.649h7.858l6.044-4.22 7.858.602 6.649 7.84 12.694 2.412 4.835 9.045 4.836 1.206.605 4.824-4.836 3.015-4.836-.603-10.275 2.412-23.574 1.809-32.641 1.81-13.902-2.413-5.44-5.427 1.813-6.03ZM58.285 176.53v-41.005l-.605-18.693 6.65-1.206 12.693-2.412 7.858.603 6.648 6.03 9.067-1.809 4.232 4.824 1.813 7.236 9.067.603 6.649 6.03v4.824l-3.627 8.443 9.067 1.809 9.067 6.03 1.208 7.236-3.022 4.824-12.693 1.206-29.014 3.015-18.738 1.809-16.32.603ZM292.208 157.234l1.209-47.638h-10.88l-12.089 9.045h-12.089l-13.903 10.854-15.716 3.015-3.022 12.06 7.254 6.031 18.133 4.221 19.343-.603 21.76 3.015ZM133.237 200.651l-9.067 12.06 7.858 1.809 19.342 3.618 16.321 5.427 23.573.603 30.827-9.648-6.044-11.457-13.298-13.267-11.485-6.03-13.902-.603-16.32 1.206-15.112 6.03-12.693 10.252ZM223.905 349.595l-24.178-20.503-.605-1.809 19.343 6.031 15.111.603 14.507 1.206 1.209-6.634 12.089-8.442 7.253-5.427 6.649-9.045v12.06l-2.418 10.854-12.693 18.694 7.858 5.427-7.858 10.854 6.913 5.815-5.704 7.523h-31.287l-21.317 7.524 5.016-20.862 10.112-13.869Z" fill="#F8F6F4"/><path d="M221.645 332.437c6.19-.745 14.145 2.02 17.349 3.496l7.737-3.496 5.861-7.225 9.846-6.525 7.737-6.525 4.923-9.788-8.205-2.097-4.455-5.127-1.406-7.924-4.455-8.855h-5.861l-7.736 4.661-5.393 9.088h-7.971l-4.923 3.03c-.391-.466-1.547-1.725-3.048-3.03-1.875-1.631-7.268-3.728-9.143-4.894-1.876-1.165-10.785-.233-11.488 1.166-.703 1.398 1.641 11.418 3.517 13.982 1.5 2.051 2.032 9.244 2.11 12.584l-7.268 10.254c4.845 2.719 16.083 7.971 22.272 7.225Z" fill="url(#c)"/><path d="m277.677 314.958-2.579 10.254-4.923 3.728v5.826l-10.315 11.652 10.315 5.36-10.315 10.021 8.158 6.046-3.208 9.586c16.039 19.173 81.981-4.307 83.669-4.679 2.11-.467 9.144-9.322 11.722-12.818 2.579-3.495 4.689-15.613 4.689-19.109 0-3.495-5.861-10.253-9.377-22.138-2.814-9.508-15.552-17.478-21.569-20.275-6.487-1.087-21.804-3.262-31.181-3.262-9.378 0-21.725 4.505-26.727 6.758l1.641 13.05Z" fill="url(#d)"/><path d="M252.144 313.715c.248.189 1.109.16.656 1.355-.714 1.879-2.29 2.84-3.865 3.598-1.765.859-2.466 1.981-2.261 3.86.058.568.131 1.413-.19 1.69-.584.481-1.036 1.471-1.998 1.195-.992-.292-.963-1.18-1.109-2.069-.744-4.545 2.859-6.031 5.616-8.041.861-.627 1.561-1.632 3.151-1.574v-.014ZM223.509 321.653c3.778 0 6.637 1.006 8.606 3.963.423.626.73 1.253 0 1.865-.729.597-1.619.801-2.13-.073-1.167-1.967-3.019-1.982-4.886-1.938-1.43.044-2.743-.422-4.099-.714-.686-.145-1.124-.597-1.109-1.369 0-.758.554-1.224 1.138-1.34.948-.204 1.882-.729 2.523-.379l-.043-.015ZM256.724 294.91c.759-.452 1.109-.583 1.342-.816.599-.612 1.167-.379 1.736 0 .657.437.35.976.117 1.515-1.036 2.462-3.647 3.744-6.054 2.943-.714-.234-1.065-.86-.933-1.515.364-1.661.204-3.366.481-5.041.204-1.267.992-1.588 1.794-1.675.788-.073 1.197.772 1.372 1.529.189.874.816 1.676.145 3.06ZM210.395 302.529c-.978-.437-1.269-1.18-1.474-1.952-.175-.641-.16-1.239.54-1.661.759-.452 1.284-.073 1.663.451 1.298 1.778 2.436 3.657 3.195 5.74.335.932-.467 1.355-1.167 1.573-.934.292-3.924-.961-4.391-1.821-.802-1.471.583-1.719 1.634-2.33Z" fill="#000"/><path d="M362.469 333.206c-.467-1.18-.832-2.433-1.401-3.54-1.867-3.613-3.238-7.444-5.266-10.969-1.765-3.147-3.413-6.235-5.849-8.959-2.232-2.506-4.843-4.589-7.309-6.847-3.267-3.016-7.425-4.079-11.451-5.259-4.799-1.37-9.759-2.083-14.748-2.375-.612-.029-.977-.043-.933-.859.437-6.439.029-12.834-.467-19.244-.394-5.332-.292-10.707-.175-16.039.35-14.757 0-29.514.175-44.271.073-5.128.438-10.285 0-15.442a26.886 26.886 0 0 1 0-4.341c.248-2.972.117-5.944.175-8.887.102-4.647-.19-9.279-.044-13.941.146-5.201.117-10.43.146-15.66.029-5.551-.175-11.072-.073-16.593.146-6.949.073-13.897.073-20.846V95.461c0-7.837 0-15.66.029-23.468 0-11.931-.029-23.833.102-35.779.044-5.055-.102-10.139.03-15.194.116-5.113-.19-10.24-.365-15.369-.102-2.753-.715-3.54-3.37-4.006-2.217-.393-4.478-.743-6.739-.786-4.406-.117-8.796-.044-13.173-.044H268.73c-5.602 0-11.218-.117-16.819.044-3.37.072-6.74-.394-10.11-.102-3.005.276-5.995-.117-9 0-4.726.218-9.467-.277-14.208.043-1.794.117-3.545-.422-5.427-.102-2.377.365-4.886-.145-7.323.044-1.327.117-2.304-.67-3.617-.583-1.999.102-4.129.889-5.879.437-2.655-.684-5.208.248-7.863-.276-1.531-.292-3.442-.394-5.193-.248-.758.073-1.283.932-1.867.583-2.232-1.326-4.726.903-6.929-.54-.146-.101-.54 0-.642.146-.496.67-1.138.496-1.765.437-2.305-.189-4.624-.072-6.987-.437-1.999-.32-4.187.248-6.287-.116-2.626-.466-5.237.393-7.936 0-2.626-.364-5.354.043-8.067 0-2.217-.044-4.449.19-6.666-.03-2.218-.218-4.377.103-6.594.03-5.091-.19-10.182-.073-15.273-.073h-35.52c-11.729 0-23.428-.03-35.156.03-2.144 0-4.303.145-6.375-.045-3.15-.291-4.916.496-5.12 3.555-.248 3.394-.219 6.832-.219 10.212.03 8.697.073 17.38.146 26.047.044 6.992.073 14 .277 20.992.19 6.73.073 13.475.073 20.205v6.366c0 2.113.51 4.415-.117 6.308-.685 1.967 2.7 3.482.19 5.274 0 0 .03.145.044.145 1.225.32-.044 1.472.758 2.156.642.51-.89.437-.904 1.282-.044 1.282.744 2.506.175 3.788-.03.029.03.146.073.146 2.334.903-1.225 2.87.715 3.86a7.113 7.113 0 0 1-.467.219c-.219.102-.496.393-.321.466 1.036.495 1.328.888.044 1.471-.292.117-.03.423.19.466 1.006.248.758.539.043.889-.394.175-.35.568-.102.67 1.109.466.671 1.399.686 2.142.043 2.899-.03 5.797.029 8.696.146 8.668-.044 17.365.175 26.018.117 4.516.423 9.091.03 13.65-.22 2.608.101 5.274.145 7.925.117 8.202-.117 16.403.219 24.605.073 1.967.117 3.977-.03 5.914-.189 2.084.424 4.079.146 6.119-.247 1.748-.102 3.511-.102 5.23.044 3.263-.029 6.555.117 9.847.044.962.321 2.04-1.284 2.011-.248 0-.67.539-.744.903-.744 3.482-1.444 6.978-.904 10.562.54 3.438.642 6.948 1.94 10.212.715 1.748-.19 1.646-1.43 1.515-5.061-.539-9.89.539-14.602 2.287-2.465.903-4.697 2.331-7.074 3.219-3.618 1.297-6.667 2.972-9.147 6.046-1.356 1.69-.977 2.622-.073 4.079 2.553 4.006 5.894 7.269 9.57 10.168 4.011 3.19 7.79 6.701 12.764 8.493 1.619.612 3.165 1.398 4.77 2.083 2.8 1.209 2.728 1.18 2.626 4.152-.103 3.365.073 6.73-.073 10.095-.278 5.769-.22 11.509-.248 17.292-.03 3.511.19 7.022-.248 10.562-.248 1.835-.175 3.758-.073 5.652.102 1.763-.423 3.482-.175 5.274.102.786.364 1.908.043 2.505-1.137 1.938-.072 3.948-.393 5.915-.175 1.209.218 2.578 0 4.02-.248 1.676-.175 3.584-.103 5.332.22 4.56-1.283 9.061-.437 13.621.146.758-.321 1.107-1.153 1.078-.89 0-1.75-.422-2.552-.422-3.793 0-7.542-.904-11.262-.641-1.678.116-4.303-.641-5.354 2.301-.495 1.355-.758 2.55-.437 3.832.467 1.762.35 3.51.365 5.302.043 3.802-1.11 7.459-.934 11.29.219 4.589 2.655 6.556 7.06 6.556 1.75 0 3.516-.437 5.266-.437 8.082-.03 16.207-.073 24.288.116 3.414.102 6.74-.539 10.124-.51 2.772.029 5.485.568 8.286.568 36.337-.102 72.704-.072 109.041-.072h35.695c6.273 0 12.516 0 18.76-.03 7.104 0 14.208.073 21.312-.189 2.772-.102 5.529.189 8.315.189 24.886.03 49.758.03 74.615.03 3.661 0 7.323-.19 10.969.043 5.062.35 7.965-1.69 8.242-6.584.219-4.414.146-8.843.102-13.286 0-1.18-.072-2.579-.831-3.511-1.298-1.602-.423-2.331.861-3.045 2.144-1.136 3.792-2.971 5.091-4.807 1.765-2.506 3.734-4.865 5.266-7.56 1.765-3.074 3.267-6.235 4.128-9.601 1.619-6.162.759-12.251-1.605-18.122h-.014ZM36.717 2.752c1.298.889 2.61.467 3.865.496 3.88.116 7.775-.03 11.656.116 2.757.102 5.528.175 8.256.044 3.414-.175 6.885.757 10.299-.466.963-.35 2.013.582 3.165.568 2.976-.102 5.996.35 8.942-.044 2.232-.32 4.493-.029 6.754-.277 1.357-.145 3.122.35 4.727.292 5.485-.175 10.984-.044 16.469-.073 6.054-.03 12.122.102 18.161.146 11.51.102 23.019.029 34.514.029 15.901 0 31.815 0 47.716.029 7.775 0 15.535.218 23.281.073a550.52 550.52 0 0 1 13.873-.03c4.303.044 8.607-.101 12.91.073 4.77.19 9.584-.102 14.383-.043 4.405.029 8.796-.073 13.202.145 2.903.146 5.82-.174 8.752-.218 2.436-.03 4.945.029 7.323.218 1.473.117 3.37-.466 4.799.743.219.19.686.175.905-.218.423.437 1.531-.35 1.531.786 0 6.454 0 12.922-.072 19.39-.073 5.813-.001 11.64-.103 17.452-.043 2.622.292 5.347.219 7.954-.044 2.754-.044 5.521-.102 8.304-.073 4.56-.044 9.134-.102 13.722-.044 6.629-.35 13.257-.117 19.856.102 2.768-.146 5.522.073 8.318.321 4.007-.219 8.071-.116 12.135.145 7.342-.117 14.655.029 21.998.175 8.784-.146 17.583-.073 26.367.029 6.017.044 12.033.029 18.05-.044 5.419-.146 10.882-.175 16.301 0 6.235-.044 12.47.073 18.69.102 6.556.102 13.082-.029 19.637-.117 4.691-.102 9.411-.117 14.087-.029 3.438 0 6.92 0 10.358 0 4.953.029 9.892-.029 14.859 0 .903-.438 1.748-.467 2.695a135.496 135.496 0 0 0 .248 16.505c.102 1.049.146 2.083.89 3.074-1.838.685-3.472-.146-5.091-.32-3.414-.321-6.813-.19-10.197-.03-.788.03-1.079-.029-1.108-.786-.219-5.58-.861-11.174-.584-16.695.292-6.118.146-12.207.219-18.311.102-11.567.044-23.148.073-34.715 0-5.347.029-10.707.029-16.054 0-5.04-.277-10.066 0-15.077.219-4.123-.102-8.202-.044-12.296.044-3.86.292-7.706.292-11.566 0-6.192-.292-12.397-.175-18.618.102-5.259-.044-10.503.044-15.733.116-7.517.102-15.005.116-22.507.102-13.941.117-27.897.102-41.838 0-4.298.219-8.595.146-12.864-.073-4.938 0-9.847-.116-14.786-.117-5.477-.03-10.955-.073-16.447-.044-2.651-1.211-3.613-4.522-3.409-6.361.394-12.735.175-19.125.219-8.708.044-17.432.102-26.155 0-6.287-.102-12.589-.044-18.876-.146-5.66-.073-11.334-.117-16.994-.044-6.127.073-12.225-.247-18.322-.029-4.479.175-8.971-.102-13.45.073-4.493.19-9 .248-13.493 0-7.863-.393-15.74-.029-23.632-.175-7.571-.145-15.171-.102-22.771-.029-7.396.073-14.806.073-22.202.102-6.987 0-13.96 0-20.977-.116-3.326-.073-6.666-.146-9.978 0-2.085.072-4.186.101-6.272.029-2.217-.073-3.91 1.5-3.589 3.758.19 1.471-.116 2.87-.175 4.268-.19 8.377.102 16.739 0 25.115-.043 4.196.044 8.42.102 12.645.044 5.405.146 10.78.175 16.185.073 7.808.073 15.645.103 23.468 0 .67-.19 1.37.466 1.938.365.32.22.888.146 1.355-.218 2.039-1.21 4.049-.029 6.089-1.225.83.54 1.908-.277 2.972-.394.51.19 1.69.19 2.578.072 8.741.145 17.511.145 26.251-.029 4.837.103 9.644.146 14.48.03 2.142.51 4.487.292 6.454-.365 3.584.102 7.124-.044 10.649-.218 6.046-.043 12.077 0 18.137.03 5.157-.073 10.314.19 15.471.175 3.088-.073 6.162.102 9.25.19 3.307.19 6.672.175 9.994-.029 2.389.394 4.807-.277 7.487-5.354-7.167-12.078-11.814-20.773-13.62.817-.904 1.08-1.69 1.08-2.681-.03-7.59.044-15.194-.102-22.784-.102-4.152-.219-8.303-.19-12.441.044-5.812.117-11.639-.029-17.452-.175-6.526-.044-13.081-.102-19.622-.044-6.061-.073-12.135-.044-18.195.03-6.978-.32-13.927-.175-20.876.044-2.622-.146-5.375-.35-8.027-.175-2.039.146-4.414.19-6.599.116-4.268.029-8.551 0-12.82-.03-1.617-.03-3.292-.175-4.836-.175-1.835-.423-3.482-.03-5.346.146-.714.19-2.215-.029-2.68-.817-1.836-.044-3.657-.291-5.478-.321-2.142.145-4.443.043-6.6-.32-6.671-.044-13.329-.19-20.015-.145-7.415-.101-14.801-.422-22.202-.073-2.01.32-3.933.145-5.914-.19-2.083-.029-4.196-.073-6.279-.029-.816-.072-1.646-.248-2.462-.218-1.078.642-2.156 1.445-1.602l.073.014ZM292.74 150.09c.029 1.224-.642 1.428-1.576 1.573-5.733.933-11.436 1.035-17.14-.32-3.559-.86-7.25-.277-11.991-.35-2.976.277-7.148.219-11.188-.291-5.675-.743-11.597-.466-16.995-3.045-2.83-1.354-5.062-3.307-6.068-6.337-1.357-4.079 1.327-8.128 5.602-9.308 3.661-1.006 7.468-1.049 11.159-1.865 4.055-.889 6.987-3.394 9.861-6.133 2.626-2.477 5.529-4.56 9.365-4.909 2.538-.219 5.135-.394 7.527-1.137 1.474-.466 3.049-1.398 4.099-2.695 2.83-3.438 6.638-5.229 10.722-6.599 1.182-.393 2.538-.349 3.807-.495.351-.029.759.116 1.036-.029 2.728-1.574 1.824.51 1.824 1.748-.03 3.409-.03 6.803-.03 10.183 0 6.06 0 12.105-.029 18.151 0 3.948-.073 7.91 0 11.858h.015Zm-.321 118.727c-.044 5.885-.321 11.756-.35 17.656-.029 2.506.189 5.04.51 7.531.102.962-.218 1.006-.933 1.21-2.115.539-4.377.83-6.244 1.835-3.005 1.617-6.608 1.821-9.292 3.861-3.267 2.476-5.587.684-7.892-1.151-1.692-1.355-3.471-2.608-4.77-4.473-.51-.757-.758-1.646-.467-2.01 1.518-2.01.321-3.875-.145-5.696-.54-2.156-.89-4.443-2.014-6.453-.743-1.37-1.75-2.579-2.217-4.152-.248-.743-1.429-.714-2.232-.568-7.541 1.296-13.624 4.88-17.826 11.392a7.812 7.812 0 0 0-1.035 2.549c-.248 1.297-1.08 1.836-2.407 1.471-2.509-.67-4.814-.815-7.25.714-1.43.903-3.02.685-4.726-.787-4.727-4.049-10.197-6.264-16.616-4.792-.831.189-1.75.437-2.582.349-1.677-.218-2.334.437-2.611 2.084-.612 3.656-.904 7.196.248 10.882.511 1.675.934 3.219 1.94 4.647 1.255 1.792 1.503 4.006 2.378 5.972.584 1.355.321 3.045-.423 4.444-.977 1.821-1.604 3.787-3.297 5.331-1.065.976-2.013 1.865-3.34 2.477-2.042.961-2.145 2.068-1.473 4.443.072.321.247.612.145 1.107-1.896-.568-3.88-.277-5.82-.51-.511-.073-1.109-.102-1.4-.437-2.218-2.607-5.208-2.214-8.111-2.185-.277 0-.54.219-.817.291-1.371.277-2.757 1.006-4.026.977-1.473 0-1.284-2.04-2.144-3.045-2.364-2.797-5.354-3.948-8.432-1.573-1.298 1.005-2.436 1.15-4.099.611-4.23-1.369-7.936.277-11.334 2.754-1.766 1.325-3.545 2.724-4.085 5.055-.117.466-.321.437-.744.291-1.05-.32-2.144-.612-3.238-.714-1.576-.145-3.093.277-4.42 1.151-1.036.714-1.576.35-2.291-.495-1.444-1.69-3.121-3.016-5.484-3.438-1.62-.277-3.078 0-4.406.641-2.48 1.209-4.668 2.84-6.812 4.545-.277.189-.35.714-.788.51-.437-.219-.423-.67-.437-1.078a13.106 13.106 0 0 0-1.941-6.701c-.831-1.326-1.794-2.55-2.698-3.803-.934-1.296-2.626-.276-3.91.175-.539.19-.963.292-1.502.146 2.976-3.657 6.447-6.658 10.546-8.886 1.605-.86 3.078-.321 4.654.437 2.83 1.354 5.587 3.001 9 2.68 2.218-.218 4.654.364 6.681-.32 3.224-1.137 6.594-2.04 9.409-4.4 1.765-1.5 3.705-2.855 5.135-4.661 1.999-2.579 3.793-5.303 5.208-8.275 1.254-2.578 2.334-5.186 2.757-8.056.146-.976-.394-1.646-1.007-1.835a45.323 45.323 0 0 0-16.863-2.113c-.277 0-.54.146-.904.073 1.05-.583 1.896-1.471 2.946-1.967 1.109-.509 2.116-1.18 3.166-1.762 2.115-1.18 4.128-2.477 5.806-4.196.612-.641 1.152-.815 1.911-.757 4.186.218 8.329-.044 12.487-.685.685-.116 1.21-.291 1.619-.889.175-.276.423-.641.715-.713 3.88-1.006 6.812-3.628 10.123-5.594 2.232-1.355 4.26-2.972 6.375-4.444 1.998-1.354 3.545-3.365 5.426-4.88.861-.714 1.941-1.325 3.122-1.602.175-.029.438 0 .496-.102.977-2.01 3.443-1.967 4.799-3.394 1.43-1.53 3.516-1.996 4.96-3.322 1.824-1.69 4.128-2.112 6.214-3.117 1.605-.743 2.859-2.069 4.625-2.623 3.792-1.179 7.147-3.467 11.057-4.399.817-.189 1.517-.641 2.29-1.005 2.932-1.428 6.214-1.748 9.263-2.826 5.266-1.836 10.839-2.113 16.221-3.336 3.881-.889 7.819-.976 11.685-1.064 3.311-.043 6.812-.218 10.124 1.064 1.998.757 4.259.51 6.316 1.325.904.35 1.575.685 1.371 1.821-.117.889.642 1.078 1.225 1.209.686.175.978-.247 1.153-.932.686-2.505.438-3.409-2.086-4.589a23.21 23.21 0 0 0-9.54-2.083c-.817-.029-1.372.495-1.503-.67-.029-.073-.364-.175-.496-.117-1.546.671-2.932-.757-4.449-.364-.423.117-1.138-.291-1.006.656.043.32-.321.422-.467.277-2.232-1.982-4.916-.904-7.309-.758-3.705.189-7.468.743-11.057 1.69-2.509.641-5.091 1.005-7.6 1.646-4.011 1.049-7.994 2.229-12.02 3.22-1.678.393-3.151 1.296-4.77 1.864-4.099 1.355-8.081 3.074-11.991 4.91-4.259 2.01-8.169 4.618-12.385 6.657-.787.393-1.21 1.209-1.692 1.69-1.225 1.209-3.019.685-4.055 1.908-.963 1.151-2.378 1.748-3.516 2.622-2.042 1.617-4.055 3.307-6.199 4.866-6.492 4.647-13.246 8.784-20.948 11.144-1.4.437-3.092.117-4.653.044-.715-.044-.35-.641-.19-.932 1.08-1.996 2.217-3.977 3.311-5.944 1.007-1.748 1.372-3.788 2.48-5.477.423-.671-2.071-2.827-3.194-2.827-4.946-.043-9.876-.072-14.821-.102-1.824 0-3.633.073-5.427.03-1.211-.044-2.115 1.078-3.369.684-.19-.073-.467.044-.613-.568 3.005-1.078 5.062-3.613 7.454-5.623 2.772-2.331 4.843-5.507 5.995-9.236 1.532-4.866 2.48-9.789 3.589-14.728.467-2.039.715-4.122 1.182-6.235 4.347 1.209 8.796 1.646 13.172 2.506 3.953.786 7.921.83 11.845.568 2.115-.146 4.26-.393 6.346-1.107 1.035-.35 2.363-.51 3.515-.495 2.801 0 5.514-.743 8.009-1.647 3.442-1.282 7.075-1.995 10.43-3.438 3.165-1.369 6.564-2.112 9.686-3.51 2.407-1.049 4.959-1.472 7.381-2.404.934-.364 1.896-.583 2.903-.758 1.284-.189 2.465-.903 3.793-1.078 1.283-.174 2.582-.291 3.792-.743 1.299-.437 2.655-.32 3.983-.539 1.21-.189 1.692-.757 2.188-2.185.189 1.18.248 1.909 1.327 1.748 5.631-.932 11.306-.582 16.965-.786 7.25-.219 14.384.83 21.59 1.078.671 0 1.4.277 1.94-.466.175-.277.671-.292.744-.03.365 1.078.934 1.049 1.371.19.365-.743.423-1.719-.642-2.04-1.05-.349-2.159-.611-3.238-.611-1.225-.03-2.407-.321-3.632-.394-.365-.029-1.299-.685-.963.641.102.292-.496.292-.54.029-.248-1.296-1.284-1.034-2.086-1.063-2.844-.175-5.82-.044-8.533-.612-3.545-.743-7.002-.277-10.503-.51-1.328-.073-2.685.364-3.954.423-2.334.102-4.653.495-6.987.67-3.982.276-7.921.932-11.845 1.821-3.837.859-7.542 2.258-11.553 2.607.539-1.151-.496-1.894-.832-2.84-.817-2.288-1.969-4.327-3.515-6.163-.861-1.048-.963-1.937.437-2.767 3.793-2.258 7.542-4.516 11.451-6.6 4.814-2.534 9.789-4.559 14.748-6.672 1.824-.757 3.589-1.762 5.485-2.476.759-.291 1.546-1.034 1.43-2.156-.044-.277-.277-.685.35-.758.613-.102.423.248.467.568.116.787.685.438 1.108.321 2.159-.714 4.202-1.719 6.2-2.841 1.036-.612 2.261-.888 3.399-1.325 3.122-1.253 6.375-2.535 9.146-4.225 2.772-1.69 6.127-2.141 8.578-4.37.904-.831 2.188-1.18 3.296-1.574 2.013-.743 3.487-2.476 5.602-2.942.744-.175.817-.889 1.138-1.37.467.117.364.466.364.714 0 9.425-.029 18.836-.029 28.262v25.041c0 5.871.029 11.742-.029 17.598-.044 5.58-.219 11.144-.248 16.724-.029 6.279.102 12.601.029 18.909l.015-.073Zm-32.778 79.773c1.211.83 2.626 1.398 3.982 1.966 1.401.539 2.334 1.865 4.099 2.069-1.429 1.719-2.611 3.409-4.026 4.793-1.371 1.325-2.29 3.001-3.836 4.181-.978.757-1.065 1.966.043 3.161 1.518 1.719 2.757 3.7 4.552 5.186.583.466.685.743.102 1.5-.978 1.253-2.465 2.186-2.611 4.152-.044.568-1.284 1.763-2.684 1.078-.642-.32-1.517-.684-2.145-.495-2.976.903-5.747-.568-8.636-.568-2.975-.029-5.922-.277-8.898-.277-6.345.029-12.268 1.894-18.249 3.729-2.844.889-5.382 2.389-8.081 3.584-.861.364-1.605 1.078-2.305 1.719-.277.218-.511.612-.861.422-.35-.174-.277-.67-.175-.961.277-.889.292-1.792.569-2.681.861-2.84 1.474-5.739 2.334-8.565 1.211-4.006 3.297-7.59 5.237-11.276 1.94-3.656 4.551-6.745 7.323-9.716 1.517-1.617 3.516-2.695 5.354-3.948 1.619-1.137 3.223-2.331 4.726-3.628 3.165-2.767 6.987-4.399 10.868-5.798 3.88-1.427 7.775-2.797 11.83-3.656 1.284-.277 2.407-.117 3.588.189 2.655.714 3.706.292 5.194-2.039.612-.976 1.502-.495 2.582-.466-2.801 4.181-5.514 8.027-8.709 11.494-.671.713-1.43 1.252-1.896 2.287-.642 1.355 0 2.083.714 2.578l.015-.014Zm-202.926 2.33c.03-.684.03-1.398.03-2.083.072-.029.174-.043.276-.073.146 2.972.394 5.973.423 8.96.073 4.588 1.153 8.857 3.837 12.644.715 1.049.613 1.37-.686 1.428-3.486.117-3.56.146-3.472-3.307.19-5.871-.583-11.683-.393-17.554l-.015-.015Zm-.496-32.529c-.03-1.981-.423-4.05-.613-6.089-.116-1.18.248-1.399 1.357-1.21 1.473.277 2.976.437 4.493 0 .963-.247 1.575.292 1.998 1.151 1.138 2.229 2.014 4.56 2.83 6.92.394 1.136.963 2.214 1.445 3.394-1.693.437-3.297-.364-4.917.219-1.137.393-2.115.714-2.946 1.821-.671.903-1.999 1.296-2.072 2.724-.043 1.355-.218 2.68-.35 4.006-.102 1.428-.218 2.826-.364 4.72-.365-.787-.686-1.136-.642-1.399.831-5.419-.146-10.853-.219-16.257ZM32.326 352.13c.044-3.686-.117-7.386.029-11.101.175-3.715.744-7.386.715-11.115-.03-5.667-.044-11.348.102-17.044.102-3.948.146-7.925.365-11.902.175-3.365-.146-6.774-.321-10.168-.03-.612.102-1.108.35-1.617 1.43.713 2.946 1.18 4.405 1.223 1.62.029 1.911.903 2.145 2.069.422 2.287.962 4.589 1.94 6.672a35.67 35.67 0 0 0 3.661 6.235c1.517 2.039 3.837 3.19 6.098 4.268 1.035.495 1.502 1.035 1.473 2.302-.146 7.298.583 14.553.496 21.808-.102 7.021-.146 14.043-.146 21.065-.03 3.54.496 7.065.584 10.634.029 1.763-.146 3.54.043 5.303.073.714-.364 1.005-1.108 1.005-6.783-.029-13.552 0-20.335 0-1.211 0-1.007-.86-.934-1.603.671-5.987.35-12.032.438-18.049v.015Zm14.179-53.595c-1.532-1.996-2.232-4.254-2.626-6.672-.175-1.034.146-1.253 1.007-1.355 3.165-.393 6.345-.816 9.423-1.748 1.225-.364 2.072.437 2.538 1.399 1.474 2.869 4.128 4.938 5.412 7.954.248.582 1.007.932 1.444 1.442 1.474 1.821 1.43 3.86.715 5.943-1.721-1.791-2.509-4.224-4.201-6.089-1.926-2.141-3.764-4.327-6.17-5.914-.76-.496-1.605-1.108-2.48-1.006-1.62.175-1.299 1.792-1.649 2.827-.32.888.613 1.136 1.299 1.5 1.72.976 3.296 2.229 4.492 3.831 1.678 2.186 3.545 4.298 4.698 7.27-1.824-.321-3.414-.743-4.945-1.37-3.91-1.646-6.492-4.734-8.943-7.997l-.014-.015Zm13.245-97.837c-.102-1.995.759-4.151-.54-6.089-.277-.35-.116-.903.35-1.209.496-.277.438-.714.19-1.034-.642-.758-.044-1.647-.175-2.215-.642-2.403 1.357-4.88-.292-7.196-.466-.641.35-1.224.248-2.083-.175-1.224-.54-2.579-.277-3.948.117-.612.102-.86.759-.976.612-.146.962-.277 1.4.437 1.371 2.141 1.4 1.996 3.69.903 2.116-.961 4.48-1.151 6.755-1.515 1.765-.32 3.56-.495 5.339-.758 1.356-.247 2.305.248 3.472.977 2.465 1.573 5.193 2.724 7.498 4.559 2.115 1.69 4.492 3.001 6.783 4.341 2.844 1.69 5.558 3.657 8.635 5.041 2.466 1.136 5.019 2.36 7.207 3.802 3.267 2.214 6.812 3.802 10.123 5.9 1.357.83 2.874 1.471 4.347 2.083 1.868.787 1.868 1.107.54 2.506-.758.816-1.473 1.937-1.619 3.015-.248 2.04-.905 2.433-2.976 1.923-1.969-.495-4.128-.277-6.214-.277-4.799-.043-9.584-.32-14.354.03-4.566.32-9.249 0-13.77 1.034-2.043.495-4.1.044-6.142.612-3.297.932-6.666 1.675-10.007 2.374-3.69.758-7.075 2.36-10.868 3.948 0-5.55.19-10.882-.102-16.199v.014Zm-.817-66.283c-.102-.568 2.072-2.01 2.364-1.617.89 1.107 2.086.364 3.077.816a34.787 34.787 0 0 1 5.412 3.074c2.364 1.646 4.814 1.835 7.542 1.69 3.662-.219 7.352-.277 11.014.029 1.137.102 2.436 1.209 3.238 2.302 1.065 1.442 2.611 1.791 4.23 1.82 2.48 0 5.048.219 7.309 1.399.977.495 1.502 1.602 1.794 2.68.277.976.613 2.04.569 3.045-.073 1.938 1.4 2.535 2.611 2.433 2.042-.146 4.084-.102 6.127-.86 1.721-.67 3.865-.349 5.805-.218.905.073 1.649.044 2.291-.612.321.423-.438 1.369.89 1.107 1.429-.291 2.83 1.355 4.376.35.831 2.039 3.545 1.282 4.551 3.044.146.219.423.539.642.539 2.903.073 2.801 2.899 3.661 4.516.438.831-.321 2.972-.831 4.414-.613 1.749-2.232 1.909-3.807 2.331-2.509.641-5.135.117-7.542.933-4.333 1.427-8.855.932-13.275 1.719-5.412.961-11.057.422-16.571.961-2.334.219-4.814-.116-7.075.962-.277.116-.89.713-1.284-.19-.219-.539-.54.248-.612.219-2.218-.277-4.274.684-6.448.743-.613 0-1.254-.175-1.896-.102-2.611.32-5.208.714-7.82.903-3.296.248-6.564.32-10.152.466 1.692-.932.54-2.36.394-3.147-.54-3.234-.19-6.482-.277-9.702-.19-6.919-.175-13.854-.22-20.773-.028-1.748.22-3.482-.043-5.259l-.044-.015Zm-.35-16.738c-.219-1.894 1.692-1.923 2.932-2.404 3.297-1.296 6.754-.932 10.182-1.107 2.188-.116 4.347-.714 6.52-1.107 2.306-.422 4.377.117 6.288 1.471 1.678 1.209 3.413 2.186 4.77 3.905 1.05 1.354 3.122 1.078 4.595.364 1.984-.933 3.983-.758 5.996-.641.394.029.86.189 1.079.466 1.721 2.083 3.764 4.079 3.268 7.138-.117.903.102 1.719.291 2.579.248 1.048.817 1.762 2.043 1.748 1.677-.029 3.326.291 5.018.276 3.297-.029 5.879 1.821 8.329 3.759 1.211.961 1.226 4.152.102 6.089-.904 1.603-1.75 3.263-2.552 4.88-.934 1.909-2.51 1.574-3.881 1.69-1.327.117-2.757.175-3.865.743-1.576.787-1.838-.349-1.999-1.136-1.036-6.556-5.995-8.493-10.62-7.634-2.071.365-3.267-.393-4.478-1.646-3.326-3.438-7.527-4.006-11.947-3.554-1.473.145-2.976.641-4.42.976-1.94.495-4.012-.466-5.806-1.544-1.298-.787-2.29-2.142-3.793-2.535-1.867-.495-3.705-1.53-5.732-.35-.278.146-.642.073-.671.539 0 .437.116 1.078-.613 1.005-.613-.072-.569-.757-.642-1.136-.19-.83-.117-1.719-.175-2.607-.03-3.409.146-6.833-.248-10.256l.03.029Zm-.248-73.232c-.102-3.088-.248-6.191-.19-9.28.044-2.403.278-4.836 0-7.269-.145-1.325.35-1.966 1.897-2.04 5.952-.247 11.903-.276 17.855-.189 2.699.044 5.426.044 8.14.102h.19c4.055-.64 8.11.437 12.165.03 1.911-.19 3.808-.03 5.733-.19.861-.073 2.042 0 2.976.423.686.32 1.371 1.048 1.109 1.791-.511 1.472.51 2.04 1.356 2.623 1.357.961 2.539 2.141 4.187 2.724.904.32.933 1.53 1.065 2.476.116 1.035.146 2.477 1.211 2.724 1.05.219 2.115.743 3.267.641 3.487-.276 7.002-.102 10.328 1.107 2.509.904 4.77 2.404 5.631 5.187.715 2.287-.788 3.977-3.487 4.093-3.121.175-6.272.146-9.365.495-3.238.365-6.535.467-9.788 1.05-3.632.67-7.381.611-11.043 1.15-3.486.51-7.03.35-10.517.787-3.34.422-6.71.495-10.08.743-1.152.102-2.261.466-3.472.248-.963-.175-1.75.247-1.823 1.573-.102-1.005-.365-1.253-1.4-1.326-3.297-.277-6.288 1.326-9.57 1.253-2.042-.03-4.085.757-6.316 1.224 0-4.152.102-8.158-.03-12.135l-.029-.015Zm.117 27.577c.03-3.19 0-6.366.03-9.557 0-2.403.364-2.928 2.683-3.627.51-.146 1.05-.117 1.328-.685.291.146 1.006-1.15.977.277 0 .35.248.291.496.19 2.159-.83 4.624-.423 6.71-1.326 1.08-.466 1.824.116 2.684.146 1.678.043 3.37.072 5.018.189.978.044 2.48-.54 3.793-.641 5.135-.393 10.255-.903 15.39-1.15 3.807-.176 7.614-.642 11.436-.962.686-.073 1.328-.248 1.999.32.423.35 1.473.889 1.356-.64-.043-.642.613-.394.978-.423 4.23-.496 8.504-.32 12.778-.437 3.633-.117 7.134-.904 10.576-1.909 1.357-.422 1.649-1.82 1.678-3 .029-1.822.51-3.76-.977-5.376-.248-.277.364-.903.072-1.574-.743-1.791-2.144-2.695-3.836-3.16-1.225-.35-2.159-.715-1.838-2.696-1.4 1.894-2.801.758-4.085.743-2.538-.043-5.047.612-7.614.175-1.999-.32-3.341-1.865-2.932-3.875.277-1.297-1.692-3.482-3.589-3.831-.758-.117-1.429-.35-1.823-.903-.467-.641-1.182-1.428-.759-2.186.277-.466 1.211-.29 1.897-.29 6.243.028 12.487-.03 18.73-.03 3.413 0 6.856.102 10.269.102.817 0 1.036.32 1.182 1.136.963 4.866 1.794 9.717 2.378 14.64a649.659 649.659 0 0 1 1.546 13.971 333.912 333.912 0 0 0 1.911 16.083c.54 3.715.35 7.488.89 11.203.423 2.898.861 5.812 1.05 8.71.394 5.406 1.605 10.65 2.159 16.011.584 5.841 1.036 11.683 1.94 17.51.467 2.928.467 5.886.861 8.814.715 5.521 1.4 11.027 2.334 16.519 1.138 6.658 2.538 13.286 3.588 19.958.365 2.389.715 4.764 1.255 7.124.219.976 1.254 2.112.642 2.826-.54.612-2.013.35-2.976.714-2.465.961-5.062 1.442-7.615 2.068-.612.146-.933.19-1.429-.539-1.97-3.044-4.231-5.9-6.215-8.915-1.91-2.899-3.792-5.813-6.141-8.391-.292-.321-.496-.743-.102-1.369 1.05-1.617.613-3.162-.715-4.487-.102-.102-.248-.321-.189-.423.831-2.797-.788-4.487-2.553-6.308-1.794-1.835-3.953-3.073-6.069-4.399-.32-.189-.539-.393-.714-.743-1.153-2.374-2.83-4.399-4.552-6.41-.291-.349-.685-.582-.583-1.151.744-3.554-.817-6.482-2.874-9.104-1.006-1.297-2.582-2.186-3.938-3.191-.613-.437-1.138-.903-1.503-1.602-1.867-3.394-3.705-6.803-5.66-10.139-1.911-3.293-3.807-6.599-6.025-9.702-1.648-2.288-2.829-4.881-4.813-6.95-.438-.494-.54-1.296-.963-1.864-1.678-2.258-3.122-4.69-4.814-6.876a398.03 398.03 0 0 1-7.79-10.314c-2.655-3.583-5.412-7.094-8.081-10.649-1.897-2.535-3.793-5.113-5.879-7.488-1.284-1.5-1.823-1.602-4.624-.961 2.232 3.074 4.011 6.133 6.243 8.96 1.97 2.505 3.414 5.477 5.514 7.88 1.503 1.72 2.553 3.686 3.954 5.449 1.94 2.476 3.792 5.04 5.85 7.415 1.823 2.083 2.946 4.69 5.134 6.584.758.67 1.298 2.142 2.159 3.016 1.75 1.821 2.378 4.341 4.186 6.118.248.248.424.568.54.889 1.138 2.84 3.414 4.982 4.654 7.764.073.146.218.365.35.394 1.823.291 1.473 2.083 2.159 3.146.831 1.282 1.254 2.841 2.552 3.832 1.08.815.934 2.301 1.795 3.263.175.189 0 .582-.438.495-.642-.146-1.284.219-1.867.189-1.211-.102-2.436.073-2.436-2.083.029-1.427-.788-3.088-1.546-4.559-1.08-2.215-2.874-3.73-4.493-5.449-.744-.816-6.317-.684-7.134.146-.641.641-1.473.612-2.115 1.078-.569.393-.86.102-1.254-.364-2.48-2.928-5.31-5.507-9.249-6.09-2.611-.393-5.31-.043-7.79.86-2.29.83-4.565.67-6.914.568-1.692-.073-3.545-.35-5.091.816-.277.218-.671.277-.963.437-1.444.787-1.94-.029-1.867-1.253.277-3.977.146-7.954-.044-11.902-.175-3.467-.277-6.92-.248-10.357.03-5.42-.029-10.897.044-16.33l-.03-.088Zm157.938-37.57c-.583 2.476-1.765 4.865-1.502 7.531.102.787-.861 1.18-1.62 1.282-1.05.146-1.75.685-2.304 1.603-.832 1.369-1.97 2.04-3.808 1.675-3.807-.743-7.541.218-10.897 1.865-2.304 1.15-4.128 3.234-6.287 4.69-1.21.816-2.582 1.326-3.296 2.724-2.378-.35-4.377 1.035-6.521 1.647-5.704 1.602-11.801.816-17.359 2.87-2.655.976-4.654 2.797-5.996 5.52-1.371 2.798-.831 5.187.438 7.663.248.496.248 1.005.277 1.53.102 1.209.686 1.82 1.897 1.865.277.029.612 0 .831.145 5.383 3.482 11.583 2.972 17.534 3.73 2.334.32 4.551.611 6.856.218 4.449-.714 8.928-1.005 13.406-1.37 1.867-.145 3.764-.028 5.675-.028-1.649 2.301-1.007 5.23-1.474 7.954-.714 3.904-1.692 7.677-2.903 11.464-.933 2.928-1.575 5.973-2.071 8.989-.248 1.675-1.05 3.088-1.357 4.763-.51 3.118-1.298 6.206-2.261 9.236-1.517 4.808-2.232 9.819-3.632 14.655-1.254 4.327-1.911 8.814-3.238 13.111-1.547 5.113-2.261 10.416-4.202 15.413-1.648 4.297-2.902 8.711-4.303 13.082-.219.713-.496.976-1.327 1.034-1.765.044-3.56.291-5.339.539-2.655.393-3.326 0-3.764-2.753-.423-2.535-.583-5.084-1.036-7.59-.423-2.404-1.225-4.735-1.502-7.138-.219-1.836-.861-3.628-.584-5.58.117-.961-.583-1.995-.787-3.044-1.503-7.983-2.013-16.112-3.093-24.154-.423-3.161-.394-6.453-.933-9.629-.365-2.185-.54-4.472-1.153-6.584-.831-2.943-.117-5.915-.613-8.843-.35-2.069-.583-4.123-.889-6.191-.073-.496.073-1.078-.715-1.18-.438-.073-.423-.583-.248-.86.583-.83.788-1.515.321-2.258-1.08-1.69-.467-3.7-1.05-5.506-.321-.933.977-.175 1.254-.933-1.605-.102-1.648-1.223-1.721-2.462-.19-3.146-.686-6.264-.642-9.396.029-1.602-.365-3.22-.044-4.764.35-1.646-.175-2.971-.904-4.253-.423-.787 0-1.472-.102-2.215-.496-4.02-1.693-7.924-1.941-11.974-.277-4.181-.889-8.304-1.444-12.427-.423-3.073-1.035-6.133-1.692-9.177-.321-1.399-.685-2.724-1.298-4.006-.423-.933-.248-1.136.831-1.136 6.36 0 12.706.029 19.052.029 13.449.029 26.899.029 40.348.029h12.123c-1.445 2.753-2.232 5.667-2.947 8.566l-.044.029Zm8.286 13.577c2.728 1.442 3.515 3.904 4.741 6.133.715 1.253 1.692 1.442 2.684 1.282 2.655-.51 5.266-.35 7.717.568 1.823.67 3.734 1.719 4.084 4.02.321 2.142 1.678 3.876 2.334 5.871.19.569.832.219 1.255.248 1.356.073 2.684 0 3.836.903.963.787.963 1.603.248 2.506-1.254 1.646-3.939 2.185-5.922 1.355-.569-.248-1.328-.219-1.897-.073-4.595 1.326-9.321 1.646-14.018 2.33-2.407.35-4.887.321-7.25.89-4.814 1.18-9.716 1.048-14.602 1.398-5.923.422-11.875.568-17.826.67-4.406.073-8.826.51-13.231.51-2.947-.03-5.923-.51-8.869-.816-2.159-.218-4.274-.714-5.996-2.185-2.698-2.331-2.261-5.871.978-7.459 3.369-1.646 6.914-2.768 10.692-2.87 3.706-.029 7.455-.611 10.795-1.995 2.757-1.108 5.631-2.302 7.863-4.735 1.794-1.908 4.026-3.656 6.71-4.516 1.036-.32 2.071-.67 2.932-1.37.321-.247.817-.364 1.327-.276 2.378.422 4.887.35 7.032-.54 1.619-.684 3.326-1.529 4.872-2.578 2.582-1.748 6.856-.64 9.511.743v-.014Zm-21.663 141.423c2.437 1.136 4.377 2.724 5.908 4.909 1.765 2.506 3.545 5.012 4.916 7.736.394.757 1.051 1.326 1.62 1.763 2.217 1.864 2.932 4.647 4.551 6.846.321.423-.117.248-.19.35-.54.758-1.4 1.005-2.217 1.209-4.42 1.049-8.402 3.467-12.779 4.545-3.807.933-7.396 2.506-11.29 3.191-2.013.349-4.099.713-6.127 1.282-2.465.67-5.281.757-7.921.64-2.772-.116-5.66.248-8.286-.393-4.055-.976-8.212-1.5-12.166-2.797-1.035-.349-1.648-1.136-1.823-2.185-.365-2.302-1.648-3.365-3.88-2.928-1.941.393-3.939.189-5.821.787-.394.102-1.138-.423-1.721-.641-2.728-1.049-5.485-1.996-8.461-1.836-.364.029-.394-.32-.583-.495-.248-.219-.759-.583-.817-.51-1.43 1.282-2.159-.932-3.589-.641-1.444.277-3.092-.364-4.945-.67 3.953-5.055 7.396-10.27 12.706-13.679 6.535-4.181 12.953-8.624 20.524-10.824.292-.102.569-.219.861-.189 6.17.364 12.122-1.472 18.249-1.865 1.896-.117 3.807-.117 5.704-.292 3.369-.291 6.345.933 9.146 2.535 2.728 1.574 5.587 2.87 8.431 4.181v-.029Zm-.641-5.507c2.479-2.112 4.668-4.472 6.418-7.24 1.138-1.762 2.611-3.307 3.982-4.88 1.445-1.646 3.122-3.117 4.406-4.865.977-1.282 2.334-2.084 3.326-3.366 1.108-1.398 2.611-2.476 3.807-3.802 2.538-2.797 5.485-5.273 7.133-8.77.321-.67.715-.422 1.138-.247 4.347 1.908 9.117 2.185 13.596 3.481 2.582.743 5.12.816 7.571.438 3.515-.51 7.031-.831 10.517-.496 5.923.539 11.874 1.049 17.607 2.841 1.182.364 2.407.437 3.618.568.744.073 1.4.219 1.765.86-7.936 4.006-15.784 7.837-23.778 11.421-5.339 2.374-10.444 5.229-15.594 7.997-4.653 2.506-9.102 5.405-13.799 7.809-5.31 2.695-10.591 5.419-15.813 8.318-1.138.612-2.072 2.768-3.793 1.282-1.079-.962-2.261-1.909-3.165-3.045-2.334-2.928-5.339-4.909-8.636-6.483-1.211-.582-1.284-1.034-.321-1.835l.015.014ZM141.25 299.613c-2.757.903-5.776.539-8.388 1.617-3.092 1.282-6.564 1.646-9.248 3.933-1.138.962-2.582 1.501-4.187 2.375.642-3.088 2.291-5.186 4.202-7.065 4.011-3.905 8.241-7.445 13.945-8.639 2.29-.495 4.551-.743 6.856-.714 3.005.073 5.996-.029 8.972-.175 2.159-.116 2.538.219 2.013 2.229-1.211 4.545-2.772 8.814-6.419 12.135-3.472 3.161-7.454 5.084-11.947 6.162-4.187 1.005-7.892-.422-11.947-1.966 3.793-2.375 7.279-4.662 11.582-5.259 1.838-.277 3.662-.51 5.514-.758 1.036-.116 2.043-.248 1.824-1.69-.19-1.223-1.692-2.535-2.772-2.185ZM95.665 321.29c.174 1.573-.103 2.622-1.999 2.068-1.765.656-1.794.044-1.823-1.602-.044-2.185.029-4.37.029-6.556.029-1.937.364-3.977.744-5.943.496-2.797.831-5.594 1.327-8.377.613-3.481 1.225-7.021 2.976-10.241.613-1.136.715-2.549 1.225-3.787 1.255-3.016 2.305-6.192 4.026-8.916 1.751-2.768 3.224-5.739 5.339-8.303.351-.423.642-.86 1.299-.641 1.429.437 2.859.961 4.303 1.325 1.751.423.963 1.647.394 2.04-1.794 1.282-2.188 3.336-3.093 5.055-2.188 4.079-3.165 8.522-3.048 13.184.029.684-.219 1.296-.642 1.791a29.138 29.138 0 0 0-5.048 8.129c-1.429 3.482-3.02 6.905-3.705 10.751-.496 2.724-1.181 5.58-2.144 8.275a3.817 3.817 0 0 0-.175 1.719l.014.029Zm-9.176.175c0 2.36-1.532 3.336-3.618 2.301-.35-.175-.291-.437-.364-.743-.817-3.321-1.474-6.672-2.232-10.022-.496-2.113-.642-4.269-1.226-6.41 1.984 2.287 4.406 3.86 6.842 5.448 1.284.831.933 2.622.788 3.686-.292 1.937-.146 3.802-.175 5.725l-.015.015ZM68.94 263.966c1.08-.044 2.072-.86 3.02.641 1.43 2.214 2.553 4.545 4.201 6.657 1.867 2.36 3.793 4.691 5.704 6.993.248.291.423.757.744.859 2.086.714 2.071 2.462 2.013 4.123-.044 1.719.365 3.438-.073 5.448-2.232-2.928-4.654-5.273-7.425-7.211-1.298-.888-2.553-1.821-4.128-2.258-1.211-.32-1.795.117-1.765 1.297 0 .743-.175 1.398-.496 2.156-1.08-2.185-2.043-4.254-3.093-6.264-.86-1.646-.146-3.234.073-4.793.292-2.01.438-4.006.32-6.046-.028-.67-.393-1.573.905-1.617v.015Zm4.916 18.413c7.382 4.487 11.7 10.737 11.626 19.521-1.006-2.156-2.013-4.326-3.048-6.453-.496-.976-1.182-1.909-2.407-1.282-1.284.67-.584 1.646-.175 2.549a675.073 675.073 0 0 1 4.274 9.353c.19.466.146 1.034.248 1.617-6.842-4.618-11.51-17.234-10.518-25.319v.014Zm12.954-10.561c-.394-1.603-.277-3.22-.978-4.837-.466-1.078-.51-2.505-.364-3.904.248-2.462-2.013-4.152-2.655-6.41-.102-.393-.569-.83-.744-1.325-.496-1.326-1.298-2.229-2.83-2.011-.715.102-1.473 2.754-1.109 3.803.613 1.689 1.372 3.365 1.897 5.084 1.035 3.438 2.48 6.73 3.092 10.255.073.365.146.685-.116 1.326-5.427-5.521-8.432-12.149-10.737-19.302-3.953-12.135-1.502-23.687 1.94-35.531 3.866 3.191 7.717 5.769 10.824 9.09 3.735 4.007 6.273 8.785 6.783 14.554.51 5.696 1.678 11.348 1.299 17.088A48.439 48.439 0 0 1 91.04 270.9c-.788 2.506-2.042 4.691-3.734 7.065-.51-2.258-.03-4.253-.496-6.162v.015Zm22.844-23.891c-.438 3.146-.365 6.308-.832 9.425-.073.437-.146.962-.029 1.399.861 2.68-.933 4.341-2.29 6.191-.248.35-.584.583-1.05.248-2.539-1.836-5.733-1.647-8.534-2.623-.788-.276-.977-.437-.977-1.209.043-3.787.218-7.59-.044-11.363-.394-5.506-.86-11.071-2.874-16.199-1.75-4.443-4.23-8.624-7.79-11.974-2.144-2.04-4.449-3.861-7.133-5.187-.467-.218-.933-.539-.758-1.223.175-.583.51-.787 1.138-.889 5.31-.83 10.575-1.471 15.973-.787 3.69.467 7.454.321 11.159.539 3.793.248 7.542-.393 11.378.292 1.255.218 3.02-.394 4.552-.583 3.661-.51 7.104.86 10.59 1.69 1.43.32 2.801.787 4.376 1.224-3.048 1.252-6.024 2.214-8.781 3.627-4.26 2.214-8.082 5.011-11.087 8.93-4.201 5.507-6.068 11.683-6.987 18.457v.015Zm3.326 16.592c2.363-.276 4.726-.043 7.6-.102-1.649 1.297-2.874 2.258-3.735 3.555-.437.67-1.137.422-1.575.146-1.532-.962-3.297-1.049-4.96-1.748.219-1.617 1.357-1.749 2.684-1.865l-.014.014ZM88.517 280.85c4.2-4.094 5.733-9.411 6.914-14.859 2.378.714 4.624 2.083 7.279 2.141 1.007.029 1.138.641.584 1.501-2.086 3.481-4.347 6.876-6.142 10.503-2.217 4.487-4.42 9.061-5.703 13.941-.496 1.909-1.138 3.788-1.182 6.06-1.08-1.369-.89-2.84-1.152-4.18-.89-4.05-1.284-8.158-1.62-12.281-.102-1.18.292-2.141 1.036-2.841l-.014.015Zm11.013 39.974c1.284-5.725 2.334-11.509 5.208-16.797 2.086-3.86 4.566-7.444 7.206-10.897.394-.509.832-.903 1.619-.903 3.866-.029 7.717-.218 11.583-.582 1.517-.146 2.873-1.282 4.814-.685-1.153.757-2.086 1.427-3.122 1.966-.963.496-2.042.816-2.334 2.069-.044.189-.248.393-.438.51-3.69 2.287-5.383 5.987-7.25 9.673a59.47 59.47 0 0 0-2.903 6.628c-.116.364-.437.714-.758.933-3.589 2.301-6.069 5.666-8.563 9.032-.496.611-.934 1.005-1.721.961a8.419 8.419 0 0 0-1.605.029c-2.159.146-2.217.146-1.75-1.923l.014-.014Zm37.592-36.973c-1.284.116-2.538.495-3.691 1.049-2.334 1.136-4.872 1.005-7.323 1.427-2.902.466-5.805 1.049-8.708 1.603-.394.073-.788.102-1.547.189 2.218-2.506 4.129-4.764 6.711-6.512 2.232-1.5 4.77-2.258 7.031-3.627 1.006-.612 1.356-1.428.977-2.302-.437-1.005-1.356-.641-2.261-.364-3.793 1.034-6.856 3.365-10.08 5.376-1.619 1.005-3.194 2.287-4.42 3.729-.671.787-1.298 1.296-2.261 1.865 2.217-5.405 4.493-10.504 8.111-14.903 2.407-2.899 4.741-5.915 8.461-7.415 1.75-.714 3.559-.67 5.339-.962 3.88-.641 7.789-1.282 11.728-1.602a37.358 37.358 0 0 1 8.067.218c2.8.365 5.66.277 8.708.816-1.371 1.967-2.727 3.832-3.982 5.74-1.998 3.045-4.055 5.987-6.666 8.551-3.954 3.904-8.563 6.512-14.179 7.124h-.015Zm-6.2-26.732c-3.865 1.53-7.716 3.161-11.947 3.584-1.531.145-3.049.349-4.697 1.034.19-1.034.569-1.602 1.109-2.039 2.83-2.433 5.032-5.42 7.862-7.882 2.407-2.083 4.566-4.443 7.207-6.307 2.465-1.749 4.726-3.759 7.104-5.624 1.108-.859 1.473-2.112 1.765-3.321.364-1.471-.584-2.156-2.043-1.617-1.444.539-2.552 1.69-3.763 2.549-3.472 2.462-6.681 5.23-10.036 7.852-4.026 3.147-7.454 6.905-10.897 11.363-.102-4.836-.321-9.163 1.225-13.475 1.547-4.341 3.866-8.231 6.346-12.004.685-1.063 1.838-2.068 2.903-2.695 3.048-1.835 5.528-4.443 8.752-6.016 1.605-.787 3.195-1.603 5.047-1.501 2.218.117 4.304-.641 6.288-1.325 2.975-1.035 5.557.043 8.329.495 2.013.35 1.867 1.355 1.896 3.088.175 7.299-2.115 13.927-5.353 20.206-1.517 2.942-3.91 5.521-6.39 7.925-3.048 2.971-6.929 4.224-10.721 5.695l.014.015Zm-14.645-64.841c-4.1-2.039-7.892-4.545-11.875-6.73-2.552-1.428-4.653-3.7-7.323-4.953-2.538-1.18-4.74-2.826-7.177-4.123-.393-.218-1.4-.51-.831-1.151.365-.422 1.109-1.136 1.97-.684.189.102.422.393.51.145.612-1.646 2.188-.888 3.15-.976a353.67 353.67 0 0 1 6.988-.611c3.37-.248 6.681-.86 10.051-.889 2.436 0 4.843-.423 7.352-.117 2.305.248 4.814-.276 7.206-1.078 2.188-.743 4.566-1.063 6.885-1.282 1.051-.102 2.232-.189 3.02-.582 1.721-.889 2.159.276 2.772 1.223 1.254 1.836 2.217 3.875 3.661 5.551 2.086 2.403 2.903 5.521 4.96 7.881.35.422.321 1.223 1.371.976-2.465 1.529-5.12 2.01-6.929 4.021-.248.276-.613.466-.977.67-2.582 1.325-4.727 3.161-6.813 5.2-1.473 1.442-3.238 2.55-4.347 4.414-.394.641-1.327.539-2.071.073-3.793-2.462-7.527-4.982-11.553-6.978Zm8.708-45.611c-1.283.32-2.305-.496-3.442-.029-.394.145-.511-.365-.351-.743.351-.816.54-2.04 1.138-2.302.817-.35 1.065.976 1.62 1.5.393.394.641.962 1.035 1.574ZM60.99 225.828c-.102-2.229 1.867-2.87 3.268-3.701 1.867-1.078 3.982-1.689 5.995-2.534-2.874 6.511-4.332 13.154-4.653 20.059-.321 6.803 1.517 13.257 3.588 19.696-2.071-.029-2.8-1.136-2.946-2.87-.175-1.865-1.182-3.482-2.232-4.866-1.05-1.354-1.605-2.942-2.611-4.326-.861-1.18-1.357-2.477-1.284-4.254.219-5.74 1.108-11.436.86-17.204h.015Zm2.013 47.971c.817 1.326 1.4 2.797 2.218 4.123 1.867 3.015 2.48 6.599 4.478 9.629.977 1.5 1.371 3.409 2.013 5.186a289.267 289.267 0 0 1 2.363 6.483c1.284 3.7 1.721 7.604 2.699 11.392.364 1.398-.22 2.971.685 4.326.146.219-.19.641-.583.685-1.007-4.298-3.02-8.158-5.193-11.931-.89-1.544-2.013-2.943-2.903-4.472-.832-1.37-1.43-2.841-1.97-4.414-1.546-4.371-2.552-9.061-6.14-12.529-1.824-1.762-2.539-4.18-2.539-6.744.03-.976-.044-1.967-.423-2.841.613-.437 1.007.073 1.371.189 1.284.423 2.976-.641 3.91.933l.014-.015Zm9.832 49.589c-2.305.466-1.838-1.574-1.998-2.535-.438-2.899-1.868-5.303-3.195-7.779-.642-1.253-.423-2.87-1.62-3.875 1.051-.671.686-2.011 1.357-2.797.321-.423.613.043.788.509 1.109 2.87 2.684 5.551 3.983 8.319.977 2.112 1.37 4.297 2.144 6.439.467 1.252.102 2.083-1.444 1.719h-.015ZM60.86 288.673c-1.153-1.297-2.772-1.967-2.305-4.443.584 1.821 2.655 2.258 2.305 4.443Zm-.642 62.306c-.248-2.462-.467-4.88-.277-7.707-.277-2.68.102-5.666.19-8.696.043-1.938.51-3.905.904-5.842.175-.86.788-1.442 1.823-1.034 4.873 1.835 9.963 2.228 15.127 2.432 4.129.175 8.257.583 12.37-.043 4.377-.714 8.797-1.18 13.129-2.258 1.824-.437 3.735-.758 5.587-1.209 1.08-.277 1.576-.073 1.911 1.18 1.94 7.138 3.516 14.363 3.37 21.851-.102 5.346-1.648 10.387-3.443 15.398-1.21 3.394-3.194 6.279-5.426 9.018-1.824 2.258-4.201 3.394-7.236 3.875-6.097.976-12.122.349-18.16.218-1.08-.029-2.16-.146-3.24-.116-3.413.116-4.915-2.579-6.68-4.662-1.75-2.04-2.932-4.56-4.654-6.599-3.91-4.589-4.726-10.11-5.28-15.792l-.015-.014Zm56.293 11.785c1.05-3.336 1.211-6.832 1.692-10.256.686-4.865.904-9.745.832-14.655 0-.67-.176-1.835 1.254-1.282.292.117.292 0 .438-.218 1.648-2.579 4.303-3.861 6.958-5.055.54-.248 1.211-.248 1.721.073 1.911 1.136 4.085 1.966 5.135 4.224.584 1.253 3.078 1.501 4.274.976 1.517-.612 2.48-1.995 3.953-2.651 1.474-.656 2.655-.146 3.691.641 1.692 1.296 1.867 1.398 3.224-.189.787-.904 1.298-1.996 1.911-3.016 1.108-1.923 2.436-3.788 4.332-4.982 2.086-1.297 4.479-1.005 6.754-.437.715.175 1.284.568 1.824 1.049.904.903 1.94 1.034 3.092.364 2.144-1.253 3.02-.932 4.624 1.078.963 1.224 1.649 2.608 2.539 3.86.51.743 1.327.714 2.086.19 1.4-.903 2.727-1.792 4.478-2.142 1.838-.349 3.268-.073 4.653 1.151 1.211 1.049 2.626 1.297 4.201.831 3.02-.86 5.879-.19 8.651 1.048.219.102.437.277.642.248 2.611-.248 3.792 1.821 5.485 3.147 2.975 2.287 5.484 5.084 8.781 7.05 2.261 1.355 4.624 2.55 6.885 3.948 1.678 1.049 1.678 1.748.438 3.234-2.801 3.438-5.353 7.051-7.542 10.955-1.575 2.856-3.398 5.551-4.989 8.391-.977 1.763-2.698 1.515-4.347 1.515-5.951-.043-11.903-.043-17.855-.073-.393 0-.787-.102-1.035.437-.686 1.443-2.436 1.617-3.239.248-.394-.714-.86-.685-1.4-.685h-8.855c-.35 0-.962.044-.977.146-.467 2.287-1.007 1.18-1.765.146-.394-.539-1.225-.277-1.838-.277-17.33-.029-34.66-.029-52.004-.029h-1.97c1.153-3.19 2.334-6.089 3.268-9.032v.029Zm91.697-54.265c-.861-3.729-2.334-7.298-3.662-10.882-.583-1.544-.671-3.19-.758-4.836-.073-1.005.51-.962 1.05-.816 4.522 1.151 8.402 3.263 10.97 7.386a53.102 53.102 0 0 0 2.217 3.365c.583.787 1.298 1.763 2.407.932.977-.743.437-1.792-.073-2.549-2.553-3.802-4.945-7.779-9.365-9.79-.19-.072-.365-.247-.788-.568 3.195-.189 5.66 1.603 8.432 2.156 1.181.219 2.538 1.37 3.296 2.724.219.423.511.787.817 1.151 1.328 1.617 1.999 1.836 4.099.641 3.151-1.821 6.608-2.083 10.08-2.258 1.299-.073 1.94-.291 2.728-1.617 2.232-3.758 4.478-7.633 8.067-10.357 1.225-.904 2.859-1.209 3.953-2.404.744.932-.073 1.369-.496 1.865-1.867 2.083-3.019 4.545-3.836 7.167-.292.932-.963 1.719-1.444 2.549-.511.962-.496 1.894-.686 2.841-.175.714.35.962.758 1.209.423.248.817.073 1.284-.189 1.619-.962 2.072-2.652 2.509-4.196 1.138-3.977 3.516-7.167 6.098-10.255.715-.831 1.108-.321 1.429.291 1.824 3.336 3.268 6.92 3.078 10.722-.219 3.977.934 6.73 4.26 9.017 2.655 1.836 5.558 3.016 8.431 4.516-2.698 4.618-6.36 8.377-10.765 11.494-3.195 2.229-6.346 4.487-9.686 6.483-2.159 1.282-3.662 3.409-5.193 5.448-1.445 2.01-2.845 4.196-5.514 4.953-.351.102-.511.437-1.007.175-2.845-1.617-6.025-2.287-9.19-2.622-3.705-.394-7.498-.146-11.232-.685-1.722-.218-3.443-.466-5.121-1.005-2.479-.831-5.12-.962-7.614-1.792-1.838-.583-3.297-1.69-4.8-2.797-.641-.495-.364-.83.044-1.253 2.042-1.937 3.122-4.443 4.479-6.847 1.794-3.161 1.473-6.205.758-9.352l-.014-.015Zm28.956 27.723c-.102.247-.117.495-.248.568-1.138.568-1.328 1.923-2.261 2.651a1013.96 1013.96 0 0 0-9.511 7.532c-.278.189-.292.51-.788.189-5.135-3.365-9.89-7.24-14.267-11.567a20.603 20.603 0 0 0-3.807-3.015c-.35-.219-.613-.539-.963-.787-.612-.437-.787-1.034-.394-1.675.438-.743 1.153-.495 1.693-.175 1.575.903 3.048 1.908 4.813 2.477 2.218.684 4.42 1.296 6.711 1.5 1.327.102 2.231 1.151 3.588 1.18 1.503 0 3.151-1.078 4.478.437 1.226-1.428 2.874-.758 4.333-.83 1.692-.102 3.399-.117 5.062.291.787.219 1.138.714 1.546 1.209l.015.015Zm31.319-8.522c-2.115 0-4.26-.467-6.346.582-1.531.758-3.442.496-5.091 1.151-.977.393-.685-1.209-1.181-.859-.438.291-.511 1.107-1.226 1.354-.612.219-1.254.467-1.721.86-.831.714-1.532.277-1.94-.291-.496-.685.029-1.137.613-1.69 1.4-1.399 2.771-2.797 4.449-3.934 2.334-1.544 4.697-3.044 7.352-4.093 4.726-1.836 8.11-5.303 10.722-9.571.116-.175.189-.393.321-.568.189-.292.423-.539.86-1.078-.583 3.831-1.254 7.342-1.969 10.853-.511 2.607-1.896 4.516-3.151 6.628-.423.656-.89.656-1.692.656Zm24.361-222.668c-1.576-.116-3.005-.932-4.522-.714-6.054.831-11.262 3.395-15.39 7.911-1.298 1.427-2.772 2.258-4.697 2.331-2.188.101-4.376.247-6.929.364 3.195-4.181 6.2-8.129 9.219-12.033 5.135-6.658 11.218-12.528 16.251-19.23 1.619-2.156 3.661-4.05 4.813-6.584.175-.394.54-.743.934-.612.423.146.438.64.467 1.078.116 2.84-.029 5.725-.029 8.595 0 3.627-.073 7.27-.073 10.897.029 2.622-.365 5.258-.044 7.983v.014Zm-2.903-31.918c-.788.714-1.298 1.72-1.94 2.579-.584.889-1.109 1.835-1.794 2.651-1.838 2.142-3.326 4.56-5.135 6.672-1.532 1.763-2.728 3.831-4.595 5.346-1.371 1.108-2.334 2.696-3.443 4.08-1.896 2.36-3.982 4.545-5.849 6.919-1.357 1.748-2.947 3.482-4.377 5.201-1.473 1.792-3.151 3.482-4.376 5.521-1.823 3.001-4.741 4.938-7.425 7.065a110.297 110.297 0 0 0-5.587 4.808c-1.152 1.107-2.465 1.602-3.982 1.937-2.932.67-5.923.539-8.855 1.355-5.018 1.398-7.965 4.88-8.242 9.702-.219 3.394-.073 7.371 3.02 10.095.715.641 1.225 1.297.248 2.288-3.224 3.161-6.141 6.628-9.074 10.066-.51.612-1.502 1.078-1.765 1.617-1.4 2.826-4.055 4.472-5.922 6.847-1.109 1.427-2.305 2.84-3.691 3.977-3.049 2.534-5.164 5.841-7.746 8.769-.539.612-.35 2.215-1.298 2.258-1.036.03-2.261-.568-3.151-1.223-1.211-.903-2.582-1.107-3.938-1.399-2.757-.612-5.558-1.005-8.403-1.049-1.356-.029-.715-1.005-.54-1.5.496-1.369.905-2.797 1.474-4.123 1.152-2.68 1.444-5.55 2.363-8.245 1.357-3.904 2.071-7.998 3.311-11.931 1.036-3.219 1.547-6.555 2.655-9.717.277-.743.117-1.5.394-2.229 1.678-4.472 2.042-9.25 3.472-13.781 1.138-3.54 1.721-7.211 3.122-10.634 2.042-4.953 2.29-10.343 3.938-15.34 1.255-3.802 1.765-7.735 2.874-11.567.934-3.19 2.071-6.41 2.363-9.789.073-.889.35-1.398 1.473-1.398 2.772-.044 5.529-.467 8.286-.496 4.624-.073 9.146-1.034 13.712-1.471 3.297-.291 6.667-.67 9.905-1.471 1.007-.248 2.159-.044 3.224.029 3.589.247 6.521-1.37 9.19-3.41 2.29-1.718 2.538-5.87.438-7.764-.978-.903-2.378-1.573-3.91-1.5-1.138.043-1.867-.146-2.086-1.646-.364-2.652-1.473-5.332-3.005-7.372-2.115-2.797-5.514-3.933-9.146-3.438-.89.117-1.911-.102-2.757.816-.365.393-1.284.393-1.824-.568-1.283-2.258-3.238-4.02-4.492-6.366-.496-.889-2.014-1.53-3.122-1.602-.788-.044-1.474-1.108-2.305-.292-.394-.67-1.473-.393-1.502-1.763-.03-3.19 1.75-5.87 2.188-8.886.218-1.5.291-3.044 1.254-4.341.613-.83 1.182-1.53 2.407-1.53 3.953.073 7.936.03 11.918.03v-.03c4.566 0 9.176-.189 13.741.044 4.406.248 8.782.102 13.158.073 5.456-.03 10.912.175 16.367-.044 3.443-.116 6.915.393 10.357-.043.686-.102 1.138.247 1.138 1.005 0 1.005.277 1.995.277 2.942-.102 7.852.19 15.719-.073 23.57-.145 4.27-.247 8.567.19 12.82.321 3.147-1.05 5.012-3.122 6.876h.015ZM35.214 232.37c.117-1.763 1.576-.889 2.261-.612 3.69 1.369 7.148 3.263 10.62 5.113 1.065.568 1.998 1.471 2.757 2.389 3.165 3.729 5.98 7.634 7.935 12.222 1.11 2.652 1.97 5.347 2.772 8.071.54 1.763.788 3.554.496 5.594a531.131 531.131 0 0 1-5.66-8.1c-1.794-2.607-3.88-5.04-6.39-7.051-.83-.67-3.909.117-4.346 1.078-.292.612.044 1.297.496 1.501 3.37 1.442 5.28 4.472 7.702 6.949 3.02 3.117 5.237 6.876 7.775 10.824-2.757-.714-4.872-1.617-6.914-3.118-2.583-1.865-5.354-3.511-7.994-5.332-2.51-1.748-4.158-4.181-5.923-6.584-1.97-2.652-3.049-5.798-4.989-8.45-.933-1.296-.831-2.855-.904-4.224-.117-3.438.073-6.876.32-10.285l-.014.015Zm-8.636 48.83c-.466-.742-1.181-.437-1.75-.815-2.16-1.472-4.055-3.293-6.2-4.808-1.765-1.252-4.011-2.156-5.207-4.253-.248-.467-.934-.743-1.474-1.049-2.465-1.472-4.186-3.73-6.2-5.696-1.108-1.049-.291-1.326.511-2.011 2.611-2.185 5.98-2.971 8.723-4.88 1.328-.903 3.093-1.209 4.727-1.675 3.194-.903 6.2-2.549 9.686-2.258 1.502.146 3.02.189 4.551.393a3.39 3.39 0 0 1 2.582 1.792c3.02 5.885 7.717 10.095 13.406 13.33.146.101.292.247.467.276 4.2.365 4.566 3.467 4.989 6.745.32 2.229.102 4.472.364 7.197-3.194-2.754-5.98-5.157-8.942-7.343-2.903-2.112-5.514-4.617-8.606-6.453-2.83-1.69-5.558-3.555-8.753-4.647-1.109-.364-1.94-1.369-3.238-1.369-1.62 0-2.655.786-2.553 2.083.044.83 1.896 2.068 2.903 1.908.175-.029.102-.539.437-.189 2.305 2.301 5.675 2.768 8.286 4.618 3.15 2.214 6.564 4.049 9.613 6.439 2.013 1.602 3.808 3.438 5.82 5.011.642.51 1.182 1.136 1.503 1.996-1.444-.044-2.699.582-4.011.961-5.412 1.573-10.62 1.326-15.682-1.005-2.232-1.034-4.566-2.069-5.952-4.268v-.03Zm318.94 100.27c.044 3.554-.365 7.124-.189 10.707a4.45 4.45 0 0 1-2.043 4.05c-.831.51-2.377.393-3.238.175-2.976-.816-5.981-.641-8.942-.758-4.522-.174-9.044-.32-13.552.029-4.405.321-8.825-.174-13.231.641-2.844.51-5.893.219-8.825.044-4.522-.291-9.044-.277-13.552-.073-4.814.19-9.657.685-14.412.117-4.479-.51-8.928-.831-13.406-.903-5.456-.073-10.912-.423-16.324-.146-3.238.146-6.491.218-9.715.102-5.091-.219-10.182-.568-15.273-.903-3.238-.219-6.593-.029-9.89.116-4.085.146-8.14.437-12.195.612-6.74.291-13.494-.116-20.204.35-4.697.32-9.292-.146-13.945-.423-1.941-.116-3.91.029-5.675 1.035-.248.145-.569.276-.831.247-6.215-.51-12.414.35-18.629.029-6.287-.349-12.618-.713-18.934-.568-6.127.146-12.297.146-18.41.394-3.34.116-6.68.713-10.036.713-2.392 0-4.77-.029-7.147-.029-4.056.029-8.111.175-12.166.117-2.684 0-5.266-.641-7.936-.67-7.279-.102-14.558.349-21.837-.044-3.793-.219-7.542-.539-11.335-.685-2.363-.102-4.697-.189-7.075.248-.904.175-2.144 0-3.224-.175-.933-.175-.962-1.107-1.035-1.763-.467-4.559-.146-9.163-.219-13.722v-2.652c0-3.554.248-3.554 3.866-2.942 2.217.349 4.522-.146 6.783-.19 3.078-.073 6.141-.247 9.19-.145 3.953.116 7.892.116 11.845.189 4.45.117 8.927-.102 13.406.219 1.677.116 3.544.145 5.28-.321.584-.175 1.153-.117 1.678.219 2.29 1.573 4.45 3.292 6.2 5.506.831 1.049 2.334 1.282 3.588 1.675 5.12 1.647 10.328 1.355 15.565.962 2.772-.219 5.529-.495 8.183-1.224 3.224-.888 6.667-1.325 9.322-3.685.642-.583 1.357-.816 2.232-.86 3.297-.248 6.608-.583 9.905-.903.466-.044.962-.117 1.4-.073 1.619.175 3.166.029 4.799-.175 2.261-.277 4.625.248 6.929.292 3.808.116 7.615.116 11.451.174 1.678.03 3.516.539 5.019.175 4.478-1.151 8.854.437 13.347.029 6.812-.582 13.741.029 20.627.19 3.559.102 7.148.175 10.722.116 4.303-.043 8.65.117 12.953-.175 1.298-.072 1.138.641 1.007 1.399a55.364 55.364 0 0 0-.642 10.314c.029 1.063.277 1.967 1.211 2.287 1.006.32 2.013.67 3.121-.422 4.566-4.371 10.255-6.774 16.178-8.625 5.558-1.689 11.29-2.476 17.082-2.461 4.23.043 8.402.903 12.618 1.281 1.108.117 1.896.977 2.626 1.53 2.115 1.544 4.595 1.515 6.856 1.908 4.259.758 8.358 2.156 12.691 2.462.831.073 1.677.423 2.538 0 .117-.043.292-.174.423-.116 4.274 1.646 8.825 1.617 13.318 1.937 2.83.19 5.631-.072 8.432 0 3.807.102 7.498-.349 11.261-.713 6.915-.641 13.596-2.186 20.189-4.152 3.02-.903 6.025-2.185 8.505-4.269.467-.364.715-.976 1.079-1.5 1.036 1.18.642 2.608.642 3.904v-.029Zm15.565-30.694c-1.532 5.521-4.333 10.43-8.169 14.713-1.225 1.37-1.911 3.234-3.705 4.123-.496.248-.715 1.355-1.517.248-.102-.117-1.153.189-1.153.961 0 .889.044.961-.744.932-1.677-.043-2.304 1.472-3.399 2.287-1.721 1.282-3.515 2.142-5.747 2.506.686.758 1.444.291 2.071.743-.758.859-1.838.86-2.8 1.151-3.341 1.107-6.638 2.476-10.08 3.088-1.765.321-3.399 1.297-5.383 1.035-1.255-.146-2.626.786-4.099.815-3.939.073-7.863.117-11.758.539-1.4.175-3.048-.51-4.347.787-.423.422-.218-.83-1.298-.787-3.34.19-6.739-.043-10.08-.422-3.078-.35-6.127-.86-9.175-1.37-2.976-.495-5.952-1.063-8.942-1.427-1.62-.19-3.545-.321-5.062-1.18-.715-.393-1.182.422-2.072-.175-1.079-.757-.612-1.355-.321-1.748 1.649-2.214 2.699-4.88 5.062-6.599.467-.35.511-.743.102-1.399-.787-1.325-2.115-1.995-3.121-3.015-.934-.962-2.159-1.792-2.655-2.943-.642-1.442 1.283-1.865 1.94-2.768 1.969-2.724 4.201-5.23 6.418-7.764 1.007-1.151 1.036-1.865-.364-2.477-1.036-.495-2.145-.888-3.268-1.107-1.721-.35-2.932-1.646-4.522-2.258-1.05-.422-.467-1.18.146-1.894 2.728-3.263 6.374-5.885 8.14-9.775 1.356-2.972 3.005-4.02 6.024-3.365.934.19 1.43-.291 1.678-1.107.787.437-.044.903.219 1.326 4.449.116 8.898.364 13.318 1.107 1.794.291 3.472.757 5.164 1.398 1.838.685 3.807 1.137 5.747 1.399 3.02.393 5.777 1.602 8.607 2.578.175.044.292.219.467.248 3.092.35 5.893 1.69 8.781 2.68 3.545 1.224 7.134 2.229 10.664 3.395 3.311 1.078 6.958 1.049 10.371.218 1.109-.277 2.291-1.078 3.341-1.763.744-.495 1.079-1.398.642-2.359-.175-.35-.438-.831-.759-.044-.044.102-.219.247-.292.247-1.91-.976-1.896-.976-3.617.175-1.649 1.078-6.244.933-7.819-.277-.146-.101-.248-.291-.365-.32-4.376-.758-8.315-2.753-12.457-4.152-2.291-.757-4.8-.976-6.959-1.966-3.413-1.574-7.25-1.297-10.576-2.827-5.163-2.36-10.75-2.84-16.177-3.977-1.867-.364-3.661-.67-5.529-.539-.977.044-.539-.888-.685-.932-.788-.248-1.722-.35-2.378.117-.584.422-1.211.757-1.678.364-.437-.35.117-.976.292-1.442 1.765-4.72 1.867-9.557 1.109-14.466-.365-2.36.189-4.807-.744-7.124-.248-.641.35-.888.89-1.049 1.867-.582 3.559-1.573 5.455-2.156 2.947-.888 5.806-2.185 8.753-3.146 1.298-.423 2.728-.568 4.128-.568 4.799.029 9.613.043 14.412.32 3.443.19 6.988.364 10.328.962 3.866.684 7.819 1.15 11.554 2.432 4.449 1.545 8.315 4.094 11.524 7.561 1.181 1.282 2.655 2.229 3.734 3.686 1.401 1.923 2.582 3.904 3.705 5.987 1.911 3.467 3.589 7.022 5.412 10.503 3.56 6.978 5.748 14.218 3.633 22.07l-.015-.014Z" fill="#000"/></g><defs><linearGradient id="b" x1="52.665" y1="22.57" x2="298.433" y2="22.57" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="c" x1="206.875" y1="325.678" x2="382.708" y2="325.678" gradientUnits="userSpaceOnUse"><stop stop-color="#FF7139"/><stop offset="1" stop-color="#FFEA7F"/></linearGradient><linearGradient id="d" x1="206.875" y1="325.678" x2="382.708" y2="325.678" gradientUnits="userSpaceOnUse"><stop stop-color="#FF7139"/><stop offset="1" stop-color="#FFEA7F"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h364.89v400H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mr-import.svg b/browser/components/aboutwelcome/assets/mr-import.svg
new file mode 100644
index 0000000000..93034912ec
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-import.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="337" height="400" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="m75.246 347.009 9.833-3.423 4.623-2.282 21.396 9.716 41.052 6.281h81.515l54.919-6.281 10.987-13.704h9.257l5.787 6.282-5.787 19.42-25.443 6.857h-63.024l-91.925 3.423-43.357-15.997-9.833-10.28v-.012Z" fill="url(#b)"/><path d="m246.803 42.957-6.351-14.103 7.622-7.046 11.433-5.129h8.257l5.717-10.257 12.716-6.41 8.892 15.385 6.352-4.481 15.256-4.494 10.798 7.058 5.082 13.468-3.812 12.175-12.08 9.621 5.082 14.75-5.082 17.315 5.082 5.776 1.27 7.692-3.176 8.328-71.811 3.2-1.27-7.693-2.541-11.54 6.352-7.057c-2.964-2.776-8.893-9.104-8.893-12.174 0-3.846-1.27-12.186 0-15.385 1.012-2.565 3.812-7.046 5.082-8.975l.023-.024Z" fill="url(#c)"/><path d="M227.348 73.034c.071-.776-.141-1.576-.917-1.682-4.505-.6-6.434-3.94-8.269-7.434-.918-.706-1.73-1.552-2.706-2.117-.106-.07-.164-.106-.235-.165-.341-.27-.341-.506-.165-.776.071-.106.141-.235.236-.341-1.518-1.141-3.282-.776-4.811-.235-3.929 1.376-5.658 5.281-8.599 7.834-1.258 1.07-1.894 2.728-1.658 4.575.2 1.376-.683 2.459-1.894 2.659-1.188.2-2.576-.071-3.317-1.318-2.27-3.905-5.352-2.152-7.046.306-2.541 3.67.341 8.54 5.081 8.88 2.341.165 2.918.942 2.129 2.753-2.305 5.376-1.693 7.128 3.588 9.822.576-.2 5.423 1.317 5.481 1.412 1.494.305 2.976.635 4.47.87 7.728 1.282 11.316-.435 14.492-6.822.27-.541.647-1.07.164-1.518-.541-.47-.882.2-1.352.4-2.365 1.047-4.776 1.718-7.211.035-.682-.505-1.494-1.011-1.223-1.811.306-.976 1.423-1.517 2.364-1.141 1.047.4 2.07.2 3.082.435 1.894.4 3.011-1.317 4.646-1.682 1.012-.27.341-1.788.271-2.588-.2-2.658.847-4.81 2.27-6.857.718-1.082 1.012-2.259 1.082-3.494h.047Zm-11.586.812c-.47.365-.953.706-1.423 1.047-.236.13-.471.306-.706.435a3.812 3.812 0 0 1-.741.4c-.2.106-.435.2-.682.27-.165.071-.377.106-.541.13-.741.2-1.588.2-2.506-.07-1.223-.342-1.658-1.071-1.658-1.989.035-1.211 1.258-1.211 2.305-1.482 1.765 1.376 2.847-.34 4.07-1.14.106-.071.235-.13.341-.2.165-.071.341-.13.506-.2.682-.165 1.282.035 1.694.54.07.106.141.2.164.342.142.4.036.835-.164 1.211-.141.27-.377.506-.647.706h-.012ZM198.189 98.488c5.528 1.612 11.056 1.871 16.503 2.506 1.023.117 1.505.258 1.023 1.152-2.012 3.588-1.741 7.434-1.306 11.21.2 1.612-.082 2.023-1.858 2.694-4.152 1.529-8.058.976-12.163.294-2.564-.412-5.175-4.152-4.575-6.611.905-3.658 2.764-7.093 2.328-11.21l.036-.035h.012ZM312.509 157.853v.059h.165l-.165-.059Zm9.434-14.103c-1.059 0-2.505-.035-2.788 1.682-.741 4.564-3.27 7.669-7.575 9.222-1.482.518-3.211 2.294-4.552.741-1.482-1.717.541-3.329 1.317-4.858.483-.941 1.318-1.717 1.447-2.846.13-1.33-.317-2.012-1.67-1.2-1.6.905-2.988 2.141-3.976 3.587-3.305 4.882-7.893 7.505-13.574 7.834-8.822.483-17.585 1.976-26.513 1.329-7.446-.517-14.95.036-22.396.389-1.576.058-3.176.188-4.752.317-.576.035-1.247-.188-1.447.741-1.129 5.176-4.14 9.316-7.634 13.104-.741.835-.482 1.352.059 2.105 2.67 3.823 6.481 3.694 10.233 2.659 8.799-2.459 17.656-4.6 26.255-7.799 4.105-1.553 8.41-2.529 12.644-3.752 4.047-1.2 8.317-1.424 12.292-2.976 1.953-.777 4.082-.388 6.035-.682 5.552-.812 11.139-1.518 16.491-3.27 2.211-.741 4.458-1.294 6.446-2.753 3.976-2.917 3.599-7.469 4.493-11.515-.388-.742.518-2.071-.835-2.071v.012Zm-12.68 14.821c-.294.071-.577.165-.871.259-1.352.423-2.658.976-4.105 1a4.862 4.862 0 0 1 1.094-.518c.224-.094.447-.165.671-.223 1.058-.295 2.152-.353 3.246-.553h-.035v.035ZM206.257 323.038c.718 1.105-.541 1.799-.576 2.776-.306.67-1.635.706-1.294 1.705.447 1.365.071 2.576-.682 3.612-.682.941.2.999.541 1.399 0 2.106-.717 4.211.447 6.246.341.635.106 1.306-1.165 1.471-6.457.87-12.821-.2-19.184-.706-2.423-.2-4.858-.235-7.693-.33 3.693-4.305 5.27-9.48 8.375-13.891 1.647-2.341 1.705-5.705 2.458-8.61.518-2 .988-4.012 1.576-5.976.377-1.306 1.271-1.941 2.741-1.741 5.505.706 11.116.871 16.48 2.435-.177 1.941.235 3.87-.953 5.811-.788 1.305-1.47 3.035-.612 4.74-.929 0-.412.706-.517 1.106l.07-.035-.012-.012ZM37.029 235.218c-1.8-2.847-4.34-4.729-7.834-5.329-1.6-.27-2.117-.694-1.87-2.587.411-3.647 1.8-6.987 2.776-10.457.553-1.918 5.822-5.493 7.904-5.493.659 0 1.106.235 1.494.658 6.281 6.823 15.056 9.234 23.549 12.08 1.976.659 2.258 1.165 1.317 2.847-1.352 2.517-3.058 4.764-4.61 7.116-1.871 2.847-3.718 5.694-5.823 8.375-1.07-.094-2.153 0-3.117-.623-4.305-2.752-9.187-4.434-13.81-6.622l.036.035h-.012Z" fill="#DB9646"/><path d="M57.602 363.584c-8.422 0-16.833-.164-25.22.094-2.893.059-5.916-.458-8.645.353-1.235.353-3.058-1.423-3.74.847-1.165-2.046-.753 0-1.071.388-.776.906-1.235.095-1.588-.458-.647-.977-1.306-1.53-2.27-.33-.294.388-.647.294-1.035.094-2.141-1.07-4.482-.258-6.693-.647-1.859-.329-3.611.941-5.458.33-.682-.224-1.859.164-1.859-.906 0-.941.353-1.788 1.659-2.141 2.635-.717 5.364-.611 7.999-1.105 3.446-.624 6.928-.2 10.374-.553 1.494-.165 3.282-.388 4.94-.294 3.506.2 7.023-.259 10.528-.165 7.634.259 15.315-.353 22.914.623.811.095 1.494.165 2.117.741.588.553 1.07 1.165.847 2.012-.259 1.035-1.165.812-1.918.847h-1.858v.259l-.023.011ZM301.182 24.783c-.611 1.165-.423 2.047-.388 2.929.035 1.106-.588 2.011-1.694 2.117-1.176.094-1.364-.94-1.458-1.882v-.223c-.588-6.2.258-7.117 6.469-7.023 1.165 0 2.341 0 3.482.13 1.035.094 1.717.682 1.658 1.847-.035 1.164-.882 1.329-1.752 1.4-.977.035-1.953 0-2.988 0 .388 2.305 2.529 3.575 3.282 5.622.164.482.553.588 1.27.553 2.529-.165 5.07-.353 7.634-.718.059-.682-.459-1.07-.847-1.529-.611-.717-.353-1.27.2-1.823.647-.647 1.306-.812 2.012-.094.294.259.611.482.882.753 1.141 1.2 3.799 1.493 3.54 3.317-.353 2.6-1.717 5.034-3.152 7.304-.388.647-1.2.718-1.882.388-.753-.329-.718-1.07-.553-1.623.329-1.105.424-2.47 2.141-2.529-1.165-1.2-2.4-.882-3.611-.717-2.141.294-4.258.517-6.399.776-2.012.259-3.223-.776-4.094-2.505-1.105-2.118-2.34-4.153-3.669-6.493l-.071.035-.012-.012ZM40.593 374.827c-2.635.553-7.482-.259-12.187.717-.811.165-2.081.165-2.27-1.035-.13-.941.165-1.529 1.459-2.011 2.823-1.106 5.422-2.141 8.48-1.071.46.165 1.142-.258 1.694-.588 1.4-.776 2.212-.482 3.353.847.13.165 1.035.718 1.035.071 0-1.365.976-1.271 1.717-1.365 4.482-.423 8.94-.647 13.421.059.906.165 2.012.13 1.988 1.659 0 1.694-1.494 1.305-2.176 1.364-4.81.518-9.622.812-16.514 1.365v-.012ZM210.339 76.95c-.459-.036-.906-.13-1.364-.095-1.235.036-1.694-.882-1.694-1.752 0-1.165 1.305-1.694 2.011-1.4 1.718.718 2.8-.224 3.905-1.106.906-.717 1.824-.752 2.435.07.718.883.13 1.624-.682 2.306-1.623 1.33-3.223 2.082-4.611 2.012v-.035ZM281.621 74.094c-.553.13-.906.26-1.27.33-4.388.482-4.741.164-4.741-4.294 0-3.61 1.835-5.67 5.493-6.175-1.011-1.2-1.846-2.34-2.823-3.376-1.035-1.164-.905-2.117.165-3.211 1.623-1.694 3.964-2.247 5.717-3.835 1.458-1.294 4.317 3.188 4.74 4.482.259-2.247.482-3.894.647-5.552.259-2.73.941-3.282 3.67-3.247 1.329 0 2.541.588 3.905.46 1.012-.095 1.459.776 1.329 1.787-.164 1.294-.423 2.6-.552 3.893-.071.553-.777 1.2 0 1.659.717.423 1.399.259 2.14-.2 1.306-.812 2.282-2.082 3.8-2.635.623-.223 1.199-.553 1.729-.13 1.329 1.142 1.623 2.93 2.599 4.294 1.235 1.788.518 3.153-1.27 4.294 3.835.329 4.646 1.364 4.035 4.94-.071.459-.295.882-.353 1.329-.436 2.682-2.024 4.093-4.776 4.223-.094.423.259.517.494.647 2.553 1.705 2.788 3.658.682 5.846-.553.553-1.07 1.14-1.588 1.717-1.305 1.459-2.693 1.459-4.034-.07a250.166 250.166 0 0 1-2.894-3.47c0 1.788-.329 3.246.071 4.481.717 2.376-.424 3.317-2.341 3.894-1.588.482-3.247 1.035-4.882 1.105-1.329.035-2.34-.906-2.246-2.564.059-1.294 0-2.6 0-4.188-1.823.941-2.6 2.53-3.705 3.741-.753.776-1.494.941-2.177.459a43.673 43.673 0 0 1-4.352-3.706c-1.623-1.623-1.235-3.058 1.329-5.551.459-.424.942-.753 1.33-1.436l.129.071v-.012Zm15.997-6.01c-.035-1.788-2.635-4.647-4.034-4.576-.33 0-1.024 0-1.788.553-1.471 1.282-1.247 1.27-1.553 1.847-1.658 2.082-.565 4.293 1.094 5.399 1.329.905 2.694.882 4.093.129 1.459-.776 1.882-2.117 2.176-3.34l.012-.012ZM285.973 14.291a4.729 4.729 0 0 0-.224.647c-1.917-.753-1.846 1.53-3.023 1.953-2.67.976-3.999 3.376-5.434 5.587-.647 1.012-1.27.776-2.117.482-1.106-.388-.977-1.035-.553-1.823 1.988-3.61 4.94-6.199 8.575-8.057 1.305-.647 2.211-.07 2.764 1.2l.012.011ZM279.962 29.559c-1.623-.094-1.788-1.165-1.564-2.176.776-3.188 6.304-7.081 9.692-7.21 1.459-.036.129 1.846 1.435 1.623.094.752-.353 1.364-.941 1.458-3.646.588-6.269 2.4-7.799 5.846-.129.259-.646.353-.846.459h.035-.012ZM265.036 35.475c-2.4.07-5.164.459-7.54 2.247-.847.647-2.012 1.435-2.8.223-.776-1.164.165-2.211 1.177-2.823 2.505-1.53 5.069-2.823 8.128-2.952 1.235-.07 2.27.258 3.281.752.624.295 1.365.718 1.012 1.788-.353.977-1.047.977-1.859.906-.294-.035-.623-.07-1.399-.13v-.011ZM262.601 26.348c.741.035 1.235-.036 1.458.517-1.27.459.683 2.376-1.035 2.47-3.282.165-6.175 1.659-9.233 2.53-.13.035-.353-.095-.424 0-.482.458-.682 2.046-1.623.776-.353-.483.294-1.882.941-2.659 1.694-2.082 4.187-2.47 6.563-3.117 1.165-.33 2.471.07 3.353-.482v-.035Z" fill="#010101"/><path d="m60.06 69 10.045-11.246 4.07-7.892 9.81-2.635 18.42 3.823 14.115-2.635h20.573l22.49 4.07 15.798-4.07 18.667-6.458 14.115 2.87 9.575 8.857v7.658h-3.353l-11.727 3.588-4.305 10.527-6.458-2.635-3.834 2.635v5.74l6.94 4.788 1.435 10.292 1.917 3.588v9.327l-11.245 6.705-19.385-3.352h-24.878l-24.89-6.223-28.477 15.068-22.725 4.305-16.515-4.305-9.093-8.857-3.105-17.232 9.328-15.315 12.68-11.01.012.023Z" fill="#010101"/><path d="M197.812 234.713c-1.399-.623-2.693.329-4.093.294-6.434 0-12.739-.882-18.95-2.435-1.623-.388-2.434-.223-3.611 1.071-6.269 7.128-13.268 13.562-20.149 20.102-5.199 4.94-10.528 9.657-16.421 13.856-4.74 3.388-9.586 4.094-14.821 2.835-6.857-1.658-13.915-2.376-20.737-4.105-9.14-2.306-18.362-4.235-27.337-7.316-5.787-1.988-11.762-3.388-17.679-4.976-1.917-.518-3.74-1.623-5.975-1.012-.588.165-2.012-1.011-.718-2.305.553-.553 1.012-1.176 1.53-1.753 2.046-2.14 1.858-3.223-.624-4.552-3.282-1.752-6.528-3.811-10.34-3.776-2.54 0-5.434.165-6.892 3.153-.388.776-1.588.905-2.306 1.658-4.681 4.811-8.422 10.316-11.633 16.139-1.2 2.14-2.952 3.117-5.164 3.317-3.999.353-7.246-1.494-10.304-3.811-.623-.459-1.011-1.236-1.011-2.047.035-4.623-.424-9.21 1.658-13.692 1.988-4.258 1.917-9.081 2.694-13.668.294-1.729.459-3.352 2.305-4.552 1.106-.682 1.07-3.094.624-3.999-.777-1.659-.26-2.894.329-4.094 3.117-6.634 5.234-13.762 9.293-19.937 1.564-2.377 4.163-3.518 6.892-2.729 2.341.647 4.458 1.729 6.246 3.352 2.047 1.882 4.164 3.67 6.729 4.811 3.317 1.458 5.105 4.658 7.61 7.022 4.458 4.199 10.304 5.658 15.762 7.846 1.435.588 3.023 2.282 4.258 1.435.941-.647.906-2.8 1.2-4.294.094-.588.458-1.011.482-1.729.13-2.305 1.717-2.764 3.835-1.658 4.128 2.176 8.257 4.387 12.644 6.081 4.388 1.694 8.846 3.023 13.292 4.493 4.188 1.4 8.481 1.824 12.845 1.141 1.917-.294 3.835-.329 5.752-.552 2.082-.259 3.246-1.435 4.587-2.706 3.964-3.834 6.529-8.622 9.458-13.209 2.599-4.105 5.105-8.293 7.41-12.527.612-1.141.588-2.671.741-4.035.647-5.364 2.635-10.245 5.27-14.903 1.141-1.988 2.117-4.035 3.799-5.693.718-.718-.459-1.459-1.106-2.118-3.246-3.258-6.857-6.21-9.421-10.116-2.247-3.411-2.012-3.54 1.435-5.728 4.775-2.988 8.998-6.669 13.268-10.339 5.105-4.388 9.657-9.34 14.433-14.08 3.705-3.67 6.857-7.846 10.892-11.222 1.035-.882-.13-1.176-.647-1.399-3.353-1.565-6.893-2.6-10.469-3.517-3.282-.847-6.375 0-9.528.846-5.881 1.494-11.539.33-17.161-1.599-4.223-1.435-8.446-2.894-12.775-3.964-4.74-1.177-9.421-.588-13.785 1.729-8.164 4.328-16.81 7.646-25.125 11.586-7.834 3.67-16.127 4.329-24.702 3.741-5.622-.353-10.433-2.282-14.656-5.529-4.223-3.223-7.375-7.775-8.975-12.692-2.729-8.422-.941-16.491 3.611-24.172 2.34-3.964 5.011-7.516 8.646-10.186 2.635-1.918 5.164-3.94 7.74-5.894 4.646-3.517 7.763-8.163 10.468-13.138 1.4-2.541 3.058-4.847 5.14-6.764 2.118-1.917 4.906-2.34 7.74-2.376 5.529-.07 10.822 1.176 16.127 2.47 4.517 1.07 9.139.753 13.586.07 6.21-.94 12.292-3.152 18.691-2.434 2.987.33 6.081.882 8.939.776 6.011-.258 11.151 2.635 16.774 3.517 4.058.624 7.892.294 11.833-.811 7.704-2.118 15.021-5.494 22.819-7.317 4.647-1.07 9.163-1.658 13.786.753 1.494.776 3.376 1.53 5.329 1.564 1.693 0 3.023 1.436 3.964 2.635 2.246 2.835 4.881 5.47 5.881 9.105.553 1.987 1.106 3.964 1.364 6.022.294 2.117 1.235 3.905 2.141 5.764.647 1.306 1.659 1.882 3.153 1.917 2.729.07 4.975 3.023 4.422 5.787-.423 1.953-.976 3.905-2.399 5.435-.977 1.047-1.4 2.34-1.071 3.646 1.659 6.705-2.046 14.927-9.292 17.373-.812.259-.906.883-1.071 1.6-.846 3.941-1.587 7.74.165 11.739 1.753 3.964 2.694 8.293 4.352 12.328.683 1.658 2.247.882 3.188 1.858 2.247 2.376 5.164 3.682 8.481 3.905.388 0 .811 0 1.164.13 2.435 1.07 3.929.682 3.153-2.306-.33-1.306 1.917-.906 1.011-2.141-1.07-1.47-1.494-3.117-1.399-4.916 0-.647-.589-.553-1.012-.683-5.658-1.623-8.74-6.116-11.669-10.704-.846-1.305.389-2.246 1.494-2.599 4.647-1.529 8.775-3.941 11.834-7.705 2.011-2.54 3.775-1.823 5.846-.553.352.224.682.624 1.141-.2.458-.846 1.364-.776 2.211-.094.459.353 1.035 1.141 1.788.389.588-.589.776-1.4.482-2.153a30.272 30.272 0 0 0-1.364-3.188c-1.918-3.905-1.659-7.975-.847-12.033.223-1.07.847-1.988 1.729-2.705 2.635-2.212 2.599-2.93.423-5.529-6.269-7.48-7.022-15.88-3.928-24.819.517-1.529 1.399-3.223 2.599-4.234 1.882-1.6 1.106-2.706.129-4.258-1.917-3.094-3.058-6.576-4.222-9.952-.388-1.07-.459-2.434.776-3.681 3.999-4.07 8.422-7 14.009-8.552 3.188-.882 6.176-1.564 9.422-1.2 1.106.13 1.529-.352 1.988-1.4 2.894-6.892 7.869-11.291 15.28-13.115 2.67-.647 3.446-.035 4.458 2.282 1.329 3.094 3.446 5.823 5.011 8.787.882 1.623 1.717 1.2 2.693.423 3.964-3.117 8.481-4.975 13.398-5.857 2.694-.483 5.199-.424 7.869 1.27 1.882 1.2 3.741 2.34 5.458 3.811 3.999 3.352 5.27 7.905 6.117 12.692 1.399 7.904-1.494 14.186-7.446 19.29-1.071.906-2.27 1.565-3.482 2.247-1.07.624-1.976.13-2.399-.517-.553-.882-.071-1.623 1.011-2.153 2.6-1.27 4.352-3.576 6.528-5.399 1.953-1.6 2.047-4.07 2.412-6.175.882-4.94.717-10.187-1.918-14.35-2.505-3.965-5.881-7.611-11.609-7.576-8.164.07-14.468 3.811-18.785 10.116-3.647 5.364-4.905 11.74-2.212 18.256.389.976.906 1.27 1.918 1.235 6.01-.294 11.762 1.105 17.161 3.576 2.176 1.011 3.929 2.564 5.07 5.234.906 2.176 2.047 4.458 2.952 6.705 2.341 5.893.624 11.586-1.587 17.079-.718 1.823-.883 2.705 1.035 3.94 3.799 2.47 4.775 7.81 2.964 12.692-.165.389.553.847.459 1.494-.259 1.788-1.141 3.13-3.118 4.294.353.717.906.647 1.588.482 3.447-.718 4.223.165 5.846 3.388 1.953 3.869 3.741 7.869 6.505 11.35 1.271 1.6 2.117 3.517 3.611 4.976 1.141 1.106 0 2.8-1.858 2.858-2.47.071-4.976.094-7.446 0-1.435-.035-1.952.459-1.917 1.882.035 3.153-.647 6.305-.682 9.399-.036 2.211.164 4.493-.095 6.728-.129 1.012.718.941 1.141 1.176 1.53.906 1.953 2.047 1.753 3.87-.294 2.694-.459 5.364-1.047 8.034-1.27 5.658-5.199 8.551-10.374 10.151-7.082 2.176-14.398 3.67-21.679 4.552-14.397 1.729-27.819 6.729-41.546 10.869-3.517 1.035-7.022 2.211-10.633 2.858-2.894.553-5.752 1.4-8.775 1.235-2.505-.164-4.387-.941-5.917-2.929-1.952-2.54-2.67-2.67-4.646-.094-1.106 1.435-1.952 1.365-3.317.683-3.282-1.694-5.822-4.329-8.516-6.764-2.541-2.305-2.823-2.435-4.293.718-.812 1.729-1.847 3.281-2.823 4.811-1.271 1.952-1.918 4.199-2.435 6.21-.553 2.153-1.035 4.552-.718 7.022.33 2.306 1.494 3.482 3.223 4.682 4.623 3.258 9.751 5.564 14.468 8.528 6.47 4.07 13.068 7.975 19.02 12.845 2.635 2.152 5.364 4.199 7.281 6.928 3.247 4.623 4.059 9.916 2.565 15.327-1.788 6.469-3.376 13.044-6.117 19.22-1.106 2.54-2.435 4.975-3.67 7.481-4.458 9.104-8.128 18.573-12.315 27.783-1.565 3.411-3.541 6.669-5.787 9.692-.353.483-.777 1.012-.906 1.6-.518 2.082-.718 4.035-2.988 5.399-1.4.847-1.953 3.059-2.858 4.658-1.271 2.212-1.753 4.752-3.376 6.799-.753.941-1.176 2.176-1.27 3.411-.095.977-.683 1.953 1.293 2.176 2.506.33 3.647 2.964 5.27 4.623 3.541 3.611 7.963 4.682 12.704 5.27 4.717.553 9.422.905 13.491 3.905 5.423 3.999 6.505 9.763 2.341 15.221 6.14-.13 12.163-.094 18.138-.624 2.823-.258 5.693-.517 8.516-.353 4.423.259 8.446-1.035 12.516-2.376 2.27-.752 4.611-1.27 6.728-2.564 2.858-1.753 4.093-4.787 5.881-7.316 2.012-2.894 4.2-5.399 7.705-6.576 3.905-1.305 9.163.906 10.821 4.682 1.271 2.835 1.435 5.764 1.106 8.751-.941 9.011-6.528 14.539-14.397 17.538-4.776 1.788-9.657 3.741-14.915 4.458.2 1.365 1.329 2.177 1.823 3.388 2.929 7.152-1.788 15.974-9.328 18.609-3.776 1.329-7.41 1.141-10.986.611-2.929-.423-5.787-1.882-7.317-4.975-.905-1.824-2.211-3.447-3.117-5.341-1.752-3.575-.976-6.74 1.4-9.657.294-.353.624-.682.906-1.07.07-.094 0-.294-.035-.388-5.788.294-11.504 1.011-17.327.611-7.081-.458-14.209-.682-21.325-.294-7.152.389-14.304 0-21.456.624-5.363.459-10.762.553-16.091.976-3.611.294-7.187 1.2-10.798.976-4.223-.223-8.351 1.235-12.609.589-.718-.13-1.882.094-1.071 1.623.847 1.588 1.294 3.387 1.847 5.105 1.694 5.305-1.235 8.657-5.07 11.551-2.176 1.623-4.74 2.634-6.951 4.293-2.6 1.917-9.105.518-11.869-2.153-.329-.329-.623-.776-1.012-.941-4.258-1.823-5.269-5.728-5.752-9.633-.494-3.905.165-7.705 3.153-10.739.094-.095.07-.295.094-.459-6.175-1.788-12.292-3.705-18.303-6.081-3.928-1.565-8.186-2.282-12.186-3.812-4.681-1.788-9.551-3.446-13.103-7.022-2.176-2.176-4.611-4.034-6.693-6.281-2.541-2.764-1.988-4.94.258-7.222 4.553-4.658 10.081-5.823 16.056-3.741 2.671.906 5.588 1.917 7.317 4.623.353.588.906-.33 1.435 0 1.823 1.011 3.799 1.694 5.564 2.964 1.011.718 2.634 1.329 3.999 1.564 4.587.812 8.94 2.435 13.586 3.059 5.587.776 11.045 2.376 16.644 3.317 1.858.294 3.87-.424 5.822-.588 4.388-.424 8.775-.2 13.104.482 1.847.294 3.446.2 5.27-.294-3.023-2.764-2.953-6.023-1.788-9.398 1.717-4.976 4.646-9.269 7.41-13.692 3.153-5.105 5.987-10.375 7.022-16.456.389-2.176 1.106-4.364 2.047-6.375.882-1.953-.294-2.412-1.588-2.565-2.952-.353-5.846-1.07-8.81-1.658-1.2-.224-2.211-.812-3.058-1.459-1.2-.882-1.918-2.141-.718-3.776 5.623-7.422 10.14-15.42 14.009-23.878 3.929-8.622 7.317-17.408 10.363-26.348 1.459-4.329 1.918-8.916 2.141-13.504a47.19 47.19 0 0 1 .165-2.246h.129l-.059-.059Zm20.15-176.192c-1.035-1.177-1.718-2.212-2.012-3.388-.882-3.811-3.705-6.246-6.634-7.999-6.893-4.093-14.362-5.27-22.172-2.47-5.493 1.988-11.022 3.905-16.55 5.858-6.34 2.282-12.869 3.317-19.315 1.012-12.292-4.459-24.666-4.423-37.217-1.659-5.716 1.27-11.468 1.753-17.197.165-4.716-1.306-9.492-1.823-14.303-1.306-3.964.423-8.128.459-10.469 4.976-3.67 7.151-8.81 13.174-15.28 18.02-6.669 4.976-11.15 11.68-14.985 18.867-3.188 6.023-1.952 12.069.624 17.891 2.27 5.176 5.787 9.304 11.15 11.716 3.741 1.658 7.67 2.211 11.61 1.988 3.023-.165 6.081-.424 9.14-1.33 3.776-1.105 7.704-1.599 11.445-2.987 2.694-1.012 5.164-2.412 7.763-3.541 4.905-2.211 10.045-3.834 14.856-6.375 9.422-4.94 19.021-4.623 28.572-.224 3.67 1.694 7.481 2.765 11.539 2.8 2.247 0 4.517.423 6.669-.482 1.753-.753 3.517 0 5.329-.424 5.787-1.4 10.692 1.953 15.926 3.353 3.482.941 6.952 1.364 10.399.646 5.14-1.046 9.821-6.469 10.245-11.774.165-1.882 1.07-4.293-1.823-5.305-.389-.13-.683-.847-.847-1.364-.882-2.8-1.659-5.658-.777-8.622.389-1.306-.164-1.624-1.176-1.953-2.541-.882-4.717-2.082-5.458-5.07-1.105-4.458-.517-7.057 2.565-8.398 2.082-.906 4.328-1.07 6.528-.07.482.223 1.141 1.034 1.588.223.588-1.012.753-2.176 1.588-3.153.905-1.035-.294-3.834 2.729-3.187.258.07.482-.165.329-.424-.812-1.458.682-1.564 1.27-1.917 1.718-1.035 3.647-1.788 5.399-2.8 2.694-1.564 5.623-1.364 8.905-1.329l.035.07.012-.034Zm-77.951 139.422c-.224 4.976 2.929 9.504 6.505 13.692 3.446 4.034 7.61 7.187 12.221 9.986 6.211 3.741 12.257 7.446 19.573 8.622 6.505 1.035 12.974 2.247 19.596 1.271 1.365-.2 2.271.458 2.6 2.14.647 3.412 0 6.764-.388 10.081-1.035 8.916-5.011 16.95-8.058 25.243-1.493 4.034-3.317 7.904-5.105 11.809-3.246 7.152-7.116 13.892-11.962 20.067-.906 1.177-.553 1.565.588 1.859 4.258 1.035 8.481 2.246 12.845 2.541 6.14.388 12.221.976 18.232 2.246 2.599.553 4.905-.388 7.246-.976 1.235-.294 1.07-2.341 1.693-3.541a28.256 28.256 0 0 1 1.624-2.799c2.411-3.67 4.422-7.552 6.175-11.551 3.411-7.81 6.47-15.809 10.434-23.325 4.222-8.034 7.022-16.492 9.527-25.114 2.141-7.422.294-13.797-5.422-18.808-6.799-5.952-14.562-10.539-22.232-15.221-4.587-2.799-9.422-5.14-13.974-8.104-3.352-2.176-4.975-4.882-4.646-8.681.2-2.012-.482-1.659-1.917-1.4-3.776.682-7.575 1.494-11.445 1.012-5.917-.753-11.61-2.376-17.197-4.423-5.846-2.117-11.245-4.94-15.668-9.398-1.341-1.341-2.533-1.243-3.576.294-.223.329-.459.588-.682.905-4.093 6.246-6.599 13.01-6.564 21.573h-.023Zm75.481-64.283c1.235-5.858 1.399-11.257-1.165-16.491-.459-.941-.811-.588-1.294-.294-2.046 1.27-4.328 1.882-6.728 1.988-4.129.165-7.481-1.565-10.339-4.423-.459-.459-.753-1.529-1.824-.753-3.928 2.929-8.48 3.447-13.197 3.388-.612 0-1.165-.165-1.753.682-3.246 4.682-7.669 8.328-11.374 12.586-5.952 6.834-12.645 12.857-19.597 18.644-3.317 2.764-6.857 5.199-10.469 7.646 2.671 3.74 6.176 6.54 9.105 9.892 4.199 4.811 8.516 9.563 14.268 12.527 1.105.588 1.952 2.247 2.376 2.118 2.564-.777 4.481.846 6.528 1.529 7.152 2.411 14.339 3.834 21.879 2.764 3.023-.424 5.916-.906 6.951-4.788.424-1.529.753-3.387 1.953-4.716 1.494-1.624 1.717-4.035 3.023-5.635 2.247-2.729 1.106-4.128-.906-6.151-3.705-3.647-6.399-8.164-9.234-12.492-2.987-4.553-4.905-9.563-5.363-15.068-.094-1.306.094-2.435 1.529-2.576 1.494-.13 1.623 1.176 1.658 2.282.094 3.74 1.4 7.151 3.059 10.374 5.787 11.292 14.432 20.173 24.113 28.172.612.517 1.07.882 2.141.2 3.576-2.212 5.881-5.493 8.187-8.822 2.27-3.259 3.411-6.928 4.352-10.763.388-1.6.2-2.211-.812-3.188-4.164-3.964-8.998-7.022-13.621-10.41-3.058-2.246-5.423-5.046-7.34-8.257-.682-1.141-.329-2.247.518-2.835 1.141-.776 1.846-.035 2.211 1.2.165.518.647.941 1.165 1.623v.047Zm-78.304 67.894c-4.423 6.34-7.611 13.468-12.61 19.42-1.917 2.282-3.705 5.176-6.563 5.917-5.235 1.329-10.657 1.752-16.092 1.106-4.716-.553-9.233-1.918-13.68-3.612-5.563-2.082-11.315-3.74-16.444-6.763-2.27-1.329-2.246-1.365-2.764 1.27-.753 3.647-1.623 7.293-3.446 10.54-2.435 4.364-5.07 8.622-7.999 12.656-1.53 2.117-2.082 4.752-4.352 6.47-1.788 1.399-1.365 1.658 1.07 2.434 4.129 1.33 8.352 2.082 12.48 3.353 7.505 2.282 14.95 4.658 22.597 6.505 10.986 2.67 22.137 4.658 33.182 6.998 2.376.518 4.846.718 6.893-.623 2.987-1.917 6.246-3.447 8.845-5.858 8.481-7.81 16.962-15.644 25.031-23.913 1.294-1.33 2.341-3.259 4.199-3.811 1.2-.353 1.035-1.141 1.294-1.824.33-.976-.553-1.141-1.105-1.435-4.035-2.082-7.964-4.364-11.834-6.704-8.775-5.305-15.244-12.457-18.655-22.185l-.035.036-.012.023Zm175.557-52.085c2.67-.459 3.541-2.282 4.129-4.328.588-2.141.905-4.423 3.282-5.529.846-.388.482-1.235.482-1.882.129-4.846.094-9.692.329-14.539.13-2.834.165-2.987-2.729-2.564-9.692 1.494-19.443 1.988-29.218 2.412-5.14.2-10.269 0-15.409.094-5.293.129-10.598-.518-15.892-.388-1.917.07-3.023-.389-3.964-1.953-1.364-2.282-2.987-4.458-4.352-6.728-1.988-3.353-5.14-5.788-6.893-9.269-.388-.753-1.035-1.071-1.693-.977-.777.095-.718.941-.624 1.565.459 3.611-.329 7.222-.294 10.833.035 6.152.682 12.292.329 18.479-.058 1.235.071 1.271-1.141 1.788-.517.224-.329.882-.2.941 1.659 1.012 1.165 2.376 1.365 3.964.482 4 .294 7.975.388 11.939.035 1.882.647 2.118 2.341 2.082 5.399-.2 10.786-.847 16.221-.847 6.269 0 12.55.847 18.82.059 4.811-.588 9.622-1.176 14.433-1.564 3.058-.224 5.622-.847 7.633-3.153.647-.752 1.271-1.529 1.918-2.282 1.788-2.082 3.705-4.034 6.14-5.469 1.717-1.012 3.152-.624 4.517.329 1.305.918 1.564 2.412 1.235 3.905-.224 1.012-.682 1.953-1.141 3.153l-.035-.071h.023Zm-1.953 199.318c0-2.047-.611-3.964-1.07-5.893-.329-1.435-1.823-1.917-2.823-2.8-.882 1.047-1.694.353-2.694.2-2.305-.353-4.422 0-6.081 2.176-1.329 1.73-2.564 3.612-3.446 5.435-2.212 4.493-6.246 6.046-10.34 7.516-2.858 1.047-6.175 1.07-8.845 2.411-7.246 3.612-14.95 2.377-22.49 2.929-3.906.294-7.87-.094-11.704 1.047-2.117.624-3.247-.2-3.411-2.341-.094-1.105-.459-1.305-1.529-1.399-2.823-.259-5.623.094-8.446-.224-2.4-.259-4.882-.259-7.246.071-7.634 1.105-15.279 1.658-22.984 1.564-1.976 0-4.035-.329-5.952-.2-6.469.494-12.939.094-19.408-.164-1.365-.059-.259-1.659-1.459-1.53-1.164.13-.517 1.859-1.752 1.882-2.471.036-4.682 1.365-7.281.977-2.212-.33-4.517-.165-6.764-.036-7.869.459-15.574-.494-23.243-2.046-3.776-.777-7.481-1.918-11.28-2.564-5.011-.847-9.657-2.706-13.88-5.305-4.482-2.765-8.81-5.635-14.268-5.729-2.012-.035-4.035.353-6.082.459-1.329.059-2.693 1.329-2.987 2.894-.33 1.658 1.105 2.564 2.117 3.517 3.505 3.352 8.222 4.552 12.48 6.504 1.717.777 3.447 1.788 5.293 2.153 5.27 1.011 10.01 3.411 14.915 5.364 3.906 1.529 7.634 3.411 11.834 4.069.423.059.976-.223.846.612-.07.518.389.812.647.388 1.036-1.882 2.376-.517 3.353-.2 1.305.459 3.023-.164 3.905 1.435 1.106-1.494 2.764-.682 3.929-.588 5.199.424 10.374.094 15.538.094 1.694 0 3.376.2 5.105.094 10.304-.458 20.538-1.917 30.853-2.411 1.494-.071 2.988.059 4.517-.07 4.352-.33 8.716-.13 13.069-.483 2.564-.223 5.105.094 7.634-.129 2.893-.259 5.846-.13 8.739-.2 5.846-.094 11.61 1.011 17.456.588 1.917-.129 3.929-.423 5.752-.035 1.329.294 2.399 1.235 3.446-.353 0-.035.294.094.424.094 5.693-.094 11.374-.259 17.067-.329 4.776-.071 9.493-.036 14.233-1.141 4.905-1.141 9.716-2.506 14.268-4.517 6.528-2.894 9.822-7.352 10.081-13.857l-.036.059v.012Zm20.479-231.489c-2.011-3.352-3.646-6.046-5.269-8.751-.2-.329-.483-.623-.812-.776-1.788-.977-3.317-3.094-3.317-4.388-.071-3.776-2.635-2.505-4.223-2.505s-3.246.094-4.87.2c-4.352.259-8.68.682-13.033.811-5.14.13-10.245.718-15.338.883-5.493.164-11.081.164-16.55.588-4.94.388-9.845.164-14.762.482-2.341.165-4.717 0-7.223 0 .647 1.658 1.859 2.435 2.729 3.482 2.694 3.281 5.141 6.728 7.117 10.48.517.977 1.176 1.494 2.47 1.623 7.316.683 14.633.812 21.973.777 5.01 0 10.01-.682 15.02-.682 7.611 0 15.115-.906 22.596-1.988 1.2-.165 2.694.482 3.576-.459.977-1.07 2.412-.882 2.929-.553 2.176 1.459 4.352-.094 7.023.753l-.036.035v-.012Zm-7.246 26.902c-.458-.589.483-1.988-.976-1.859-.976.071-2.411-.094-2.67 1.564-.882 5.788-4.846 8.622-9.975 10.34-.905.294-1.823.717-2.54-.165-.718-.847-.259-1.752.2-2.599.776-1.4 1.658-2.765 2.434-4.2.459-.776.683-1.858-.035-2.34-.647-.459-1.623.07-2.247.647-1.164 1.105-2.47 2.117-3.375 3.387-3.059 4.458-7.281 6.928-12.551 7.517-5.752.646-11.504 1.235-17.291 1.529-8.293.423-16.574-.624-24.866.094-4.353.353-8.74.329-13.104.494-.682 0-1.364-.13-1.588.905-1.106 4.882-3.799 8.881-7.187 12.457-1.106 1.176-1.27 2.047.071 3.188 1.435 1.235 2.435 3.223 4.846 2.505 1.658-.517 3.223.459 5.07-.164 8.774-2.894 17.843-4.788 26.524-7.999 4.164-1.529 8.552-2.541 12.845-3.776 4.129-1.2 8.481-1.529 12.551-3.023 1.917-.717 3.929-.423 5.822-.647 5.952-.776 11.963-1.588 17.68-3.517 1.917-.647 3.928-1.2 5.657-2.47 4.129-2.999 3.741-7.646 4.647-11.904l.07.036h-.012ZM212.08 97.902c5.105.482 8.552-1.047 11.081-7.023.2-.458.388-.94 0-1.27-.424-.33-.776 0-1.2.259-2.141 1.106-4.352 1.859-6.669.388-.777-.482-1.882-.906-1.494-1.988.353-1.011 1.4-1.305 2.541-.976.882.259 1.823.259 2.728.388 1.788.224 2.894-1.306 4.458-1.729.777-.2.259-1.753.165-2.54-.259-2.541.812-4.518 2.117-6.447.718-1.035.977-2.176 1.106-3.387.094-.847-.259-1.659-1.035-1.788-4.517-.718-6.469-3.94-7.869-7.775-.647-1.788-2.047-2.506-3.799-2.435-2.565.07-5.07.647-6.952 2.435-2.929 2.729-6.634 4.916-6.505 9.822.035 1.752-2.082 2.599-3.705 1.729-.941-.518-1.823-1.2-2.729-1.788-1.27-.812-2.6-.33-3.705.094-1.106.423-1.141 1.752-1.012 2.893.2 1.824.623 3.482 2.435 4.423 3.517 1.823 5.564 4.129 4.329 8.657-.777 2.835 1.199 5.176 4.164 6.211 3.705 1.306 7.634 1.459 11.48 1.917l.094-.094-.024.024Zm77.234-7.093c2.694.2 5.564-.07 8.351-.753 4.258-1.047 7.775-3.446 10.528-6.728 6.34-7.481 10.469-15.75 7.116-25.866-1.27-3.811-2.764-7.705-7.057-9.434-5.917-2.376-11.998-3.575-18.303-2.082-7.999 1.882-13.809 6.576-16.903 14.35-.259.648-.306.306-.706 2.342-.47 1.929-.317 1.387-.517 2.822-.294 1.859-.341 3.259-.341 4.894 0 1.635.223 3.223.494 4.81 1.529 8.658 6.634 16.821 17.326 15.68v-.035h.012ZM28.948 227.291c-.388 1.788 1.165 1.435 2.047 1.623 4.458 1.106 6.599 3.223 7.116 7.446.094.776.424 1.2 1.035 1.27 4.717.612 8.516 3.352 12.61 5.399.976.494 1.105.259 1.588-.611 1.858-3.223 4.187-6.117 6.046-9.34 1.364-2.376 3.023-4.587 4.258-7.058.906-1.788.517-2.176-1.27-2.834-7.905-2.835-16.092-5.176-21.914-11.81-.424-.494-.941-.882-1.624-.682-3.023.847-5.975 2.376-7.116 5.175-1.459 3.576-2.8 7.387-2.823 11.457l.035-.035h.012ZM176.746 337.93c2.693.2 5.199.482 7.704.588 5.787.224 11.504 1.365 17.362.518 1.564-.224 1.694-.753 1.27-1.859-.553-1.4-.647-2.764-.459-4.258.294-2.152 1.953-3.834 1.753-6.152-.259-2.67.717-5.046 2.082-7.351 1.658-2.835 2.952-5.858 4.517-8.975-2.694.517-5.105.553-7.481-.388-1.035-.424-2.176-.812-3.282-.906-2.858-.259-5.787-.165-8.646-.518-2.046-.258-2.764.33-3.411 2.306-1.823 5.728-2.211 11.845-5.787 17.079-2.117 3.058-3.576 6.599-5.658 9.928h.036v-.012ZM287.197 32.666c-1.459.977-1.624 2.67-3.117 3.153-.906.294-1.624.223-1.918-.647-.294-.812 2.47-5.14 3.317-5.046 1.823.164 2.306-1.07 2.67-2.341.847-2.988 2.376-5.623 4.035-8.199.482-.753.459-1.105.035-1.788-1.752-2.893-3.67-5.728-5.069-8.786-1.071-2.376-2.376-2.306-4.388-1.565-6.505 2.376-9.622 7.575-11.704 13.727-.094.294-.258.459 0 .941 3.282 6.47 6.399 13.045 9.693 19.55 1.717 3.481 1.952 3.481 5.422 1.988.494-.2 1.012-.424 1.529-.483 1.33-.13 1.624-.482 1.071-1.882-1.071-2.6-1.882-5.34-1.529-8.586l-.036-.036h-.011Zm-6.729 14.092c-.258-.482-.423-.941-.717-1.27-1.106-1.27-1.847-2.706-2.6-4.2-3.093-6.21-6.399-12.292-9.139-18.667-.2-.482-.259-1.047-1.012-1.047-2.305 0-4.587-.223-6.893.353-4.552 1.141-8.316 3.835-12.386 5.952-.623.33-2.341 1.623-1.658 3.317 1.364 3.411 2.693 6.87 4.058 10.28.294.718.647.883 1.435.46 3.152-1.824 6.246-3.483 10.269-3.13 1.717.165 3.87 1.036 5.716-.223.13-.094.588.13.812.33 3.317 2.67 7.375 4.551 9.363 8.68.259.518.753.976 1.235.259.388-.588 1.529-.07 1.529-1.012l-.035-.094.023.012Zm-11.927 28.948c.459-1.177.094-2.176.129-3.153 0-.588-.294-6.022-.776-.623-1.894 1.835-3.093.847-3.352-1.73-.259-.975-.753-.752-1.529-.776-3.059-.2-4.905 2.082-7.281 3.282-.612.294-1.071 1.047-1.824.518-.611-.459-.717-1.2-.588-1.918.13-.588.259-1.234.588-1.752 1.141-1.753 0-3.388-.164-5.07-.059-.517-.483-.905-1.165-.388-1.529 1.141-3.058.388-3.67-.847-.811-1.6.812-2.211 2.047-2.729.941-.388 1.529-.847 1.494-2.011 0-1.141-.482-1.6-1.529-1.917-1.071-.33-2.412-.812-1.753-2.412.553-1.4 1.659-1.364 2.929-.812.517.224 1.235 1.106 1.694 0 .353-.882 2.046-1.493.647-2.834-.553-.518-.553-1.235-.683-1.918-.164-.882.259-1.364.906-1.623.588-.223 1.165-.2 1.494.624.224.552.718.976 1.07 1.494.389.552.718 1.4 1.588.94.741-.388 1.977-.164 2.047-1.529 0-.458.224-.882.353-1.305.294-.883.482-1.953 1.788-1.624 1.235.294 1.529 1.177 1.2 2.341-.2.682-.33 1.435.588 1.753.776.259 1.329-.165 1.788-.753.2-.259.388-.482.553-.753.494-.811 1.105-1.788 2.117-1.105.882.588 1.306 1.693.647 2.834-.588 1.035-1.435 1.953-.353 3.317 1.011 1.306 2.047.26 3.023.33 1.4.094 3.376-3.023 2.729-4.035-2.859-4.328-6.728-7.057-12.022-7.74-7.634-1.011-15.891 6.576-17.102 13.269-.553 3.152-.353 6.245.223 9.233 1.659 8.622 7.669 13.14 16.444 11.94 1.882-.26 3.705-1.177 5.752-.33l-.07-.2.023.012Zm-31.594 279.056c1.141.036 2.246.13 3.246-.647 2.506-1.952 2.635-6.34.259-8.586-.682-.647-.882.07-1.27.329-2.565 1.6-5.164 2.858-8.223 3.517-5.493 1.141-11.056 1.6-16.608 2.211-1.694.2-3.647 1.753-5.105-.552 0-.036-.518.07-.588.2-.883 1.823-2.506.905-3.612.752-3.246-.482-6.469-.329-9.692-.352-7.61 0-15.209.552-22.725-1.047-1.718-.353-1.435.458-1.2 1.364.553 2.282 3.446 4.517 5.787 4.493 13.621-.258 27.278.553 40.828-1.529 6.305-.941 12.61-.07 18.914-.094l-.035-.035.024-.024Zm23.337-258.625c.258-1.658-1.106-.776-1.694-1.07-1.4-.623-2.858.2-4.293-.165-.777-.2-1.588-.353-1.824-1.235-.2-.847.33-1.435 1.035-1.917 1.141-.776 2.212-1.73 3.412-2.376 1.235-.682 1.364-1.6.882-2.635-.33-.682-.2-1.364-.388-2.011-.389-1.141-.389-2.306.647-2.894 1.07-.623 1.787.482 2.47 1.141 1.399 1.306 2.67 1.953 4.164.094.517-.647 1.294-1.07 1.976-1.6.753-.552 1.435-.623 2.305-.094.883.518.847 1.106.753 1.953a4.99 4.99 0 0 1-1.106 2.705c-1.846 2.247-.458 3.682 1.036 5.176.882.847 2.082 1.459 2.305 2.835.259 1.729-1.176 1.917-2.247 2.411-.129.07-1.693.224-1.435-.259-2.317-.388-3.905.47-4.752 2.564-.129.295-.259.553-.388.847-.423.883-.717 1.306.812 1.4 3.246.259 6.375-.2 9.551-.647 1.529-.2 2.541-.647 3.152-1.882.977-1.952 1.624-4 1.588-6.21 0-.553-.035-1.012-.611-1.365-5.164-3.388-7.834-8.293-8.646-14.574-1.07 2.835-3.646 2.082-5.493 2.835-3.188 1.27-6.564-.847-9.951.623-2.859 1.27-4.482 2.965-3.929 6.023.329 1.823 1.07 3.576 1.165 5.399.164 2.8 2.764 4.917 2.011 7.87-.094.329.165.752.459.681 2.599-.682 4.846 1.729 7.704.847-1.529-.847-.906-3.117-.717-4.422l.047-.048Zm51.167 1.73c.906.07 1.882.458 2.729-.294 3.67-3.259 4.776-8.681 2.67-13.116-.294-.623-.588-1.27-.882-1.882-.329-.682-.647-1.658-1.435-1.623-.459 0-.976.847-1.364 1.4-1.883 2.6-4.223 4.681-6.693 6.763-2.859 2.435-6.117 3.835-9.622 4.364-2.6.388-5.293 1.141-8.058-.035-1.493-.647-3.352-.977-5.105-.682-1.141.2-2.764.329-2.693 1.658.094 1.953-1.071 3.87-.188 5.787.423.883 1.235.33 1.846.094 4.646-1.529 9.493-1.4 14.304-1.529 1.035 0 1.788 1.012 2.764.624 3.799-1.6 7.893-.647 11.762-1.53h-.035Zm-105.746 17.632c1.329-.624 3.023-.094 4.611-.718 1.659-.623 2.506-1.035 1.988-3.187-.647-2.765-.329-5.858.612-8.423.776-2.152-.259-1.882-1.365-2.046-2.988-.424-6.046-.553-8.998-1.2-1.624-.353-2.082.07-2.118 1.494-.094 2.599-1.105 4.881-2.399 7.093-.459.776-1.365 1.599-1.071 2.564.494 1.564 2.118 2.435 3.247 3.317 1.27 1.012 3.505.753 5.493 1.07v.036Zm13.68 14.115c-.882 1.823-.2 3.834-.882 5.305-.976 2.117.223 2.858 1.4 3.776 3.246 2.564 6.563 5.105 10.268 7.057.518.259 1.2.353 1.365 1.106.482 2.176 2.47 2.894 3.999 4.07 1.529 1.176 1.753 0 1.788-1.012.035-3.54-.035-7.093-.129-10.669 0-.364-.036-1.105-.624-1.07-1.235.094-1.2-.623-1.105-1.458.094-.883-.847-1.33-1.106-1.2-.753.388-1.823-.753-2.082.129-.847 2.635-2.141.388-3.188.353-.353 0-.753-.647-1.305-.847-3.153-1.141-5.846-2.988-8.422-5.634v.094h.023ZM23.349 199.613c-2.211-.223-6.34 4-6.14 6.599.2 2.764-.682 5.14-1.988 7.387-1.364 2.376-2.6 4.811-3.094 7.446-1.305 7.516-4.034 14.644-5.493 22.125-.905 4.717-1.882 9.363-1.752 14.186.035 1.882.717 3.023 2.764 3.352-.294-1.858-.623-3.575-.459-5.434.353-3.87 1.07-7.681 1.106-11.586.035-2.47.223-5.011 1.458-7.222 2.67-4.917 3.706-10.375 5.564-15.586 1.07-2.964 1.012-6.211 2.564-8.975 1.27-2.211 1.883-4.681 2.435-7.093.483-2.117 1.459-3.775 3.023-5.175v-.035l.012.011Zm214.374-81.432c-1.729-.459-1.364-1.882-1.27-3.023.258-2.859-1.012-5.952 1.141-8.587.329-.424.423-1.176-.294-1.623-.483 1.141-2.212.423-2.506 1.399-.459 1.494-1.788 1.788-2.729 2.635-1.305 1.177-4.07.977-4.164 2.835-.094 1.882 2.306 2.929 3.517 4.423 1.165 1.458 2.929 2.435 4.941 2.635.552.07 1.105 0 1.364-.718v.035-.011Zm31.3 259.236c-.552.647-1.141 1.235-1.588 1.882-1.987 2.764-1.293 4.494 1.882 5.599 1.659.588 3.153-.329 4.741-.035 2.011.353 2.564-.882 2.635-2.564.07-1.306-.612-2.341-1.33-3.388-.882-1.235-1.823-1.494-2.693-.165-.777 1.141-1.4.589-2.082.036-.553-.459-1.035-.941-1.529-1.4l-.036.035Zm-120.955 6.54c0-2.411-3.799-4.846-5.975-3.811-.294.165-.624.424-.388.682 1.988 2.118-.389 2.506-1.365 3.447-1.2 1.176-1.141 3.352.2 4.129 3.023 1.729 7.505-.906 7.505-4.459h.035l-.012.012Zm2.859-7.61c3.117 3.999 1.564 8.234 1.105 12.456 4.258-5.469 3.835-11.162-1.105-12.456Zm113.556-316.65c0-1.106-1.717-3.223-2.529-2.858-1.012.458-2.435.811-2.635 2.281-.094.753 2.729 3.682 3.376 3.447 1.2-.482 1.753-1.53 1.788-2.858v-.012Zm16.679 319.59c.589-2.47 1.012-4.752-.129-6.41-.847-1.2-2.635-.259-4.093.482 1.752 1.694 3.317 3.317 4.222 5.917v.011Z" fill="#010101"/></g><defs><linearGradient id="b" x1="75.246" y1="337.316" x2="314.615" y2="337.316" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="c" x1="240.452" y1=".012" x2="332.577" y2=".012" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h336.411v400H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mr-mobilecrosspromo.svg b/browser/components/aboutwelcome/assets/mr-mobilecrosspromo.svg
new file mode 100644
index 0000000000..d613d4bdca
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-mobilecrosspromo.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="329" height="400" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="m23.505 208.196-4.355-6.762 4.355-3.862 9.18 1.936 9.67 4.344-2.899-8.698-.963-4.836h7.736l6.28 4.836 2.899-1.444.481-5.318 2.418-3.862 3.381 3.862 5.799 4.836 3.862-5.798 3.38-3.863 7.254-2.899 2.418 2.899 3.862 2.9 2.418-3.863 8.217-1.936 1.444 1.936-1.444 7.736-2.418 7.242 7.254-4.343 10.634-.963-.963 8.217-3.862 7.735-11.597 11.597 9.179 10.624.963 9.66-13.534-2.417v-2.418h-3.862l-6.28-2.9-.963 12.561-3.862 10.623-9.672-7.735v-8.698l-9.671 7.243-2.9-11.116-7.253 4.836-15.952 6.28 4.354-14.015 5.8-10.634-5.8-1.937-6.761-5.799.963-2.417-9.18-3.381-.01.011Z" fill="url(#b)"/><path d="m139.79 298.2 4.632-6.173 5.146-1.027 8.228 4.632 16.465 2.568 16.979 2.054 16.465 4.633 9.254 8.227 6.173 7.714 1.027 9.254 2.568-3.092 5.659-2.054 2.568 2.054 1.027 6.687-3.595 6.173-2.054 10.292-9.254 11.833-6.173 1.027v-5.66l-11.833 6.687v-6.687l5.66-4.632-1.027-2.568 2.567-4.633-8.227-5.659-3.081 11.833-4.633 5.659-18.005 12.346-2.054-2.054 2.054-5.659-11.319 2.054-7.201-1.027-1.027-3.606 3.606-2.054 10.805-3.081-3.594-4.119 3.594-3.595 12.347 1.541 5.659-8.227-8.741 2.567-9.254-2.567-10.806-6.174 4.633 9.779-4.633 3.092-8.227-1.027-15.941 7.2-3.081-2.568 3.081-3.594-1.54-4.119H128l6.687-2.568 13.373-1.541 8.741-6.686-7.2-8.741-18.006-14.4v-5.66l8.227-4.632-.032-.022Z" fill="url(#c)"/><path d="m183.01 41.256-1.54-3.766 4.868-3.135 3.134 4.333-1.112 2.654-5.35-.086Z" fill="url(#d)"/><path d="m186.477 25.795-3.702-2.739-1.07-.021 3.274-3.691 4.814.075 1.519 5.37-4.835.995v.011Z" fill="url(#e)"/><path d="m170.515 20.178-3.681-3.809h-.535l4.355-4.215 6.43-.963-.129 7.49-6.44 1.497Z" fill="url(#f)"/><path d="m163.796 38.796 2.567 6.462-6.462 2.567-.941-8.034 1.658-3.178 3.178 2.194v-.011Z" fill="url(#g)"/><path d="m150.893 42.335 4.184 5.948-3.777 2.076-3.199-.589.096-5.884 2.696-1.562v.01Z" fill="url(#h)"/><path d="m287.012 235.914-9.212-4.034v-2.3l3.456-1.722-2.3-7.489 10.934 4.033 1.722-9.789 5.756 9.789 4.023-5.756 5.178-6.334h3.456l-7.479 10.945h7.479l5.755 3.456-9.211 8.056-9.212 1.155h-10.356l.011-.01Z" fill="#F37783"/><path d="M292.265 220.002c.62-2.824.374-5.628 2.621-7.992 2.354 1.551 2.6 4.461 4.44 6.644 3.156-3.691 6.045-7.66 10.474-9.886 1.69-.845 3.595-2.428 5.36-.813 1.669 1.53-.235 3.253-.663 4.868-.225.835-.642 1.701-1.209 2.354-2.643 3.06-1.905 3.969 1.925 5.349 4.13 1.487 7.639 4.708 11.598 6.954 3.616 2.065 2.343 7.874-2.054 10.603-6.131 3.808-13.031 5.467-20.082 6.504-3.487.514-6.997.803-11.041 1.263 3.274 4.279 7.885 6.697 9.79 11.779 4.279 11.405 1.829 21.804-7.875 29.122-12.72 9.586-27.27 12.217-42.762 10.837-7.478-.663-14.646-2.599-21.258-6.301-4.922-2.75-8.805-6.473-11.287-11.651-1.637-3.423-1.466-5.67 2.45-7.564 8.387-4.044 16.54-8.559 24.681-12.838-5.948 0-11.886.15-17.813-.075-2.632-.096-6.43.899-7.264-2.632-.738-3.145 1.048-6.045 3.905-8.099 9.104-6.547 19.643-8.666 30.416-10.078 1.391-.182 2.814-.182 4.247-.267-1.904-8.121-1.262-9.33 6.88-11.459 3.915-1.027 7.97-1.519 11.95-2.332 1.241-.257 3.434 0 2.803-2.161-1.969-6.815 2.6-3.852 5.221-3.552 1.38.161 2.696.813 4.525 1.402l.022.021Zm-68.161 36.365c10.752-.728 21.504-1.488 32.267-2.14 1.615-.096 4.098-1.209 4.633 1.059.492 2.054-2.097 2.557-3.574 3.306-9.939 5.039-19.996 9.821-29.838 15.031-2.119 1.124-6.484.129-6.013 4.087.321 2.686 2.696 4.868 4.996 6.666 3.242 2.535 6.698 4.707 10.571 6.034 15.598 5.349 31.079 4.782 46.025-2.14 8.687-4.023 16.048-9.736 19.3-19.45.589-1.755 1.316-3.21.268-4.975-3.755-6.323-8.163-11.843-14.903-15.438-12.443-6.633-25.431-6.665-38.794-4.322-9.361 1.647-17.877 5.06-24.949 12.26l.011.022Zm64.202-13.438c8.966-1.102 17.332-1.262 25.367-3.595 4.076-1.187 8.067-2.664 11.351-5.477 1.134-.974 2.803-2.151.653-3.766-2.204-1.659-5.221-3.221-7.297-1.562-5.67 4.525-12.132 5.627-18.968 6.783-7.04 1.187-13.994.941-19.215-3.392-4.74-3.937-8.859-3.231-13.534-1.733-1.958.631-5.478.385-5.018 3.541.439 3.028 3.221 4.472 6.355 4.537 6.077.139 11.887 1.54 17.525 3.733 1.145.45 2.332.781 2.771.931h.01Zm14.914-19.086c1.733-4.419 6.591-6.505 7.521-11.865-3.958 2.653-5.841 6.184-8.558 8.912-2.001 2.001-3.713 2.921-4.569-.963-.192-.888-.417-2.075-1.605-2.493-.802 2.268-1.604 4.526-2.417 6.794-2.889-1.412-5.125-3.68-8.121-2.867-1.198 3.487 6.633 5.285 1.188 9.029 6.408 4.012 13.17 2.964 19.931.963 3.017-.898 6.302-1.369 8.645-3.755 1.07-1.091 2.632-2.504 1.958-3.959-.407-.877-2.45-1.134-3.809-1.39-3.381-.621-6.441 1.39-10.164 1.583v.011ZM89.858 183.125v-4.953c1.85 2.589 3.423 2.503 5.67 1.562 7.628-3.21 9.575-1.519 8.43 6.783-.235 1.712-.502 3.413-.802 5.445 3.702-.888 6.911-1.69 10.271-1.733 2.557-.032 5.017-.481 5.681 3.103.374 2.054 2.589 1.444 3.98 1.947 7.585 2.717 13.245 7.446 15.812 15.278 2.119 6.429 1.423 7.435-5.06 8.109-1.562.161-3.135.214-5.232.353 2.29 2.108 4.868 1.798 6.976 2.696 1.369.578 3.573-.385 4.065 1.755.524 2.3-1.305 3.509-2.824 4.718-6.944 5.531-13.759 6.933-24.158 4.996-1.187 1.091-.759 2.579.075 3.242 3.413 2.707 2.974 6.291 2.257 9.725-.609 2.921.268 3.798 3.071 3.916 3.028.117 5.852.898 8.377 2.888 4.344 3.424 4.365 5.285-.332 8.292-1.016.652-2.065 1.241-3.562 2.139 1.23.332 1.872.514 2.514.696 3.669 1.038 7.842 2.161 7.296 6.911-.503 4.419-4.675 5.456-8.441 5.874-9.211 1.027-18.177.941-24.617-7.393-1.081-1.402-2.397-2.011-4.173-1.551-6.12 1.583-12.25 3.145-19.011 4.878 10.623 2.75 19.664 6.74 22.06 18.145 1.67 7.949-3.402 12.56-8.901 17.332-9.65 8.366-18.444 5.552-27.25-1.07-1.294 1.637.022 2.514.407 3.498 1.423 3.681 3.145 7.5-.085 10.934-3.338 3.563-6.869 6.034-12.635 4.365-4.783-1.39-10.186-.353-15.053-2.396-7.265-3.06-13.256-7.607-16.605-14.903-3.413-7.447-.16-16.69 7.586-22.339 6.9-5.028 14.485-8.837 22.51-12.111-6.987-1.048-13.93-1.573-20.724-3.06-5.905-1.294-11.618-2.995-16.722-6.451-3.316-2.247-5.05-5.552-6.173-9.072-.952-2.985.428-6.441 3.22-7.072 4.986-1.123 7.04-5.617 12.261-8.099-6.451-1.605-11.672-3.092-16.979-4.172-3.819-.771-3.52-2.568-1.99-5.2 4.89-8.452 12.315-14.507 19.632-20.595 1.99-1.658 3.938-2.289 1.017-4.868-1.68-1.487-3.381-3.669-2.054-6.119 1.401-2.579 4.097-3.103 6.911-3.092 5.21.021 9.907 2.225 14.807 3.616.792-4.183-3.852-9.233 1.626-12.047 4.322-2.225 10.581.064 12.004 3.37 2.503-7.325 7.446-7.963 14.828-1.915 9.468-11.404 14.336-13.212 20.028-6.376l.01.021Zm-27.153 34.257c-3.381-.567-6.355-2.172-9.255-3.819-5.167-2.942-10.11-2.14-15.406.364 5.018 5.456 10.827 7.499 17.781 5.788 2.386-.589 4.665-1.584 6.997-2.397-.17 2.118 2.686 3.146 1.316 6.12-2.9 6.269-2.61 12.999-.749 19.664 6.74-2.632 11.705-10.838 10.838-17.728-.556-4.354-1.894-7.842-7.371-7.253-1.38.149-2.857.139-4.162-.739h.01Zm-4.451 21.761c-5.734 2.568-10.688 6.131-16.487 7.735-2.054.567-4.193 2.782-6.333.61-2.193-2.225-.556-4.75.235-6.986 2.13-6.002 5.05-11.64 8.987-16.754-4.9-2.889-9.746-5.135-12.496-10.581-1.241-2.471-5.585-3.466-7.617-.192-1.83 2.931-4.408 4.375-7.008 6.13-3.584 2.418-6.29 5.488-8.003 9.639-1.337 3.231-.342 4.504 2.536 5.467a45.476 45.476 0 0 0 9.319 2.076c1.68.192 3.733.406 4.311 2.514.6 2.161-1.06 3.145-2.546 4.172-3.948 2.739-7.586 5.853-10.956 9.276-1.176 1.198-1.465 2.065-1.22 4.226.61 5.456 4.505 7.04 8.175 8.163 24.756 7.628 49.534 6.398 74.227-.631 1.326-.375 2.29-.824 2.524-2.29.942-6.055 5.606-8.312 10.571-9.949 4.418-1.455 4.814-5.35 4.579-8.559-.257-3.563-3.659-.771-5.564-1.327-.663-.192-1.401-.139-2.107-.235-2.6-.375-6.815-.535-6.387-3.253.502-3.177 4.087-.449 6.323-.502 1.861-.043 5.253 1.102 4.472-2.354-1.338-5.938-4.023-11.373-10.079-14.101 1.338 2.471 3.178 4.59 4.622 6.954 2.921 4.772 1.723 7.339-3.84 7.757-3.103.235-6.27-.418-9.565-.685-.364 3.017-.589 6.184-1.177 9.265-.6 3.124-1.433 6.227-2.418 9.254-1.166 3.574-3.306 4.408-6.344 1.755-2.696-2.354-5.606-4.761-6.601-8.195-1.124-3.873-2.472-3.167-5.018-1.412-4.771 3.273-6.815 2.428-8.27-3.06-.31-1.166-.492-2.365-.813-3.927h-.032Zm-9.137 82.433c1.06-.085 2.108-.235 3.167-.257 7.553-.149 9.169-2.621 6.312-9.65-1.765-4.343-4.846-7.831-7.414-11.651-.824-1.23-2.717-2.332-1.187-4.086 1.626-1.862 2.856.096 4.076.834 6.044 3.67 11.266 8.623 18.006 11.212 8.676 3.338 21.097-4.162 22.156-13.491.803-7.029-4.044-13.234-13.758-15.802-20.338-5.37-38.686-.577-54.552 12.903-7.307 6.205-6.805 15.395.289 21.879 6.472 5.916 14.058 8.783 22.895 8.088l.01.021Zm83.642-95.999c-3.905-1.508-7.35-2.45-10.164-4.664-1.144-.899-2.289-1.798-1.936-3.488.364-1.765 1.958-2.033 3.295-2.193 2.996-.342 6.013-.503 9.03-.567 2.043-.043 3.167-.589 2.204-2.803-2.664-6.163-7.115-10.485-13.448-12.71-1.488-.524-3.392-.888-3.873 1.38-1.498 7.05-6.409 11.704-11.212 16.454-.888.878-1.381 1.402-.45 3.017 6.74 11.555 14.294 13.406 26.554 5.564v.01Zm-7.179 31.508c-3.862-2.803-7.564-4.023-11.65-2.279-1.445.621-2.675.631-4.055.3-5.136-1.231-10.849 4.386-9.586 9.372 1.262 4.985 4.868 6.89 9.522 7.681 5.927 1.006 11.971 2.579 17.535-.759 2.278-1.37-.075-2.311-1.252-2.643-2.707-.759-5.488-1.241-8.238-1.861-1.252-.279-2.45-.771-2.696-2.172-.257-1.445.824-2.311 1.883-2.921 2.696-1.573 5.456-3.017 8.548-4.707l-.011-.011Zm-64.148-69.584c-3.499 2.739.802 7.2-2.515 9.747 1.338 1.69 3.66 1.219 5.232 2.364 1.573 1.134 3.477 2.065 4.536 3.573 1.883 2.686 2.686 2.172 4.986.097 6.301-5.649 13.587-9.34 22.542-8.559 3.049.267 2.546-3.049 2.867-4.59.481-2.332 2.375-4.975.182-7.297-.321-.342-1.937.396-2.878.792-3.017 1.273-4.14 4.194-5.83 6.655-1.007 1.476-1.99 4.065-4.398 2.642-1.894-1.123-.407-2.92.45-4.151 1.486-2.118-.407-3.199-1.199-4.589-.995-1.755-2.46-.942-3.712-.407-4.034 1.744-6.27 4.397-4.248 9.522 1.284-1.808 2.3-3.402 3.499-4.857.535-.653 1.433-1.188 2.364-.749.364.171.824.941.717 1.219-1.134 2.728-1.209 5.799-4.857 7.372-2.086.898-5.713-1.498-6.505 2.706-.128.674-1.594.182-2.065-.716-2.236-4.269-7.253-6.088-9.158-10.763l-.01-.011Zm-2.44 35.616c-4.76 1.84-10.42.053-13.512 6.002-2.332 4.482-5.2 8.591-6.056 14.817 8.88-5.456 21.344-5.809 19.568-20.83v.011Zm22.542 28.993c4.804-12.763 4.044-19.161-2.76-23.173-.717 2.182-1.252 4.408-2.172 6.462-3.177 7.146-2.129 11.094 4.932 16.7v.011Zm14.08-47.898c3.23.428 5.755-1.187 8.516-1.54 5.36-.685 2.942 3.926 4.247 6.397 3.071-2.086 4.183-5.22 5.242-8.355.664-1.958 1.958-4.59.706-5.906-1.583-1.669-4.3-.171-6.547.129-3.22.428-4.868 4.482-7.585 4.3-4.044-.267-4.387 1.68-4.58 4.965v.01Zm-15.32 19.258c5.092 6.023 10.666 9.19 18.465 8.002-1.22-4.985-5.403-7.617-8.174-10.966-.856-1.027-6.258 1.723-10.292 2.964Zm-27.475-22.478c1.573 6.13 5.467 9.276 9.971 11.854 1.455.835 3.178 2.45 4.772.877 1.647-1.615.61-3.883-.246-5.477-2.846-5.318-8.1-6.377-14.508-7.254h.011Zm-28.533-.128c2.91 7.638 13.726 10.506 21.376 5.467-7.05-2.878-13.566-6.323-21.376-5.467Zm68.61 17.759c3.787-1.102 6.141-3.231 8.302-5.52 1.295-1.37 3.231-3.156 2.161-5.028-1.059-1.851-3.156-.075-4.803.074-1.402.129-2.814.482-4.183-.203-.75-.374-1.37-.128-1.809.535-.577.845.129 1.348.675 1.68 4.108 2.546 1.208 5.103-.343 8.473v-.011Zm-12.303-15.62c-4.74 2.632-7.265 5.938-7.917 11.095 6.73-2.418 8.462-4.836 7.917-11.095Zm-31.572.995c-.78-3.819-1.091-7.457 5.028-7.649-3.359-2.375-6.333-5.339-8.666-3.713-2.236 1.562.354 5.146 1.028 7.778.31 1.22.513 2.835 2.61 3.584Zm40.997 9.779c-4.226 2.311-9.982-.214-14.229 4.718 6.27 1.434 10.634-.428 14.23-4.718Zm2.172-14.861c-7.318 1.477-8.41 3.317-5.841 9.501 3.477-2.236 5.317-5.307 5.841-9.501Z" fill="#000"/><path d="M242.078 349.834c-1.551-4.6-4.515-8.366-7.896-11.747-.545-.588-.492-.974-.16-1.444 4.707-6.452.973-18.22-8.431-13.866-1.626.792-2.075.653-1.915-1.144.182-1.937-1.102-3.36-1.851-4.579-17.791-24.244-32.406-17.685-57.259-22.756-3.177-1.552-6.74-3.927-10.345-5.232-4.419-.631-10.624-1.123-12.272 4.312-2.321 2.91-6.74 2.546-9.179 5.456.16 1.038-.289 1.551-1.327 1.626-.182.043-.31.118-.224.342.717.878-.835 2.183.513 2.868.407.203.717.406.952-.289.139-.546.546-.043.674.139.428.545.696.182.995-.118 1.466-2.482 3.852-3.702 6.43-4.483 3.884-.813 4.258-5.114 7.532-6.536.342 1.08 1.444 1.529 2.215 2.321 1.102-.524.717.61 1.037.974 1.916 1.851 5.029 2.589 7.147 3.969 2.279.385 4.558.749 6.837 1.145-.065.064-.14.139-.204.182 12.881 4.557 30.01-1.669 39.061 11.501 2.546 2.91 5.499 4.643 9.468 4.033 2.91-.856 3.445 2.642 5.146 4.194.064-.118.064-.268.064-.428.428 0 .289.567.632.652-.043.792-1.102.856-.92-.021-2.996-1.583-8.57 3.252-6.634 6.901.589-.546 1.177-.065 1.755-.043 1.466.385 1.305-.856 1.626-1.626.771-1.584 2.707-1.348 3.723-2.589.225.363.182.77.343 1.059.042-.161.064-.343.085-.492.428 1.957-1.754 4.258.546 5.552 1.808 1.198 3.498-1.177 4.868-2.097 1.423-1.102 3.049-1.262 4.664-1.423 3.766-1.016 2.343 9.897-.813 8.046-.246-.204-.428-.225-.492.203-.182 1.262-.877 2.386-.813 3.745-1.712 3.926-7.96 6.74-12.218 5.231-2.46-1.016-1.936-4.354-2.439-6.515-.043-2.75-4.087-2.643-4.055.064.043 1.038.118 2.075.182 3.135.246.042.514-.043.792 0-.022-.139.064-.065.064.021.118.021.203.086.321.225-2.011.385-3.83-1.53-5.884-1.648-1.648-.289-1.263-1.305-.995-2.215 1.401-5.146-.696-11.115-5.093-13.983-.77.567-.995.225-.952-.567l-.064.022c-.471-.246-1.017-.428-1.284-.952-6.762-2.643-13.983.877-20.413-1.284.407 1.444-.385 1.262-1.262.92-2.162.289-5.211-.631-6.987.267-.117.974-.77.974-1.326.835-1.53-.343-3.071.139-4.622-.118-4.579-.856-8.752-2.867-12.967-4.622-.717-.16-1.305-.952-2.182-.385-.182.086-.139-.342-.161-.513-2.418-3.702-6.761-5.211-9.714-8.367.203 1.017-1.327 0-.364-.406-.877-.589-.877-2.119-2.279-2.161-.588.406-1.305-.45-1.872.203-.92 1.423-.877 3.092.021 4.483 3.766 3.947 8.431 6.74 12.924 9.896.546-.107 1.06-.107 1.263.545.77.792 2.503 1.124 2.236 2.59 1.102.973.813 3.198 2.931 3.22.161 0 .321.021.268.246-.246 1.102.791 1.444 1.326 1.958.567.513.749.952.182 1.38-1.284.973-1.936 2.461-3.049 3.584.086.321.064.567-.321.652-.16.589-1.102.878-1.016.043-.118-.021-.204-.043-.268-.117-.749.16-1.262.855-1.979.77-4.686.31-9.447.043-13.962 1.551-4.536 2.996-9.382 5.82-12.881 10.175-5.659 6.633-9.361 14.657-12.378 22.713-2.236 6.291 6.815 5.702 10.666 5.82.45-.225.878-.717 1.348-.022 3.017-.181 6.088.204 9.062-.385 11.234.268 23.633-2.46 35.381-1.979 3.423-.588-8.367 16.369-9.693 18.059-.995 1.22-.589 3.253.834 3.788 25.891 17.321 100.706-6.965 87.312-44.475l-.011.011Zm-99.647-54.049c-.696-.632-.161-1.124.203-.204-.085.086-.139.161-.203.204Zm14.775.449-.065.064c.204.45-.16.653-.181.139-.065.064-.14.065-.204.065.064-.065.107-.14.161-.204.085.022.16-.021.203-.117.021 0 .064 0 .086.021v.032Zm5.681 2.568c.042-.086.139-.139.246.064-.065-.021-.161-.043-.246-.064Zm45.907 53.15c.204-1.176 2.119.311 2.097-1.176.043-.653.385-1.488-.545-2.012-.471-.246-1.487-.717-.995-1.241.749-.791 1.401-2.3 3.092-1.348.877.61 1.262 1.38 2.546.407.321 1.915 1.754 1.219 2.931 1.284 3.092.267 5.318-.995 8.121-2.418-2.386 5.21-5.232 9.917-10.603 12.335 1.712-2.033 1.102-5.884-1.893-4.536-3.296 2.161-6.045 3.766-10.079 4.536 1.081-2.054 2.707-2.91 4.012-4.055.61-.492 1.605-.588 1.306-1.786l.01.01Zm-24.425-27.762c10.036-2.076 18.306 3.765 14.347 14.346-.289 2.183-3.07 4.355-.813 6.387-2.364-.855-1.551 1.755-1.936 3.338.021.567-.289.653-.567.717-7.65 3.627-10.849 12.625-19.301 15.588.61-2.867 4.194-3.969 2.75-6.986-.631 0-.77-.492-.995-.952-6.387.588-13.234 4.985-19.397 1.348l-.021.021s-.043 0-.064-.021c-.343.289-.653.652-1.038.856-.342.182.225.749-.342.631-1.53-.952.321-2.011 1.423-1.509.021 0 .021.022.042.022 2.707-2.953 20.028-1.787 16.305-7.981-1.669-.022-2.707-1.348-4.108-1.915-.385-.182-.631-.386-.653-.835 2.504-2.3 13.288 3.745 15.224-.182 6.58-11.255 11.437-13.106-1.829-22.306-.31 0-.61-.065-.835-.567h1.808Zm-20.477 36.439c-.117.182-.267.31-.513.61-.043-.364-.118-.546-.118-.749-.021-.546.952-.364.631.139Zm-1.123-34.032c3.316-.182 8.837 2.097 10.688-1.605.182-.631.545-.589 1.08-.203 2.343 1.99 15.492 7.211 12.561 10.666-7.842 4.579-17.3-.471-24.126-4.707-1.123-.492-.513-1.915-2.14-1.851-2.343-.813-3.808-2.461-5.777-4.108 2.728.652 5.189 1.444 7.714 1.808Zm-22.799 13.78c-.652-.311-1.348-.546-1.979-1.177.952-.246 1.733-.525 2.568-.45.363-.567.674-.117 1.016.022 2.953-.631 6.836.588 9.265-1.327-.77-.021-1.348-.139-.61-1.038.118-.856.567-.674 1.059-.321.813.407-.085.878.022 1.327 1.219-.246 1.915-1.262 2.685-2.054 1.583-1.648 3.648-1.509 5.595-1.808 1.284-.043.674 1.733.792 2.546.407.717.835 1.444.546 2.322.449.385.567.995.995 1.423.406.428 1.262.973.652 1.69-.545.631-1.305 1.102-2.257.834-3.52-.92-7.19-2.642-10.239.118-3.519 2.076-8.098 5.114-12.089 4.579-.289-.567.182-.995.546-1.145 2.3-.92 4.397-3.969 1.444-5.552l-.011.011Zm34.214 56.328c-.085-.471.92-.771.856-.204.043.514-.791.835-.856.204Zm62.716-27.506c-13.737 20.434-56.468 34.385-78.207 22.049 3.584-5.948 7.649-12.335 10.688-18.711 2.642-5.574-6.27-4.291-9.383-4.291-16.101-.021-32.085 3.296-48.187 2.012-2.524-.471 2.771-6.858 2.996-8.677 3.563-6.633 8.077-16.593 15.984-18.016.545-.546.973-.043 1.444.139.952-.813 2.118-.717 3.295-.77-6.654 8.976 3.178 9.607 9.875 6.494-.043-.471-.749-.814-.225-1.348.835-.386.567.674.567 1.123 3.274-.589 5.521-4.033 8.688-4.173 3.584 1.038 8.099 2.814 10.827-.834 3.52-1.936 1.198-5.435-.771-7.575 6.045 2.91 12.111 5.553 19.119 4.44-.343.974-1.177 1.733-1.059 2.846-5.114 1.284-11.073-3.252-15.941.385-2.14 1.38-1.263 4.986.631 6.312.267.268 1.059-.117.899.61-3.135 1.445-17.546 1.894-13.17 8.003.545.492-.653.695.021 1.348.974.952 2.14 1.466 3.295 1.787 4.986 1.872 9.715.288 14.657-.428-1.037 1.102-.695 2.503-.631 3.701 1.423 5.66 8.548.717 11.683-.952-.086-.856.118-1.262.995-.653.182-.524 1.102-.609.792-1.401-.204-.514.117-.567.449-.407.364.161.546.14.792-.181 1.262-1.627 3.156-2.643 4.194-4.462-.546.118-1.017.064-.953-.631.204-.877 1.306-.225 1.851-.064.856-1.808 2.953-2.568 3.948-4.13.182-.567.492-.674.974-.364 4.033-.716 2.589-6.676 4.44-9.607.203-.631.492-.546.952-.407 1.53.022 2.813 1.851 4.279 1.199.118-.61.589-.92.974-.492.363.385-.343.588-.61.877-1.648 1.605-2.91 3.359-1.979 5.841-.878 2.161-4.109 3.445-5.189 5.885-3.381 5.188 1.284 6.986 5.659 5.798 9.287-3.83 8.388 6.387 18.242-5.092 3.402-4.173 7.061-9.287 7.67-14.369.61-.385 1.124.086 1.402.407 6.291 7.168 9.468 18.22 4.033 26.789l-.01-.01Z" fill="#030303"/><path d="M160.715 301.445c-.535-.685-1.551-.792-1.894-1.605-.043-.043-.064-.107-.085-.16-.289.021-.557-.022-.792-.182h-.021a2.176 2.176 0 0 1-.407-.364c-2.675-.642-4.13.61-6.473 1.402-2.599.823-3.124 4.012-3.177 6.312-.118 4.108 6.387 7.692 10.099 5.82 3.691-2.151 5.339-7.821 2.75-11.234v.011Zm-5.232 7.575c-2.129-.011-4.044-.953-3.199-3.606.803.524 1.231 1.68 2.279 1.605.182 1.155.856.899 1.584.588 1.743-.235.395 1.594-.653 1.423l-.011-.01Zm-.92-6.184c1.487.16 2.568.513 3.402 1.958-1.551-.204-2.525-.717-3.402-1.958Z" fill="#030303"/><path d="m82 39.585 9.094-6.42-6.42-2.674 1.605-2.675 15.513-1.604 9.629 3.21h9.094l12.303 5.348 6.42-3.744-22.467-12.303-9.094 1.604-14.443-1.07-2.14-2.674 5.884-2.675-3.21-4.28 1.07-2.139h7.489l-3.21-4.28L100.724 0l10.698 7.489 10.164 2.14 6.954 2.674 15.513 8.024 6.954-1.07h6.419l12.304-6.954h13.908l11.768 4.28 12.839 11.768 13.908 1.605 9.629 13.373-2.14 4.815 3.744 9.094h9.629l1.07 2.674-4.279 3.745 6.419 9.629-9.629-5.35-1.605 6.42-5.349-6.955-3.21-6.419-5.349-5.884-5.349 3.21H201.29l2.139 8.558 7.489 4.28 10.164 1.07 10.164 7.489-6.954 2.674 1.604 6.954-10.163-4.814-17.118-5.884-3.21-6.42-4.814-17.117-18.723-3.21-9.628-5.884-21.398 1.07h-9.093l-18.188-7.49-12.838-3.744-9.63 10.699-1.604-4.814H82v-2.14Z" fill="#F8F6F4"/><path d="m183.909 42.065-1.54-3.766 4.868-3.135 3.134 4.333-1.112 2.653-5.35-.085Z" fill="url(#i)"/><path d="m187.376 26.604-3.702-2.74-1.07-.02 3.274-3.692 4.814.075 1.519 5.37-4.835.996v.01Z" fill="url(#j)"/><path d="m171.414 20.987-3.681-3.809h-.535l4.355-4.215 6.429-.963-.128 7.489-6.44 1.498Z" fill="url(#k)"/><path d="m164.695 39.604 2.567 6.462-6.462 2.568-.941-8.035 1.658-3.177 3.178 2.193v-.01Z" fill="url(#l)"/><path d="m151.792 43.144 4.184 5.948-3.777 2.075L149 50.58l.096-5.884 2.696-1.562v.01Z" fill="url(#m)"/><path d="M204.879 36.256c-3.028-.332-5.21 1.37-5.371 4.258-.021.385.086.792.139 1.198.514.396.524.417-.289.77 0 1.509.632 2.803 1.359 4.098 1.712 3.156 5.018 3.68 7.543 1.091-.674-.834.609-.417.545-.856.032-.235-.192-.534.118-.727 0-.46-.182-1.027.567-1.113.899-.78.749-2.022.781-2.899.107-3.285-2.065-5.456-5.392-5.81v-.01Zm.096 4.611c-.503-.107-1.38-.31-1.786.481v.065h-.022c.15.428.417.813.096 1.284h.032l-.021.02c.118.514.696.846.471 1.456.139.064.267.128.385.203.3.16.588.343.578.75 0 .063-.118.17-.171.192-.471.117-.493-.386-.749-.557-.118-.096-.161-.32-.225-.503 0-.535-1.423-.834-.278-1.55v-.022c-.375-.407-.942-.803-.107-1.284v-.022s0-.032.021-.053c-.139-2.6 1.851-1.123 2.985-1.498-.096.792-.171 1.263-1.198 1.027l-.011.011ZM191.088 39.057c-1.22-2.322-3.081-3.809-5.841-3.937-1.562-.075-4.751 1.412-5.221 2.6-.749 1.84.866 6.547 2.642 7.489 2.108 1.123 4.333 1.316 6.837.524.845-.503 1.947-1.113 2.321-2.247.503-1.53-.043-3.081-.738-4.429Zm-3.648 3.445c-1.551.642-2.472-.332-3.381-1.145-.61-.524-.524-1.305-.107-2.011.139-.246.214-.546.578-.578.845-.053 3.359 1.37 3.616 2.193.257.728.417 1.541-.706 1.541ZM187.9 18.859c-2.118.043-3.231 1.187-4.29 2.653.235.428.118.76-.257 1.027.139.706-1.401 1.134-.353 2.012-.374.513.375.438.46.855.257 1.616 1.273 2.782 2.771 3.51 1.166 1.101 5.028 2.01 5.981.93.856-.92 2.46-1.358 2.535-2.696.097-1.433.064-2.974-.513-4.397-.995-2.514-3.638-3.937-6.334-3.905v.01Zm3.06 7.767c-.203.556-.161 1.252-.974.257-.503-.6-1.669-.631-2.546-.92a.929.929 0 0 1-.257.16c-.107.15-.139.364-.214.524 0-.181.097-.342.086-.513-.064 0-.128-.043-.193-.107a.258.258 0 0 0-.053-.16.355.355 0 0 0 .139-.097c.31-.246-.054-.652-.107-.695-.439-.16-.449-.396-.375-.62.054-.172.172-.354.193-.514.984-1.798 2.332-1.894 3.359-.182.525.856 1.413 1.658.953 2.889l-.011-.022Z" fill="#000"/><path d="M243.715 56.41c-1.915-.46-3.862-.299-5.788-.02-1.198.181-2.065-.3-2.429-1.349-.545-1.605-1.102-3.167-2.022-4.6-.385-.578-.567-1.156-.128-1.798.471-.674.92-1.433 1.305-2.107.802-1.327.428-2.333.075-3.434-.92-2.964-2.643-5.467-4.633-7.821-.684-.803-2.054-1.67-1.829-2.472.556-1.882-.214-3.188-1.156-4.46-1.476-2.034-4.129-3.328-6.344-2.611-1.091.363-2.279.92-2.899 2.064-.193.407-.332.653-.867.578-.984-.139-1.936.236-2.888.439-1.188.289-2.525.043-3.274-.696-2.568-2.428-5.563-4.354-7.992-6.964-1.605-1.723-3.413-3.285-5.114-4.911-.374-.556-1.327-.353-1.519-1.156-1.209-.577-2.418-1.166-3.638-1.743-1.551-.739-3.231-1.156-4.825-1.744-1.145-.396-2.493-.321-3.755-.739-.685-.224-1.819-.492-2.343-.331-1.188.353-2.439.214-3.509.192-2.343-.085-4.536.386-6.601 1.284-2.675 1.166-5.232 2.632-7.81 4.002-.674.374-1.487.834-1.755 1.444-.353.813-.984.727-1.444.642-1.53-.3-3.113-.236-4.665-.375-.834-.085-1.54.364-2.332.246-2.589-.331-5.092-.117-7.446 1.092-.278.15-.492.62-.995.192-.685-.61-1.519-1.016-2.247-1.562-2.097-1.637-4.376-2.995-6.729-4.183-1.701-.845-3.456-1.54-5.146-2.364-4.248-2.076-8.688-3.178-13.438-3.167-1.016 0-2.043-.321-3.049-.706-2.375-.877-3.884-3.006-6.12-4.173-1.166-.588-2.385-1.455-3.562-2.16-2.375-1.456-4.183-1.21-6.023.192-.856.663-.247 1.626-.878 2.29-.353.374.428.331.738.449-.32.738.685 1.251.364 1.915-.246.513-.91.214-1.337.32-1.37.397-2.92.3-4.034 1.424 0 .513.835 1.283-.449 1.38-.867 1.776.46 2.813 1.327 4.022.139.193.684.118.46.6-.118.246-.332.32-.6.374-2.182.3-3.337 1.755-4.022 3.712.064.065.107.16.182.246.086.054.139.086.246.14.064 0 .118.02.171.053v.043c.407-.075.375-.503.588-.781.343.396.482.802 0 1.134-.395.267-.438-.107-.567-.353h-.042a.43.43 0 0 1-.257-.075h-.021c-.182.075-.3.246-.46.332.888 2.203 2.824 3.091 4.889 3.498 3.284.663 6.601 1.006 9.885 1.487.236-.353.46-.16.696-.043.064 0 .128.043.192.043 3.007.075 5.949-.278 8.923-.866 1.872-.375 3.755-1.659 5.927.042 1.84 1.423 4.098 2.397 6.12 3.67 1.487.941 3.102 1.733 4.664 2.578 1.819.985 3.67 1.84 5.606 2.536.278.096.845.3.61.856-.364.866-4.269 2.268-5.039 1.669-1.209-.952-2.482-1.808-3.83-2.514-1.444-.739-2.824-1.562-4.386-2.033-2.622-.813-5.296-.77-7.992-.824-.632-.021-1.156.321-1.766.225-2.246-.364-4.354-1.113-6.376-2.13h-.021c-.236.086-.214.664-.653.354-.514-.375.31-.375.225-.631 0-.022-.011-.043-.043-.075-.835.288-1.391-.418-2.097-.589-2.065-.556-4.119-.01-6.184-.246-1.83-.203-3.702-.096-5.542-.021-2.257.085-4.504.481-6.75.845-1.36.235-2.579.888-3.306 1.99-1.498 2.247.128 5.531 2.867 5.841.503.043.856.225.941.45.193.492-.203.738-.663.963-1.562.791-3.028 1.829-4.215 3.113-.62.685-1.113 1.508-1.498 2.44-.396 1.005.289 1.561.406 2.342.257 1.69.739 2.204 2.365 2.407 1.722.214 3.349.043 4.868-.834.31-.182.663-.257.995-.396.139.439.374.802.214 1.37-.3 1.22-.14 2.45.63 3.54.92 1.274 3.189 1.349 4.056.15 2.064-2.845 3.712-5.98 6.023-8.644 1.166-1.348 3.049-2.257 4.686-1.904 2.396.492 4.793 1.358 7.04 2.471.224-.546.567-.332.909-.203.075.021.128.042.203.064.589.107 1.188.203 1.776.31-.075-.396-.096-.77.407-1.123.15.503.471.877.075 1.348.032.075.064.246.107.246 3.092.514 5.852 1.958 8.548 3.36 2.707 1.422 5.392 2.877 8.152 4.236.31-.021.61-.032.899-.032.075-.096.182-.171.267-.246-.599-1.06.332-1.52.867-2.13.032-.235.053-.48.096-.727-1.294-.256-2.129-1.744-3.637-1.294-1.584-2.268-4.323-2.61-6.505-3.884a10.014 10.014 0 0 0-3.916-1.39c-1.059-.161-1.979-.942-3.134-1.252-1.306-.364-2.686-.567-3.97-1.113-.599-.236-1.198-.514-1.808-.76-.353.706-.513.246-.727-.096-3.552-1.241-7.104-2.536-10.784-.374-.097.053-.364-.022-.396.032-.75 1.669-2.675 2.257-3.445 3.905-.321.717-.674 1.615-1.637 1.85-.022 0-.01.033-.01.033-.022 0-.033.032-.022.053.246.385.32.728-.182.995-.01.022-.043.064-.054.086-.117.288.065.866-.502.642-.375-.118.021-.428.17-.642-.181-.578-.277-1.102.546-1.156h.043c-.652-.92.171-1.915.503-2.3 1.284-1.583-.15-2.193-.802-3.092-.493-.203-.91.524-1.445.129.3-.546.717-.739 1.327-.535.46-.514.728-1.145 1.733-.9.781.193 2.011-1.294 1.99-2.128-.032-1.21-1.08-1.98-2.46-2.108-2.697-.267-5.457-.075-8.228-.76.952-.63 1.947-.78 2.889-1.09 1.626-.557 3.295-.364 4.942-.504 1.734-.128 3.52.14 5.232-.117 1.327-.203 2.579.117 3.852.15 1.615.032 2.974 1.059 4.333 1.808 1.765.973 3.637.802 5.488 1.059 3.113.439 6.28.16 9.404 1.123 2.225.706 4.066 2.011 6.12 2.974.064-.513.492-.62.791-.395.268.235-.042.502-.31.642 2.129 2.385 5.852 2.022 8.292-.129 2.557-2.215 4.75-4.814 7.842-6.505 2.492-1.37 4.632-3.509 7.414-4.397 1.38-.417 2.856-.791 4.397-.663 1.787.15 3.627-.236 5.435.15.909.192 1.808.449 2.685.674.471-.546 1.209-.867 1.305-1.723.054-.481-.278-.214-.449-.267-.182.107-.449.289-.567-.022-.053-.139-.021-.235.032-.3.118-.106.3-.149.428-.235v-.866c-1.166-.385-2.332-.803-3.616-1.23 1.498-.664 2.493-2.012 4.044-2.654.695-.31.931-.085 1.252.332.289.364.535.813.727 1.187 1.199 2.204 3.467 2.311 5.424 2.825 2.932.738 6.826-2.632 6.976-5.756 0-.225.193-.45.3-.663-.674-.407-.086-.856-.033-1.284 4.002.235 7.596 1.744 11.148 3.466 3.959 1.958 6.569 5.446 9.747 8.28 2.535 2.27 4.868 5.019 8.409 5.928 1.508.374 3.113.567 4.547.289 1.433-.289 2.739-.107 4.087-.022 1.797.118 3.145 1.605 4.943 1.851.064 0 .62 1.113 1.048 1.701 1.348 1.723 2.75 3.392 3.948 5.21 1.626 2.515 1.273 4.483-1.059 6.377-1.509 1.262-3.092 2.45-4.686 3.616-1.766 1.295-3.306 1.455-5.499.877-1.488-.385-2.804-1.39-4.43-1.262-.214 0-.46-.3-.695-.46-.268-.128-.535-.257-.813-.353-.022 0-.075-.022-.096-.01a.909.909 0 0 0-.257-.086c-.086-.043-.171-.054-.257-.086a5.4 5.4 0 0 0-.728-.118h-.021s-.053-.042-.075-.032l-.16-.075s-.054-.021-.075-.021a.954.954 0 0 0-.236-.032c-.128.085-.31.128-.363.289h-.022c-.01-.097 0-.172.032-.225h.022c.021-.086.053-.118.107-.15-.214-.032-.407-.075-.61-.096v-.021c-.235 0-.439-.022-.653.053-.01.096 0 .182-.01.267-.065 0-.118 0-.182-.02-.064 0-.161 0-.236-.033h-.075c-.021 0-.021-.01-.042 0 .128.171.107.321.021.439a.575.575 0 0 1-.203.182l-.182.064c.032.096.032.16-.032.214-.182.93.374 1.444.941 1.958.086.053.182.139.246.203 2.589 1.423 5.403 2.182 8.228 2.835.363.075.556.203.609.524.065.556-.353.257-.588.3-1.648.31-3.413.428-4.911.888-2.717.802-5.488-.353-8.077.738-.781.32-.589-.588-.674-.845-.931-2.247-2.044-4.397-3.263-6.473-.268-.439-.45-.439-.792-.278-.214.792-.674 1.102-1.466.813-.77-.3-.716.118-.695.674 0 1.263.781 2.215 1.209 3.306 1.006 2.6 2.322 5.05 2.931 7.863.343 1.594-.021 3.028.043 4.526.032 1.412.76 2.14 1.851 2.396 1.209.29 2.247.9 3.317 1.413 1.893.888 3.605 2.15 5.456 3.166.578.332.984 1.145 1.851.835.503-.396 1.038-1.284 1.391.107 1.679.16 3.038-.781 4.579-1.263-.065.578-.129 1.156-.204 1.744.407-.032.674.204.846.706a.507.507 0 0 0 .299.279c1.402.331 2.814.674 4.237.93 1.626.321 3.081.91 4.568 2.097-1.07.353-1.947.225-2.717.054-.664-.171-1.338-.193-1.905-.043-.545.15-.684.203-1.07-.31-.428-.578-2.086.513-2.482 1.605.064.246.257.481-.021.695.299 1.048 1.241 1.68 1.915 2.397.653.706.888 1.572 1.487 2.257.364.406.086.941-.193 1.22-.32.342-.567-.225-.834-.29-2.685-.802-4.547-3.06-7.157-4.033-.707-.235-1.37-.16-2.055-.278-2.225-.374-4.397-.941-6.472-1.83-.631-.288-1.209-.352-1.947-.096-.439.15-.557-.962-1.199-.995-.748-.042-.898-1.102-1.754-.941-.032.096-.032.214-.064.31-.332-.128-.632-.267-.599-.695-2.376-1.498-4.569-3.231-5.35-6.077-.364-1.273-.92-2.482-1.294-3.723-.685-2.247-1.252-4.536-1.958-6.804a44.65 44.65 0 0 0-1.006-2.782c-.332-.813-.406-1.84-.214-2.258.813-1.711-.652-2.236-1.294-3.21-.824.579-1.562.311-2.311-.181-3.071.171-6.034-.578-9.03-1.123-4.472-.824-8.644-2.557-12.721-4.537-.288-.139-.759-.374-.77-.62 0-.332.417-.524.749-.706 1.84-.963 3.809-1.562 5.692-2.322-.097-.139-.311-.428-.278-.46 1.636-1.605.032-2.193-.942-2.985-1.851.236-3.167 1.787-5.018 2.044-.256.16-.502.331-.738.481-.107-.246-.203-.503-.032-.792-.075-2.107-.866-4.076-1.819-5.83-.524-.974-1.647-1.82-2.76-2.59-1.851-1.208-3.028-.395-3.916.739-.813 1.038-1.615 2.279-1.519 3.894.054 1.049.118 2.033.439 3.006.011.043.032.075.021.129.086.481-.289.995.214 1.412.514-.492.995-.267 1.445.118.192.042.406.075.609.139.482-.257.739-.62.525-1.166-.311-.043-.781.053-.471-.503.246-.439.556-.824.813-1.22-.653-.952.588-1.744.246-2.685-.021-.064.31-.556.653-.16.224.256.834-.097.802.577-.075 1.498.835 2.792.824 4.354 0 1.017-.15 1.52-.984 1.862-.717.3-1.466.578-2.258.46-.759.364-1.562.481-2.386.492-.716.428-1.444-.118-2.139-.021-.343.032-.311-.129-.396-.418-.535-2.321-1.819-4.268-3.392-5.959-1.423-1.497-4.236-.845-5.199 1.017-.653 1.251-1.059 2.482-.61 3.947.3.92-.471 1.306-1.53 1.274-1.594-.054-3.338-.129-4.761.438-.663.257-1.466.589-2.15 1.027-.032.032-.043.065-.086.075.129.995.214 2.044 1.712 1.755.342-.054.61.278.738.631 2.108-.075 4.237-.278 6.344-.171 1.199.064 2.472.396 3.617.364 2.054-.054 4.065.3 6.13.107 1.573-.15 3.252-.236 4.686-.589 1.273-.31 2.15-.513 3.177.236.353.181.706.353 1.027.524.386.599 1.316.331 1.573.663 1.198 1.573 3.178 1.616 4.718 2.471 2.728 1.488 5.82 2.13 8.827 2.89 2.193.534 4.397 1.048 6.718 1.005 2.964-.043 3.723.599 4.205 2.963-.171.664.011 1.241.406 1.776.129 1.445 1.06 2.675 1.049 4.162-.075.289-.043.567.257.728.374 1.048.941 2.096 1.005 3.156.043.674.813.406.749 1.176-.16 2.13.792 4.077 1.701 5.895.888 1.82 2.632 3.05 4.344 4.162a40.44 40.44 0 0 0 7.339 3.723c1.616.61 3.327.92 5.007 1.348 1.444.364 3.113.321 4.301 1.08 1.198.75 2.621 1.295 3.584 2.45.396-.513.631-.16.877.161.995 1.252 2.568 1.359 3.927 1.862.995.364 2.075.513 3.124.717 1.433.278 2.674-.878 2.45-2.333-.193-1.24-.599-2.46-1.273-3.53-.46-.75-.343-1.658-.835-2.418-.31-.45.342-.674.546-.546 1.027.642 1.915-.235 2.899-.224 1.198 0 3.06-1.862 2.931-2.836-.31-2.332-2.022-3.573-3.691-4.771-1.219-.856-2.771-1.177-4.258-1.476-.77-.15-.856-.546-.492-1.006.803-.995.171-1.84-.257-2.6-.502-.845-1.273-1.658-2.332-1.562-2.204.182-4.354.578-6.291 1.819-.588.364-1.219 1.145-2.129.663-.93-.492-1.851-1.038-2.781-1.53-1.98-.995-3.616-2.61-5.863-3.134-.407-.075-1.038-.75-.995-.92.685-1.84-.3-3.542-.364-5.296-.011-.29-.257-.6.203-.696.428-.107.525.278.525.546 0 1.006.502.802 1.251.824.739.021 1.252-.557 2.108-.343 1.123.268 3.028.514 3.424-.053 1.155-1.584 2.31.235 3.327-.417.128-.065.364-.214.567-.268 1.861-.46 3.552-1.476 5.488-1.605l1.519-.535c-.278.717-1.241.578-1.08 1.338.61.963 1.273 1.733 2.065 1.433 1.786 1.926 2.867 4.098 3.648 6.43.802 2.343 2.193 4.387 3.306 6.59.471-.053 1.091-.363.877.578 1.091.888 2.086 1.883 3.488 2.258.385-.043.845-.428 1.048.257 2.022-.204 2.814-1.284 2.91-3.724.022-.32-.406-.834.118-.995.321-.107.653.278.952.418 1.091.502 1.701 2.246 3.37 1.476.268-.118.46.289.278.46-.599.524-.278.46.225.631 1.241.471 2.365.899 3.777.557 1.337-.3 1.893-.824 1.647-2.269-.406-2.663-2.214-4.493-3.84-6.408-.728-.877-1.637-1.605-2.472-2.396.3-.172.535-.386.792-.46 2.172-.653 2.461-2.472 2.6-4.28.117-1.797-1.541-3.37-3.927-3.948l-.053-.01ZM94.512 17.394c-.01-.107.15-.343.235-.332.503.021.482.546.91.877-.632.022-1.07.043-1.156-.545h.01Zm27.388 25.13c.214.108.385.13.417.236.204.439-.299.524-.449.803-.096-.075-.278-.172-.257-.225.065-.268.182-.503.289-.813ZM85.396 37.72c.043-.064.236.032.31.064.161.321-.063.375-.224.439-.096.032-.235-.032-.353-.054.075-.16.15-.342.267-.449Zm5.853-.428c.524-.406 1.112-.396 1.316-.128.438.535-.46.45-.567.738-.578 1.626-2.697 1.423-3.392 2.685-.663 1.284-1.893 1.07-2.803 1.637-.225.171-.492.107-.685-.043-.267-.256 0-.492.129-.642.845-1.059 1.85-1.99 3.102-2.61.974-.524 2.022-.963 2.9-1.626v-.01Zm60.789-15.534c-.075.224-.182.353-.321.406-.139.054-.321.022-.513-.064-1.947 1.22-3.905 2.493-5.895 3.638-1.733 1.016-3.306 2.236-4.761 3.594-.375.332-.695.246-1.059.332-.054.289.16 1.016-.492.417-.3-.278-.311-.888-.46-1.348-.514-.995-1.669-1.187-2.504-1.562-1.412-.61-2.61-1.594-3.948-2.3-3.766-1.98-7.328-4.376-11.051-6.42-1.37-.737-3.103-1.304-4.611-.662-1.081.47-2.162.545-3.231.877-1.926.588-3.841.717-5.82.77-3.456.107-6.901.107-10.228-1.016-.225-.075-.482-.118-.717-.193-.129-.043-.236-.16-.46-.278.963-1.048 2.214-.781 3.36-.941 1.272-.182 2.535.128 3.819-.257 1.102-.343 1.85-1.124 1.594-1.99-.225-.75-.974-1.551-2.183-1.637-2.172-.171-3.883-1.434-5.51-2.942 1.049-.567 2.001-.193 2.985-.097 2.397.247 4.665 1.177 7.104 1.402.856.096.888-.246 1.038-.792-.075-.706-.706-1.369-.15-2.129-.792-.342-.941-1.733-2.204-1.262.086-1.006-1.048-1.027-1.359-1.723-.406.097-.406-.214-.492-.449-.834.032-1.005-.513-1.07-1.316.557.31 1.028.567 1.498.845l.236.471c1.883.246 3.102 1.658 4.375 2.771 2.589 2.247 5.457 3.745 8.859 3.723 4.247 0 8.077 1.22 11.875 2.964 2.461 1.112 4.804 2.396 7.243 3.509.086-.257.182-.503.257-.738-.043-.386-.974-.567-.353-1.006.653-.47.877.267 1.123.717.311 0 .76-.45.781.374 0 .706.236 1.412.353 2.118 1.595 1.038 3.007 2.343 4.59 3.36.835.546 1.958 1.091 3.242.053.984-.813 2.493-.941 3.819-1.144.385-.62.845-.054 1.263-.086.267-.824 1.048-.235 1.615-.899-.356.97-.895 1.27-1.615.899l-.022.01Zm26.501-5.874c-.482 1.08-.771 2.472-1.937 2.686-1.337.449-4.504-1.038-4.868-2.001-.181-.45.225-.482.428-.62 1.605-.942 3.435-1.167 5.189-1.563 1.198-.246 1.391 1.049 1.198 1.488l-.01.01Zm31.539 34.257s.022.01.032.032h-.021s-.075-.01-.086-.032h.075Zm-.674.054h.086v.182a.44.44 0 0 1-.171-.182c.021.01.075.021.096.01l-.011-.01Zm-58.596-4.077c-.482-.16-.407.118-.235.354.181.203.171.428.149.684-.032.653-.716.942-1.048.931-.439-.043-.364-.717-.289-1.123.096-.364.471-.503-.118-.963-.61-.47-.278-1.594-.139-2.354.075-.428.813-.267 1.081.15.353.567.62 1.187.92 1.787-.203.117.717.898-.321.534Zm41.061 15.813s-.075-.085-.107-.118c-.032-.032-.064-.042-.096-.075.043-.064.096-.096.139-.16.011.043.043.053.054.096.042.075.106.16 0 .268l.01-.01Zm54.67 12.806c-.824.246-.824-.31-.856-.856.075.022.204 0 .214.032.086.108.15.236.214.343.257-.086.353-.749.771-.343.374.375-.343.482-.343.814v.01Zm-4.151-13.277c-.866.375-1.754.76-2.493 1.306-.888.695-.888 1.69-.481 2.728.182.47.439.91.781 1.284.374.492 1.433.47 1.07 1.69-.278-.792-1.305-.364-1.445-1.252-.973-.053-1.198-1.177-2.203-1.444-1.53-.417-2.686.15-2.632 1.754.032.9.342 1.723.631 2.557.235.739.342 1.53.588 2.622-1.091-1.06-1.551-2.183-2.749-2.61-.31-.119-.396-1.06-.664-1.616-.962-2.236-1.925-4.505-2.567-6.88-.139-.502-.428-1.155-.856-1.348-1.509-.674-2.375-2.118-3.713-3.006-.941-.642-.888-1.327.033-2.193 1.144-1.049 2.45-1.797 3.637-2.728.556-.439.813-.417 1.166.235.46.792.845 1.573 1.188 2.407 1.626 3.788 1.658 5.018 6.697 4.996.867-.01 1.712-.117 2.578-.203.407-.17.792-.214 1.06.225.663-.129 1.294.139 1.39.727.129.62-.62.578-1.048.75h.032Z" fill="#000"/></g><defs><linearGradient id="h" x1="148.155" y1="46.293" x2="190.938" y2="46.999" gradientUnits="userSpaceOnUse"><stop stop-color="#7662AB"/><stop offset=".52" stop-color="#EE4F9C"/><stop offset="1" stop-color="#FDBD50"/></linearGradient><linearGradient id="b" x1="19.161" y1="218.102" x2="114.379" y2="218.102" gradientUnits="userSpaceOnUse"><stop stop-color="#7662AB"/><stop offset=".52" stop-color="#EE4F9C"/><stop offset="1" stop-color="#FDBD50"/></linearGradient><linearGradient id="d" x1="148.304" y1="37.201" x2="191.088" y2="37.907" gradientUnits="userSpaceOnUse"><stop stop-color="#7662AB"/><stop offset=".52" stop-color="#EE4F9C"/><stop offset="1" stop-color="#FDBD50"/></linearGradient><linearGradient id="e" x1="148.55" y1="21.954" x2="191.345" y2="22.66" gradientUnits="userSpaceOnUse"><stop stop-color="#7662AB"/><stop offset=".52" stop-color="#EE4F9C"/><stop offset="1" stop-color="#FDBD50"/></linearGradient><linearGradient id="f" x1="148.668" y1="15.278" x2="191.452" y2="15.974" gradientUnits="userSpaceOnUse"><stop stop-color="#7662AB"/><stop offset=".52" stop-color="#EE4F9C"/><stop offset="1" stop-color="#FDBD50"/></linearGradient><linearGradient id="g" x1="148.229" y1="42.016" x2="191.013" y2="42.722" gradientUnits="userSpaceOnUse"><stop stop-color="#7662AB"/><stop offset=".52" stop-color="#EE4F9C"/><stop offset="1" stop-color="#FDBD50"/></linearGradient><linearGradient id="c" x1="127.957" y1="330.35" x2="235.981" y2="330.35" gradientUnits="userSpaceOnUse"><stop stop-color="#7662AB"/><stop offset=".52" stop-color="#EE4F9C"/><stop offset="1" stop-color="#FDBD50"/></linearGradient><linearGradient id="i" x1="182.369" y1="35.164" x2="190.371" y2="35.164" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="j" x1="182.604" y1="20.152" x2="192.211" y2="20.152" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="k" x1="167.198" y1="12" x2="177.982" y2="12" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="l" x1="159.859" y1="37.422" x2="167.262" y2="37.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="m" x1="149" y1="43.133" x2="155.976" y2="43.133" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h328.918v400H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mr-pinprivate.svg b/browser/components/aboutwelcome/assets/mr-pinprivate.svg
new file mode 100644
index 0000000000..be3e0c0ba3
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-pinprivate.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="337" height="400" fill="none" xmlns="http://www.w3.org/2000/svg"><g transform="translate(50 0)" clip-path="url(#a)"><g clip-path="url(#b)"><path d="m22.501 88.36 3.293-12.623 1.646-4.939 3.293 14.818h14.818l-8.78 6.037 6.585 12.073-9.879-2.195v13.171l-7.134-7.683-7.683 6.586-1.098-9.33h-9.33l6.586-4.939L7.135 79.03 22.5 88.36Z" fill="url(#c)"/><path d="m82.32 21.406 3.294-4.39 7.134 4.39-4.39 12.623-6.037-12.623Z" fill="url(#d)"/><path d="m204.155 62.017 4.939-8.232 8.781 6.037-3.293 15.367-10.427-13.172Z" fill="url(#e)"/><path d="m234.888 104.275 1.646-2.744 1.647-.549 3.841 2.196-2.195 6.036-4.939-4.939Z" fill="url(#f)"/><g clip-path="url(#g)"><path d="M170.702 157.546c-5.604-4.084-11.872-6.742-18.497-8.507-4.06-1.087-8.263-1.136-12.442-1.039-3.941.097-7.907-.024-11.848.29-3.514.266-7.005.967-10.59.532-2.992-.363-5.675-1.378-8.216-2.828-4.131-2.344-7.859-5.365-12.038-7.661-5.152-2.852-10.186-5.873-16.264-6.453-4.322-.411-8.43-.218-12.063 2.489-1.495 1.112-3.466 1.33-4.725 3.19-.546.798-1.306 1.426-1.496 2.538-.546 3.094-1.092 6.187-1.78 9.232-1.591 6.937-1.971 13.849-.76 20.809 1.068 6.09 4.321 10.731 9.165 14.404 4.06 3.07 8.714 3.626 13.51 3.771 5.272.145 10.33-1.426 15.482-2.079 3.419-.435 6.862-.556 10.257-.145 3.396.435 6.316 2.272 9.26 3.891a38.753 38.753 0 0 1 6.791 4.761c2.066 1.813 4.274 3.577 6.696 4.786 5.152 2.61 10.732 3.552 17.167 3.504 5.342.314 10.614-1.499 15.172-5.51 2.494-2.2 4.749-4.52 5.509-8 .499-2.369 1.069-4.761 2.018-6.985 1.781-4.108 3.087-8.338 4.132-12.664 1.329-5.389-.071-9.135-4.44-12.326Zm-69.333 4.834c-.404 1.184-1.71 1.402-2.754 1.668-1.995.507-3.966.145-5.936-.314-3.538-.871-7.148-1.571-10.21-3.819-.76-.532-1.544-1.039-1.401-2.151.118-1.112 1.068-1.353 1.875-1.668 1.354-.555 2.802-.845 4.393-.676 4.037.193 8.026.87 11.492 3.432.404.29.903.58 1.164.99.546.798 1.804 1.354 1.377 2.538Zm47.251 13.703c-.285.798-.998 1.523-1.829 1.789-1.187.338-2.374.822-3.086.556-5.984-.459-10.946-1.958-14.959-5.897-1.401-1.354-1.187-2.876.498-3.94 2.066-1.305 4.512-1.812 6.411-.604 2.565 1.692 5.438 2.659 8.073 4.181 1.282.749 2.612 1.45 3.704 2.514.475.435 1.473.628 1.188 1.401Z" fill="#7514CF"/></g><path d="M185.451 266c.362 2.456-.891 5.251-2.746 7.202-2.577 2.722-6.07 4.215-10.141 3.107-4.263-1.156-7.852-3.469-11.2-6.239-.723-.602-1.566-1.011-2.168-1.782-.217-.289-.603-.626-1.06-.289-.386.289 0 .771-.048.915-.868 2.192-.41 4.601-1.108 6.817-.795 2.505-.844 5.131-1.349 7.684-.41 2.096-1.108 4.167-1.373 6.287-.53 4.071-1.47 8.045-1.903 12.14-.747 7.178-.386 14.308-.289 21.486.024 2.288.626 4.48.481 6.769a61.294 61.294 0 0 0 0 7.274c.338 6.504-1.83 12.213-5.901 17.054-2.577 3.059-6.046 5.035-10.141 5.902-3.276.698-6.6.289-9.804.722-4.311.579-8.551.362-12.742-.144-3.204-.385-6.504-.795-9.587-2.288-2.457-1.205-5.275-1.711-7.973-2.457-5.974-1.662-11.972-3.18-17.945-4.77-4.264-1.132-8.359-2.89-12.574-4.239-3.613-1.156-7.274-2.12-10.888-3.252a47.694 47.694 0 0 1-10.14-4.504c-2.987-1.783-5.83-3.854-7.564-6.914-1.325-2.336-1.83-5.034-1.229-7.756.916-4.143 2.41-8.117 3.638-12.14a352.204 352.204 0 0 0 2.529-8.599c1.276-4.577 2.939-9.033 4.263-13.61 1.036-3.565 2.216-7.082 2.746-10.767.313-2.192 1.229-4.215 1.446-6.431a171.432 171.432 0 0 1 2.986-18.524c.314-1.493-.602-1.469-1.469-1.108-2.794 1.18-5.757 1.734-8.623 2.602-3.276.987-6.552 2.143-10.02 2.36-2.795.193-5.854-1.71-6.817-4.456-.482-1.397-1.036-2.794-1.325-4.239-.747-3.686 1.156-6.046 4.72-8.262a115.335 115.335 0 0 1 8.89-5.035c2.191-1.108 4.552-1.903 6.84-2.842 4.673-1.975 9.394-3.878 14.212-5.492 3.18-1.06 6.431-1.927 9.635-2.891 4.528-1.373 9.274-1.589 13.85-2.577 1.927-.41 4.071-.12 6.022-.578 2.819-.675 5.685-.626 8.503-1.156a6.522 6.522 0 0 1 1.205-.121c6.527 0 13.055-.433 19.559.145 4.215.361 8.382 1.06 12.549 1.782 3.349.578 6.721 1.084 9.949 2.24 2.962 1.06 6.166 1.614 8.936 2.987 2.818 1.397 5.998 2.144 8.503 4.336.771.674 2.096.988 3.18 1.542 2.168 1.108 4.191 2.384 5.973 3.95 2.626 2.312 5.155 4.793 7.395 7.491 2.385 2.843 4.914 5.54 6.841 8.768 2.096 3.517 3.541 7.178 3.324 11.924l-.048-.024Zm-91.918-20.306c-.988-.603-1.542.361-2.337.409-5.95.289-11.779 1.469-17.608 2.481-2.89.482-5.781 1.084-8.671 1.71-1.928.41-3.758 1.229-5.83 1.157-.722 0-1.541.529-1.638 1.782-.265 3.613-.554 7.25-1.83 10.719-.338.915-.12 2.023-.169 3.035 0 .361.048.771.53.626 2.12-.626 4.553-.409 6.455-1.349 2.89-1.397 6.07-1.397 9.01-2.481 2.143-.77 4.672-.433 7.033-.674 2.433-.241 4.914-.409 7.323-.771 7.756-1.156 15.488-.241 23.196.169 2.409.12 4.817.289 7.202.385 2.77.121 5.637-.144 8.334.386 4.168.819 8.359 1.228 12.598 1.493 3.252.193 6.335 1.229 9.274 2.409 2.192.867 4.625 1.349 6.576 2.842.385.289 1.156.458 1.228-.506.362-4.793 1.759-9.442 1.879-14.308.048-1.975-.746-2.698-1.975-3.541-2.264-1.541-4.769-2.673-7.419-3.179-5.058-.964-10.117-2.096-15.271-2.65-4.818-.506-9.587-1.301-14.429-1.397-4.818-.096-9.659-.337-14.477.289-3.01.385-6.046.675-8.984.988v-.024ZM55.763 395.76c-.578.818.072 1.252-.048 1.83-2.36-.458-4.697-.674-7.058-.722-1.108-.025-2.192-.603-2.866-1.205-2.072-1.879-4.697-2.818-6.793-4.625-1.903-1.638-2.553-3.733-3.155-5.877-.314-1.084 2.071-3.661 3.588-4.456 1.566-.819 3.325-.843 4.866-1.397 1.88-.651 3.782-.819 5.685-1.181 1.421-.289 2.89-.65 4.288-.506 3.781.41 7.467-.433 11.176-.65 3.132-.193 6.36-.265 9.467-.915.53-.121.867-.313.963.409.024.217.169.338.337.241 3.517-2.168 7.492-.722 11.225-1.349 3.156-.506 6.48-.265 9.732-.385 1.903-.048 4.046-.121 5.805.337 1.734.458 2.963-.891 4.625-.265 1.108.434 2.649-.506 3.709.699.097.12.097.144.241.072 2.457-1.397 4.866-.265 7.299.144.794.145 1.565-.385 2.481-.409 3.227-.048 6.407.385 9.587.626 1.782.121 3.589.506 5.395.337.602-.048 1.325-.192 1.301.844 0 .457.409.602.698.289 1.253-1.349 2.481-.482 3.686 0 .313.12.626.313.963.289 4.047-.506 7.684 1.204 11.49 1.999 2.048.433 3.637 1.301 5.227 2.625 1.951 1.638 2.168 3.565.699 5.637-1.59 2.216-3.71 3.372-6.215 4.095-1.686.482-3.324 1.397-4.962 1.758-2.312.506-4.649.94-6.913 1.59-3.107.891-6.311 1.277-9.442 1.566-2.843.265-5.709 1.541-8.648.554-.409-.145-.53.313-.674.289-.651-.121-1.133 1.421-1.927.096-.241-.385-.651.843-1.133.699-2.842-.747-5.54.506-8.262.433a109.785 109.785 0 0 0-6.286.024c-3.445.121-6.865.41-10.31.458-.819 0-2.12.843-2.553-.747 0-.048-.241-.096-.313-.048-3.204 1.855-6.649.337-9.949.482-1.975.096-4.143.506-6.19-.072-2.048-.554-4.143-.145-6.239-.241-1.638-.072-3.204-.675-4.89-.747-2.433-.096-4.865-.458-7.298-.626-1.205-.072-2.024-.602-2.385-2.048l-.024.049Zm51.668.867c.072-1.397-.795-2.433-1.999-2.505-1.277-.073-1.903.867-1.975 1.806-.097 1.06.216 2.433 1.734 2.337.963-.049 2.288-.049 2.24-1.614v-.024Zm-13.85-16.356c.77.169 1.493.048 1.565-.819.073-.771-.65-1.012-1.276-1.084-.892-.12-1.157.554-1.301 1.229-.193.963.578.578.987.674h.025Zm50.849 5.926c-1.253-.073-2.289-.169-3.324-.193-.362 0-.843.169-.603.747.121.289.506.819.627.65.843-1.108 2.36 0 3.3-1.228v.024ZM81.296 388.1c-.12-.53-.578-.964-1.06-1.108-.289-.073-.867.409-.747.915.097.409.048 1.036.867 1.036.603 0 .771-.338.964-.843h-.024ZM171.167 111.742c-1.397 1.084-2.216-.265-3.035-.77-1.975-1.181-3.734-2.698-5.588-4.047-.771-.554-1.711-.506-2.578-.626-.915-.121-1.18-.627-1.59-1.422-.77-1.445-.818-2.914-1.083-4.432-.145-.915-.868-1.686-.554-2.794.722-2.36 3.372-5.588 5.877-5.082 3.228.674 6.672 1.445 8.599 4.335.723 1.084 1.59 1.253 2.409 1.759 2.818 1.782 5.805 3.227 8.527 5.251 1.445 1.06 3.685 1.686 5.299 2.794 2.409 1.662 5.155 2.722 7.419 4.649.892.771 2.144 1.108 3.156 1.758 2.842 1.831 5.323 4.143 8.069 6.143 1.494 1.084 3.18 1.879 4.649 3.059 2.867 2.336 5.902 4.432 8.792 6.72 2.65 2.096 5.564 3.878 8.383 5.757 2.264 1.494 4.287 3.373 6.479 5.035 1.855 1.397 3.806 2.721 5.54 4.215 2.505 2.168 5.396 3.734 7.997 5.685 1.879 1.397 3.999 2.673 5.998 3.974 1.325.867 2.794 1.566 3.999 2.722 1.06 1.012 2.288 1.999 3.589 2.722 1.758.987 3.3 2.264 4.649 3.637 1.301 1.325 3.083 1.831 4.312 3.204 1.252 1.445 3.275 2.168 4.456 3.517 1.59 1.83 3.709 2.866 5.419 4.504 1.759 1.686 3.373 3.493 5.107 5.203.964.963 1.108 2.192 1.012 3.276-.313 3.011-2.096 5.323-4.264 7.347-.771.698-4.6.385-5.949-.265-2.722-1.277-5.324-2.722-7.805-4.408-1.83-1.229-3.709-2.385-5.492-3.662-3.974-2.866-8.334-5.154-12.26-8.117-3.084-2.361-6.504-4.312-9.467-6.769-3.348-2.77-6.913-5.227-10.165-8.093a43.386 43.386 0 0 0-4.48-3.469c-1.614-1.132-2.915-2.722-4.529-3.758-1.493-.963-2.577-2.36-4.167-3.227-1.734-.94-3.107-2.53-4.769-3.662-1.156-.795-2.24-1.71-3.372-2.409-2.915-1.782-5.782-3.709-8.359-5.877-1.927-1.638-4.697-2.264-5.901-4.793-1.494.216-2.313-.964-3.3-1.711-3.132-2.36-6.191-4.841-9.226-7.322-.554-.458-.939-1.132-1.277-1.783-.144-.241-.168-.481-.481-.602-3.493-1.445-6.215-4.047-9.202-6.215-.747-.529-.626-1.108-.795-1.902l-.048-.049Zm56.269 29.484c-.337-.699-.843-1.422-1.59-1.927-2.457-1.614-4.962-3.156-7.419-4.818-1.782-1.228-3.613-2.433-5.203-3.878-2.047-1.879-4.263-3.613-6.504-5.227-2.143-1.542-4.287-3.18-6.551-4.577-3.084-1.903-5.781-4.311-8.937-6.19-3.131-1.855-6.504-3.324-9.442-5.516-2.626-1.951-5.661-3.276-8.455-4.986-2.891-1.735-5.516-3.758-8.118-5.878-.746-.602-1.469-1.806-2.577-.024-.771 1.253-1.204 2.168-.048 3.18.915.843 1.951 1.565 3.035 2.216.602.361.795.578.409 1.228-.144.241-.53.675-.024 1.06.265.193.723.217.795.048.699-1.638 1.518-.217 2.264-.12 1.012.144 1.253 1.325 2 1.614 2.746 1.084 4.576 3.42 7.13 4.817 2.384 1.301 4.335 3.348 6.551 4.89 2.385 1.638 4.312 3.758 6.576 5.516 2.626 2.023 5.179 4.167 7.925 6.022 1.397.963 2.891 1.831 4.312 2.794 1.855 1.253 3.854 2.337 5.54 3.758 2.409 2.047 5.083 3.733 7.443 5.805 1.614 1.421 3.686 2.144 5.179 3.782.675.746 2.096 1.854 2.794 1.325 1.446-1.157 2.337-2.939 2.963-4.963l-.048.049Zm38.131 27.893c.024 2.12 1.156 4.095-.289 6.143-.265.361-1.229 1.132-.434 1.71 2.385 1.734 4.962 3.203 7.395 4.914 1.782 1.252 3.974 1.927 5.877 3.107.554.337 1.397.482 2.048-.458 1.349-1.854 1.228-3.661-.675-5.203-3.781-3.059-7.828-5.757-11.514-8.984-.578-.506-1.373-1.494-2.432-1.229h.024Zm-33.892-24.834a9.377 9.377 0 0 1-2.553 3.998c-1.084 1.012-.963 1.735.241 2.554 1.541 1.06 2.794 2.505 4.408 3.3.939-1.47 2.529-2.698 3.059-4.673.241-.916.41-1.301-.554-1.855-1.566-.94-2.987-2.144-4.601-3.324ZM147.585 201.106c-6.528.048-12.188-.892-17.415-3.493-2.457-1.228-4.697-2.963-6.793-4.769a39.366 39.366 0 0 0-6.889-4.746c-2.987-1.614-5.95-3.468-9.394-3.878-3.445-.433-6.937-.289-10.406.145-5.251.65-10.382 2.216-15.705 2.071-4.866-.144-9.587-.698-13.706-3.757-4.914-3.638-8.214-8.287-9.298-14.333-1.228-6.961-.843-13.826.77-20.739.7-3.035 1.277-6.142 1.831-9.226.193-1.084.94-1.71 1.518-2.529 1.277-1.83 3.276-2.071 4.793-3.179 3.686-2.674 7.829-2.867 12.237-2.457 6.166.578 11.273 3.589 16.5 6.431 4.24 2.288 8.021 5.299 12.213 7.636 2.577 1.445 5.299 2.457 8.334 2.818 3.637.434 7.178-.265 10.743-.53 4.023-.313 8.021-.192 12.02-.289 4.215-.096 8.503-.072 12.622 1.012 6.72 1.758 13.079 4.408 18.764 8.503 4.432 3.179 5.877 6.889 4.528 12.285-1.083 4.311-2.408 8.527-4.191 12.621-.963 2.192-1.541 4.601-2.071 6.962-.747 3.493-3.059 5.781-5.589 7.973-4.625 3.998-9.972 5.829-15.392 5.516l-.024-.048Zm-87.149-38.589a17.59 17.59 0 0 0 .169 4.047c.843 5.372 3.251 9.78 7.756 12.935.843.578 1.59 1.325 2.48 1.783 3.951 2.023 8.19 2.216 12.502 2.023 1.927-.096 3.758-.578 5.637-.819 4.312-.554 8.6-1.397 12.983-1.518 3.782-.096 7.491.217 11.008 1.783 4.601 2.023 8.913 4.552 12.743 7.828 4.528 3.854 9.635 6.456 15.584 7.154 4.36.506 8.816.964 13.056-.505 4.841-1.687 8.696-4.842 10.791-9.66.891-2.023 1.301-4.263 2.048-6.359 1.878-5.179 3.805-10.333 4.913-15.753.41-2.072.073-3.902-1.71-5.396-1.686-1.421-3.348-2.818-5.299-3.854-3.661-1.975-7.467-3.637-11.345-5.058-5.733-2.096-11.731-1.807-17.681-1.951-5.949-.145-11.875.747-17.8.939-4.192.145-8.022-1.06-11.683-2.842-4.071-1.975-7.443-5.107-11.442-7.275-4.769-2.601-9.394-5.419-14.886-6.407-4.649-.843-8.84-.506-13.104 2.096-2.794 1.71-4.07 3.324-4.432 6.696-.722 6.721-3.227 13.224-2.312 20.137l.024-.024ZM35.481 100.734c-.12 3.541.41 6.865-.096 10.165-.217 1.446-.362 2.843-2.216 3.18-1.903.361-2.794-.626-3.59-2.168-.818-1.614-1.83-3.131-2.794-4.673-.24-.361-.578-1.132-.89-.891-.507.409-1.205.578-1.543 1.325-1.06 2.336-3.083 3.83-5.275 4.914-1.493.722-2.48-.241-2.866-1.831-.482-2.072 0-4.095.096-6.118.073-1.614-.867-2.024-1.999-1.711-2.264.627-4.336-.144-6.48-.457-1.734-.241-2.625-1.494-3.01-3.06-.241-.939-.025-1.806 1.011-2.432 1.638-.988 3.348-1.807 5.179-2.24 1.59-.386 1.566-1.157 1.012-2.289-1.494-2.962-3.035-5.901-4.48-8.888-1.205-2.505-2.313-5.083-3.47-7.612-.312-.698-.288-1.445-.192-2.168.12-.77 1.06-1.517 1.325-1.276 1.18 1.084 2.264-.458 3.42.12 1.132.578 2.096 1.373 3.084 2.12 2.77 2.047 5.54 4.119 8.238 6.263 1.035.843 1.348.505 1.493-.579.313-2.432 1.3-4.745 1.71-7.13.29-1.637 1.012-3.13 1.18-4.793.12-1.156 1.951-2.939 3.035-2.939 1.542 0 2.24 1.06 2.554 2.337.915 3.806 2.264 7.491 2.65 11.417.144 1.446.602 2.698 2.673 2.554 1.614-.12 3.252-.458 4.914-.145 2.072.41 4.143-.433 6.19.024.868.193 1.831.193 2.169 1.277.337 1.132.409 2.216-.723 3.01-1.927 1.374-4.215 1.976-6.335 2.964-.386.192-.386-.049-.506-.362-.169-.385-.843-.216-.819-.048.217.94-1.132 1.59-.145 2.843 1.687 2.143 3.734 3.974 5.107 6.359.337.602.819 1.132 1.108 1.734.554 1.132 1.614 2.312.482 3.613-1.18 1.349-2.867 1.566-4.408.988-1.903-.699-3.686-1.759-5.516-2.674a42.21 42.21 0 0 1-1.325-.698l.048-.025Zm-4.07 5.589c-.434-2.457-.218-4.721-.675-6.962-.313-1.517.192-2.962 1.614-3.757 1.397-.771 2.794-.048 3.974.626.723.41 1.445.867 2.216 1.204.217.097.337.771.747.217.217-.289.144-.506-.048-.746a29.046 29.046 0 0 1-1.06-1.35c-.964-1.204-2-2.384-2.843-3.66-1.18-1.783-.89-3.132.723-4.505.506-.434 1.205-.65 1.542-1.325a6.303 6.303 0 0 0-1.903 0c-4.745.723-6.504-.723-7.106-5.54-.24-1.903-.77-3.758-1.18-5.637h-.434c-.024 3.011-1.325 5.757-1.71 8.72-.169 1.349-1.036 2.65-2.264 3.204-1.229.53-2.53.024-3.662-.867-2.746-2.144-5.588-4.216-8.406-6.287-.169-.12-.241-.627-.627-.265-.313.313-.216.626.12.867.772.53 1.06 1.445 1.205 2.192.217 1.084 1.253 1.903 1.18 2.794-.096 1.204.892 1.397 1.205 2.096.602 1.325 1.782 2.529 1.18 4.215-.217.626.386.506.627.723.722.674 1.902 1.084 1.83 2.312-.072 1.132-.698 1.855-1.782 2.313-1.084.457-2.096 1.083-3.156 1.637.891.241 1.71.17 2.505.145 2.915-.169 5.565 2.288 5.275 5.058-.048.434-.168 1.036.362 1.229.626.241.674-.386.915-.747.241-.385.578-.722.843-1.084 1.975-2.674 3.469-2.649 5.902-.433 1.132 1.035 1.325 2.649 2.866 3.589l.024.024ZM207.299 43.286c.12-1.132.433-2.264.361-3.372-.144-1.975 1.229-2.168 2.578-2.385.819-.144 1.276.458 1.469 1.157.506 1.806.65 3.637.723 5.516.12 2.529.939 4.938 2.095 7.13 1.036 1.999 3.107 2.625 5.251 2.77.795.048 1.831-.169 2.12.698.313.964.819 1.927-.265 3.132-1.301 1.445-1.566 3.54-2.072 5.444-1.011 3.902-1.3 7.948-2.456 11.803-.29.987-.964 2.336-2.457 2.12-2.433-.362-2.77-.868-2.963-2.988-.241-2.529-.819-4.986-1.518-7.419-.626-2.288-2.312-3.589-4.336-4.576-2.505-1.229-4.239-3.132-5.082-5.83-.169-.554-.145-1.228.482-1.18 2.047.12 3.276-.819 3.926-2.65 1.084-3.01 2.072-6.07 2.12-9.321l.024-.049Zm-.843 14.55c3.589 1.95 7.033 3.709 7.852 8.093.314-2.553 1.253-4.89 1.831-7.323.12-.554-.096-1.06-.602-1.3-2.288-1.084-4.071-2.722-5.516-5.203-.578 2.529-1.927 4.167-3.541 5.732h-.024ZM84.668 9.897c-.53-1.325.193-2.602.41-3.854.217-1.301 0-2.578.217-3.854.168-.94.337-1.952 1.59-2.192.963-.193 3.058 1.95 2.697 3.107-.385 1.276.458 2.77-.722 3.902-.12.12-.073.626.072.819 1.517 2.047 1.686 4.673 2.987 6.793.265.457.457.65 1.06.53.89-.169 1.806-.362 2.746.192.939.53 1.18 1.301.794 2.12-2.697 5.974-4.119 12.309-5.708 18.62-.29 1.084-.627 2.601-2.144 2.674-1.71.072-2.53-1.036-2.698-3.108-.361-3.878-1.132-7.66-2.963-11.104-.891-1.686-2.264-3.228-4.046-4.023-2.072-.94-1.759-2.866-2.168-4.48-.169-.626 1.06-1.204 1.638-.867.096.048.264.12.313.072 1.445-1.084 4.215-.217 4.48-3.035.024-.337.193-.578.482-.65.94-.217 1.3-.723 1.011-1.687l-.048.025Zm3.927 16.716c1.156-2.36 1.662-4.624 2.432-6.768.217-.602-.144-1.084-.602-1.253-1.47-.626-2.433-1.734-3.203-3.059-.41-.674-.988-.77-1.253-.024-.289.795-.867 1.204-1.373 1.758-.747.82-1.012 1.494.24 2.481 2.048 1.614 3.012 4.071 3.783 6.865h-.024ZM6.022 167.388c-.434-1.565-1.253-2.746-2.072-3.878-.722-1.011-.674-2.288-1.349-3.324-.41-.626-.072-1.373.554-1.806.65-.458 1.325-.603 2.048-.073.698.53 1.204 1.253 1.638 1.976.554.963.795 1.228 1.541.096 1.012-1.469 2.602-1.204 3.373.506.554-.723 1.06-1.397 1.878-1.903 1.47-.891 2 .313 2.53 1.012.385.505.843 1.686-.579 1.951-.264.048-.264.24-.216.361.963 1.999-1.084 2.529-1.927 3.42-.434.458-.554.771-.578 1.229a.924.924 0 0 0 .963 1.012c.843-.049 1.614.481 2.313.409 2.047-.241 2.48 1.349 2.432 2.505-.072 1.494-1.517 1.759-2.89 1.494-.313-.049-.65 0-.988 0 .747 2.071.506 2.746-1.204 3.589-2.024.987-2.553.746-3.469-1.614-.12-.313-.168-.675-.289-.988-.722-1.806-1.276-1.903-2.529-.433-.337.385-.65.843-1.036 1.132-.602.433-1.228.963-2.047.578-.747-.361-1.35-.867-1.35-1.807 0-.457.194-1.084-.505-.987-1.445.216-2.144-.771-2.216-1.759-.072-.939.988-1.662 1.807-2.216 1.228-.843 2.673-.554 4.215-.506l-.048.024ZM134.867 49.45c1.542.12 2.577 1.107 3.18 2.336 1.951 3.878 4.022 7.684 5.684 11.706 1.157 2.819 2.337 5.66 3.734 8.407.963 1.879 1.975 3.661 3.276 5.3 1.469 1.854 1.325 2.649-.482 3.95-1.084.77-2.577.265-3.493-1.398-1.108-2.023-2.336-3.998-3.203-6.166-.313-.747-1.132-1.349-1.59-2.168-1.012-1.758-1.927-3.661-2.987-5.275-1.517-2.336-2.505-4.914-3.878-7.274-1.108-1.928-1.638-4.095-2.192-6.24-.361-1.348.843-3.227 1.927-3.155l.024-.024ZM76.912 64.001c-.482 1.542-.723 3.42-.217 5.348.265.963.554 1.59 1.71 1.662 2.072.12 2.795 1.397 1.735 3.18-1.518 2.529-2.216 5.37-3.252 8.093-.313.843-.77 1.71-1.397 2.312-1.132 1.132-3.035.29-3.469-1.373-.626-2.36-.746-4.841-1.782-7.082-.434-.915-.675-2.047-1.879-2.24-1.18-.192.169-1.59-1.108-1.95-1.3-.362.072-1.277.024-1.952-.024-.53.602-.65.434-1.349-.241-.94.867-1.204 1.493-1.204 2.192-.048 2.602-.41 2.65-2.89 0-1.133.216-2.072 1.3-2.915.94-.723 1.88-.675 2.554-.362.843.362 1.276 1.421 1.204 2.77v-.048ZM113.381 109.428c-1.181-.217-2.409-.361-2.698-1.758-.289-1.421.409-2.24 1.686-2.915 3.396-1.782 7.25-1.999 10.767-3.396 2.024-.795 4.167-1.614 6.287-1.783.988-.072 1.397-1.06 2.433-.819.939.217 1.951.458 3.011.097.964-.338 1.734-.675 2.072-1.686.529-1.566 1.878-1.277 2.89-.964.819.241 1.229 1.156 1.132 2.24-.313 3.132-2.77 3.927-5.106 4.914-2.915 1.229-6.071 1.542-9.106 2.313-3.757.963-7.563 1.662-11.128 3.251-.723.314-1.542.362-2.264.53l.024-.024ZM135.011 86.98c-.554-.336-.819.025-1.373.483-.77.65-1.782.192-2.649-.313-3.421-1.976-7.034-3.59-10.743-4.963a397.265 397.265 0 0 0-10.623-3.805c-1.373-.482-2.12-1.325-1.855-2.746.241-1.277 1.662-2.144 3.108-1.71 2.938.89 5.949 1.541 8.767 2.986 1.735.891 3.734 1.494 5.541 2.385 1.83.915 3.854 1.397 5.636 2.288 2.481 1.253 5.299.82 7.805 2.048 1.18.578 1.156 1.47 1.084 2.095-.097.892-.964 1.831-2.024 1.494-.891-.29-1.71-.145-2.698-.217l.024-.024ZM231.868 100.377c-.409-.722.747-.506 1.036-.915 1.108-1.542 2.288-3.035 3.372-4.577.434-.626.891-1.95.602-3.107-.217-.94.289-1.759.482-2.626.289-1.276 1.469-1.084 2.216-1.59.578.892 2.023 1.205 1.927 2.53-.096 1.252-.217 2.577-1.228 3.517-.217.192-.506.337-.289.65.168.24.433.385.602-.048.53.313.53.94.65 1.42.265 1.06.964 1.543 1.831 2.072.891.554 2.023 1.253 1.349 2.746-.94 2.072-1.807 4.192-2.722 6.263-.217.458-.506.867-.53 1.421-.072 1.084-.867 1.422-1.783 1.614-.963.193-1.613-.192-1.999-1.036-.289-.626-.506-1.276-.722-1.927-.675-1.999-2.289-3.059-3.927-4.143-.674-.433-.626-1.3-.891-2.312l.024.048Zm8.118.651c-.94.096-1.012-1.18-1.927-1.205-.579 0-.916.795-.868.843.554.554 1.108 1.253 1.976 1.205.265 0 .795-.169.819-.843ZM162.833 20.113c0 .29.024.723-.097 1.085-.385 1.06.313 1.252 1.036 1.252.891 0 1.783-.169 2.674-.265.987-.096 1.903.169 2.312 1.132.362.891-.385 1.373-.819 2.072-1.011 1.614-2.529 1.493-3.878 1.42-1.276-.047-1.325.555-1.108 1.277.506 1.542-.433 2.554-1.084 3.686-.217.361-.482.289-.867.217-.939-.193-1.975-.193-2.216-1.421-.072-.458-.096-.916-.12-1.373-.073-1.157-.217-2.048-1.759-2.216-1.036-.12-1.831-1.108-1.782-2.24.048-1.036.795-1.663 1.854-1.88 1.06-.216 1.59-.794 1.446-2.023-.097-.891.12-1.83.216-2.746.049-.313.073-.626.554-.747.579-.144.554-.216.338-.722-.024-.072-.121-.097-.193-.145.096-.048.217-.072.313-.144 1.325-.795 2.12-.482 2.698.987.337.867.361 1.783.458 2.794h.024ZM27.315 12.883c1.277 1.132 2.65 1.036 4.168.843 1.541-.193 1.637 1.541 2.216 2.48.505.796-.458 1.35-1.06 1.687-1.35.795-1.71 2.313-.53 3.276.722.578.77 1.421 1.204 2.096.482.722-.433 1.565-.626 1.517-2.048-.361-2.842 1.518-4.24 2.264-.819.434-1.42.097-1.999-.41-.53-.457-.433-.915-.096-1.517.361-.65-.241-1.445.144-2.192.024-.072-.36-.457-.578-.505-.602-.12 0 .36-.216.505-.627.506-1.229.265-1.855-.024-.916-.41-1.373-1.108-1.036-2.023.53-1.397.915-2.866 2.216-3.902.626-.506 1.3-1.301.506-2.289-.265-.337-.097-.65.217-.89.265-.194.361.071.554.192.265.168-.265.963.481.65.458-.193.603-.602.338-1.108-.049-.096.072-.313.168-.626l.024-.024ZM202.915 198.579c0-.41-.073-.819 0-1.205.289-1.276-.121-1.71-1.422-1.397-.77.193-1.758.53-1.228-1.036.144-.409-1.012-.481-.554-1.565.53-1.253 1.18-1.735 2.36-1.59.819.096 1.036-.048 1.108-.964.121-1.445.506-2.89 1.494-4.095.265-.337.433-.963.915-.264.675.987.867-1.205 1.686-.193.578.722-.361 1.252.049 1.734.626.747.481 1.638.313 2.337-.313 1.276.265 1.3 1.18 1.349 1.18.072 2.457.072 3.18 1.228.409.65.602 1.469.072 2.096-.843 1.011-1.951 1.638-3.372 1.373-1.205-.241-1.687.313-1.398 1.493.338 1.349.29 1.421-1.059 1.518-.241 0-.554.192-.699.385-.169.265-.072.53.289.65.386.121.554.386.386.795-.169.41-.506.41-.868.434-1.782.168-2.601-.843-2.505-3.156l.073.073ZM33.241 202.531c-1.132-.771-2.023-.049-2.818 1.035-.626.892-1.47.314-2.168.169-.578-.12-.698-.723-.77-1.349-.17-1.277.65-2.746-.627-3.83.963-1.084.096-3.011 2-3.83.794-.337 1.228-1.662 2.047-2.384.843-.747 1.71-.747 2.384.096.265.337.602.723.988.891 1.517.65 2.023 1.71.987 2.963-1.18 1.397-.433 2.65-.048 3.926.41 1.397-.24 2.337-1.95 2.313h-.025Z" fill="#000"/><path d="M142.792 179.623c-6.986-.337-12.55-2.553-17.295-6.576-2.963-2.529-2-6.889 1.011-8.72 1.253-.771 2.602-1.686 4.36-1.638 1.855.048 3.589.313 5.372.843 1.662.506 3.179 1.06 4.601 2.144 1.541 1.156 3.396 1.855 5.034 2.867 1.204.746 2.36 1.589 3.493 2.457 2.986 2.312 1.806 6.286-1.205 7.322-1.927.675-3.902 1.542-5.371 1.325v-.024Zm.12-3.035c.723.265 1.927-.217 3.131-.578a2.928 2.928 0 0 0 1.855-1.759c.289-.794-.722-.987-1.204-1.421-1.132-1.036-2.457-1.734-3.782-2.505-2.65-1.517-5.564-2.481-8.19-4.167-1.903-1.229-4.408-.699-6.503.602-1.687 1.06-1.903 2.578-.506 3.926 4.095 3.903 9.129 5.42 15.175 5.878l.024.024ZM94.376 165.724c-5.107-.77-10.117-1.951-14.646-4.624-1.95-1.157-3.227-2.891-3.637-5.179-.193-1.108 1.397-3.276 2.939-3.999 1.903-.891 3.974-1.132 6.022-1.373 6.335-.747 11.658 1.759 16.042 5.854 3.782 3.516 2.867 6.238-1.83 8.43-1.422.675-3.132 1.132-4.866.867l-.024.024Zm-8.672-12.067c-1.614-.169-3.06.12-4.456.674-.82.313-1.783.554-1.903 1.662-.12 1.108.674 1.59 1.421 2.144 3.107 2.24 6.769 2.939 10.358 3.806 2 .481 3.998.819 5.998.313 1.06-.265 2.384-.482 2.818-1.662.433-1.181-.867-1.735-1.397-2.529-.265-.41-.771-.675-1.18-.988-3.517-2.553-7.564-3.228-11.683-3.42h.024Z" fill="#000"/><g clip-path="url(#h)"><path d="m54.69 276.156 2.707-27.615 49.817-10.83 53.607 12.996-5.957 25.449-45.484-8.663-54.69 8.663Z" fill="url(#i)"/><path d="m22.5 88.36 3.294-12.623 1.646-4.939 3.293 14.818H45.55l-8.78 6.037 6.585 12.073-9.878-2.195v13.171l-7.135-7.683-7.683 6.586-1.098-9.33h-9.33l6.587-4.939L7.134 79.03l15.367 9.33Z" fill="url(#j)"/><path d="m82.32 21.406 3.293-4.39 7.134 4.39-4.39 12.623-6.037-12.623Z" fill="url(#k)"/><path d="m204.154 62.017 4.94-8.232 8.78 6.037-3.292 15.367-10.428-13.172Z" fill="url(#l)"/><path d="m234.887 104.275 1.647-2.744 1.646-.549 3.842 2.196-2.196 6.036-4.939-4.939Z" fill="url(#m)"/><g clip-path="url(#n)"><path d="M170.702 157.546c-5.604-4.084-11.872-6.742-18.497-8.507-4.06-1.087-8.263-1.136-12.441-1.039-3.942.097-7.907-.024-11.849.29-3.514.266-7.004.967-10.59.532-2.991-.363-5.674-1.378-8.215-2.828-4.132-2.344-7.859-5.365-12.038-7.661-5.153-2.852-10.187-5.873-16.265-6.453-4.322-.411-8.43-.218-12.062 2.489-1.496 1.112-3.467 1.33-4.725 3.19-.546.798-1.306 1.426-1.496 2.538-.546 3.094-1.092 6.187-1.78 9.232-1.592 6.937-1.972 13.849-.76 20.809 1.068 6.09 4.32 10.731 9.165 14.404 4.06 3.07 8.714 3.626 13.51 3.771 5.271.145 10.329-1.426 15.481-2.079 3.419-.435 6.862-.556 10.258-.145 3.395.435 6.316 2.272 9.26 3.891a38.79 38.79 0 0 1 6.791 4.761c2.065 1.813 4.274 3.577 6.695 4.786 5.153 2.61 10.733 3.552 17.167 3.504 5.343.314 10.614-1.499 15.173-5.51 2.493-2.2 4.749-4.52 5.509-8 .498-2.369 1.068-4.761 2.018-6.985 1.781-4.108 3.086-8.338 4.131-12.664 1.33-5.389-.071-9.135-4.44-12.326Zm-69.333 4.834c-.403 1.184-1.71 1.402-2.754 1.668-1.994.507-3.965.145-5.936-.314-3.538-.871-7.147-1.571-10.21-3.819-.76-.532-1.543-1.039-1.4-2.151.118-1.112 1.068-1.353 1.875-1.668 1.353-.555 2.802-.845 4.393-.676 4.036.193 8.025.87 11.492 3.432.403.29.902.58 1.163.99.546.798 1.805 1.354 1.377 2.538Zm47.251 13.703c-.285.798-.997 1.523-1.828 1.789-1.187.338-2.375.822-3.087.556-5.983-.459-10.946-1.958-14.959-5.897-1.401-1.354-1.187-2.876.499-3.94 2.066-1.305 4.511-1.812 6.411-.604 2.564 1.692 5.437 2.659 8.073 4.181 1.282.749 2.612 1.45 3.704 2.514.475.435 1.472.628 1.187 1.401Z" fill="#7514CF"/></g><path d="M185.451 266.003c.362 2.457-.891 5.252-2.746 7.203-2.577 2.722-6.07 4.215-10.141 3.107-4.263-1.156-7.852-3.469-11.2-6.239-.723-.602-1.566-1.011-2.168-1.782-.217-.289-.603-.627-1.06-.289-.386.289 0 .771-.048.915-.868 2.192-.41 4.601-1.108 6.817-.795 2.505-.844 5.131-1.349 7.684-.41 2.095-1.108 4.167-1.373 6.287-.53 4.071-1.47 8.045-1.903 12.14-.747 7.178-.386 14.308-.289 21.486.024 2.288.626 4.48.481 6.769a61.294 61.294 0 0 0 0 7.274c.338 6.504-1.83 12.213-5.901 17.054-2.577 3.059-6.046 5.035-10.141 5.902-3.276.698-6.6.289-9.804.722-4.311.578-8.551.362-12.742-.144-3.204-.386-6.504-.795-9.587-2.288-2.457-1.205-5.275-1.711-7.973-2.457-5.974-1.662-11.972-3.18-17.945-4.77-4.264-1.132-8.359-2.89-12.574-4.239-3.613-1.156-7.274-2.12-10.888-3.252a47.745 47.745 0 0 1-10.14-4.504c-2.987-1.783-5.83-3.854-7.564-6.914-1.325-2.336-1.83-5.034-1.229-7.756.916-4.143 2.41-8.117 3.638-12.14a352.204 352.204 0 0 0 2.529-8.599c1.276-4.577 2.939-9.033 4.263-13.61 1.036-3.565 2.216-7.082 2.746-10.767.313-2.192 1.229-4.215 1.446-6.431a171.432 171.432 0 0 1 2.986-18.524c.314-1.493-.602-1.469-1.469-1.108-2.794 1.18-5.757 1.734-8.623 2.602-3.276.987-6.552 2.143-10.02 2.36-2.795.193-5.854-1.71-6.817-4.456-.482-1.397-1.036-2.794-1.325-4.24-.747-3.685 1.156-6.046 4.72-8.262a115.657 115.657 0 0 1 8.89-5.034c2.191-1.108 4.552-1.903 6.84-2.842 4.673-1.975 9.394-3.878 14.212-5.492 3.18-1.06 6.431-1.927 9.635-2.891 4.528-1.373 9.274-1.59 13.85-2.577 1.927-.41 4.071-.121 6.022-.578 2.819-.675 5.685-.627 8.503-1.156a6.522 6.522 0 0 1 1.205-.121c6.527 0 13.055-.433 19.559.145 4.215.361 8.382 1.059 12.549 1.782 3.349.578 6.721 1.084 9.949 2.24 2.962 1.06 6.166 1.614 8.936 2.987 2.818 1.397 5.998 2.144 8.503 4.336.771.674 2.096.988 3.18 1.542 2.168 1.108 4.191 2.384 5.973 3.95 2.626 2.312 5.155 4.793 7.395 7.491 2.385 2.843 4.914 5.54 6.841 8.768 2.096 3.517 3.541 7.178 3.324 11.924l-.048-.025Zm-91.918-20.305c-.988-.603-1.542.361-2.337.409-5.95.289-11.779 1.469-17.608 2.481-2.89.482-5.781 1.084-8.671 1.71-1.928.41-3.758 1.229-5.83 1.156-.722 0-1.541.53-1.638 1.783-.265 3.613-.554 7.25-1.83 10.719-.338.915-.12 2.023-.169 3.035 0 .361.048.771.53.626 2.12-.626 4.553-.409 6.455-1.349 2.89-1.397 6.07-1.397 9.01-2.481 2.143-.77 4.672-.433 7.033-.674 2.433-.241 4.914-.41 7.323-.771 7.756-1.156 15.488-.241 23.196.169 2.409.12 4.817.289 7.202.385 2.77.121 5.637-.144 8.334.386 4.168.819 8.359 1.228 12.598 1.493 3.252.193 6.335 1.228 9.274 2.409 2.192.867 4.625 1.349 6.576 2.842.385.289 1.156.458 1.228-.506.362-4.793 1.759-9.442 1.879-14.308.048-1.975-.746-2.698-1.975-3.541-2.264-1.541-4.769-2.673-7.419-3.179-5.058-.964-10.117-2.096-15.271-2.65-4.818-.506-9.587-1.301-14.429-1.397-4.818-.096-9.659-.337-14.477.289-3.01.385-6.046.674-8.984.988v-.024ZM55.763 395.76c-.578.818.072 1.252-.048 1.83-2.36-.458-4.697-.674-7.058-.722-1.108-.025-2.192-.603-2.866-1.205-2.072-1.879-4.697-2.818-6.793-4.625-1.903-1.638-2.553-3.733-3.155-5.877-.314-1.084 2.071-3.661 3.588-4.456 1.566-.819 3.325-.843 4.866-1.397 1.88-.651 3.782-.819 5.685-1.181 1.421-.289 2.89-.65 4.288-.506 3.781.41 7.467-.433 11.176-.65 3.132-.193 6.36-.265 9.467-.915.53-.121.867-.313.963.409.024.217.169.338.337.241 3.517-2.168 7.492-.722 11.225-1.349 3.156-.506 6.48-.265 9.732-.385 1.903-.048 4.046-.121 5.805.337 1.734.458 2.963-.891 4.625-.265 1.108.434 2.649-.506 3.709.699.097.12.097.144.241.072 2.457-1.397 4.866-.265 7.299.144.794.145 1.565-.385 2.481-.409 3.227-.048 6.407.385 9.587.626 1.782.121 3.589.506 5.395.337.602-.048 1.325-.192 1.301.844 0 .457.409.602.698.289 1.253-1.349 2.481-.482 3.686 0 .313.12.626.313.963.289 4.047-.506 7.684 1.204 11.49 1.999 2.048.433 3.637 1.301 5.227 2.625 1.951 1.638 2.168 3.565.699 5.637-1.59 2.216-3.71 3.372-6.215 4.095-1.686.482-3.324 1.397-4.962 1.758-2.312.506-4.649.94-6.913 1.59-3.107.891-6.311 1.277-9.442 1.566-2.843.265-5.709 1.541-8.648.554-.409-.145-.53.313-.674.289-.651-.121-1.133 1.421-1.927.096-.241-.385-.651.843-1.133.699-2.842-.747-5.54.506-8.262.433a109.785 109.785 0 0 0-6.286.024c-3.445.121-6.865.41-10.31.458-.819 0-2.12.843-2.553-.747 0-.048-.241-.096-.313-.048-3.204 1.855-6.649.337-9.949.482-1.975.096-4.143.506-6.19-.072-2.048-.554-4.143-.145-6.239-.241-1.638-.072-3.204-.675-4.89-.747-2.433-.096-4.865-.458-7.298-.626-1.205-.072-2.024-.602-2.385-2.048l-.024.049Zm51.668.867c.072-1.397-.795-2.433-1.999-2.505-1.277-.073-1.903.867-1.975 1.806-.097 1.06.216 2.433 1.734 2.337.963-.049 2.288-.049 2.24-1.614v-.024Zm-13.85-16.356c.77.169 1.493.048 1.565-.819.073-.771-.65-1.012-1.276-1.084-.892-.12-1.157.554-1.301 1.229-.193.963.578.578.987.674h.025Zm50.849 5.926c-1.253-.073-2.289-.169-3.324-.193-.362 0-.843.169-.603.747.121.289.506.819.627.65.843-1.108 2.36 0 3.3-1.228v.024ZM81.296 388.1c-.12-.53-.578-.964-1.06-1.108-.289-.073-.867.409-.747.915.097.409.048 1.036.867 1.036.603 0 .771-.338.964-.843h-.024ZM171.167 111.742c-1.397 1.084-2.216-.265-3.035-.77-1.975-1.181-3.734-2.698-5.588-4.047-.771-.554-1.711-.506-2.578-.626-.915-.121-1.18-.627-1.59-1.422-.77-1.445-.818-2.914-1.083-4.432-.145-.915-.868-1.686-.554-2.794.722-2.36 3.372-5.588 5.877-5.082 3.228.674 6.672 1.445 8.599 4.335.723 1.084 1.59 1.253 2.409 1.759 2.818 1.782 5.805 3.227 8.527 5.251 1.445 1.06 3.685 1.686 5.299 2.794 2.409 1.662 5.155 2.722 7.419 4.649.892.771 2.144 1.108 3.156 1.758 2.842 1.831 5.323 4.143 8.069 6.143 1.494 1.084 3.18 1.879 4.649 3.059 2.867 2.336 5.902 4.432 8.792 6.72 2.65 2.096 5.564 3.878 8.383 5.757 2.264 1.494 4.287 3.373 6.479 5.035 1.855 1.397 3.806 2.721 5.54 4.215 2.505 2.168 5.396 3.734 7.997 5.685 1.879 1.397 3.999 2.673 5.998 3.974 1.325.867 2.794 1.566 3.999 2.722 1.06 1.012 2.288 1.999 3.589 2.722 1.758.987 3.3 2.264 4.649 3.637 1.301 1.325 3.083 1.831 4.312 3.204 1.252 1.445 3.275 2.168 4.456 3.517 1.59 1.83 3.709 2.866 5.419 4.504 1.759 1.686 3.373 3.493 5.107 5.203.964.963 1.108 2.192 1.012 3.276-.313 3.011-2.096 5.323-4.264 7.347-.771.698-4.6.385-5.949-.265-2.722-1.277-5.324-2.722-7.805-4.408-1.83-1.229-3.709-2.385-5.492-3.662-3.974-2.866-8.334-5.154-12.26-8.117-3.084-2.361-6.504-4.312-9.467-6.769-3.348-2.77-6.913-5.227-10.165-8.093a43.386 43.386 0 0 0-4.48-3.469c-1.614-1.132-2.915-2.722-4.529-3.758-1.493-.963-2.577-2.36-4.167-3.227-1.734-.94-3.107-2.53-4.769-3.662-1.156-.795-2.24-1.71-3.372-2.409-2.915-1.782-5.782-3.709-8.359-5.877-1.927-1.638-4.697-2.264-5.901-4.793-1.494.216-2.313-.964-3.3-1.711-3.132-2.36-6.191-4.841-9.226-7.322-.554-.458-.939-1.132-1.277-1.783-.144-.241-.168-.481-.481-.602-3.493-1.445-6.215-4.047-9.202-6.215-.747-.529-.626-1.108-.795-1.902l-.048-.049Zm56.269 29.484c-.337-.699-.843-1.422-1.59-1.927-2.457-1.614-4.962-3.156-7.419-4.818-1.782-1.228-3.613-2.433-5.203-3.878-2.047-1.879-4.263-3.613-6.504-5.227-2.143-1.542-4.287-3.18-6.551-4.577-3.084-1.903-5.781-4.311-8.937-6.19-3.131-1.855-6.504-3.324-9.442-5.516-2.626-1.951-5.661-3.276-8.455-4.986-2.891-1.735-5.516-3.758-8.118-5.878-.746-.602-1.469-1.806-2.577-.024-.771 1.253-1.204 2.168-.048 3.18.915.843 1.951 1.565 3.035 2.216.602.361.795.578.409 1.228-.144.241-.53.675-.024 1.06.265.193.723.217.795.048.699-1.638 1.518-.217 2.264-.12 1.012.144 1.253 1.325 2 1.614 2.746 1.084 4.576 3.42 7.13 4.817 2.384 1.301 4.335 3.348 6.551 4.89 2.385 1.638 4.312 3.758 6.576 5.516 2.626 2.023 5.179 4.167 7.925 6.022 1.397.963 2.891 1.831 4.312 2.794 1.855 1.253 3.854 2.337 5.54 3.758 2.409 2.047 5.083 3.733 7.443 5.805 1.614 1.421 3.686 2.144 5.179 3.782.675.746 2.096 1.854 2.794 1.325 1.446-1.157 2.337-2.939 2.963-4.963l-.048.049Zm38.131 27.893c.024 2.12 1.156 4.095-.289 6.143-.265.361-1.229 1.132-.434 1.71 2.385 1.734 4.962 3.203 7.395 4.914 1.782 1.252 3.974 1.927 5.877 3.107.554.337 1.397.482 2.048-.458 1.349-1.854 1.228-3.661-.675-5.203-3.781-3.059-7.828-5.757-11.514-8.984-.578-.506-1.373-1.494-2.432-1.229h.024Zm-33.892-24.834a9.377 9.377 0 0 1-2.553 3.998c-1.084 1.012-.963 1.735.241 2.554 1.541 1.06 2.794 2.505 4.408 3.3.939-1.47 2.529-2.698 3.059-4.673.241-.916.41-1.301-.554-1.855-1.566-.94-2.987-2.144-4.601-3.324ZM147.585 201.106c-6.528.048-12.188-.892-17.415-3.493-2.457-1.228-4.697-2.963-6.793-4.769a39.366 39.366 0 0 0-6.889-4.746c-2.987-1.614-5.95-3.468-9.394-3.878-3.445-.433-6.937-.289-10.406.145-5.251.65-10.382 2.216-15.705 2.071-4.866-.144-9.587-.698-13.706-3.757-4.914-3.638-8.214-8.287-9.298-14.333-1.228-6.961-.843-13.826.77-20.739.7-3.035 1.277-6.142 1.831-9.226.193-1.084.94-1.71 1.518-2.529 1.277-1.83 3.276-2.071 4.793-3.179 3.686-2.674 7.829-2.867 12.237-2.457 6.166.578 11.273 3.589 16.5 6.431 4.24 2.288 8.021 5.299 12.213 7.636 2.577 1.445 5.299 2.457 8.334 2.818 3.637.434 7.178-.265 10.743-.53 4.023-.313 8.021-.192 12.02-.289 4.215-.096 8.503-.072 12.622 1.012 6.72 1.758 13.079 4.408 18.764 8.503 4.432 3.179 5.877 6.889 4.528 12.285-1.083 4.311-2.408 8.527-4.191 12.621-.963 2.192-1.541 4.601-2.071 6.962-.747 3.493-3.059 5.781-5.589 7.973-4.625 3.998-9.972 5.829-15.392 5.516l-.024-.048Zm-87.149-38.589a17.59 17.59 0 0 0 .169 4.047c.843 5.372 3.251 9.78 7.756 12.935.843.578 1.59 1.325 2.48 1.783 3.951 2.023 8.19 2.216 12.502 2.023 1.927-.096 3.758-.578 5.637-.819 4.312-.554 8.6-1.397 12.983-1.518 3.782-.096 7.491.217 11.008 1.783 4.601 2.023 8.913 4.552 12.743 7.828 4.528 3.854 9.635 6.456 15.584 7.154 4.36.506 8.816.964 13.056-.505 4.841-1.687 8.696-4.842 10.791-9.66.891-2.023 1.301-4.263 2.048-6.359 1.878-5.179 3.805-10.333 4.913-15.753.41-2.072.073-3.902-1.71-5.396-1.686-1.421-3.348-2.818-5.299-3.854-3.661-1.975-7.467-3.637-11.345-5.058-5.733-2.096-11.731-1.807-17.681-1.951-5.949-.145-11.875.747-17.8.939-4.192.145-8.022-1.06-11.683-2.842-4.071-1.975-7.443-5.107-11.442-7.275-4.769-2.601-9.394-5.419-14.886-6.407-4.649-.843-8.84-.506-13.104 2.096-2.794 1.71-4.07 3.324-4.432 6.696-.722 6.721-3.227 13.224-2.312 20.137l.024-.024ZM35.481 100.731c-.12 3.54.41 6.865-.096 10.165-.217 1.445-.362 2.842-2.216 3.179-1.903.361-2.794-.626-3.59-2.168-.818-1.614-1.83-3.131-2.794-4.673-.24-.361-.578-1.132-.89-.891-.507.409-1.205.578-1.543 1.325-1.06 2.336-3.083 3.83-5.275 4.914-1.493.722-2.48-.241-2.866-1.831-.482-2.072 0-4.095.096-6.118.073-1.614-.867-2.024-1.999-1.711-2.264.627-4.336-.144-6.48-.457-1.734-.241-2.625-1.494-3.01-3.06-.241-.939-.025-1.806 1.011-2.432 1.638-.988 3.348-1.807 5.179-2.24 1.59-.386 1.566-1.157 1.012-2.289-1.494-2.962-3.035-5.901-4.48-8.888-1.205-2.505-2.313-5.082-3.47-7.612-.312-.698-.288-1.445-.192-2.168.12-.77 1.06-1.517 1.325-1.276 1.18 1.084 2.264-.458 3.42.12 1.132.578 2.096 1.373 3.084 2.12 2.77 2.047 5.54 4.119 8.238 6.263 1.035.843 1.348.505 1.493-.578.313-2.433 1.3-4.746 1.71-7.13.29-1.638 1.012-3.132 1.18-4.794.12-1.156 1.951-2.939 3.035-2.939 1.542 0 2.24 1.06 2.554 2.337.915 3.806 2.264 7.491 2.65 11.418.144 1.445.602 2.697 2.673 2.553 1.614-.12 3.252-.458 4.914-.145 2.072.41 4.143-.433 6.19.024.868.193 1.831.193 2.169 1.277.337 1.132.409 2.216-.723 3.011-1.927 1.373-4.215 1.975-6.335 2.963-.386.192-.386-.048-.506-.362-.169-.385-.843-.216-.819-.048.217.94-1.132 1.59-.145 2.843 1.687 2.143 3.734 3.974 5.107 6.359.337.602.819 1.132 1.108 1.734.554 1.132 1.614 2.313.482 3.613-1.18 1.349-2.867 1.566-4.408.988-1.903-.699-3.686-1.759-5.516-2.674a42.21 42.21 0 0 1-1.325-.698l.048-.024Zm-4.07 5.588c-.434-2.457-.218-4.721-.675-6.962-.313-1.517.192-2.962 1.614-3.757 1.397-.771 2.794-.048 3.974.626.723.41 1.445.867 2.216 1.204.217.097.337.771.747.217.217-.289.144-.506-.048-.746a29.046 29.046 0 0 1-1.06-1.35c-.964-1.204-2-2.384-2.843-3.66-1.18-1.783-.89-3.132.723-4.505.506-.434 1.205-.65 1.542-1.325a6.303 6.303 0 0 0-1.903 0c-4.745.723-6.504-.723-7.106-5.54-.24-1.903-.77-3.758-1.18-5.637h-.434c-.024 3.011-1.325 5.757-1.71 8.72-.169 1.35-1.036 2.65-2.264 3.204-1.229.53-2.53.024-3.662-.867-2.746-2.144-5.588-4.216-8.406-6.287-.169-.12-.241-.626-.627-.265-.313.313-.216.626.12.867.772.53 1.06 1.445 1.205 2.192.217 1.084 1.253 1.903 1.18 2.794-.096 1.204.892 1.397 1.205 2.096.602 1.325 1.782 2.529 1.18 4.215-.217.626.386.506.627.723.722.674 1.902 1.084 1.83 2.312-.072 1.132-.698 1.855-1.782 2.313-1.084.457-2.096 1.084-3.156 1.638.891.24 1.71.168 2.505.144 2.915-.169 5.565 2.288 5.275 5.058-.048.434-.168 1.036.362 1.229.626.241.674-.385.915-.747.241-.385.578-.722.843-1.084 1.975-2.673 3.469-2.649 5.902-.433 1.132 1.035 1.325 2.649 2.866 3.589l.024.024ZM207.299 43.286c.12-1.132.433-2.264.361-3.372-.144-1.975 1.229-2.168 2.578-2.385.819-.144 1.276.458 1.469 1.157.506 1.806.65 3.637.723 5.516.12 2.529.939 4.938 2.095 7.13 1.036 1.999 3.107 2.625 5.251 2.77.795.048 1.831-.169 2.12.698.313.964.819 1.927-.265 3.132-1.301 1.445-1.566 3.54-2.072 5.444-1.011 3.902-1.3 7.948-2.456 11.803-.29.987-.964 2.336-2.457 2.12-2.433-.362-2.77-.868-2.963-2.988-.241-2.529-.819-4.986-1.518-7.419-.626-2.288-2.312-3.589-4.336-4.576-2.505-1.229-4.239-3.132-5.082-5.83-.169-.554-.145-1.228.482-1.18 2.047.12 3.276-.819 3.926-2.65 1.084-3.01 2.072-6.07 2.12-9.321l.024-.049Zm-.843 14.55c3.589 1.95 7.033 3.709 7.852 8.093.314-2.553 1.253-4.89 1.831-7.323.12-.554-.096-1.06-.602-1.3-2.288-1.084-4.071-2.722-5.516-5.203-.578 2.529-1.927 4.167-3.541 5.732h-.024ZM84.668 9.897c-.53-1.325.193-2.602.41-3.854.217-1.301 0-2.578.217-3.854.168-.94.337-1.952 1.59-2.192.963-.193 3.058 1.95 2.697 3.107-.385 1.276.458 2.77-.722 3.902-.12.12-.073.626.072.819 1.517 2.047 1.686 4.673 2.987 6.793.265.457.457.65 1.06.53.89-.169 1.806-.362 2.746.192.939.53 1.18 1.301.794 2.12-2.697 5.974-4.119 12.309-5.708 18.62-.29 1.084-.627 2.601-2.144 2.674-1.71.072-2.53-1.036-2.698-3.108-.361-3.878-1.132-7.66-2.963-11.104-.891-1.686-2.264-3.228-4.046-4.023-2.072-.94-1.759-2.866-2.168-4.48-.169-.626 1.06-1.204 1.638-.867.096.048.264.12.313.072 1.445-1.084 4.215-.217 4.48-3.035.024-.337.193-.578.482-.65.94-.217 1.3-.723 1.011-1.687l-.048.025Zm3.927 16.716c1.156-2.36 1.662-4.624 2.432-6.768.217-.602-.144-1.084-.602-1.253-1.47-.626-2.433-1.734-3.203-3.059-.41-.674-.988-.77-1.253-.024-.289.795-.867 1.204-1.373 1.758-.747.82-1.012 1.494.24 2.481 2.048 1.614 3.012 4.071 3.783 6.865h-.024ZM6.022 167.388c-.434-1.565-1.253-2.746-2.072-3.878-.722-1.011-.674-2.288-1.349-3.324-.41-.626-.072-1.373.554-1.806.65-.458 1.325-.603 2.048-.073.698.53 1.204 1.253 1.638 1.976.554.963.795 1.228 1.541.096 1.012-1.469 2.602-1.204 3.373.506.554-.723 1.06-1.397 1.878-1.903 1.47-.891 2 .313 2.53 1.012.385.505.843 1.686-.579 1.951-.264.048-.264.24-.216.361.963 1.999-1.084 2.529-1.927 3.42-.434.458-.554.771-.578 1.229a.924.924 0 0 0 .963 1.012c.843-.049 1.614.481 2.313.409 2.047-.241 2.48 1.349 2.432 2.505-.072 1.494-1.517 1.759-2.89 1.494-.313-.049-.65 0-.988 0 .747 2.071.506 2.746-1.204 3.589-2.024.987-2.553.746-3.469-1.614-.12-.313-.168-.675-.289-.988-.722-1.806-1.276-1.903-2.529-.433-.337.385-.65.843-1.036 1.132-.602.433-1.228.963-2.047.578-.747-.361-1.35-.867-1.35-1.807 0-.457.194-1.084-.505-.987-1.445.216-2.144-.771-2.216-1.759-.072-.939.988-1.662 1.807-2.216 1.228-.843 2.673-.554 4.215-.506l-.048.024ZM134.867 49.453c1.542.12 2.577 1.108 3.18 2.337 1.951 3.878 4.022 7.684 5.684 11.706 1.157 2.818 2.337 5.66 3.734 8.407.963 1.879 1.975 3.661 3.276 5.3 1.469 1.854 1.325 2.649-.482 3.95-1.084.77-2.577.264-3.493-1.398-1.108-2.023-2.336-3.998-3.203-6.166-.313-.747-1.132-1.349-1.59-2.168-1.012-1.758-1.927-3.661-2.987-5.275-1.517-2.337-2.505-4.914-3.878-7.275-1.108-1.927-1.638-4.095-2.192-6.238-.361-1.35.843-3.228 1.927-3.156l.024-.024ZM76.912 64.001c-.482 1.542-.723 3.42-.217 5.348.265.963.554 1.59 1.71 1.662 2.072.12 2.795 1.397 1.735 3.18-1.518 2.529-2.216 5.37-3.252 8.093-.313.843-.77 1.71-1.397 2.312-1.132 1.132-3.035.29-3.469-1.373-.626-2.36-.746-4.841-1.782-7.082-.434-.915-.675-2.047-1.879-2.24-1.18-.192.169-1.59-1.108-1.95-1.3-.362.072-1.277.024-1.952-.024-.53.602-.65.434-1.349-.241-.94.867-1.204 1.493-1.204 2.192-.048 2.602-.41 2.65-2.89 0-1.133.216-2.072 1.3-2.915.94-.723 1.88-.675 2.554-.362.843.362 1.276 1.421 1.204 2.77v-.048ZM113.381 109.432c-1.181-.217-2.409-.361-2.698-1.758-.289-1.421.409-2.24 1.686-2.915 3.396-1.782 7.25-1.999 10.767-3.396 2.024-.795 4.167-1.614 6.287-1.783.988-.072 1.397-1.06 2.433-.819.939.217 1.951.458 3.011.097.964-.338 1.734-.675 2.072-1.687.529-1.565 1.878-1.276 2.89-.963.819.24 1.229 1.156 1.132 2.24-.313 3.132-2.77 3.926-5.106 4.914-2.915 1.228-6.071 1.542-9.106 2.312-3.757.964-7.563 1.662-11.128 3.252-.723.313-1.542.362-2.264.53l.024-.024ZM135.011 86.98c-.554-.336-.819.025-1.373.483-.771.65-1.783.192-2.65-.313-3.42-1.976-7.033-3.59-10.743-4.963a397.197 397.197 0 0 0-10.622-3.805c-1.373-.482-2.12-1.325-1.855-2.746.241-1.277 1.662-2.144 3.107-1.71 2.939.89 5.95 1.541 8.768 2.986 1.734.891 3.734 1.494 5.54 2.385 1.831.915 3.854 1.397 5.637 2.288 2.481 1.253 5.299.82 7.804 2.048 1.18.578 1.156 1.47 1.084 2.095-.096.892-.963 1.831-2.023 1.494-.892-.29-1.711-.145-2.698-.217l.024-.024ZM231.868 100.373c-.409-.722.747-.506 1.036-.915 1.108-1.542 2.288-3.035 3.372-4.577.434-.626.891-1.95.602-3.107-.217-.94.289-1.758.482-2.626.289-1.276 1.469-1.084 2.216-1.59.578.892 2.023 1.205 1.927 2.53-.096 1.252-.217 2.577-1.228 3.517-.217.192-.506.337-.289.65.168.24.433.385.602-.048.53.313.53.94.65 1.421.265 1.06.964 1.542 1.831 2.072.891.553 2.023 1.252 1.349 2.746-.94 2.071-1.807 4.191-2.722 6.262-.217.458-.506.867-.53 1.421-.072 1.084-.867 1.422-1.783 1.614-.963.193-1.613-.192-1.999-1.035-.289-.627-.506-1.277-.722-1.927-.675-2-2.289-3.06-3.927-4.144-.674-.433-.626-1.3-.891-2.312l.024.048Zm8.118.651c-.94.096-1.012-1.18-1.927-1.205-.579 0-.916.795-.868.843.554.554 1.108 1.253 1.976 1.205.265 0 .795-.169.819-.843ZM162.832 20.113c0 .29.024.723-.096 1.085-.386 1.06.313 1.252 1.036 1.252.891 0 1.782-.169 2.673-.265.988-.096 1.903.169 2.313 1.132.361.891-.386 1.373-.819 2.072-1.012 1.614-2.529 1.493-3.878 1.42-1.277-.047-1.325.555-1.108 1.277.505 1.542-.434 2.554-1.084 3.686-.217.361-.482.289-.867.217-.94-.193-1.976-.193-2.217-1.421-.072-.458-.096-.916-.12-1.373-.072-1.157-.217-2.048-1.758-2.216-1.036-.12-1.831-1.108-1.783-2.24.048-1.036.795-1.663 1.855-1.88 1.06-.216 1.59-.794 1.445-2.023-.096-.891.121-1.83.217-2.746.048-.313.072-.626.554-.747.578-.144.554-.216.337-.722-.024-.072-.12-.097-.193-.145.097-.048.217-.072.314-.144 1.324-.795 2.119-.482 2.697.987.338.867.362 1.783.458 2.794h.024ZM27.315 12.887c1.277 1.132 2.65 1.035 4.168.843 1.541-.193 1.637 1.541 2.216 2.48.505.796-.458 1.35-1.06 1.687-1.35.795-1.71 2.312-.53 3.276.722.578.77 1.421 1.204 2.096.482.722-.433 1.565-.626 1.517-2.048-.361-2.842 1.518-4.24 2.264-.819.434-1.42.097-1.999-.41-.53-.457-.433-.915-.096-1.517.361-.65-.241-1.445.144-2.192.024-.072-.36-.457-.578-.506-.602-.12 0 .362-.216.506-.627.506-1.229.265-1.855-.024-.916-.41-1.373-1.108-1.036-2.023.53-1.397.915-2.867 2.216-3.902.626-.506 1.3-1.301.506-2.289-.265-.337-.097-.65.217-.89.265-.194.361.071.554.192.265.168-.265.963.481.65.458-.193.603-.602.338-1.108-.049-.096.072-.313.168-.626l.024-.024ZM202.914 198.583c0-.41-.072-.819 0-1.205.289-1.277-.12-1.71-1.421-1.397-.771.193-1.759.53-1.229-1.036.145-.409-1.011-.481-.554-1.565.53-1.253 1.181-1.735 2.361-1.59.819.096 1.036-.048 1.108-.964.12-1.445.506-2.89 1.493-4.095.265-.337.434-.963.916-.265.674.988.867-1.204 1.686-.192.578.722-.361 1.252.048 1.734.626.747.482 1.638.313 2.337-.313 1.276.265 1.3 1.181 1.348 1.18.073 2.456.073 3.179 1.229.41.65.602 1.469.072 2.096-.843 1.011-1.951 1.638-3.372 1.373-1.204-.241-1.686.313-1.397 1.493.337 1.349.289 1.421-1.06 1.517-.241 0-.554.193-.698.386-.169.265-.073.53.289.65.385.121.554.386.385.795-.169.41-.506.41-.867.434-1.783.168-2.602-.843-2.505-3.156l.072.073ZM33.241 202.535c-1.132-.771-2.023-.049-2.818 1.035-.626.892-1.47.313-2.168.169-.578-.121-.698-.723-.77-1.349-.17-1.277.65-2.746-.627-3.83.963-1.084.096-3.011 2-3.83.794-.337 1.228-1.662 2.047-2.385.843-.746 1.71-.746 2.384.097.265.337.602.722.988.891 1.517.65 2.023 1.71.987 2.963-1.18 1.397-.433 2.649-.048 3.926.41 1.397-.24 2.337-1.95 2.313h-.025Z" fill="#000"/><path d="M142.792 179.619c-6.985-.337-12.55-2.553-17.295-6.576-2.963-2.529-1.999-6.889 1.012-8.72 1.252-.77 2.601-1.686 4.36-1.638 1.854.049 3.589.314 5.371.843 1.662.506 3.18 1.06 4.601 2.144 1.542 1.156 3.396 1.855 5.034 2.867 1.205.746 2.361 1.59 3.493 2.457 2.987 2.312 1.807 6.287-1.204 7.322-1.927.675-3.903 1.542-5.372 1.325v-.024Zm.121-3.035c.722.265 1.927-.217 3.131-.578a2.93 2.93 0 0 0 1.855-1.759c.289-.794-.723-.987-1.205-1.421-1.132-1.035-2.457-1.734-3.781-2.505-2.65-1.517-5.565-2.481-8.19-4.167-1.903-1.228-4.408-.698-6.504.602-1.686 1.06-1.903 2.578-.506 3.927 4.095 3.902 9.129 5.419 15.175 5.877l.025.024ZM94.375 165.728c-5.106-.77-10.117-1.951-14.645-4.624-1.951-1.157-3.228-2.891-3.637-5.179-.193-1.108 1.397-3.276 2.938-3.999 1.903-.891 3.975-1.132 6.022-1.373 6.335-.747 11.659 1.759 16.043 5.853 3.781 3.517 2.866 6.239-1.831 8.431-1.421.675-3.132 1.132-4.866.867l-.024.024Zm-8.671-12.068c-1.614-.168-3.06.121-4.457.675-.819.313-1.782.554-1.903 1.662-.12 1.108.675 1.59 1.422 2.144 3.107 2.24 6.768 2.938 10.357 3.806 2 .481 3.999.819 5.998.313 1.06-.265 2.385-.482 2.818-1.662.434-1.181-.867-1.735-1.397-2.53-.265-.409-.77-.674-1.18-.987-3.517-2.553-7.563-3.228-11.682-3.421h.024Z" fill="#000"/></g></g></g><defs><linearGradient id="l" x1="7.134" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="c" x1="7.135" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="e" x1="7.135" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="f" x1="7.135" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="i" x1="54.69" y1="237.711" x2="160.821" y2="237.711" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="j" x1="7.134" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="k" x1="7.134" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="d" x1="7.135" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="m" x1="7.134" y1="17.016" x2="242.022" y2="17.016" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h286.488v400H0z"/></clipPath><clipPath id="b"><path fill="#fff" d="M0 0h286.475v400H0z"/></clipPath><clipPath id="g"><path fill="#fff" transform="translate(59.27 131.711)" d="M0 0h116.346v71.344H0z"/></clipPath><clipPath id="h"><path fill="#fff" d="M0 0h286.475v400H0z"/></clipPath><clipPath id="n"><path fill="#fff" transform="translate(59.271 131.715)" d="M0 0h116.346v71.344H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mr-pintaskbar.svg b/browser/components/aboutwelcome/assets/mr-pintaskbar.svg
new file mode 100644
index 0000000000..386af26d89
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-pintaskbar.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="341" height="400" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M311.144 181.613c1.216.332 2.576.708 4.036 1.083 5.306 1.371 11.785 2.831 16.395 3.162l1.659-2.211-6.634-4.975c-4.986-1.691-15.478-5.141-20.453-6.633a71.35 71.35 0 0 1 1.072-1.648l.034-.066c2.476-3.748 5.616-8.015 7.894-12.195.011-.011.022-.022.022-.033.884-1.603 1.636-3.206 2.155-4.743l1.537-3.98v-3.869c-1.227.276-3.781.829-4.975 1.105l-7.739 8.292c-.31.564-.719 1.338-1.194 2.211-.011.011-.022.022-.022.033-1.371 2.521-3.239 5.926-4.533 8.292-.343.631-.641 1.183-.884 1.626.066-2.19.199-6.258.32-10.083v-.122c.089-2.996.177-5.826.232-7.485l-.154-.464-.045-.122-4.223-12.128h-2.211c-.044.287-.122.818-.232 1.515-.465 3.007-1.393 9.076-1.825 11.763.012.011.012.022 0 .033-.066.476-.121.84-.154 1.062.11 3.582.431 13.93.552 17.689-4.3-7.319-10.945-25.097-18.794-29.298l-1.106 2.764c1.703 5.749 6.866 21.183 8.845 27.087-7.109-5.672-6.866-6.225-16.031-8.292l-.553 3.317 6.081 8.844 10.867 8.292.299.221.442.332c-.685.243-1.769.619-3.095 1.083-5.285 1.869-14.428 5.075-17.347 6.103l-4.986 5.528 3.869 3.87s.642-.277 1.603-.697c3.096-1.327 9.586-4.102 10.006-4.278 1.083-.719 2.587-1.725 4.102-2.731.011-.011.022-.022.044-.033.265-.177.531-.354.785-.52 1.26-.851 2.465-1.647 3.361-2.244-.022 3.537-.199 7.374-.409 11.299-.332 6.611-.719 13.51-.454 19.768.056 1.249.133 2.454.244 3.626l.066.685c.011-.022.232-.376.586-.928 1.493-2.3 5.252-8.082 5.495-8.469 1.094-3.416 3.14-9.751 4.522-14.505.066-.233.132-.465.188-.686.331-1.161.608-2.2.818-3.051 2.775 6.887 9.353 21.426 13.267 27.639h3.316v-9.95c-.066-.188-.176-.509-.32-.918 0 0 0-.011-.011-.022-.807-2.266-2.576-7.297-2.985-8.457-.045-.454-.122-1.272-.221-2.267l-.034-.365c-.022-.21-.044-.42-.055-.641l-.066-.674-.199-2.101-.266-2.764-.077-.774-.066-.707-.056-.608-.066-.708 12.714 13.82 10.172 6.423.331.21v-6.633c-4.013-8.392-12.261-18.419-18.242-25.429l2.753.719s.022.011.033.011Zm-17.18-1.78c-.155 5.683-8.923.453-4.732-3.162 1.945-2.211 4.997 1.227 4.709 3.162h.023Z" fill="url(#b)"/><path d="m89 4.422 2.21 37.037-7.186-1.659-8.292-4.975-6.08-1.105v3.317l7.739 5.528 10.503 4.422c-4.589 2.94-14.14 8.9-18.795 11.608l.552 2.764c5.628-2.023 17.28-4.732 23.218-5.528l2.211 11.056v12.715l4.422 9.397 3.87-11.609 1.658-9.397v-9.95c4.699 3.36 13.61 14.67 17.137 19.347l7.186 4.423-1.658-8.845c-3.041-4.666-8.867-14.461-11.609-19.348 5.849 3.417 17.789 10.072 23.77 13.267l1.106-2.764-11.609-10.503-12.161-8.291 18.795-11.056h-5.528l-17.69 5.527 6.634-22.664-2.211-4.422L102.266 39.8 88.999 4.42Z" fill="url(#c)"/><path d="m30.956 75.732 3.317-7.74 6.633 9.398-3.87 12.715-6.08-14.373Z" fill="url(#d)"/><path d="m40.906 24.875 3.87-7.186 4.422 7.186-4.422 9.95-3.87-9.95Z" fill="url(#e)"/><path d="m78.496 174.129 4.422-7.186 5.528 8.291-5.528 11.056-4.422-12.161Z" fill="url(#f)"/><path d="m25.285 293.607.143.465h-4.422l-2.764-1.659v7.187L6.633 285.78c.531-.277 2.698-1.349 3.273-1.636.077-.011 3.847-3.859 3.914-3.892v-7.186c3.261 1.603 12.692 5.97 14.925 8.844v2.211h-2.211l2.764 6.634-5.528-2.211 1.515 5.063Z" fill="url(#g)"/><path d="M67.993 279.699c-.132.243-3.195 6.401-3.317 6.634l-2.764-4.423-1.658 6.081-1.658 1.106-2.211-8.292-5.528 8.844-1.659-1.658.553-10.503-7.872 5.771-.42.31v-8.292c2.742-5.937 7.53-14.472 11.056-19.901l4.975 4.423h7.186c1.482 4.986 3.03 14.704 3.317 19.9Z" fill="url(#h)"/><path d="M184.632 42.566c.177-.232 4.721-8.546 4.975-8.292l7.187 7.186-6.634 17.69-5.528-16.584Z" fill="url(#i)"/><path d="m253.731 61.912 4.975-5.528 5.528 6.634-5.528 10.503-4.975-11.609Z" fill="url(#j)"/><path d="M145.484 385.483c-2.057.409-14.251 2.852-16.584 3.316-.221-.044-7.197-1.094-7.186-1.105-8.403-6.877-9.409-9.563-13.267-19.348a390.56 390.56 0 0 1 2.764-3.869l34.273 21.006ZM234.483 370.559a5164.892 5164.892 0 0 1-5.528 13.82c-2.366 2.532-5.362 5.749-7.739 8.292-8.148.298-24.654-.21-32.615-1.659l-11.056-2.211c-1.47-.741-4.046-2.012-5.527-2.764 2.454-3.914 6.887-11.697 8.291-16.031 1.537.332 9.873 1.858 11.609 2.211l11.056-1.658 13.82-4.422c10.503-.255 8.502-.144 17.689 4.422ZM197.391 220.499c-7.883 9.309-24.522 9.099-33.555 1.658-4.234-2.509 4.135-3.626 3.815-12.88 10.912 7.242 26.368-2.432 25.992 2.565-.431 3.704 4.665 5.716 3.748 8.646v.011Z" fill="#845B25"/><path d="M176.926 184.289c3.815-.033 7.319-1.979 9.917-4.676 3.184-1.924 8.126 4.92 15.611 1.747.542-.122 1.006-.487 1.283.42 1.039 5.881 7.761 5.362 7.816 8.104-7.319 22.753-41.061 30.425-54.704 8.811-6.158-11.973-6.324-7.076 1.614-11.852 6.335-1.437 1.095-5.55 11.465-2.543 4.411 1.327.31 2.223 6.589-.895" fill="#845B25"/><path d="M26.634 282.343c9.96-.443-4.633-9.232-7.33-10.857-2.875-1.249-5.385-2.808-7.817-4.776-7.485-3.35-14.218 4.754-10.381 11.708 2.554 5.13 22.244 34.284 16.694 12.438 1.868 1.647 6.28 3.681 7.584.973l-1.514-5.064 5.528 2.211-2.764-6.633ZM3.36 275.798c.32-2.831.774-6.921 4.522-6.081l-.022-.022c6.058-.542 3.759 8.8-.21 9.541-2.709.564-4.566-.044-4.29-3.438Zm20.044 5.716c.675 1.006 1.393 2.012 1.68 3.36-2.188-.608-3.637-2.133-5.538-3.128-4.82.508 3.25 6.456 3.494 8.844-3.14 1.46-7.375-7.219-8.392-2.885-.055 2.377 1.88 3.681 1.36 6.191-3.03-3.693-5.893-7.164-8.834-10.746 1.957-.465 4.246-.664 4.942-3.007 1.216-2.123 3.417-4.367 2.93-7.165-.243-2.476 12.051 5.694 11.974 7.308-1.581-1.514-6.103-1.735-3.616 1.228Zm44.721-10.515c.376-6.467-4.334-12.515-.619-18.441 2.963-8.402-9.066-14.56-14.925-8.513-1.803 1.946-.94 4.732-2.123 6.932a47.588 47.588 0 0 0-3.516 5.407c-4.92 8.877-18.297 37.191 2.908 19.325l-.553 10.503 1.658 1.659 5.528-8.845 2.212 8.292 1.658-1.106 1.658-6.08 2.764 4.422c2.786-4.776 3.87-7.971 3.35-13.555Zm-14.384-20.928c.266-1.902.012-4.434 2.698-4.069 3.04-.343 7.618-.707 8.458 3.228 2.023 8.834-10.68 7.485-11.133.863l-.023-.022Zm10.105 30.425c-1.282-3.095-1.227-5.837-1.392-8.966-.078-2.001-2.798-1.249-2.566.52.166 3.515-.884 6.832-1.625 10.613-1.68-3.615.144-6.887-1.028-10.359-2.919-4.069-4.964 10.216-7.22 11.885.166-4.677 1.051-9.209 2.5-13.632.762-1.271-.708-2.808-1.681-1.426-3.571 2.941-5.362 7.065-9.597 9.574 2.035-8.712 6.048-16.307 10.105-24.046v.022c4.235 7.242 11.045 3.306 11.686 5.329.962 6.921 2.61 13.466.818 20.486Zm47.364 83.98-1.625 2.267c.585.73.176.862-.266 1.017a7.716 7.716 0 0 0-.763.851c3.77 9.663 4.942 12.35 13.157 19.083l.619.099v-.022c1.802-1.238 5.406.221 5.793-1.879-.11-.94-.365-2.057-1.813-1.891-2.875-.022-5.495 2.311-7.916-.188 1.725-1.625 5.495-.133 6.291-2.023.066-1.117-.984-1.67-1.913-1.703-1.658-.088-3.405-.409-4.986.564-1.205.741-2.134.022-3.25-.674 1.37-1.559 8.833.365 7.263-2.399-.608-.42-1.094-1.371-1.99-.885-.696.354-.906-.442-1.537-.354-1.293.188-2.62.078-3.924.078-.398 0-1.007.376-1.117-.299.497-1.625 8.292-.155 4.599-3.239-2.211-2.045-6.092 1.437-7.33-1.349-.033-6.866 28.159 12.714 31.708 14.605l3.273-.652-34.273-21.007Zm114.516 22.853c-1.404.531-6.169 0-6.235 1.603.431 1.736 2.719 1.05 4.057 1.238l2.698-2.885c-.166.022-.343.033-.52.044Zm-1.26-3.649c-1.25-.287-2.001.487-2.93.885-.464.21-.044.619 0 .929.088.608.564.608 1.028.608h4.776c.354-.398 1.858-1.825 1.88-2.388-1.626.442-3.173.342-4.754-.034Zm2.145-3.891c-1.394-.022-4.677-.487-4.821 1.448 1.592 2.045 5.716.033 8.193.564l.95-2.355c-1.448.177-2.852.464-4.322.343Zm4.72-4.588c-2.741.486-8.358-2.532-9.054 1.47 1.757 1.835 6.777-.332 9.342 1.05.221-.552.774-1.934.984-2.465-.409.011-.863-.044-1.272-.055Zm.697-5.871-4.909-2.454c-17.678-1.051-28.303 11.741-46.81 3.128-2.156 5.617-3.859 11.565-7.75 16.308l2.819 1.404c4.068-4.024 5.395-9.165 6.512-14.539 17.114 10.072 35.279-11.464 51.675-.32l.884-2.222c-.752.044-1.592-.708-2.421-1.305Zm102.919-188.436c-6.512-7.12-16.96-10.392-26.424-11.31 4.146-7.805 13.864-17.656 12.549-26.766-8.359-4.478-15.843 10.282-19.89 16.197-.265-7.883.896-16.717-1.725-24.301-8.258-12.327-11.619 19.912-9.43 24.024-.863.144-.829-.42-1.039-.773-3.748-7.364-6.921-15.191-12.67-21.316-12.339-6.368.32 21.26.674 25.771-4.212-2.83-16.108-8.69-13.919 1.415 3.56 6.534 9.497 11.023 14.903 15.943-36.363 10.182-22.101 27.827.133 9.618-.255 10.36-2.256 21.659.044 31.885 6.567 4.821 11.232-15.08 12.504-19.535.431-1.172 1.293-2.377.652-3.627 0-.044.177-.188.277-.232 1.979 2.488 2.542 6.965 3.781 10.149 10.536 30.271 19.458 14.815 9.961-7.617.077.088.144.177.221.265l-.862-8.999 12.714 13.82 10.171 6.423c6.037-6.799-10.237-25.793-15.235-31.244 4.257.63 26.192 10.57 22.61.21Zm-24.356-3.958c-10.824-2.808-1.316 4.788 1.47 7.894 5.417 6.877 13.389 15.434 13.289 24.279-4.29.21-28.325-31.045-27.429-21.858 4.245 10.57 8.988 21.758 8.037 33.378-6.081-9.674-9.74-20.553-13.344-31.31-.011-2.145-2.875-3.582-3.206-.829-.841 10.414-3.295 21.161-8.646 30.204-1.227-2.111.951-9.066-1.791-8.778 2.399-1.349 1.47-3.328 1.603-4.975-.73-4.622 6.435-32.128-3.693-18.364-4.588 4.113-11.863 8.878-17.954 6.777 1.669-3.261 7.109-4.632 10.337-6.501 4.279-2.62 11.1-3.361 14.019-7.197-.056-.785-.31-1.437-1.283-1.813-7.02-2.852-12.836-8.469-16.042-15.334.055-3.616 16.075 6.611 15.733 9.795.652.984 1.282 1.327 2.189.542.453-.376.674-.078 1.028.066 1.05.332 1.935-.586.984-1.437-2.477-2.466-4.898-4.467-5.285-8.104-2.233-7.396-4.444-14.826-6.103-22.366 4.146 1.216 19.481 38.961 19.37 25.804-1.172-10.005-2.344-20.331.84-30.116 1.791 8.933 2.632 17.767 2.952 26.844-.232 1.957.841 6.777 3.052 3.372 3.383-8.281 8.413-16.252 15.92-21.349 3.007-1.072-3.184 9.044-3.726 10.271-18.419 27.993-4.544 9.342 18.486 25.649-7.032 1.117-13.909-3.184-20.807-4.544Z" fill="#010101"/><path d="M333.124 241.016c-8.558 1.847-12.781 10.581-17.038 17.347-6.6 11.443-19.347 16.374-27.153 26.744 4.898-12.305 15.445-21.968 21.935-33.643 11.819-17.103 6.567-38.585-3.892-54.395 5.44 3.538 13.61 18.276 20.598 14.859l-10.172-6.423-12.714-13.82.862 9c18.895 27.219 6.136 48.734-13.068 70.193 1.482-8.988 1.139-19.569-2.377-28.369-2.399-7.662-11.542-20.365-19.745-11.476-9.486 15.003 17.435 32.482 16.318 45.196.409 10.558-8.535 19.392-7.64 30.448.21 10.414.995 20.785 5.827 30.237.696 2.731 7.65 14.373 5.03 15.158-12.393 2.366-25.074 4.876-37.744 4.19l-.067-.232c8.425-5.904 13.455-13.764 16.109-23.648 4.046-10.227-3.671-24.224-15.523-21.416-.641.133-.807-.508-.265-.707 3.339-2.808 4.124-7.496 5.13-11.498-.299-16.694-12.88-31.432-20.1-46.059-3.902-6.943-1.47-18.297-10.083-21.669-1.879.144-3.77.044-5.251-1.161-8.524-5.981-21.404-5.362-26.623-15.368-3.206-3.261 9.862-5.948 11.642-10.89 1.283-1.492 5.34 3.383 11.156 1.67 4.521-.763 8.501-2.62 10.901-6.866.276-.508.552-.597 1.16-.597 12.405.929 16.44-14.66 14.782-24.533-.088-.674.044-.962.586-1.26 7.971-4.555 7.518-17.69 1.603-23.859-.332-3.051 1.846-6.589.586-10.282-2.863-13.355-18.275-11.398-17.601-14.693 2.51-6.136-2.178-12.869-5.771-17.711-6.346-7.761-16.783-14.572-26.965-12.15.122 1.392-.144 1.238-.818.276-3.394-.453-4.876 4.864-8.17 5.196-3.24 1.017-3.837 1.371-5.727-1.382-4.854-6.667-15.821-15.976-24.257-14.384-12.272 4.379-20.122 15.246-25.384 26.656-2.941 2.443-7.783.564-11.454 1.88-7.474 1.293-13.919 6.113-17.081 13.045-6.015 15.998 7.219 29.553 12.006 43.892.398.929.288 1.47-.254 2.278-3.306 4.82-3.936 10.171-2.565 15.71 2.587 9.375 9.906 19.602 20.465 19.834 3.372 1.382 8.8-1.802 10.359-.133.962 1.416 2.311 2.366 3.969 2.72 4.157.652 9.143.896 12.338-2.355.697-.741 1.073-.11 1.46.288 1.359 1.901 3.504 3.405 4.897 5.019-.442 2.255-1.05 4.356-3.106 5.804-.575.409-1.161-.287-1.559.365-7.43 6.446-19.182 5.119-28.148 8.922-2.93.929-5.915 1.813-8.403 3.958-1.514 1.316-2.697 3.251-5.052 3.483-.807.077-1.537.674-2.278 1.139-8.402 4.278-6.047 10.06-9.11 17.479-.387 2.996-3.991 5.904-3.438 8.988 0 .044-.144.166-.166.166-1.238-.564-1.238.719-1.448 1.183-4.235 11.885-14.926 25.627-7.607 38.109-16.042-3.007-24.113 4.091-23.914 20.155 2.311 10.371 8.536 19.149 15.412 27.12-10.746-1.105-21.912-.564-32.294 1.039-1.88-1.072-4.323.222-6.556.421-4.102 2.41-1.758-16.739-2.211-19.459 1.16-39.159 5.638-6.5 22.554-42.156.53-7.307-18.298 10.216-19.514 12.969 1.15-5.771 1.449-11.432 4.356-16.529 1.825 3.914 5.937 3.361 6.501-.84 5.406 4.754 6.313-1.636 6.645-6.103l-3.229 6.468-2.764-4.422-1.658 6.08-1.658 1.106-2.212-8.292-5.527 8.845-1.659-1.659.553-10.503-7.872 5.772c2.023-.553 3.394-2.035 5.064-3.428.276 2.433-1.117 11.034 2.233 11.631 1.537-.299 1.04.398.884 1.194-1.448 7.673-2.542 15.379-3.56 23.129-3.172-10.127-8.225-20.122-17.302-26.18-.398-.266-1.105-5.186-.619-5.484h-2.045l2.764 6.633-5.528-2.211 1.514 5.064c.465-.586-.298-1.758.1-2.466 5.815 3.793 11.288 8.535 13.853 15.103 2.82 6.545 7.451 14.074 5.472 21.227-1.846-11.277-13.664-20.918-24.731-22.09-1.128 0-2.167 1.581-.863 2.035 1.415.74.277 1.348.675 2.421 1.79 3.106 2.41 7.164 5.218 9.497 2.786 7.584 10.591 16.738 19.558 13.886.01 6.368-.177 12.493.785 18.695.21.785-.177.995-.929 1.095-5.174.243-9.994 3.35-15.102 1.625-.653-.155-1.26-.066-1.382.486 6.534 10.194 25.041-1.625 35.157-.641 10.526-.331 21.913-2.465 31.708 2.234 4.434 4.289 9.276 9.22 14.683 11.807l1.625-2.266 34.273 21.006-3.273.652c.332.21.719.42.752.829-6.744 1.968-14.66 3.77-21.249.73-8.226-6.733-9.387-9.442-13.157-19.082-2.951 3.427 1.957 6.202 3.107 9.264.232.31.586.52.498.984-.376 2.256 1.039 3.262 2.808 4.047 1.459-.067-.675 2.609 3.107 3.703.972.376 1.835.631 1.835 1.935 1.736 3.781 7.009 3.173 10.403 3.582 4.898-.331 9.707-2.012 14.506-3.117.984-.443 1.68-.21 2.465.398 17.413 11.652 11.73 15.92 25.727 1.138 1.006-.564 1.537.763 2.399 1.017 13.953 4.567 29.033 5.528 43.637 4.71 6.767-.011 12.803-9.077 14.871-14.693-.653-.763-.067-1.205.022-1.813.088-2.023 1.249-3.306 2.399-4.754-.232-2.09 1.382-3.251 2.476-4.555 2.51-1.935 9.707-13.698 12.383-10.658 2.211 0 11.354 1.902 11.542-.774.089-.895 1.703-1.437 1.471.044 1.547 3.173 12.968-.696 16.55-.829 7.64-1.979 15.478-2.41 23.052-4.146 5.052-4.997-5.407-3.427-7.872-2.731-8.756-13.421-16.274-32.172-12.571-48.612 4.721-9.21 15.423-12.548 23.87-17.391 9.43-5.539 19.889-10.459 25.882-19.978 4.488-5.881 13.123-24.654 0-24.367Zm-115.313-72.714c3.439-1.559 5.196-6.755 2.753-9.729-.851-.608.21-2.344 1.117-1.415 1.514.995 2.675 3.648 2.233 5.793-.752 7.242-10.205 9.674-6.103 5.351Zm-105.417-40.641c-1.006-.011-1.194-1.382-.166-1.581.774.155 1.36 1.658.166 1.581Zm-46.678 163.98c-1.05 5.915-9.972 15.058-14.56 15.014 3.261-6.556 9.176-10.338 14.56-15.014Zm-24.588 38.054c-8.889-3.527-13.787-13.61-17.645-21.714l.022-.022c5.583 2.189 10.337 5.396 14.174 9.851 1.558 1.99 9.32 12.073 3.449 11.885Zm187.717-17.988c1.802-4.09 1.028-21.116 4.588-20.785 6.678-1.415 5.97-5.406-.884-2.532-.509-7.009 2.631-13.853 1.868-20.608-.984-1.094.763-.995.641-1.879-.177-2.355.619-4.577.454-7.153 6.777 14.649 30.635 46.103 4.831 53.753-2.112.343-3.759 1.935-6.092.741-1.139-1.205-5.152.254-5.406-1.537Zm-.166 6.125c.409.066.829-.276 1.36.055-.398.752-1.305 1.117-2.012 1.084-.343-.487-.067-1.404.652-1.139Zm-17.225-212.791c.586-.31.21-1.305 1.006-1.416.409-.033.829.432.697.487-.63.387 0 1.503-.929 1.581-.42.044-.862-.608-.774-.652Zm-30.503 33.609c3.494-7.639 16.042-3.527 15.556 4.511-.299.697-.166.398-.841.188-1.647-.509-1.481-2.112-2.167-3.14-1.459-2.145-3.736-3.538-6.257-3.538v-.022c-3.394-.508-4.666 4.82-6.468 3.98-.707-.486-.309-1.138.177-1.979Zm-3.925 26.048c-.276 1.769-2.664.774-3.891.995-5.716.94.309 7.076-2.355 8.126-1.99.11-2.079-5.218-2.145-6.799 0-2.875 2.83-3.538 5.318-3.328v-.022l.022-.022c1.05.066 2.885-.443 3.051 1.05Zm-15.577-48.027c1.05-3.084 4.057-3.67 6.843-4.157l-.022-.022c1.703.619 8.126 2.488 6.954 5.064-.641.497-1.094.541-1.503 0-6.711-7.164-12.991 3.184-12.272-.885Zm-22.377 75.136c-2.886 1.946-7.872-3.405-8.126-6.324-1.371-1.968-3.063-8.259.53-8.613.708.255.542.929.398 1.261-1.415 3.46.818 6.169 1.979 8.999.442 2.698 5.506 2.432 5.219 4.677Zm14.825-49.32c-5.992-7.806-16.815-2.853-15.522 6.589-.321 1.183 1.139 4.433-.442 5.141-.84.166-1.028-.575-1.194-1.349-.796-5.207-1.15-11.951 4.289-14.66 1.04-.332-.342.84.465.862.398.067.398-.519.398-.818 2.919-3.117 8.137-2.388 11.807 1.028.808.852 2.941 1.803 1.791 3.207-.563.586-1.116.398-1.592 0Zm6.225 57.103c-5.174-11.067-6.91-6.324.906-10.591.885-.642 2.764-.885 3.516-1.869.564-3.781 10.957.31 12.637 1.824 4.5 3.958-2.874 15.379 5.937 15.633l.044.056c2.775.033 8.06-4.312 5.76-6.899-1.116-.443-2.443.077-2.686 1.138-.409 1.637-1.603 2.189-3.041 2.521-3.117-.718-.232-8.424-1.592-11.222.277-1.37-2.719-3.626-1.017-4.068 2.698-.376 4.588-2.145 6.49-3.847 3.085-1.648 7.275 4.477 14.041 1.592 1.78-.752 1.647 5.085 7.363 6.323 2.775 1.803-1.647 7.253-3.195 8.967-11.211 14.892-34.373 16.805-45.163.442Zm7.872 19.901c1.536-2.057 2.531-5.329 2.023-7.076l.022-.044c6.457 2.808 13.577 3.88 20.298 1.37 1.029-.398 1.405-.055 1.515.885.232 2.366 1.603 4.19 2.676 6.235-4.777 4.644-11.565 6.258-17.922 4.356-1.99-.785-11.575-2.896-8.612-5.726Zm-37.657 13.797h.056c9.939-5.904 22.321-4.411 32.172-10.337.553-.42.84-.232 1.261.122 9.043 8.336 25.074 8.911 33.631-.188.244-.42.454-.299.664-.089 2.134 2.3 5.163 2.842 7.883 3.98 3.427 1.725 8.579 2.609 11.409 4.213-7.706 1.05-16.573 1.293-24.511 1.647-.375-.21-.674.077-.928.287-.288.255.53.929-.288 1.04-.575.055-.508-.807-.951-.841-1.26-.132-2.564-.387-3.792-.177-1.581.255-3.327-.497-4.732.719-11.31-1.216-23.106 1.039-34.549-.298-.42.11-1.072-.266-1.238.508-.045.133-.111.299-.277.133-4.853-2.444-10.204.066-15.754-.719l-.1.067.044-.067Zm36.142 97.413c16.551-1.338 33.532.21 49.652-3.306-13.82 11.089-28.049 21.194-44.467 27.751-1.116.431-1.979.254-2.908-.885-7.042-8.214-14.107-16.495-21.746-24.19 6.456.21 12.968.42 19.469.63Zm-5.34-49.95c.166.652 1.282 1.072.464 1.979-.32.343-.32.11-.508-.022-1.028-.653-.022-1.283.044-1.957Zm8.568-10.636c.553-1.249 1.139-4.864 2.985-4.079.144.099.509 0 .719-.111 9.829-5.229 11.045 27.706-.299 20.044-4.101-3.593-4.378-10.746-3.405-15.854Zm18.773-35.522c1.017-.232 1.67.121 1.835 1.448-.818-.254-1.746.785-2.332-.398-.255-.508 0-.929.497-1.05Zm-89.453 55.843c2.267-7.275 6.789-14.174 8.546-21.393-.497-1.095 1.338-.089 1.349-1.449.299-1.083.321-2.189 1.183-3.073.232-.254.863-.973.078-1.526-.056-.033-.078-.376-.045-.376 1.316-.608 1.316-2.1 2.068-3.073 1.758-2.499 1.061 4.776 1.879 5.605.631 1.703.233 3.472.819 5.13.541 1.581-.343 3.604 1.448 4.831-1.415 2.466-.254 4.942-.542 7.64l-.044.044c-1.404-1.526-4.82-2.465-3.45.42.697 1.239 2.234 1.791 2.897 2.985 2.466 6.38 2.278 13.875 3.671 20.686-.94 1.868-5.429-.885-7.12-1.327-6.711-2.056-13.466-7.44-12.737-15.124Zm143.538 68.712c-4.986 2.708-9.906 6.379-15.445 7.728l4.909 2.454c-.409-.287-.608-.398-1.083-.685 3.405-1.913 7.064-3.107 10.525-4.821-2.355 1.99-4.478 5.418-7.021 6.811l-.884 2.222c.984.741.309 2.565-.962 2.399-.21.52-.763 1.924-.984 2.466 1.106.309.232 1.824-.686 1.724l-.95 2.355c1.802.033.63 1.924-.763 1.913-.022.564-1.537 1.99-1.88 2.388h.885l.022-.022v.022h-.022c-.641.774-1.25 1.072-1.979 1.183l-2.698 2.885c.586.023 1.183.056 1.78.122-8.469 7.651-20.564 1.946-30.636 2.112-5.494-.509-15.677-.951-19.314-4.688l-2.819-1.404c-2.2 2.421-7.861 10.813-11.233 9.143-9.563-7.374-19.867-13.665-29.818-20.508-14.007-9.508-31.542-14.638-41.326-29.376-5.55-8.236-13.986-16.219-13.787-26.832.221-8.723 6.247-15.998 15.456-15.158l-.022.022c10.448 1.261 19.27 7.662 29.552 9.763 10.68 7.993 21.15 16.517 30.304 26.39 8.104 9.939 16.584 19.657 24.843 29.419 1.979 1.736 2.145 3.549 1.846 5.473l1.935-4.643 2.532.486c-1.537-1.017-12.184-11.808-8.757-12.117 15.158-6.446 29.132-15.445 41.637-26.092 10.458-9.497 32.028-21.924 46.18-16.241 13.919 15.721-5.628 35.191-19.337 43.107Zm41.294-97.944c-34.107-44.864 12.349-36.385 6.246 10.492l-.022.022s0-.033.011-.055c-1.614-3.881-3.869-7.197-6.235-10.459Zm51.94-10.182c-6.954 20.973-29.364 31.277-47.805 40.431 0 .011-.011.011-.011.022h-.023c4.29-10.282 16.131-13.798 23.074-21.78 5.307-4.975 9.795-10.68 12.803-17.347 3.239-6.191 15.997-15.4 11.962-1.326Z" fill="#000"/><path d="M284.643 87.01c.619-35.545 45.517-37.049 53.787-4.523 9.63 46.026-52.648 49.199-53.776 4.511l-.022.022.011-.01Zm41.205 1.116c7.419-4.621 11.034-10.26 4.025-17.159-1.205-1.47-7.452-8.214-8.734-6.102-.233 2.852-2.786 5.306-3.162 7.75 3.372 4.72 5.881 10.05 7.849 15.544l.022-.022v-.011Zm-27.562-3.427c.52 3.36-.11 9.84 2.488 12.062 2.808-.553 11.255-.597 12.15-3.14-1.448-4.81-2.211-10.88-4.754-14.826-8.612 2.83-9.917-2.123-9.851 5.893h-.022l-.011.01Zm-8.922-9.873c-2.078 5.782-3.991 13.035-1.371 18.695 3.007 1.515 6.147 2.654 9.663 2.952-1.349-5.384-1.902-10.69-1.47-16.175.044-.762-.133-1.094-.951-1.348-2.322-.719-4.334-1.957-5.849-4.146l-.022.022Zm45.185 28.601c3.472-6.445 3.56-16.174.984-21.813-2.576 2.94-4.621 6.17-8.104 8.082-.74.486-1.116.696-.63 1.769 1.99 1.702.708 9.11 2.753 9.309 2.145 0 3.538 1.415 5.008 2.631l-.022.022h.011ZM316.34 73.941c-9.342 7.209-4.3 2.322-1.326 18.453.442 2.653 6.423-2.4 8.214-2.72 1.161-3.107-4.931-12.272-6.865-15.733h-.023Zm-28.059 22.322c2.52 8.159 8.026 14.152 14.969 18.574.255.21 1.239-.21 1.161-.487-.376-1.138.465-1.769.774-2.631-.531-3.129-4.102-5.76-5.008-9.032-1.758-5.307-7.573-4.025-11.896-6.424Zm26.865 6.025c-.652-1.514-.265-5.693-2.399-5.373-3.637 1.073-7.33 1.913-11.155 1.836-.442 0-.885.088-.63.652 1.127 1.703 4.256 9.851 6.08 8.955 1.814-3.239 6.114-3.648 8.127-6.047l-.023-.023Zm11.322-2.564c-.686-1.57-.973-8.115-3.052-7.684-2.255 1.536-6.335 2.288-7.684 4.466 1.493 1.415.509 4.577 2.001 5.451 1.747-.763 3.704-.564 5.407-1.448 1.061-.609 2.178-.642 3.095.022.354-.144.166-.531.233-.796v-.011ZM302.51 64.09c-1.791 4.002-2.532 8.17-3.372 12.316.077 3.118 5.704.84 7.683.553 2.167-.564-3.549-11.145-4.311-12.87Zm19.834 39.148c-.641-.398-4.588.675-4.467 1.471.487 3.471.885 6.976 1.327 10.47.066.541.276.11.442.022 3.483-3.007 6.158-7.983 6.424-12.405-.255-.144-.841-.166-.995 0-.763.829-1.681.442-2.731.442Zm-6.048-32.47c.918-2.477 4.655-6.91 1.703-8.359-3.947-1.194-9.276-2.388-12.991-.32 5.031 1.205 8.248 4.676 11.266 8.678h.022Zm-16.163-6.889c-4.014.697-6.966 5.108-9.365 8.26-1.293 1.735 3.593 4.112 5.009 4.842 1.968.287 2.31-10.625 4.333-13.102h.023Zm15.898 46.247h.022c.652-8.358-3.483-3.67-7.308-.586-1.89 2.377 5.053 4.942 6.799 6.003 2.101.73.233-4.179.509-5.439l-.022.022Zm-10.78-45.528c2.024 1.57 3.295 11.918 5.495 10.757.995-1.05 4.577-2.09 3.582-3.747-2.675-2.72-4.82-6.722-9.077-7.01Zm18.021 50.459c3.881-1.957 15.656-9.63 6.236-11.896-1.681-.862-2.985 9.674-6.213 11.918l-.023-.022Zm-10.038 2.123c-2.377-.896-4.279-3.262-6.258-4.301-3.084 4.234 3.527 4.002 6.258 4.301ZM190.636 29.906c-.254 3.438 1.404 7.495 5.329 7.396 1.282.32 1.725 1.072.951 2.322-2.167 4.521-3.074 9.43-5.683 13.775-1.183 2.19-2.211 4.511-2.72 6.987-.11.564-.11 1.14-.84 1.206-.763.066-1.028-.42-1.205-1.073-1.437-6.865-1.99-14.162-6.313-19.989-1.349-.984-1.095-3.427.696-3.073 4.81 2.708 5.473-10.537 5.727-13.522.1-1.625-.53-4.654 1.681-4.93 2.189-.056 1.714 3.747 1.979 5.24.033 3.438.619 3.383.387 6.324v-.652l.011-.011Zm-2.554 4.842c-.63 2.19-1.305 3.914-2.841 5.163-.487.398-.166.774.044 1.006 2.487 3.24 2.333 7.242 3.051 11.167 5.329-15.965 4.887-6.546-.276-17.336h.022ZM157.568 12.438c-.1 1.493.575 3.295 2.277 3.262 1.67.066-3.106 9.33-3.548 10.713-1.692-2.41-.918-6.755-3.218-9.287-.564-.431-.486-1.504.299-1.36 3.04 1.437 1.57-7.85 3.173-8.137 1.161-.155.873 4.345 1.017 5.097v-.288Zm-1.095 2.134c-.265.962-.563 1.725-1.216 2.277.542 1.593 1.261 3.428 1.327 5.374.464-1.736 1.493-3.483 1.625-5.097-.851-.586-1.426-1.393-1.736-2.543v-.011Z" fill="#010101"/><path d="M157.568 12.438c-.1 1.493.575 3.295 2.277 3.262 1.67.066-3.106 9.33-3.548 10.713-1.692-2.41-.918-6.755-3.218-9.287-.564-.431-.486-1.504.299-1.36 3.04 1.437 1.57-7.85 3.173-8.137 1.161-.155.873 4.345 1.017 5.097v-.288Zm-1.095 2.134c-.265.962-.563 1.725-1.216 2.277.542 1.593 1.261 3.428 1.327 5.374.464-1.736 1.493-3.483 1.625-5.097-.851-.586-1.426-1.393-1.736-2.543v-.011Z" fill="#000"/><path d="M41.691 75.025c-1.88 4.666-5.174 9.21-5.14 14.66-.144 1.98-.763 3.914-.51 5.96.145 1.205-1.26 1.094-1.68 1.857-3.482-2.853-.265-21.139-7.893-21.88-1.007-.11-1.239-1.138-.277-1.702 1.869-1.14 2.753-3.074 3.14-4.843 1.67-2.952 1.028-13.19 3.372-13.565 4.6 3.87 0 16.307 7.606 17.778 1.095.044 1.371.63 1.371 1.79l.022-.044-.01-.01Zm-8.822-5.727c-.608 1.603-.84 2.908-1.493 4.069-.232.398-.608.763-.143 1.327 2.167 2.564 2.51 5.837 3.394 9.076 3.67-10.757.475-4.82-1.747-14.472h-.011ZM259.072 43.284c-.41 2.94-1.57 16.274 3.935 14.405 1.482-1.647 3.793.498 2.212 2.256-3.45 4.93-6.678 9.983-7.33 16.219.342 3.195-3.815 2.067-3.306-.675.685-4.555-.719-9.961-4.445-12.847-1.116-.763-.508-2.09-1.282-2.885 2.233-2.687 4.057-.818 5.097-5.141 2.2-3.273 1.216-13.92 3.77-14.616 1.459.232 1.194 1.902 1.282 3.284h.067Zm-1.858 24.953c4.5-8.989 1.57-4.49-.508-12.383-4.898 9.32-2.245 2.366.486 12.405l.022-.022ZM83.284 154.948c-.41 2.94-1.57 16.274 3.935 14.405 1.482-1.647 3.793.509 2.212 2.256-3.45 4.931-6.678 9.983-7.33 16.219.342 3.195-3.815 2.067-3.306-.675.685-4.555-.708-9.961-4.445-12.847-1.116-.762-.508-2.089-1.282-2.885 2.233-2.687 4.057-.807 5.097-5.141 2.2-3.273 1.216-13.908 3.77-14.616 1.459.232 1.194 1.902 1.282 3.284h.067Zm-1.858 24.953c4.5-9 1.57-4.489-.508-12.383-4.887 9.32-2.245 2.366.486 12.405l.022-.022ZM39.646 37.845c.918-3.46.74-12.382-3.35-13.5-.973-.275-.796-1.912-1.913-2.089-.331-.044-.53-.586-.398-1.006.122-.42.321-.718.84-.906 5.54-1.128 6.06-7.419 6.922-12.029 4.179-6.014.475 14.671 6.28 11.1.961-.63 2.144.453 1.813 1.47-2.521 5.396-6.855 10.702-7.054 17.015.785 2.952-2.83 2.035-3.162-.066h.022v.011Zm2.908-8.259c4.311-8.137 1.536-3.725-.089-11.221-3.493 3.726-.575 6.854.089 11.221ZM62.797 116.506c1.581-2.156 1.935-7.208 5.075-6.655.552.398.53.95.298 1.492-.785 2.255-1.957 4.168-2.543 6.512 2.2-.586 4.788-3.792 6.778-2.399.53.63.165 1.415-.531 1.913-1.183 1.547-6.623 3.04-5.307 5.096.807 1.161 4.124 4.367 1.139 4.721-.929 0-2.023.542-2.698-.995-.143 1.415 1.073 2.952-.74 3.416-1.26.332-1.095-1.116-1.537-1.89-.509.542-.719 1.304-1.625 1.492-3.162.564-1.018-3.261-.741-4.864-1.028-.255-2.654 1.006-3.306-.166-.873-1.736 3.814-2.267 1.537-4.047-2.31-1.746-3.129-4.201.509-4.566.884.089.762-.21.718-.718.055-.73-.564-1.935.675-2.09 2 .089 1.293 2.477 2.3 3.748ZM226.059 14.062c-1.482 1.482-1.416 6.545-4.058 5.628-.553-.21-1.161-.675-.763-1.67.321-1.824 3.66-7.606-.398-5.163-.53.21-1.205.995-1.581 0-.298-.774-.608-1.88.84-2.1.863-.122 1.537-.719 2.333-1.05-1.039-1.66-4.566-6.468-.11-4.865 2.377-.741 1.006 1.503 2.277 2.885.973-1.028.608-2.355.863-3.493.254-1.095.696-1.68 1.835-1.814 3.206-.32 1.526 3.693.674 5.396 2.72-.221 5.042-4.334 7.408-2.256.508.564.884 1.305-.144 1.725-2.421 1.139-5.605 2.167-7.496 3.704.044.84.885 1.304 1.537 1.647.785.398 2.299 2.488 2.045 3.24-.464 1.47-1.901.53-2.609-.255-.94.74.984 2.61-1.028 2.886-2.278 0-1.095-2.985-1.625-4.467v.022ZM31.476 172.161c-1.481 1.481-1.415 6.545-4.057 5.627-3.118-.862 4.278-9.696-1.161-6.821-.531.21-1.205.995-1.581 0-.299-.774-.608-1.88.84-2.101.862-.122 1.537-.719 2.333-1.05-1.04-1.659-4.566-6.468-.11-4.865 2.376-.741 1.005 1.504 2.277 2.886.973-1.029.608-2.355.862-3.494.254-1.095.697-1.68 1.835-1.813 3.206-.321 1.526 3.693.675 5.395 2.72-.221 5.041-4.345 7.407-2.255.509.564.885 1.304-.144 1.724-2.42 1.139-5.605 2.167-7.495 3.704.044.84.884 1.305 1.536 1.647.774.398 2.3 2.488 2.046 3.24-.465 1.481-1.902.53-2.61-.254-.94.729.984 2.609-1.028 2.885-2.277 0-1.094-2.985-1.625-4.466v.022-.011ZM50.05 208.778c-.973.951-.951 4.157-2.665 3.56-.354-.133-.763-.431-.497-1.05.232-1.195 2.377-4.799-.266-3.262-.343.133-.785.63-1.039 0-.807-1.36 1.26-1.404 2.078-2.001-.707-1.084-2.974-4.091-.066-3.074 1.559-.464.652.94 1.493 1.825.63-.653.398-1.493.563-2.212.166-.696.454-1.061 1.194-1.149 2.09-.21 1.007 2.321.443 3.405 1.78-.133 3.306-2.742 4.853-1.426.332.365.575.829-.1 1.094-1.591.719-3.67 1.36-4.908 2.344.31 1.061 2.565 1.725 2.344 3.096-.31.928-1.238.342-1.714-.166-.586.497.586 1.713-.674 1.824-1.482 0-.719-1.868-1.062-2.819l.023.011ZM286.412 178.154c-1.183-7.872 12.947-7.452 12.427-.1 1.172 8.801-13.145 8.436-12.427.089v.022-.011Zm8.845.884c.287-1.934-2.764-5.373-4.721-3.162-4.19 3.616 4.577 8.834 4.732 3.162h-.022.011ZM193.765 203.692c-.487 2.709-5.318 7.12-7.496 4.467-.431-2.2 4.245-2.465 4.732-5.163.674-2.443 2.576-1.371 2.775.696h-.022.011ZM168.413 196.428c-6.456.353-5.373-5.219-2.332-3.472 2.432 2.532 4.245-1.791 6.124-.343 1.206 1.758-2.565 3.947-3.792 3.793v.022ZM192.748 194.474c-1.471-.166-4.257-1.78-2.985-3.516.42-.398.862-.796 1.68-.254.984 1.182 2.863 1.592 3.914-.089 3.339-2.72 3.129 4.091-2.609 3.859ZM100.707 35.809c4.655-8.469 8.281-17.756 14.229-25.296 8.602-3.66-.21 20.365-1.492 23.626 29.64-7.374 37.037-2.045 3.936 9.01 7.308 5.462 14.892 10.791 21.448 17.226 7.905 15.301-15.932-.144-19.812-3.56 3.869 7.031 9.231 14.383 10.005 22.72-.995 3.748-6.335 2.454-8.358-.21-5.782-6.092-10.702-12.803-15.323-19.79-.398-.487-.675-.653-1.238-.487 1.459 4.644-1.714 31.51-8.945 29.652-4.3-4.157-4.477-25.992-5.45-33.19-7.308 2.233-14.395 4.787-21.813 6.468-12.25-.708 9.33-14.693 12.802-15.965-4.123-4.322-17.214-6.998-15.268-14.34 3.615-3.846 8.359.786 12.46 1.405 2.698 1.16 5.605 1.857 8.104 3.471.674.653 1.283.1.84-.674-4.3-53.41 1.404-41.935 14.019-.11l-.144.022v.022Zm36.131 26.788c-12.405-17.336-40.442-17.446-9.475-28.325-29.453 7.86-16.34 6.434-11.852-19.525h-.276c-20.675 35.357-13.488 31.72-26.678-4.311.53 37.18 10.536 35.124-17.877 24.3l-.255.321c22.83 15.644 21.195 7.44-1.348 22.443 33.753-5.804 18.728-15.268 27.352 26.236 10.348-24.29-5.285-47.253 23.77-12.128 6.755 8.723 4.068 2.84 1.581-2.908-2.919-6.29-7.087-11.863-10.968-17.568-3.383-9.862 21.979 12.372 26.026 11.388v.077Z" fill="#010101"/></g><defs><linearGradient id="b" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="c" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="d" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="e" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="f" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="g" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="h" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="i" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="j" x1="6.633" y1="4.422" x2="333.234" y2="4.422" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h340.088v400H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mr-privacysegmentation.svg b/browser/components/aboutwelcome/assets/mr-privacysegmentation.svg
new file mode 100644
index 0000000000..feda0087d7
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-privacysegmentation.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="389" height="400" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><g clip-path="url(#b)"><path d="M372.478 328.041c-2.103 2.739-4.104 5.58-6.181 8.319-2.027 2.687-4.079 5.373-6.208 7.957-2.462 2.971-5.155 5.761-7.797 8.577-2.463 2.609-5.31 4.753-7.849 7.233-1.975 1.964-4.284 3.798-6.567 5.529-2.462 1.86-4.976 3.668-7.438 5.503-.513.387-.667.413-1.283 0-4.078-2.636-6.823-6.666-10.131-10.05-2.232-2.299-3.95-5.089-6.054-7.544-2.513-2.945-5.258-5.631-7.977-8.344-2.847-2.816-5.386-5.864-7.926-8.939-.051-.077-.077-.206-.205-.465 2.899-.981 5.387-2.609 7.875-4.159 5.643-3.513 10.747-7.776 15.851-11.987 3.489-2.868 6.772-5.916 9.978-9.016 3.514-3.384 7.003-6.975 9.285-11.445.616-1.188 1.078-2.428 1.334-3.746.128-.697.411-1.472.872-1.679.59-.258.821.723 1.257 1.033 3.206 2.3 5.797 5.322 8.747 7.906 2.077 1.834 4.001 4.004 5.976 6.019 3.053 3.1 5.669 6.614 8.952 9.533 1.565 1.395 3.078 2.919 4.309 4.624.488.698 1.001 0 1.488.569 1.282 1.498 1.282 2.48-.308 4.572ZM321.401 281.546c-1.134 2.261-2.479 4.445-3.85 6.628-1.687 2.73-3.691 5.277-5.748 7.642-1.397 1.56-3.243 3.016-5.009 4.393-2.742 2.08-5.643 4.004-8.306 6.239a151.716 151.716 0 0 1-9.465 7.304c-1.398-.753-1.951.676-2.795 1.066-2.004-2.131-3.243-4.757-5.326-6.862-1.029-1.04-1.767-2.6-2.637-3.925-1.608-2.574-3.48-5.017-5.141-7.565-.739-1.143-.396-1.455.29-2.027 2.214-1.716 4.403-3.509 6.697-5.121 2.768-1.95 5.326-4.133 7.962-6.213 3.771-2.937 7.41-6.004 11.022-9.124 2.768-2.417 5.379-5.017 8.042-7.512.237-.208.448-.364.632-.65 1.345-1.975 2.136-1.975 3.454-.104 1.424 2.028 2.848 4.107 4.43 5.979 1.45 1.767 2.478 3.795 4.06 5.407.291.312.554.883.897.935 3.085.52 1.16 2.756.791 3.51Z" fill="#4E3413"/><path d="m147.992 179.145-19.981-71.35v-8.123l10.978 4.61 14.053 22.174 8.124 44.566-13.174 8.123Z" fill="#FFDBC7"/><path d="M189.62 194.948c-.432 8.627-1.649 17.179-3.551 25.603a85.254 85.254 0 0 1-5.936 17.559c-2.131 4.567-4.794 8.881-7.66 13.042-.863 1.244-1.497 2.69-2.232 4.009-.837 1.447-2.435 2.462-2.993 4.111-.939 2.766-3.501 4.212-5.073 6.47-1.674 2.335-3.678 4.441-5.454 6.725-3.044 3.882-6.569 7.282-9.765 10.987-1.675 1.903-3.323 3.882-5.023 5.734-2.638 2.842-4.794 6.039-7.533 8.881-4.515-5.582-8.092-11.723-12.302-17.457-2.765-3.781-5.352-7.765-8.447-11.292-2.688-3.07-5.504-6.09-8.548-8.855-1.496-1.345-2.891-2.842-4.337-4.238-.355-.33-.507-.584-.305-1.091 2.207-5.303 2.943-10.962 3.78-16.595 1.091-7.282 1.725-14.615 1.623-21.999-.051-5.608-.101-11.241-1.192-16.798-.685-3.451-1.37-6.927-2.486-10.251-1.116-3.248-2.765-6.268-4.388-9.262-2.334-4.288-5.301-8.17-7.736-12.382-1.953-3.426-3.881-6.852-5.403-10.505-.279-.66-.533-1.371-.609-2.081-.101-.787-.583-1.726.305-2.309.963-.66 1.953-.152 2.688.406 5.961 4.618 10.958 10.023 14.408 16.798 1.724 3.374 3.754 6.597 5.529 9.921.381.736 1.015 1.091 1.548 1.37.608.33.989.584 1.192 1.269.228.837.862 1.319 1.801 1.142.837-.153 1.623-.051 2.029-1.218 1.09-3.121 1.192-6.268 1.014-9.49-.431-8.044-2.891-15.631-5.402-23.218-1.674-5.1-3.374-10.2-4.389-15.503-.101-.533-.076-1.092-.025-1.624.051-.99-.203-2.335.761-2.792 1.015-.482 2.308.102 3.196.736 1.877 1.32 3.526 2.944 4.515 5.101.102.228.228.532.406.583 3.221.812 4.084 3.603 4.971 6.191 1.573 4.568 3.602 9.008 4.642 13.753 1.218 5.608 1.573 11.267.964 17.001-.33 3.02-.761 5.988-1.522 8.932-.355 1.472.71 3.349 1.852 3.222 1.268-.127 2.486-.761 2.79-2.309a74.549 74.549 0 0 0 1.573-14.057c.076-4.06-.051-8.069-.888-12.002a75.41 75.41 0 0 0-4.743-14.717c-1.446-3.35-2.461-6.877-3.729-10.302-1.573-4.314-3.145-8.627-3.577-13.22-.202-2.055-.456-4.136.051-6.217.457-1.827 1.598-2.309 3.272-1.522 1.421.685 2.309 1.852 3.323 2.918 1.218 1.294 2.537 2.486 4.109 3.273 1.421.711 1.446 2.182 1.827 3.299 1.217 3.501 3.119 6.699 4.489 10.124 1.395 3.502 3.145 6.851 4.16 10.556.812 3.019 1.902 6.013 2.41 9.033.735 4.415 1.496 8.881 1.547 13.398.051 3.349.279 6.673.178 10.048-.051 1.7-.305 3.375-.305 5.049 0 1.218.66 2.411 2.105 2.436 1.167 0 2.233-.38 2.461-1.903.279-1.827.659-3.603.406-5.455-.178-1.193.355-1.294 1.369-1.041 3.754.965 7.432 1.193 10.933-1.015 1.04-.659 1.471-.101 1.496.99.076 4.846.406 9.693.711 14.514.202 3.096.38 6.267.735 9.389.305 2.461.228 4.948 1.091 7.333.203.507.177 1.116.989.989-.304.939 1.801 1.168.634 2.563-.71.837-.583 2.233.127 3.223.558.735 1.547.989 2.486.761.735-.178 1.446-.432 1.674-1.37.964-4.187 2.993-7.968 4.312-12.028 1.268-3.882 2.613-7.739 3.5-11.697.584-2.512 1.142-5.05 1.471-7.613.33-2.664.711-5.354 1.193-7.992.558-3.02.634-6.141 1.014-9.211.152-1.218.558-2.462.939-3.654.634-2.03 2.257-2.411 4.109-1.345 2.79 1.599 3.551 4.288 3.957 7.079.558 3.933.786 7.892 1.014 11.876.356 6.419.178 12.814-.126 19.233Z" fill="#FFDBC7"/><path d="m69.165 72.448 4.172-13.172 5.49-4.172 6.147 5.489 3.074 11.855-6.806 5.05h-7.905l-4.172-5.05Z" fill="url(#c)"/><path d="m311.134 61.032-6.367-13.392 6.367-5.269 5.929 6.806-5.929 11.855Z" fill="url(#d)"/><path d="m349.779 84.742 10.1-9.88 2.635 2.635-1.756 14.71-4.611 7.464h-6.368l-3.074-7.245 3.074-7.684Z" fill="url(#e)"/><path d="m49.404 203.952-5.49-6.367-3.074 5.05 5.929 10.318 2.635-9.001Z" fill="url(#f)"/><path d="M144.039 170.143v-6.147l8.344-1.318 6.368-4.171 2.854 8.343-9.881 4.61-7.685-1.317Z" fill="url(#g)"/><path d="m286.103 340.285-12.077-17.563-1.756-9.22 3.733-3.952 10.1 8.562 16.248-11.416 14.492-15.587 5.929-11.855-9.223-11.636 5.051-1.756 5.709 5.488 15.809 12.294-4.172 17.783-16.468 17.783-33.375 21.075Z" fill="url(#h)"/><path d="M385.803 291.858c-3.983-6.14-8.523-6.343-14.256-4.11-2.308.913-4.819 1.751-6.518 3.705-1.193 1.37-2.943 1.065-4.262 1.979-1.801 1.268-3.855 2.106-5.884 2.994-.914.38-1.877.913-2.461 1.675-.558.71-.634.659-1.243.126-1.978-1.776-4.109-3.425-6.113-5.176-.786-.71-2.105-1.827-1.953-2.41.406-1.599 0-3.248.381-4.695.735-2.765-.33-4.973-1.852-6.876-1.42-1.726-2.739-3.553-4.642-4.948-2.612-1.929-5.073-3.958-8.269-4.872-1.42-.381-3.17-1.142-3.855-1.979-1.421-1.675-3.12-2.055-4.921-2.385-1.471-.279-3.323-.736-4.414-.102-2.08 1.218-2.79-.355-3.551-1.294-.583-.71-2.156-1.319-1.395-2.563.837-1.319 1.573-2.664 2.334-4.009 2.08-3.603 2.917-7.46 1.75-11.469-.837-2.867-2.181-5.659-5.403-6.673-4.54-1.421-8.548-.406-11.997 2.892-1.04.964-2.309.914-3.298.127-.507-.431-2.283-.787-.862-2.157-.432-.355-.102-1.395-.634-1.268-.888.177-1.015-.381-1.421-.787-1.446-1.345-1.699-3.324-2.587-4.973-.863-1.599-1.395-3.401-2.562-4.822-1.395-1.725-1.522-3.856-1.573-5.81-.05-2.132.355-4.339.99-6.369.583-1.827.913-3.654 2.435-5.354 1.598-1.802 2.409-4.491 3.678-6.724 2.003-3.553 4.591-6.699 7.406-9.617 1.116-1.142 2.232-2.385 3.551-3.35 1.522-1.091 2.943-2.283 4.642-3.146 1.674-.837 3.982-.913 4.642-3.451.127-.533.786-1.649 1.598-2.36 2.917-2.486 5.504-5.227 6.798-9.134 1.09-3.401 1.217-6.446-.558-9.516-1.142-1.979-3.019-3.045-5.073-3.984-.863-.38-.711.609-1.446.483-1.598-.28-3.196.558-4.642 1.141-1.978.812-3.957 1.802-5.783 3.096a179.528 179.528 0 0 0-4.946 3.679c-2.106 1.624-4.363 2.995-6.545 4.492-.355.253-1.344.786-1.699-.686-.431-1.877.33-3.298 1.015-4.871 1.445-3.324 3.094-6.598 5.149-9.516 1.877-2.613 3.779-5.227 5.808-7.764 1.979-2.487 3.78-5.177 5.809-7.587 1.167-1.37 2.308-2.842 3.5-4.212 2.537-2.918 4.693-6.141 6.976-9.262 1.623-2.182 3.373-4.314 4.768-6.572 1.471-2.41 2.917-5.024 2.486-8.272-.304-2.512-1.319-4.973-3.576-5.1-2.435-.127-4.921.482-7.255 1.345-2.156.812-4.109 1.979-5.961 3.273-2.054 1.421-4.083 2.918-5.707 4.821-1.674 1.979-3.449 3.806-5.123 5.76-1.218 1.421-2.436 2.766-3.425 4.39-.507.837-.634 2.41-1.471 2.487-1.167.126-1.75 1.014-1.877 1.497-.304 1.141-1.091 1.953-1.725 2.715-2.004 2.461-3.475 5.328-5.682 7.561-.862.863-.862 2.309-2.079 2.817-.635-.838.431-.939.583-1.472.888-2.994 2.587-5.633 4.058-8.348 1.598-2.944 3.526-5.684 5.226-8.577 2.308-3.857 4.388-7.84 6.518-11.799 1.472-2.74 2.791-5.886 2.664-9.337-.153-3.781-1.37-5.811-4.794-5.735-2.816.076-5.175 1.725-7.508 3.172a26.23 26.23 0 0 0-2.512 1.776c-.71.584-.811 2.081-2.282 1.446-.076 0-.229.153-.229.229-.126.71-.608.989-1.166.761-.66-.254-.203-.964-.33-1.446-.102-.457.076-.99-.051-1.421-.304-1.168-.558-2.436-2.232-2.386-2.46.051-4.794.457-6.95 1.802-2.131 1.294-4.363 2.284-5.859 4.517-.635.989-1.04 2.461-2.435 2.867-1.421.406-1.979 1.649-2.816 2.664-.533.609-1.015 2.056-2.435.939-.127-.101-1.192-.33-1.953-.228-3.45.355-5.834 2.639-8.548 4.263-1.04.609-2.004 1.674-2.714 2.664-1.37 1.852-2.917 3.552-4.236 5.43-.457.634-.431 1.497-.761 1.7-2.258 1.37-3.12 3.908-4.363 5.887-1.775 2.791-3.551 5.811-4.312 9.16-.304 1.37-1.42 2.411-1.42 3.781.025 1.573-.584 3.095-1.193 4.263-1.268 2.385-1.978 4.973-3.246 7.333-1.192 2.258-1.725 4.796-2.816 7.105-.456.938-.862 2.03-1.293 2.994-.787 1.675-1.015 3.476-1.624 5.176-1.42 3.882-2.511 7.917-4.084 11.748-.963 2.36-1.116 4.923-2.206 7.232-1.091 2.335-1.953 4.796-2.435 7.308-.584 3.248-2.03 6.242-2.638 9.49-.279 1.395-.051 2.893-.457 4.161-.888 2.766-.659 5.557-.583 8.323.101 2.893.558 5.76 1.141 8.653.786 3.831 1.75 7.612 3.5 11.063 2.943 5.861 7.762 10.2 12.632 14.463.837.736 1.7 1.497 2.511 2.335 1.04 1.065 2.359 2.004 3.628 2.791 2.587 1.548 5.174 3.095 7.026 5.43 4.058 5.176 7.888 10.556 11.82 15.859.406.507.507.862.177 1.573-1.014 2.334-2.359 4.618-2.612 7.232-.406 4.364.127 8.449 4.185 11.063 2.942 1.878 6.113 1.192 9.03 0 4.819-2.005 4.819-2.487 8.168 1.066.304.329.558.786.659 1.065.685 1.751 3.297 2.462 2.308 5.329-.532 1.472-1.268 3.096-1.293 4.897-.026 3.147-.229 6.268.735 9.287 1.218 3.755 3.704 6.775 5.961 9.921 1.446 2.056 3.145 3.908 4.845 5.76 2.105 2.309 4.921 2.842 7.051 1.497 1.759-1.099 3.34-.879 4.744.66.152.178.38.305.507.457 1.649 2.004 3.094 3.857.482 6.343-1.421 1.345-1.979 3.451-3.171 5.075-1.801 2.462-3.196 5.227-4.261 8.12-1.066 2.944-2.131 5.785-2.308 9.084-.127 2.233.329 4.339.481 6.471.178 2.816 1.827 5.227 3.628 7.18 1.243 1.345 2.587 3.857 5.352 2.259.279-.178.964-.254.659.659-.228.711.355 1.041 1.015 1.472 1.014.685 2.004.229 2.942.482 2.943.736 5.834.229 8.574-.609 6.696-2.08 12.631-5.81 18.516-9.49 2.917-1.827 5.935-3.552 8.624-5.683 1.953-1.548 4.135-2.817 5.986-4.542 2.309-2.107 4.744-4.111 7.026-6.243a180.834 180.834 0 0 1 4.033-3.653c.812-.736.736-.889.254-1.574 1.598.66 2.41-.482 3.019-1.294 1.648-2.157 3.627-3.984 5.428-5.963 1.953-2.182 3.678-4.567 5.504-6.825 1.877-2.309 3.45-4.974 5.352-7.257 2.511-3.045 4.692-6.293 6.95-9.465 1.522-2.182 2.739-4.644 4.236-6.851 2.689-4.009 4.616-8.272 5.504-12.966.989-5.38.736-10.632-2.333-15.377v-.026Zm-65.569-22.583c.355.33 1.192-.076 1.065.609-.127.838-.786 1.447-1.446 1.98-.431.329-.811.076-1.242-.28-.863-.71-1.218-1.674-1.725-2.613 1.192.228 2.409-.508 3.348.304Zm-19.937-24.587c.71-.279 1.446-.685 1.953-1.117.837-.685 1.522-1.167 2.41-.761 5.098-.457 6.899 4.77 5.529 8.5-.71 1.98-1.902 3.73-2.511 5.76-.203.635-.735.305-1.065-.076-2.689-3.248-5.225-6.572-7.229-10.302-.558-1.015-.305-1.548.913-2.004Zm14.864-74.727c.38-.28.862-.559 1.141-.305.355.279.051.761-.127 1.193-1.065 2.233-2.815 3.933-4.286 5.861-.33.381-.71.634-1.167.558-.71-.152-.304-.812-.406-1.218-.076-.33-.482-.685-.33-.761.406-1.497.508-2.461 2.004-3.146 1.066-.508 2.131-1.421 3.171-2.182ZM253.27 298.329c-.431-.254-.634-.482-.634-.964 0-.533.101-1.244-.761-.482.051-.305-1.319-.711.051-.965.482-.076.127-.406.127-.659-.076-1.777.456-3.451.938-5.101.254-.862.685-1.04 1.319-.152 1.015 1.472 2.359 2.639 3.45 4.085.786 1.066 1.496 2.614 3.044 3.147-2.03 2.03-5.276 2.41-7.534 1.091Zm15.803-6.065c-1.167.965-2.41.077-3.222-.558-1.471-1.116-3.145-1.928-4.566-3.045-1.318-1.015-2.282-2.512-4.033-3.019-.101-2.36-1.978-3.806-3.196-5.481-1.192-1.624-2.105-3.578-3.779-4.872-1.37-1.066-1.826-2.816-3.044-4.009a27.864 27.864 0 0 1-4.515-5.938c-1.801-3.197-4.819-4.871-7.406-6.901-2.511-1.98-5.048-4.01-7.635-5.938-3.272-2.461-8.421-8.399-9.74-10.657-1.903-3.299-3.881-6.75-3.957-10.683-.051-1.674-.33-3.375-.406-5.024-.076-1.598-.381-3.4-.381-5.075 0-3.831.254-7.663.964-11.418.152-.863.178-1.751.254-2.588.127-1.574.609-3.071 1.091-4.492.963-2.765 1.699-5.582 2.511-8.373.558-1.954 1.572-3.654 2.181-5.582 1.776-5.836 3.475-11.698 5.631-17.407.989-2.664 2.334-5.329 3.323-7.968 1.547-4.085 3.221-8.145 4.692-12.281 1.117-3.121 2.512-6.166 3.755-9.261 1.344-3.35 3.145-6.445 5.073-9.338 1.978-2.918 3.525-6.217 6.544-8.501 1.395-1.04 2.612-2.562 4.033-3.73.355-.304.609-.685 1.167-.761.558-.076 1.116-.786 1.648-.279.558.558-.025 1.243-.203 1.802a136.987 136.987 0 0 1-2.688 8.094c-.964 2.69-1.928 5.481-3.349 8.044-1.141 2.03-1.826 4.313-2.942 6.369-1.598 2.994-2.46 6.267-3.729 9.388-.481 1.243-.76 2.538.508 3.578.862.736 1.801.558 2.663.076.837-.482 1.116-1.522 1.319-2.284.989-3.755 2.917-7.104 4.49-10.606 1.775-3.958 3.348-7.993 4.997-12.002.938-2.233 1.572-4.618 2.561-6.826 1.091-2.385 2.08-4.796 3.805-6.902 1.395-1.7 2.613-3.552 4.185-5.125 1.598-1.548 3.678-2.791 4.871-4.466 1.04-1.446 2.257-.99 3.246-1.624 1.218-.787.558.66.99.761-1.066 1.573-1.421 3.476-2.207 5.177-.888 1.877-1.827 3.755-2.714 5.658-.964 2.055-2.106 4.035-3.146 6.064-.887 1.726-1.826 3.553-2.333 5.405-.507 1.929-1.649 3.476-2.359 5.253-1.573 3.907-3.45 7.663-4.946 11.596-.508 1.319-1.395 2.588-2.004 3.983-.33.787-.964 1.345-.025 2.107.152.126.177.304-.406.38-1.37.152-2.689 5.43-1.751 6.471 1.624 1.827 2.537 1.624 3.704-.838 1.775-3.755 3.5-7.561 5.225-11.342 2.334-5.05 4.667-10.124 6.696-15.301 1.827-4.618 4.135-9.008 6.57-13.321.761-1.345 2.131-2.208 3.069-3.375 1.015-1.294 2.029-2.563 3.145-3.781 2.943-3.146 6.747-5.049 10.425-7.155.939-.508 1.877.127 1.598 1.167-.456 1.7-1.116 3.375-1.699 5.024-.66 1.802-1.674 3.349-2.384 5.049-1.142 2.715-3.095 4.999-4.11 7.714-.963 2.665-3.17 4.517-4.235 7.156-.812 2.03-2.537 3.628-3.425 5.684-.761 1.801-2.13 3.171-2.486 5.303-.228 1.472-1.192 3.095-1.953 4.491-1.293 2.334-1.953 4.821-2.891 7.232-1.142 2.892-2.232 5.836-3.019 8.855-.406 1.548-.887 3.096-1.243 4.644-.38 1.725 1.015 1.928 1.522 2.867.888-.736 2.461-.33 2.892-1.827.507-1.751 1.623-3.222 2.613-4.694.507-.761 1.395-1.243 1.039-2.385-.076-.152.102-.558.66-.584.583-.025 1.141-1.548 1.091-2.385-.026-.152.025-.406.127-.431 2.435-1.066 2.815-3.629 4.185-5.481.634-.863 1.42-1.726 2.004-2.614 1.927-2.892 4.033-5.633 6.011-8.475.863-1.243 1.471-3.121 2.334-3.781 2.283-1.776 3.12-4.516 5.174-6.343 1.75-1.523 2.79-3.629 4.312-5.354 1.37-1.573 2.968-2.918 4.262-4.542 1.953-2.411 4.312-4.39 7.026-5.811 1.927-.989 3.855-2.08 6.037-2.36 1.065-.126 1.775 1.371 1.09 2.335-.558.736-.862 1.497-.786 2.309.076 1.091-1.979.837-1.243 2.182-1.877.837-2.156 2.969-3.374 4.364-2.105 2.386-3.931 5.025-5.707 7.689-1.699 2.512-3.855 4.669-5.605 7.13-1.877 2.563-3.856 5.075-5.758 7.638-1.649 2.182-3.678 4.085-4.693 6.699-.355.888-1.04 1.623-1.648 2.258-2.207 2.36-3.425 5.328-4.845 8.094-.888 1.675-1.624 3.654-2.182 5.583a3.199 3.199 0 0 0 .254 2.359c1.268 2.386.761 3.654-1.699 4.669-3.019 1.244-5.682 3.02-8.32 4.897-2.105 1.523-4.439 2.741-6.468 4.339-2.435 1.904-5.099 3.578-6.925 6.268-.71 1.091-1.699 2.106-2.486 3.197-1.801 2.436-3.373 4.973-4.692 7.739-1.319 2.715-1.776 5.557-2.587 8.323-.635 2.182 0 4.415-.279 6.623-.127.938 1.192.583 1.369 1.421.127.71.33.786 1.294.507 1.014-.279 1.953.051 1.699-1.446-.152-1.041.508-2.132.178-2.994-.812-1.98.127-3.705.507-5.481.431-2.081.812-4.212 2.308-5.862.33-.38-.076-.812.229-1.268 1.75-2.639 3.424-5.278 5.681-7.613 3.171-3.248 6.57-6.064 10.426-8.424 1.395-.837 2.764-1.725 3.754-3.096.253-.38 1.065-.355 1.623-.634 2.993-1.472 5.809-3.248 8.954-4.44 2.967-1.142 5.884-2.665 8.32-4.771 1.8-1.573 3.956-2.69 5.681-4.263 2.867-2.563 6.443-3.324 9.791-4.719.533-.229 1.091.127 1.345.634.202.457-.153.584-.584.888-.837.634-1.801.888-2.638 1.421-1.04.66-1.293 1.497-.659 2.639-1.116-.863-1.649-.964-2.714.355-2.08 2.614-2.816 6.801-1.091 9.617.558.914.761 1.472-.583 2.335a20.422 20.422 0 0 0-3.831 3.044c-1.674 1.751-3.627 3.223-5.428 4.822-1.851 1.674-3.424 3.679-5.047 5.607-3.298 3.959-5.809 8.45-8.143 12.992-.811 1.573-2.003 2.893-2.536 4.669-.837 2.689-.507 5.455-1.141 8.12-.812 3.552.659 6.394 2.384 9.337 1.649 2.791 3.323 5.608 4.971 8.399 2.004 3.426 3.983 6.851 6.012 10.277 1.42 2.385 2.866 4.77 4.363 7.13.659 1.04 1.978 1.472 2.993 1.801 1.522.533 1.877 2.005 2.968 2.817.558.431-.051 1.472-.381 1.751-3.145 2.512-5.327 5.963-8.472 8.5-3.323 2.715-6.468 5.684-9.816 8.399-3.627 2.944-7.432 5.735-10.907 8.906-1.497 1.371-3.399 2.411-5.022 3.73Zm7.863 23.725c-.355.305-1.218.508-1.471.305-.406-.33-.736-1.117-.635-1.599.153-.659.077-1.319.279-2.004.356.786 1.396.964 1.446 1.954.026.456.989.812.381 1.344Zm-.026-11.266c-1.547-2.512-3.348-4.897-4.946-7.384-.71-1.116-.38-1.421.279-1.979 2.131-1.675 4.236-3.425 6.443-4.999 2.663-1.903 5.124-4.034 7.66-6.064 3.627-2.867 7.128-5.861 10.603-8.906 2.663-2.36 5.174-4.898 7.736-7.334.228-.203.431-.355.609-.634 1.293-1.928 2.054-1.928 3.323-.101 1.369 1.979 2.739 4.009 4.261 5.836 1.395 1.725 2.384 3.704 3.906 5.278.279.304.533.862.863.913 2.967.507 1.116 2.69.761 3.426-1.091 2.207-2.385 4.339-3.704 6.47-1.623 2.664-3.551 5.151-5.529 7.46-1.345 1.522-3.12 2.943-4.82 4.288-2.638 2.03-5.428 3.908-7.99 6.09a146.021 146.021 0 0 1-9.106 7.13c-1.344-.736-1.877.66-2.688 1.041-1.928-2.081-3.12-4.644-5.124-6.699-.989-1.015-1.7-2.538-2.537-3.832Zm15.473 29.663c-1.192.634-2.486 1.142-3.602 1.903-1.344.939-2.181.304-2.79-.761-.279-.483-.685-.812-1.015-1.218-1.953-2.487-3.145-5.456-5.225-7.841-.127-.152-.101-.381-.228-.482-.66-.584-1.801-1.218-1.573-1.979.33-.99 1.751-.965 2.664-1.371 3.627-1.547 6.95-3.577 10.247-5.734 4.135-2.715 7.813-5.988 11.795-8.906 6.29-4.619 12.175-9.693 15.904-16.874 1.598-3.02 3.652-5.836 4.768-9.059.914-2.639 2.131-5.252 2.283-8.297 1.776 1.141 2.943 2.816 4.414 4.161 1.75 1.573 3.602 3.02 5.022 5.024.431.584 1.218 1.193 1.75 1.954.457.66.863 1.167.406 1.954-.279.457.051.786.254 1.142.076.203.431.406.431.456-1.04 1.624-.279 3.604-.939 5.202-.532 1.269-1.166 2.461-1.395 3.857-.203 1.193-1.42 1.776-1.978 2.791-1.065 1.929-2.334 3.857-3.754 5.379-1.7 1.827-3.424 3.705-5.276 5.405-4.87 4.491-9.588 9.11-15.042 12.89-2.029 1.421-3.88 3.071-5.91 4.492-3.525 2.461-7.482 3.958-11.211 5.912Zm78.657-4.542c-2.08 2.689-4.058 5.481-6.113 8.17-2.004 2.639-4.033 5.278-6.138 7.816-2.435 2.918-5.099 5.658-7.711 8.424-2.435 2.563-5.251 4.669-7.762 7.105-1.953 1.928-4.236 3.73-6.493 5.43-2.435 1.827-4.921 3.603-7.356 5.404-.508.381-.66.406-1.268 0-4.034-2.588-6.748-6.546-10.02-9.87-2.206-2.258-3.906-4.999-5.986-7.409-2.486-2.893-5.2-5.532-7.888-8.196-2.816-2.766-5.327-5.76-7.838-8.78-.051-.076-.076-.203-.203-.457 2.866-.964 5.327-2.562 7.787-4.085 5.58-3.451 10.628-7.637 15.676-11.773 3.449-2.817 6.696-5.811 9.867-8.856 3.475-3.324 6.924-6.851 9.182-11.241.609-1.167 1.065-2.385 1.319-3.679.127-.685.406-1.446.862-1.649.584-.254.812.71 1.243 1.014 3.171 2.259 5.733 5.228 8.65 7.765 2.054 1.802 3.956 3.933 5.91 5.912 3.018 3.045 5.605 6.496 8.852 9.363 1.547 1.371 3.044 2.868 4.261 4.542.482.685.99 0 1.471.559 1.269 1.471 1.269 2.435-.304 4.491Z" fill="#000"/><path d="M319.169 110.704c-2.182.279-4.109 1.37-6.037 2.36-2.714 1.421-5.073 3.4-7.026 5.811-1.294 1.624-2.892 2.969-4.262 4.542-1.522 1.725-2.561 3.831-4.312 5.354-2.054 1.827-2.891 4.567-5.174 6.343-.863.66-1.471 2.538-2.334 3.781-1.978 2.842-4.084 5.582-6.011 8.475-.584.888-1.37 1.751-2.004 2.614-1.37 1.852-1.75 4.415-4.185 5.48-.102.026-.153.28-.127.432.051.837-.507 2.36-1.091 2.385-.558.025-.735.431-.659.584.355 1.141-.533 1.624-1.04 2.385-.99 1.472-2.106 2.943-2.613 4.694-.431 1.497-2.004 1.091-2.892 1.827-.507-.939-1.902-1.142-1.521-2.867.355-1.548.837-3.096 1.242-4.644.787-3.019 1.877-5.963 3.019-8.855.938-2.411 1.598-4.898 2.891-7.232.761-1.396 1.725-3.02 1.954-4.491.355-2.132 1.724-3.502 2.485-5.304.888-2.055 2.613-3.653 3.425-5.683 1.065-2.639 3.272-4.492 4.236-7.156 1.014-2.715 2.967-4.999 4.109-7.714.71-1.7 1.725-3.248 2.384-5.049.583-1.649 1.243-3.324 1.7-5.024.279-1.041-.66-1.675-1.598-1.167-3.678 2.106-7.483 4.009-10.425 7.155-1.117 1.218-2.131 2.487-3.146 3.781-.938 1.167-2.308 2.03-3.069 3.375-2.435 4.313-4.743 8.703-6.569 13.321-2.03 5.176-4.363 10.251-6.697 15.301-1.725 3.781-3.45 7.587-5.225 11.342-1.167 2.461-2.08 2.664-3.703.837-.939-1.04.38-6.318 1.75-6.47.583-.076.558-.254.406-.381-.939-.761-.305-1.319.025-2.106.609-1.395 1.497-2.664 2.004-3.983 1.496-3.933 3.373-7.689 4.946-11.597.71-1.776 1.852-3.324 2.359-5.252.507-1.852 1.446-3.679 2.334-5.405 1.04-2.03 2.181-4.009 3.145-6.064.888-1.903 1.826-3.781 2.714-5.659.786-1.7 1.141-3.603 2.207-5.176-.432-.101.228-1.548-.99-.761-.989.634-2.206.177-3.246 1.624-1.192 1.674-3.272 2.918-4.87 4.466-1.573 1.573-2.791 3.425-4.186 5.125-1.724 2.106-2.714 4.517-3.804 6.902-.99 2.208-1.624 4.593-2.562 6.826-1.649 4.009-3.222 8.043-4.997 12.002-1.573 3.501-3.501 6.851-4.49 10.606-.203.761-.482 1.802-1.319 2.284-.862.482-1.801.66-2.663-.076-1.268-1.041-.989-2.335-.507-3.578 1.268-3.121 2.13-6.394 3.728-9.388 1.116-2.056 1.801-4.339 2.943-6.369 1.42-2.563 2.384-5.354 3.348-8.044a137.731 137.731 0 0 0 2.689-8.094c.177-.559.76-1.244.202-1.802-.532-.508-1.09.203-1.648.279-.558.076-.812.457-1.167.761-1.421 1.168-2.638 2.69-4.033 3.73-3.019 2.284-4.566 5.583-6.544 8.501-1.928 2.892-3.729 5.988-5.073 9.337-1.243 3.096-2.638 6.141-3.754 9.262-1.472 4.136-3.146 8.196-4.693 12.281-.989 2.639-2.334 5.303-3.323 7.968-2.156 5.709-3.855 11.57-5.631 17.406-.609 1.929-1.623 3.629-2.181 5.583-.812 2.791-1.547 5.608-2.511 8.373-.482 1.421-.964 2.918-1.091 4.492-.076.837-.101 1.725-.254 2.588-.71 3.755-.989 7.587-.964 11.418 0 1.675.305 3.476.381 5.075.076 1.649.355 3.349.406 5.024.076 3.933 2.054 7.384 3.957 10.683 1.319 2.258 6.468 8.196 9.74 10.657 2.587 1.928 5.124 3.958 7.635 5.937 2.587 2.03 5.605 3.705 7.406 6.902a27.864 27.864 0 0 0 4.515 5.938c1.218 1.192 1.674 2.943 3.044 4.009 1.674 1.294 2.587 3.248 3.78 4.872 1.217 1.675 3.094 3.121 3.196 5.481 1.75.507 2.714 2.004 4.033 3.019 1.42 1.117 3.094 1.929 4.565 3.045.812.634 2.055 1.523 3.222.558 1.623-1.319 3.525-2.359 5.022-3.73 3.475-3.171 7.28-5.963 10.907-8.906 3.348-2.715 6.493-5.684 9.816-8.399 3.146-2.537 5.327-5.988 8.472-8.5.33-.279.939-1.32.381-1.751-1.091-.812-1.446-2.284-2.968-2.817-1.015-.33-2.334-.761-2.993-1.801a299.095 299.095 0 0 1-4.363-7.13c-2.029-3.426-4.008-6.851-6.011-10.277-1.649-2.791-3.323-5.608-4.972-8.399-1.725-2.943-3.196-5.785-2.384-9.338.634-2.664.304-5.43 1.141-8.119.533-1.777 1.725-3.096 2.537-4.669 2.333-4.542 4.844-9.033 8.142-12.992 1.623-1.928 3.196-3.933 5.047-5.608 1.801-1.598 3.754-3.07 5.429-4.821a20.39 20.39 0 0 1 3.83-3.045c1.344-.862 1.141-1.421.583-2.334-1.725-2.817-.989-7.003 1.091-9.617 1.065-1.319 1.598-1.218 2.714-.355-.634-1.142-.381-1.979.659-2.639.837-.533 1.801-.787 2.638-1.421.432-.304.787-.431.584-.888-.254-.508-.812-.863-1.345-.634-3.348 1.395-6.924 2.156-9.791 4.719-1.724 1.573-3.88 2.69-5.681 4.263-2.435 2.106-5.352 3.629-8.32 4.77-3.145 1.193-5.961 2.969-8.954 4.441-.558.279-1.37.254-1.623.634-.99 1.37-2.359 2.259-3.754 3.096-3.856 2.36-7.255 5.176-10.425 8.424-2.258 2.335-3.932 4.974-5.682 7.612-.305.457.101.889-.228 1.269-1.497 1.649-1.877 3.781-2.309 5.862-.38 1.776-1.319 3.501-.507 5.48.33.863-.33 1.954-.178 2.995.254 1.497-.684 1.167-1.699 1.446-.964.279-1.167.203-1.294-.508-.177-.837-1.496-.482-1.369-1.42.279-2.208-.355-4.441.279-6.623.811-2.766 1.268-5.608 2.587-8.323 1.319-2.766 2.892-5.303 4.692-7.739.787-1.091 1.776-2.106 2.486-3.197 1.827-2.69 4.49-4.365 6.925-6.268 2.029-1.598 4.363-2.816 6.468-4.339 2.638-1.877 5.301-3.654 8.32-4.897 2.46-1.015 2.967-2.284 1.699-4.669a3.196 3.196 0 0 1-.253-2.36c.558-1.928 1.293-3.907 2.181-5.582 1.42-2.766 2.638-5.735 4.845-8.094.608-.635 1.293-1.371 1.648-2.259 1.015-2.613 3.044-4.516 4.693-6.698 1.902-2.563 3.881-5.075 5.758-7.638 1.75-2.461 3.906-4.618 5.605-7.13 1.776-2.665 3.602-5.303 5.708-7.689 1.217-1.395 1.496-3.527 3.373-4.364-.735-1.345 1.319-1.091 1.243-2.182-.076-.812.228-1.573.786-2.309.685-.965-.025-2.462-1.09-2.335Zm-61.84 69.805c-1.04.254-2.537.279-3.196-.482-1.142-1.294-2.79-1.573-4.008-2.588-2.029-1.7-4.667-2.106-7.051-2.817-2.08-.634-4.338-1.167-6.595-1.37-.736-.076-1.979.127-1.903-1.32.051-1.091.203-2.106 1.446-2.486.381-.127.482-.203.71.279.33.634.609.583.888-.203.355-.964.786-.178 1.091-.127 1.851.381 3.728.076 5.58.787 3.297 1.319 6.671 2.334 9.74 4.212 1.446.888 2.765 1.954 4.236 2.765.584.305.051.787.051 1.193.456 1.091-.254 1.979-.989 2.157Z" fill="#4E3413"/><path d="M193.205 170.236c-.177-5.734-1.192-11.19-4.87-15.808-1.598-2.03-4.007-3.248-6.468-2.943-4.845.634-6.214 2.41-7.178 7.383-.533 2.868-.609 5.786-1.015 8.628-.862 5.912-1.623 11.824-2.942 17.66-.609 2.563-1.116 5.177-2.131 7.587-1.217 2.893-1.978 5.912-2.967 8.805-.914-1.649-.888-3.705-.964-5.405-.178-5.658-.508-11.266-.812-16.899-.076-1.167-.837-2.588-.634-3.096.888-2.486.051-4.872-.178-7.181-.685-7.028-1.623-14.006-3.323-20.883-1.724-7.003-3.196-14.133-5.58-20.933-1.851-5.278-4.185-10.378-6.95-15.326-3.247-5.887-7.711-10.125-13.19-13.601-1.648-1.04-3.348-1.066-5.073-.203-3.069 1.522-5.2 5.938-4.464 9.211.178.888.406 1.852-.558 2.613-.989-1.421-2.359-2.309-3.729-3.121-1.927-1.167-3.906-.964-6.037-.152-2.688 1.066-2.815 3.603-3.373 5.709-.837 3.147-.457 6.369.203 9.541a409.52 409.52 0 0 0 1.344 5.912c-1.877-1.192-3.779-1.725-5.606-2.157-3.069-.71-5.986.356-6.873 3.198-.482 1.573-.533 3.273-.33 4.948.279 2.309.532 4.618 1.192 6.851.583 2.055 1.42 4.009 1.928 6.115.913 3.704 2.156 7.333 3.399 10.987.989 2.969 1.851 5.988 2.663 8.982.685 2.639.178 5.557.862 8.298.026.152-.228.406-.38.583-.152.153-.355.102-.457-.076-.786-1.471-2.156-2.791-2.562-4.187-.634-2.232-1.826-4.009-3.043-5.81-1.598-2.385-2.41-5.405-5.327-6.801-1.015-3.552-4.287-5.176-6.722-7.383-2.029-1.827-4.54-3.908-7.863-2.563-2.055-1.497-2.74.457-3.399 1.573-1.573 2.639-1.395 5.532-.558 8.373 1.167 3.933 3.45 7.334 5.403 10.886.558.99 1.902 1.852 2.03 2.487.38 1.852 1.521 3.146 2.383 4.592 3.602 5.938 7.23 11.901 9.081 18.625 1.243 4.542 1.852 9.262 2.131 14.007.355 5.684.279 11.342.127 17.001-.102 4.415-.837 8.83-1.472 13.22-.126.888-.05 2.334-1.877 2.283-4.464-.152-9.943 2.69-11.566 6.648-.736 1.726-2.004 3.274-3.221 4.771-4.845 6.039-9.944 11.849-15.194 17.584-4.439 4.846-8.903 9.693-13.291 14.59-5.048 5.633-9.893 11.419-14.712 17.229a204.59 204.59 0 0 1-3.07 3.578c-.532.609-1.166.609-1.547.102-1.648-2.157-4.236-3.096-6.366-4.466-3.957-2.588-8.421-4.39-13.292-4.568-4.007-.152-7.71.736-10.83 3.527-1.193 1.066-3.196 1.548-3.374 3.35-.203 2.157-.609 4.364-.583 6.521.076 4.136 1.877 7.841 3.5 11.571 2.181 4.998 6.214 8.576 9.69 12.535 2.714 3.07 5.63 6.013 8.42 9.007 4.313 4.644 8.828 9.034 13.495 13.271 4.236 3.832 8.852 7.232 13.164 10.987 4.211 3.654 8.32 7.435 12.683 10.886 3.754 2.969 7.635 5.785 11.642 8.348 3.095 1.979 6.393 3.628 9.538 5.506 4.007 2.385 8.117 4.542 12.58 5.963 3.07.99 6.266 1.193 9.437 1.269 3.043.101 6.037-.761 8.903-1.929 3.145-1.294 5.884-2.943 7.482-6.267 1.066-2.258.711-4.314.482-6.521-.405-3.68-1.623-7.054-4.033-9.846-2.536-2.968-5.326-5.683-8.269-8.272-.659-.583-1.471-1.395-.532-2.232 1.877-1.701 3.551-3.502 5.022-5.634 2.359-3.476 5.58-6.318 7.99-9.819 1.243-1.827 2.613-3.604 4.008-5.329 1.319-1.624 2.511-3.375 3.576-5.1 2.689-4.339 5.631-8.501 8.371-12.814.558-.914.405-2.259 1.116-2.766 1.623-1.193 1.902-3.121 2.891-4.618 3.019-4.567 3.602-9.845 3.602-15.149 0-2.232-.076-4.618-1.598-6.673-.33-.431-.862-1.928.076-2.969 1.319-1.471 2.435-3.121 3.754-4.593 2.537-2.816 5.2-5.506 7.686-8.373 1.141-1.294 2.232-2.715 3.373-3.882 2.131-2.157 3.754-4.669 5.758-6.902 2.004-2.208 3.729-4.669 5.504-7.08 2.791-3.755 5.073-7.815 7.788-11.621 4.083-5.785 6.975-12.205 9.359-18.802 1.497-4.212 2.461-8.602 3.653-12.916 1.116-4.009 1.496-8.12 2.207-12.179.456-2.512.583-5.151.837-7.74.558-6.064.532-12.154.634-18.218.051-3.832-.457-7.663-.584-11.495Zm-37.591-2.69c-.837.609-1.369 1.371-2.739 1.168-1.015-.153-2.663-.432-3.374 1.116-.025.076-.203.102-.304.152-.482-1.421-1.776-.659-2.663-.964-1.37-.457-1.37-1.573-1.319-2.588.05-1.116 1.369-.888 1.902-.939 3.754-.254 7.331-.812 10.248-3.933.735 4.136 1.268 3.756-1.751 5.988Zm-25.973-63.993c.253-1.244.913-1.65 2.232-1.092 3.931 1.624 6.823 4.441 9.182 7.816 3.5 5.049 6.29 10.479 8.193 16.315 1.192 3.578 2.004 7.308 3.069 10.937 1.623 5.531 2.765 11.164 4.109 16.772.076.355.076.711.101 1.04-.152.483.356 1.421-.862 1.015-.38-.101-.533.406-.685.711-1.319 2.512-3.627 3.527-6.214 3.882-3.627.508-3.602.432-4.262-3.222-.558-2.995-.989-6.039-1.826-8.983-.786-2.639-.837-5.455-1.725-8.043-.989-2.817-1.877-5.659-3.196-8.323-1.826-3.705-3.399-7.536-5.149-11.292-1.674-3.654-3.145-7.561-3.551-11.723-.177-1.979.178-3.882.584-5.81Zm7.812 212.281c-.507 1.674-1.623 3.045-2.537 4.516-2.561 4.162-4.844 8.551-7.761 12.459-3.12 4.187-5.834 8.678-9.03 12.814-1.75 2.284-3.425 4.644-5.124 6.927-1.395 1.878-3.323 3.578-4.997 5.329-1.116 1.167-2.054 2.512-3.348 3.527-.609.457-.837 1.142-1.902.939-.609-.152-1.649.761-1.573 1.446.254 1.878-1.091 2.842-2.03 3.933-2.08 2.36-4.438 4.466-6.467 6.877-2.968 3.527-6.392 6.622-9.512 9.997-.406.431-.863.913-1.04 1.472-.229.786-.584.888-1.243.583-.66.584-.964-.076-1.344-.38-2.486-1.954-5.15-3.603-7.864-5.253-2.46-1.522-4.794-3.476-7.076-5.379-3.4-2.867-6.722-5.836-10.172-8.678-.736-.609-2.511-.939-2.511-1.37.025-1.472-1.116-1.65-1.826-2.259-3.146-2.588-6.468-4.948-9.461-7.688a253.213 253.213 0 0 1-12.1-11.824c-2.74-2.842-5.377-5.811-8.243-8.552-1.167-1.116-2.004-2.537-3.323-3.501-.634-.457-.558-.914.05-1.396 3.222-2.537 5.961-5.582 9.513-7.84 2.46-1.548 4.59-3.807 6.772-5.837 2.942-2.74 5.606-5.709 8.269-8.678.178-.177.38-.329.482-.532 1.7-3.02 3.83-5.735 5.96-8.45 1.421-1.827 3.12-3.349 4.237-5.532.532-1.015 2.029-2.08 3.12-3.07 2.562-2.309 4.54-5.151 6.95-7.587 2.79-2.791 5.377-5.734 8.04-8.652 2.207-2.411 4.059-5.151 6.29-7.46 2.588-2.665 4.795-5.608 7.154-8.425 1.395-1.649 2.714-3.375 3.88-5.201.787-1.193 1.294-.914 2.055-.127 2.993 3.019 5.834 6.191 9.03 8.957 2.258 2.004 4.109 4.364 6.418 6.293 2.359 1.953 4.033 4.516 5.96 6.851 4.059 4.922 7.61 10.251 11.212 15.529 1.851 2.664 3.5 5.481 5.707 7.916.812.889 1.395 2.183 2.054 3.299.888 1.472 2.08 2.741 3.12 4.009 1.319 1.573 2.232 3.451 3.704 4.897 1.522 1.548 1.014 3.375.507 5.101Zm51.288-120.883c-.431 8.627-1.649 17.178-3.551 25.602a85.21 85.21 0 0 1-5.935 17.559c-2.131 4.568-4.794 8.881-7.661 13.043-.862 1.243-1.496 2.689-2.232 4.009-.837 1.446-2.435 2.461-2.993 4.11-.938 2.766-3.5 4.213-5.073 6.471-1.674 2.334-3.678 4.44-5.453 6.724-3.044 3.882-6.57 7.282-9.766 10.987-1.674 1.903-3.323 3.882-5.022 5.735-2.638 2.842-4.794 6.039-7.534 8.881-4.515-5.583-8.091-11.723-12.302-17.458-2.764-3.781-5.352-7.764-8.446-11.291-2.689-3.071-5.504-6.09-8.548-8.856-1.497-1.345-2.892-2.842-4.338-4.237-.355-.33-.507-.584-.304-1.092 2.207-5.303 2.942-10.961 3.779-16.594 1.091-7.283 1.725-14.616 1.624-22-.051-5.608-.102-11.241-1.192-16.798-.685-3.45-1.37-6.927-2.486-10.251-1.116-3.248-2.765-6.267-4.388-9.261-2.334-4.289-5.302-8.171-7.737-12.383-1.953-3.426-3.88-6.851-5.403-10.505-.279-.66-.532-1.37-.608-2.081-.102-.786-.584-1.725.304-2.309.964-.659 1.953-.152 2.689.406 5.96 4.618 10.957 10.023 14.407 16.798 1.725 3.375 3.754 6.597 5.53 9.921.38.736 1.014 1.091 1.547 1.371.609.329.989.583 1.192 1.268.228.838.863 1.32 1.801 1.142.837-.152 1.623-.051 2.029-1.218 1.091-3.121 1.192-6.267 1.015-9.49-.431-8.043-2.892-15.63-5.403-23.217-1.674-5.1-3.373-10.201-4.388-15.504-.101-.533-.076-1.091-.025-1.624.05-.989-.203-2.334.761-2.791 1.014-.482 2.308.101 3.196.736 1.877 1.319 3.525 2.943 4.515 5.1.101.228.228.533.405.584 3.222.812 4.084 3.603 4.972 6.191 1.573 4.567 3.602 9.008 4.642 13.753 1.217 5.608 1.572 11.266.964 17.001-.33 3.019-.761 5.988-1.522 8.931-.355 1.472.71 3.35 1.851 3.223 1.269-.127 2.486-.761 2.791-2.309a74.64 74.64 0 0 0 1.572-14.058c.076-4.059-.051-8.069-.888-12.002a75.431 75.431 0 0 0-4.743-14.717c-1.446-3.349-2.46-6.876-3.729-10.302-1.572-4.313-3.145-8.627-3.576-13.22-.203-2.055-.457-4.136.051-6.216.456-1.827 1.598-2.309 3.272-1.523 1.42.685 2.308 1.853 3.323 2.918 1.217 1.294 2.536 2.487 4.109 3.274 1.42.71 1.446 2.182 1.826 3.298 1.218 3.502 3.12 6.699 4.49 10.125 1.395 3.501 3.145 6.851 4.16 10.555.811 3.02 1.902 6.014 2.409 9.033.736 4.416 1.497 8.881 1.547 13.398.051 3.349.279 6.674.178 10.048-.051 1.7-.304 3.375-.304 5.05 0 1.218.659 2.41 2.105 2.436 1.167 0 2.232-.381 2.46-1.903.279-1.827.66-3.604.406-5.456-.177-1.192.355-1.294 1.37-1.04 3.754.964 7.432 1.192 10.932-1.015 1.04-.66 1.471-.102 1.497.989.076 4.847.406 9.693.71 14.515.203 3.095.38 6.267.736 9.388.304 2.461.228 4.948 1.09 7.333.203.508.178 1.117.99.99-.305.939 1.8 1.167.634 2.563-.711.837-.584 2.233.126 3.222.559.736 1.548.99 2.486.761.736-.177 1.446-.431 1.674-1.37.964-4.187 2.993-7.967 4.312-12.027 1.269-3.883 2.613-7.739 3.501-11.698.583-2.512 1.141-5.049 1.471-7.612.33-2.664.71-5.354 1.192-7.993.558-3.02.634-6.141 1.015-9.211.152-1.218.558-2.461.938-3.654.634-2.03 2.258-2.41 4.109-1.345 2.791 1.599 3.551 4.289 3.957 7.08.558 3.933.787 7.891 1.015 11.875.355 6.42.178 12.814-.127 19.234ZM75.588 52.73c.634-2.995.938-5.583 1.724-8.12.254-.787.685-1.396 1.116-2.005.102-.152.761-1.548 1.091 0 0 .102.304.178.482.178 2.004-.076 2.511.279 2.765 2.309.406 3.298.685 6.597 1.09 9.896.127.99.356 1.953.635 2.892.304.914.913.533 1.395.153.786-.61 1.395-1.37 2.435-1.7.355-.102.431-.94 1.065-.28.152.153.38.127.38-.279.026-1.903 1.193-2.436 2.867-2.258.127 0 .33.076.33.05.456-1.04 1.192-1.116 1.8-.304.685.888 1.243 1.98.381 3.121-1.725 2.36-3.45 4.72-5.682 6.648-2.029 1.726-2.13 3.299-.076 4.974 2.587 2.131 5.25 4.187 7.838 6.293 2.283 1.852 2.13 4.44-.28 5.379-1.166.457-2.333-.102-3.373-.38-2.282-.61-4.464-1.625-6.696-2.411-.583-.203-.406-.94-1.167-1.218.178 1.294.913 2.157 1.446 3.095.38.71.99 1.218.71 2.259-.203.786.99 1.04 1.42 1.75.888 1.447 1.675 2.868 1.903 4.542.203 1.447.228 3.02-1.37 3.63-1.395.532-2.587-.204-3.55-1.397-2.436-2.968-5.15-5.709-7.078-9.058-.152-.28-.558-.558-.862-.558-.507 0-.66.583-.71.913-.61 4.01-3.146 6.851-5.657 9.744-.989 1.116-3.45 1.472-4.997.761-1.547-.71-1.902-2.005-1.75-3.578.305-2.892 1.776-5.328 3.095-7.815.532-.99.862-2.157 1.851-2.842.33-.228.508-.533.406-.939-.152-.609-.66-.355-1.065-.38-3.602-.381-7.255-.229-10.831-1.066-2.359-.558-3.703-1.573-3.678-3.096.025-1.395 2.283-2.309 4.236-2.309 2.359 0 4.718.026 7.051 0 .406 0 1.066.254 1.243-.406.153-.558-.38-.837-.735-1.142-2.993-2.613-6.113-5.05-9.005-7.764-1.192-1.117-1.42-2.208-.913-3.502.482-1.192 1.7-1.497 2.866-1.42 2.816.202 5.276 1.547 7.711 2.841.634.33 1.294 1.066 1.903.685.482-.304.127-1.192 0-1.852-.533-2.563-1.269-5.151-1.395-7.74-.153-3.146-1.7-5.937-1.75-9.109 0-1.344.05-2.765-.432-4.161-.38-1.066.152-2.284 1.395-2.715 1.066-.355 1.75-.228 2.588 1.04 1.319 2.005 2.003 4.01 2.13 6.344.05.837.71 1.624.99 2.487.862 2.588 1.395 5.277 1.851 7.967.102.61.482.939.837 1.827l.026.025Zm10.754 18.7c-1.344-.99-2.333-2.106-3.246-3.476-.71-1.091.66-1.294.279-2.334-.508-1.37-.203-2.107-1.598-3.07-.61-.432-.812-.99-1.066-1.574-.431-1.015-.811-2.055-1.192-3.07-.152 0-.304.05-.457.05.178 2.284-1.75 4.263-.786 6.7.228.583-.228 1.192-.609 1.268-1.395.33-2.333 1.624-3.83 1.75-.355.026-.786.102-.684.61.278 1.268-1.243 3.298 1.521 3.552.33.026.863.533.888.838.127 1.7 1.37 1.344 2.385 1.395.228 0 .532 0 .71.127 1.319 1.142 1.37.102 1.522-.863.228-1.42.811-2.207 2.536-1.928 1.116.177 2.359.38 3.602 0l.025.025ZM361.249 99.797c-.203 2.918.33 5.709.787 8.475.406 2.309.152 4.618.507 6.927.254 1.599-.913 2.487-2.283 2.791-1.014.229-1.37-.837-1.877-1.548-1.496-2.182-1.471-4.871-2.46-7.257-.939-2.258-1.446-4.668-2.182-7.003-.253-.812-.761-.939-1.471-.33-1.775 1.523-3.957 2.157-6.189 2.715-1.75.432-3.551.381-5.327.482-.684.051-1.471-.126-1.902-.837-.228-.355-.786-.812.203-.964.228-.026.685.152.659-.305 0-.253-.228-.685-.405-.736-2.511-.583-.609-1.7-.153-2.283 1.142-1.421 3.095-1.802 4.465-3.147-.685-.532-1.37-1.09-2.08-1.598-.837-.584-1.243-1.447-1.015-2.36.254-1.015.634-2.132 2.004-2.335.583-.101 1.167-.304 1.75-.482 1.522-.456 1.776-1.37 1.421-2.892-.964-4.11-2.867-8.044-2.588-12.383.102-1.548-.431-3.425 1.827-4.288.634-.254 1.09-.355 1.623-.178.558.178 1.141.508.102.94 0 0-.001.151.025.177 3.526 1.624 2.841 5.658 4.591 8.145 3.374-2.258 5.479-5.963 9.106-7.993 1.978-1.117 4.464-1.117 5.352.28.989 1.547.482 3.323.127 5.023-.584 2.918-2.182 5.481-2.942 8.45 1.648-.355 3.272-.558 4.743-1.091 1.725-.61 3.5-.28 5.25-.533 2.055-.28 3.983 1.066 4.186 2.36.253 1.573-1.015 3.374-2.968 4.186a94.348 94.348 0 0 1-9.005 3.121c-.406.127-.989.254-1.065.736-.051.33.355.559.685.761a25.357 25.357 0 0 1 7.026 7.207c.685 1.04.38 2.182-.381 2.994-1.065 1.116-2.409 1.04-3.601.228-1.649-1.116-3.298-2.207-4.642-3.78-.508-.584-1.75-.584-1.928-1.777l.025.102Zm-.71-21.873c-.304.254-.507.482-.735.635-.254.127-.558.177-.863.253-.71.153-1.522 1.066-1.547 1.168-.457 2.182-1.953 3.577-3.424 4.998-.153.153-.229.178-.254.482 0 1.7-.558 2.107-2.46 2.183-.558.025-1.446.583-1.218.888.685.913.304 1.725-.051 2.41-.862 1.599-.938 2.766 1.218 3.172.127 0 .304.28.304.431-.177 2.106.939 2.411 2.664 2.005.253-.05.684 0 .837.203.887.964 1.395.025 1.572-.457.482-1.345 1.218-2.613 1.167-4.136 0-.583 0-1.116-.558-1.32-1.395-.43-.938-1.75-.634-2.207 1.167-1.801 1.243-4.009 2.41-5.734.482-.71.253-2.005 1.598-2.03.228 0 .228-.33.126-.38-1.293-.762.279-1.523-.126-2.538l-.026-.026ZM187.905 74.116c-.482-.152-.964 1.421-1.193.076-.304-1.7-1.598-2.588-2.485-3.806-3.323-4.542-5.327-9.718-7.585-14.793-1.471-3.299-3.272-6.445-4.235-9.947-.102-.38-.863-.583-.914-1.116-.025-.305-.811-1.117.457-.964.355.05.431-.736.101-.812-.431-.127-.456-.99-1.116-.533-.355.254-.431.228-.608-.305-.609-1.725-1.193-3.45-1.7-5.201-.228-.787.558-.559.913-.736.381-.178 1.142.304.913-.812-.126-.685 0-1.04-.887-.888-.508.076-.66-.482-.711-.964-.076-.71.178-1.523-.405-2.132a.53.53 0 0 1-.127-.33c.05-.355.279-.939.507-.837 1.623.584 2.587-2.31 3.703-1.142 2.156 2.258 4.186 4.821 4.668 8.12.126.786.76.228.989.71.735 1.599 1.75 3.02 2.004 4.872.076.584.634 1.573 1.242 2.335 1.066 1.294 1.649 3.07 2.106 4.669.811 2.867 2.308 5.379 3.297 8.145 1.066 2.943 2.41 5.81 3.653 8.652a232.77 232.77 0 0 0 3.551 7.714c1.167 2.436 2.131 4.973 3.171 7.46.076.152.05.406.152.507 3.221 2.842 3.17 7.156 4.718 10.734.634 1.472.811 3.222 1.395 4.796.101.253 0 .609-.051.888-.38 1.395-.939 2.689-.964 4.212 0 .837-1.116 1.294-2.08 1.167-1.268-.178-2.486-1.015-2.587-2.055-.203-2.182-1.649-3.756-2.283-5.71-.812-2.511-1.852-4.998-2.866-7.46-1.116-2.74-2.384-5.43-3.424-8.17-.558-1.472-1.015-2.969-1.852-4.263-.66-1.04.888-1.193.456-2.03l.077-.05ZM231.71 83.504c-1.497-.228-1.04-1.167-1.167-1.98-.33-2.207.862-4.084 1.192-6.14.304-1.827.178-3.831.786-5.404.711-1.853.381-3.4.229-5.1 0-.28.076-.61.228-.838 1.674-2.385 1.091-4.999.913-7.612-.279-3.502.406-6.928 1.04-10.378.33-1.802 1.116-3.553 1.091-5.43 0-.813.228-1.523.558-2.233 1.319-2.69 1.319-5.735 2.13-8.552.609-2.106 1.345-4.161 2.791-5.861.684-.812 3.069-.28 3.88.888 1.218 1.75 1.548 3.806 1.725 5.861.127 1.777-.05 3.553-.101 5.304-.076 2.182-.584 4.39-.228 6.597.228 1.472-.761 2.74-1.015 4.187-.304 1.725-.888 3.375-1.091 5.176-.253 2.157-1.04 4.212-1.775 6.268-.787 2.258-2.664 4.516-2.613 6.495.076 2.665-1.217 5.05-.837 7.663.152 1.066-.38 2.056-1.547 2.386.101.609 1.268.025.888.939-1.345 3.298-1.345 6.901-2.461 10.276-.456 1.421-1.217 2.639-1.725 4.035-.482 1.319-2.206.888-3.373.279-2.283-1.218-1.142-3.121-1.471-4.72-.279-1.37.076-2.157 1.927-2.106h.026ZM208.095 75.566c.634-.025 1.04-.05 1.572-.076-.152-.228-.228-.38-.329-.457-.914-.558-1.598-1.142-.584-2.258.355-.38.533-.888-.456-.66-.482.127-.381-.507-.381-.812-.177-2.715-.761-5.455-1.446-7.993-.887-3.349-.507-6.85-1.674-10.124-.304-.812-.456-1.878.127-2.918.279-.507-.279-1.37-.38-2.106-.381-3.02.177-5.912.456-8.856.102-1.04 1.243-1.243 1.826-1.37.964-.178 1.903.457 2.562 1.345a10.555 10.555 0 0 1 1.903 4.745c.253 1.878 1.09 3.527 1.395 5.38.253 1.598.304 2.968-.431 4.516-.355.761-.153 2.309.228 2.969 1.268 2.258.71 4.82 1.598 7.13 1.344 3.476 1.04 7.308 2.207 10.91.659 2.056 1.293 4.517.101 7.055-1.141 2.461-.761 2.639-2.435 3.425-.203.102-.533.33-.558.229-.457-1.269-1.928-1.015-2.638-1.7-1.015-.99-1.192-2.462-1.496-3.882-.305-1.472-.051-3.122-1.218-4.492h.051ZM163.782 81.857c-.786.863.051 1.218.558 1.802 1.801 2.08 3.83 3.933 5.733 5.938 2.866 2.994 5.757 5.988 7.888 9.59.609 1.016 1.116 2.031 0 3.046-.938.863-2.029.837-3.12.38-1.902-.786-3.044-2.537-4.718-3.628-1.166-.761-2.105-2.106-3.12-2.715-1.674-.99-3.12-2.182-4.616-3.375-2.283-1.801-4.642-3.552-6.417-5.912-.482-.634-1.218-.736-1.801-1.066-1.979-1.192-3.095-3.222-4.591-4.796-1.776-1.877-3.957-3.882-3.831-7.054.051-1.623 1.117-2.334 2.131-2.968.71-.432 1.624.279 2.41.736 2.207 1.319 4.388 2.69 6.747 3.73 2.308 1.014 4.287 2.537 5.986 4.44.457.533.533 1.193.761 1.903v-.05ZM314.983 32.708c-.202 2.36.102 4.974-.405 7.359-.508 2.41.786 3.933 1.445 5.81.305.863 1.243 1.066 1.776.71 1.344-.938 2.384-.253 3.069.61.888 1.091.228 2.309-.456 3.35-.508.735-1.218 1.344-1.674 2.08-2.537 4.01-4.186 8.399-5.429 12.966a3.496 3.496 0 0 1-.456.99c-.634 1.015-1.395 1.827-2.74 1.472-1.293-.356-1.75-1.396-1.775-2.589-.076-2.639.177-5.303-.431-7.916-.279-1.142-.609-2.31-1.091-3.375-.888-1.878-2.511-2.817-4.515-3.096-1.04-.152-1.877-.457-2.283-1.65-.609-1.725.051-2.79 1.953-2.79 1.319 0 1.75-.457 1.674-1.827-.05-.761.634-.838.939-.787 2.79.508 3.272-1.75 3.957-3.45 1.141-2.843 1.522-5.913 1.953-8.933.203-1.37.964-2.309 2.46-2.36 1.243-.05 2.055 1.295 2.08 3.426h-.051Zm-7.533 15.605c3.095 1.624 3.83 4.212 4.54 7.08 1.015-1.447 1.218-2.867 2.106-3.933.304-.38.329-1.015-.229-1.244-1.902-.786-2.511-2.537-3.119-4.237-1.294.482-1.37 2.157-3.273 2.334h-.025ZM251.545 93.68c.507-1.168-.279-2.843.761-4.162.051-.076 0-.305.025-.33 1.7-.812.559-2.487 1.091-3.654.431-.99.051-2.36 1.471-2.842.102-.025.229-.203.203-.279-.558-2.537.837-4.694 1.243-7.029.482-2.918 1.421-5.734 2.74-8.17 1.42-2.639 2.206-5.735 4.641-7.815 1.167-1.015 2.968-.685 3.678.532 2.131 3.578.787 6.928-.456 10.277-1.04 2.791-1.725 5.71-3.146 8.374-.583 1.09-.532 2.436-.507 3.704.051 1.599-.228 2.867-1.699 4.01-1.446 1.141-2.232 3.07-2.689 4.82-.507 1.954-1.978 3.375-2.435 5.304-.355 1.497-2.029 1.7-2.79 1.192-1.142-.786-2.74-1.725-2.182-3.907l.051-.026Z" fill="#000"/><path d="M43.704 215.426c-.127-2.791-.253-5.583-1.674-8.095-.355-.609-.66-1.37-1.623-1.065-1.192.38-2.308-.127-2.866-.965-.685-.964-.508-2.283.38-3.197 1.928-2.004 1.826-4.592 2.181-7.054.432-2.892.305-5.81.33-8.703 0-.812.152-1.497.634-2.208.609-.837 1.395-1.243 2.283-1.116.863.127 1.497.812 1.725 1.7.38 1.345.025 2.766.203 4.06.406 3.172.177 6.496 1.775 9.464.305.559.432 1.066 1.117 1.244.811.228 1.319-.178 1.674-.761.355-.584.913-.939 1.37-1.421.76-.863 1.623-.863 2.358-.203.812.735 1.522 1.624.812 2.867-1.674 3.019-2.587 6.318-3.45 9.617a173.459 173.459 0 0 1-2.333 8.069c-.33 1.04-1.116 1.827-2.283 1.649-.939-.152-1.979-.152-2.13-1.751-.052-.558-.381-1.421-.457-2.182l-.026.051Zm3.095-8.805c.685-1.472 1.395-2.867-1.04-3.375-.508-.101-.939-.736-1.294-1.218-.279-.38-.583-.761-.99-.431-.557.457.128 1.091.305 1.167 1.598.812 2.03 2.512 3.019 3.857ZM128.144 23.773c-.913 1.548-2.46 1.498-3.703 1.777-1.167.253-1.548.558-1.548 1.827 0 2.36-1.268 2.994-3.322 2.055-.913-.431-.888-1.218-.812-1.827.228-1.827-.66-1.675-1.928-1.421-1.04.228-2.257.33-2.891-.736-.533-.888.025-1.827.456-2.715.33-.66.913-.457 1.421-.584 2.917-.685 3.246-1.09 2.764-4.11-.253-1.523.964-2.715.711-4.238-.026-.152.71-.862 1.293-.66.787.254 1.776.559 1.827 1.472.101 1.472.558 2.918.279 4.44-.229 1.295.101 2.158 1.775 2.005 1.116-.101 2.41-.482 3.221.838.127.203.787.05.432.609-.254.38-.457.076-.736-.051-.735-.33-1.573-.99-2.131.076-.228.457-.025 1.142-.025 1.7.685-.253 1.522.584 2.156-.253.127-.178.254-.432.812-.28l-.051.076ZM340.095 159.3c-1.04-.127-1.624-.71-2.283-1.142-1.091-.71-1.243-2.892-.102-3.273 1.04-.33 1.345-.913 1.548-1.725.203-.787 1.065-.66 1.42-1.218-.279-.66-1.75-.229-1.268-1.599.177-.507.101-1.243.609-1.421.71-.254.279.685.659.914.406.253.888.786 1.268.482 1.852-1.574 1.573.583 1.674 1.091.153.888.279.989 1.193.939 1.293-.102 2.359.532 2.485 2.03.102 1.319-.634 2.004-1.877 2.207-1.369.228-1.978.914-1.826 2.411.127 1.294-.304 2.512-1.573 3.248-.963.558-2.079.507-2.561-.406-.356-.66-1.573-2.03.634-2.538ZM278.94 6.878c-.279.888-.508 1.98-1.547 2.335-.888.279-1.827-.051-2.258-.99-.279-.609-.609-.71-1.243-.736-.938-.05-1.75-.533-2.029-1.497-.254-.888.101-1.573.888-2.131.608-.432.786-1.142.887-1.903.153-1.015.838-1.574 1.878-1.878 1.217-.355 1.471.583 1.851 1.243.964 1.675 1.04 3.654 1.573 5.557ZM258.318 180.108c.457 1.091-.254 1.979-.989 2.157-1.04.254-2.537.279-3.196-.482-1.142-1.294-2.79-1.573-4.008-2.588-2.029-1.7-4.667-2.106-7.051-2.817-2.08-.634-4.338-1.167-6.595-1.37-.736-.076-1.979.127-1.903-1.319.051-1.092.203-2.106 1.446-2.487.381-.127.482-.203.71.279.33.634.609.584.888-.203.355-.964.786-.178 1.091-.127 1.851.381 3.728.076 5.58.787 3.298 1.319 6.671 2.334 9.74 4.212 1.446.888 2.765 1.954 4.236 2.766.584.304.051.786.051 1.192Z" fill="#000"/></g></g><defs><linearGradient id="c" x1="40.84" y1="42.371" x2="388.572" y2="297.259" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="d" x1="40.84" y1="42.371" x2="388.572" y2="297.259" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="e" x1="40.84" y1="42.371" x2="388.572" y2="297.259" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="f" x1="40.84" y1="42.371" x2="388.572" y2="297.259" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="g" x1="40.84" y1="42.371" x2="388.572" y2="297.259" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><linearGradient id="h" x1="40.84" y1="42.371" x2="388.572" y2="297.259" gradientUnits="userSpaceOnUse"><stop stop-color="#9059FF"/><stop offset=".521" stop-color="#FF4AA2"/><stop offset="1" stop-color="#FFBD4F"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h388.656v400H0z"/></clipPath><clipPath id="b"><path fill="#fff" d="M0 0h388.644v400H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mr-rtamo-background-image.svg b/browser/components/aboutwelcome/assets/mr-rtamo-background-image.svg
new file mode 100644
index 0000000000..25a66c2a96
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-rtamo-background-image.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="400" height="550" fill="none"><g clip-path="url(#a)"><path fill="#fff" d="M0 0h400v550H0z"/><path fill="url(#b)" d="M0 0h400v550H0z"/><path fill="url(#c)" fill-rule="evenodd" d="M272.671 215.932a56.175 56.175 0 0 1 20.086 25.394 102.923 102.923 0 0 1 6.497 50.298c-.062.517-.12 1.034-.178 1.551-.087.775-.174 1.549-.274 2.324-8.841 51.21-55.389 87.146-107.17 82.735-51.78-4.41-91.58-47.701-91.632-99.669v-.516a95.098 95.098 0 0 1 1.64-13.809v-.219c.117-.969.801-5.373.995-6.252l.129-.671a84.495 84.495 0 0 1 13.485-30.329 88.718 88.718 0 0 1 9.352-11.212 72.249 72.249 0 0 1 9.791-8.383 18.712 18.712 0 0 1 3.332-1.782 54.875 54.875 0 0 0 3.462 25.084 74.104 74.104 0 0 1 24.103-18.626 46.31 46.31 0 0 0 .284 24.464 30.49 30.49 0 0 1 2.583 1.964 50.087 50.087 0 0 1 27.565-10.618 73.028 73.028 0 0 1 34.462-55.645h.077a.321.321 0 0 1 .194 0 .283.283 0 0 1 .232.284c.334 1.373.833 2.7 1.486 3.953.31.632.658 1.317 1.111 2.04.571.969 1.165 1.938 1.758 2.907l.592.968c6.306 9.941 13.179 17.733 19.878 25.328 9.963 11.294 19.542 22.154 26.3 38.998v-.168a103.795 103.795 0 0 0-10.14-30.393Zm-95.314 103.765c.135.064.267.129.399.196l-.399-.196Zm.399.196.19.096c.262.133.526.267.806.393l-.996-.489Z" clip-rule="evenodd"/><path fill="url(#d)" d="M292.757 241.316a56.175 56.175 0 0 0-20.086-25.394 103.795 103.795 0 0 1 10.14 30.393v.207a90.665 90.665 0 0 1-3.087 67.567c-15.135 31.483-47.797 50.697-82.668 48.632-47.269-1.323-87.258-35.343-96.139-81.789a43.096 43.096 0 0 1 .711-16.701A73.633 73.633 0 0 0 100 278.039v.516c.052 51.968 39.852 95.259 91.632 99.67 51.781 4.41 98.329-31.525 107.17-82.736.168-1.291.297-2.583.452-3.875a102.923 102.923 0 0 0-6.497-50.298Z"/><path fill="url(#e)" d="M292.757 241.316a56.175 56.175 0 0 0-20.086-25.394 103.795 103.795 0 0 1 10.14 30.393v.207a90.665 90.665 0 0 1-3.087 67.567c-15.135 31.483-47.797 50.697-82.668 48.632-47.269-1.323-87.258-35.343-96.139-81.789a43.096 43.096 0 0 1 .711-16.701A73.633 73.633 0 0 0 100 278.039v.516c.052 51.968 39.852 95.259 91.632 99.67 51.781 4.41 98.329-31.525 107.17-82.736.168-1.291.297-2.583.452-3.875a102.923 102.923 0 0 0-6.497-50.298Z"/><path fill="url(#f)" d="m244.104 253.103.632.465a54.394 54.394 0 0 0-9.3-12.129c-19.584-18.321-21.465-48.742-4.288-69.337a73.03 73.03 0 0 0-34.423 55.568c1.162-.078 2.325-.181 3.513-.181a50.518 50.518 0 0 1 43.866 25.614Z"/><path fill="url(#g)" d="M200.305 259.317a24.205 24.205 0 0 1-12.038 11.07c-28.417 0-33.093 17.231-33.093 17.231a42.266 42.266 0 0 0 23.586 32.77c.556.284 1.124.542 1.679.801.982.439 1.964.839 2.946 1.201a44.374 44.374 0 0 0 13.033 2.583c19.638 1.884 37.881-10.344 43.6-29.225 5.72-18.882-2.67-39.177-20.053-48.508a34.569 34.569 0 0 1 24.141 5.851 50.517 50.517 0 0 0-43.917-25.614c-1.188 0-2.351.104-3.513.181a50.084 50.084 0 0 0-27.564 10.618c1.537 1.292 3.255 3.022 6.884 6.6a157.767 157.767 0 0 0 24.309 14.441Z"/><path fill="url(#h)" d="M200.305 259.317a24.205 24.205 0 0 1-12.038 11.07c-28.417 0-33.093 17.231-33.093 17.231a42.266 42.266 0 0 0 23.586 32.77c.556.284 1.124.542 1.679.801.982.439 1.964.839 2.946 1.201a44.374 44.374 0 0 0 13.033 2.583c19.638 1.884 37.881-10.344 43.6-29.225 5.72-18.882-2.67-39.177-20.053-48.508a34.569 34.569 0 0 1 24.141 5.851 50.517 50.517 0 0 0-43.917-25.614c-1.188 0-2.351.104-3.513.181a50.084 50.084 0 0 0-27.564 10.618c1.537 1.292 3.255 3.022 6.884 6.6a157.767 157.767 0 0 0 24.309 14.441Z"/><path fill="url(#i)" d="m164.489 234.956 2.08 1.37a46.324 46.324 0 0 1-.285-24.465 74.1 74.1 0 0 0-24.102 18.626 49.388 49.388 0 0 1 22.307 4.469Z"/><path fill="url(#j)" d="M100.913 280.951c8.855 46.449 48.821 80.489 96.087 81.841 34.902 2.078 67.592-17.162 82.719-48.683a90.665 90.665 0 0 0 3.126-67.568v-.155.168a67.399 67.399 0 0 1-26.686 60.851l-.065.129c-35.921 29.257-70.305 17.657-77.268 12.917l-1.459-.723c-18.094-7.588-29.287-25.919-27.771-45.48a25.718 25.718 0 0 1-23.702-14.919 37.767 37.767 0 0 1 36.812-1.486 49.82 49.82 0 0 0 37.588 1.486 157.966 157.966 0 0 1-24.258-14.441c-3.629-3.578-5.347-5.309-6.884-6.601a30.882 30.882 0 0 0-2.584-1.963l-2.079-1.369a49.374 49.374 0 0 0-22.307-4.469 54.866 54.866 0 0 1-3.462-25.085 18.79 18.79 0 0 0-3.333 1.783 72.17 72.17 0 0 0-9.79 8.383 88.41 88.41 0 0 0-9.352 11.212 84.473 84.473 0 0 0-13.485 30.328 75.022 75.022 0 0 0-1.847 23.844Z"/><path fill="url(#k)" d="M235.433 241.43a54.418 54.418 0 0 1 9.3 12.128c.542.414 1.059.827 1.498 1.292a48.037 48.037 0 0 1 9.92 52.61 67.4 67.4 0 0 0 26.686-60.915c-11.328-28.224-30.523-39.655-46.204-64.378-.787-1.291-1.588-2.583-2.35-3.875a21.884 21.884 0 0 1-1.111-2.04 17.506 17.506 0 0 1-1.486-3.953.283.283 0 0 0-.232-.284.321.321 0 0 0-.194 0h-.077c-17.237 20.597-15.371 51.074 4.25 69.415Z"/><path fill="url(#l)" d="M246.226 254.776c-.439-.4-.956-.814-1.498-1.291l-.633-.465a34.567 34.567 0 0 0-24.142-5.852c17.295 9.372 25.613 29.614 19.906 48.439-5.707 18.824-23.866 31.039-43.453 29.23a44.35 44.35 0 0 1-13.033-2.584 46.696 46.696 0 0 1-2.945-1.201c-.555-.258-1.124-.517-1.679-.801 6.962 4.754 41.333 16.353 77.268-12.917l.064-.129a48.037 48.037 0 0 0-9.855-52.429Z"/><path fill="url(#m)" d="M155.166 287.63s4.624-17.231 33.092-17.231a24.205 24.205 0 0 0 12.039-11.069 49.82 49.82 0 0 1-37.588-1.486 37.769 37.769 0 0 0-36.813 1.486 25.719 25.719 0 0 0 23.703 14.919c-1.514 19.55 9.666 37.872 27.745 45.467.465.219.904.465 1.395.684a42.262 42.262 0 0 1-23.573-32.77Z"/><path fill="url(#n)" d="M292.757 241.326a56.175 56.175 0 0 0-20.086-25.394 103.795 103.795 0 0 1 10.14 30.393v.168c-11.302-28.172-30.497-39.603-46.178-64.326-.787-1.291-1.588-2.583-2.35-3.875a21.884 21.884 0 0 1-1.111-2.04 17.506 17.506 0 0 1-1.486-3.953.283.283 0 0 0-.232-.284.321.321 0 0 0-.194 0h-.077a73.028 73.028 0 0 0-34.462 55.645c1.162-.077 2.325-.181 3.513-.181a50.517 50.517 0 0 1 43.917 25.614 34.569 34.569 0 0 0-24.141-5.851c17.294 9.372 25.612 29.614 19.905 48.439-5.707 18.824-23.866 31.039-43.453 29.229a44.348 44.348 0 0 1-13.033-2.583 47.554 47.554 0 0 1-2.945-1.201c-.555-.258-1.123-.517-1.679-.801l-1.459-.723c.465.219.904.465 1.395.684a42.264 42.264 0 0 1-23.574-32.666s4.625-17.231 33.093-17.231a24.207 24.207 0 0 0 12.039-11.07 157.758 157.758 0 0 1-24.258-14.441c-3.63-3.578-5.348-5.309-6.885-6.6a30.49 30.49 0 0 0-2.583-1.964 46.31 46.31 0 0 1-.284-24.464 74.104 74.104 0 0 0-24.103 18.626 54.875 54.875 0 0 1-3.462-25.084 18.712 18.712 0 0 0-3.332 1.782 72.249 72.249 0 0 0-9.791 8.383 88.718 88.718 0 0 0-9.352 11.212 84.495 84.495 0 0 0-13.485 30.329l-.129.671c-.194.879-1.046 5.348-1.162 6.316A118.3 118.3 0 0 0 100 278.049v.516c.052 51.968 39.852 95.259 91.632 99.669 51.781 4.411 98.329-31.525 107.17-82.735.168-1.292.297-2.583.452-3.875a102.923 102.923 0 0 0-6.497-50.298Z"/></g><defs><radialGradient id="d" cx="0" cy="0" r="1" gradientTransform="matrix(208.722 0 0 215.61 271.832 145.358)" gradientUnits="userSpaceOnUse"><stop offset=".129" stop-color="#FFBD4F"/><stop offset=".186" stop-color="#FFAC31"/><stop offset=".247" stop-color="#FF9D17"/><stop offset=".283" stop-color="#FF980E"/><stop offset=".403" stop-color="#FF563B"/><stop offset=".467" stop-color="#FF3750"/><stop offset=".71" stop-color="#F5156C"/><stop offset=".782" stop-color="#EB0878"/><stop offset=".86" stop-color="#E50080"/></radialGradient><radialGradient id="e" cx="0" cy="0" r="1" gradientTransform="matrix(208.722 0 0 215.61 195.558 253.731)" gradientUnits="userSpaceOnUse"><stop offset=".3" stop-color="#960E18"/><stop offset=".351" stop-color="#B11927" stop-opacity=".74"/><stop offset=".435" stop-color="#DB293D" stop-opacity=".343"/><stop offset=".497" stop-color="#F5334B" stop-opacity=".094"/><stop offset=".53" stop-color="#FF3750" stop-opacity=".01"/></radialGradient><radialGradient id="f" cx="0" cy="0" r="1" gradientTransform="matrix(629.917 0 0 650.704 199.973 109.859)" gradientUnits="userSpaceOnUse"><stop offset=".132" stop-color="#FFF44F"/><stop offset=".252" stop-color="#FFDC3E"/><stop offset=".506" stop-color="#FF9D12"/><stop offset=".526" stop-color="#FF980E"/></radialGradient><radialGradient id="g" cx="0" cy="0" r="1" gradientTransform="matrix(223.5 0 0 230.876 138.896 398.985)" gradientUnits="userSpaceOnUse"><stop offset=".353" stop-color="#3A8EE6"/><stop offset=".472" stop-color="#5C79F0"/><stop offset=".669" stop-color="#9059FF"/><stop offset="1" stop-color="#C139E6"/></radialGradient><radialGradient id="h" cx="0" cy="0" r="1" gradientTransform="rotate(-12.809 1131.776 -761.948) scale(118.111 121.632)" gradientUnits="userSpaceOnUse"><stop offset=".206" stop-color="#9059FF" stop-opacity=".01"/><stop offset=".278" stop-color="#8C4FF3" stop-opacity=".064"/><stop offset=".747" stop-color="#7716A8" stop-opacity=".45"/><stop offset=".975" stop-color="#6E008B" stop-opacity=".6"/></radialGradient><radialGradient id="i" cx="0" cy="0" r="1" gradientTransform="matrix(586.335 0 0 605.684 516.102 -42.781)" gradientUnits="userSpaceOnUse"><stop stop-color="#FFE226"/><stop offset=".121" stop-color="#FFDB27"/><stop offset=".295" stop-color="#FFC82A"/><stop offset=".502" stop-color="#FFA930"/><stop offset=".732" stop-color="#FF7E37"/><stop offset=".792" stop-color="#FF7139"/></radialGradient><radialGradient id="j" cx="0" cy="0" r="1" gradientTransform="matrix(325.795 0 0 336.546 258.564 87.645)" gradientUnits="userSpaceOnUse"><stop offset=".113" stop-color="#FFF44F"/><stop offset=".456" stop-color="#FF980E"/><stop offset=".622" stop-color="#FF5634"/><stop offset=".716" stop-color="#FF3647"/><stop offset=".904" stop-color="#E31587"/></radialGradient><radialGradient id="k" cx="0" cy="0" r="1" gradientTransform="rotate(77.763 -58.163 151.983) scale(346.995 336.922)" gradientUnits="userSpaceOnUse"><stop stop-color="#FFF44F"/><stop offset=".06" stop-color="#FFE847"/><stop offset=".168" stop-color="#FFC830"/><stop offset=".304" stop-color="#FF980E"/><stop offset=".356" stop-color="#FF8B16"/><stop offset=".455" stop-color="#FF672A"/><stop offset=".57" stop-color="#FF3647"/><stop offset=".737" stop-color="#E31587"/></radialGradient><radialGradient id="l" cx="0" cy="0" r="1" gradientTransform="matrix(469.191 0 0 484.675 130.741 83.866)" gradientUnits="userSpaceOnUse"><stop offset=".137" stop-color="#FFF44F"/><stop offset=".48" stop-color="#FF980E"/><stop offset=".592" stop-color="#FF5634"/><stop offset=".655" stop-color="#FF3647"/><stop offset=".904" stop-color="#E31587"/></radialGradient><radialGradient id="m" cx="0" cy="0" r="1" gradientTransform="matrix(560.313 0 0 578.803 410.764 79.89)" gradientUnits="userSpaceOnUse"><stop offset=".094" stop-color="#FFF44F"/><stop offset=".231" stop-color="#FFE141"/><stop offset=".509" stop-color="#FFAF1E"/><stop offset=".626" stop-color="#FF980E"/></radialGradient><linearGradient id="b" x1="0" x2="368.013" y1="550" y2="282.354" gradientUnits="userSpaceOnUse"><stop stop-color="#0290EE"/><stop offset="1" stop-color="#9059FF"/></linearGradient><linearGradient id="c" x1="201.885" x2="30.656" y1="118.187" y2="273.001" gradientUnits="userSpaceOnUse"><stop offset=".048" stop-color="#FFF44F"/><stop offset=".111" stop-color="#FFE847"/><stop offset=".225" stop-color="#FFC830"/><stop offset=".368" stop-color="#FF980E"/><stop offset=".401" stop-color="#FF8B16"/><stop offset=".462" stop-color="#FF672A"/><stop offset=".534" stop-color="#FF3647"/><stop offset=".705" stop-color="#E31587"/></linearGradient><linearGradient id="n" x1="209.061" x2="63.186" y1="130.117" y2="266.808" gradientUnits="userSpaceOnUse"><stop offset=".167" stop-color="#FFF44F" stop-opacity=".8"/><stop offset=".266" stop-color="#FFF44F" stop-opacity=".634"/><stop offset=".489" stop-color="#FFF44F" stop-opacity=".217"/><stop offset=".6" stop-color="#FFF44F" stop-opacity=".01"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h400v550H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/mr-settodefault.svg b/browser/components/aboutwelcome/assets/mr-settodefault.svg
new file mode 100644
index 0000000000..a12306e87c
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/mr-settodefault.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="258" height="400" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M239.284 83.868c-5.266-12.666-15.932-26.341-24.307-30.663 6.816 13.362 10.761 26.767 12.269 36.771 0 .02.007.069.023.202-13.7-34.148-36.931-47.918-55.902-77.9-.957-1.516-1.918-3.036-2.854-4.638a37.56 37.56 0 0 1-1.334-2.507 22.018 22.018 0 0 1-1.811-4.792.315.315 0 0 0-.275-.325.415.415 0 0 0-.228 0c-.017.006-.042.026-.06.033-.027.01-.061.035-.089.05.014-.018.042-.059.05-.068-30.436 17.825-40.761 50.8-41.71 67.297a60.625 60.625 0 0 0-33.346 12.85 36 36 0 0 0-3.139-2.37 56.132 56.132 0 0 1-.34-29.61c-12.446 5.668-22.127 14.626-29.165 22.536h-.056c-4.803-6.083-4.465-26.152-4.19-30.342-.058-.26-3.584 1.83-4.046 2.145a88.266 88.266 0 0 0-11.84 10.144c-4.143 4.2-7.927 8.739-11.315 13.568 0 .006-.003.014-.006.02 0-.007.004-.014.006-.02a102.261 102.261 0 0 0-16.258 36.706c-.058.263-.107.535-.163.8-.228 1.066-1.049 6.402-1.192 7.562-.012.089-.017.175-.027.264a115.488 115.488 0 0 0-1.966 16.717c0 .206-.013.411-.013.618.002 66.909 54.25 121.148 121.164 121.148 59.928 0 109.686-43.503 119.428-100.646.205-1.551.369-3.11.55-4.674 2.408-20.777-.267-42.614-7.858-60.876Zm-139.65 94.83c.566.271 1.098.567 1.68.827.024.016.057.035.082.05a61.355 61.355 0 0 1-1.763-.877Zm127.645-88.49-.016-.118.02.13-.004-.012Z" fill="url(#b)"/><path d="M239.283 83.859c-5.266-12.667-15.932-26.341-24.307-30.664 6.816 13.363 10.761 26.768 12.269 36.772 0-.03.005.024.018.114l.02.13c11.432 30.991 5.204 62.506-3.771 81.763-13.884 29.796-47.499 60.333-100.114 58.844-56.847-1.61-106.927-43.789-116.276-99.035-1.704-8.712 0-13.135.857-20.209-1.044 5.453-1.442 7.028-1.966 16.717 0 .207-.013.411-.013.619.001 66.906 54.249 121.145 121.163 121.145 59.928 0 109.686-43.503 119.428-100.646.205-1.551.369-3.11.55-4.674 2.408-20.777-.267-42.615-7.858-60.876Z" fill="url(#c)"/><path d="M239.283 83.859c-5.266-12.667-15.932-26.341-24.307-30.664 6.816 13.363 10.761 26.768 12.269 36.772 0-.03.005.024.018.114l.02.13c11.432 30.991 5.204 62.506-3.771 81.763-13.884 29.796-47.499 60.333-100.114 58.844-56.847-1.61-106.927-43.789-116.276-99.035-1.704-8.712 0-13.135.857-20.209-1.044 5.453-1.442 7.028-1.966 16.717 0 .207-.013.411-.013.619.001 66.906 54.249 121.145 121.163 121.145 59.928 0 109.686-43.503 119.428-100.646.205-1.551.369-3.11.55-4.674 2.408-20.777-.267-42.615-7.858-60.876Z" fill="url(#d)"/><path d="M180.403 98.1c.264.186.504.37.752.555a65.859 65.859 0 0 0-11.248-14.677c-37.663-37.66-9.876-81.655-5.189-83.89.013-.018.041-.059.05-.068-30.436 17.825-40.762 50.8-41.71 67.297 1.411-.098 2.819-.216 4.256-.216 22.713 0 42.495 12.488 53.089 31Z" fill="url(#e)"/><path d="M127.389 105.636c-.198 3.014-10.847 13.407-14.57 13.407-34.454 0-40.047 20.84-40.047 20.84 1.526 17.55 13.744 32.002 28.541 39.649.675.349 1.358.664 2.042.975a67.024 67.024 0 0 0 3.559 1.455 53.837 53.837 0 0 0 15.766 3.041c60.388 2.832 72.088-72.193 28.507-93.98 11.161-1.941 22.746 2.548 29.215 7.092-10.593-18.51-30.376-30.998-53.088-30.998-1.437 0-2.844.119-4.256.216a60.626 60.626 0 0 0-33.347 12.85c1.848 1.563 3.933 3.653 8.326 7.98 8.219 8.1 29.307 16.489 29.352 17.473Z" fill="url(#f)"/><path d="M127.389 105.636c-.198 3.014-10.847 13.407-14.57 13.407-34.454 0-40.047 20.84-40.047 20.84 1.526 17.55 13.744 32.002 28.541 39.649.675.349 1.358.664 2.042.975a67.024 67.024 0 0 0 3.559 1.455 53.837 53.837 0 0 0 15.766 3.041c60.388 2.832 72.088-72.193 28.507-93.98 11.161-1.941 22.746 2.548 29.215 7.092-10.593-18.51-30.376-30.998-53.088-30.998-1.437 0-2.844.119-4.256.216a60.626 60.626 0 0 0-33.347 12.85c1.848 1.563 3.933 3.653 8.326 7.98 8.219 8.1 29.307 16.489 29.352 17.473Z" fill="url(#g)"/><path d="M84.061 76.158c.844.544 1.681 1.099 2.512 1.664a56.134 56.134 0 0 1-.34-29.611c-12.447 5.667-22.128 14.626-29.166 22.536.582-.016 18.157-.333 26.994 5.41Z" fill="url(#h)"/><path d="M7.122 131.801c9.349 55.245 59.43 97.425 116.276 99.034 52.615 1.49 86.231-29.049 100.115-58.843 8.974-19.259 15.202-50.769 3.77-81.763l-.004-.013-.016-.117c-.012-.09-.02-.144-.018-.114 0 .02.008.068.024.201 4.297 28.062-9.978 55.248-32.292 73.63l-.067.158c-43.482 35.404-85.09 21.36-93.515 15.612a72.571 72.571 0 0 1-1.764-.879c-25.35-12.114-35.823-35.21-33.577-55.016-21.406 0-28.704-18.054-28.704-18.054s19.218-13.702 44.547-1.785c23.458 11.038 45.489 1.786 45.492 1.785-.045-.984-21.133-9.372-29.354-17.472-4.393-4.328-6.479-6.414-8.326-7.98a35.98 35.98 0 0 0-3.138-2.37 142.568 142.568 0 0 0-2.512-1.663c-8.837-5.743-26.412-5.427-26.994-5.412h-.056c-4.803-6.084-4.464-26.153-4.19-30.343-.058-.26-3.584 1.83-4.046 2.145a88.266 88.266 0 0 0-11.84 10.144 106.12 106.12 0 0 0-11.315 13.572c0 .006-.003.013-.005.019 0-.007.003-.013.005-.02a102.262 102.262 0 0 0-16.257 36.706c-.058.263-4.361 19.079-2.239 28.838Z" fill="url(#i)"/><path d="M169.908 83.986a65.889 65.889 0 0 1 11.248 14.677c.667.502 1.29 1.001 1.819 1.489 27.468 25.309 13.076 61.104 12.003 63.655 22.315-18.381 36.59-45.567 32.292-73.63-13.701-34.148-36.932-47.917-55.902-77.899-.958-1.516-1.919-3.036-2.854-4.638a36.657 36.657 0 0 1-1.334-2.507 22.073 22.073 0 0 1-1.812-4.792.314.314 0 0 0-.275-.325.411.411 0 0 0-.227 0c-.018.006-.043.026-.061.033-.027.01-.06.035-.089.05-4.684 2.233-32.471 46.229 5.192 83.887Z" fill="url(#j)"/><path d="M182.974 100.158a23.914 23.914 0 0 0-1.819-1.489c-.247-.185-.489-.37-.753-.554-6.469-4.545-18.054-9.033-29.215-7.092 43.581 21.787 31.881 96.812-28.508 93.98a53.837 53.837 0 0 1-15.765-3.041 67.024 67.024 0 0 1-3.559-1.455 46.942 46.942 0 0 1-2.042-.975c.024.016.057.035.082.05 8.425 5.747 50.033 19.792 93.515-15.612l.067-.158c1.073-2.548 15.465-38.345-12.003-63.654Z" fill="url(#k)"/><path d="M72.772 139.863s5.592-20.839 40.046-20.839c3.725 0 14.374-10.394 14.571-13.407.197-3.014-22.032 9.252-45.492-1.786-25.33-11.917-44.547 1.786-44.547 1.786s7.298 18.053 28.704 18.053c-2.245 19.807 8.227 42.904 33.577 55.016.567.271 1.099.567 1.681.827-14.796-7.648-27.014-22.1-28.54-39.65Z" fill="url(#l)"/><path d="M239.282 83.868c-5.266-12.666-15.932-26.341-24.307-30.663 6.816 13.362 10.761 26.767 12.269 36.771 0 .02.007.069.024.202-13.701-34.148-36.932-47.918-55.903-77.9-.957-1.516-1.918-3.036-2.854-4.638a37.56 37.56 0 0 1-1.334-2.507 22.018 22.018 0 0 1-1.811-4.792.315.315 0 0 0-.275-.325.415.415 0 0 0-.228 0c-.017.006-.042.026-.06.033-.027.01-.061.035-.089.05.014-.018.042-.059.05-.068-30.436 17.825-40.761 50.8-41.71 67.297 1.412-.097 2.819-.216 4.256-.216 22.714 0 42.497 12.488 53.088 30.998-6.469-4.545-18.054-9.033-29.214-7.092 43.58 21.787 31.881 96.812-28.508 93.98a53.843 53.843 0 0 1-15.766-3.041 67.37 67.37 0 0 1-3.559-1.455 45.756 45.756 0 0 1-2.042-.975l.083.05a72.263 72.263 0 0 1-1.765-.879c.567.271 1.099.567 1.681.827-14.797-7.647-27.015-22.099-28.541-39.649 0 0 5.593-20.84 40.046-20.84 3.725 0 14.374-10.393 14.571-13.407-.045-.984-21.133-9.372-29.354-17.472-4.393-4.328-6.479-6.415-8.326-7.98a35.949 35.949 0 0 0-3.138-2.37 56.133 56.133 0 0 1-.34-29.61C73.779 53.864 64.098 62.823 57.06 70.733h-.056c-4.803-6.084-4.464-26.153-4.19-30.343-.058-.26-3.584 1.83-4.045 2.146a88.26 88.26 0 0 0-11.841 10.143 106.109 106.109 0 0 0-11.311 13.57c0 .006-.004.014-.006.02 0-.007.004-.014.006-.02a102.261 102.261 0 0 0-16.258 36.706c-.058.263-.107.535-.163.8-.228 1.066-1.253 6.48-1.397 7.641-.01.089.01-.089 0 0A140.934 140.934 0 0 0 6.013 128.3c0 .207-.013.412-.013.619 0 66.906 54.248 121.145 121.162 121.145 59.928 0 109.686-43.503 119.428-100.646.205-1.551.369-3.11.55-4.674 2.408-20.777-.267-42.614-7.858-60.876Zm-12.02 6.222.02.13-.004-.012-.016-.118Z" fill="url(#m)"/><path d="m82.412 64.229 2.732 13.683L101 70.242l22.965-3.281 3.281-24.086-10.391-7.121-6.013 7.121L101 40.143l-8.746 7.122h-9.842V64.24v-.011ZM142.575 171.531l16.404 9.305H144.21l-10.94-6.024h-6.013l-4.378 3.28 4.378 3.83-2.183 5.475 5.464 4.378v6.573l13.672 4.927 1.635 5.475 32.807-3.28 28.442-10.951c9.584-5.42 30.635-17.423 39.918-22.999l6.561-14.781v-17.524l-4.378-8.207-18.05 23.548-54.687 26.28-22.417-12.597-12.037-1.098.549 4.379.022.011ZM12.418 127.191 8.04 114.594H5.308L.38 132.655l9.842 26.829L40.3 183.02l39.918 17.524h6.013l4.927-2.195 7.11-1.097v-5.475l7.659-3.281 1.098-5.476 5.464-4.927v-4.378c-4.389-.537-18.442 1.568-22.966 2.184l-6.013-4.378 8.745-6.573 3.281-7.122-4.378-1.646c-5.005 1.982-19.002 8.566-24.063 10.951-11.802-5.654-29.314-17.008-39.918-24.634l-9.294-7.121-5.464-8.208v.023ZM82.96 361.502v-16.975h26.247l6.561 11.5-10.939 2.195-1.646 12.048-20.234-8.756.011-.012ZM140.929 344.527V339.6l8.745-1.097 13.672-4.378 6.013 10.402h-9.294l-6.562 7.67-12.574-7.67Z" fill="#EEC8A7"/><path d="M256.955 137.624c-.717-2.228.403-4.859-.862-6.785-1.053-1.086-2.195-2.139-2.072-3.886.023-.246-.045-.716-.168-.761-1.847-.661-1.276-2.24-1.377-3.538-1.422-13.672-4.748-27.3-10.951-39.627-5.307-13.068-15.631-23.212-27.971-29.752-.985-.66-2.038-1.052-2.833-.268-2.049 2.44 2.128 4.4 2.509 6.808 1.702 4.232 2.922 8.599 3.885 13.056.101.447.661.929-.101 1.478-5.24-7.1-11.175-13.84-17.221-20.212-8.432-8.913-15.262-19.001-22.753-28.665-4.972-6.662-10.29-13.414-11.264-21.935-.045-2.071-2.822-2.878-4.054-1.478-1.478 1.915-3.538 3.191-5.061 4.972-6.651 6.696-14.075 12.619-18.296 21.364-4.3-14.859-19.752-22.047-34.163-23.089-8.264-1.377-15.161 4.266-22.708 6.517-1.03.37-1.669.907-2.307 1.724-3.785 4.994-8.096 9.372-13.829 12.295-2.586 1.332-4.87 3.292-6.102 6.215-1.635 2.832-1.579 6.248-2.956 9.047.93.493.492 1.4.448 2.06-.224 3.594.078 7.054 1.276 10.503.515 1.478 1.478 2.923 1.355 4.546-.145 2.06-.291 4.054 1.176 5.185-1.422 1.366-2.307 3.292-3.886 4.378-2.273-5.073-2.597-10.884-3.079-16.37-.571-4.054 1.12-11.444-4.546-11.993-4.725 1.422-7.424 6.035-11.018 9.17-6.047 6.45-12.43 12.855-17.39 20.111-3.695 5.386-5.587 11.668-7.423 17.87-2.788 7.75-5.095 14.792-6.371 23.134-.448-2.15-1.803-1.847-2.587-.347-5.923 12.127-5.15 26.549-.963 39.068 4.12 8.42 5.52 17.882 8.958 26.627 7.222 27.366 29.661 46.939 54.878 57.901 2.16.985 3.639 3.124 6.248 3.392 1.108.124 3 .684.963 2.43-.27.247.078.538.123.806-.94 21.286-2.24 42.628-5.655 63.724-1.377 6.069-2.609 12.172-3.348 18.319-.224 1.814-1.175 3.762.123 5.531.616.807.717 1.725 1.109 2.71-.784.168-1.624-.784-2.116.291-.392.862.201 1.725.615 2.016 1.49.806 2.374 2.945 4.132 3.068 4.58.672 7.334 5.442 11.444 7.323.492.246.985.716.739 1.254-.605 11.69-3.28 27.668 3.639 37.735 5.52 5.744 12.25 10.738 19.73 13.571 2.485.907 5.385 1.052 7.423 2.653 2.565 1.994 5.409 2.218 8.242 2.218 12.585-.56 19.651-8.309 15.721-20.85-2.206-3.258-3.393-7.524-5.733-10.94-3.83-6.012-8.79-11.118-13.504-16.247-4.86-9.014-7.715-5.419 4.333-9.685 5.8-1.635 3.796-8.365 4.3-12.832.369-4.569.168-9.193.515-13.773.145-1.769-1.21-3.438-.123-5.162 2.116-20.457.47-41.396 2.161-61.932 5.666.011 11.365-.023 16.997-.638 5.464-.784 10.772-2.553 16.382-2.341-.023-.391-1.064-.739.145-1.153 3.415-1.153 6.943-2.038 10.257-3.516 4.714-3.896-1.904 34.32-1.422 37.589-.582 11.097-1.389 22.093-1.792 33.211-.044 3.864-.369 7.715.079 11.556.123 1.131-.079 2.016-.93 2.822-9.629 9.607-11.813 6.875-23.514 8.51-.907.246-2.262.66-3.348-.068-1.03-.694-2.217-.638-3.37-.638-1.713-.448-8.611 1.4-7.032-1.847.123-.291 0-.717 0-1.053.627-19.505 3.639-39.145 2.363-58.64-.224-.683-.247-2.262.123-2.508 1.422-1.008.862-2.408.884-3.538.079-5.017 1.232-10.033.347-15.072-.884.627-2.956-1.086-3.168.638-.829 6.551-2.005 13.403-1.422 19.987-1.131 4.02-.975 8.522-.292 12.441-1.522 1.601-.515 3.538-.761 5.285-.246 15.049-2.128 29.997-2.531 45.035-.022 1.948 1.109 2.9 3.08 3.348 14.657.638 6.964-.985 11.018 20.401 2.004 13.392 20.58 18.79 32.024 20.872 5.968 2.049 14.78-2.956 17.736-8.185.448-2.587 2.777-6.707-.414-8.264-.235-4.546-2.642-8.532-5.195-12.093-4.569-3.202-15.867-12.025-17.345-17.131-.168-.572.963-.863 1.422-1.355 1.792-2.128 4.625-3.998 4.647-7.055.101-6.024-.202-12.048.291-18.072.694-12.944 1.053-25.966 2.587-38.866 6.337-49.021-9.193-14.567 38.933-50.936 12.003-9.854 21.028-22.753 26.224-37.421.94-3.483 3.695-5.453 6.763-7.032 1.545-.515 1.523-2.486 2.362-3.684 6.999-8.689 8.309-20.771 6.618-31.543h.022l-.022.011ZM141.869 338.459c6.775-.818 12.922 1.086 19.551-1.87 1.78-1.109 2.206.839 2.956 1.937 1.948 2.295-5.7.414-7.424 6.908-.269.784-.985 1.255-1.153 2.139-.123.594-.694-.045-.963-.224-3.259-2.284-7.099-4.087-10.111-6.584-.717-1.108-1.669-1.769-2.856-2.306Zm26.616 32.841c5.487.941 10.94 1.232 16.136-1.108.268-.124.515-.247.963-.079-.045.862-.448 1.277-1.154 1.669-2.967 1.377-5.442 4.568-9.002 3.807-7.984-1.501-29.248-6.372-30.3-15.609.324-.269.638.123.907.324 2.318 1.77 4.456 3.863 6.987 5.162 1.4.717 2.362 2.363 4.423 2.184 3.415 1.747 7.188 2.788 11.04 3.639v.011ZM129.396 56.69c.828-2.328-.056-6.393 2.485-7.714 2.352-5.409 4.468-11.153 8.242-15.912 3.896-11.32 14.399-18.15 22.237-26.504 3.248 11.142 10.907 19.876 17.737 28.912 12.888 19.091 32.382 33.3 41.665 54.8.694 1.13 1.332 1.847 2.777 1.276 1.567-.616 1.332-2.162.884-2.9-1.198-4.065-2.351-7.984-3.124-12.172-.1-.84-.1-2.34-1.746-2.284-.202 0-.247-.202-.124-.37 1.736-2.81-2.385-10.156-3.079-13.963 17.669 10.57 25.384 31.364 29.348 50.601.571 7.312 4.546 15.609.862 22.473-9.652 15.385-26.436 24.399-42.012 32.696-8.89 3.594-22.943 13.492-32.046 8.454-3.595-1.355-6.696-3.74-10.257-5.185-.538-.201-.963-.739-.045-1.523 17.39-15.541 22.484-41.922 8.7-61.484-4.199-6.785-9.596-13.213-16.941-16.348 8.219-1.623 16.124 3.068 21.991 8.41 1.422 1.388 3.539-.202 2.733-1.994-5.095-8.219-13.191-14.299-21.152-19.595-8.566-6.618-18.946-9.126-29.471-10.593-2.15-.425 0-7.412.347-9.07l-.011-.01Zm-5.655 119.61c.47 1.422 2.116 3.023 3.661 3.762-4.993.515-9.965.493-15.351.022.862-.537 1.377-.884 1.915-1.209 5.408-2.586 3.516-10.033-2.34-9.809-7.547-.436-15.318 5.039-22.608 1.232-.884-.224-1.153-1.008-.1-1.646 2.16-1.299 3.74-3.27 5.385-5.061 2.139-2.307 4.379-4.669 3.93-8.353-.1-.84 1.154-1.523 1.602-2.531 1.971-4.356-.325-10.402-4.893-11.824-2.833-.862-5.017-2.195-6.45-4.815-.392-.739-.885-1.993-2.284-1.299-.045.045-.37-.19-.347-.246.414-1.355-.863-1.277-1.478-1.725-.594-.448-1.3-.739-1.915-1.175-2.038-1.523-1.915-1.893.291-3.102 2.844-1.87 5.52-3.796 8.857-4.356 6.763-.739 12.966-2.978 19.528-4.691-3.012 9.719 2.979 22.249 14.489 19.181 7.491-2.419 6.439 2.463 8.958 7.255 3.785 6.125-1.265 16.315 6.416 20.234.37.168 1.053.19.84.784-1.388 3.303 7.211 6.763 5.509 7.502-7.804 3.628-12.854-8.723-22.092-2.117-.247.247-.168.538-.224.807.112 3.068-1.926.862-1.333 3.191l.034-.011Zm-49.492-37.489c.38-1.142 3.147-8.588 4.479-6.763 1.904 2.934 5.89 2.979 7.547 6.002 3.27 7.2 9.72 3.583 10.772 9.316.638 10.469-.66 3.281-8.264 6.024-2.217.594-4.233 1.478-6.147 2.755-.638.414-.762.201-.93-.616-1.31-2.923-3.079-5.52-3.101-8.924-.101-1.546.269-3.46-1.523-4.67-1.646-1.007-3.785-.459-2.833-3.124Zm1.254 9.831c-.985-1.399-1.176-2.855-1.668-4.232 1.747.123 1.915.537 1.668 4.232Zm68.572 14.008c-2.262 1.299-3.538.392-3.807-2.183-.381-3.606-1.467-7.099-1.086-10.716-.425-3.729-3.471-6.517-3.415-10.548-.347-2.53-3.74-4.568-6.763-4.176-12.284 3.415-17.983-4.681-14.187-16.035.47-1.444 1.892-1.724 2.9-2.363 4.232-2.776 5.968-7.77 8.163-12.093 1.287-1.612 2.519-.548.963-3.101-.124 0-.247.078-.347.078a1.096 1.096 0 0 0-.023-.47c-2.116-1.579-26.65-9.137-21.846-12.362 2.408-1.332 4.725-2.855 7.278-3.908.885-.347 1.355-1.791 2.654-.963-.84 3.415.325 4.177 6.103 3.908.291.269.101.538-.045.784-2.542 3.919 1.624 6.662 3.639 9.17.291 1.131 2.016 2.094 2.217 3.371.123.101.246.224.37.392.638-.247 1.399-.862 1.455-1.131.079-.66-1.231-3.807-1.892-4.625-1.075-1.522-4.322-3.325-3.146-5.43.492-.325 1.052-.101 1.399.347.515.716 1.355.93 2.016 1.4 2.385 1.858 4.344-.56 6.248-1.87 1.747-1.176 2.094-2.755 1.377-4.67-1.198-3.505 5.811-2.183 7.603-4.11.885-.637 1.971-1.03 2.754-1.768 2.733-2.161 3.595 5.094 6.64 4.423.986-.202 1.299.447 2.094 1.052-7.804 2.452-6.998-2.194-13.336-1.825-1.063 0-2.631 2.463-2.385 4.233.202 1.578-.515 3.437 1.422 4.725 2.106 1.187 3.606-.538 5.655-.291 3.046.806 2.217-2.576 4.109-1.702 2.274 1.78 12.149 4.792 10.828 8.118-.784 1.993.146 4.132-.269 6.192-.347 1.623-.324 3.225.907 4.546.818.885 1.87 2.116 3.001 1.601 1.602-.784 4.11 0 4.815-2.53.818-1.725 3.449 4.546 3.74 5.755-3.348-3.382-10.279-2.105-8.711 3.393.47 1.444 1.298 2.575 2.9 2.922 1.108.146 4.154 2.889 1.702 3.471-1.378 1.434-1.154 2.598-3.516 1.4-2.184-1.243-5.263 2.743-4.031 4.647 4.21 5.89 8.935-.47.94 10.38-2.9 3.538-3.225 7.748-2.777 12.026.146 1.231-.616 1.87-1.086 2.138-2.687 1.523-3.348 4.255-4.3 6.763-1.276 4.591-5.587-.739-8.901 1.646l-.023-.011ZM98.178 79.085c-.415-.123-.124-.56.145-.84 2.038-2.138 4.3-3.684 7.458-3.617 1.254.023 2.485-.223 2.956-2.183 2.138 4.445 12.137-1.568 13.795 2.307.022.907-.863 1.299-1.792 1.579-2.094.593-3.762 2.037-5.677 3.023-4.356 2.374-9.014 4.3-12.989 7.256-.369.268-.492.907-1.254.448-.571-.348-.884-.616-.862-1.333.045-1.4-.414-2.654-1.355-3.684-.448-.47-.201-.761-.145-1.21.022-.537 1.175-1.354-.27-1.746h-.01Zm-2.486 3.102c-1.97-.94-3.001-3.292-5.308-3.863-.593-.202-1.03-.571-1.007-1.154 0-.616.716-.537 1.086-.683 3-1.276 5.8-3 9.271-3.516-4.053 1.938-4.031 5.61-4.031 9.216h-.011Zm35.495 4.008c.325 1.691-1.008 2.262-1.747 3.046-1.948 1.388-3.963-3.124-7.233-2.307 1.926-2.99 1.086-6.65-3.146-5.8 1.209-1.332 2.732-1.456 3.963-2.16 4.446-2.23 3.315-7.447-1.187-8.264-5.43-1.042-10.088.918-15.81.414 10.704-4.67 21.499-1.646 32.315-.023 7.917 1.31 14.837 5.465 21.107 10.224-1.254.414-2.071 2.216-3.348 1.623-2.015-.93-4.871-.515-5.8-3.594-.739-2.34-2.508-2.284-4.725-2.363-3.718-.123-6.372 2.553-9.944 2.833-3.538.269-5.139 2.8-4.456 6.371h.011Zm14.389 2.509c-1.456-.348-5.006 1.903-5.14-.538.168-.761.538-2.116 1.456-1.747 1.209.47 2.609.885 3.695 2.285h-.011Zm16.728 10.962c2.509 1.354 2.195 3.93 3.516 5.576.202.224.101 2.116-.963 2.508-4.68.795-1.623-5.453-2.564-8.084h.011Zm-7.255 64.339c1.601-1.948 1.31-5.341 3.56-6.662 0 2.709.291 5.061 3.595 6.371-.907.717-1.893 1.153-2.363 1.915-.537.884-1.232.716-1.769.47-.963-.414-1.601-1.456-2.8-1.5-.223 0-.369-.37-.223-.594Zm6.64-5.431c.806-1.276.783-2.362-.616-3.224-.493-.269 0-.594.022-.885.168-1.4.571-2.777.392-4.199-2.385-7.267 13.851-16.807 3.516-20.748-.661-.224-1.478-.101-1.355-1.232.638-.011 1.243.358 1.859.582 2.183.84 3.303-2.318 5.285-2.866 2.609-2.352-.358-7.939-3.695-8.678-1.008-.202-1.478-2.329-.37-2.341.717.325 1.131-.783 2.139.079 3.684 3.146 5.117 7.233 5.711 11.802 3.672 10.245-.739 20.502-6.517 29.034-.079-2.262.448-4.915-2.117-5.923-.962-.392-3.224-1.008-3.986 1.276 1.053 0 1.288.627.717 1.893.907.168 1.5-.415 2.43-.885-.023 3.023-1.893 5.084-2.9 7.603-.594-.47-.762-.884-.515-1.276v-.012Zm-2.218-73.364c-.078-.907 1.255-1.03 1.77-1.724.615-.807 1.063-.247 1.668.167 1.31.93 2.777 1.624 3.561 3.225-2.083.28-3.303-.806-5.14-1.209-.638-.269-1.747.739-1.87-.47l.011.01Zm-73.6-31.42c.807-11.522 4.659 1.478 15.453-10.962 4.871-5.106 8.801 3.684 13.974-2.362 6.226-9.652 8.365-2.856 11.511 4.087 2.217 1.086 1.254 2.676.593 4.154-.862 1.87-.268 4.053-1.623 5.822.862-1.892-.594-2.732-1.601-3.538-1.109-.885-1.893.37-2.184 1.053-1.847 3.661-6.225 1.31-9.372 2.138-1.4.336-1.915 3.27-.246 3.539 4.501 1.175 8.902 1.523 12.989-1.993-.471 1.746.492 7.815-1.523 7.547-1.456-.101-2.923.223-4.356-.348-2.799-1.086-5.464-.044-7.95 1.008-7.457 3.057-15.374 4.95-22.305 9.193-.806.515-1.892 1.086-2.363-.806-.391-2.452-2.687-10.033-.739-11.556.515-.145.37-.56.123-.806-1.847-1.937-.57-4.177-.369-6.17h-.011Zm-73.677 46.984c2.99-8.767 5.229-18.274 9.103-26.627C29.09 62.289 38.843 51.898 49.56 42.705c.146 3.471 1.523 36.268 8.364 29.92 5.756-8.253 14.21-14.12 22.339-19.865 1.355-1.063 2.53-.492 1.948 1.154-.739 7.379-.918 21.857 5.487 26.671 6.248 4.11 10.503 10.884 16.953 14.826 3.807 2.43 8.33 3.963 12.541 5.632 1.175.347 1.578 1.523.963 2.53-2.072 3.001 2.049 4.905.447 6.786-4.747 5.991-12.932 6.214-19.505 9.047-5.308 1.199-10.906 1.59-15.81 4.379-8.264 3.717-10.66 8.017-13.426 16.404-.907 6.449 3.93 12.507 5.755 18.531.347.806.448 1.332-.716 1.624-1.277.324-2.262 1.5-3.74 1.332-.493-.045-.616.269-.392.683.324.616-.269 1.053-.269 1.691-1.109-1.87-3.225-1.523-4.77-2.363-3.449-1.108-7.02-2.889-9.91-4.915-10.312-6.965-21.017-13.28-30.893-20.827-1.5-.627-2.172-3.986-4.154-1.915 0-.885 1.086-1.176.224-1.724-2.307-1.501-3.247-4.3-5.588-5.801-2.105-8.151-6.494-17.154-3.168-25.742l-.045.011ZM5.453 144.04a67.316 67.316 0 0 1-1.792-16.202c-.212-2.172 1.814-18.386 4.916-11.6.65 4.445 1.892 9.405 5.386 12.485.616.436-.202.806.202 1.354.716.986 1.422 1.971 2.306 2.8 8.555 8.353 18.946 14.175 28.777 20.849 5.464 3.169 18.453 13.314 24.354 12.25 3.382-1.008 6.338-3.191 9.764-4.21 1.725-.538 3.147-1.109 4.054-2.755.246-.414.929.123 1.545-.145 1.5-.695 2.833-1.77 4.479-2.217 1.668-.616 4.087-1.669 5.486-.045.515.761-.66 1.299-.985 1.993-1.836 3.113-5.027 5.095-7.457 7.748-1.478 1.602-4.994 1.176-5.756 3.225-.145 1.377 1.254 2.06 2.363 2.609 12.507 7.469 27.937-3.762 30.524 1.501.145 2.665-5.476 4.087-7.503 4.814-10.2 3.225-20.905 2.609-30.848-1.153-.806-.291-1.377.448-1.915.907-.616.594 0 1.008.291 1.5.963 1.77 2.878 1.322 4.334 1.848 4.792 1.668 9.741 2.676 14.859 2.284 3.683-.291 7.334-.761 10.995-1.175 1.03-.336 2.117.134 3.024.615-.986.392-.415 1.848-2.016 2.262-9.271 3.774-21.13 4.804-29.684-1.276-.84-.594-2.016-.347-1.97.268.078.784-1.232 2.016.694 2.632 11.51 7.256 13.056 3.023 24.746 4.3-2.934 9.047-19.036-2.811-20.077 3.739-.146 1.456-.616 1.501-1.579.639-1.355-1.232-3.169-1.4-4.77-2.016-4.434-2.452-8.958-4.658-13.627-6.539-1.792-.515-3.785-.246-5.341-1.601-16.83-10.324-40.22-22.451-47.79-41.676l.011-.012Zm80.822 53.501c-1.624.526-5.52.773-5.677-1.176.145-.269.66-.369 1.21-.145 1.376.515 2.798.862 4.478 1.332l-.011-.011Zm-.616 154.119c-.1-1.523.93-3.023 0-4.624-.123-.224.269-1.501.537-2.217.124-.37.717 0 1.008.224.806.537 1.624.66 2.856.078-.84.985-.37 1.568-.146 2.363.717 2.608 1.915 1.455 3.393 1.007a25.4 25.4 0 0 0 3.74-1.478c3.012-1.769 6.584-.156 9.764-1.299 1.299-.291 2.138-.078 2.732 1.087.515 1.377 2.027 2.709 2.071 4.075 0 1.456-1.847.863-2.833 1.355-6.46 2.867-7.994 8.824-4.478 14.747.537 1.053.123 1.131-.538 1.444-4.792 2.587-7.2-3.213-10.704-5.285-2.173-1.668-3.64-4.176-6.047-5.531-1.77-1.725-1.21-3.886-1.355-5.946Zm28.923 37.522c2.754.806 7.535-.784 8.957 2.262.325 1.299-1.332 1.422-1.646 2.385-3.504-1.411-7.636.683-10.973-1.444-2.116-1.602-5.095-1.77-6.785-4.11-1.848.717-2.038-1.791-3.886-1.814-1.5-.022-3.124-1.523-4.423-2.654-.739-.638-1.847-.246-2.34-1.276-.291-.593-.045-2.307-1.668-1.176-1.109-1.5-3.102-2.015-4.031-3.594-.784-1.389-2.14-4.311-.661-5.531.47-.045.392.47.47.783 8.062 6.584 16.897 13.101 27.008 16.18l-.022-.011Zm9.719-139.596c-2.777 12.294-.997 25.059-1.456 37.544-.728 15.475-1.579 31.028-1.971 46.57-.459 3.784-7.67 4.736-10.749 5.576-9.887 1.646-17.11 3.751-25.34-3.37a59.66 59.66 0 0 1-8.856-6.64c-1.176-1.053-1.893-2.632-3.763-2.856-1.892-.683.84-3.852.762-5.307.347-1.501.94-2.855.224-4.625.84-24.846 5.7-50.163 5.8-75.335 0-1.937.537-2.385 2.195-1.5 3.941 2.161 8.04 2.777 12.205 4.131 9.764 2.688 19.796 5.062 30.008 4.502 1.053-.023 1.154.448.93 1.299l.011.011Zm111.133-64.608c-10.291 24.107-33.357 39.616-56.692 49.637-1.5.806-2.094-2.172-4.154.885-4.121 3.628-10.235 3.93-15.352 5.509-12.641 3.404-25.854 4.915-38.91 3.807-30.714-1.725-63.32-16.74-85.547-37.836-13.236-12.619-18.341-30.434-23.347-47.454 16.203 15.576 35.473 28.363 56.603 36.089 4.58 2.307 17.994 9.473 21.274 3.146.516-1.052 1.277-.761 1.915-.66 1.948.269 3.84.168 5.632-.694 6.752-2.094 3.046-7.032 8.633-8.801 2.094-.471 3.292-2.307 4.479-3.931.392-.537.639-.817 1.333-.817 4.3.123 8.633.201 12.966.246.392 0 .963-.291.84.392-.392 2.116 1.277 3.023 2.553 3.561 1.4.616 2.385 1.993 4.087 1.937-6.046 9.338 6.517 10.861 13.157 11.432-.235 3.08 1.679 6.629 5.072 6.461 8.017.84 15.777-1.478 23.716-1.455 13.482-.941 25.239-7.402 37.22-12.978 9.293-3.415 17.445-8.801 26.369-13.448-.224 1.915-1.175 3.415-1.814 4.938l-.033.034Zm16.997-32.797c-1.467 5.274-1.702 12.093-6.102 15.855-9.339 9.865-22.574 15.755-34.734 21.633-5.509 1.971-10.649 4.759-16.012 7.256-1.131.638-2.531 1.87-4.211.862-7.535 2.318-37.824 10.503-43.512 5.061.448-2.776 9.462-1.343 11.903-1.646 2.944.84 3.168-3.437 0-3.437-4.681-.213-29.539 3.191-25.553-5.778.37-1.355 1.21-.291 1.725-.123 3.818 1.377 7.524 3.046 11.589 3.516 2.553.325 5.162.515 7.67-.806.985-.515 2.363.123 3.449-.538.873-.638 2.967-.739 2.262-2.306-.415-.885-1.333-1.232-2.117-.93-1.97.739-4.008.694-6.001.885-5.89.817-20.838-2.721-24.354-7.502 8.901-2.833 15.586 7.547 25.216 5.845 2.06-.571 8.331 1.343 7.334-2.408-.201-.784-.661-.47-1.086-.47-9.674.929-17.401-2.161-25.339-7.402-1.255-.806-2.957-.761-4.278-1.601-1.086-.66-1.847-1.769-3.079-2.239-1.109-.963 3.37-2.34 3.885-2.284 7.603 2.093 13.751 7.692 22.037 7.3 2.183-.168 4.725.146 7.032.818.862.246 1.993.929 2.508-.37 2.127-4.378-8.555-6.673-11.142-9.17-2.351-1.814-5.587-2.688-6.27-5.946-.123-.347.291-.515.806-.515 11.78-.392 26.739 17.221 37.925 12.765 21.32-7.044 40.803-18.812 58.562-32.137 1.668-1.545 3.471-3.224 3.908-5.777 1.467-3.057 4.053-5.453 5.677-8.577 2.161 6.348 2.127 13.582.269 20.188l.033-.022Zm-102.623 25.294c1.624-1.522 2.139-1.545 3.718-.224.201.146.66.168.492.56-1.019.661-2.855-.414-4.21-.347v.011Z" fill="#010101"/><path opacity=".3" d="M97.125 151.811c.101 1.254-.246 1.814-1.702 1.299-4.355-1.232-9.07.761-12.787 3.023-1.086.918-1.019-1.881-1.792-2.463-1.377-2.161-2.037-4.479-2.239-7.077.09-1.825-.112-4.658-2.631-5.184-1.826-.269-2.24-.84-1.725-2.609.381-1.142 3.147-8.589 4.48-6.763 1.455 1.869 3.493 2.9 5.53 3.907.885.448 1.523 1.131 2.016 2.094 1.601 3.247 4.4 5.14 7.827 5.778 3.863 1.12 2.867 4.893 3.023 7.995ZM122.532 74.764c.022.907-.862 1.299-1.792 1.579-2.094.593-3.762 2.037-5.677 3.023-4.355 2.374-9.013 4.3-12.988 7.256-.37.268-.493.907-1.255.448-.571-.348-.884-.616-.862-1.333.045-1.4-.414-2.654-1.355-3.684-.447-.47-.201-.761-.145-1.21.022-.537 1.175-1.354-.269-1.746-.414-.123-.123-.56.146-.84 2.038-2.139 4.299-3.684 7.457-3.617 1.254.023 2.486-.223 2.956-2.183 2.139 4.445 12.138-1.568 13.795 2.307h-.011Z" fill="#000"/><path d="M154.489 106.25c-1.086-1.523-2.956-2.116-4.132-3.471-1.332-1.545-2.833-1.377-4.154-.515-1.131.717-1.702.638-2.71-.168-1.545-1.254-3.964-.537-4.255 1.03-.537-1.915-1.747-3.437-2.855-4.938-1.948-2.183-5.386-.269-5.341 2.508-.123.616.145 1.333-.448 1.792-2.217 1.456-.067 4.86 2.195 3.807 1.108-.325 1.791.045 2.385.963 2.765 4.893 6.83.549 10.234 3.146 3.101 2.845 13.045 1.098 9.081-4.154Zm-17.837-2.038c-1.333-.862-2.901-1.5-2.285-3.639.493 1.378 2.878 1.456 2.285 3.639Zm.907.885c2.239.022 4.646-1.691 6.348.761-3.202 1.355-5.531 1.053-6.348-.761Zm12.395 3.415c-.829.347-6.047-1.456-4.031-2.363 1.03-.638 1.971-1.623 3.27-.47 1.31.918 4.624 3.046.761 2.833ZM93.385 63.645c-1.332-.448-2.956.291-4.3-.985-2.575-1.646-.929-4.423 1.669-3.539 6.718 2.217 10.156-4.736 12.127-1.008 1.422 4.703-6.148 5.465-9.518 5.554l.022-.022Z" fill="#010101"/><path opacity=".3" d="M166.066 120.191c-7.132-3.146-1.142-12.25 5.801-6.315-.258-1.142-2.912-7.469-3.74-5.755-.717 2.553-3.225 1.746-4.826 2.53-1.131.515-2.195-.716-3.001-1.601-1.232-1.333-1.254-2.923-.907-4.546.414-2.06-.515-4.199.269-6.192 1.332-3.315-8.555-6.338-10.828-8.118-1.881-.874-1.075 2.508-4.11 1.702-2.049-.247-3.549 1.478-5.654.29-1.948-1.276-1.232-3.146-1.422-4.724-.247-1.77 1.332-4.233 2.385-4.233 6.315-.38 5.531 4.266 13.336 1.814-.784-.616-1.109-1.254-2.094-1.053-3.046.672-3.908-6.584-6.64-4.422-.784.739-1.87 1.13-2.755 1.769-1.814 1.96-8.711.537-7.603 4.11.717 1.914.37 3.493-1.377 4.668-1.903 1.31-3.863 3.73-6.248 1.87-.661-.47-1.5-.683-2.015-1.4-.348-.447-.907-.66-1.4-.346-1.176 2.116 2.083 3.907 3.146 5.43.661.806 1.971 3.964 1.893 4.625-.045.268-.818.884-1.456 1.131 1.568 2.541.302 1.489-.963 3.101-2.195 4.334-3.93 9.316-8.163 12.093-1.007.639-2.441.907-2.9 2.363-3.852 11.242 2.038 19.506 14.198 16.034 8.488-.515 5.845 7.256 9.417 11.847 1.624 2.576.101 5.756 1.008 8.577.515 1.601.638 3.348.84 5.017.268 2.575 1.545 3.493 3.807 2.183 1.915-1.086 3.695-.515 5.408-.022 2.217.66 2.654.571 3.494-1.624.963-2.508 1.623-5.24 4.299-6.763 2.621-1.601-1.075-8.935 3.863-14.165a36.74 36.74 0 0 0 3.539-5.038c1.008-1.725 1.355-1.949-.986-2.677-2.597-.683-5.285-3.426-2.832-5.945 3.493-4.334 3.863 1.982 6.886-2.755 2.474-.582-.605-3.314-1.702-3.471l.033.011Zm-12.686-9.215c-5.8 2.945-7.401-2.172-11.903-1.4-5.778 1.814-5.374-3.952-8.678-3.269-2.25 1.052-4.411-2.352-2.194-3.807.593-.471.313-1.176.436-1.792-.044-2.766 3.393-4.703 5.341-2.508 1.109 1.5 2.307 3.023 2.856 4.938.291-1.579 2.71-2.284 4.255-1.03 1.008.806 1.579.884 2.71.168 1.332-.863 2.832-1.031 4.154.515 2.385 1.892 8.33 5.912 3.023 8.185Z" fill="#000"/></g><defs><radialGradient id="h" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(85.5666 0 0 85.8708 119.029 18.6)"><stop offset=".1" stop-color="#FFE226"/><stop offset=".79" stop-color="#FF7139"/></radialGradient><radialGradient id="d" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(254.002 0 0 251.98 101.828 131.939)"><stop offset=".3" stop-color="#960E18"/><stop offset=".35" stop-color="#B11927" stop-opacity=".74"/><stop offset=".43" stop-color="#DB293D" stop-opacity=".34"/><stop offset=".5" stop-color="#F5334B" stop-opacity=".09"/><stop offset=".53" stop-color="#FF3750" stop-opacity="0"/></radialGradient><radialGradient id="e" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(81.3368 0 0 138.09 150.945 -11.817)"><stop offset=".13" stop-color="#FFF44F"/><stop offset=".53" stop-color="#FF980E"/></radialGradient><radialGradient id="f" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(107.63 0 0 117.964 97.269 197.007)"><stop offset=".35" stop-color="#3A8EE6"/><stop offset=".67" stop-color="#9059FF"/><stop offset="1" stop-color="#C139E6"/></radialGradient><radialGradient id="g" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(57.1516 0 0 69.5986 115.659 106.045)"><stop offset=".21" stop-color="#9059FF" stop-opacity="0"/><stop offset=".97" stop-color="#6E008B" stop-opacity=".6"/></radialGradient><radialGradient id="c" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(247.807 0 0 251.98 173.682 27.866)"><stop offset=".13" stop-color="#FFBD4F"/><stop offset=".28" stop-color="#FF980E"/><stop offset=".47" stop-color="#FF3750"/><stop offset=".78" stop-color="#EB0878"/><stop offset=".86" stop-color="#E50080"/></radialGradient><radialGradient id="i" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(408.512 0 0 342.923 197.173 -37.735)"><stop offset=".11" stop-color="#FFF44F"/><stop offset=".46" stop-color="#FF980E"/><stop offset=".72" stop-color="#FF3647"/><stop offset=".9" stop-color="#E31587"/></radialGradient><radialGradient id="j" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="rotate(77.394 -24.396 66.127) scale(129.607 560.661)"><stop stop-color="#FFF44F"/><stop offset=".3" stop-color="#FF980E"/><stop offset=".57" stop-color="#FF3647"/><stop offset=".74" stop-color="#E31587"/></radialGradient><radialGradient id="k" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(234.546 0 0 230.425 119.907 49.48)"><stop offset=".14" stop-color="#FFF44F"/><stop offset=".48" stop-color="#FF980E"/><stop offset=".66" stop-color="#FF3647"/><stop offset=".9" stop-color="#E31587"/></radialGradient><radialGradient id="l" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(281.917 0 0 252.208 180.784 62.938)"><stop offset=".09" stop-color="#FFF44F"/><stop offset=".63" stop-color="#FF980E"/></radialGradient><linearGradient id="b" x1="217.145" y1="38.76" x2="22.595" y2="226.431" gradientUnits="userSpaceOnUse"><stop offset=".05" stop-color="#FFF44F"/><stop offset=".37" stop-color="#FF980E"/><stop offset=".53" stop-color="#FF3647"/><stop offset=".7" stop-color="#E31587"/></linearGradient><linearGradient id="m" x1="199.598" y1="35.009" x2="44.026" y2="204.989" gradientUnits="userSpaceOnUse"><stop offset=".17" stop-color="#FFF44F" stop-opacity=".8"/><stop offset=".6" stop-color="#FFF44F" stop-opacity="0"/></linearGradient><clipPath id="a"><path fill="#fff" d="M0 0h257.593v400H0z"/></clipPath></defs></svg> \ No newline at end of file
diff --git a/browser/components/aboutwelcome/assets/noodle-C.svg b/browser/components/aboutwelcome/assets/noodle-C.svg
new file mode 100644
index 0000000000..f91f5f1083
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/noodle-C.svg
@@ -0,0 +1,6 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="915" height="718" viewBox="0 0 915 718" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path opacity="1" d="M799.853 399.917C742.413 440.039 663.081 427.307 620.71 371.157L618.218 367.8C577.626 314.025 501.27 302.258 446.674 341.731C392.077 381.204 379.712 457.116 418.541 512.166L420.991 515.58C461.938 573.632 448.9 653.676 391.337 695.294C333.193 737.331 251.634 724.247 209.17 666.063C83.9763 494.522 121.467 254.982 292.903 131.034C464.34 7.08669 704.807 45.6649 830.001 217.206C872.04 274.808 859.997 355.012 803.335 397.4L801.604 398.672L799.853 399.917Z" fill="context-fill"/>
+</svg>
diff --git a/browser/components/aboutwelcome/assets/noodle-outline-L.svg b/browser/components/aboutwelcome/assets/noodle-outline-L.svg
new file mode 100644
index 0000000000..d2c1f29ff6
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/noodle-outline-L.svg
@@ -0,0 +1,13 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="147" height="164" viewBox="0 0 147 164" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M26.0923 73.3091C13.8884 71.367 5.84156 60.0045 8.1684 47.9971C10.4712 36.1135 22.0746 28.0774 34.1527 29.9995L100.16 40.504C112.485 42.4654 120.545 54.0226 118.024 66.1182L104.519 130.898C102.048 142.752 90.3351 150.631 78.2883 148.543C66.1158 146.432 58.2353 134.956 60.7321 122.98L69.6422 80.2397L26.0923 73.3091Z" stroke="url(#paint0_linear)"/>
+<defs>
+<linearGradient id="paint0_linear" x1="52.2466" y1="163.233" x2="0.9998" y2="40.1293" gradientUnits="userSpaceOnUse">
+<stop stop-color="#9059FF"/>
+<stop offset="0.520833" stop-color="#FF4AA2"/>
+<stop offset="1" stop-color="#FFBD4F"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/browser/components/aboutwelcome/assets/noodle-solid-L.svg b/browser/components/aboutwelcome/assets/noodle-solid-L.svg
new file mode 100644
index 0000000000..7e6a52d12f
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/noodle-solid-L.svg
@@ -0,0 +1,6 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="1587" height="1303" viewBox="0 0 1587 1303" xmlns="http://www.w3.org/2000/svg">
+<path d="M446.454 1039.08C360.266 1140.41 210.738 1150.78 113.365 1062.15C16.9963 974.442 8.0789 822.76 93.3782 722.472L559.549 174.385C646.592 72.0471 797.983 62.6514 895.076 153.561L1415.08 640.444C1510.22 729.534 1517.09 881.343 1430.44 980.413C1342.88 1080.52 1193.24 1088.72 1097.1 998.699L754.019 677.469L446.454 1039.08Z" fill="context-fill"/>
+</svg>
diff --git a/browser/components/aboutwelcome/assets/person-typing.svg b/browser/components/aboutwelcome/assets/person-typing.svg
new file mode 100644
index 0000000000..d05cda6a94
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/person-typing.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg width="191" height="186" fill="none" xmlns="http://www.w3.org/2000/svg"><g clip-path="url(#a)"><path d="M65.459 185.823c3.343-1.18 6.03-1.133 6.03-1.133 15.06-.033 69.71-.134 70.647-.067 1.339.101 8.151-.157 12.216 7.169.033 0 .033.033.033.033a27.027 27.027 0 0 1 1.807 4.288c1.071 3.383 1.808 7.939 1.473 13.567-.201 2.244-.502 7.135-3.347 11.825-2.945 4.891-7.028 8.174-13.085 10.251-5.154 1.742-10.208.938-16.432.368h-.067c-.235-.033-.703-.134-1.272-.234l-1.138-.201a21.616 21.616 0 0 0-1.472-.268h-.067a1814.282 1814.282 0 0 1-15.997-2.948l-.235-.034-1.234-.241c.861 1.196 1.72 2.4 2.576 3.613a469.04 469.04 0 0 1 6.426 9.313l8.4 11.892c1.271 1.775.703 4.254-1.272 5.494l-10.341 6.431-9.37 6.231-1.841 1.173c-1.841 1.138-4.075.602-5.489-.871-3.742-3.901-10.764-13.068-19.578-23.047l-1.035-1.169C66.84 256.5 60.69 268.561 57.098 274.6c-.703 1.206-2.075 1.843-3.48 1.642l-26.573-3.953c-2.276-.335-3.615-2.781-2.644-4.891 4.92-10.82 11.178-27.871 16.499-39.327a425.233 425.233 0 0 0 3.882-8.609l.595-1.357c-1.999-2.746-3.176-4.71-4.206-7.197-1.172-2.814-2.243-5.393-2.176-8.877.1-5.159 2.678-11.021 7.832-14.17 2.878-1.775 5.689-1.876 7.362-2.01 2.242-.067 4.82-.033 7.697-.033 1.503-.012 2.634-.02 3.573.005Z" fill="#BA94FF"/><path opacity=".317" d="M64.968 185.813c-3.915 1.461-8.615 4.619-10.964 11.439-.031.063-5.219 12.567-8.756 20.675-1.92-2.653-3.069-4.586-4.077-7.019-1.172-2.813-2.242-5.393-2.175-8.877.1-5.158 2.677-11.021 7.83-14.17 2.879-1.775 5.69-1.876 7.363-2.01 2.243-.067 4.82-.033 7.698-.033 1.25-.01 2.242-.017 3.08-.005Zm38.263 42.263c.89 1.236 1.778 2.481 2.664 3.736a466.09 466.09 0 0 1 6.426 9.312l8.4 11.892c1.272 1.776.703 4.254-1.272 5.494l-10.341 6.432-9.37 6.23-1.841 1.173c-1.84 1.139-4.075.603-5.489-.871-3.742-3.901-10.764-13.068-19.578-23.047a583.92 583.92 0 0 0-1.172-1.324 317.764 317.764 0 0 1 3.397-6.202s.937-1.675 2.945-4.857c1.64-2.613 3.347-4.891 4.786-6.801a137.78 137.78 0 0 1 3.179-4.153c1.506.2 3.012.401 4.518.636 2.075.368 4.15.77 6.258 1.139 2.18.397 4.337.794 6.49 1.211Z" fill="#444"/><path d="M115.337 119.817c6.046-1.735 12.272-.216 16.788 3.54l.239.16c.693.497 1.461 1.321 2.263 2.37.578.71 1.105 1.469 1.577 2.271 3.608 5.639 7.365 14.305 7.875 17.661 0 .992-.608 1.841-1.472 2.194 0 0 3.687 10.532 5.141 17.508 1.404 6.738 1.917 11.117 2.252 17.479.223 4.241-2.129.894-6.59 1.758-5.235-.054-13.994.044-26.278.294-12.283.251-19.622-13.048-22.016-39.895-2.644-8.781 1.508-17.912 9.405-21.797l-1.002-2.913a.67.67 0 0 1 .415-.851l9.493-3.272c.35-.121.73.065.851.415l1.059 3.078Z" fill="#9871E0"/><path d="m110.463 105.85 2.818 10.53-9.375 3.231-.69-2.743-.415.214c-2.676 1.427-2.52 1.309-2.713 1.397-2.038.787-3.838.943-4.175.945-2.816.094-6.614-4.66-8.851-11.869-.196-.585-.292-1.182-.422-1.774l-.892-5.936c-.207-1.325-.08-2.686.43-3.918.213-.528.43-1.023.692-1.42 2.945-4.959 9.356-4.791 10.502-4.777.133-.014.27.005.403-.009 1.296.167 2.403-.185 3.598-.345.532-.056 1.011.332 1.1.862l1.062 8.51c.078.531 1.099.06 3.064-1.416 2.435 1.282 3.909 2.446 4.422 3.492.851 1.696.508 3.551-.402 4.825-.051.07-.103.136-.156.201ZM75.57 169.278c4.693-1.135 9.943-1.403 15.75-2.803l3.164-21.236c.044-.48.11-1.046.215-1.682.104.481.228.962.373 1.442 3.072 8.451 5.928 16.616 8.567 22.494 6.975-1.012 13.56-1.782 18.316-2.851.007-.454-.465-6.833-1.415-17.137l21.043.732.075.001c.54 3.443.726 7.678.559 12.703-.318 9.556.719 17.346-5.144 21.52-1.366.975-1.757 1.642-6.452 2.006-9.818.76-18.735.538-27.779.142 3.086.15 6.152.283 9.244.364-13.656.649-58.791 1.196-62.73 1.065-4.648-.156-6.996-1.677-7.937-3.916-.755-1.798 3.823-4.152 4.52-4.515.141-.073 7.618-.463 10.43-1.168-2.102-.344 1.631-3.939 4.166-4.665 0 0 3.816-2.743 8.786-3.442l-.114.078c1.185-.153 2.438-.171 3.8.086.755.131 1.61.392 2.563.782Zm24.145 101.676 9.244-6.147 10.342-6.431a4.266 4.266 0 0 0 1.326-1.303l6.011 7.79-20.411 14.955-6.512-8.864Zm-72.34 1.272 26.094 3.882c.196.028.392.039.585.036l-3.482 9.892H21.255l6.12-13.81Z" fill="#F3B175"/><path opacity=".2" d="M103.69 167.608c-3.028.44-6.13.925-9.187 1.5-7.34 1.382-12.96 1.456-16.86 2.221-.79-.408-1.526-1.747-2.21-2.018 4.567-.811 10.023-1.423 15.887-2.836l3.164-21.237c.044-.48.11-1.045.215-1.681.104.481.228.962.373 1.441 3.092 8.507 5.965 16.71 8.618 22.61Zm8.396 17.364c-13.656.649-58.791 1.197-62.73 1.065-4.648-.155-6.996-1.677-7.937-3.916-.756-1.798 3.823-4.152 4.52-4.515.142-.073 1.638-.467 4.488-1.182 1.58.278 3.32.177 4.45.052 3.13.308 6.226.584 9.355.893l2.95 1.165c1.627 2.771 14.233 4.879 19.128 5.24 1.501.106 2.403.184 4.469.25 7.327.306 14.248.765 21.307.948Z" fill="#8C2A00"/><path d="M88.007 105.974c.126.56.323 1.482.033 1.917-.37.645-1.563-.779-1.442-1.87.051-.476.27-.634.536-.662.4-.042.764.223.873.615Zm5.903-.823c.16.556.324 1.482.033 1.917-.37.645-1.562-.779-1.441-1.87.05-.477.27-.634.536-.662.4-.042.764.222.872.615Zm.717 8.581c.226-.091.771-.351.832-.728-.007-.066.016-.17-.024-.233-.154-.186-.576-.04-1.169.089-1.054.212-1.93.203-1.93.203s.336.639.52.788c.389.498 1.416.019 1.771-.119Z" fill="#482D1F"/><path d="M85.24 103.671c-.34-.032-.515-.417-.306-.675.271-.298.736-.684 1.398-.787 1.357-.21 2.939.432 1.524 1.052-.897.431-1.973.443-2.616.41Zm9.656-16.038c-2.6-1.392-4.426-1.778-4.727-4.64-.522-4.968 3.75-9.49 9.54-10.099 5.79-.609 10.907 2.925 11.429 7.893.315 3-1.119 4.838-3.58 6.749 1.439-.146 2.584.886 3.929 1.382.49.185 1.648.635 2.736 1.7 3.101 2.94 2.987 7.298 2.987 8.578-.134 3.854-1.905 6.533-2.61 7.516-1.64 2.329-3.152 3.584-4.537 3.766-.803-1.161-1.436-2.269-1.898-3.324.581-.26 1.395-.742 2.004-1.626.876-1.271 1.223-3.093.379-4.722-.771-1.57-2.568-2.66-4.152-2.359-.891.162-1.538.735-1.631.812-.798.749-1.282 1.713-1.45 2.084l.005-.147c-1.594-.438-4.227-1.475-6.53-3.86a14.266 14.266 0 0 1-1.9-2.394c-1.29.54-3.41 1.168-5.956.964-.903-.071-1.707-.447-2.426-.643l-.007-.01c-.044-.096.375-.68.368-.747 1.973-3.406 5.662-6.52 8.027-6.873Zm-3.199 15.359c-.34-.032-.515-.418-.273-.679a2.428 2.428 0 0 1 1.431-.791c1.358-.21 2.943.466 1.524 1.053-.93.434-2.006.447-2.682.417Z" fill="#924600"/><path d="m103.716 118.871 2.925-3.897-3.428 1.888.503 2.009Zm-13.95-11.126-.004-.049v.024l.004.025Zm-.029 3.558.002.037c.038.364.322.675.691.697.067 0 .105-.001.142-.003.355-.014.608-.037 1.514-.133a.335.335 0 1 0-.07-.666c-.89.094-1.136.116-1.47.13l-.105.003c.007-.001-.025-.036-.034-.085l.025-3.582-.004-.049-.272-1.959a.334.334 0 1 0-.663.093l.27 1.934-.026 3.583Z" fill="#482D1F"/><path d="M150.158 181.8H28.843c-.466 0-.843 1.119-.843 2.5s.377 2.5.843 2.5h121.315c.465 0 .842-1.119.842-2.5s-.377-2.5-.842-2.5Z" fill="#858585"/><path d="m54.55 175.794-4.267-33.841c-.618-4.929-1.105-10.351-3-10.351l-22.309 1.664c-1.895 0-1.461 4.758-.843 9.687l4.799 38.845h65.489c1.115 0 1.694-2.353 1.694-5.253v-.751H54.55Z" fill="url(#b)"/></g><path d="M116.856 15.754c-.968-2.33-2.93-4.842-4.465-5.636a23.12 23.12 0 0 1 2.251 6.756l.007.034c-2.516-6.27-6.784-8.804-10.271-14.311-.179-.28-.354-.563-.523-.849a7.248 7.248 0 0 1-.244-.462 4.04 4.04 0 0 1-.347-.92.055.055 0 0 0-.037-.02.081.081 0 0 0-.044 0l-.01.007-.014.01.007-.017c-5.592 3.273-7.49 9.334-7.66 12.366-2.234.153-4.37.977-6.129 2.363a6.69 6.69 0 0 0-.577-.438 10.32 10.32 0 0 1-.06-5.44 16.484 16.484 0 0 0-5.359 4.143h-.01c-.883-1.12-.822-4.808-.77-5.579-.259.106-.51.238-.74.397a15.817 15.817 0 0 0-2.177 1.865 19.452 19.452 0 0 0-2.081 2.495 18.793 18.793 0 0 0-2.988 6.743l-.028.146a32.433 32.433 0 0 0-.22 1.392l-.007.048a21.64 21.64 0 0 0-.36 3.066v.115a22.26 22.26 0 0 0 44.197 3.766l.102-.863a22.902 22.902 0 0 0-1.446-11.18l.003.003ZM91.201 33.179c.102.05.2.102.305.15l.017.01a11.36 11.36 0 0 1-.322-.16Zm23.448-16.264v-.02l.003.024h-.003v-.004Z" fill="url(#c)"/><path d="M116.856 15.754c-.968-2.326-2.93-4.842-4.465-5.637a23.121 23.121 0 0 1 2.254 6.757v.044a20.151 20.151 0 0 1-.689 15.024c-2.553 5.474-8.726 11.086-18.392 10.811-10.441-.299-19.642-8.047-21.357-18.199-.316-1.596 0-2.41.156-3.71a16.572 16.572 0 0 0-.356 3.072v.115a22.263 22.263 0 0 0 44.193 3.762c.038-.285.068-.57.102-.862a22.881 22.881 0 0 0-1.443-11.18h-.003v.003Z" fill="url(#d)"/><path d="M116.856 15.754c-.968-2.326-2.93-4.842-4.465-5.637a23.121 23.121 0 0 1 2.254 6.757v.044a20.151 20.151 0 0 1-.689 15.024c-2.553 5.474-8.726 11.086-18.392 10.811-10.441-.299-19.642-8.047-21.357-18.199-.316-1.596 0-2.41.156-3.71a16.572 16.572 0 0 0-.356 3.072v.115a22.263 22.263 0 0 0 44.193 3.762c.038-.285.068-.57.102-.862a22.881 22.881 0 0 0-1.443-11.18h-.003v.003Z" fill="url(#e)"/><path d="m106.036 18.367.135.102a12.1 12.1 0 0 0-2.064-2.7c-6.92-6.92-1.813-15-.951-15.415l.007-.013c-5.592 3.276-7.49 9.337-7.663 12.366.261-.017.52-.038.78-.038a11.233 11.233 0 0 1 9.756 5.694v.004Z" fill="url(#f)"/><path d="M96.294 19.753c-.034.55-1.993 2.462-2.676 2.462-6.328 0-7.357 3.826-7.357 3.826.278 3.226 2.526 5.884 5.242 7.283.122.068.251.123.374.18.22.099.438.187.655.269a9.947 9.947 0 0 0 2.896.556c11.096.523 13.242-13.265 5.239-17.268a7.69 7.69 0 0 1 5.365 1.303 11.236 11.236 0 0 0-9.752-5.697c-.264 0-.523.024-.78.04a11.15 11.15 0 0 0-6.13 2.36c.34.29.724.673 1.529 1.467 1.51 1.49 5.385 3.032 5.395 3.212v.007Z" fill="url(#g)"/><path d="M96.294 19.753c-.034.55-1.993 2.462-2.676 2.462-6.328 0-7.357 3.826-7.357 3.826.278 3.226 2.526 5.884 5.242 7.283.122.068.251.123.374.18.22.099.438.187.655.269a9.947 9.947 0 0 0 2.896.556c11.096.523 13.242-13.265 5.239-17.268a7.69 7.69 0 0 1 5.365 1.303 11.236 11.236 0 0 0-9.752-5.697c-.264 0-.523.024-.78.04a11.15 11.15 0 0 0-6.13 2.36c.34.29.724.673 1.529 1.467 1.51 1.49 5.385 3.032 5.395 3.212v.007Z" fill="url(#h)"/><path d="M88.334 14.335c.18.115.326.214.458.305a10.323 10.323 0 0 1-.064-5.439 16.481 16.481 0 0 0-5.358 4.143c.108-.007 3.337-.065 4.964.99Z" fill="url(#i)"/><path d="M74.199 24.557c1.718 10.149 10.92 17.9 21.36 18.196 9.666.271 15.839-5.338 18.389-10.811a20.16 20.16 0 0 0 .693-15.024v-.041l.006.034c.788 5.16-1.833 10.152-5.935 13.534l-.013.027c-7.986 6.509-15.632 3.925-17.177 2.872a11.632 11.632 0 0 1-.323-.16c-4.658-2.227-6.583-6.467-6.17-10.107a5.718 5.718 0 0 1-5.272-3.318 8.4 8.4 0 0 1 8.183-.329 11.103 11.103 0 0 0 8.359.33c-.01-.184-3.884-1.725-5.395-3.213-.805-.794-1.189-1.178-1.528-1.466a6.7 6.7 0 0 0-.577-.435 32.561 32.561 0 0 0-.459-.306c-1.623-1.052-4.852-.998-4.957-.994h-.01c-.883-1.12-.822-4.805-.77-5.575-.262.101-.51.237-.744.393a15.84 15.84 0 0 0-2.173 1.868 19.422 19.422 0 0 0-2.092 2.489 18.805 18.805 0 0 0-2.988 6.743c-.01.044-.801 3.5-.41 5.297l.003-.004Z" fill="url(#j)"/><path d="M104.103 15.77a12.114 12.114 0 0 1 2.071 2.7c.119.091.238.183.333.271 5.046 4.652 2.401 11.229 2.207 11.694 4.098-3.375 6.716-8.373 5.932-13.53-2.52-6.279-6.791-8.811-10.271-14.319-.18-.28-.354-.562-.523-.849a7.264 7.264 0 0 1-.245-.461 4.084 4.084 0 0 1-.346-.92.057.057 0 0 0-.037-.02.078.078 0 0 0-.044 0l-.011.006-.013.01c-.863.408-5.97 8.492.951 15.408v.01h-.004Z" fill="url(#k)"/><path d="M106.508 18.744a4.69 4.69 0 0 0-.336-.271l-.136-.102a7.684 7.684 0 0 0-5.368-1.304c8.006 4.003 5.857 17.788-5.24 17.269a9.9 9.9 0 0 1-2.895-.557 11.78 11.78 0 0 1-1.026-.448l.014.01c1.545 1.056 9.188 3.636 17.18-2.872l.01-.027c.197-.466 2.842-7.043-2.207-11.694l.004-.004Z" fill="url(#l)"/><path d="M86.261 26.039s1.026-3.827 7.358-3.827c.683 0 2.642-1.911 2.676-2.465-2.722.986-5.72.867-8.356-.329a8.39 8.39 0 0 0-8.183.33 5.717 5.717 0 0 0 5.27 3.317c-.411 3.64 1.514 7.877 6.169 10.108l.309.152c-2.717-1.405-4.964-4.06-5.243-7.283v-.003Z" fill="url(#m)"/><path d="M116.856 15.754c-.968-2.33-2.93-4.842-4.468-5.636a23.121 23.121 0 0 1 2.254 6.757l.007.033c-2.519-6.27-6.784-8.804-10.271-14.31-.179-.28-.354-.564-.523-.85a7.273 7.273 0 0 1-.248-.462 4.084 4.084 0 0 1-.346-.92.057.057 0 0 0-.034-.02.078.078 0 0 0-.044 0l-.01.007-.017.01.01-.017c-5.592 3.273-7.49 9.334-7.66 12.366.258-.017.516-.037.781-.037a11.23 11.23 0 0 1 9.751 5.693 7.68 7.68 0 0 0-5.364-1.303c8.003 4.006 5.857 17.788-5.24 17.272a9.899 9.899 0 0 1-2.895-.56c-.222-.083-.44-.173-.656-.269-.125-.058-.251-.112-.373-.18l.013.01a12.07 12.07 0 0 1-.322-.16l.305.15c-2.716-1.402-4.96-4.057-5.242-7.28 0 0 1.029-3.83 7.358-3.83.686 0 2.645-1.91 2.679-2.464-.01-.18-3.885-1.722-5.396-3.209-.804-.794-1.188-1.178-1.528-1.467a6.756 6.756 0 0 0-.577-.434 10.321 10.321 0 0 1-.06-5.443 16.48 16.48 0 0 0-5.359 4.142h-.01c-.883-1.12-.818-4.804-.767-5.575-.262.102-.51.238-.747.394a16.233 16.233 0 0 0-2.173 1.864c-.76.77-1.46 1.606-2.081 2.496v.003-.003a18.801 18.801 0 0 0-2.988 6.743l-.028.146c-.044.197-.23 1.188-.258 1.405A26.351 26.351 0 0 0 74 23.92v.115a22.263 22.263 0 0 0 44.197 3.762l.102-.859a22.896 22.896 0 0 0-1.446-11.184h.003Zm-2.207 1.144v.02-.023.003Z" fill="url(#n)"/><path fill-rule="evenodd" clip-rule="evenodd" d="M145.735 41.46a3.502 3.502 0 0 1 4.053-2.839 3.502 3.502 0 0 1 2.838 4.053l-.738 4.185-6.891-1.215.738-4.185Zm-4.183 3.577.738-4.185a7.004 7.004 0 0 1 8.106-5.676 7.005 7.005 0 0 1 5.676 8.106l-.738 4.185 2.659.469a1.545 1.545 0 0 1 1.243 1.19c.044.199.049.404.013.604l-2.586 14.67a1.55 1.55 0 0 1-1.795 1.256l-19.099-3.368a1.547 1.547 0 0 1-1.257-1.794l2.587-14.669a1.55 1.55 0 0 1 1.795-1.257l2.658.469Zm6.216 9.167a2.231 2.231 0 0 0 1.865-1.814 2.236 2.236 0 0 0-1.82-2.565 2.237 2.237 0 0 0-2.587 1.788 2.23 2.23 0 0 0 1.132 2.342l-2.172 3.94a1.228 1.228 0 0 0 .862 1.801l1.988.35a1.228 1.228 0 0 0 1.426-1.398l-.694-4.444Z" fill="url(#o)"/><path fill-rule="evenodd" clip-rule="evenodd" d="m34.653 37.223 10.72-3.14a4.482 4.482 0 0 1 5.545 3.033l7.535 25.73-8.975-2.027-6.25 6.486-7.534-25.731-4.074 1.193a4.482 4.482 0 0 1 3.033-5.544Zm17.675 13.656c.278-.446-.093-1.037-.626-.947l-2.318.464a.546.546 0 0 1-.596-.238l-1.407-1.879a.606.606 0 0 0-1.09.293l-.276 2.331a.625.625 0 0 1-.395.505l-2.232.785c-.507.19-.556.894-.067 1.134l2.215 1.13a.668.668 0 0 1 .334.548l.1 2.548c.016.553.7.821 1.065.404l1.542-1.768a.626.626 0 0 1 .644-.173l2.222.757c.519.152.982-.397.718-.884l-1.19-2.255a.668.668 0 0 1 .013-.641l1.344-2.114Z" fill="url(#p)"/><path d="m180.376 80.545-2.14-1.846-3.269 3.79a1.412 1.412 0 1 0 2.14 1.846l3.269-3.79Z" fill="#B8B8B8"/><path d="m180.264 77.535.971.837-1.441 1.671-.972-.838 1.442-1.67Z" fill="#B8B8B8"/><path opacity=".2" d="M179.663 79.767c.543-.564.681-1.364.399-2l.203-.234.972.839-1.44 1.67-.219-.19c.024-.028.056-.057.085-.085Z" fill="#000"/><path fill-rule="evenodd" clip-rule="evenodd" d="M180.212 77.597a6.041 6.041 0 0 1-.092-8.15 6.036 6.036 0 0 1 7.936-.933 6.035 6.035 0 1 1-7.844 9.083Zm.183-3.813a4.235 4.235 0 1 0 8.448-.622 4.235 4.235 0 0 0-8.448.622Z" fill="url(#q)"/><path d="M178.237 78.698a1.41 1.41 0 0 0 .195 1.986 1.415 1.415 0 0 0 1.944-.14l-2.139-1.846Z" fill="#B8B8B8"/><path d="M4.364 73.733h.681c.17-.725.427-1.364.81-1.96l-.469-.47c-.511-.51-.511-1.363 0-1.917.512-.511 1.364-.511 1.918 0l.469.47c.596-.384 1.278-.683 1.96-.81v-.682c0-.725.596-1.364 1.364-1.364.724 0 1.363.597 1.363 1.364v.681c.724.17 1.364.427 1.96.81l.512-.469c.511-.511 1.363-.511 1.917 0 .512.512.512 1.364 0 1.918l-.468.469c.383.596.681 1.278.81 1.96h.68c.725 0 1.364.596 1.364 1.364 0 .724-.596 1.363-1.363 1.363h-.682a6.146 6.146 0 0 1-.81 1.96l.427.512c.51.511.51 1.363 0 1.917-.512.512-1.364.512-1.918 0l-.469-.469c-.596.384-1.278.682-1.96.81v.682c0 .724-.597 1.364-1.364 1.364a1.373 1.373 0 0 1-1.363-1.364v-.682a6.146 6.146 0 0 1-1.96-.81l-.47.47c-.51.51-1.363.51-1.917 0-.511-.512-.511-1.364 0-1.918l.47-.47c-.384-.596-.683-1.278-.81-1.96h-.682A1.373 1.373 0 0 1 3 75.14c0-.767.597-1.406 1.364-1.406Zm6.733 5.625a4.274 4.274 0 0 0 4.26-4.261 4.274 4.274 0 0 0-4.26-4.262 4.274 4.274 0 0 0-4.262 4.262 4.274 4.274 0 0 0 4.262 4.26Z" fill="url(#r)"/><path d="M11.096 79.358a4.274 4.274 0 0 0 4.262-4.262 4.274 4.274 0 0 0-4.262-4.261 4.274 4.274 0 0 0-4.26 4.261 4.274 4.274 0 0 0 4.26 4.261Zm0-7.245a2.965 2.965 0 0 1 2.983 2.983 2.965 2.965 0 0 1-2.983 2.983 2.965 2.965 0 0 1-2.982-2.983 2.965 2.965 0 0 1 2.982-2.983Z" fill="#9F9FAD"/><defs><radialGradient id="d" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(112.479 5.513) scale(46.4065)"><stop offset=".129" stop-color="#FFBD4F"/><stop offset=".186" stop-color="#FFAC31"/><stop offset=".247" stop-color="#FF9D17"/><stop offset=".283" stop-color="#FF980E"/><stop offset=".403" stop-color="#FF563B"/><stop offset=".467" stop-color="#FF3750"/><stop offset=".71" stop-color="#F5156C"/><stop offset=".782" stop-color="#EB0878"/><stop offset=".86" stop-color="#E50080"/></radialGradient><radialGradient id="e" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(95.248 24.466) scale(46.4065)"><stop offset=".3" stop-color="#960E18"/><stop offset=".351" stop-color="#B11927" stop-opacity=".74"/><stop offset=".435" stop-color="#DB293D" stop-opacity=".343"/><stop offset=".497" stop-color="#F5334B" stop-opacity=".094"/><stop offset=".53" stop-color="#FF3750" stop-opacity="0"/></radialGradient><radialGradient id="f" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(100.993 -4.827) scale(33.6161)"><stop offset=".132" stop-color="#FFF44F"/><stop offset=".252" stop-color="#FFDC3E"/><stop offset=".506" stop-color="#FF9D12"/><stop offset=".526" stop-color="#FF980E"/></radialGradient><radialGradient id="g" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(90.08 36.526) scale(22.0949)"><stop offset=".353" stop-color="#3A8EE6"/><stop offset=".472" stop-color="#5C79F0"/><stop offset=".669" stop-color="#9059FF"/><stop offset="1" stop-color="#C139E6"/></radialGradient><radialGradient id="h" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(11.38846 -2.75348 3.22363 13.33303 97.495 20.483)"><stop offset=".206" stop-color="#9059FF" stop-opacity="0"/><stop offset=".278" stop-color="#8C4FF3" stop-opacity=".064"/><stop offset=".747" stop-color="#7716A8" stop-opacity=".45"/><stop offset=".975" stop-color="#6E008B" stop-opacity=".6"/></radialGradient><radialGradient id="i" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(94.673 3.789) scale(15.8977)"><stop stop-color="#FFE226"/><stop offset=".121" stop-color="#FFDB27"/><stop offset=".295" stop-color="#FFC82A"/><stop offset=".502" stop-color="#FFA930"/><stop offset=".732" stop-color="#FF7E37"/><stop offset=".792" stop-color="#FF7139"/></radialGradient><radialGradient id="j" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(107.307 -6.551) scale(67.8295)"><stop offset=".113" stop-color="#FFF44F"/><stop offset=".456" stop-color="#FF980E"/><stop offset=".622" stop-color="#FF5634"/><stop offset=".716" stop-color="#FF3647"/><stop offset=".904" stop-color="#E31587"/></radialGradient><radialGradient id="k" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="rotate(83.976 52.385 55.089) scale(49.7065 32.622)"><stop stop-color="#FFF44F"/><stop offset=".06" stop-color="#FFE847"/><stop offset=".168" stop-color="#FFC830"/><stop offset=".304" stop-color="#FF980E"/><stop offset=".356" stop-color="#FF8B16"/><stop offset=".455" stop-color="#FF672A"/><stop offset=".57" stop-color="#FF3647"/><stop offset=".737" stop-color="#E31587"/></radialGradient><radialGradient id="l" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(94.675 9.533) scale(42.3403)"><stop offset=".137" stop-color="#FFF44F"/><stop offset=".48" stop-color="#FF980E"/><stop offset=".592" stop-color="#FF5634"/><stop offset=".655" stop-color="#FF3647"/><stop offset=".904" stop-color="#E31587"/></radialGradient><radialGradient id="m" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(105.588 11.833) scale(46.3434)"><stop offset=".094" stop-color="#FFF44F"/><stop offset=".231" stop-color="#FFE141"/><stop offset=".509" stop-color="#FFAF1E"/><stop offset=".626" stop-color="#FF980E"/></radialGradient><linearGradient id="b" x1="24" y1="132" x2="22.896" y2="176.973" gradientUnits="userSpaceOnUse"><stop stop-color="#E0E0E0"/><stop offset="1" stop-color="#A9A9A9"/></linearGradient><linearGradient id="c" x1="113.909" y1="7.456" x2="76.954" y2="43.11" gradientUnits="userSpaceOnUse"><stop offset=".048" stop-color="#FFF44F"/><stop offset=".111" stop-color="#FFE847"/><stop offset=".225" stop-color="#FFC830"/><stop offset=".368" stop-color="#FF980E"/><stop offset=".401" stop-color="#FF8B16"/><stop offset=".462" stop-color="#FF672A"/><stop offset=".534" stop-color="#FF3647"/><stop offset=".705" stop-color="#E31587"/></linearGradient><linearGradient id="n" x1="113.461" y1="7.269" x2="82.02" y2="38.713" gradientUnits="userSpaceOnUse"><stop offset=".167" stop-color="#FFF44F" stop-opacity=".8"/><stop offset=".266" stop-color="#FFF44F" stop-opacity=".634"/><stop offset=".489" stop-color="#FFF44F" stop-opacity=".217"/><stop offset=".6" stop-color="#FFF44F" stop-opacity="0"/></linearGradient><linearGradient id="o" x1="137.223" y1="44.267" x2="159.641" y2="52.954" gradientUnits="userSpaceOnUse"><stop stop-color="#E3C6FF"/><stop offset="1" stop-color="#BC9BFF"/></linearGradient><linearGradient id="p" x1="40.013" y1="35.653" x2="48.804" y2="65.672" gradientUnits="userSpaceOnUse"><stop stop-color="#D7C1FF"/><stop offset=".583" stop-color="#C09BFF"/></linearGradient><linearGradient id="q" x1="184.174" y1="67.454" x2="185.061" y2="79.489" gradientUnits="userSpaceOnUse"><stop stop-color="#B8B8B8"/><stop offset="1" stop-color="#939393"/></linearGradient><linearGradient id="r" x1="11.118" y1="67" x2="11.118" y2="83.236" gradientUnits="userSpaceOnUse"><stop stop-color="#E0E0E6"/><stop offset="1" stop-color="#AFAFBA"/></linearGradient><clipPath id="a"><path fill="#fff" transform="translate(6 72)" d="M0 0h181v114H0z"/></clipPath></defs></svg>
diff --git a/browser/components/aboutwelcome/assets/short-zap.svg b/browser/components/aboutwelcome/assets/short-zap.svg
new file mode 100644
index 0000000000..cc004ed607
--- /dev/null
+++ b/browser/components/aboutwelcome/assets/short-zap.svg
@@ -0,0 +1,4 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+<svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 16" width="400" height="16"><defs><linearGradient id="a" y1="13.69" x2="435.45" y2="13.69" gradientUnits="userSpaceOnUse" gradientTransform="matrix(.91716 0 0 .7708 .27 .687)"><stop offset="0" stop-color="#616eb3"/><stop offset=".5" stop-color="#ec1067"/><stop offset="1" stop-color="#f6901e"/></linearGradient></defs><path d="M3.12 14c161-19.73 207.41 3 223.21-.65 16.76-3.85 20-6.77 31.28-10.29 18.08-5.64-2.49 13.2 8.14 10.71 16.45-3.84 27.73-7.39 39.25-9.4 15-2.6-2 22.49 87.48-2.37" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke="url(#a)"/></svg>
diff --git a/browser/components/aboutwelcome/content-src/aboutwelcome.jsx b/browser/components/aboutwelcome/content-src/aboutwelcome.jsx
new file mode 100644
index 0000000000..28bef55998
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/aboutwelcome.jsx
@@ -0,0 +1,144 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import ReactDOM from "react-dom";
+import { AboutWelcomeUtils } from "./lib/aboutwelcome-utils.mjs";
+import { MultiStageAboutWelcome } from "./components/MultiStageAboutWelcome";
+import { ReturnToAMO } from "./components/ReturnToAMO";
+
+class AboutWelcome extends React.PureComponent {
+ constructor(props) {
+ super(props);
+ this.state = { metricsFlowUri: null };
+ this.fetchFxAFlowUri = this.fetchFxAFlowUri.bind(this);
+ }
+
+ async fetchFxAFlowUri() {
+ this.setState({ metricsFlowUri: await window.AWGetFxAMetricsFlowURI?.() });
+ }
+
+ componentDidMount() {
+ if (!this.props.skipFxA) {
+ this.fetchFxAFlowUri();
+ }
+
+ if (document.location.href === "about:welcome") {
+ // Record impression with performance data after allowing the page to load
+ const recordImpression = domState => {
+ const { domComplete, domInteractive } = performance
+ .getEntriesByType("navigation")
+ .pop();
+ AboutWelcomeUtils.sendImpressionTelemetry(this.props.messageId, {
+ domComplete,
+ domInteractive,
+ mountStart: performance.getEntriesByName("mount").pop().startTime,
+ domState,
+ source: this.props.UTMTerm,
+ });
+ };
+ if (document.readyState === "complete") {
+ // Page might have already triggered a load event because it waited for async data,
+ // e.g., attribution, so the dom load timing could be of a empty content
+ // with domState in telemetry captured as 'complete'
+ recordImpression(document.readyState);
+ } else {
+ window.addEventListener("load", () => recordImpression("load"), {
+ once: true,
+ });
+ }
+
+ // Captures user has seen about:welcome by setting
+ // firstrun.didSeeAboutWelcome pref to true and capturing welcome UI unique messageId
+ window.AWSendToParent("SET_WELCOME_MESSAGE_SEEN", this.props.messageId);
+ }
+ }
+
+ render() {
+ const { props } = this;
+ if (props.template === "return_to_amo") {
+ return (
+ <ReturnToAMO
+ message_id={props.messageId}
+ type={props.type}
+ name={props.name}
+ url={props.url}
+ iconURL={props.iconURL}
+ themeScreenshots={props.screenshots}
+ metricsFlowUri={this.state.metricsFlowUri}
+ />
+ );
+ }
+ return (
+ <MultiStageAboutWelcome
+ message_id={props.messageId}
+ defaultScreens={props.screens}
+ updateHistory={!props.disableHistoryUpdates}
+ metricsFlowUri={this.state.metricsFlowUri}
+ utm_term={props.UTMTerm}
+ transitions={props.transitions}
+ backdrop={props.backdrop}
+ startScreen={props.startScreen || 0}
+ appAndSystemLocaleInfo={props.appAndSystemLocaleInfo}
+ ariaRole={props.aria_role}
+ />
+ );
+ }
+}
+
+// Computes messageId and UTMTerm info used in telemetry
+function ComputeTelemetryInfo(welcomeContent, experimentId, branchId) {
+ let messageId =
+ welcomeContent.template === "return_to_amo"
+ ? `RTAMO_DEFAULT_WELCOME_${welcomeContent.type.toUpperCase()}`
+ : "DEFAULT_ID";
+ let UTMTerm = "aboutwelcome-default";
+
+ if (welcomeContent.id) {
+ messageId = welcomeContent.id.toUpperCase();
+ }
+
+ if (experimentId && branchId) {
+ UTMTerm = `aboutwelcome-${experimentId}-${branchId}`.toLowerCase();
+ }
+ return {
+ messageId,
+ UTMTerm,
+ };
+}
+
+async function retrieveRenderContent() {
+ // Feature config includes RTAMO attribution data if exists
+ // else below data in order specified
+ // user prefs
+ // experiment data
+ // defaults
+ let featureConfig = await window.AWGetFeatureConfig();
+
+ let { messageId, UTMTerm } = ComputeTelemetryInfo(
+ featureConfig,
+ featureConfig.slug,
+ featureConfig.branch && featureConfig.branch.slug
+ );
+ return { featureConfig, messageId, UTMTerm };
+}
+
+async function mount() {
+ let {
+ featureConfig: aboutWelcomeProps,
+ messageId,
+ UTMTerm,
+ } = await retrieveRenderContent();
+ ReactDOM.render(
+ <AboutWelcome
+ messageId={messageId}
+ UTMTerm={UTMTerm}
+ {...aboutWelcomeProps}
+ />,
+ document.getElementById("multi-stage-message-root")
+ );
+}
+
+performance.mark("mount");
+mount();
diff --git a/browser/components/aboutwelcome/content-src/aboutwelcome.scss b/browser/components/aboutwelcome/content-src/aboutwelcome.scss
new file mode 100644
index 0000000000..aa49a04799
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/aboutwelcome.scss
@@ -0,0 +1,1940 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+@use 'sass:math';
+
+// Don't import any styles that are not scoped to .onboardingContainer. This
+// stylesheet is loaded by FeatureCallout.sys.mjs into the browser chrome. To
+// add other stylesheets to about:welcome or spotlight, add them to
+// aboutwelcome.html or spotlight.html. Ideally, there should be no `@import`
+// statements in the built aboutwelcome.css file.
+@import '../../asrouter/content-src/styles/feature-callout';
+@import '../../asrouter/content-src/styles/shopping';
+
+/* stylelint-disable max-nesting-depth */
+
+$break-point-small: 570px;
+$break-point-medium: 610px;
+$break-point-large: 866px;
+$container-min-width: 700px;
+$logo-size: 80px;
+$main-section-width: 504px;
+$split-section-width: 400px;
+$split-screen-height: 550px;
+$small-main-section-height: 450px;
+$small-secondary-section-height: 100px;
+$noodle-buffer: 106px;
+$double-section-width: 800px;
+
+html {
+ height: 100%;
+}
+
+// Below variables are used via config JSON in AboutWelcomeDefaults
+// and referenced below inside dummy class to pass test browser_parsable_css
+.dummy {
+ background: var(--mr-welcome-background-color) var(--mr-welcome-background-gradient) var(--mr-secondary-position) var(--mr-screen-background-color);
+}
+
+// Styling for content rendered in a Spotlight messaging surface.
+:root {
+ &[dialogroot] {
+ background-color: transparent;
+
+ body {
+ padding: 0;
+ }
+
+ .onboardingContainer {
+ // Without this, the container will be 100vh in height. When the dialog
+ // overflows horizontally, the horizontal scrollbar will appear. If the
+ // scrollbars aren't overlay scrollbars (this is controlled by
+ // Theme::ScrollbarStyle), they will take up vertical space in the
+ // viewport, causing the dialog to overflow vertically. This causes the
+ // vertical scrollbar to appear, which takes up horizontal space, causing
+ // the horizontal scrollbar to appear, and so on.
+ height: 100%;
+ background-color: transparent;
+
+ &:dir(rtl) {
+ transform: unset;
+ }
+
+ .logo-container {
+ pointer-events: none;
+ }
+
+ .screen {
+ &:dir(rtl) {
+ transform: unset;
+ }
+ }
+ }
+ }
+}
+
+// Styling for about:welcome background container
+.welcome-container {
+ .onboardingContainer {
+ min-height: $break-point-medium;
+ min-width: fit-content;
+ }
+}
+
+.onboardingContainer {
+ --grey-subtitle-1: #696977;
+ --mr-welcome-background-color: #F8F6F4;
+ --mr-screen-heading-color: var(--in-content-text-color);
+ --mr-welcome-background-gradient: linear-gradient(0deg, rgba(144, 89, 255, 20%) 0%, rgba(2, 144, 238, 20%) 100%);
+ --mr-screen-background-color: #F8F6F4;
+
+ @media (prefers-color-scheme: dark) {
+ --grey-subtitle-1: #FFF;
+ --mr-welcome-background-color: #333336;
+ --mr-welcome-background-gradient: linear-gradient(0deg, rgba(144, 89, 255, 30%) 0%, rgba(2, 144, 238, 30%) 100%);
+ --mr-screen-background-color: #62697A;
+ }
+
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Ubuntu,
+ 'Helvetica Neue', sans-serif;
+ font-size: 16px;
+ position: relative;
+ text-align: center;
+ height: 100vh;
+
+ @media (prefers-contrast) {
+ --mr-screen-background-color: buttontext;
+ --mr-screen-heading-color: buttonface;
+
+ background-color: var(--in-content-page-background);
+ }
+
+ // Transition all of these and reduced motion effectively only does opacity.
+ --transition: 0.6s opacity, 0.6s scale, 0.6s rotate, 0.6s translate;
+
+ // Define some variables that are used for in/out states.
+ @media (prefers-reduced-motion: no-preference) {
+ --translate: 30px;
+ --rotate: 20deg;
+ --scale: 0.4;
+ --progress-bar-transition: 0.6s translate;
+
+ // Scale is used for noodles that can be flipped.
+ &:dir(rtl) {
+ --scale: -0.4 0.4;
+ }
+ }
+
+ // Use default values that match "unmoved" state to avoid motion.
+ @media (prefers-reduced-motion: reduce) {
+ --translate: 0;
+ --rotate: 0deg;
+ --scale: 1;
+ // To reduce motion, progress bar fades in instead of wiping in.
+ --progress-bar-transition: none;
+
+ &:dir(rtl) {
+ --scale: -1 1;
+ }
+ }
+
+ &:dir(rtl) {
+ transform: rotateY(180deg);
+ }
+
+ .section-main {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ width: $main-section-width;
+ flex-shrink: 0;
+ }
+
+ .section-main:not(.embedded-migration) {
+ position: relative;
+ }
+
+ .main-content {
+ background-color: var(--in-content-page-background);
+ border-radius: 20px;
+ box-shadow: 0 2px 14px 0 rgba(0, 0, 0, 20%);
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ padding: 0;
+ transition: var(--transition);
+ z-index: 1;
+ box-sizing: border-box;
+
+ &.no-steps {
+ padding-bottom: 48px;
+ }
+
+ .main-content-inner {
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: space-around;
+ }
+ }
+
+ // Handle conditional display of steps indicator
+ // Don't show when there's only one screen
+ .main-content .no-steps {
+ .main-content {
+ padding-bottom: 48px;
+ }
+
+ .steps {
+ display: none;
+ }
+ }
+
+ @mixin arrow-icon-styles {
+ .arrow-icon {
+ -moz-context-properties: fill;
+ fill: currentColor;
+ text-decoration: none;
+
+ &::after {
+ content: '';
+ padding-inline-end: 12px;
+ margin-inline-start: 4px;
+ background: url('chrome://browser/skin/forward.svg') no-repeat center / 12px;
+ }
+
+ &:dir(rtl)::after {
+ background-image: url('chrome://browser/skin/back.svg');
+ }
+ }
+ }
+
+ @mixin secondary-cta-styles {
+ background-color: var(--in-content-button-background);
+ border: 1px solid var(--in-content-button-border-color);
+ line-height: 12px;
+ font-size: 0.72em;
+ font-weight: 600;
+ padding: 8px 16px;
+ text-decoration: none;
+ cursor: default;
+
+ &:hover,
+ &[open] {
+ background-color: var(--in-content-button-background-hover);
+ color: var(--in-content-button-text-color-hover);
+
+ &:active {
+ background-color: var(--in-content-button-background-active);
+ color: var(--in-content-button-text-color-active);
+ }
+ }
+ }
+
+ @mixin text-link-styles {
+ background: none;
+ text-decoration: underline;
+ cursor: pointer;
+ color: var(--link-color);
+
+ &:hover {
+ color: var(--link-color-hover);
+ }
+
+ &:active {
+ color: var(--link-color-active);
+
+ @media (prefers-contrast) {
+ text-decoration: none;
+ }
+ }
+ }
+
+ .screen {
+ display: flex;
+ position: relative;
+ flex-flow: row nowrap;
+ height: 100%;
+ min-height: 500px;
+ overflow: hidden;
+
+ &.light-text {
+ --in-content-page-color: rgb(251, 251, 254);
+ --in-content-primary-button-text-color: rgb(43, 42, 51);
+ --in-content-primary-button-text-color-hover: rgb(43, 42, 51);
+ --in-content-primary-button-background: rgb(0, 221, 255);
+ --in-content-primary-button-background-hover: rgb(128, 235, 255);
+ --in-content-primary-button-background-active: rgb(170, 242, 255);
+ --in-content-button-text-color: var(--in-content-page-color);
+ }
+
+ &.dark-text {
+ --in-content-page-color: rgb(21, 20, 26);
+ --in-content-primary-button-text-color: rgb(251, 251, 254);
+ --in-content-primary-button-text-color-hover: rgb(251, 251, 254);
+ --in-content-primary-button-background: #0061E0;
+ --in-content-primary-button-background-hover: #0250BB;
+ --in-content-primary-button-background-active: #053E94;
+ --in-content-primary-button-border-color: transparent;
+ --in-content-primary-button-border-hover: transparent;
+ --in-content-button-text-color: var(--in-content-page-color);
+ }
+
+ &:dir(rtl) {
+ transform: rotateY(180deg);
+ }
+
+ &[pos='center'] {
+ background-color: rgba(21, 20, 26, 50%);
+ min-width: $main-section-width;
+
+ &.with-noodles {
+ // Adjust for noodles partially extending out from the square modal
+ min-width: $main-section-width + $noodle-buffer;
+ min-height: $main-section-width + $noodle-buffer;
+
+ .section-main {
+ height: $main-section-width;
+ }
+ }
+
+ &.with-video {
+ justify-content: center;
+ background: none;
+ align-items: center;
+
+ .section-main {
+ width: $double-section-width;
+ height: $split-screen-height;
+ }
+
+ .main-content {
+ background-color: var(--mr-welcome-background-color);
+ border-radius: 8px;
+ box-shadow: 0 2px 14px rgba(58, 57, 68, 20%);
+ padding: 44px 85px 20px;
+
+ .welcome-text {
+ margin: 0;
+ }
+
+ .main-content-inner {
+ justify-content: space-between;
+ }
+
+ h1,
+ h2 {
+ align-self: start;
+ }
+
+ h1 {
+ font-size: 24px;
+ line-height: 28.8px;
+ }
+
+ h2 {
+ font-size: 15px;
+ line-height: 22px;
+ }
+
+ .secondary-cta {
+ @include arrow-icon-styles;
+
+ justify-content: end;
+
+ .secondary {
+ @include secondary-cta-styles;
+
+ color: var(--in-content-button-text-color);
+ }
+ }
+ }
+ }
+
+ &.addons-picker {
+ justify-content: center;
+ align-items: center;
+ background: none;
+
+ .section-main {
+ width: $double-section-width;
+ height: $split-screen-height;
+ }
+
+ .main-content {
+ background-color: var(--in-content-page-background);
+ border-radius: 8px;
+ box-shadow: 0 2px 14px rgba(58, 57, 68, 20%);
+ overflow: hidden;
+
+ .welcome-text {
+ display: flex;
+ margin: 0;
+ }
+
+ .main-content-inner {
+ padding: 25px 56px 0;
+ justify-content: space-between;
+ }
+
+ h1,
+ h2 {
+ align-self: start;
+ }
+
+ h2 {
+ font-size: 15px;
+ text-align: start;
+ }
+
+ .brand-logo {
+ display: block;
+ margin: 40px 56px 0;
+ transition: var(--transition);
+ height: 30px;
+ }
+
+ .additional-cta {
+ display: block;
+ margin: 8px 0;
+
+ &.cta-link {
+ background: none;
+ padding: 0;
+ font-weight: normal;
+
+ @include text-link-styles;
+ }
+
+ &.secondary {
+ &:hover {
+ background-color: var(--in-content-button-background-hover);
+ }
+ }
+ }
+
+ .secondary-cta {
+ @include arrow-icon-styles;
+
+ justify-content: end;
+
+ .secondary {
+ @include secondary-cta-styles;
+
+ color: var(--in-content-button-text-color);
+ }
+ }
+ }
+
+ .addon-container {
+ display: flex;
+ border: 1px solid var(--in-content-border-color);
+ box-shadow: 0 1px 2px 0 var(--in-content-border-color);
+ border-radius: 4px;
+ margin: 5px auto;
+ text-align: start;
+
+ .rtamo-icon {
+ img {
+ margin: 10px;
+ }
+ }
+
+ .addon-details {
+ display: grid;
+ width: 70%;
+ }
+
+ .addon-title {
+ margin: 10px 0 3px;
+ font-size: 16px;
+ font-weight: 600;
+ }
+
+ .addon-description {
+ margin: 2px 0 10px;
+ font-size: 13px;
+ font-weight: 400;
+ }
+
+ .install-button-wrapper {
+ display: flex;
+ }
+
+ button {
+ align-self: center;
+ width: 124px;
+ }
+ }
+
+ .loader {
+ width: 1em;
+ height: 1em;
+ border: 3px solid var(--in-content-primary-button-text-color);
+ border-bottom-color: transparent;
+ border-radius: 50%;
+ box-sizing: border-box;
+ animation: rotation 1s linear infinite;
+ justify-self: center;
+ }
+
+ @keyframes rotation {
+ 0% {
+ transform: rotate(0deg);
+ }
+
+ 100% {
+ transform: rotate(360deg);
+ }
+ }
+
+ .loaderContainer {
+ display: flex;
+ padding: 1.5px 37.5px;
+ margin: auto;
+ }
+ }
+ }
+
+ &:not([pos='split']) {
+ .secondary-cta {
+ .secondary {
+ @include text-link-styles;
+
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 20px;
+ }
+
+ &.top {
+ button {
+ color: #FFF;
+
+ &:hover {
+ color: #E0E0E6;
+ }
+ }
+ }
+ }
+
+ migration-wizard {
+ padding: 5px 60px;
+
+ &::part(header){
+ text-align: center;
+ }
+
+ &::part(buttons){
+ margin: 32px auto 0;
+ }
+ }
+
+ .welcome-text {
+ &:empty {
+ margin: 0;
+ }
+ }
+ }
+
+ &[pos='split'] {
+ margin: auto;
+ min-height: $split-screen-height;
+
+ &::before {
+ content: '';
+ position: absolute;
+ box-shadow: 0 2px 14px 0 rgba(0, 0, 0, 20%);
+ width: $split-section-width + $split-section-width;
+ height: $split-screen-height;
+ border-radius: 8px;
+ inset: 0;
+ margin: auto;
+ pointer-events: none;
+ }
+
+ .section-secondary,
+ .section-main {
+ width: $split-section-width;
+ height: $split-screen-height;
+ }
+
+ .secondary-cta.top {
+ position: fixed;
+ padding-inline-end: 0;
+
+ button {
+ padding: 7px 15px;
+ }
+ }
+
+ .section-main {
+ flex-direction: row;
+ display: block;
+ margin: auto auto auto 0;
+
+ &:dir(rtl) {
+ margin: auto 0 auto auto;
+ }
+
+ &.embedded-migration {
+ .main-content {
+ padding-block: 100px 0;
+ }
+ }
+
+ .main-content {
+ border-radius: 0 8px 8px 0;
+ overflow: hidden;
+ padding-inline: 35px 20px;
+ padding-block: 120px 0;
+ box-shadow: none;
+
+ &.no-steps {
+ padding-bottom: 48px;
+ }
+
+ &:dir(rtl) {
+ border-radius: 8px 0 0 8px;
+ }
+
+ .main-content-inner {
+ min-height: 330px;
+
+ .mobile-download-buttons {
+ padding: 0;
+ margin-inline-start: -5px;
+ display: flex;
+
+ button {
+ cursor: pointer;
+ }
+ }
+
+ .qr-code-image {
+ margin: 5px 0 10px;
+ display: flex;
+ }
+
+ .language-switcher-container {
+ .primary {
+ margin-bottom: 5px;
+ }
+ }
+ }
+
+ .action-buttons {
+ position: relative;
+ text-align: initial;
+ height: 100%;
+
+ .checkbox-container {
+ font-size: 13px;
+ margin-block: 1em;
+
+ &:not(.multi-select-item) {
+ transition: var(--transition);
+ }
+
+ input,
+ label {
+ vertical-align: middle;
+ }
+ }
+
+ .additional-cta-box {
+ margin: 8px 0;
+
+ .additional-cta {
+ margin: 0;
+
+ &.cta-link {
+ @include text-link-styles;
+
+ padding: 0;
+ font-weight: normal;
+ }
+
+ &.secondary {
+ &:hover,
+ &[open] {
+ background-color: var(--in-content-button-background-hover);
+ }
+ }
+ }
+ }
+
+ &.additional-cta-container {
+ flex-wrap: nowrap;
+ align-items: start;
+ }
+
+ .secondary-cta {
+ position: absolute;
+ bottom: -30px;
+ inset-inline-end: 0;
+
+ .secondary {
+ @include secondary-cta-styles;
+ }
+
+ @include arrow-icon-styles;
+ }
+ }
+
+ .logo-container {
+ text-align: start;
+ }
+
+ .brand-logo {
+ height: 25px;
+ margin-block: 0;
+ }
+
+ .logo-alt {
+ width: inherit;
+ height: inherit;
+ }
+
+ .welcome-text {
+ margin-inline: 0 10px;
+ margin-block: 10px 35px;
+ text-align: initial;
+ align-items: initial;
+
+ &:empty {
+ margin: 0;
+ }
+
+ h1 {
+ font-size: 24px;
+ line-height: 1.2;
+ width: 300px;
+ }
+
+ h2 {
+ margin: 10px 0 0;
+ min-height: 1em;
+ font-size: 15px;
+ line-height: 1.5;
+
+ @media (prefers-contrast: no-preference) {
+ color: #5B5B66;
+ }
+ }
+ }
+
+ .welcome-text h1,
+ .primary {
+ margin: 0;
+ }
+
+ .steps {
+ z-index: 1;
+
+ &.progress-bar {
+ width: $split-section-width;
+ margin-inline: -35px;
+ }
+ }
+
+ @media (prefers-contrast) {
+ border: 1px solid var(--in-content-page-color);
+
+ .steps.progress-bar {
+ border-top: 1px solid var(--in-content-page-color);
+ background-color: var(--in-content-page-background);
+
+ .indicator {
+ background-color: var(--in-content-accent-color);
+ }
+ }
+ }
+ }
+ }
+
+ .section-secondary {
+ --mr-secondary-position: center center / auto 350px;
+
+ border-radius: 8px 0 0 8px;
+ margin: auto 0 auto auto;
+ display: flex;
+ align-items: center;
+ -moz-context-properties: fill, stroke, fill-opacity, stroke-opacity;
+ stroke: currentColor;
+
+ &:dir(rtl) {
+ border-radius: 0 8px 8px 0;
+ margin: auto auto auto 0;
+ }
+
+ h1 {
+ color: var(--mr-screen-heading-color);
+ font-weight: 700;
+ font-size: 47px;
+ line-height: 110%;
+ max-width: 340px;
+ text-align: initial;
+ white-space: pre-wrap;
+ text-shadow: none;
+ margin-inline: 40px 0;
+ }
+
+ .image-alt {
+ width: inherit;
+ height: inherit;
+ }
+
+ .hero-image {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ max-height: 100%;
+
+ img {
+ width: 100%;
+ max-width: 180px;
+ margin: 25px 0;
+ padding-bottom: 30px;
+
+ @media only screen and (width <= 800px) {
+ padding-bottom: unset;
+ }
+ }
+ }
+ }
+
+ .multi-select-container {
+ margin-inline: 0 10px;
+
+ @media only screen and (width <= 800px) {
+ flex-direction: column;
+ align-self: center;
+ align-items: start;
+ justify-content: center;
+ width: 240px;
+ padding: 0 30px;
+ margin-inline: 0;
+ box-sizing: content-box;
+ }
+ }
+
+ .tiles-theme-container {
+ margin-block: -20px auto;
+ align-items: initial;
+
+ .theme {
+ min-width: 38px;
+ }
+ }
+
+ @media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ .section-main .main-content {
+ .welcome-text h2 {
+ color: #CFCFD8;
+ }
+
+ .action-buttons .secondary {
+ background-color: #2B2A33;
+ }
+ }
+ }
+
+ @media only screen and (width >= 800px) {
+ .tiles-theme-section {
+ margin-inline-start: -10px;
+ }
+ }
+
+ @media only screen and (width <= 800px) {
+ flex-direction: column;
+ min-height: $small-main-section-height + $small-secondary-section-height;
+
+ &::before {
+ width: $split-section-width;
+ }
+
+ .section-secondary,
+ .section-main {
+ width: $split-section-width;
+ }
+
+ .section-secondary {
+ --mr-secondary-background-position-y: top;
+ --mr-secondary-position: center var(--mr-secondary-background-position-y) / 75%;
+
+ border-radius: 8px 8px 0 0;
+ margin: auto auto 0;
+ height: $small-secondary-section-height;
+
+ .hero-image img {
+ margin: 6px 0;
+ }
+
+ .message-text {
+ margin-inline: auto;
+ }
+
+ h1 {
+ font-size: 35px;
+ text-align: center;
+ white-space: normal;
+ margin-inline: auto;
+ margin-block: 14px 6px;
+ }
+
+ &:dir(rtl) {
+ margin: auto auto 0;
+ border-radius: 8px 8px 0 0;
+ }
+
+ &.with-secondary-section-hidden {
+ display: none;
+ }
+ }
+
+ migration-wizard {
+ &::part(deck){
+ min-width: 330px;
+ margin-inline: 36px;
+ }
+ }
+
+ .section-main {
+ margin: 0 auto auto;
+ height: $small-main-section-height;
+
+ migration-wizard::part(buttons) {
+ flex-direction: column;
+ margin-inline: 46px;
+ }
+
+ &[hide-secondary-section='responsive'] {
+ height: $split-screen-height;
+ margin: auto;
+
+ .main-content {
+ padding: 50px 0 0;
+ border-radius: 8px;
+ }
+ }
+
+ .main-content {
+ border-radius: 0 0 8px 8px;
+ padding: 30px 0 0;
+
+ .main-content-inner {
+ align-items: center;
+ }
+
+ .logo-container {
+ text-align: center;
+
+ .brand-logo {
+ min-height: 25px;
+
+ &,
+ &:dir(rtl) {
+ background-position: center;
+ }
+ }
+
+ .logo-alt {
+ width: inherit;
+ height: inherit;
+ }
+ }
+
+ .welcome-text {
+ align-items: center;
+ text-align: center;
+ margin-inline: 0;
+ padding-inline: 30px;
+
+ .spacer-bottom,
+ .spacer-top {
+ display: none;
+ }
+ }
+
+ .action-buttons {
+ text-align: center;
+
+ .checkbox-container {
+ display: none;
+ }
+
+ .secondary-cta {
+ position: relative;
+ margin-block: 10px 0;
+ bottom: 0;
+ }
+ }
+
+ .primary,
+ .secondary {
+ min-width: 240px;
+ margin-inline: 0;
+ }
+
+ .steps {
+ padding-block: 0;
+ margin: 0;
+
+ &.progress-bar {
+ margin-inline: 0;
+ }
+ }
+ }
+
+ .additional-cta {
+ &.cta-link {
+ align-self: center;
+ }
+ }
+
+ .dismiss-button {
+ top: -$small-secondary-section-height;
+ }
+
+ &:dir(rtl) {
+ margin: 0 auto auto;
+
+ .main-content {
+ border-radius: 0 0 8px 8px;
+ }
+ }
+ }
+
+ }
+
+ @media only screen and (height <= 650px) {
+ // Hide the "Sign in" button on the welcome screen when it would
+ // otherwise overlap the screen. We'd reposition it, but then it would
+ // overlap the dismiss button. We may change the alignment so they don't
+ // overlap in a future revision.
+ @media (800px <= width <= 990px) {
+ .section-main .secondary-cta.top {
+ display: none;
+ }
+ }
+
+ // Reposition the "Sign in" button on the welcome screen to move inside
+ // the screen when it would otherwise overlap the screen.
+ @media (width <= 620px) {
+ .section-main .secondary-cta.top {
+ position: absolute;
+ padding: 0;
+ top: 0;
+ inset-inline-end: 0;
+ }
+ }
+ }
+ }
+ }
+
+ .brand-logo {
+ margin-block: 60px 10px;
+ transition: var(--transition);
+ height: 80px;
+
+ &.cta-top {
+ margin-top: 25px;
+ }
+
+ &.hide {
+ visibility: hidden;
+ padding: unset;
+ margin-top: 50px;
+ }
+ }
+
+ .logo-alt {
+ width: inherit;
+ height: inherit;
+ }
+
+ .rtamo-theme-icon {
+ max-height: 30px;
+ border-radius: 2px;
+ margin-bottom: 10px;
+ margin-top: 24px;
+ }
+
+ .rtamo-icon {
+ text-align: start;
+
+ @media only screen and (width <= 800px) {
+ text-align: center;
+ }
+ }
+
+ .text-link {
+ @include text-link-styles;
+ }
+
+ .welcome-text {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ margin: 0.5em 1em;
+ transition: var(--transition);
+
+ h1,
+ h2 {
+ color: var(--in-content-page-color);
+ line-height: 1.5;
+ }
+
+ h1 {
+ font-size: 24px;
+ font-weight: 600;
+ margin: 0 6px;
+ letter-spacing: -0.02em;
+ outline: none;
+ }
+
+ h2 {
+ font-size: 16px;
+ font-weight: normal;
+ margin: 10px 6px 0;
+ max-width: 750px;
+ letter-spacing: -0.01em;
+ }
+
+ &.fancy {
+ h1 {
+ background-image: linear-gradient(90deg, #9059FF, #FF4AA2, #FF8C00, #FF4AA2, #9059FF);
+ background-clip: text;
+ background-size: 200%;
+
+ @media (prefers-contrast: no-preference) {
+ color: transparent;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ background-image: linear-gradient(90deg, #C688FF, #FF84C0, #FFBD4F, #FF84C0, #C688FF);
+
+ &::selection {
+ color: #FFF;
+ background-color: #696977;
+ }
+ }
+ }
+ }
+
+ &.shine {
+ h1 {
+ animation: shine 50s linear infinite;
+ background-size: 400%;
+ }
+
+ @keyframes shine {
+ to {
+ background-position: 400%;
+ }
+ }
+ }
+
+ .cta-paragraph {
+ a {
+ margin: 0;
+ text-decoration: underline;
+ cursor: pointer;
+ }
+ }
+ }
+
+ // Override light and dark mode fancy title colors for use over light and dark backgrounds
+ .screen.light-text .welcome-text.fancy h1 {
+ background-image: linear-gradient(90deg, #C688FF, #FF84C0, #FFBD4F, #FF84C0, #C688FF);
+ }
+
+ .screen.dark-text .welcome-text.fancy h1 {
+ background-image: linear-gradient(90deg, #9059FF, #FF4AA2, #FF8C00, #FF4AA2, #9059FF);
+ }
+
+ .welcomeZap {
+ span {
+ position: relative;
+ z-index: 1;
+ white-space: nowrap;
+ }
+
+ .zap {
+ &::after {
+ display: block;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ content: '';
+ position: absolute;
+ top: calc(100% - 0.15em);
+ width: 100%;
+ height: 0.3em;
+ left: 0;
+ z-index: -1;
+ transform: scaleY(3);
+ }
+
+ &.short::after {
+ background-image: url('chrome://activity-stream/content/data/content/assets/short-zap.svg');
+ }
+
+ &.long::after {
+ background-image: url('chrome://activity-stream/content/data/content/assets/long-zap.svg');
+ }
+ }
+ }
+
+ .language-loader {
+ filter: invert(1);
+ margin-inline-end: 10px;
+ position: relative;
+ top: 3px;
+ width: 16px;
+ height: 16px;
+ margin-top: -6px;
+ }
+
+ @media (prefers-color-scheme: dark) {
+ .language-loader {
+ filter: invert(0);
+ }
+ }
+
+ .tiles-theme-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin: 10px auto;
+ }
+
+ .sr-only {
+ opacity: 0;
+ overflow: hidden;
+ position: absolute;
+
+ &.input {
+ height: 1px;
+ width: 1px;
+ }
+ }
+
+ .tiles-theme-section {
+ border: 0;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 5px;
+ justify-content: space-evenly;
+ margin-inline: 10px;
+ padding: 10px;
+ transition: var(--transition);
+
+ &:hover,
+ &:active,
+ &:focus-within {
+ border-radius: 8px;
+ outline: 2px solid var(--in-content-primary-button-background);
+ }
+
+ .theme {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ padding: 0;
+ min-width: 50px;
+ width: 180px;
+ color: #000;
+ box-shadow: none;
+ border-radius: 4px;
+ cursor: pointer;
+ z-index: 0;
+
+ &:focus,
+ &:active {
+ outline: initial;
+ outline-offset: initial;
+ }
+
+ .icon {
+ background-size: cover;
+ width: 40px;
+ height: 40px;
+ border-radius: 40px;
+ outline: 1px solid var(--in-content-border-color);
+ outline-offset: -0.5px;
+ z-index: -1;
+
+ &:dir(rtl) {
+ transform: scaleX(-1);
+ }
+
+ &:focus,
+ &:active,
+ &.selected {
+ outline: 2px solid var(--in-content-primary-button-background);
+ outline-offset: 2px;
+ }
+
+ &.light {
+ background-image: url('resource://builtin-themes/light/icon.svg');
+ }
+
+ &.dark {
+ background-image: url('resource://builtin-themes/dark/icon.svg');
+ }
+
+ &.alpenglow {
+ background-image: url('resource://builtin-themes/alpenglow/icon.svg');
+ }
+
+ &.default,
+ &.automatic {
+ background-image: url('resource://default-theme/icon.svg');
+ }
+ }
+
+ .text {
+ display: flex;
+ color: var(--in-content-page-color);
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 20px;
+ margin-inline-start: 0;
+ margin-top: 9px;
+ }
+ }
+
+ legend {
+ cursor: default;
+ }
+ }
+
+ .tiles-container {
+ margin: 10px auto;
+
+ &.info {
+ padding: 6px 12px 12px;
+
+ &:hover,
+ &:focus {
+ background-color: rgba(217, 217, 227, 30%);
+ border-radius: 4px;
+ }
+ }
+ }
+
+ .tiles-delayed {
+ animation: fadein 0.4s;
+ }
+
+ .multi-select-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ flex-shrink: 0;
+ align-items: flex-start;
+ gap: 16px;
+ margin-block: -1em 2em;
+ margin-inline: 1em;
+ color: #5B5B66;
+ font-weight: 400;
+ font-size: 14px;
+ text-align: initial;
+ transition: var(--transition);
+ z-index: 1;
+
+ #multi-stage-multi-select-label {
+ // These styles are based on .welcome-text>h2 (subtitle).
+ color: var(--in-content-page-color);
+ line-height: 1.5;
+ font-size: 16px;
+ font-weight: normal;
+ letter-spacing: -0.01em;
+ // Try to get the label positioned the same way it would be if it was a
+ // subtitle. -0.5em for the welcome-text margin, 1em for the
+ // multi-select-container margin, and 10px for the desired margin between
+ // the label and the title.
+ margin: calc(-0.5em + 1em + 10px) 6px 0;
+ max-width: 750px;
+ }
+
+ @at-root .onboardingContainer .screen[pos='split'] .multi-select-container #multi-stage-multi-select-label {
+ margin: calc(-35px + 1em + 10px) 0 0;
+ min-height: 1em;
+ font-size: 15px;
+ line-height: 1.5;
+
+ @media (prefers-contrast: no-preference) {
+ color: #5B5B66;
+ }
+
+ @media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ color: #CFCFD8;
+ }
+ }
+
+ .checkbox-container {
+ display: flex;
+ }
+
+ @media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ color: #CFCFD8;
+ }
+ }
+
+ .mobile-downloads {
+ .qr-code-image {
+ margin: 24px 0 10px;
+ width: 113px;
+ height: 113px;
+ }
+
+ .email-link {
+ @include text-link-styles;
+
+ font-size: 16px;
+ font-weight: 400;
+
+ &:hover {
+ background: none;
+ }
+ }
+
+ .ios button {
+ background-image: url('chrome://app-marketplace-icons/locale/ios.svg');
+ }
+
+ .android button {
+ background-image: url('chrome://app-marketplace-icons/locale/android.png');
+ }
+ }
+
+ .mobile-download-buttons {
+ list-style: none;
+ padding: 10px 0;
+ margin: 0;
+
+ li {
+ display: inline-block;
+
+ button {
+ display: inline-block;
+ height: 45px;
+ width: 152px;
+ background-repeat: no-repeat;
+ background-size: contain;
+ background-position: center;
+ box-shadow: none;
+ border: 0;
+ }
+
+ &:not(:first-child) {
+ margin-inline: 5px 0;
+ }
+ }
+ }
+
+ .dismiss-button {
+ position: absolute;
+ z-index: 2;
+ top: 0;
+ left: auto;
+ right: 0;
+ box-sizing: border-box;
+ padding: 0;
+ margin: 16px;
+ display: block;
+ float: inline-end;
+ background: url('chrome://global/skin/icons/close.svg') no-repeat center / 16px;
+ height: 32px;
+ width: 32px;
+ align-self: end;
+ // override default min-height and min-width for buttons
+ min-height: 32px;
+ min-width: 32px;
+ -moz-context-properties: fill;
+ fill: currentColor;
+ transition: var(--transition);
+
+ &:dir(rtl) {
+ left: 0;
+ right: auto;
+ }
+ }
+
+ @keyframes fadein {
+ from { opacity: 0; }
+ }
+
+ .secondary-cta {
+ display: flex;
+ align-items: end;
+ flex-direction: row;
+ justify-content: center;
+ font-size: 14px;
+ transition: var(--transition);
+
+ &.top {
+ justify-content: end;
+ padding-inline-end: min(150px, 500px - 70vh);
+ padding-top: 4px;
+ position: absolute;
+ top: 10px;
+ inset-inline-end: 20px;
+ z-index: 2;
+ }
+
+ span {
+ color: var(--grey-subtitle-1);
+ margin: 0 4px;
+ }
+ }
+
+ .message-text {
+ transition: var(--transition);
+ }
+
+ .helptext {
+ padding: 1em;
+ text-align: center;
+ color: var(--grey-subtitle-1);
+ font-size: 12px;
+ line-height: 18px;
+
+ &.default {
+ align-self: center;
+ max-width: 40%;
+ }
+
+ span {
+ padding-inline-end: 4px;
+ }
+ }
+
+ .helptext-img {
+ height: 1.5em;
+ width: 1.5em;
+ margin-inline-end: 4px;
+ vertical-align: middle;
+
+ &.end {
+ margin: 4px;
+ }
+
+ &.footer {
+ vertical-align: bottom;
+ }
+ }
+
+ .steps {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ margin-top: 0;
+ padding-block: 16px 0;
+ transition: var(--transition);
+ z-index: -1;
+ height: 48px;
+ box-sizing: border-box;
+
+ &.has-helptext {
+ padding-bottom: 0;
+ }
+
+ .indicator {
+ width: 0;
+ height: 0;
+ margin-inline-end: 4px;
+ margin-inline-start: 4px;
+ background: var(--grey-subtitle-1);
+ border-radius: 5px;
+ // using border will show up in Windows High Contrast Mode to improve accessibility.
+ border: 3px solid var(--in-content-button-text-color);
+ opacity: 0.35;
+ box-sizing: inherit;
+
+ &.current {
+ opacity: 1;
+ border-color: var(--in-content-primary-button-background);
+
+ // This is the only step shown, so visually hide it to maintain spacing.
+ &:last-of-type:first-of-type {
+ opacity: 0;
+ }
+ }
+ }
+
+ &.progress-bar {
+ height: 6px;
+ padding-block: 0;
+ margin-block: 42px 0;
+ background-color: color-mix(in srgb, var(--in-content-button-text-color) 25%, transparent);
+ justify-content: start;
+ opacity: 1;
+ transition: none;
+
+ .indicator {
+ width: 100%;
+ height: 100%;
+ margin-inline: -1px;
+ background-color: var(--in-content-primary-button-background);
+ border: 0;
+ border-radius: 0;
+ opacity: 1;
+ transition: var(--progress-bar-transition);
+ translate: calc(var(--progress-bar-progress, 0%) - 100%);
+
+ &:dir(rtl) {
+ translate: calc(var(--progress-bar-progress, 0%) * -1 + 100%);
+ }
+ }
+ }
+ }
+
+ .additional-cta-container {
+ &[flow] {
+ display: flex;
+ flex-flow: column wrap;
+ align-items: center;
+
+ &[flow='row'] {
+ flex-direction: row;
+ justify-content: center;
+
+ .secondary-cta {
+ flex-basis: 100%;
+ }
+ }
+ }
+ }
+
+ .primary,
+ .secondary,
+ .additional-cta,
+ .submenu-button {
+ font-size: 13px;
+ line-height: 16px;
+ padding: 11px 15px;
+ transition: var(--transition);
+
+ &.rtamo {
+ margin-top: 24px;
+ }
+ }
+
+ .secondary {
+ background-color: var(--in-content-button-background);
+ color: var(--in-content-button-text-color);
+ }
+
+ .split-button-container,
+ .screen .action-buttons .split-button-container {
+ align-items: stretch;
+
+ &:not([hidden]) {
+ display: flex;
+ }
+
+ .primary,
+ .secondary,
+ .additional-cta {
+ &:not(.submenu-button) {
+ border-start-end-radius: 0;
+ border-end-end-radius: 0;
+ margin-inline-end: 0;
+ }
+
+ &:focus-visible {
+ z-index: 2;
+ }
+ }
+
+ .submenu-button {
+ border-start-start-radius: 0;
+ border-end-start-radius: 0;
+ margin-inline-start: 1px;
+ padding: 8px;
+ min-width: 30px;
+ box-sizing: border-box;
+ background-image: url('chrome://global/skin/icons/arrow-down.svg');
+ background-repeat: no-repeat;
+ background-size: 16px;
+ background-position: center;
+ -moz-context-properties: fill;
+ fill: currentColor;
+ }
+ }
+
+ // Styles specific to background noodles, with screen-by-screen positions
+ .noodle {
+ display: block;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ position: absolute;
+ transition: var(--transition);
+
+ // Flip noodles in a way that combines individual transforms.
+ &:dir(rtl) {
+ scale: -1 1;
+ }
+ }
+
+ .outline-L {
+ background-image: url('chrome://activity-stream/content/data/content/assets/noodle-outline-L.svg');
+ }
+
+ .solid-L {
+ background-image: url('chrome://activity-stream/content/data/content/assets/noodle-solid-L.svg');
+ -moz-context-properties: fill;
+ fill: var(--in-content-page-background);
+ display: none;
+ }
+
+ .purple-C {
+ background-image: url('chrome://activity-stream/content/data/content/assets/noodle-C.svg');
+ -moz-context-properties: fill;
+ fill: #E7258C;
+ }
+
+ .orange-L {
+ background-image: url('chrome://activity-stream/content/data/content/assets/noodle-solid-L.svg');
+ -moz-context-properties: fill;
+ fill: #FFA437;
+ }
+
+ .screen-1 {
+ .section-main {
+ z-index: 1;
+ margin: auto;
+ }
+
+ // Position of noodles on second screen
+ .outline-L {
+ width: 87px;
+ height: 80px;
+ transform: rotate(10deg) translate(-30%, 200%);
+ transition-delay: 0.4s;
+ z-index: 2;
+ }
+
+ .orange-L {
+ width: 550px;
+ height: 660px;
+ transform: rotate(-155deg) translate(11%, -18%);
+ transition-delay: 0.2s;
+ }
+
+ .purple-C {
+ width: 310px;
+ height: 260px;
+ transform: translate(-18%, -67%);
+ }
+
+ .yellow-circle {
+ width: 165px;
+ height: 165px;
+ border-radius: 50%;
+ transform: translate(230%, -5%);
+ background: #952BB9;
+ transition-delay: -0.2s;
+ }
+ }
+
+ // Defining the timing of the transition-in for items within the dialog,
+ // These longer delays are to allow for the dialog to slide down on first screen
+ .dialog-initial {
+ .brand-logo {
+ transition-delay: 0.6s;
+ }
+
+ .welcome-text {
+ transition-delay: 0.8s;
+ }
+
+ .tiles-theme-section,
+ .multi-select-container,
+ migration-wizard {
+ transition-delay: 0.9s;
+ }
+
+ .primary,
+ .secondary,
+ .secondary-cta,
+ .steps,
+ .cta-link {
+ transition-delay: 1s;
+ }
+ }
+
+ // Delays for transitioning-in of intermediate screens
+ .screen:not(.dialog-initial) {
+ .tiles-theme-section,
+ .multi-select-container
+ {
+ transition-delay: 0.2s;
+ }
+
+ .primary,
+ .secondary,
+ .secondary-cta,
+ .cta-link {
+ transition-delay: 0.4s;
+ }
+ }
+
+ .screen-2 {
+ .section-main {
+ z-index: 1;
+ margin: auto;
+ }
+
+ // Position of noodles on third screen
+ .outline-L {
+ width: 87px;
+ height: 80px;
+ transform: rotate(250deg) translate(-420%, 425%);
+ transition-delay: 0.2s;
+ z-index: 2;
+ }
+
+ .orange-L {
+ height: 800px;
+ width: 660px;
+ transform: rotate(35deg) translate(-10%, -7%);
+ transition-delay: -0.4s;
+ }
+
+ .purple-C {
+ width: 392px;
+ height: 394px;
+ transform: rotate(260deg) translate(-34%, -35%);
+ transition-delay: -0.2s;
+ fill: #952BB9;
+ }
+
+ .yellow-circle {
+ width: 165px;
+ height: 165px;
+ border-radius: 50%;
+ transform: translate(160%, 130%);
+ background: #E7258C;
+ }
+ }
+
+ &.transition-in {
+ .noodle {
+ opacity: 0;
+ rotate: var(--rotate);
+ scale: var(--scale);
+ }
+
+ .dialog-initial {
+ .main-content,
+ .dismiss-button {
+ translate: 0 calc(-2 * var(--translate));
+ }
+
+ .brand-logo,
+ .steps {
+ opacity: 0;
+ translate: 0 calc(-1 * var(--translate));
+ }
+ }
+
+ .screen {
+ .welcome-text,
+ .multi-select-container,
+ .tiles-theme-section,
+ .primary,
+ .checkbox-container:not(.multi-select-item),
+ .secondary,
+ .secondary-cta:not(.top),
+ .cta-link,
+ migration-wizard {
+ opacity: 0;
+ translate: 0 calc(-1 * var(--translate));
+ }
+
+ &:not(.dialog-initial) {
+ .steps:not(.progress-bar) {
+ opacity: 0.2;
+ }
+ }
+ }
+ }
+
+ &.transition-out {
+ .noodle {
+ opacity: 0;
+ rotate: var(--rotate);
+ scale: var(--scale);
+ transition-delay: 0.2s;
+ }
+
+ .screen:not(.dialog-last) {
+ .main-content {
+ overflow: hidden;
+ }
+
+ .welcome-text,
+ .multi-select-container {
+ opacity: 0;
+ translate: 0 var(--translate);
+ transition-delay: 0.1s;
+ }
+
+ // content that is nested between inner main content and navigation CTAs
+ // requires an additional 0.1s transition to avoid overlap
+ .tiles-theme-section,
+ migration-wizard {
+ opacity: 0;
+ translate: 0 var(--translate);
+ transition-delay: 0.2s;
+ }
+
+ .primary,
+ .checkbox-container:not(.multi-select-item),
+ .secondary,
+ .secondary-cta:not(.top),
+ .cta-link {
+ opacity: 0;
+ translate: 0 var(--translate);
+ transition-delay: 0.3s;
+ }
+
+ .steps:not(.progress-bar) {
+ opacity: 0.2;
+ transition-delay: 0.5s;
+ }
+ }
+
+ .dialog-last {
+ .noodle {
+ transition-delay: 0s;
+ }
+
+ .main-content,
+ .dismiss-button {
+ opacity: 0;
+ translate: 0 calc(2 * var(--translate));
+ transition-delay: 0.4s;
+ }
+ }
+ }
+
+ migration-wizard {
+ width: unset;
+ transition: var(--transition);
+
+ &::part(buttons) {
+ margin-top: 24px;
+ justify-content: flex-start;
+ }
+
+ &::part(deck) {
+ font-size: 0.83em;
+ }
+ }
+}
diff --git a/browser/components/aboutwelcome/content-src/components/AdditionalCTA.jsx b/browser/components/aboutwelcome/content-src/components/AdditionalCTA.jsx
new file mode 100644
index 0000000000..7685195666
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/AdditionalCTA.jsx
@@ -0,0 +1,42 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import { Localized } from "./MSLocalized";
+import { SubmenuButton } from "./SubmenuButton";
+
+export const AdditionalCTA = ({ content, handleAction }) => {
+ let buttonStyle = "";
+ const isSplitButton =
+ content.submenu_button?.attached_to === "additional_button";
+ let className = "additional-cta-box";
+ if (isSplitButton) {
+ className += " split-button-container";
+ }
+
+ if (!content.additional_button?.style) {
+ buttonStyle = "primary";
+ } else {
+ buttonStyle =
+ content.additional_button?.style === "link"
+ ? "cta-link"
+ : content.additional_button?.style;
+ }
+
+ return (
+ <div className={className}>
+ <Localized text={content.additional_button?.label}>
+ <button
+ className={`${buttonStyle} additional-cta`}
+ onClick={handleAction}
+ value="additional_button"
+ disabled={content.additional_button?.disabled === true}
+ />
+ </Localized>
+ {isSplitButton ? (
+ <SubmenuButton content={content} handleAction={handleAction} />
+ ) : null}
+ </div>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/AddonsPicker.jsx b/browser/components/aboutwelcome/content-src/components/AddonsPicker.jsx
new file mode 100644
index 0000000000..10c88008de
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/AddonsPicker.jsx
@@ -0,0 +1,116 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useState } from "react";
+import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
+import { Localized } from "./MSLocalized";
+
+export const Loader = () => {
+ return (
+ <button className="primary">
+ <div className="loaderContainer">
+ <span className="loader" />
+ </div>
+ </button>
+ );
+};
+
+export const InstallButton = props => {
+ const [installing, setInstalling] = useState(false);
+ const [installComplete, setInstallComplete] = useState(false);
+
+ let buttonLabel = installComplete ? "Installed" : "Add to Firefox";
+
+ function onClick(event) {
+ props.handleAction(event);
+ // Replace the label with the spinner
+ setInstalling(true);
+
+ window.AWEnsureAddonInstalled(props.addonId).then(value => {
+ if (value === "complete") {
+ // Set the label to "Installed"
+ setInstallComplete(true);
+ }
+ // Whether the addon installs or not, we want to remove the spinner
+ setInstalling(false);
+ });
+ }
+
+ return (
+ <div className="install-button-wrapper">
+ {installing ? (
+ <Loader />
+ ) : (
+ <Localized text={buttonLabel}>
+ <button
+ id={props.name}
+ value={props.index}
+ onClick={onClick}
+ disabled={installComplete}
+ className="primary"
+ />
+ </Localized>
+ )}
+ </div>
+ );
+};
+
+export const AddonsPicker = props => {
+ const { content } = props;
+
+ if (!content) {
+ return null;
+ }
+
+ function handleAction(event) {
+ const { message_id } = props;
+ let { action, source_id } = content.tiles.data[event.currentTarget.value];
+ let { type, data } = action;
+
+ if (type === "INSTALL_ADDON_FROM_URL") {
+ if (!data) {
+ return;
+ }
+ }
+
+ AboutWelcomeUtils.handleUserAction({ type, data });
+ AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
+ }
+
+ return (
+ <div className={"addons-picker-container"}>
+ {content.tiles.data.map(({ id, name, type, description, icon }, index) =>
+ name ? (
+ <div key={id} className="addon-container">
+ <div className="rtamo-icon">
+ <img
+ className={`${
+ type === "theme" ? "rtamo-theme-icon" : "brand-logo"
+ }`}
+ src={icon}
+ role="presentation"
+ alt=""
+ />
+ </div>
+ <div className="addon-details">
+ <Localized text={name}>
+ <div className="addon-title" />
+ </Localized>
+ <Localized text={description}>
+ <div className="addon-description" />
+ </Localized>
+ </div>
+ <InstallButton
+ key={id}
+ addonId={id}
+ name={name}
+ handleAction={handleAction}
+ index={index}
+ />
+ </div>
+ ) : null
+ )}
+ </div>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/CTAParagraph.jsx b/browser/components/aboutwelcome/content-src/components/CTAParagraph.jsx
new file mode 100644
index 0000000000..41726626a4
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/CTAParagraph.jsx
@@ -0,0 +1,45 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import { Localized } from "./MSLocalized";
+
+export const CTAParagraph = props => {
+ const { content, handleAction } = props;
+
+ if (!content?.text) {
+ return null;
+ }
+
+ return (
+ <h2 className="cta-paragraph">
+ <Localized text={content.text}>
+ {content.text.string_name && typeof handleAction === "function" ? (
+ <span
+ data-l10n-id={content.text.string_id}
+ onClick={handleAction}
+ onKeyUp={event =>
+ ["Enter", " "].includes(event.key) ? handleAction(event) : null
+ }
+ value="cta_paragraph"
+ role="button"
+ tabIndex="0"
+ >
+ {" "}
+ {/* <a> is valid here because of click and keyup handling. */}
+ {/* <button> cannot be used due to fluent integration. <a> content is provided by fluent */}
+ {/* eslint-disable jsx-a11y/anchor-is-valid */}
+ <a
+ role="button"
+ tabIndex="0"
+ data-l10n-name={content.text.string_name}
+ >
+ {" "}
+ </a>
+ </span>
+ ) : null}
+ </Localized>
+ </h2>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/EmbeddedMigrationWizard.jsx b/browser/components/aboutwelcome/content-src/components/EmbeddedMigrationWizard.jsx
new file mode 100644
index 0000000000..2fff85abd9
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/EmbeddedMigrationWizard.jsx
@@ -0,0 +1,40 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useEffect, useRef } from "react";
+
+export const EmbeddedMigrationWizard = ({ handleAction }) => {
+ const ref = useRef();
+ useEffect(() => {
+ const handleBeginMigration = () => {
+ handleAction({
+ currentTarget: { value: "migrate_start" },
+ source: "primary_button",
+ });
+ };
+ const handleClose = () => {
+ handleAction({ currentTarget: { value: "migrate_close" } });
+ };
+ const { current } = ref;
+ current?.addEventListener(
+ "MigrationWizard:BeginMigration",
+ handleBeginMigration
+ );
+ current?.addEventListener("MigrationWizard:Close", handleClose);
+ return () => {
+ current?.removeEventListener(
+ "MigrationWizard:BeginMigration",
+ handleBeginMigration
+ );
+ current?.removeEventListener("MigrationWizard:Close", handleClose);
+ };
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+ return (
+ <migration-wizard
+ force-show-import-all="false"
+ auto-request-state=""
+ ref={ref}
+ ></migration-wizard>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/HelpText.jsx b/browser/components/aboutwelcome/content-src/components/HelpText.jsx
new file mode 100644
index 0000000000..f7cb91df24
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/HelpText.jsx
@@ -0,0 +1,54 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import { Localized } from "./MSLocalized";
+import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
+const MS_STRING_PROP = "string_id";
+
+export const HelpText = props => {
+ if (!props.text) {
+ return null;
+ }
+
+ if (props.hasImg) {
+ if (typeof props.text === "object" && props.text[MS_STRING_PROP]) {
+ return (
+ <Localized text={props.text}>
+ <p className={`helptext ${props.position}`}>
+ <img
+ data-l10n-name="help-img"
+ className={`helptext-img ${props.position}`}
+ src={props.hasImg.src}
+ loading={AboutWelcomeUtils.getLoadingStrategyFor(
+ props.hasImg.src
+ )}
+ alt=""
+ ></img>
+ </p>
+ </Localized>
+ );
+ } else if (typeof props.text === "string") {
+ // Add the img at the end of the props.text
+ return (
+ <p className={`helptext ${props.position}`}>
+ {props.text}
+ <img
+ className={`helptext-img ${props.position} end`}
+ src={props.hasImg.src}
+ loading={AboutWelcomeUtils.getLoadingStrategyFor(props.hasImg.src)}
+ alt=""
+ />
+ </p>
+ );
+ }
+ } else {
+ return (
+ <Localized text={props.text}>
+ <p className={`helptext ${props.position}`} />
+ </Localized>
+ );
+ }
+ return null;
+};
diff --git a/browser/components/aboutwelcome/content-src/components/HeroImage.jsx b/browser/components/aboutwelcome/content-src/components/HeroImage.jsx
new file mode 100644
index 0000000000..9ca89179fa
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/HeroImage.jsx
@@ -0,0 +1,26 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
+
+export const HeroImage = props => {
+ const { height, url, alt } = props;
+
+ if (!url) {
+ return null;
+ }
+
+ return (
+ <div className="hero-image">
+ <img
+ style={height ? { height } : null}
+ src={url}
+ loading={AboutWelcomeUtils.getLoadingStrategyFor(url)}
+ alt={alt || ""}
+ role={alt ? null : "presentation"}
+ />
+ </div>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/LanguageSwitcher.jsx b/browser/components/aboutwelcome/content-src/components/LanguageSwitcher.jsx
new file mode 100644
index 0000000000..b5ebc69909
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/LanguageSwitcher.jsx
@@ -0,0 +1,308 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useState, useEffect } from "react";
+import { Localized } from "./MSLocalized";
+import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
+
+/**
+ * The language switcher implements a hook that should be placed at a higher level
+ * than the actual language switcher component, as it needs to preemptively fetch
+ * and install langpacks for the user if there is a language mismatch screen.
+ */
+export function useLanguageSwitcher(
+ appAndSystemLocaleInfo,
+ screens,
+ screenIndex,
+ setScreenIndex
+) {
+ const languageMismatchScreenIndex = screens.findIndex(
+ ({ id }) => id === "AW_LANGUAGE_MISMATCH"
+ );
+ const screen = screens[languageMismatchScreenIndex];
+
+ // Ensure fluent messages have the negotiatedLanguage args set, as they are rendered
+ // before the negotiatedLanguage is known. If the arg isn't present then Firefox will
+ // crash in development mode.
+ useEffect(() => {
+ if (screen?.content?.languageSwitcher) {
+ for (const text of Object.values(screen.content.languageSwitcher)) {
+ if (text?.args && text.args.negotiatedLanguage === undefined) {
+ text.args.negotiatedLanguage = "";
+ }
+ }
+ }
+ }, [screen]);
+
+ // If there is a mismatch, then Firefox can negotiate a better langpack to offer
+ // the user.
+ const [negotiatedLanguage, setNegotiatedLanguage] = useState(null);
+ useEffect(
+ function getNegotiatedLanguage() {
+ if (!appAndSystemLocaleInfo) {
+ return;
+ }
+ if (appAndSystemLocaleInfo.matchType !== "language-mismatch") {
+ // There is no language mismatch, so there is no need to negotiate a langpack.
+ return;
+ }
+
+ (async () => {
+ const { langPack, langPackDisplayName } =
+ await window.AWNegotiateLangPackForLanguageMismatch(
+ appAndSystemLocaleInfo
+ );
+ if (langPack) {
+ setNegotiatedLanguage({
+ langPackDisplayName,
+ appDisplayName: appAndSystemLocaleInfo.displayNames.appLanguage,
+ langPack,
+ requestSystemLocales: [
+ langPack.target_locale,
+ appAndSystemLocaleInfo.appLocaleRaw,
+ ],
+ originalAppLocales: [appAndSystemLocaleInfo.appLocaleRaw],
+ });
+ } else {
+ setNegotiatedLanguage({
+ langPackDisplayName: null,
+ appDisplayName: null,
+ langPack: null,
+ requestSystemLocales: null,
+ });
+ }
+ })();
+ },
+ [appAndSystemLocaleInfo]
+ );
+
+ /**
+ * @type {
+ * "before-installation"
+ * | "installing"
+ * | "installed"
+ * | "installation-error"
+ * | "none-available"
+ * }
+ */
+ const [langPackInstallPhase, setLangPackInstallPhase] = useState(
+ "before-installation"
+ );
+ useEffect(
+ function ensureLangPackInstalled() {
+ if (!negotiatedLanguage) {
+ // There are no negotiated languages to download yet.
+ return;
+ }
+ setLangPackInstallPhase("installing");
+ window
+ .AWEnsureLangPackInstalled(negotiatedLanguage, screen?.content)
+ .then(
+ content => {
+ // Update screen content with strings that might have changed.
+ screen.content = content;
+ setLangPackInstallPhase("installed");
+ },
+ error => {
+ console.error(error);
+ setLangPackInstallPhase("installation-error");
+ }
+ );
+ },
+ [negotiatedLanguage, screen]
+ );
+
+ const [languageFilteredScreens, setLanguageFilteredScreens] =
+ useState(screens);
+ useEffect(
+ function filterScreen() {
+ // Remove the language screen if it exists (already removed for no live
+ // reload) and we either don't-need-to or can't switch.
+ if (
+ screen &&
+ (appAndSystemLocaleInfo?.matchType !== "language-mismatch" ||
+ negotiatedLanguage?.langPack === null)
+ ) {
+ if (screenIndex > languageMismatchScreenIndex) {
+ setScreenIndex(screenIndex - 1);
+ }
+ setLanguageFilteredScreens(
+ screens.filter(s => s.id !== "AW_LANGUAGE_MISMATCH")
+ );
+ } else {
+ setLanguageFilteredScreens(screens);
+ }
+ },
+ // Removing screenIndex as a dependency as it's causing infinite re-renders (1873019)
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [
+ appAndSystemLocaleInfo?.matchType,
+ languageMismatchScreenIndex,
+ negotiatedLanguage,
+ screen,
+ screens,
+ setScreenIndex,
+ ]
+ );
+
+ return {
+ negotiatedLanguage,
+ langPackInstallPhase,
+ languageFilteredScreens,
+ };
+}
+
+/**
+ * The language switcher is a separate component as it needs to perform some asynchronous
+ * network actions such as retrieving the list of langpacks available, and downloading
+ * a new langpack. On a fast connection, this won't be noticeable, but on slow or unreliable
+ * internet this may fail for a user.
+ */
+export function LanguageSwitcher(props) {
+ const {
+ content,
+ handleAction,
+ negotiatedLanguage,
+ langPackInstallPhase,
+ messageId,
+ } = props;
+
+ const [isAwaitingLangpack, setIsAwaitingLangpack] = useState(false);
+
+ // Determine the status of the langpack installation.
+ useEffect(() => {
+ if (isAwaitingLangpack && langPackInstallPhase !== "installing") {
+ window.AWSetRequestedLocales(negotiatedLanguage.requestSystemLocales);
+ requestAnimationFrame(() => {
+ handleAction(
+ // Simulate the click event.
+ { currentTarget: { value: "download_complete" } }
+ );
+ });
+ }
+ }, [
+ handleAction,
+ isAwaitingLangpack,
+ langPackInstallPhase,
+ negotiatedLanguage?.requestSystemLocales,
+ ]);
+
+ let showWaitingScreen = false;
+ let showPreloadingScreen = false;
+ let showReadyScreen = false;
+
+ if (isAwaitingLangpack && langPackInstallPhase !== "installed") {
+ showWaitingScreen = true;
+ } else if (langPackInstallPhase === "before-installation") {
+ showPreloadingScreen = true;
+ } else {
+ showReadyScreen = true;
+ }
+
+ // Use {display: "none"} rather than if statements to prevent layout thrashing with
+ // the localized text elements rendering as blank, then filling in the text.
+ return (
+ <div className="action-buttons language-switcher-container">
+ {/* Pre-loading screen */}
+ <div style={{ display: showPreloadingScreen ? "block" : "none" }}>
+ <button
+ className="primary"
+ value="primary_button"
+ disabled={true}
+ type="button"
+ >
+ <img
+ className="language-loader"
+ src="chrome://browser/skin/tabbrowser/tab-connecting.png"
+ alt=""
+ />
+ <Localized text={content.languageSwitcher.waiting} />
+ </button>
+ <div className="secondary-cta">
+ <Localized text={content.languageSwitcher.skip}>
+ <button
+ value="decline_waiting"
+ type="button"
+ className="secondary text-link arrow-icon"
+ onClick={handleAction}
+ />
+ </Localized>
+ </div>
+ </div>
+ {/* Waiting to download the language screen. */}
+ <div style={{ display: showWaitingScreen ? "block" : "none" }}>
+ <button
+ className="primary"
+ value="primary_button"
+ disabled={true}
+ type="button"
+ >
+ <img
+ className="language-loader"
+ src="chrome://browser/skin/tabbrowser/tab-connecting.png"
+ alt=""
+ />
+ <Localized text={content.languageSwitcher.downloading} />
+ </button>
+ <div className="secondary-cta">
+ <Localized text={content.languageSwitcher.cancel}>
+ <button
+ type="button"
+ className="secondary text-link"
+ onClick={() => {
+ setIsAwaitingLangpack(false);
+ handleAction({
+ currentTarget: { value: "cancel_waiting" },
+ });
+ }}
+ />
+ </Localized>
+ </div>
+ </div>
+ {/* The typical ready screen. */}
+ <div style={{ display: showReadyScreen ? "block" : "none" }}>
+ <div>
+ <button
+ className="primary"
+ value="primary_button"
+ onClick={() => {
+ AboutWelcomeUtils.sendActionTelemetry(
+ messageId,
+ "download_langpack"
+ );
+ setIsAwaitingLangpack(true);
+ }}
+ >
+ {content.languageSwitcher.switch ? (
+ <Localized text={content.languageSwitcher.switch} />
+ ) : (
+ // This is the localized name from the Intl.DisplayNames API.
+ negotiatedLanguage?.langPackDisplayName
+ )}
+ </button>
+ </div>
+ <div>
+ <button
+ type="button"
+ className="primary"
+ value="decline"
+ onClick={event => {
+ window.AWSetRequestedLocales(
+ negotiatedLanguage.originalAppLocales
+ );
+ handleAction(event);
+ }}
+ >
+ {content.languageSwitcher.continue ? (
+ <Localized text={content.languageSwitcher.continue} />
+ ) : (
+ // This is the localized name from the Intl.DisplayNames API.
+ negotiatedLanguage?.appDisplayName
+ )}
+ </button>
+ </div>
+ </div>
+ </div>
+ );
+}
diff --git a/browser/components/aboutwelcome/content-src/components/LinkParagraph.jsx b/browser/components/aboutwelcome/content-src/components/LinkParagraph.jsx
new file mode 100644
index 0000000000..14de368b2a
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/LinkParagraph.jsx
@@ -0,0 +1,59 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useCallback } from "react";
+import { Localized } from "./MSLocalized";
+
+export const LinkParagraph = props => {
+ const { text_content, handleAction } = props;
+
+ const handleParagraphAction = useCallback(
+ event => {
+ if (event.target.closest("a")) {
+ handleAction({ ...event, currentTarget: event.target });
+ }
+ },
+ [handleAction]
+ );
+
+ const onKeyPress = useCallback(
+ event => {
+ if (event.key === "Enter" && !event.repeat) {
+ handleParagraphAction(event);
+ }
+ },
+ [handleParagraphAction]
+ );
+
+ return (
+ <Localized text={text_content.text}>
+ {/* eslint-disable jsx-a11y/no-noninteractive-element-interactions */}
+ <p
+ className={
+ text_content.font_styles === "legal"
+ ? "legal-paragraph"
+ : "link-paragraph"
+ }
+ onClick={handleParagraphAction}
+ value="link_paragraph"
+ onKeyPress={onKeyPress}
+ >
+ {/* eslint-disable jsx-a11y/anchor-is-valid */}
+ {text_content.link_keys?.map(link => (
+ <a
+ key={link}
+ value={link}
+ role="link"
+ className="text-link"
+ data-l10n-name={link}
+ // must pass in tabIndex when no href is provided
+ tabIndex="0"
+ >
+ {" "}
+ </a>
+ ))}
+ </p>
+ </Localized>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/MRColorways.jsx b/browser/components/aboutwelcome/content-src/components/MRColorways.jsx
new file mode 100644
index 0000000000..758e6ddc4a
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/MRColorways.jsx
@@ -0,0 +1,200 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useState, useEffect } from "react";
+import { Localized } from "./MSLocalized";
+
+export const ColorwayDescription = props => {
+ const { colorway } = props;
+ if (!colorway) {
+ return null;
+ }
+ const { label, description } = colorway;
+ return (
+ <Localized text={description}>
+ <div
+ className="colorway-text"
+ data-l10n-args={JSON.stringify({
+ colorwayName: label,
+ })}
+ />
+ </Localized>
+ );
+};
+
+// Return colorway as "default" for default theme variations Automatic, Light, Dark,
+// Alpenglow theme and legacy colorways which is not supported in Colorway picker.
+// For themes other then default, theme names exist in
+// format colorway-variationId inside LIGHT_WEIGHT_THEMES in AboutWelcomeParent
+export function computeColorWay(themeName, systemVariations) {
+ return !themeName ||
+ themeName === "alpenglow" ||
+ systemVariations.includes(themeName)
+ ? "default"
+ : themeName.split("-")[0];
+}
+
+// Set variationIndex based off activetheme value e.g. 'light', 'expressionist-soft'
+export function computeVariationIndex(
+ themeName,
+ systemVariations,
+ variations,
+ defaultVariationIndex
+) {
+ // Check if themeName is in systemVariations, if yes choose variationIndex by themeName
+ let index = systemVariations.findIndex(theme => theme === themeName);
+ if (index >= 0) {
+ return index;
+ }
+
+ // If themeName is one of the colorways, select variation index from colorways
+ let variation = themeName?.split("-")[1];
+ index = variations.findIndex(element => element === variation);
+ if (index >= 0) {
+ return index;
+ }
+ return defaultVariationIndex;
+}
+
+export function Colorways(props) {
+ let {
+ colorways,
+ darkVariation,
+ defaultVariationIndex,
+ systemVariations,
+ variations,
+ } = props.content.tiles;
+ let hasReverted = false;
+
+ // Active theme id from JSON e.g. "expressionist"
+ const activeId = computeColorWay(props.activeTheme, systemVariations);
+ const [colorwayId, setState] = useState(activeId);
+ const [variationIndex, setVariationIndex] = useState(defaultVariationIndex);
+
+ function revertToDefaultTheme() {
+ if (hasReverted) {
+ return;
+ }
+
+ // Spoofing an event with current target value of "navigate_away"
+ // helps the handleAction method to read the colorways theme as "revert"
+ // which causes the initial theme to be activated.
+ // The "navigate_away" action is set in content in the colorways screen JSON config.
+ // Any value in the JSON for theme will work, provided it is not `<event>`.
+ const event = {
+ currentTarget: {
+ value: "navigate_away",
+ },
+ };
+ props.handleAction(event);
+ hasReverted = true;
+ }
+
+ // Revert to default theme if the user navigates away from the page or spotlight modal
+ // before clicking on the primary button to officially set theme.
+ useEffect(() => {
+ addEventListener("beforeunload", revertToDefaultTheme);
+ addEventListener("pagehide", revertToDefaultTheme);
+
+ return () => {
+ removeEventListener("beforeunload", revertToDefaultTheme);
+ removeEventListener("pagehide", revertToDefaultTheme);
+ };
+ });
+ // Update state any time activeTheme changes.
+ useEffect(() => {
+ setState(computeColorWay(props.activeTheme, systemVariations));
+ setVariationIndex(
+ computeVariationIndex(
+ props.activeTheme,
+ systemVariations,
+ variations,
+ defaultVariationIndex
+ )
+ );
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [props.activeTheme]);
+
+ //select a random colorway
+ useEffect(() => {
+ //We don't want the default theme to be selected
+ const randomIndex = Math.floor(Math.random() * (colorways.length - 1)) + 1;
+ const randomColorwayId = colorways[randomIndex].id;
+
+ // Change the variation to be the dark variation if configured and dark.
+ // Additional colorway changes will remain dark while system is unchanged.
+ if (
+ darkVariation !== undefined &&
+ window.matchMedia("(prefers-color-scheme: dark)").matches
+ ) {
+ variations[variationIndex] = variations[darkVariation];
+ }
+ const value = `${randomColorwayId}-${variations[variationIndex]}`;
+ props.handleAction({ currentTarget: { value } });
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, []);
+
+ return (
+ <div className="tiles-theme-container">
+ <div>
+ <fieldset className="tiles-theme-section">
+ <Localized text={props.content.subtitle}>
+ <legend className="sr-only" />
+ </Localized>
+ {colorways.map(({ id, label, tooltip }) => (
+ <Localized
+ key={id + label}
+ text={typeof tooltip === "object" ? tooltip : {}}
+ >
+ <label
+ className="theme"
+ title={label}
+ data-l10n-args={JSON.stringify({
+ colorwayName: label,
+ })}
+ >
+ <Localized text={typeof tooltip === "object" ? tooltip : {}}>
+ <span
+ className="sr-only colorway label"
+ id={`${id}-label`}
+ data-l10n-args={JSON.stringify({
+ colorwayName: tooltip,
+ })}
+ />
+ </Localized>
+ <Localized text={typeof label === "object" ? label : {}}>
+ <input
+ type="radio"
+ data-colorway={id}
+ name="theme"
+ value={
+ id === "default"
+ ? systemVariations[variationIndex]
+ : `${id}-${variations[variationIndex]}`
+ }
+ checked={colorwayId === id}
+ className="sr-only input"
+ onClick={props.handleAction}
+ data-l10n-args={JSON.stringify({
+ colorwayName: label,
+ })}
+ aria-labelledby={`${id}-label`}
+ />
+ </Localized>
+ <div
+ className={`icon colorway ${
+ colorwayId === id ? "selected" : ""
+ } ${id}`}
+ />
+ </label>
+ </Localized>
+ ))}
+ </fieldset>
+ </div>
+ <ColorwayDescription
+ colorway={colorways.find(colorway => colorway.id === activeId)}
+ />
+ </div>
+ );
+}
diff --git a/browser/components/aboutwelcome/content-src/components/MSLocalized.jsx b/browser/components/aboutwelcome/content-src/components/MSLocalized.jsx
new file mode 100644
index 0000000000..42fb071475
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/MSLocalized.jsx
@@ -0,0 +1,114 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useEffect } from "react";
+export const CONFIGURABLE_STYLES = [
+ "color",
+ "fontSize",
+ "fontWeight",
+ "letterSpacing",
+ "lineHeight",
+ "marginBlock",
+ "marginInline",
+ "paddingBlock",
+ "paddingInline",
+ "whiteSpace",
+];
+const ZAP_SIZE_THRESHOLD = 160;
+
+/**
+ * Based on the .text prop, localizes an inner element if a string_id
+ * is provided, OR renders plain text, OR hides it if nothing is provided.
+ * Allows configuring of some styles including zap underline and color.
+ *
+ * Examples:
+ *
+ * Localized text
+ * ftl:
+ * title = Welcome
+ * jsx:
+ * <Localized text={{string_id: "title"}}><h1 /></Localized>
+ * output:
+ * <h1 data-l10n-id="title">Welcome</h1>
+ *
+ * Unlocalized text
+ * jsx:
+ * <Localized text="Welcome"><h1 /></Localized>
+ * <Localized text={{raw: "Welcome"}}><h1 /></Localized>
+ * output:
+ * <h1>Welcome</h1>
+ */
+
+export const Localized = ({ text, children }) => {
+ // Dynamically determine the size of the zap style.
+ const zapRef = React.createRef();
+ useEffect(() => {
+ const { current } = zapRef;
+ if (current) {
+ requestAnimationFrame(() =>
+ current?.classList.replace(
+ "short",
+ current.getBoundingClientRect().width > ZAP_SIZE_THRESHOLD
+ ? "long"
+ : "short"
+ )
+ );
+ }
+ });
+
+ // Skip rendering of children with no text.
+ if (!text) {
+ return null;
+ }
+
+ // Allow augmenting existing child container properties.
+ const props = { children: [], className: "", style: {}, ...children?.props };
+ // Support nested Localized by starting with their children.
+ const textNodes = Array.isArray(props.children)
+ ? props.children
+ : [props.children];
+
+ // Pick desired fluent or raw/plain text to render.
+ if (text.string_id) {
+ // Set the key so React knows not to reuse when switching to plain text.
+ props.key = text.string_id;
+ props["data-l10n-id"] = text.string_id;
+ if (text.args) {
+ props["data-l10n-args"] = JSON.stringify(text.args);
+ }
+ } else if (text.raw) {
+ textNodes.push(text.raw);
+ } else if (typeof text === "string") {
+ textNodes.push(text);
+ }
+
+ // Add zap style and content in a way that allows fluent to insert too.
+ if (text.zap) {
+ props.className += " welcomeZap";
+ textNodes.push(
+ <span className="short zap" data-l10n-name="zap" ref={zapRef}>
+ {text.zap}
+ </span>
+ );
+ }
+
+ if (text.aria_label) {
+ props["aria-label"] = text.aria_label;
+ }
+
+ // Apply certain configurable styles.
+ CONFIGURABLE_STYLES.forEach(style => {
+ if (text[style] !== undefined) {
+ props.style[style] = text[style];
+ }
+ });
+
+ return React.cloneElement(
+ // Provide a default container for the text if necessary.
+ children ?? <span />,
+ props,
+ // Conditionally pass in as void elements can't accept empty array.
+ textNodes.length ? textNodes : null
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/MobileDownloads.jsx b/browser/components/aboutwelcome/content-src/components/MobileDownloads.jsx
new file mode 100644
index 0000000000..fbd0940805
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/MobileDownloads.jsx
@@ -0,0 +1,73 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import { Localized } from "./MSLocalized";
+import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
+
+export const MarketplaceButtons = props => {
+ return (
+ <ul className="mobile-download-buttons">
+ {props.buttons.includes("ios") ? (
+ <li className="ios">
+ <button
+ data-l10n-id={"spotlight-ios-marketplace-button"}
+ value="ios"
+ onClick={props.handleAction}
+ ></button>
+ </li>
+ ) : null}
+ {props.buttons.includes("android") ? (
+ <li className="android">
+ <button
+ data-l10n-id={"spotlight-android-marketplace-button"}
+ value="android"
+ onClick={props.handleAction}
+ ></button>
+ </li>
+ ) : null}
+ </ul>
+ );
+};
+
+export const MobileDownloads = props => {
+ const { QR_code: QRCode } = props.data;
+ const showEmailLink =
+ props.data.email && window.AWSendToDeviceEmailsSupported();
+
+ return (
+ <div className="mobile-downloads">
+ {/* Avoid use of Localized element to set alt text here as a plain string value
+ results in a React error due to "dangerouslySetInnerHTML" */}
+ {QRCode ? (
+ <img
+ data-l10n-id={
+ QRCode.alt_text.string_id ? QRCode.alt_text.string_id : null
+ }
+ className="qr-code-image"
+ alt={typeof QRCode.alt_text === "string" ? QRCode.alt_text : ""}
+ src={QRCode.image_url}
+ loading={AboutWelcomeUtils.getLoadingStrategyFor(QRCode.image_url)}
+ />
+ ) : null}
+ {showEmailLink ? (
+ <div>
+ <Localized text={props.data.email.link_text}>
+ <button
+ className="email-link"
+ value="email_link"
+ onClick={props.handleAction}
+ />
+ </Localized>
+ </div>
+ ) : null}
+ {props.data.marketplace_buttons ? (
+ <MarketplaceButtons
+ buttons={props.data.marketplace_buttons}
+ handleAction={props.handleAction}
+ />
+ ) : null}
+ </div>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/MultiSelect.jsx b/browser/components/aboutwelcome/content-src/components/MultiSelect.jsx
new file mode 100644
index 0000000000..f65665a7b2
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/MultiSelect.jsx
@@ -0,0 +1,158 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useEffect, useCallback, useMemo, useRef } from "react";
+import { Localized, CONFIGURABLE_STYLES } from "./MSLocalized";
+
+const MULTI_SELECT_STYLES = [
+ ...CONFIGURABLE_STYLES,
+ "flexDirection",
+ "flexWrap",
+ "flexFlow",
+ "flexGrow",
+ "flexShrink",
+ "justifyContent",
+ "alignItems",
+ "gap",
+];
+
+const MULTI_SELECT_ICON_STYLES = [
+ ...CONFIGURABLE_STYLES,
+ "width",
+ "height",
+ "background",
+ "backgroundColor",
+ "backgroundImage",
+ "backgroundSize",
+ "backgroundPosition",
+ "backgroundRepeat",
+ "backgroundOrigin",
+ "backgroundClip",
+ "border",
+ "borderRadius",
+ "appearance",
+ "fill",
+ "stroke",
+ "outline",
+ "outlineOffset",
+ "boxShadow",
+];
+
+function getValidStyle(style, validStyles, allowVars) {
+ if (!style) {
+ return null;
+ }
+ return Object.keys(style)
+ .filter(
+ key => validStyles.includes(key) || (allowVars && key.startsWith("--"))
+ )
+ .reduce((obj, key) => {
+ obj[key] = style[key];
+ return obj;
+ }, {});
+}
+
+export const MultiSelect = ({
+ content,
+ screenMultiSelects,
+ setScreenMultiSelects,
+ activeMultiSelect,
+ setActiveMultiSelect,
+}) => {
+ const { data } = content.tiles;
+
+ const refs = useRef({});
+
+ const handleChange = useCallback(() => {
+ const newActiveMultiSelect = [];
+ Object.keys(refs.current).forEach(key => {
+ if (refs.current[key]?.checked) {
+ newActiveMultiSelect.push(key);
+ }
+ });
+ setActiveMultiSelect(newActiveMultiSelect);
+ }, [setActiveMultiSelect]);
+
+ const items = useMemo(
+ () => {
+ function getOrderedIds() {
+ if (screenMultiSelects) {
+ return screenMultiSelects;
+ }
+ let orderedIds = data
+ .map(item => ({
+ id: item.id,
+ rank: item.randomize ? Math.random() : NaN,
+ }))
+ .sort((a, b) => b.rank - a.rank)
+ .map(({ id }) => id);
+ setScreenMultiSelects(orderedIds);
+ return orderedIds;
+ }
+ return getOrderedIds().map(id => data.find(item => item.id === id));
+ },
+ [] // eslint-disable-line react-hooks/exhaustive-deps
+ );
+
+ const containerStyle = useMemo(
+ () => getValidStyle(content.tiles.style, MULTI_SELECT_STYLES, true),
+ [content.tiles.style]
+ );
+
+ // When screen renders for first time, update state
+ // with checkbox ids that has defaultvalue true
+ useEffect(() => {
+ if (!activeMultiSelect) {
+ let newActiveMultiSelect = [];
+ items.forEach(({ id, defaultValue }) => {
+ if (defaultValue && id) {
+ newActiveMultiSelect.push(id);
+ }
+ });
+ setActiveMultiSelect(newActiveMultiSelect);
+ }
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+
+ return (
+ <div
+ className="multi-select-container"
+ style={containerStyle}
+ role={
+ items.some(({ type, group }) => type === "radio" && group)
+ ? "radiogroup"
+ : "group"
+ }
+ aria-labelledby="multi-stage-multi-select-label"
+ >
+ {content.tiles.label ? (
+ <Localized text={content.tiles.label}>
+ <h2 id="multi-stage-multi-select-label" />
+ </Localized>
+ ) : null}
+ {items.map(({ id, label, icon, type = "checkbox", group, style }) => (
+ <div
+ key={id + label}
+ className="checkbox-container multi-select-item"
+ style={getValidStyle(style, MULTI_SELECT_STYLES)}
+ >
+ <input
+ type={type} // checkbox or radio
+ id={id}
+ value={id}
+ name={group}
+ checked={activeMultiSelect?.includes(id)}
+ style={getValidStyle(icon?.style, MULTI_SELECT_ICON_STYLES)}
+ onChange={handleChange}
+ ref={el => (refs.current[id] = el)}
+ />
+ {label ? (
+ <Localized text={label}>
+ <label htmlFor={id}></label>
+ </Localized>
+ ) : null}
+ </div>
+ ))}
+ </div>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/MultiStageAboutWelcome.jsx b/browser/components/aboutwelcome/content-src/components/MultiStageAboutWelcome.jsx
new file mode 100644
index 0000000000..034055bf3d
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/MultiStageAboutWelcome.jsx
@@ -0,0 +1,568 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useState, useEffect, useRef } from "react";
+import { Localized } from "./MSLocalized";
+import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
+import { MultiStageProtonScreen } from "./MultiStageProtonScreen";
+import { useLanguageSwitcher } from "./LanguageSwitcher";
+import { SubmenuButton } from "./SubmenuButton";
+import { BASE_PARAMS, addUtmParams } from "../lib/addUtmParams.mjs";
+
+// Amount of milliseconds for all transitions to complete (including delays).
+const TRANSITION_OUT_TIME = 1000;
+const LANGUAGE_MISMATCH_SCREEN_ID = "AW_LANGUAGE_MISMATCH";
+
+export const MultiStageAboutWelcome = props => {
+ let { defaultScreens } = props;
+ const didFilter = useRef(false);
+ const [didMount, setDidMount] = useState(false);
+ const [screens, setScreens] = useState(defaultScreens);
+
+ const [index, setScreenIndex] = useState(props.startScreen);
+ const [previousOrder, setPreviousOrder] = useState(props.startScreen - 1);
+
+ useEffect(() => {
+ (async () => {
+ // If we want to load index from history state, we don't want to send impression yet
+ if (!didMount) {
+ return;
+ }
+ // On about:welcome first load, screensVisited should be empty
+ let screensVisited = didFilter.current ? screens.slice(0, index) : [];
+ let upcomingScreens = defaultScreens
+ .filter(s => !screensVisited.find(v => v.id === s.id))
+ // Filter out Language Mismatch screen from upcoming
+ // screens if screens set from useLanguageSwitcher hook
+ // has filtered language screen
+ .filter(
+ upcomingScreen =>
+ !(
+ !screens.find(s => s.id === LANGUAGE_MISMATCH_SCREEN_ID) &&
+ upcomingScreen.id === LANGUAGE_MISMATCH_SCREEN_ID
+ )
+ );
+
+ let filteredScreens = screensVisited.concat(
+ (await window.AWEvaluateScreenTargeting(upcomingScreens)) ??
+ upcomingScreens
+ );
+
+ // Use existing screen for the filtered screen to carry over any modification
+ // e.g. if AW_LANGUAGE_MISMATCH exists, use it from existing screens
+ setScreens(
+ filteredScreens.map(
+ filtered => screens.find(s => s.id === filtered.id) ?? filtered
+ )
+ );
+
+ didFilter.current = true;
+
+ const screenInitials = filteredScreens
+ .map(({ id }) => id?.split("_")[1]?.[0])
+ .join("");
+ // Send impression ping when respective screen first renders
+ filteredScreens.forEach((screen, order) => {
+ if (index === order) {
+ const messageId = `${props.message_id}_${order}_${screen.id}_${screenInitials}`;
+
+ AboutWelcomeUtils.sendImpressionTelemetry(messageId, {
+ screen_family: props.message_id,
+ screen_index: order,
+ screen_id: screen.id,
+ screen_initials: screenInitials,
+ });
+
+ window.AWAddScreenImpression?.(screen);
+ }
+ });
+
+ // Remember that a new screen has loaded for browser navigation
+ if (props.updateHistory && index > window.history.state) {
+ window.history.pushState(index, "");
+ }
+
+ // Remember the previous screen index so we can animate the transition
+ setPreviousOrder(index);
+ })();
+ }, [index, didMount]); // eslint-disable-line react-hooks/exhaustive-deps
+
+ const [flowParams, setFlowParams] = useState(null);
+ const { metricsFlowUri } = props;
+ useEffect(() => {
+ (async () => {
+ if (metricsFlowUri) {
+ setFlowParams(await AboutWelcomeUtils.fetchFlowParams(metricsFlowUri));
+ }
+ })();
+ }, [metricsFlowUri]);
+
+ // Allow "in" style to render to actually transition towards regular state,
+ // which also makes using browser back/forward navigation skip transitions.
+ const [transition, setTransition] = useState(props.transitions ? "in" : "");
+ useEffect(() => {
+ if (transition === "in") {
+ requestAnimationFrame(() =>
+ requestAnimationFrame(() => setTransition(""))
+ );
+ }
+ }, [transition]);
+
+ // Transition to next screen, opening about:home on last screen button CTA
+ const handleTransition = () => {
+ // Only handle transitioning out from a screen once.
+ if (transition === "out") {
+ return;
+ }
+
+ // Start transitioning things "out" immediately when moving forwards.
+ setTransition(props.transitions ? "out" : "");
+
+ // Actually move forwards after all transitions finish.
+ setTimeout(
+ () => {
+ if (index < screens.length - 1) {
+ setTransition(props.transitions ? "in" : "");
+ setScreenIndex(prevState => prevState + 1);
+ } else {
+ window.AWFinish();
+ }
+ },
+ props.transitions ? TRANSITION_OUT_TIME : 0
+ );
+ };
+
+ useEffect(() => {
+ // When about:welcome loads (on refresh or pressing back button
+ // from about:home), ensure history state usEffect runs before
+ // useEffect hook that send impression telemetry
+ setDidMount(true);
+
+ if (props.updateHistory) {
+ // Switch to the screen tracked in state (null for initial state)
+ // or last screen index if a user navigates by pressing back
+ // button from about:home
+ const handler = ({ state }) => {
+ if (transition === "out") {
+ return;
+ }
+ setTransition(props.transitions ? "out" : "");
+ setTimeout(
+ () => {
+ setTransition(props.transitions ? "in" : "");
+ setScreenIndex(Math.min(state, screens.length - 1));
+ },
+ props.transitions ? TRANSITION_OUT_TIME : 0
+ );
+ };
+
+ // Handle page load, e.g., going back to about:welcome from about:home
+ const { state } = window.history;
+ if (state) {
+ setScreenIndex(Math.min(state, screens.length - 1));
+ setPreviousOrder(Math.min(state, screens.length - 1));
+ }
+
+ // Watch for browser back/forward button navigation events
+ window.addEventListener("popstate", handler);
+ return () => window.removeEventListener("popstate", handler);
+ }
+ return false;
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+
+ const [multiSelects, setMultiSelects] = useState({});
+
+ // Save the active multi select state for each screen as an object keyed by
+ // screen id. Each screen id has an array containing checkbox ids used in
+ // handleAction to update MULTI_ACTION data. This allows us to remember the
+ // state of each screen's multi select checkboxes when navigating back and
+ // forth between screens, while also allowing a message to have more than one
+ // multi select screen.
+ const [activeMultiSelects, setActiveMultiSelects] = useState({});
+
+ // Get the active theme so the rendering code can make it selected
+ // by default.
+ const [activeTheme, setActiveTheme] = useState(null);
+ const [initialTheme, setInitialTheme] = useState(null);
+ useEffect(() => {
+ (async () => {
+ let theme = await window.AWGetSelectedTheme();
+ setInitialTheme(theme);
+ setActiveTheme(theme);
+ })();
+ }, []);
+
+ const { negotiatedLanguage, langPackInstallPhase, languageFilteredScreens } =
+ useLanguageSwitcher(
+ props.appAndSystemLocaleInfo,
+ screens,
+ index,
+ setScreenIndex
+ );
+
+ useEffect(() => {
+ setScreens(languageFilteredScreens);
+ }, [languageFilteredScreens]);
+
+ return (
+ <React.Fragment>
+ <div
+ className={`outer-wrapper onboardingContainer proton transition-${transition}`}
+ style={props.backdrop ? { background: props.backdrop } : {}}
+ >
+ {screens.map((screen, order) => {
+ const isFirstScreen = screen === screens[0];
+ const isLastScreen = screen === screens[screens.length - 1];
+ const totalNumberOfScreens = screens.length;
+ const isSingleScreen = totalNumberOfScreens === 1;
+
+ const setActiveMultiSelect = valueOrFn =>
+ setActiveMultiSelects(prevState => ({
+ ...prevState,
+ [screen.id]:
+ typeof valueOrFn === "function"
+ ? valueOrFn(prevState[screen.id])
+ : valueOrFn,
+ }));
+ const setScreenMultiSelects = valueOrFn =>
+ setMultiSelects(prevState => ({
+ ...prevState,
+ [screen.id]:
+ typeof valueOrFn === "function"
+ ? valueOrFn(prevState[screen.id])
+ : valueOrFn,
+ }));
+
+ return index === order ? (
+ <WelcomeScreen
+ key={screen.id + order}
+ id={screen.id}
+ totalNumberOfScreens={totalNumberOfScreens}
+ isFirstScreen={isFirstScreen}
+ isLastScreen={isLastScreen}
+ isSingleScreen={isSingleScreen}
+ order={order}
+ previousOrder={previousOrder}
+ content={screen.content}
+ navigate={handleTransition}
+ messageId={`${props.message_id}_${order}_${screen.id}`}
+ UTMTerm={props.utm_term}
+ flowParams={flowParams}
+ activeTheme={activeTheme}
+ initialTheme={initialTheme}
+ setActiveTheme={setActiveTheme}
+ setInitialTheme={setInitialTheme}
+ screenMultiSelects={multiSelects[screen.id]}
+ setScreenMultiSelects={setScreenMultiSelects}
+ activeMultiSelect={activeMultiSelects[screen.id]}
+ setActiveMultiSelect={setActiveMultiSelect}
+ autoAdvance={screen.auto_advance}
+ negotiatedLanguage={negotiatedLanguage}
+ langPackInstallPhase={langPackInstallPhase}
+ forceHideStepsIndicator={screen.force_hide_steps_indicator}
+ ariaRole={props.ariaRole}
+ aboveButtonStepsIndicator={screen.above_button_steps_indicator}
+ />
+ ) : null;
+ })}
+ </div>
+ </React.Fragment>
+ );
+};
+
+export const SecondaryCTA = props => {
+ const targetElement = props.position
+ ? `secondary_button_${props.position}`
+ : `secondary_button`;
+ let buttonStyling = props.content.secondary_button?.has_arrow_icon
+ ? `secondary arrow-icon`
+ : `secondary`;
+ const isPrimary = props.content.secondary_button?.style === "primary";
+ const isTextLink =
+ !["split", "callout"].includes(props.content.position) &&
+ props.content.tiles?.type !== "addons-picker" &&
+ !isPrimary;
+ const isSplitButton =
+ props.content.submenu_button?.attached_to === targetElement;
+ let className = "secondary-cta";
+ if (props.position) {
+ className += ` ${props.position}`;
+ }
+ if (isSplitButton) {
+ className += " split-button-container";
+ }
+ const isDisabled = React.useCallback(
+ disabledValue =>
+ disabledValue === "hasActiveMultiSelect"
+ ? !(props.activeMultiSelect?.length > 0)
+ : disabledValue,
+ [props.activeMultiSelect?.length]
+ );
+
+ if (isTextLink) {
+ buttonStyling += " text-link";
+ }
+
+ if (isPrimary) {
+ buttonStyling = props.content.secondary_button?.has_arrow_icon
+ ? `primary arrow-icon`
+ : `primary`;
+ }
+
+ return (
+ <div className={className}>
+ <Localized text={props.content[targetElement].text}>
+ <span />
+ </Localized>
+ <Localized text={props.content[targetElement].label}>
+ <button
+ className={buttonStyling}
+ value={targetElement}
+ disabled={isDisabled(props.content.secondary_button?.disabled)}
+ onClick={props.handleAction}
+ />
+ </Localized>
+ {isSplitButton ? (
+ <SubmenuButton
+ content={props.content}
+ handleAction={props.handleAction}
+ />
+ ) : null}
+ </div>
+ );
+};
+
+export const StepsIndicator = props => {
+ let steps = [];
+ for (let i = 0; i < props.totalNumberOfScreens; i++) {
+ let className = `${i === props.order ? "current" : ""} ${
+ i < props.order ? "complete" : ""
+ }`;
+ steps.push(
+ <div key={i} className={`indicator ${className}`} role="presentation" />
+ );
+ }
+ return steps;
+};
+
+export const ProgressBar = ({ step, previousStep, totalNumberOfScreens }) => {
+ const [progress, setProgress] = React.useState(
+ previousStep / totalNumberOfScreens
+ );
+ useEffect(() => {
+ // We don't need to hook any dependencies because any time the step changes,
+ // the screen's entire DOM tree will be re-rendered.
+ setProgress(step / totalNumberOfScreens);
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+ return (
+ <div
+ className="indicator"
+ role="presentation"
+ style={{ "--progress-bar-progress": `${progress * 100}%` }}
+ />
+ );
+};
+
+export class WelcomeScreen extends React.PureComponent {
+ constructor(props) {
+ super(props);
+ this.handleAction = this.handleAction.bind(this);
+ }
+
+ handleOpenURL(action, flowParams, UTMTerm) {
+ let { type, data } = action;
+ if (type === "SHOW_FIREFOX_ACCOUNTS") {
+ let params = {
+ ...BASE_PARAMS,
+ utm_term: `${UTMTerm}-screen`,
+ };
+ if (action.addFlowParams && flowParams) {
+ params = {
+ ...params,
+ ...flowParams,
+ };
+ }
+ data = { ...data, extraParams: params };
+ } else if (type === "OPEN_URL") {
+ let url = new URL(data.args);
+ addUtmParams(url, `${UTMTerm}-screen`);
+ if (action.addFlowParams && flowParams) {
+ url.searchParams.append("device_id", flowParams.deviceId);
+ url.searchParams.append("flow_id", flowParams.flowId);
+ url.searchParams.append("flow_begin_time", flowParams.flowBeginTime);
+ }
+ data = { ...data, args: url.toString() };
+ }
+ return AboutWelcomeUtils.handleUserAction({ type, data });
+ }
+
+ async handleAction(event) {
+ let { props } = this;
+ const value =
+ event.currentTarget.value ?? event.currentTarget.getAttribute("value");
+ const source = event.source || value;
+ let targetContent =
+ props.content[value] ||
+ props.content.tiles ||
+ props.content.languageSwitcher;
+
+ if (value === "submenu_button" && event.action) {
+ targetContent = { action: event.action };
+ }
+
+ if (!(targetContent && targetContent.action)) {
+ return;
+ }
+ // Send telemetry before waiting on actions
+ AboutWelcomeUtils.sendActionTelemetry(props.messageId, source, event.name);
+
+ // Send additional telemetry if a messaging surface like feature callout is
+ // dismissed via the dismiss button. Other causes of dismissal will be
+ // handled separately by the messaging surface's own code.
+ if (value === "dismiss_button" && !event.name) {
+ AboutWelcomeUtils.sendDismissTelemetry(props.messageId, source);
+ }
+
+ let { action } = targetContent;
+ action = JSON.parse(JSON.stringify(action));
+
+ if (action.collectSelect) {
+ this.setMultiSelectActions(action);
+ }
+
+ let actionResult;
+ if (["OPEN_URL", "SHOW_FIREFOX_ACCOUNTS"].includes(action.type)) {
+ actionResult = await this.handleOpenURL(
+ action,
+ props.flowParams,
+ props.UTMTerm
+ );
+ } else if (action.type) {
+ actionResult = await AboutWelcomeUtils.handleUserAction(action);
+ if (action.type === "FXA_SIGNIN_FLOW") {
+ AboutWelcomeUtils.sendActionTelemetry(
+ props.messageId,
+ actionResult ? "sign_in" : "sign_in_cancel",
+ "FXA_SIGNIN_FLOW"
+ );
+ }
+ // Wait until migration closes to complete the action
+ const hasMigrate = a =>
+ a.type === "SHOW_MIGRATION_WIZARD" ||
+ (a.type === "MULTI_ACTION" && a.data?.actions?.some(hasMigrate));
+ if (hasMigrate(action)) {
+ await window.AWWaitForMigrationClose();
+ AboutWelcomeUtils.sendActionTelemetry(props.messageId, "migrate_close");
+ }
+ }
+
+ // A special tiles.action.theme value indicates we should use the event's value vs provided value.
+ if (action.theme) {
+ let themeToUse =
+ action.theme === "<event>"
+ ? event.currentTarget.value
+ : this.props.initialTheme || action.theme;
+
+ this.props.setActiveTheme(themeToUse);
+ window.AWSelectTheme(themeToUse);
+ }
+
+ // If the action has persistActiveTheme: true, we set the initial theme to the currently active theme
+ // so that it can be reverted to in the event that the user navigates away from the screen
+ if (action.persistActiveTheme) {
+ this.props.setInitialTheme(this.props.activeTheme);
+ }
+
+ // `navigate` and `dismiss` can be true/false/undefined, or they can be a
+ // string "actionResult" in which case we should use the actionResult
+ // (boolean resolved by handleUserAction)
+ const shouldDoBehavior = behavior =>
+ behavior === "actionResult" ? actionResult : behavior;
+
+ if (shouldDoBehavior(action.navigate)) {
+ props.navigate();
+ }
+
+ if (shouldDoBehavior(action.dismiss)) {
+ window.AWFinish();
+ }
+ }
+
+ setMultiSelectActions(action) {
+ let { props } = this;
+ // Populate MULTI_ACTION data actions property with selected checkbox
+ // actions from tiles data
+ if (action.type !== "MULTI_ACTION") {
+ console.error(
+ "collectSelect is only supported for MULTI_ACTION type actions"
+ );
+ action.type = "MULTI_ACTION";
+ }
+ if (!Array.isArray(action.data?.actions)) {
+ console.error(
+ "collectSelect is only supported for MULTI_ACTION type actions with an array of actions"
+ );
+ action.data = { actions: [] };
+ }
+
+ // Prepend the multi-select actions to the CTA's actions array, but keep
+ // the actions in the same order they appear in. This way the CTA action
+ // can go last, after the multi-select actions are processed. For example,
+ // 1. checkbox action 1
+ // 2. checkbox action 2
+ // 3. radio action
+ // 4. CTA action (which perhaps depends on the radio action)
+ let multiSelectActions = [];
+ for (const checkbox of props.content?.tiles?.data ?? []) {
+ let checkboxAction;
+ if (props.activeMultiSelect?.includes(checkbox.id)) {
+ checkboxAction = checkbox.checkedAction ?? checkbox.action;
+ } else {
+ checkboxAction = checkbox.uncheckedAction;
+ }
+
+ if (checkboxAction) {
+ multiSelectActions.push(checkboxAction);
+ }
+ }
+ action.data.actions.unshift(...multiSelectActions);
+
+ // Send telemetry with selected checkbox ids
+ AboutWelcomeUtils.sendActionTelemetry(
+ props.messageId,
+ props.activeMultiSelect,
+ "SELECT_CHECKBOX"
+ );
+ }
+
+ render() {
+ return (
+ <MultiStageProtonScreen
+ content={this.props.content}
+ id={this.props.id}
+ order={this.props.order}
+ previousOrder={this.props.previousOrder}
+ activeTheme={this.props.activeTheme}
+ screenMultiSelects={this.props.screenMultiSelects}
+ setScreenMultiSelects={this.props.setScreenMultiSelects}
+ activeMultiSelect={this.props.activeMultiSelect}
+ setActiveMultiSelect={this.props.setActiveMultiSelect}
+ totalNumberOfScreens={this.props.totalNumberOfScreens}
+ appAndSystemLocaleInfo={this.props.appAndSystemLocaleInfo}
+ negotiatedLanguage={this.props.negotiatedLanguage}
+ langPackInstallPhase={this.props.langPackInstallPhase}
+ handleAction={this.handleAction}
+ messageId={this.props.messageId}
+ isFirstScreen={this.props.isFirstScreen}
+ isLastScreen={this.props.isLastScreen}
+ isSingleScreen={this.props.isSingleScreen}
+ startsWithCorner={this.props.startsWithCorner}
+ autoAdvance={this.props.autoAdvance}
+ forceHideStepsIndicator={this.props.forceHideStepsIndicator}
+ ariaRole={this.props.ariaRole}
+ aboveButtonStepsIndicator={this.props.aboveButtonStepsIndicator}
+ />
+ );
+ }
+}
diff --git a/browser/components/aboutwelcome/content-src/components/MultiStageProtonScreen.jsx b/browser/components/aboutwelcome/content-src/components/MultiStageProtonScreen.jsx
new file mode 100644
index 0000000000..ffe64f05f1
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/MultiStageProtonScreen.jsx
@@ -0,0 +1,620 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useEffect, useState } from "react";
+import { Localized } from "./MSLocalized";
+import { AboutWelcomeUtils } from "../lib/aboutwelcome-utils.mjs";
+import { MobileDownloads } from "./MobileDownloads";
+import { MultiSelect } from "./MultiSelect";
+import { Themes } from "./Themes";
+import {
+ SecondaryCTA,
+ StepsIndicator,
+ ProgressBar,
+} from "./MultiStageAboutWelcome";
+import { LanguageSwitcher } from "./LanguageSwitcher";
+import { CTAParagraph } from "./CTAParagraph";
+import { HeroImage } from "./HeroImage";
+import { OnboardingVideo } from "./OnboardingVideo";
+import { AdditionalCTA } from "./AdditionalCTA";
+import { EmbeddedMigrationWizard } from "./EmbeddedMigrationWizard";
+import { AddonsPicker } from "./AddonsPicker";
+import { LinkParagraph } from "./LinkParagraph";
+
+export const MultiStageProtonScreen = props => {
+ const { autoAdvance, handleAction, order } = props;
+ useEffect(() => {
+ if (autoAdvance) {
+ const timer = setTimeout(() => {
+ handleAction({
+ currentTarget: {
+ value: autoAdvance,
+ },
+ name: "AUTO_ADVANCE",
+ });
+ }, 20000);
+ return () => clearTimeout(timer);
+ }
+ return () => {};
+ }, [autoAdvance, handleAction, order]);
+
+ return (
+ <ProtonScreen
+ content={props.content}
+ id={props.id}
+ order={props.order}
+ activeTheme={props.activeTheme}
+ screenMultiSelects={props.screenMultiSelects}
+ setScreenMultiSelects={props.setScreenMultiSelects}
+ activeMultiSelect={props.activeMultiSelect}
+ setActiveMultiSelect={props.setActiveMultiSelect}
+ totalNumberOfScreens={props.totalNumberOfScreens}
+ handleAction={props.handleAction}
+ isFirstScreen={props.isFirstScreen}
+ isLastScreen={props.isLastScreen}
+ isSingleScreen={props.isSingleScreen}
+ previousOrder={props.previousOrder}
+ autoAdvance={props.autoAdvance}
+ isRtamo={props.isRtamo}
+ addonName={props.addonName}
+ isTheme={props.isTheme}
+ iconURL={props.iconURL}
+ messageId={props.messageId}
+ negotiatedLanguage={props.negotiatedLanguage}
+ langPackInstallPhase={props.langPackInstallPhase}
+ forceHideStepsIndicator={props.forceHideStepsIndicator}
+ ariaRole={props.ariaRole}
+ aboveButtonStepsIndicator={props.aboveButtonStepsIndicator}
+ />
+ );
+};
+
+export const ProtonScreenActionButtons = props => {
+ const { content, addonName, activeMultiSelect } = props;
+ const defaultValue = content.checkbox?.defaultValue;
+
+ const [isChecked, setIsChecked] = useState(defaultValue || false);
+ const buttonRef = React.useRef(null);
+
+ const shouldFocusButton = content?.primary_button?.should_focus_button;
+
+ useEffect(() => {
+ if (shouldFocusButton) {
+ buttonRef.current?.focus();
+ }
+ }, [shouldFocusButton]);
+
+ if (
+ !content.primary_button &&
+ !content.secondary_button &&
+ !content.additional_button
+ ) {
+ return null;
+ }
+
+ // If we have a multi-select screen, we want to disable the primary button
+ // until the user has selected at least one item.
+ const isPrimaryDisabled = primaryDisabledValue =>
+ primaryDisabledValue === "hasActiveMultiSelect"
+ ? !(activeMultiSelect?.length > 0)
+ : primaryDisabledValue;
+
+ return (
+ <div
+ className={`action-buttons ${
+ content.additional_button ? "additional-cta-container" : ""
+ }`}
+ flow={content.additional_button?.flow}
+ alignment={content.additional_button?.alignment}
+ >
+ <Localized text={content.primary_button?.label}>
+ <button
+ ref={buttonRef}
+ className={`${content.primary_button?.style ?? "primary"}${
+ content.primary_button?.has_arrow_icon ? " arrow-icon" : ""
+ }`}
+ // Whether or not the checkbox is checked determines which action
+ // should be handled. By setting value here, we indicate to
+ // this.handleAction() where in the content tree it should take
+ // the action to execute from.
+ value={isChecked ? "checkbox" : "primary_button"}
+ disabled={isPrimaryDisabled(content.primary_button?.disabled)}
+ onClick={props.handleAction}
+ data-l10n-args={
+ addonName
+ ? JSON.stringify({
+ "addon-name": addonName,
+ })
+ : ""
+ }
+ />
+ </Localized>
+ {content.additional_button ? (
+ <AdditionalCTA content={content} handleAction={props.handleAction} />
+ ) : null}
+ {content.checkbox ? (
+ <div className="checkbox-container">
+ <input
+ type="checkbox"
+ id="action-checkbox"
+ checked={isChecked}
+ onChange={() => {
+ setIsChecked(!isChecked);
+ }}
+ ></input>
+ <Localized text={content.checkbox.label}>
+ <label htmlFor="action-checkbox"></label>
+ </Localized>
+ </div>
+ ) : null}
+ {content.secondary_button ? (
+ <SecondaryCTA
+ content={content}
+ handleAction={props.handleAction}
+ activeMultiSelect={activeMultiSelect}
+ />
+ ) : null}
+ </div>
+ );
+};
+
+export class ProtonScreen extends React.PureComponent {
+ componentDidMount() {
+ this.mainContentHeader.focus();
+ }
+
+ getScreenClassName(
+ isFirstScreen,
+ isLastScreen,
+ includeNoodles,
+ isVideoOnboarding,
+ isAddonsPicker
+ ) {
+ const screenClass = `screen-${this.props.order % 2 !== 0 ? 1 : 2}`;
+
+ if (isVideoOnboarding) {
+ return "with-video";
+ }
+
+ if (isAddonsPicker) {
+ return "addons-picker";
+ }
+
+ return `${isFirstScreen ? `dialog-initial` : ``} ${
+ isLastScreen ? `dialog-last` : ``
+ } ${includeNoodles ? `with-noodles` : ``} ${screenClass}`;
+ }
+
+ renderTitle({ title, title_logo }) {
+ if (title_logo) {
+ const { alignment, ...rest } = title_logo;
+ return (
+ <div
+ className="inline-icon-container"
+ alignment={alignment ?? "center"}
+ >
+ {this.renderPicture({ ...rest })}
+ <Localized text={title}>
+ <h1 id="mainContentHeader" />
+ </Localized>
+ </div>
+ );
+ }
+ return (
+ <Localized text={title}>
+ <h1 id="mainContentHeader" />
+ </Localized>
+ );
+ }
+
+ renderPicture({
+ imageURL = "chrome://branding/content/about-logo.svg",
+ darkModeImageURL,
+ reducedMotionImageURL,
+ darkModeReducedMotionImageURL,
+ alt = "",
+ width,
+ height,
+ marginBlock,
+ marginInline,
+ className = "logo-container",
+ }) {
+ function getLoadingStrategy() {
+ for (let url of [
+ imageURL,
+ darkModeImageURL,
+ reducedMotionImageURL,
+ darkModeReducedMotionImageURL,
+ ]) {
+ if (AboutWelcomeUtils.getLoadingStrategyFor(url) === "lazy") {
+ return "lazy";
+ }
+ }
+ return "eager";
+ }
+
+ return (
+ <picture className={className} style={{ marginInline, marginBlock }}>
+ {darkModeReducedMotionImageURL ? (
+ <source
+ srcSet={darkModeReducedMotionImageURL}
+ media="(prefers-color-scheme: dark) and (prefers-reduced-motion: reduce)"
+ />
+ ) : null}
+ {darkModeImageURL ? (
+ <source
+ srcSet={darkModeImageURL}
+ media="(prefers-color-scheme: dark)"
+ />
+ ) : null}
+ {reducedMotionImageURL ? (
+ <source
+ srcSet={reducedMotionImageURL}
+ media="(prefers-reduced-motion: reduce)"
+ />
+ ) : null}
+ <Localized text={alt}>
+ <div className="sr-only logo-alt" />
+ </Localized>
+ <img
+ className="brand-logo"
+ style={{ height, width }}
+ src={imageURL}
+ alt=""
+ loading={getLoadingStrategy()}
+ role={alt ? null : "presentation"}
+ />
+ </picture>
+ );
+ }
+
+ renderContentTiles() {
+ const { content } = this.props;
+ return (
+ <React.Fragment>
+ {content.tiles &&
+ content.tiles.type === "addons-picker" &&
+ content.tiles.data ? (
+ <AddonsPicker
+ content={content}
+ message_id={this.props.messageId}
+ handleAction={this.props.handleAction}
+ />
+ ) : null}
+ {content.tiles &&
+ content.tiles.type === "theme" &&
+ content.tiles.data ? (
+ <Themes
+ content={content}
+ activeTheme={this.props.activeTheme}
+ handleAction={this.props.handleAction}
+ />
+ ) : null}
+ {content.tiles &&
+ content.tiles.type === "mobile_downloads" &&
+ content.tiles.data ? (
+ <MobileDownloads
+ data={content.tiles.data}
+ handleAction={this.props.handleAction}
+ />
+ ) : null}
+ {content.tiles &&
+ content.tiles.type === "multiselect" &&
+ content.tiles.data ? (
+ <MultiSelect
+ content={content}
+ screenMultiSelects={this.props.screenMultiSelects}
+ setScreenMultiSelects={this.props.setScreenMultiSelects}
+ activeMultiSelect={this.props.activeMultiSelect}
+ setActiveMultiSelect={this.props.setActiveMultiSelect}
+ />
+ ) : null}
+ {content.tiles && content.tiles.type === "migration-wizard" ? (
+ <EmbeddedMigrationWizard handleAction={this.props.handleAction} />
+ ) : null}
+ </React.Fragment>
+ );
+ }
+
+ renderNoodles() {
+ return (
+ <React.Fragment>
+ <div className={"noodle orange-L"} />
+ <div className={"noodle purple-C"} />
+ <div className={"noodle solid-L"} />
+ <div className={"noodle outline-L"} />
+ <div className={"noodle yellow-circle"} />
+ </React.Fragment>
+ );
+ }
+
+ renderLanguageSwitcher() {
+ return this.props.content.languageSwitcher ? (
+ <LanguageSwitcher
+ content={this.props.content}
+ handleAction={this.props.handleAction}
+ negotiatedLanguage={this.props.negotiatedLanguage}
+ langPackInstallPhase={this.props.langPackInstallPhase}
+ messageId={this.props.messageId}
+ />
+ ) : null;
+ }
+
+ renderDismissButton() {
+ const { size, marginBlock, marginInline, label } =
+ this.props.content.dismiss_button;
+ return (
+ <button
+ className="dismiss-button"
+ onClick={this.props.handleAction}
+ value="dismiss_button"
+ data-l10n-id={label?.string_id || "spotlight-dialog-close-button"}
+ button-size={size}
+ style={{ marginBlock, marginInline }}
+ ></button>
+ );
+ }
+
+ renderStepsIndicator() {
+ const currentStep = (this.props.order ?? 0) + 1;
+ const previousStep = (this.props.previousOrder ?? -1) + 1;
+ const { content, totalNumberOfScreens: total } = this.props;
+ return (
+ <div
+ id="steps"
+ className={`steps${content.progress_bar ? " progress-bar" : ""}`}
+ data-l10n-id={
+ content.steps_indicator?.string_id ||
+ "onboarding-welcome-steps-indicator-label"
+ }
+ data-l10n-args={JSON.stringify({
+ current: currentStep,
+ total: total ?? 0,
+ })}
+ data-l10n-attrs="aria-label"
+ role="progressbar"
+ aria-valuenow={currentStep}
+ aria-valuemin={1}
+ aria-valuemax={total}
+ >
+ {content.progress_bar ? (
+ <ProgressBar
+ step={currentStep}
+ previousStep={previousStep}
+ totalNumberOfScreens={total}
+ />
+ ) : (
+ <StepsIndicator
+ order={this.props.order}
+ totalNumberOfScreens={total}
+ />
+ )}
+ </div>
+ );
+ }
+
+ renderSecondarySection(content) {
+ return (
+ <div
+ className={`section-secondary ${
+ content.hide_secondary_section ? "with-secondary-section-hidden" : ""
+ }`}
+ style={
+ content.background
+ ? {
+ background: content.background,
+ "--mr-secondary-background-position-y":
+ content.split_narrow_bkg_position,
+ }
+ : {}
+ }
+ >
+ <Localized text={content.image_alt_text}>
+ <div className="sr-only image-alt" role="img" />
+ </Localized>
+ {content.hero_image ? (
+ <HeroImage url={content.hero_image.url} />
+ ) : (
+ <React.Fragment>
+ <div className="message-text">
+ <div className="spacer-top" />
+ <Localized text={content.hero_text}>
+ <h1 />
+ </Localized>
+ <div className="spacer-bottom" />
+ </div>
+ </React.Fragment>
+ )}
+ </div>
+ );
+ }
+
+ renderOrderedContent(content) {
+ const elements = [];
+ for (const item of content) {
+ switch (item.type) {
+ case "text":
+ elements.push(
+ <LinkParagraph
+ text_content={item}
+ handleAction={this.props.handleAction}
+ />
+ );
+ break;
+ case "image":
+ elements.push(
+ this.renderPicture({
+ imageURL: item.url,
+ darkModeImageURL: item.darkModeImageURL,
+ height: item.height,
+ width: item.width,
+ alt: item.alt_text,
+ marginInline: item.marginInline,
+ className: "inline-image",
+ })
+ );
+ }
+ }
+ return <>{elements}</>;
+ }
+
+ render() {
+ const {
+ autoAdvance,
+ content,
+ isRtamo,
+ isTheme,
+ isFirstScreen,
+ isLastScreen,
+ isSingleScreen,
+ forceHideStepsIndicator,
+ ariaRole,
+ aboveButtonStepsIndicator,
+ } = this.props;
+ const includeNoodles = content.has_noodles;
+ // The default screen position is "center"
+ const isCenterPosition = content.position === "center" || !content.position;
+ const hideStepsIndicator =
+ autoAdvance ||
+ content?.video_container ||
+ isSingleScreen ||
+ forceHideStepsIndicator;
+ const textColorClass = content.text_color
+ ? `${content.text_color}-text`
+ : "";
+ // Assign proton screen style 'screen-1' or 'screen-2' to centered screens
+ // by checking if screen order is even or odd.
+ const screenClassName = isCenterPosition
+ ? this.getScreenClassName(
+ isFirstScreen,
+ isLastScreen,
+ includeNoodles,
+ content?.video_container,
+ content.tiles?.type === "addons-picker"
+ )
+ : "";
+ const isEmbeddedMigration = content.tiles?.type === "migration-wizard";
+
+ return (
+ <main
+ className={`screen ${this.props.id || ""}
+ ${screenClassName} ${textColorClass}`}
+ role={ariaRole ?? "alertdialog"}
+ layout={content.layout}
+ pos={content.position || "center"}
+ tabIndex="-1"
+ aria-labelledby="mainContentHeader"
+ ref={input => {
+ this.mainContentHeader = input;
+ }}
+ >
+ {isCenterPosition ? null : this.renderSecondarySection(content)}
+ <div
+ className={`section-main ${
+ isEmbeddedMigration ? "embedded-migration" : ""
+ }`}
+ hide-secondary-section={
+ content.hide_secondary_section
+ ? String(content.hide_secondary_section)
+ : null
+ }
+ role="document"
+ >
+ {content.secondary_button_top ? (
+ <SecondaryCTA
+ content={content}
+ handleAction={this.props.handleAction}
+ position="top"
+ />
+ ) : null}
+ {includeNoodles ? this.renderNoodles() : null}
+ {content.dismiss_button ? this.renderDismissButton() : null}
+ <div
+ className={`main-content ${hideStepsIndicator ? "no-steps" : ""}`}
+ style={{
+ background:
+ content.background && isCenterPosition
+ ? content.background
+ : null,
+ width:
+ content.width && content.position !== "split"
+ ? content.width
+ : null,
+ }}
+ >
+ {content.logo ? this.renderPicture(content.logo) : null}
+
+ {isRtamo ? (
+ <div className="rtamo-icon">
+ <img
+ className={`${isTheme ? "rtamo-theme-icon" : "brand-logo"}`}
+ src={this.props.iconURL}
+ loading={AboutWelcomeUtils.getLoadingStrategyFor(
+ this.props.iconURL
+ )}
+ alt=""
+ role="presentation"
+ />
+ </div>
+ ) : null}
+
+ <div className="main-content-inner">
+ <div className={`welcome-text ${content.title_style || ""}`}>
+ {content.title ? this.renderTitle(content) : null}
+
+ {content.subtitle ? (
+ <Localized text={content.subtitle}>
+ <h2
+ data-l10n-args={JSON.stringify({
+ "addon-name": this.props.addonName,
+ ...this.props.appAndSystemLocaleInfo?.displayNames,
+ })}
+ aria-flowto={
+ this.props.messageId?.includes("FEATURE_TOUR")
+ ? "steps"
+ : ""
+ }
+ />
+ </Localized>
+ ) : null}
+ {content.cta_paragraph ? (
+ <CTAParagraph
+ content={content.cta_paragraph}
+ handleAction={this.props.handleAction}
+ />
+ ) : null}
+ </div>
+ {content.video_container ? (
+ <OnboardingVideo
+ content={content.video_container}
+ handleAction={this.props.handleAction}
+ />
+ ) : null}
+ {content.above_button_content
+ ? this.renderOrderedContent(content.above_button_content)
+ : null}
+ {this.renderContentTiles()}
+ {this.renderLanguageSwitcher()}
+ {!hideStepsIndicator && aboveButtonStepsIndicator
+ ? this.renderStepsIndicator()
+ : null}
+ <ProtonScreenActionButtons
+ content={content}
+ addonName={this.props.addonName}
+ handleAction={this.props.handleAction}
+ activeMultiSelect={this.props.activeMultiSelect}
+ />
+ </div>
+ {!hideStepsIndicator && !aboveButtonStepsIndicator
+ ? this.renderStepsIndicator()
+ : null}
+ </div>
+ </div>
+ <Localized text={content.info_text}>
+ <span className="info-text" />
+ </Localized>
+ </main>
+ );
+ }
+}
diff --git a/browser/components/aboutwelcome/content-src/components/OnboardingVideo.jsx b/browser/components/aboutwelcome/content-src/components/OnboardingVideo.jsx
new file mode 100644
index 0000000000..629a409a59
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/OnboardingVideo.jsx
@@ -0,0 +1,34 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+
+export const OnboardingVideo = props => {
+ const vidUrl = props.content.video_url;
+ const autoplay = props.content.autoPlay;
+
+ const handleVideoAction = event => {
+ props.handleAction({
+ currentTarget: {
+ value: event,
+ },
+ });
+ };
+
+ return (
+ <div>
+ <video // eslint-disable-line jsx-a11y/media-has-caption
+ controls={true}
+ autoPlay={autoplay}
+ src={vidUrl}
+ width="604px"
+ height="340px"
+ onPlay={() => handleVideoAction("video_start")}
+ onEnded={() => handleVideoAction("video_end")}
+ >
+ <source src={vidUrl}></source>
+ </video>
+ </div>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/ReturnToAMO.jsx b/browser/components/aboutwelcome/content-src/components/ReturnToAMO.jsx
new file mode 100644
index 0000000000..e262e3d92a
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/ReturnToAMO.jsx
@@ -0,0 +1,105 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import {
+ AboutWelcomeUtils,
+ DEFAULT_RTAMO_CONTENT,
+} from "../lib/aboutwelcome-utils.mjs";
+import { MultiStageProtonScreen } from "./MultiStageProtonScreen";
+import { BASE_PARAMS } from "../lib/addUtmParams.mjs";
+
+export class ReturnToAMO extends React.PureComponent {
+ constructor(props) {
+ super(props);
+ this.fetchFlowParams = this.fetchFlowParams.bind(this);
+ this.handleAction = this.handleAction.bind(this);
+ }
+
+ async fetchFlowParams() {
+ if (this.props.metricsFlowUri) {
+ this.setState({
+ flowParams: await AboutWelcomeUtils.fetchFlowParams(
+ this.props.metricsFlowUri
+ ),
+ });
+ }
+ }
+
+ componentDidUpdate() {
+ this.fetchFlowParams();
+ }
+
+ handleAction(event) {
+ const { content, message_id, url, utm_term } = this.props;
+ let { action, source_id } = content[event.currentTarget.value];
+ let { type, data } = action;
+
+ if (type === "INSTALL_ADDON_FROM_URL") {
+ if (!data) {
+ return;
+ }
+ // Set add-on url in action.data.url property from JSON
+ data = { ...data, url };
+ } else if (type === "SHOW_FIREFOX_ACCOUNTS") {
+ let params = {
+ ...BASE_PARAMS,
+ utm_term: `aboutwelcome-${utm_term}-screen`,
+ };
+ if (action.addFlowParams && this.state.flowParams) {
+ params = {
+ ...params,
+ ...this.state.flowParams,
+ };
+ }
+ data = { ...data, extraParams: params };
+ }
+
+ AboutWelcomeUtils.handleUserAction({ type, data });
+ AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
+ }
+
+ render() {
+ const { content, type } = this.props;
+
+ if (!content) {
+ return null;
+ }
+
+ if (content?.primary_button.label) {
+ content.primary_button.label.string_id = type.includes("theme")
+ ? "return-to-amo-add-theme-label"
+ : "mr1-return-to-amo-add-extension-label";
+ }
+
+ // For experiments, when needed below rendered UI allows settings hard coded strings
+ // directly inside JSON except for ReturnToAMOText which picks add-on name and icon from fluent string
+ return (
+ <div
+ className={"outer-wrapper onboardingContainer proton"}
+ style={content.backdrop ? { background: content.backdrop } : {}}
+ >
+ <MultiStageProtonScreen
+ content={content}
+ isRtamo={true}
+ isTheme={type.includes("theme")}
+ id={this.props.message_id}
+ order={this.props.order || 0}
+ totalNumberOfScreens={1}
+ isSingleScreen={true}
+ autoAdvance={this.props.auto_advance}
+ iconURL={
+ type.includes("theme")
+ ? this.props.themeScreenshots[0]?.url
+ : this.props.iconURL
+ }
+ addonName={this.props.name}
+ handleAction={this.handleAction}
+ />
+ </div>
+ );
+ }
+}
+
+ReturnToAMO.defaultProps = DEFAULT_RTAMO_CONTENT;
diff --git a/browser/components/aboutwelcome/content-src/components/SubmenuButton.jsx b/browser/components/aboutwelcome/content-src/components/SubmenuButton.jsx
new file mode 100644
index 0000000000..e0c8144e73
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/SubmenuButton.jsx
@@ -0,0 +1,149 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useEffect, useRef, useCallback } from "react";
+import { Localized } from "./MSLocalized";
+
+export const SubmenuButton = props => {
+ return document.createXULElement ? <SubmenuButtonInner {...props} /> : null;
+};
+
+function translateMenuitem(item, element) {
+ let { label } = item;
+ if (!label) {
+ return;
+ }
+ if (label.raw) {
+ element.setAttribute("label", label.raw);
+ }
+ if (label.access_key) {
+ element.setAttribute("accesskey", label.access_key);
+ }
+ if (label.aria_label) {
+ element.setAttribute("aria-label", label.aria_label);
+ }
+ if (label.tooltip_text) {
+ element.setAttribute("tooltiptext", label.tooltip_text);
+ }
+ if (label.string_id) {
+ element.setAttribute("data-l10n-id", label.string_id);
+ if (label.args) {
+ element.setAttribute("data-l10n-args", JSON.stringify(label.args));
+ }
+ }
+}
+
+function addMenuitems(items, popup) {
+ for (let item of items) {
+ switch (item.type) {
+ case "separator":
+ popup.appendChild(document.createXULElement("menuseparator"));
+ break;
+ case "menu":
+ let menu = document.createXULElement("menu");
+ menu.className = "fxms-multi-stage-menu";
+ translateMenuitem(item, menu);
+ if (item.id) {
+ menu.value = item.id;
+ }
+ if (item.icon) {
+ menu.classList.add("menu-iconic");
+ menu.setAttribute("image", item.icon);
+ }
+ popup.appendChild(menu);
+ let submenuPopup = document.createXULElement("menupopup");
+ menu.appendChild(submenuPopup);
+ addMenuitems(item.submenu, submenuPopup);
+ break;
+ case "action":
+ let menuitem = document.createXULElement("menuitem");
+ translateMenuitem(item, menuitem);
+ menuitem.config = item;
+ if (item.id) {
+ menuitem.value = item.id;
+ }
+ if (item.icon) {
+ menuitem.classList.add("menuitem-iconic");
+ menuitem.setAttribute("image", item.icon);
+ }
+ popup.appendChild(menuitem);
+ break;
+ }
+ }
+}
+
+const SubmenuButtonInner = ({ content, handleAction }) => {
+ const ref = useRef(null);
+ const isPrimary = content.submenu_button?.style === "primary";
+ const onCommand = useCallback(
+ event => {
+ let { config } = event.target;
+ let mockEvent = {
+ currentTarget: ref.current,
+ source: config.id,
+ name: "command",
+ action: config.action,
+ };
+ handleAction(mockEvent);
+ },
+ [handleAction]
+ );
+ const onClick = useCallback(() => {
+ let button = ref.current;
+ let submenu = button?.querySelector(".fxms-multi-stage-submenu");
+ if (submenu && !button.hasAttribute("open")) {
+ submenu.openPopup(button, { position: "after_end" });
+ }
+ }, []);
+ useEffect(() => {
+ let button = ref.current;
+ if (!button || button.querySelector(".fxms-multi-stage-submenu")) {
+ return null;
+ }
+ let menupopup = document.createXULElement("menupopup");
+ menupopup.className = "fxms-multi-stage-submenu";
+ addMenuitems(content.submenu_button.submenu, menupopup);
+ button.appendChild(menupopup);
+ let stylesheet;
+ if (
+ !document.head.querySelector(
+ `link[href="chrome://global/content/widgets.css"], link[href="chrome://global/skin/global.css"]`
+ )
+ ) {
+ stylesheet = document.createElement("link");
+ stylesheet.rel = "stylesheet";
+ stylesheet.href = "chrome://global/content/widgets.css";
+ document.head.appendChild(stylesheet);
+ }
+ if (!menupopup.listenersRegistered) {
+ menupopup.addEventListener("command", onCommand);
+ menupopup.addEventListener("popupshowing", event => {
+ if (event.target === menupopup && event.target.anchorNode) {
+ event.target.anchorNode.toggleAttribute("open", true);
+ }
+ });
+ menupopup.addEventListener("popuphiding", event => {
+ if (event.target === menupopup && event.target.anchorNode) {
+ event.target.anchorNode.toggleAttribute("open", false);
+ }
+ });
+ menupopup.listenersRegistered = true;
+ }
+ return () => {
+ menupopup?.remove();
+ stylesheet?.remove();
+ };
+ }, [onCommand]); // eslint-disable-line react-hooks/exhaustive-deps
+
+ return (
+ <Localized text={content.submenu_button.label ?? {}}>
+ <button
+ className={`submenu-button ${isPrimary ? "primary" : "secondary"}`}
+ value="submenu_button"
+ onClick={onClick}
+ ref={ref}
+ />
+ </Localized>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/Themes.jsx b/browser/components/aboutwelcome/content-src/components/Themes.jsx
new file mode 100644
index 0000000000..0ee986f982
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/Themes.jsx
@@ -0,0 +1,52 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React from "react";
+import { Localized } from "./MSLocalized";
+
+export const Themes = props => {
+ return (
+ <div className="tiles-theme-container">
+ <div>
+ <fieldset className="tiles-theme-section">
+ <Localized text={props.content.subtitle}>
+ <legend className="sr-only" />
+ </Localized>
+ {props.content.tiles.data.map(
+ ({ theme, label, tooltip, description }) => (
+ <Localized
+ key={theme + label}
+ text={typeof tooltip === "object" ? tooltip : {}}
+ >
+ {/* eslint-disable-next-line jsx-a11y/label-has-associated-control */}
+ <label className="theme" title={theme + label}>
+ <Localized
+ text={typeof description === "object" ? description : {}}
+ >
+ <input
+ type="radio"
+ value={theme}
+ name="theme"
+ checked={theme === props.activeTheme}
+ className="sr-only input"
+ onClick={props.handleAction}
+ />
+ </Localized>
+ <div
+ className={`icon ${
+ theme === props.activeTheme ? " selected" : ""
+ } ${theme}`}
+ />
+ <Localized text={label}>
+ <div className="text" />
+ </Localized>
+ </label>
+ </Localized>
+ )
+ )}
+ </fieldset>
+ </div>
+ </div>
+ );
+};
diff --git a/browser/components/aboutwelcome/content-src/components/Zap.jsx b/browser/components/aboutwelcome/content-src/components/Zap.jsx
new file mode 100644
index 0000000000..a067c4d7fe
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/components/Zap.jsx
@@ -0,0 +1,60 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import React, { useEffect } from "react";
+import { Localized } from "./MSLocalized";
+const MS_STRING_PROP = "string_id";
+const ZAP_SIZE_THRESHOLD = 160;
+
+function calculateZapLength() {
+ let span = document.querySelector(".zap");
+ if (!span) {
+ return;
+ }
+ let rect = span.getBoundingClientRect();
+ if (rect && rect.width > ZAP_SIZE_THRESHOLD) {
+ span.classList.add("long");
+ } else {
+ span.classList.add("short");
+ }
+}
+
+export const Zap = props => {
+ useEffect(() => {
+ requestAnimationFrame(() => calculateZapLength());
+ });
+
+ if (!props.text) {
+ return null;
+ }
+
+ if (props.hasZap) {
+ if (typeof props.text === "object" && props.text[MS_STRING_PROP]) {
+ return (
+ <Localized text={props.text}>
+ <h1 className="welcomeZap">
+ <span data-l10n-name="zap" className="zap" />
+ </h1>
+ </Localized>
+ );
+ } else if (typeof props.text === "string") {
+ // Parse string to zap style last word of the props.text
+ let titleArray = props.text.split(" ");
+ let lastWord = `${titleArray.pop()}`;
+ return (
+ <h1 className="welcomeZap">
+ {titleArray.join(" ").concat(" ")}
+ <span className="zap">{lastWord}</span>
+ </h1>
+ );
+ }
+ } else {
+ return (
+ <Localized text={props.text}>
+ <h1 />
+ </Localized>
+ );
+ }
+ return null;
+};
diff --git a/browser/components/aboutwelcome/content-src/lib/aboutwelcome-utils.mjs b/browser/components/aboutwelcome/content-src/lib/aboutwelcome-utils.mjs
new file mode 100644
index 0000000000..4cbb888e28
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/lib/aboutwelcome-utils.mjs
@@ -0,0 +1,122 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+// If the container has a "page" data attribute, then this is
+// a Spotlight modal or Feature Callout. Otherwise, this is
+// about:welcome and we should return the current page.
+const page =
+ document.querySelector(
+ "#multi-stage-message-root.onboardingContainer[data-page]"
+ )?.dataset.page || document.location.href;
+
+export const AboutWelcomeUtils = {
+ handleUserAction(action) {
+ return window.AWSendToParent("SPECIAL_ACTION", action);
+ },
+ sendImpressionTelemetry(messageId, context) {
+ window.AWSendEventTelemetry?.({
+ event: "IMPRESSION",
+ event_context: {
+ ...context,
+ page,
+ },
+ message_id: messageId,
+ });
+ },
+ sendActionTelemetry(messageId, elementId, eventName = "CLICK_BUTTON") {
+ const ping = {
+ event: eventName,
+ event_context: {
+ source: elementId,
+ page,
+ },
+ message_id: messageId,
+ };
+ window.AWSendEventTelemetry?.(ping);
+ },
+ sendDismissTelemetry(messageId, elementId) {
+ // Don't send DISMISS telemetry in spotlight modals since they already send
+ // their own equivalent telemetry.
+ if (page !== "spotlight") {
+ this.sendActionTelemetry(messageId, elementId, "DISMISS");
+ }
+ },
+ async fetchFlowParams(metricsFlowUri) {
+ let flowParams;
+ try {
+ const response = await fetch(metricsFlowUri, {
+ credentials: "omit",
+ });
+ if (response.status === 200) {
+ const { deviceId, flowId, flowBeginTime } = await response.json();
+ flowParams = { deviceId, flowId, flowBeginTime };
+ } else {
+ console.error("Non-200 response", response);
+ }
+ } catch (e) {
+ flowParams = null;
+ }
+ return flowParams;
+ },
+ sendEvent(type, detail) {
+ document.dispatchEvent(
+ new CustomEvent(`AWPage:${type}`, {
+ bubbles: true,
+ detail,
+ })
+ );
+ },
+ getLoadingStrategyFor(url) {
+ return url?.startsWith("http") ? "lazy" : "eager";
+ },
+};
+
+export const DEFAULT_RTAMO_CONTENT = {
+ template: "return_to_amo",
+ utm_term: "rtamo",
+ content: {
+ position: "split",
+ title: { string_id: "mr1-return-to-amo-subtitle" },
+ has_noodles: false,
+ subtitle: {
+ string_id: "mr1-return-to-amo-addon-title",
+ },
+ backdrop:
+ "var(--mr-welcome-background-color) var(--mr-welcome-background-gradient)",
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-rtamo-background-image.svg') no-repeat center",
+ progress_bar: true,
+ primary_button: {
+ label: { string_id: "mr1-return-to-amo-add-extension-label" },
+ source_id: "ADD_EXTENSION_BUTTON",
+ action: {
+ type: "INSTALL_ADDON_FROM_URL",
+ data: { url: null, telemetrySource: "rtamo" },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "onboarding-not-now-button-label",
+ },
+ source_id: "RTAMO_START_BROWSING_BUTTON",
+ action: {
+ type: "OPEN_AWESOME_BAR",
+ },
+ },
+ secondary_button_top: {
+ label: {
+ string_id: "mr1-onboarding-sign-in-button-label",
+ },
+ source_id: "RTAMO_FXA_SIGNIN_BUTTON",
+ action: {
+ data: {
+ entrypoint: "activity-stream-firstrun",
+ where: "tab",
+ },
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ addFlowParams: true,
+ },
+ },
+ },
+};
diff --git a/browser/components/aboutwelcome/content-src/lib/addUtmParams.mjs b/browser/components/aboutwelcome/content-src/lib/addUtmParams.mjs
new file mode 100644
index 0000000000..6fc4d2283a
--- /dev/null
+++ b/browser/components/aboutwelcome/content-src/lib/addUtmParams.mjs
@@ -0,0 +1,32 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+/**
+ * BASE_PARAMS keys/values can be modified from outside this file
+ */
+export const BASE_PARAMS = {
+ utm_source: "activity-stream",
+ utm_campaign: "firstrun",
+ utm_medium: "referral",
+};
+
+/**
+ * Takes in a url as a string or URL object and returns a URL object with the
+ * utm_* parameters added to it. If a URL object is passed in, the paraemeters
+ * are added to it (the return value can be ignored in that case as it's the
+ * same object).
+ */
+export function addUtmParams(url, utmTerm) {
+ let returnUrl = url;
+ if (typeof returnUrl === "string") {
+ returnUrl = new URL(url);
+ }
+ for (let [key, value] of Object.entries(BASE_PARAMS)) {
+ if (!returnUrl.searchParams.has(key)) {
+ returnUrl.searchParams.append(key, value);
+ }
+ }
+ returnUrl.searchParams.append("utm_term", utmTerm);
+ return returnUrl;
+}
diff --git a/browser/components/aboutwelcome/content/aboutwelcome.bundle.js b/browser/components/aboutwelcome/content/aboutwelcome.bundle.js
new file mode 100644
index 0000000000..cb4e9004f8
--- /dev/null
+++ b/browser/components/aboutwelcome/content/aboutwelcome.bundle.js
@@ -0,0 +1,2678 @@
+/*!
+ *
+ * NOTE: This file is generated by webpack from aboutwelcome.jsx
+ * using the npm bundle task.
+ *
+ */
+/******/ (() => { // webpackBootstrap
+/******/ "use strict";
+/******/ var __webpack_modules__ = ([
+/* 0 */,
+/* 1 */
+/***/ ((module) => {
+
+module.exports = React;
+
+/***/ }),
+/* 2 */
+/***/ ((module) => {
+
+module.exports = ReactDOM;
+
+/***/ }),
+/* 3 */
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "AboutWelcomeUtils": () => (/* binding */ AboutWelcomeUtils),
+/* harmony export */ "DEFAULT_RTAMO_CONTENT": () => (/* binding */ DEFAULT_RTAMO_CONTENT)
+/* harmony export */ });
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+// If the container has a "page" data attribute, then this is
+// a Spotlight modal or Feature Callout. Otherwise, this is
+// about:welcome and we should return the current page.
+const page =
+ document.querySelector(
+ "#multi-stage-message-root.onboardingContainer[data-page]"
+ )?.dataset.page || document.location.href;
+
+const AboutWelcomeUtils = {
+ handleUserAction(action) {
+ return window.AWSendToParent("SPECIAL_ACTION", action);
+ },
+ sendImpressionTelemetry(messageId, context) {
+ window.AWSendEventTelemetry?.({
+ event: "IMPRESSION",
+ event_context: {
+ ...context,
+ page,
+ },
+ message_id: messageId,
+ });
+ },
+ sendActionTelemetry(messageId, elementId, eventName = "CLICK_BUTTON") {
+ const ping = {
+ event: eventName,
+ event_context: {
+ source: elementId,
+ page,
+ },
+ message_id: messageId,
+ };
+ window.AWSendEventTelemetry?.(ping);
+ },
+ sendDismissTelemetry(messageId, elementId) {
+ // Don't send DISMISS telemetry in spotlight modals since they already send
+ // their own equivalent telemetry.
+ if (page !== "spotlight") {
+ this.sendActionTelemetry(messageId, elementId, "DISMISS");
+ }
+ },
+ async fetchFlowParams(metricsFlowUri) {
+ let flowParams;
+ try {
+ const response = await fetch(metricsFlowUri, {
+ credentials: "omit",
+ });
+ if (response.status === 200) {
+ const { deviceId, flowId, flowBeginTime } = await response.json();
+ flowParams = { deviceId, flowId, flowBeginTime };
+ } else {
+ console.error("Non-200 response", response);
+ }
+ } catch (e) {
+ flowParams = null;
+ }
+ return flowParams;
+ },
+ sendEvent(type, detail) {
+ document.dispatchEvent(
+ new CustomEvent(`AWPage:${type}`, {
+ bubbles: true,
+ detail,
+ })
+ );
+ },
+ getLoadingStrategyFor(url) {
+ return url?.startsWith("http") ? "lazy" : "eager";
+ },
+};
+
+const DEFAULT_RTAMO_CONTENT = {
+ template: "return_to_amo",
+ utm_term: "rtamo",
+ content: {
+ position: "split",
+ title: { string_id: "mr1-return-to-amo-subtitle" },
+ has_noodles: false,
+ subtitle: {
+ string_id: "mr1-return-to-amo-addon-title",
+ },
+ backdrop:
+ "var(--mr-welcome-background-color) var(--mr-welcome-background-gradient)",
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-rtamo-background-image.svg') no-repeat center",
+ progress_bar: true,
+ primary_button: {
+ label: { string_id: "mr1-return-to-amo-add-extension-label" },
+ source_id: "ADD_EXTENSION_BUTTON",
+ action: {
+ type: "INSTALL_ADDON_FROM_URL",
+ data: { url: null, telemetrySource: "rtamo" },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "onboarding-not-now-button-label",
+ },
+ source_id: "RTAMO_START_BROWSING_BUTTON",
+ action: {
+ type: "OPEN_AWESOME_BAR",
+ },
+ },
+ secondary_button_top: {
+ label: {
+ string_id: "mr1-onboarding-sign-in-button-label",
+ },
+ source_id: "RTAMO_FXA_SIGNIN_BUTTON",
+ action: {
+ data: {
+ entrypoint: "activity-stream-firstrun",
+ where: "tab",
+ },
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ addFlowParams: true,
+ },
+ },
+ },
+};
+
+
+/***/ }),
+/* 4 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "MultiStageAboutWelcome": () => (/* binding */ MultiStageAboutWelcome),
+/* harmony export */ "SecondaryCTA": () => (/* binding */ SecondaryCTA),
+/* harmony export */ "StepsIndicator": () => (/* binding */ StepsIndicator),
+/* harmony export */ "ProgressBar": () => (/* binding */ ProgressBar),
+/* harmony export */ "WelcomeScreen": () => (/* binding */ WelcomeScreen)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
+/* harmony import */ var _MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6);
+/* harmony import */ var _LanguageSwitcher__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(10);
+/* harmony import */ var _SubmenuButton__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(15);
+/* harmony import */ var _lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(19);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+
+
+
+
+
+// Amount of milliseconds for all transitions to complete (including delays).
+const TRANSITION_OUT_TIME = 1000;
+const LANGUAGE_MISMATCH_SCREEN_ID = "AW_LANGUAGE_MISMATCH";
+const MultiStageAboutWelcome = props => {
+ let {
+ defaultScreens
+ } = props;
+ const didFilter = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false);
+ const [didMount, setDidMount] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
+ const [screens, setScreens] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(defaultScreens);
+ const [index, setScreenIndex] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(props.startScreen);
+ const [previousOrder, setPreviousOrder] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(props.startScreen - 1);
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ (async () => {
+ // If we want to load index from history state, we don't want to send impression yet
+ if (!didMount) {
+ return;
+ }
+ // On about:welcome first load, screensVisited should be empty
+ let screensVisited = didFilter.current ? screens.slice(0, index) : [];
+ let upcomingScreens = defaultScreens.filter(s => !screensVisited.find(v => v.id === s.id))
+ // Filter out Language Mismatch screen from upcoming
+ // screens if screens set from useLanguageSwitcher hook
+ // has filtered language screen
+ .filter(upcomingScreen => !(!screens.find(s => s.id === LANGUAGE_MISMATCH_SCREEN_ID) && upcomingScreen.id === LANGUAGE_MISMATCH_SCREEN_ID));
+ let filteredScreens = screensVisited.concat((await window.AWEvaluateScreenTargeting(upcomingScreens)) ?? upcomingScreens);
+
+ // Use existing screen for the filtered screen to carry over any modification
+ // e.g. if AW_LANGUAGE_MISMATCH exists, use it from existing screens
+ setScreens(filteredScreens.map(filtered => screens.find(s => s.id === filtered.id) ?? filtered));
+ didFilter.current = true;
+ const screenInitials = filteredScreens.map(({
+ id
+ }) => id?.split("_")[1]?.[0]).join("");
+ // Send impression ping when respective screen first renders
+ filteredScreens.forEach((screen, order) => {
+ if (index === order) {
+ const messageId = `${props.message_id}_${order}_${screen.id}_${screenInitials}`;
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendImpressionTelemetry(messageId, {
+ screen_family: props.message_id,
+ screen_index: order,
+ screen_id: screen.id,
+ screen_initials: screenInitials
+ });
+ window.AWAddScreenImpression?.(screen);
+ }
+ });
+
+ // Remember that a new screen has loaded for browser navigation
+ if (props.updateHistory && index > window.history.state) {
+ window.history.pushState(index, "");
+ }
+
+ // Remember the previous screen index so we can animate the transition
+ setPreviousOrder(index);
+ })();
+ }, [index, didMount]); // eslint-disable-line react-hooks/exhaustive-deps
+
+ const [flowParams, setFlowParams] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
+ const {
+ metricsFlowUri
+ } = props;
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ (async () => {
+ if (metricsFlowUri) {
+ setFlowParams(await _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.fetchFlowParams(metricsFlowUri));
+ }
+ })();
+ }, [metricsFlowUri]);
+
+ // Allow "in" style to render to actually transition towards regular state,
+ // which also makes using browser back/forward navigation skip transitions.
+ const [transition, setTransition] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(props.transitions ? "in" : "");
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ if (transition === "in") {
+ requestAnimationFrame(() => requestAnimationFrame(() => setTransition("")));
+ }
+ }, [transition]);
+
+ // Transition to next screen, opening about:home on last screen button CTA
+ const handleTransition = () => {
+ // Only handle transitioning out from a screen once.
+ if (transition === "out") {
+ return;
+ }
+
+ // Start transitioning things "out" immediately when moving forwards.
+ setTransition(props.transitions ? "out" : "");
+
+ // Actually move forwards after all transitions finish.
+ setTimeout(() => {
+ if (index < screens.length - 1) {
+ setTransition(props.transitions ? "in" : "");
+ setScreenIndex(prevState => prevState + 1);
+ } else {
+ window.AWFinish();
+ }
+ }, props.transitions ? TRANSITION_OUT_TIME : 0);
+ };
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ // When about:welcome loads (on refresh or pressing back button
+ // from about:home), ensure history state usEffect runs before
+ // useEffect hook that send impression telemetry
+ setDidMount(true);
+ if (props.updateHistory) {
+ // Switch to the screen tracked in state (null for initial state)
+ // or last screen index if a user navigates by pressing back
+ // button from about:home
+ const handler = ({
+ state
+ }) => {
+ if (transition === "out") {
+ return;
+ }
+ setTransition(props.transitions ? "out" : "");
+ setTimeout(() => {
+ setTransition(props.transitions ? "in" : "");
+ setScreenIndex(Math.min(state, screens.length - 1));
+ }, props.transitions ? TRANSITION_OUT_TIME : 0);
+ };
+
+ // Handle page load, e.g., going back to about:welcome from about:home
+ const {
+ state
+ } = window.history;
+ if (state) {
+ setScreenIndex(Math.min(state, screens.length - 1));
+ setPreviousOrder(Math.min(state, screens.length - 1));
+ }
+
+ // Watch for browser back/forward button navigation events
+ window.addEventListener("popstate", handler);
+ return () => window.removeEventListener("popstate", handler);
+ }
+ return false;
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+
+ const [multiSelects, setMultiSelects] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});
+
+ // Save the active multi select state for each screen as an object keyed by
+ // screen id. Each screen id has an array containing checkbox ids used in
+ // handleAction to update MULTI_ACTION data. This allows us to remember the
+ // state of each screen's multi select checkboxes when navigating back and
+ // forth between screens, while also allowing a message to have more than one
+ // multi select screen.
+ const [activeMultiSelects, setActiveMultiSelects] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});
+
+ // Get the active theme so the rendering code can make it selected
+ // by default.
+ const [activeTheme, setActiveTheme] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
+ const [initialTheme, setInitialTheme] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ (async () => {
+ let theme = await window.AWGetSelectedTheme();
+ setInitialTheme(theme);
+ setActiveTheme(theme);
+ })();
+ }, []);
+ const {
+ negotiatedLanguage,
+ langPackInstallPhase,
+ languageFilteredScreens
+ } = (0,_LanguageSwitcher__WEBPACK_IMPORTED_MODULE_4__.useLanguageSwitcher)(props.appAndSystemLocaleInfo, screens, index, setScreenIndex);
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ setScreens(languageFilteredScreens);
+ }, [languageFilteredScreens]);
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: `outer-wrapper onboardingContainer proton transition-${transition}`,
+ style: props.backdrop ? {
+ background: props.backdrop
+ } : {}
+ }, screens.map((screen, order) => {
+ const isFirstScreen = screen === screens[0];
+ const isLastScreen = screen === screens[screens.length - 1];
+ const totalNumberOfScreens = screens.length;
+ const isSingleScreen = totalNumberOfScreens === 1;
+ const setActiveMultiSelect = valueOrFn => setActiveMultiSelects(prevState => ({
+ ...prevState,
+ [screen.id]: typeof valueOrFn === "function" ? valueOrFn(prevState[screen.id]) : valueOrFn
+ }));
+ const setScreenMultiSelects = valueOrFn => setMultiSelects(prevState => ({
+ ...prevState,
+ [screen.id]: typeof valueOrFn === "function" ? valueOrFn(prevState[screen.id]) : valueOrFn
+ }));
+ return index === order ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(WelcomeScreen, {
+ key: screen.id + order,
+ id: screen.id,
+ totalNumberOfScreens: totalNumberOfScreens,
+ isFirstScreen: isFirstScreen,
+ isLastScreen: isLastScreen,
+ isSingleScreen: isSingleScreen,
+ order: order,
+ previousOrder: previousOrder,
+ content: screen.content,
+ navigate: handleTransition,
+ messageId: `${props.message_id}_${order}_${screen.id}`,
+ UTMTerm: props.utm_term,
+ flowParams: flowParams,
+ activeTheme: activeTheme,
+ initialTheme: initialTheme,
+ setActiveTheme: setActiveTheme,
+ setInitialTheme: setInitialTheme,
+ screenMultiSelects: multiSelects[screen.id],
+ setScreenMultiSelects: setScreenMultiSelects,
+ activeMultiSelect: activeMultiSelects[screen.id],
+ setActiveMultiSelect: setActiveMultiSelect,
+ autoAdvance: screen.auto_advance,
+ negotiatedLanguage: negotiatedLanguage,
+ langPackInstallPhase: langPackInstallPhase,
+ forceHideStepsIndicator: screen.force_hide_steps_indicator,
+ ariaRole: props.ariaRole,
+ aboveButtonStepsIndicator: screen.above_button_steps_indicator
+ }) : null;
+ })));
+};
+const SecondaryCTA = props => {
+ const targetElement = props.position ? `secondary_button_${props.position}` : `secondary_button`;
+ let buttonStyling = props.content.secondary_button?.has_arrow_icon ? `secondary arrow-icon` : `secondary`;
+ const isPrimary = props.content.secondary_button?.style === "primary";
+ const isTextLink = !["split", "callout"].includes(props.content.position) && props.content.tiles?.type !== "addons-picker" && !isPrimary;
+ const isSplitButton = props.content.submenu_button?.attached_to === targetElement;
+ let className = "secondary-cta";
+ if (props.position) {
+ className += ` ${props.position}`;
+ }
+ if (isSplitButton) {
+ className += " split-button-container";
+ }
+ const isDisabled = react__WEBPACK_IMPORTED_MODULE_0___default().useCallback(disabledValue => disabledValue === "hasActiveMultiSelect" ? !(props.activeMultiSelect?.length > 0) : disabledValue, [props.activeMultiSelect?.length]);
+ if (isTextLink) {
+ buttonStyling += " text-link";
+ }
+ if (isPrimary) {
+ buttonStyling = props.content.secondary_button?.has_arrow_icon ? `primary arrow-icon` : `primary`;
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: className
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: props.content[targetElement].text
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: props.content[targetElement].label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: buttonStyling,
+ value: targetElement,
+ disabled: isDisabled(props.content.secondary_button?.disabled),
+ onClick: props.handleAction
+ })), isSplitButton ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_SubmenuButton__WEBPACK_IMPORTED_MODULE_5__.SubmenuButton, {
+ content: props.content,
+ handleAction: props.handleAction
+ }) : null);
+};
+const StepsIndicator = props => {
+ let steps = [];
+ for (let i = 0; i < props.totalNumberOfScreens; i++) {
+ let className = `${i === props.order ? "current" : ""} ${i < props.order ? "complete" : ""}`;
+ steps.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ key: i,
+ className: `indicator ${className}`,
+ role: "presentation"
+ }));
+ }
+ return steps;
+};
+const ProgressBar = ({
+ step,
+ previousStep,
+ totalNumberOfScreens
+}) => {
+ const [progress, setProgress] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(previousStep / totalNumberOfScreens);
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ // We don't need to hook any dependencies because any time the step changes,
+ // the screen's entire DOM tree will be re-rendered.
+ setProgress(step / totalNumberOfScreens);
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "indicator",
+ role: "presentation",
+ style: {
+ "--progress-bar-progress": `${progress * 100}%`
+ }
+ });
+};
+class WelcomeScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.handleAction = this.handleAction.bind(this);
+ }
+ handleOpenURL(action, flowParams, UTMTerm) {
+ let {
+ type,
+ data
+ } = action;
+ if (type === "SHOW_FIREFOX_ACCOUNTS") {
+ let params = {
+ ..._lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_6__.BASE_PARAMS,
+ utm_term: `${UTMTerm}-screen`
+ };
+ if (action.addFlowParams && flowParams) {
+ params = {
+ ...params,
+ ...flowParams
+ };
+ }
+ data = {
+ ...data,
+ extraParams: params
+ };
+ } else if (type === "OPEN_URL") {
+ let url = new URL(data.args);
+ (0,_lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_6__.addUtmParams)(url, `${UTMTerm}-screen`);
+ if (action.addFlowParams && flowParams) {
+ url.searchParams.append("device_id", flowParams.deviceId);
+ url.searchParams.append("flow_id", flowParams.flowId);
+ url.searchParams.append("flow_begin_time", flowParams.flowBeginTime);
+ }
+ data = {
+ ...data,
+ args: url.toString()
+ };
+ }
+ return _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.handleUserAction({
+ type,
+ data
+ });
+ }
+ async handleAction(event) {
+ let {
+ props
+ } = this;
+ const value = event.currentTarget.value ?? event.currentTarget.getAttribute("value");
+ const source = event.source || value;
+ let targetContent = props.content[value] || props.content.tiles || props.content.languageSwitcher;
+ if (value === "submenu_button" && event.action) {
+ targetContent = {
+ action: event.action
+ };
+ }
+ if (!(targetContent && targetContent.action)) {
+ return;
+ }
+ // Send telemetry before waiting on actions
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, source, event.name);
+
+ // Send additional telemetry if a messaging surface like feature callout is
+ // dismissed via the dismiss button. Other causes of dismissal will be
+ // handled separately by the messaging surface's own code.
+ if (value === "dismiss_button" && !event.name) {
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendDismissTelemetry(props.messageId, source);
+ }
+ let {
+ action
+ } = targetContent;
+ action = JSON.parse(JSON.stringify(action));
+ if (action.collectSelect) {
+ this.setMultiSelectActions(action);
+ }
+ let actionResult;
+ if (["OPEN_URL", "SHOW_FIREFOX_ACCOUNTS"].includes(action.type)) {
+ actionResult = await this.handleOpenURL(action, props.flowParams, props.UTMTerm);
+ } else if (action.type) {
+ actionResult = await _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.handleUserAction(action);
+ if (action.type === "FXA_SIGNIN_FLOW") {
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, actionResult ? "sign_in" : "sign_in_cancel", "FXA_SIGNIN_FLOW");
+ }
+ // Wait until migration closes to complete the action
+ const hasMigrate = a => a.type === "SHOW_MIGRATION_WIZARD" || a.type === "MULTI_ACTION" && a.data?.actions?.some(hasMigrate);
+ if (hasMigrate(action)) {
+ await window.AWWaitForMigrationClose();
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, "migrate_close");
+ }
+ }
+
+ // A special tiles.action.theme value indicates we should use the event's value vs provided value.
+ if (action.theme) {
+ let themeToUse = action.theme === "<event>" ? event.currentTarget.value : this.props.initialTheme || action.theme;
+ this.props.setActiveTheme(themeToUse);
+ window.AWSelectTheme(themeToUse);
+ }
+
+ // If the action has persistActiveTheme: true, we set the initial theme to the currently active theme
+ // so that it can be reverted to in the event that the user navigates away from the screen
+ if (action.persistActiveTheme) {
+ this.props.setInitialTheme(this.props.activeTheme);
+ }
+
+ // `navigate` and `dismiss` can be true/false/undefined, or they can be a
+ // string "actionResult" in which case we should use the actionResult
+ // (boolean resolved by handleUserAction)
+ const shouldDoBehavior = behavior => behavior === "actionResult" ? actionResult : behavior;
+ if (shouldDoBehavior(action.navigate)) {
+ props.navigate();
+ }
+ if (shouldDoBehavior(action.dismiss)) {
+ window.AWFinish();
+ }
+ }
+ setMultiSelectActions(action) {
+ let {
+ props
+ } = this;
+ // Populate MULTI_ACTION data actions property with selected checkbox
+ // actions from tiles data
+ if (action.type !== "MULTI_ACTION") {
+ console.error("collectSelect is only supported for MULTI_ACTION type actions");
+ action.type = "MULTI_ACTION";
+ }
+ if (!Array.isArray(action.data?.actions)) {
+ console.error("collectSelect is only supported for MULTI_ACTION type actions with an array of actions");
+ action.data = {
+ actions: []
+ };
+ }
+
+ // Prepend the multi-select actions to the CTA's actions array, but keep
+ // the actions in the same order they appear in. This way the CTA action
+ // can go last, after the multi-select actions are processed. For example,
+ // 1. checkbox action 1
+ // 2. checkbox action 2
+ // 3. radio action
+ // 4. CTA action (which perhaps depends on the radio action)
+ let multiSelectActions = [];
+ for (const checkbox of props.content?.tiles?.data ?? []) {
+ let checkboxAction;
+ if (props.activeMultiSelect?.includes(checkbox.id)) {
+ checkboxAction = checkbox.checkedAction ?? checkbox.action;
+ } else {
+ checkboxAction = checkbox.uncheckedAction;
+ }
+ if (checkboxAction) {
+ multiSelectActions.push(checkboxAction);
+ }
+ }
+ action.data.actions.unshift(...multiSelectActions);
+
+ // Send telemetry with selected checkbox ids
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(props.messageId, props.activeMultiSelect, "SELECT_CHECKBOX");
+ }
+ render() {
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_3__.MultiStageProtonScreen, {
+ content: this.props.content,
+ id: this.props.id,
+ order: this.props.order,
+ previousOrder: this.props.previousOrder,
+ activeTheme: this.props.activeTheme,
+ screenMultiSelects: this.props.screenMultiSelects,
+ setScreenMultiSelects: this.props.setScreenMultiSelects,
+ activeMultiSelect: this.props.activeMultiSelect,
+ setActiveMultiSelect: this.props.setActiveMultiSelect,
+ totalNumberOfScreens: this.props.totalNumberOfScreens,
+ appAndSystemLocaleInfo: this.props.appAndSystemLocaleInfo,
+ negotiatedLanguage: this.props.negotiatedLanguage,
+ langPackInstallPhase: this.props.langPackInstallPhase,
+ handleAction: this.handleAction,
+ messageId: this.props.messageId,
+ isFirstScreen: this.props.isFirstScreen,
+ isLastScreen: this.props.isLastScreen,
+ isSingleScreen: this.props.isSingleScreen,
+ startsWithCorner: this.props.startsWithCorner,
+ autoAdvance: this.props.autoAdvance,
+ forceHideStepsIndicator: this.props.forceHideStepsIndicator,
+ ariaRole: this.props.ariaRole,
+ aboveButtonStepsIndicator: this.props.aboveButtonStepsIndicator
+ });
+ }
+}
+
+/***/ }),
+/* 5 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "CONFIGURABLE_STYLES": () => (/* binding */ CONFIGURABLE_STYLES),
+/* harmony export */ "Localized": () => (/* binding */ Localized)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+const CONFIGURABLE_STYLES = ["color", "fontSize", "fontWeight", "letterSpacing", "lineHeight", "marginBlock", "marginInline", "paddingBlock", "paddingInline", "whiteSpace"];
+const ZAP_SIZE_THRESHOLD = 160;
+
+/**
+ * Based on the .text prop, localizes an inner element if a string_id
+ * is provided, OR renders plain text, OR hides it if nothing is provided.
+ * Allows configuring of some styles including zap underline and color.
+ *
+ * Examples:
+ *
+ * Localized text
+ * ftl:
+ * title = Welcome
+ * jsx:
+ * <Localized text={{string_id: "title"}}><h1 /></Localized>
+ * output:
+ * <h1 data-l10n-id="title">Welcome</h1>
+ *
+ * Unlocalized text
+ * jsx:
+ * <Localized text="Welcome"><h1 /></Localized>
+ * <Localized text={{raw: "Welcome"}}><h1 /></Localized>
+ * output:
+ * <h1>Welcome</h1>
+ */
+
+const Localized = ({
+ text,
+ children
+}) => {
+ // Dynamically determine the size of the zap style.
+ const zapRef = /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createRef();
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ const {
+ current
+ } = zapRef;
+ if (current) {
+ requestAnimationFrame(() => current?.classList.replace("short", current.getBoundingClientRect().width > ZAP_SIZE_THRESHOLD ? "long" : "short"));
+ }
+ });
+
+ // Skip rendering of children with no text.
+ if (!text) {
+ return null;
+ }
+
+ // Allow augmenting existing child container properties.
+ const props = {
+ children: [],
+ className: "",
+ style: {},
+ ...children?.props
+ };
+ // Support nested Localized by starting with their children.
+ const textNodes = Array.isArray(props.children) ? props.children : [props.children];
+
+ // Pick desired fluent or raw/plain text to render.
+ if (text.string_id) {
+ // Set the key so React knows not to reuse when switching to plain text.
+ props.key = text.string_id;
+ props["data-l10n-id"] = text.string_id;
+ if (text.args) {
+ props["data-l10n-args"] = JSON.stringify(text.args);
+ }
+ } else if (text.raw) {
+ textNodes.push(text.raw);
+ } else if (typeof text === "string") {
+ textNodes.push(text);
+ }
+
+ // Add zap style and content in a way that allows fluent to insert too.
+ if (text.zap) {
+ props.className += " welcomeZap";
+ textNodes.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "short zap",
+ "data-l10n-name": "zap",
+ ref: zapRef
+ }, text.zap));
+ }
+ if (text.aria_label) {
+ props["aria-label"] = text.aria_label;
+ }
+
+ // Apply certain configurable styles.
+ CONFIGURABLE_STYLES.forEach(style => {
+ if (text[style] !== undefined) {
+ props.style[style] = text[style];
+ }
+ });
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().cloneElement(
+ // Provide a default container for the text if necessary.
+ children ?? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", null), props,
+ // Conditionally pass in as void elements can't accept empty array.
+ textNodes.length ? textNodes : null);
+};
+
+/***/ }),
+/* 6 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "MultiStageProtonScreen": () => (/* binding */ MultiStageProtonScreen),
+/* harmony export */ "ProtonScreenActionButtons": () => (/* binding */ ProtonScreenActionButtons),
+/* harmony export */ "ProtonScreen": () => (/* binding */ ProtonScreen)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
+/* harmony import */ var _MobileDownloads__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(7);
+/* harmony import */ var _MultiSelect__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(8);
+/* harmony import */ var _Themes__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(9);
+/* harmony import */ var _MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(4);
+/* harmony import */ var _LanguageSwitcher__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(10);
+/* harmony import */ var _CTAParagraph__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(11);
+/* harmony import */ var _HeroImage__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(12);
+/* harmony import */ var _OnboardingVideo__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(13);
+/* harmony import */ var _AdditionalCTA__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(14);
+/* harmony import */ var _EmbeddedMigrationWizard__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(16);
+/* harmony import */ var _AddonsPicker__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(17);
+/* harmony import */ var _LinkParagraph__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(18);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const MultiStageProtonScreen = props => {
+ const {
+ autoAdvance,
+ handleAction,
+ order
+ } = props;
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ if (autoAdvance) {
+ const timer = setTimeout(() => {
+ handleAction({
+ currentTarget: {
+ value: autoAdvance
+ },
+ name: "AUTO_ADVANCE"
+ });
+ }, 20000);
+ return () => clearTimeout(timer);
+ }
+ return () => {};
+ }, [autoAdvance, handleAction, order]);
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProtonScreen, {
+ content: props.content,
+ id: props.id,
+ order: props.order,
+ activeTheme: props.activeTheme,
+ screenMultiSelects: props.screenMultiSelects,
+ setScreenMultiSelects: props.setScreenMultiSelects,
+ activeMultiSelect: props.activeMultiSelect,
+ setActiveMultiSelect: props.setActiveMultiSelect,
+ totalNumberOfScreens: props.totalNumberOfScreens,
+ handleAction: props.handleAction,
+ isFirstScreen: props.isFirstScreen,
+ isLastScreen: props.isLastScreen,
+ isSingleScreen: props.isSingleScreen,
+ previousOrder: props.previousOrder,
+ autoAdvance: props.autoAdvance,
+ isRtamo: props.isRtamo,
+ addonName: props.addonName,
+ isTheme: props.isTheme,
+ iconURL: props.iconURL,
+ messageId: props.messageId,
+ negotiatedLanguage: props.negotiatedLanguage,
+ langPackInstallPhase: props.langPackInstallPhase,
+ forceHideStepsIndicator: props.forceHideStepsIndicator,
+ ariaRole: props.ariaRole,
+ aboveButtonStepsIndicator: props.aboveButtonStepsIndicator
+ });
+};
+const ProtonScreenActionButtons = props => {
+ const {
+ content,
+ addonName,
+ activeMultiSelect
+ } = props;
+ const defaultValue = content.checkbox?.defaultValue;
+ const [isChecked, setIsChecked] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(defaultValue || false);
+ const buttonRef = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);
+ const shouldFocusButton = content?.primary_button?.should_focus_button;
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ if (shouldFocusButton) {
+ buttonRef.current?.focus();
+ }
+ }, [shouldFocusButton]);
+ if (!content.primary_button && !content.secondary_button && !content.additional_button) {
+ return null;
+ }
+
+ // If we have a multi-select screen, we want to disable the primary button
+ // until the user has selected at least one item.
+ const isPrimaryDisabled = primaryDisabledValue => primaryDisabledValue === "hasActiveMultiSelect" ? !(activeMultiSelect?.length > 0) : primaryDisabledValue;
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: `action-buttons ${content.additional_button ? "additional-cta-container" : ""}`,
+ flow: content.additional_button?.flow,
+ alignment: content.additional_button?.alignment
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.primary_button?.label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ ref: buttonRef,
+ className: `${content.primary_button?.style ?? "primary"}${content.primary_button?.has_arrow_icon ? " arrow-icon" : ""}`
+ // Whether or not the checkbox is checked determines which action
+ // should be handled. By setting value here, we indicate to
+ // this.handleAction() where in the content tree it should take
+ // the action to execute from.
+ ,
+ value: isChecked ? "checkbox" : "primary_button",
+ disabled: isPrimaryDisabled(content.primary_button?.disabled),
+ onClick: props.handleAction,
+ "data-l10n-args": addonName ? JSON.stringify({
+ "addon-name": addonName
+ }) : ""
+ })), content.additional_button ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AdditionalCTA__WEBPACK_IMPORTED_MODULE_11__.AdditionalCTA, {
+ content: content,
+ handleAction: props.handleAction
+ }) : null, content.checkbox ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "checkbox-container"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "checkbox",
+ id: "action-checkbox",
+ checked: isChecked,
+ onChange: () => {
+ setIsChecked(!isChecked);
+ }
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.checkbox.label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: "action-checkbox"
+ }))) : null, content.secondary_button ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_6__.SecondaryCTA, {
+ content: content,
+ handleAction: props.handleAction,
+ activeMultiSelect: activeMultiSelect
+ }) : null);
+};
+class ProtonScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ componentDidMount() {
+ this.mainContentHeader.focus();
+ }
+ getScreenClassName(isFirstScreen, isLastScreen, includeNoodles, isVideoOnboarding, isAddonsPicker) {
+ const screenClass = `screen-${this.props.order % 2 !== 0 ? 1 : 2}`;
+ if (isVideoOnboarding) {
+ return "with-video";
+ }
+ if (isAddonsPicker) {
+ return "addons-picker";
+ }
+ return `${isFirstScreen ? `dialog-initial` : ``} ${isLastScreen ? `dialog-last` : ``} ${includeNoodles ? `with-noodles` : ``} ${screenClass}`;
+ }
+ renderTitle({
+ title,
+ title_logo
+ }) {
+ if (title_logo) {
+ const {
+ alignment,
+ ...rest
+ } = title_logo;
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "inline-icon-container",
+ alignment: alignment ?? "center"
+ }, this.renderPicture({
+ ...rest
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: title
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h1", {
+ id: "mainContentHeader"
+ })));
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: title
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h1", {
+ id: "mainContentHeader"
+ }));
+ }
+ renderPicture({
+ imageURL = "chrome://branding/content/about-logo.svg",
+ darkModeImageURL,
+ reducedMotionImageURL,
+ darkModeReducedMotionImageURL,
+ alt = "",
+ width,
+ height,
+ marginBlock,
+ marginInline,
+ className = "logo-container"
+ }) {
+ function getLoadingStrategy() {
+ for (let url of [imageURL, darkModeImageURL, reducedMotionImageURL, darkModeReducedMotionImageURL]) {
+ if (_lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(url) === "lazy") {
+ return "lazy";
+ }
+ }
+ return "eager";
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("picture", {
+ className: className,
+ style: {
+ marginInline,
+ marginBlock
+ }
+ }, darkModeReducedMotionImageURL ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("source", {
+ srcSet: darkModeReducedMotionImageURL,
+ media: "(prefers-color-scheme: dark) and (prefers-reduced-motion: reduce)"
+ }) : null, darkModeImageURL ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("source", {
+ srcSet: darkModeImageURL,
+ media: "(prefers-color-scheme: dark)"
+ }) : null, reducedMotionImageURL ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("source", {
+ srcSet: reducedMotionImageURL,
+ media: "(prefers-reduced-motion: reduce)"
+ }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: alt
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "sr-only logo-alt"
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ className: "brand-logo",
+ style: {
+ height,
+ width
+ },
+ src: imageURL,
+ alt: "",
+ loading: getLoadingStrategy(),
+ role: alt ? null : "presentation"
+ }));
+ }
+ renderContentTiles() {
+ const {
+ content
+ } = this.props;
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, content.tiles && content.tiles.type === "addons-picker" && content.tiles.data ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_AddonsPicker__WEBPACK_IMPORTED_MODULE_13__.AddonsPicker, {
+ content: content,
+ message_id: this.props.messageId,
+ handleAction: this.props.handleAction
+ }) : null, content.tiles && content.tiles.type === "theme" && content.tiles.data ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_Themes__WEBPACK_IMPORTED_MODULE_5__.Themes, {
+ content: content,
+ activeTheme: this.props.activeTheme,
+ handleAction: this.props.handleAction
+ }) : null, content.tiles && content.tiles.type === "mobile_downloads" && content.tiles.data ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MobileDownloads__WEBPACK_IMPORTED_MODULE_3__.MobileDownloads, {
+ data: content.tiles.data,
+ handleAction: this.props.handleAction
+ }) : null, content.tiles && content.tiles.type === "multiselect" && content.tiles.data ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiSelect__WEBPACK_IMPORTED_MODULE_4__.MultiSelect, {
+ content: content,
+ screenMultiSelects: this.props.screenMultiSelects,
+ setScreenMultiSelects: this.props.setScreenMultiSelects,
+ activeMultiSelect: this.props.activeMultiSelect,
+ setActiveMultiSelect: this.props.setActiveMultiSelect
+ }) : null, content.tiles && content.tiles.type === "migration-wizard" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_EmbeddedMigrationWizard__WEBPACK_IMPORTED_MODULE_12__.EmbeddedMigrationWizard, {
+ handleAction: this.props.handleAction
+ }) : null);
+ }
+ renderNoodles() {
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "noodle orange-L"
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "noodle purple-C"
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "noodle solid-L"
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "noodle outline-L"
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "noodle yellow-circle"
+ }));
+ }
+ renderLanguageSwitcher() {
+ return this.props.content.languageSwitcher ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_LanguageSwitcher__WEBPACK_IMPORTED_MODULE_7__.LanguageSwitcher, {
+ content: this.props.content,
+ handleAction: this.props.handleAction,
+ negotiatedLanguage: this.props.negotiatedLanguage,
+ langPackInstallPhase: this.props.langPackInstallPhase,
+ messageId: this.props.messageId
+ }) : null;
+ }
+ renderDismissButton() {
+ const {
+ size,
+ marginBlock,
+ marginInline,
+ label
+ } = this.props.content.dismiss_button;
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "dismiss-button",
+ onClick: this.props.handleAction,
+ value: "dismiss_button",
+ "data-l10n-id": label?.string_id || "spotlight-dialog-close-button",
+ "button-size": size,
+ style: {
+ marginBlock,
+ marginInline
+ }
+ });
+ }
+ renderStepsIndicator() {
+ const currentStep = (this.props.order ?? 0) + 1;
+ const previousStep = (this.props.previousOrder ?? -1) + 1;
+ const {
+ content,
+ totalNumberOfScreens: total
+ } = this.props;
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ id: "steps",
+ className: `steps${content.progress_bar ? " progress-bar" : ""}`,
+ "data-l10n-id": content.steps_indicator?.string_id || "onboarding-welcome-steps-indicator-label",
+ "data-l10n-args": JSON.stringify({
+ current: currentStep,
+ total: total ?? 0
+ }),
+ "data-l10n-attrs": "aria-label",
+ role: "progressbar",
+ "aria-valuenow": currentStep,
+ "aria-valuemin": 1,
+ "aria-valuemax": total
+ }, content.progress_bar ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_6__.ProgressBar, {
+ step: currentStep,
+ previousStep: previousStep,
+ totalNumberOfScreens: total
+ }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_6__.StepsIndicator, {
+ order: this.props.order,
+ totalNumberOfScreens: total
+ }));
+ }
+ renderSecondarySection(content) {
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: `section-secondary ${content.hide_secondary_section ? "with-secondary-section-hidden" : ""}`,
+ style: content.background ? {
+ background: content.background,
+ "--mr-secondary-background-position-y": content.split_narrow_bkg_position
+ } : {}
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.image_alt_text
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "sr-only image-alt",
+ role: "img"
+ })), content.hero_image ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_HeroImage__WEBPACK_IMPORTED_MODULE_9__.HeroImage, {
+ url: content.hero_image.url
+ }) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "message-text"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "spacer-top"
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.hero_text
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h1", null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "spacer-bottom"
+ }))));
+ }
+ renderOrderedContent(content) {
+ const elements = [];
+ for (const item of content) {
+ switch (item.type) {
+ case "text":
+ elements.push( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_LinkParagraph__WEBPACK_IMPORTED_MODULE_14__.LinkParagraph, {
+ text_content: item,
+ handleAction: this.props.handleAction
+ }));
+ break;
+ case "image":
+ elements.push(this.renderPicture({
+ imageURL: item.url,
+ darkModeImageURL: item.darkModeImageURL,
+ height: item.height,
+ width: item.width,
+ alt: item.alt_text,
+ marginInline: item.marginInline,
+ className: "inline-image"
+ }));
+ }
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), null, elements);
+ }
+ render() {
+ const {
+ autoAdvance,
+ content,
+ isRtamo,
+ isTheme,
+ isFirstScreen,
+ isLastScreen,
+ isSingleScreen,
+ forceHideStepsIndicator,
+ ariaRole,
+ aboveButtonStepsIndicator
+ } = this.props;
+ const includeNoodles = content.has_noodles;
+ // The default screen position is "center"
+ const isCenterPosition = content.position === "center" || !content.position;
+ const hideStepsIndicator = autoAdvance || content?.video_container || isSingleScreen || forceHideStepsIndicator;
+ const textColorClass = content.text_color ? `${content.text_color}-text` : "";
+ // Assign proton screen style 'screen-1' or 'screen-2' to centered screens
+ // by checking if screen order is even or odd.
+ const screenClassName = isCenterPosition ? this.getScreenClassName(isFirstScreen, isLastScreen, includeNoodles, content?.video_container, content.tiles?.type === "addons-picker") : "";
+ const isEmbeddedMigration = content.tiles?.type === "migration-wizard";
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("main", {
+ className: `screen ${this.props.id || ""}
+ ${screenClassName} ${textColorClass}`,
+ role: ariaRole ?? "alertdialog",
+ layout: content.layout,
+ pos: content.position || "center",
+ tabIndex: "-1",
+ "aria-labelledby": "mainContentHeader",
+ ref: input => {
+ this.mainContentHeader = input;
+ }
+ }, isCenterPosition ? null : this.renderSecondarySection(content), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: `section-main ${isEmbeddedMigration ? "embedded-migration" : ""}`,
+ "hide-secondary-section": content.hide_secondary_section ? String(content.hide_secondary_section) : null,
+ role: "document"
+ }, content.secondary_button_top ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_6__.SecondaryCTA, {
+ content: content,
+ handleAction: this.props.handleAction,
+ position: "top"
+ }) : null, includeNoodles ? this.renderNoodles() : null, content.dismiss_button ? this.renderDismissButton() : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: `main-content ${hideStepsIndicator ? "no-steps" : ""}`,
+ style: {
+ background: content.background && isCenterPosition ? content.background : null,
+ width: content.width && content.position !== "split" ? content.width : null
+ }
+ }, content.logo ? this.renderPicture(content.logo) : null, isRtamo ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "rtamo-icon"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ className: `${isTheme ? "rtamo-theme-icon" : "brand-logo"}`,
+ src: this.props.iconURL,
+ loading: _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(this.props.iconURL),
+ alt: "",
+ role: "presentation"
+ })) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "main-content-inner"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: `welcome-text ${content.title_style || ""}`
+ }, content.title ? this.renderTitle(content) : null, content.subtitle ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.subtitle
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", {
+ "data-l10n-args": JSON.stringify({
+ "addon-name": this.props.addonName,
+ ...this.props.appAndSystemLocaleInfo?.displayNames
+ }),
+ "aria-flowto": this.props.messageId?.includes("FEATURE_TOUR") ? "steps" : ""
+ })) : null, content.cta_paragraph ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_CTAParagraph__WEBPACK_IMPORTED_MODULE_8__.CTAParagraph, {
+ content: content.cta_paragraph,
+ handleAction: this.props.handleAction
+ }) : null), content.video_container ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_OnboardingVideo__WEBPACK_IMPORTED_MODULE_10__.OnboardingVideo, {
+ content: content.video_container,
+ handleAction: this.props.handleAction
+ }) : null, content.above_button_content ? this.renderOrderedContent(content.above_button_content) : null, this.renderContentTiles(), this.renderLanguageSwitcher(), !hideStepsIndicator && aboveButtonStepsIndicator ? this.renderStepsIndicator() : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(ProtonScreenActionButtons, {
+ content: content,
+ addonName: this.props.addonName,
+ handleAction: this.props.handleAction,
+ activeMultiSelect: this.props.activeMultiSelect
+ })), !hideStepsIndicator && !aboveButtonStepsIndicator ? this.renderStepsIndicator() : null)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.info_text
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "info-text"
+ })));
+ }
+}
+
+/***/ }),
+/* 7 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "MarketplaceButtons": () => (/* binding */ MarketplaceButtons),
+/* harmony export */ "MobileDownloads": () => (/* binding */ MobileDownloads)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+const MarketplaceButtons = props => {
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("ul", {
+ className: "mobile-download-buttons"
+ }, props.buttons.includes("ios") ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: "ios"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ "data-l10n-id": "spotlight-ios-marketplace-button",
+ value: "ios",
+ onClick: props.handleAction
+ })) : null, props.buttons.includes("android") ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("li", {
+ className: "android"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ "data-l10n-id": "spotlight-android-marketplace-button",
+ value: "android",
+ onClick: props.handleAction
+ })) : null);
+};
+const MobileDownloads = props => {
+ const {
+ QR_code: QRCode
+ } = props.data;
+ const showEmailLink = props.data.email && window.AWSendToDeviceEmailsSupported();
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "mobile-downloads"
+ }, QRCode ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ "data-l10n-id": QRCode.alt_text.string_id ? QRCode.alt_text.string_id : null,
+ className: "qr-code-image",
+ alt: typeof QRCode.alt_text === "string" ? QRCode.alt_text : "",
+ src: QRCode.image_url,
+ loading: _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.getLoadingStrategyFor(QRCode.image_url)
+ }) : null, showEmailLink ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: props.data.email.link_text
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "email-link",
+ value: "email_link",
+ onClick: props.handleAction
+ }))) : null, props.data.marketplace_buttons ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(MarketplaceButtons, {
+ buttons: props.data.marketplace_buttons,
+ handleAction: props.handleAction
+ }) : null);
+};
+
+/***/ }),
+/* 8 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "MultiSelect": () => (/* binding */ MultiSelect)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+const MULTI_SELECT_STYLES = [..._MSLocalized__WEBPACK_IMPORTED_MODULE_1__.CONFIGURABLE_STYLES, "flexDirection", "flexWrap", "flexFlow", "flexGrow", "flexShrink", "justifyContent", "alignItems", "gap"];
+const MULTI_SELECT_ICON_STYLES = [..._MSLocalized__WEBPACK_IMPORTED_MODULE_1__.CONFIGURABLE_STYLES, "width", "height", "background", "backgroundColor", "backgroundImage", "backgroundSize", "backgroundPosition", "backgroundRepeat", "backgroundOrigin", "backgroundClip", "border", "borderRadius", "appearance", "fill", "stroke", "outline", "outlineOffset", "boxShadow"];
+function getValidStyle(style, validStyles, allowVars) {
+ if (!style) {
+ return null;
+ }
+ return Object.keys(style).filter(key => validStyles.includes(key) || allowVars && key.startsWith("--")).reduce((obj, key) => {
+ obj[key] = style[key];
+ return obj;
+ }, {});
+}
+const MultiSelect = ({
+ content,
+ screenMultiSelects,
+ setScreenMultiSelects,
+ activeMultiSelect,
+ setActiveMultiSelect
+}) => {
+ const {
+ data
+ } = content.tiles;
+ const refs = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({});
+ const handleChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {
+ const newActiveMultiSelect = [];
+ Object.keys(refs.current).forEach(key => {
+ if (refs.current[key]?.checked) {
+ newActiveMultiSelect.push(key);
+ }
+ });
+ setActiveMultiSelect(newActiveMultiSelect);
+ }, [setActiveMultiSelect]);
+ const items = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {
+ function getOrderedIds() {
+ if (screenMultiSelects) {
+ return screenMultiSelects;
+ }
+ let orderedIds = data.map(item => ({
+ id: item.id,
+ rank: item.randomize ? Math.random() : NaN
+ })).sort((a, b) => b.rank - a.rank).map(({
+ id
+ }) => id);
+ setScreenMultiSelects(orderedIds);
+ return orderedIds;
+ }
+ return getOrderedIds().map(id => data.find(item => item.id === id));
+ }, [] // eslint-disable-line react-hooks/exhaustive-deps
+ );
+ const containerStyle = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => getValidStyle(content.tiles.style, MULTI_SELECT_STYLES, true), [content.tiles.style]);
+
+ // When screen renders for first time, update state
+ // with checkbox ids that has defaultvalue true
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ if (!activeMultiSelect) {
+ let newActiveMultiSelect = [];
+ items.forEach(({
+ id,
+ defaultValue
+ }) => {
+ if (defaultValue && id) {
+ newActiveMultiSelect.push(id);
+ }
+ });
+ setActiveMultiSelect(newActiveMultiSelect);
+ }
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "multi-select-container",
+ style: containerStyle,
+ role: items.some(({
+ type,
+ group
+ }) => type === "radio" && group) ? "radiogroup" : "group",
+ "aria-labelledby": "multi-stage-multi-select-label"
+ }, content.tiles.label ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.tiles.label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", {
+ id: "multi-stage-multi-select-label"
+ })) : null, items.map(({
+ id,
+ label,
+ icon,
+ type = "checkbox",
+ group,
+ style
+ }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ key: id + label,
+ className: "checkbox-container multi-select-item",
+ style: getValidStyle(style, MULTI_SELECT_STYLES)
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: type // checkbox or radio
+ ,
+ id: id,
+ value: id,
+ name: group,
+ checked: activeMultiSelect?.includes(id),
+ style: getValidStyle(icon?.style, MULTI_SELECT_ICON_STYLES),
+ onChange: handleChange,
+ ref: el => refs.current[id] = el
+ }), label ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ htmlFor: id
+ })) : null)));
+};
+
+/***/ }),
+/* 9 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "Themes": () => (/* binding */ Themes)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+const Themes = props => {
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "tiles-theme-container"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("fieldset", {
+ className: "tiles-theme-section"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: props.content.subtitle
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("legend", {
+ className: "sr-only"
+ })), props.content.tiles.data.map(({
+ theme,
+ label,
+ tooltip,
+ description
+ }) => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ key: theme + label,
+ text: typeof tooltip === "object" ? tooltip : {}
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("label", {
+ className: "theme",
+ title: theme + label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: typeof description === "object" ? description : {}
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("input", {
+ type: "radio",
+ value: theme,
+ name: "theme",
+ checked: theme === props.activeTheme,
+ className: "sr-only input",
+ onClick: props.handleAction
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: `icon ${theme === props.activeTheme ? " selected" : ""} ${theme}`
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "text"
+ }))))))));
+};
+
+/***/ }),
+/* 10 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "useLanguageSwitcher": () => (/* binding */ useLanguageSwitcher),
+/* harmony export */ "LanguageSwitcher": () => (/* binding */ LanguageSwitcher)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+
+/**
+ * The language switcher implements a hook that should be placed at a higher level
+ * than the actual language switcher component, as it needs to preemptively fetch
+ * and install langpacks for the user if there is a language mismatch screen.
+ */
+function useLanguageSwitcher(appAndSystemLocaleInfo, screens, screenIndex, setScreenIndex) {
+ const languageMismatchScreenIndex = screens.findIndex(({
+ id
+ }) => id === "AW_LANGUAGE_MISMATCH");
+ const screen = screens[languageMismatchScreenIndex];
+
+ // Ensure fluent messages have the negotiatedLanguage args set, as they are rendered
+ // before the negotiatedLanguage is known. If the arg isn't present then Firefox will
+ // crash in development mode.
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ if (screen?.content?.languageSwitcher) {
+ for (const text of Object.values(screen.content.languageSwitcher)) {
+ if (text?.args && text.args.negotiatedLanguage === undefined) {
+ text.args.negotiatedLanguage = "";
+ }
+ }
+ }
+ }, [screen]);
+
+ // If there is a mismatch, then Firefox can negotiate a better langpack to offer
+ // the user.
+ const [negotiatedLanguage, setNegotiatedLanguage] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function getNegotiatedLanguage() {
+ if (!appAndSystemLocaleInfo) {
+ return;
+ }
+ if (appAndSystemLocaleInfo.matchType !== "language-mismatch") {
+ // There is no language mismatch, so there is no need to negotiate a langpack.
+ return;
+ }
+ (async () => {
+ const {
+ langPack,
+ langPackDisplayName
+ } = await window.AWNegotiateLangPackForLanguageMismatch(appAndSystemLocaleInfo);
+ if (langPack) {
+ setNegotiatedLanguage({
+ langPackDisplayName,
+ appDisplayName: appAndSystemLocaleInfo.displayNames.appLanguage,
+ langPack,
+ requestSystemLocales: [langPack.target_locale, appAndSystemLocaleInfo.appLocaleRaw],
+ originalAppLocales: [appAndSystemLocaleInfo.appLocaleRaw]
+ });
+ } else {
+ setNegotiatedLanguage({
+ langPackDisplayName: null,
+ appDisplayName: null,
+ langPack: null,
+ requestSystemLocales: null
+ });
+ }
+ })();
+ }, [appAndSystemLocaleInfo]);
+
+ /**
+ * @type {
+ * "before-installation"
+ * | "installing"
+ * | "installed"
+ * | "installation-error"
+ * | "none-available"
+ * }
+ */
+ const [langPackInstallPhase, setLangPackInstallPhase] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)("before-installation");
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function ensureLangPackInstalled() {
+ if (!negotiatedLanguage) {
+ // There are no negotiated languages to download yet.
+ return;
+ }
+ setLangPackInstallPhase("installing");
+ window.AWEnsureLangPackInstalled(negotiatedLanguage, screen?.content).then(content => {
+ // Update screen content with strings that might have changed.
+ screen.content = content;
+ setLangPackInstallPhase("installed");
+ }, error => {
+ console.error(error);
+ setLangPackInstallPhase("installation-error");
+ });
+ }, [negotiatedLanguage, screen]);
+ const [languageFilteredScreens, setLanguageFilteredScreens] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(screens);
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function filterScreen() {
+ // Remove the language screen if it exists (already removed for no live
+ // reload) and we either don't-need-to or can't switch.
+ if (screen && (appAndSystemLocaleInfo?.matchType !== "language-mismatch" || negotiatedLanguage?.langPack === null)) {
+ if (screenIndex > languageMismatchScreenIndex) {
+ setScreenIndex(screenIndex - 1);
+ }
+ setLanguageFilteredScreens(screens.filter(s => s.id !== "AW_LANGUAGE_MISMATCH"));
+ } else {
+ setLanguageFilteredScreens(screens);
+ }
+ },
+ // Removing screenIndex as a dependency as it's causing infinite re-renders (1873019)
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ [appAndSystemLocaleInfo?.matchType, languageMismatchScreenIndex, negotiatedLanguage, screen, screens, setScreenIndex]);
+ return {
+ negotiatedLanguage,
+ langPackInstallPhase,
+ languageFilteredScreens
+ };
+}
+
+/**
+ * The language switcher is a separate component as it needs to perform some asynchronous
+ * network actions such as retrieving the list of langpacks available, and downloading
+ * a new langpack. On a fast connection, this won't be noticeable, but on slow or unreliable
+ * internet this may fail for a user.
+ */
+function LanguageSwitcher(props) {
+ const {
+ content,
+ handleAction,
+ negotiatedLanguage,
+ langPackInstallPhase,
+ messageId
+ } = props;
+ const [isAwaitingLangpack, setIsAwaitingLangpack] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
+
+ // Determine the status of the langpack installation.
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ if (isAwaitingLangpack && langPackInstallPhase !== "installing") {
+ window.AWSetRequestedLocales(negotiatedLanguage.requestSystemLocales);
+ requestAnimationFrame(() => {
+ handleAction(
+ // Simulate the click event.
+ {
+ currentTarget: {
+ value: "download_complete"
+ }
+ });
+ });
+ }
+ }, [handleAction, isAwaitingLangpack, langPackInstallPhase, negotiatedLanguage?.requestSystemLocales]);
+ let showWaitingScreen = false;
+ let showPreloadingScreen = false;
+ let showReadyScreen = false;
+ if (isAwaitingLangpack && langPackInstallPhase !== "installed") {
+ showWaitingScreen = true;
+ } else if (langPackInstallPhase === "before-installation") {
+ showPreloadingScreen = true;
+ } else {
+ showReadyScreen = true;
+ }
+
+ // Use {display: "none"} rather than if statements to prevent layout thrashing with
+ // the localized text elements rendering as blank, then filling in the text.
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "action-buttons language-switcher-container"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ style: {
+ display: showPreloadingScreen ? "block" : "none"
+ }
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "primary",
+ value: "primary_button",
+ disabled: true,
+ type: "button"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ className: "language-loader",
+ src: "chrome://browser/skin/tabbrowser/tab-connecting.png",
+ alt: ""
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.languageSwitcher.waiting
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "secondary-cta"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.languageSwitcher.skip
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ value: "decline_waiting",
+ type: "button",
+ className: "secondary text-link arrow-icon",
+ onClick: handleAction
+ })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ style: {
+ display: showWaitingScreen ? "block" : "none"
+ }
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "primary",
+ value: "primary_button",
+ disabled: true,
+ type: "button"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ className: "language-loader",
+ src: "chrome://browser/skin/tabbrowser/tab-connecting.png",
+ alt: ""
+ }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.languageSwitcher.downloading
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "secondary-cta"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.languageSwitcher.cancel
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ type: "button",
+ className: "secondary text-link",
+ onClick: () => {
+ setIsAwaitingLangpack(false);
+ handleAction({
+ currentTarget: {
+ value: "cancel_waiting"
+ }
+ });
+ }
+ })))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ style: {
+ display: showReadyScreen ? "block" : "none"
+ }
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "primary",
+ value: "primary_button",
+ onClick: () => {
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendActionTelemetry(messageId, "download_langpack");
+ setIsAwaitingLangpack(true);
+ }
+ }, content.languageSwitcher.switch ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.languageSwitcher.switch
+ }) :
+ // This is the localized name from the Intl.DisplayNames API.
+ negotiatedLanguage?.langPackDisplayName)), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ type: "button",
+ className: "primary",
+ value: "decline",
+ onClick: event => {
+ window.AWSetRequestedLocales(negotiatedLanguage.originalAppLocales);
+ handleAction(event);
+ }
+ }, content.languageSwitcher.continue ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.languageSwitcher.continue
+ }) :
+ // This is the localized name from the Intl.DisplayNames API.
+ negotiatedLanguage?.appDisplayName))));
+}
+
+/***/ }),
+/* 11 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "CTAParagraph": () => (/* binding */ CTAParagraph)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+const CTAParagraph = props => {
+ const {
+ content,
+ handleAction
+ } = props;
+ if (!content?.text) {
+ return null;
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("h2", {
+ className: "cta-paragraph"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.text
+ }, content.text.string_name && typeof handleAction === "function" ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ "data-l10n-id": content.text.string_id,
+ onClick: handleAction,
+ onKeyUp: event => ["Enter", " "].includes(event.key) ? handleAction(event) : null,
+ value: "cta_paragraph",
+ role: "button",
+ tabIndex: "0"
+ }, " ", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ role: "button",
+ tabIndex: "0",
+ "data-l10n-name": content.text.string_name
+ }, " ")) : null));
+};
+
+/***/ }),
+/* 12 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "HeroImage": () => (/* binding */ HeroImage)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+const HeroImage = props => {
+ const {
+ height,
+ url,
+ alt
+ } = props;
+ if (!url) {
+ return null;
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "hero-image"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ style: height ? {
+ height
+ } : null,
+ src: url,
+ loading: _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.getLoadingStrategyFor(url),
+ alt: alt || "",
+ role: alt ? null : "presentation"
+ }));
+};
+
+/***/ }),
+/* 13 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "OnboardingVideo": () => (/* binding */ OnboardingVideo)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+const OnboardingVideo = props => {
+ const vidUrl = props.content.video_url;
+ const autoplay = props.content.autoPlay;
+ const handleVideoAction = event => {
+ props.handleAction({
+ currentTarget: {
+ value: event
+ }
+ });
+ };
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("video", {
+ // eslint-disable-line jsx-a11y/media-has-caption
+ controls: true,
+ autoPlay: autoplay,
+ src: vidUrl,
+ width: "604px",
+ height: "340px",
+ onPlay: () => handleVideoAction("video_start"),
+ onEnded: () => handleVideoAction("video_end")
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("source", {
+ src: vidUrl
+ })));
+};
+
+/***/ }),
+/* 14 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "AdditionalCTA": () => (/* binding */ AdditionalCTA)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* harmony import */ var _SubmenuButton__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(15);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+const AdditionalCTA = ({
+ content,
+ handleAction
+}) => {
+ let buttonStyle = "";
+ const isSplitButton = content.submenu_button?.attached_to === "additional_button";
+ let className = "additional-cta-box";
+ if (isSplitButton) {
+ className += " split-button-container";
+ }
+ if (!content.additional_button?.style) {
+ buttonStyle = "primary";
+ } else {
+ buttonStyle = content.additional_button?.style === "link" ? "cta-link" : content.additional_button?.style;
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: className
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.additional_button?.label
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: `${buttonStyle} additional-cta`,
+ onClick: handleAction,
+ value: "additional_button",
+ disabled: content.additional_button?.disabled === true
+ })), isSplitButton ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_SubmenuButton__WEBPACK_IMPORTED_MODULE_2__.SubmenuButton, {
+ content: content,
+ handleAction: handleAction
+ }) : null);
+};
+
+/***/ }),
+/* 15 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "SubmenuButton": () => (/* binding */ SubmenuButton)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+const SubmenuButton = props => {
+ return document.createXULElement ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(SubmenuButtonInner, props) : null;
+};
+function translateMenuitem(item, element) {
+ let {
+ label
+ } = item;
+ if (!label) {
+ return;
+ }
+ if (label.raw) {
+ element.setAttribute("label", label.raw);
+ }
+ if (label.access_key) {
+ element.setAttribute("accesskey", label.access_key);
+ }
+ if (label.aria_label) {
+ element.setAttribute("aria-label", label.aria_label);
+ }
+ if (label.tooltip_text) {
+ element.setAttribute("tooltiptext", label.tooltip_text);
+ }
+ if (label.string_id) {
+ element.setAttribute("data-l10n-id", label.string_id);
+ if (label.args) {
+ element.setAttribute("data-l10n-args", JSON.stringify(label.args));
+ }
+ }
+}
+function addMenuitems(items, popup) {
+ for (let item of items) {
+ switch (item.type) {
+ case "separator":
+ popup.appendChild(document.createXULElement("menuseparator"));
+ break;
+ case "menu":
+ let menu = document.createXULElement("menu");
+ menu.className = "fxms-multi-stage-menu";
+ translateMenuitem(item, menu);
+ if (item.id) {
+ menu.value = item.id;
+ }
+ if (item.icon) {
+ menu.classList.add("menu-iconic");
+ menu.setAttribute("image", item.icon);
+ }
+ popup.appendChild(menu);
+ let submenuPopup = document.createXULElement("menupopup");
+ menu.appendChild(submenuPopup);
+ addMenuitems(item.submenu, submenuPopup);
+ break;
+ case "action":
+ let menuitem = document.createXULElement("menuitem");
+ translateMenuitem(item, menuitem);
+ menuitem.config = item;
+ if (item.id) {
+ menuitem.value = item.id;
+ }
+ if (item.icon) {
+ menuitem.classList.add("menuitem-iconic");
+ menuitem.setAttribute("image", item.icon);
+ }
+ popup.appendChild(menuitem);
+ break;
+ }
+ }
+}
+const SubmenuButtonInner = ({
+ content,
+ handleAction
+}) => {
+ const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);
+ const isPrimary = content.submenu_button?.style === "primary";
+ const onCommand = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(event => {
+ let {
+ config
+ } = event.target;
+ let mockEvent = {
+ currentTarget: ref.current,
+ source: config.id,
+ name: "command",
+ action: config.action
+ };
+ handleAction(mockEvent);
+ }, [handleAction]);
+ const onClick = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {
+ let button = ref.current;
+ let submenu = button?.querySelector(".fxms-multi-stage-submenu");
+ if (submenu && !button.hasAttribute("open")) {
+ submenu.openPopup(button, {
+ position: "after_end"
+ });
+ }
+ }, []);
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ let button = ref.current;
+ if (!button || button.querySelector(".fxms-multi-stage-submenu")) {
+ return null;
+ }
+ let menupopup = document.createXULElement("menupopup");
+ menupopup.className = "fxms-multi-stage-submenu";
+ addMenuitems(content.submenu_button.submenu, menupopup);
+ button.appendChild(menupopup);
+ let stylesheet;
+ if (!document.head.querySelector(`link[href="chrome://global/content/widgets.css"], link[href="chrome://global/skin/global.css"]`)) {
+ stylesheet = document.createElement("link");
+ stylesheet.rel = "stylesheet";
+ stylesheet.href = "chrome://global/content/widgets.css";
+ document.head.appendChild(stylesheet);
+ }
+ if (!menupopup.listenersRegistered) {
+ menupopup.addEventListener("command", onCommand);
+ menupopup.addEventListener("popupshowing", event => {
+ if (event.target === menupopup && event.target.anchorNode) {
+ event.target.anchorNode.toggleAttribute("open", true);
+ }
+ });
+ menupopup.addEventListener("popuphiding", event => {
+ if (event.target === menupopup && event.target.anchorNode) {
+ event.target.anchorNode.toggleAttribute("open", false);
+ }
+ });
+ menupopup.listenersRegistered = true;
+ }
+ return () => {
+ menupopup?.remove();
+ stylesheet?.remove();
+ };
+ }, [onCommand]); // eslint-disable-line react-hooks/exhaustive-deps
+
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: content.submenu_button.label ?? {}
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: `submenu-button ${isPrimary ? "primary" : "secondary"}`,
+ value: "submenu_button",
+ onClick: onClick,
+ ref: ref
+ }));
+};
+
+/***/ }),
+/* 16 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "EmbeddedMigrationWizard": () => (/* binding */ EmbeddedMigrationWizard)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+const EmbeddedMigrationWizard = ({
+ handleAction
+}) => {
+ const ref = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();
+ (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {
+ const handleBeginMigration = () => {
+ handleAction({
+ currentTarget: {
+ value: "migrate_start"
+ },
+ source: "primary_button"
+ });
+ };
+ const handleClose = () => {
+ handleAction({
+ currentTarget: {
+ value: "migrate_close"
+ }
+ });
+ };
+ const {
+ current
+ } = ref;
+ current?.addEventListener("MigrationWizard:BeginMigration", handleBeginMigration);
+ current?.addEventListener("MigrationWizard:Close", handleClose);
+ return () => {
+ current?.removeEventListener("MigrationWizard:BeginMigration", handleBeginMigration);
+ current?.removeEventListener("MigrationWizard:Close", handleClose);
+ };
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("migration-wizard", {
+ "force-show-import-all": "false",
+ "auto-request-state": "",
+ ref: ref
+ });
+};
+
+/***/ }),
+/* 17 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "Loader": () => (/* binding */ Loader),
+/* harmony export */ "InstallButton": () => (/* binding */ InstallButton),
+/* harmony export */ "AddonsPicker": () => (/* binding */ AddonsPicker)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(5);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+const Loader = () => {
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ className: "primary"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "loaderContainer"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("span", {
+ className: "loader"
+ })));
+};
+const InstallButton = props => {
+ const [installing, setInstalling] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
+ const [installComplete, setInstallComplete] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false);
+ let buttonLabel = installComplete ? "Installed" : "Add to Firefox";
+ function onClick(event) {
+ props.handleAction(event);
+ // Replace the label with the spinner
+ setInstalling(true);
+ window.AWEnsureAddonInstalled(props.addonId).then(value => {
+ if (value === "complete") {
+ // Set the label to "Installed"
+ setInstallComplete(true);
+ }
+ // Whether the addon installs or not, we want to remove the spinner
+ setInstalling(false);
+ });
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "install-button-wrapper"
+ }, installing ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(Loader, null) : /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_2__.Localized, {
+ text: buttonLabel
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("button", {
+ id: props.name,
+ value: props.index,
+ onClick: onClick,
+ disabled: installComplete,
+ className: "primary"
+ })));
+};
+const AddonsPicker = props => {
+ const {
+ content
+ } = props;
+ if (!content) {
+ return null;
+ }
+ function handleAction(event) {
+ const {
+ message_id
+ } = props;
+ let {
+ action,
+ source_id
+ } = content.tiles.data[event.currentTarget.value];
+ let {
+ type,
+ data
+ } = action;
+ if (type === "INSTALL_ADDON_FROM_URL") {
+ if (!data) {
+ return;
+ }
+ }
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.handleUserAction({
+ type,
+ data
+ });
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "addons-picker-container"
+ }, content.tiles.data.map(({
+ id,
+ name,
+ type,
+ description,
+ icon
+ }, index) => name ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ key: id,
+ className: "addon-container"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "rtamo-icon"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", {
+ className: `${type === "theme" ? "rtamo-theme-icon" : "brand-logo"}`,
+ src: icon,
+ role: "presentation",
+ alt: ""
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "addon-details"
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_2__.Localized, {
+ text: name
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "addon-title"
+ })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_2__.Localized, {
+ text: description
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "addon-description"
+ }))), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(InstallButton, {
+ key: id,
+ addonId: id,
+ name: name,
+ handleAction: handleAction,
+ index: index
+ })) : null));
+};
+
+/***/ }),
+/* 18 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "LinkParagraph": () => (/* binding */ LinkParagraph)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _MSLocalized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(5);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+const LinkParagraph = props => {
+ const {
+ text_content,
+ handleAction
+ } = props;
+ const handleParagraphAction = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(event => {
+ if (event.target.closest("a")) {
+ handleAction({
+ ...event,
+ currentTarget: event.target
+ });
+ }
+ }, [handleAction]);
+ const onKeyPress = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(event => {
+ if (event.key === "Enter" && !event.repeat) {
+ handleParagraphAction(event);
+ }
+ }, [handleParagraphAction]);
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, {
+ text: text_content.text
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("p", {
+ className: text_content.font_styles === "legal" ? "legal-paragraph" : "link-paragraph",
+ onClick: handleParagraphAction,
+ value: "link_paragraph",
+ onKeyPress: onKeyPress
+ }, text_content.link_keys?.map(link => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("a", {
+ key: link,
+ value: link,
+ role: "link",
+ className: "text-link",
+ "data-l10n-name": link
+ // must pass in tabIndex when no href is provided
+ ,
+ tabIndex: "0"
+ }, " "))));
+};
+
+/***/ }),
+/* 19 */
+/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "BASE_PARAMS": () => (/* binding */ BASE_PARAMS),
+/* harmony export */ "addUtmParams": () => (/* binding */ addUtmParams)
+/* harmony export */ });
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+/**
+ * BASE_PARAMS keys/values can be modified from outside this file
+ */
+const BASE_PARAMS = {
+ utm_source: "activity-stream",
+ utm_campaign: "firstrun",
+ utm_medium: "referral",
+};
+
+/**
+ * Takes in a url as a string or URL object and returns a URL object with the
+ * utm_* parameters added to it. If a URL object is passed in, the paraemeters
+ * are added to it (the return value can be ignored in that case as it's the
+ * same object).
+ */
+function addUtmParams(url, utmTerm) {
+ let returnUrl = url;
+ if (typeof returnUrl === "string") {
+ returnUrl = new URL(url);
+ }
+ for (let [key, value] of Object.entries(BASE_PARAMS)) {
+ if (!returnUrl.searchParams.has(key)) {
+ returnUrl.searchParams.append(key, value);
+ }
+ }
+ returnUrl.searchParams.append("utm_term", utmTerm);
+ return returnUrl;
+}
+
+
+/***/ }),
+/* 20 */
+/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
+
+__webpack_require__.r(__webpack_exports__);
+/* harmony export */ __webpack_require__.d(__webpack_exports__, {
+/* harmony export */ "ReturnToAMO": () => (/* binding */ ReturnToAMO)
+/* harmony export */ });
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3);
+/* harmony import */ var _MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(6);
+/* harmony import */ var _lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(19);
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+
+class ReturnToAMO extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.fetchFlowParams = this.fetchFlowParams.bind(this);
+ this.handleAction = this.handleAction.bind(this);
+ }
+ async fetchFlowParams() {
+ if (this.props.metricsFlowUri) {
+ this.setState({
+ flowParams: await _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.fetchFlowParams(this.props.metricsFlowUri)
+ });
+ }
+ }
+ componentDidUpdate() {
+ this.fetchFlowParams();
+ }
+ handleAction(event) {
+ const {
+ content,
+ message_id,
+ url,
+ utm_term
+ } = this.props;
+ let {
+ action,
+ source_id
+ } = content[event.currentTarget.value];
+ let {
+ type,
+ data
+ } = action;
+ if (type === "INSTALL_ADDON_FROM_URL") {
+ if (!data) {
+ return;
+ }
+ // Set add-on url in action.data.url property from JSON
+ data = {
+ ...data,
+ url
+ };
+ } else if (type === "SHOW_FIREFOX_ACCOUNTS") {
+ let params = {
+ ..._lib_addUtmParams_mjs__WEBPACK_IMPORTED_MODULE_3__.BASE_PARAMS,
+ utm_term: `aboutwelcome-${utm_term}-screen`
+ };
+ if (action.addFlowParams && this.state.flowParams) {
+ params = {
+ ...params,
+ ...this.state.flowParams
+ };
+ }
+ data = {
+ ...data,
+ extraParams: params
+ };
+ }
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.handleUserAction({
+ type,
+ data
+ });
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.AboutWelcomeUtils.sendActionTelemetry(message_id, source_id);
+ }
+ render() {
+ const {
+ content,
+ type
+ } = this.props;
+ if (!content) {
+ return null;
+ }
+ if (content?.primary_button.label) {
+ content.primary_button.label.string_id = type.includes("theme") ? "return-to-amo-add-theme-label" : "mr1-return-to-amo-add-extension-label";
+ }
+
+ // For experiments, when needed below rendered UI allows settings hard coded strings
+ // directly inside JSON except for ReturnToAMOText which picks add-on name and icon from fluent string
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", {
+ className: "outer-wrapper onboardingContainer proton",
+ style: content.backdrop ? {
+ background: content.backdrop
+ } : {}
+ }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageProtonScreen__WEBPACK_IMPORTED_MODULE_2__.MultiStageProtonScreen, {
+ content: content,
+ isRtamo: true,
+ isTheme: type.includes("theme"),
+ id: this.props.message_id,
+ order: this.props.order || 0,
+ totalNumberOfScreens: 1,
+ isSingleScreen: true,
+ autoAdvance: this.props.auto_advance,
+ iconURL: type.includes("theme") ? this.props.themeScreenshots[0]?.url : this.props.iconURL,
+ addonName: this.props.name,
+ handleAction: this.handleAction
+ }));
+ }
+}
+ReturnToAMO.defaultProps = _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_RTAMO_CONTENT;
+
+/***/ })
+/******/ ]);
+/************************************************************************/
+/******/ // The module cache
+/******/ var __webpack_module_cache__ = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/ // Check if module is in cache
+/******/ var cachedModule = __webpack_module_cache__[moduleId];
+/******/ if (cachedModule !== undefined) {
+/******/ return cachedModule.exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = __webpack_module_cache__[moduleId] = {
+/******/ // no module.id needed
+/******/ // no module.loaded needed
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/************************************************************************/
+/******/ /* webpack/runtime/compat get default export */
+/******/ (() => {
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = (module) => {
+/******/ var getter = module && module.__esModule ?
+/******/ () => (module['default']) :
+/******/ () => (module);
+/******/ __webpack_require__.d(getter, { a: getter });
+/******/ return getter;
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/define property getters */
+/******/ (() => {
+/******/ // define getter functions for harmony exports
+/******/ __webpack_require__.d = (exports, definition) => {
+/******/ for(var key in definition) {
+/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ }
+/******/ }
+/******/ };
+/******/ })();
+/******/
+/******/ /* webpack/runtime/hasOwnProperty shorthand */
+/******/ (() => {
+/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ })();
+/******/
+/******/ /* webpack/runtime/make namespace object */
+/******/ (() => {
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = (exports) => {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/ })();
+/******/
+/************************************************************************/
+var __webpack_exports__ = {};
+// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
+(() => {
+__webpack_require__.r(__webpack_exports__);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(1);
+/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(2);
+/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_1__);
+/* harmony import */ var _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(3);
+/* harmony import */ var _components_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(4);
+/* harmony import */ var _components_ReturnToAMO__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(20);
+function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+
+
+
+
+
+class AboutWelcome extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureComponent) {
+ constructor(props) {
+ super(props);
+ this.state = {
+ metricsFlowUri: null
+ };
+ this.fetchFxAFlowUri = this.fetchFxAFlowUri.bind(this);
+ }
+ async fetchFxAFlowUri() {
+ this.setState({
+ metricsFlowUri: await window.AWGetFxAMetricsFlowURI?.()
+ });
+ }
+ componentDidMount() {
+ if (!this.props.skipFxA) {
+ this.fetchFxAFlowUri();
+ }
+ if (document.location.href === "about:welcome") {
+ // Record impression with performance data after allowing the page to load
+ const recordImpression = domState => {
+ const {
+ domComplete,
+ domInteractive
+ } = performance.getEntriesByType("navigation").pop();
+ _lib_aboutwelcome_utils_mjs__WEBPACK_IMPORTED_MODULE_2__.AboutWelcomeUtils.sendImpressionTelemetry(this.props.messageId, {
+ domComplete,
+ domInteractive,
+ mountStart: performance.getEntriesByName("mount").pop().startTime,
+ domState,
+ source: this.props.UTMTerm
+ });
+ };
+ if (document.readyState === "complete") {
+ // Page might have already triggered a load event because it waited for async data,
+ // e.g., attribution, so the dom load timing could be of a empty content
+ // with domState in telemetry captured as 'complete'
+ recordImpression(document.readyState);
+ } else {
+ window.addEventListener("load", () => recordImpression("load"), {
+ once: true
+ });
+ }
+
+ // Captures user has seen about:welcome by setting
+ // firstrun.didSeeAboutWelcome pref to true and capturing welcome UI unique messageId
+ window.AWSendToParent("SET_WELCOME_MESSAGE_SEEN", this.props.messageId);
+ }
+ }
+ render() {
+ const {
+ props
+ } = this;
+ if (props.template === "return_to_amo") {
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_ReturnToAMO__WEBPACK_IMPORTED_MODULE_4__.ReturnToAMO, {
+ message_id: props.messageId,
+ type: props.type,
+ name: props.name,
+ url: props.url,
+ iconURL: props.iconURL,
+ themeScreenshots: props.screenshots,
+ metricsFlowUri: this.state.metricsFlowUri
+ });
+ }
+ return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_components_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_3__.MultiStageAboutWelcome, {
+ message_id: props.messageId,
+ defaultScreens: props.screens,
+ updateHistory: !props.disableHistoryUpdates,
+ metricsFlowUri: this.state.metricsFlowUri,
+ utm_term: props.UTMTerm,
+ transitions: props.transitions,
+ backdrop: props.backdrop,
+ startScreen: props.startScreen || 0,
+ appAndSystemLocaleInfo: props.appAndSystemLocaleInfo,
+ ariaRole: props.aria_role
+ });
+ }
+}
+
+// Computes messageId and UTMTerm info used in telemetry
+function ComputeTelemetryInfo(welcomeContent, experimentId, branchId) {
+ let messageId = welcomeContent.template === "return_to_amo" ? `RTAMO_DEFAULT_WELCOME_${welcomeContent.type.toUpperCase()}` : "DEFAULT_ID";
+ let UTMTerm = "aboutwelcome-default";
+ if (welcomeContent.id) {
+ messageId = welcomeContent.id.toUpperCase();
+ }
+ if (experimentId && branchId) {
+ UTMTerm = `aboutwelcome-${experimentId}-${branchId}`.toLowerCase();
+ }
+ return {
+ messageId,
+ UTMTerm
+ };
+}
+async function retrieveRenderContent() {
+ // Feature config includes RTAMO attribution data if exists
+ // else below data in order specified
+ // user prefs
+ // experiment data
+ // defaults
+ let featureConfig = await window.AWGetFeatureConfig();
+ let {
+ messageId,
+ UTMTerm
+ } = ComputeTelemetryInfo(featureConfig, featureConfig.slug, featureConfig.branch && featureConfig.branch.slug);
+ return {
+ featureConfig,
+ messageId,
+ UTMTerm
+ };
+}
+async function mount() {
+ let {
+ featureConfig: aboutWelcomeProps,
+ messageId,
+ UTMTerm
+ } = await retrieveRenderContent();
+ react_dom__WEBPACK_IMPORTED_MODULE_1___default().render( /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(AboutWelcome, _extends({
+ messageId: messageId,
+ UTMTerm: UTMTerm
+ }, aboutWelcomeProps)), document.getElementById("multi-stage-message-root"));
+}
+performance.mark("mount");
+mount();
+})();
+
+/******/ })()
+; \ No newline at end of file
diff --git a/browser/components/aboutwelcome/content/aboutwelcome.css b/browser/components/aboutwelcome/content/aboutwelcome.css
new file mode 100644
index 0000000000..63608bd48a
--- /dev/null
+++ b/browser/components/aboutwelcome/content/aboutwelcome.css
@@ -0,0 +1,2536 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+/* stylelint-disable max-nesting-depth */
+#feature-callout {
+ --fc-background: var(--fc-background-light, #fff);
+ --fc-color: var(--fc-color-light, rgb(21, 20, 26));
+ --fc-border: var(--fc-border-light, #CFCFD8);
+ --fc-accent-color: var(--fc-accent-color-light, rgb(0, 97, 224));
+ --fc-button-background: var(--fc-button-background-light, #F0F0F4);
+ --fc-button-color: var(--fc-button-color-light, rgb(21, 20, 26));
+ --fc-button-border: var(--fc-button-border-light, transparent);
+ --fc-button-background-hover: var(--fc-button-background-hover-light, #E0E0E6);
+ --fc-button-color-hover: var(--fc-button-color-hover-light, rgb(21, 20, 26));
+ --fc-button-border-hover: var(--fc-button-border-hover-light, transparent);
+ --fc-button-background-active: var(--fc-button-background-active-light, #CFCFD8);
+ --fc-button-color-active: var(--fc-button-color-active-light, rgb(21, 20, 26));
+ --fc-button-border-active: var(--fc-button-border-active-light, transparent);
+ --fc-primary-button-background: var(--fc-primary-button-background-light, #0061e0);
+ --fc-primary-button-color: var(--fc-primary-button-color-light, rgb(251,251,254));
+ --fc-primary-button-border: var(--fc-primary-button-border-light, transparent);
+ --fc-primary-button-background-hover: var(--fc-primary-button-background-hover-light, #0250bb);
+ --fc-primary-button-color-hover: var(--fc-primary-button-color-hover-light, rgb(251,251,254));
+ --fc-primary-button-border-hover: var(--fc-primary-button-border-hover-light, transparent);
+ --fc-primary-button-background-active: var(--fc-primary-button-background-active-light, #053e94);
+ --fc-primary-button-color-active: var(--fc-primary-button-color-active-light, rgb(251,251,254));
+ --fc-primary-button-border-active: var(--fc-primary-button-border-active-light, transparent);
+ --fc-step-color: color-mix(in srgb, currentColor 50%, transparent);
+ --fc-link-color: var(--fc-link-color-light, #0061E0);
+ --fc-link-color-hover: var(--fc-link-color-hover-light, #0250BB);
+ --fc-link-color-active: var(--fc-link-color-active-light, #053E94);
+ position: absolute;
+ z-index: 2147483647;
+ outline: none;
+ color: var(--fc-color);
+ accent-color: var(--fc-accent-color);
+ -moz-theme: non-native;
+ --arrow-width: 33.9411px;
+ --arrow-square-size: calc(var(--arrow-width) / sqrt(2));
+ --extra-width-from-rotation: calc(var(--arrow-width) - var(--arrow-square-size));
+ --arrow-visible-height: calc(var(--arrow-width) / 2);
+ --arrow-visible-size: calc(var(--arrow-square-size) / 2);
+ --arrow-center-inset: calc(50% - var(--arrow-visible-size));
+ --arrow-offset: calc(1.5px - var(--arrow-visible-size));
+ --arrow-corner-distance: 12px;
+ --arrow-corner-inset: calc(var(--arrow-corner-distance) + (var(--extra-width-from-rotation) / 2));
+ --arrow-overlap-magnitude: 5px;
+}
+@media (prefers-color-scheme: dark) {
+ #feature-callout {
+ --fc-background: var(--fc-background-dark, rgb(43, 42, 51));
+ --fc-color: var(--fc-color-dark, rgb(251, 251, 254));
+ --fc-border: var(--fc-border-dark, #3A3944);
+ --fc-accent-color: var(--fc-accent-color-dark, rgb(0, 221, 255));
+ --fc-button-background: var(--fc-button-background-dark, #2B2A33);
+ --fc-button-color: var(--fc-button-color-dark, rgb(251, 251, 254));
+ --fc-button-border: var(--fc-button-border-dark, transparent);
+ --fc-button-background-hover: var(--fc-button-background-hover-dark, #52525E);
+ --fc-button-color-hover: var(--fc-button-color-hover-dark, rgb(251, 251, 254));
+ --fc-button-border-hover: var(--fc-button-border-hover-dark, transparent);
+ --fc-button-background-active: var(--fc-button-background-active-dark, #5B5B66);
+ --fc-button-color-active: var(--fc-button-color-active-dark, rgb(251, 251, 254));
+ --fc-button-border-active: var(--fc-button-border-active-dark, transparent);
+ --fc-primary-button-background: var(--fc-primary-button-background-dark, rgb(0,221,255));
+ --fc-primary-button-color: var(--fc-primary-button-color-dark, rgb(43,42,51));
+ --fc-primary-button-border: var(--fc-primary-button-border-dark, transparent);
+ --fc-primary-button-background-hover: var(--fc-primary-button-background-hover-dark, rgb(128,235,255));
+ --fc-primary-button-color-hover: var(--fc-primary-button-color-hover-dark, rgb(43,42,51));
+ --fc-primary-button-border-hover: var(--fc-primary-button-border-hover-dark, transparent);
+ --fc-primary-button-background-active: var(--fc-primary-button-background-active-dark, rgb(170,242,255));
+ --fc-primary-button-color-active: var(--fc-primary-button-color-active-dark, rgb(43,42,51));
+ --fc-primary-button-border-active: var(--fc-primary-button-border-active-dark, transparent);
+ --fc-link-color: var(--fc-link-color-dark, #00DDFF);
+ --fc-link-color-hover: var(--fc-link-color-hover-dark, #80EBFF);
+ --fc-link-color-active: var(--fc-link-color-hover-active, #AAF2FF);
+ }
+}
+@media (prefers-contrast) {
+ #feature-callout {
+ --fc-background: var(--fc-background-hcm, -moz-dialog);
+ --fc-color: var(--fc-color-hcm, -moz-dialogtext);
+ --fc-border: var(--fc-border-hcm, -moz-dialogtext);
+ --fc-accent-color: var(--fc-accent-color-hcm, LinkText);
+ --fc-button-background: var(--fc-button-background-hcm, ButtonFace);
+ --fc-button-color: var(--fc-button-color-hcm, ButtonText);
+ --fc-button-border: var(--fc-button-border-hcm, ButtonText);
+ --fc-button-background-hover: var(--fc-button-background-hover-hcm, ButtonText);
+ --fc-button-color-hover: var(--fc-button-color-hover-hcm, ButtonFace);
+ --fc-button-border-hover: var(--fc-button-border-hover-hcm, ButtonText);
+ --fc-button-background-active: var(--fc-button-background-active-hcm, ButtonText);
+ --fc-button-color-active: var(--fc-button-color-active-hcm, ButtonFace);
+ --fc-button-border-active: var(--fc-button-border-active-hcm, ButtonText);
+ --fc-primary-button-background: var(--fc-primary-button-background-hcm, ButtonText);
+ --fc-primary-button-color: var(--fc-primary-button-color-hcm, ButtonFace);
+ --fc-primary-button-border: var(--fc-primary-button-border-hcm, ButtonFace);
+ --fc-primary-button-background-hover: var(--fc-primary-button-background-hover-hcm, SelectedItem);
+ --fc-primary-button-color-hover: var(--fc-primary-button-color-hover-hcm, SelectedItemText);
+ --fc-primary-button-border-hover: var(--fc-primary-button-border-hover-hcm, SelectedItemText);
+ --fc-primary-button-background-active: var(--fc-primary-button-background-active-hcm, SelectedItemText);
+ --fc-primary-button-color-active: var(--fc-primary-button-color-active-hcm, SelectedItem);
+ --fc-primary-button-border-active: var(--fc-primary-button-border-active-hcm, SelectedItem);
+ --fc-step-color: var(--fc-accent-color-hcm, LinkText);
+ --fc-link-color: var(--fc-link-color-hcm, LinkText);
+ --fc-link-color-hover: var(--fc-link-color-hover-hcm, LinkText);
+ --fc-link-color-active: var(--fc-link-color-active-hcm, ActiveText);
+ }
+}
+#feature-callout.simulateContent {
+ color-scheme: env(-moz-content-preferred-color-scheme);
+}
+@media (-moz-content-prefers-color-scheme: light) {
+ #feature-callout.simulateContent {
+ --fc-background: var(--fc-background-light, #fff);
+ --fc-color: var(--fc-color-light, rgb(21, 20, 26));
+ --fc-border: var(--fc-border-light, #CFCFD8);
+ --fc-accent-color: var(--fc-accent-color-light, rgb(0, 97, 224));
+ --fc-button-background: var(--fc-button-background-light, #F0F0F4);
+ --fc-button-color: var(--fc-button-color-light, rgb(21, 20, 26));
+ --fc-button-border: var(--fc-button-border-light, transparent);
+ --fc-button-background-hover: var(--fc-button-background-hover-light, #E0E0E6);
+ --fc-button-color-hover: var(--fc-button-color-hover-light, rgb(21, 20, 26));
+ --fc-button-border-hover: var(--fc-button-border-hover-light, transparent);
+ --fc-button-background-active: var(--fc-button-background-active-light, #CFCFD8);
+ --fc-button-color-active: var(--fc-button-color-active-light, rgb(21, 20, 26));
+ --fc-button-border-active: var(--fc-button-border-active-light, transparent);
+ --fc-primary-button-background: var(--fc-primary-button-background-light, #0061e0);
+ --fc-primary-button-color: var(--fc-primary-button-color-light, rgb(251,251,254));
+ --fc-primary-button-border: var(--fc-primary-button-border-light, transparent);
+ --fc-primary-button-background-hover: var(--fc-primary-button-background-hover-light, #0250bb);
+ --fc-primary-button-color-hover: var(--fc-primary-button-color-hover-light, rgb(251,251,254));
+ --fc-primary-button-border-hover: var(--fc-primary-button-border-hover-light, transparent);
+ --fc-primary-button-background-active: var(--fc-primary-button-background-active-light, #053e94);
+ --fc-primary-button-color-active: var(--fc-primary-button-color-active-light, rgb(251,251,254));
+ --fc-primary-button-border-active: var(--fc-primary-button-border-active-light, transparent);
+ --fc-step-color: color-mix(in srgb, currentColor 50%, transparent);
+ --fc-link-color: var(--fc-link-color-light, #0061E0);
+ --fc-link-color-hover: var(--fc-link-color-hover-light, #0250BB);
+ --fc-link-color-active: var(--fc-link-color-active-light, #053E94);
+ }
+}
+@media (-moz-content-prefers-color-scheme: dark) {
+ #feature-callout.simulateContent {
+ --fc-background: var(--fc-background-dark, rgb(43, 42, 51));
+ --fc-color: var(--fc-color-dark, rgb(251, 251, 254));
+ --fc-border: var(--fc-border-dark, #3A3944);
+ --fc-accent-color: var(--fc-accent-color-dark, rgb(0, 221, 255));
+ --fc-button-background: var(--fc-button-background-dark, #2B2A33);
+ --fc-button-color: var(--fc-button-color-dark, rgb(251, 251, 254));
+ --fc-button-border: var(--fc-button-border-dark, transparent);
+ --fc-button-background-hover: var(--fc-button-background-hover-dark, #52525E);
+ --fc-button-color-hover: var(--fc-button-color-hover-dark, rgb(251, 251, 254));
+ --fc-button-border-hover: var(--fc-button-border-hover-dark, transparent);
+ --fc-button-background-active: var(--fc-button-background-active-dark, #5B5B66);
+ --fc-button-color-active: var(--fc-button-color-active-dark, rgb(251, 251, 254));
+ --fc-button-border-active: var(--fc-button-border-active-dark, transparent);
+ --fc-primary-button-background: var(--fc-primary-button-background-dark, rgb(0,221,255));
+ --fc-primary-button-color: var(--fc-primary-button-color-dark, rgb(43,42,51));
+ --fc-primary-button-border: var(--fc-primary-button-border-dark, transparent);
+ --fc-primary-button-background-hover: var(--fc-primary-button-background-hover-dark, rgb(128,235,255));
+ --fc-primary-button-color-hover: var(--fc-primary-button-color-hover-dark, rgb(43,42,51));
+ --fc-primary-button-border-hover: var(--fc-primary-button-border-hover-dark, transparent);
+ --fc-primary-button-background-active: var(--fc-primary-button-background-active-dark, rgb(170,242,255));
+ --fc-primary-button-color-active: var(--fc-primary-button-color-active-dark, rgb(43,42,51));
+ --fc-primary-button-border-active: var(--fc-primary-button-border-active-dark, transparent);
+ --fc-link-color: var(--fc-link-color-dark, #00DDFF);
+ --fc-link-color-hover: var(--fc-link-color-hover-dark, #80EBFF);
+ --fc-link-color-active: var(--fc-link-color-hover-active, #AAF2FF);
+ }
+}
+@media (prefers-contrast) {
+ #feature-callout.simulateContent {
+ --fc-background: var(--fc-background-hcm, -moz-dialog);
+ --fc-color: var(--fc-color-hcm, -moz-dialogtext);
+ --fc-border: var(--fc-border-hcm, -moz-dialogtext);
+ --fc-accent-color: var(--fc-accent-color-hcm, LinkText);
+ --fc-button-background: var(--fc-button-background-hcm, ButtonFace);
+ --fc-button-color: var(--fc-button-color-hcm, ButtonText);
+ --fc-button-border: var(--fc-button-border-hcm, ButtonText);
+ --fc-button-background-hover: var(--fc-button-background-hover-hcm, ButtonText);
+ --fc-button-color-hover: var(--fc-button-color-hover-hcm, ButtonFace);
+ --fc-button-border-hover: var(--fc-button-border-hover-hcm, ButtonText);
+ --fc-button-background-active: var(--fc-button-background-active-hcm, ButtonText);
+ --fc-button-color-active: var(--fc-button-color-active-hcm, ButtonFace);
+ --fc-button-border-active: var(--fc-button-border-active-hcm, ButtonText);
+ --fc-primary-button-background: var(--fc-primary-button-background-hcm, ButtonText);
+ --fc-primary-button-color: var(--fc-primary-button-color-hcm, ButtonFace);
+ --fc-primary-button-border: var(--fc-primary-button-border-hcm, ButtonFace);
+ --fc-primary-button-background-hover: var(--fc-primary-button-background-hover-hcm, SelectedItem);
+ --fc-primary-button-color-hover: var(--fc-primary-button-color-hover-hcm, SelectedItemText);
+ --fc-primary-button-border-hover: var(--fc-primary-button-border-hover-hcm, SelectedItemText);
+ --fc-primary-button-background-active: var(--fc-primary-button-background-active-hcm, SelectedItemText);
+ --fc-primary-button-color-active: var(--fc-primary-button-color-active-hcm, SelectedItem);
+ --fc-primary-button-border-active: var(--fc-primary-button-border-active-hcm, SelectedItem);
+ --fc-step-color: var(--fc-accent-color-hcm, LinkText);
+ --fc-link-color: var(--fc-link-color-hcm, LinkText);
+ --fc-link-color-hover: var(--fc-link-color-hover-hcm, LinkText);
+ --fc-link-color-active: var(--fc-link-color-active-hcm, ActiveText);
+ }
+}
+panel#feature-callout {
+ --panel-color: var(--fc-color);
+ --panel-shadow: none;
+ --panel-shadow-margin: 6px;
+ --panel-arrow-space: calc(var(--panel-shadow-margin) + var(--arrow-visible-height) - 1.5px);
+ --panel-margin-offset: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-corner-distance) + (var(--arrow-width) / 2)));
+}
+
+panel#feature-callout::part(content) {
+ width: initial;
+ border: 0;
+ border-radius: 0;
+ padding: 0;
+ margin: var(--panel-shadow-margin);
+ background: none;
+ color: inherit;
+ overflow: visible !important;
+}
+
+div#feature-callout {
+ transition: opacity 0.5s ease;
+}
+div#feature-callout.hidden {
+ opacity: 0;
+ pointer-events: none;
+}
+
+#feature-callout .onboardingContainer,
+#feature-callout .onboardingContainer .outer-wrapper {
+ --transition: none;
+ height: auto;
+}
+#feature-callout:dir(rtl) {
+ transform: none;
+ direction: ltr;
+}
+#feature-callout .outer-wrapper:dir(rtl) {
+ transform: none;
+ direction: rtl;
+}
+#feature-callout .screen:dir(rtl) {
+ transform: none;
+}
+#feature-callout .screen[pos=callout] {
+ height: fit-content;
+ min-height: unset;
+ overflow: visible;
+}
+#feature-callout .screen[pos=callout][layout=inline] .section-main .main-content,
+#feature-callout .screen[pos=callout][layout=inline] .section-main .main-content.no-steps {
+ width: 18em;
+ padding-inline: 16px;
+ padding-block: 0;
+}
+#feature-callout .screen[pos=callout][layout=inline] .section-main .main-content .welcome-text,
+#feature-callout .screen[pos=callout][layout=inline] .section-main .main-content.no-steps .welcome-text {
+ height: 24px;
+ margin-block: 12px;
+ margin-inline: 0;
+ padding: 0;
+ white-space: nowrap;
+}
+#feature-callout .screen[pos=callout][layout=inline] .section-main .dismiss-button {
+ height: 24px;
+ width: 24px;
+ min-height: 24px;
+ min-width: 24px;
+ margin: 0;
+ top: calc(50% - 12px);
+ inset-inline-end: 12px;
+}
+#feature-callout .screen[pos=callout] .logo-container {
+ display: flex;
+ justify-content: center;
+}
+#feature-callout .screen[pos=callout] .logo-container .brand-logo {
+ margin: 0;
+}
+#feature-callout .screen[pos=callout] .logo-container .brand-logo:dir(rtl) {
+ transform: rotateY(180deg);
+}
+#feature-callout .screen[pos=callout] .welcome-text {
+ align-items: baseline;
+ text-align: start;
+ margin: 0;
+ padding: 0;
+ gap: 8px;
+}
+#feature-callout .screen[pos=callout] .welcome-text h1,
+#feature-callout .screen[pos=callout] .welcome-text h2 {
+ font-size: 0.813em;
+ margin: 0;
+ color: inherit;
+}
+#feature-callout .screen[pos=callout] .welcome-text h1 {
+ font-weight: 600;
+}
+#feature-callout .screen[pos=callout] .welcome-text .inline-icon-container {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center;
+}
+#feature-callout .screen[pos=callout] .welcome-text .inline-icon-container .logo-container {
+ height: 16px;
+ width: 16px;
+ margin-inline-end: 6px;
+ box-sizing: border-box;
+ -moz-context-properties: fill;
+ fill: currentColor;
+}
+#feature-callout .screen[pos=callout] .welcome-text .inline-icon-container .logo-container img {
+ height: 16px;
+ width: 16px;
+ margin: 0;
+}
+#feature-callout .screen[pos=callout] .welcome-text .inline-icon-container[alignment=top], #feature-callout .screen[pos=callout] .welcome-text .inline-icon-container[alignment=bottom] {
+ flex-wrap: nowrap;
+}
+#feature-callout .screen[pos=callout] .welcome-text .inline-icon-container[alignment=top] .logo-container, #feature-callout .screen[pos=callout] .welcome-text .inline-icon-container[alignment=bottom] .logo-container {
+ height: 1.5em;
+ align-items: center;
+ padding-bottom: 0.15em;
+ box-sizing: border-box;
+}
+#feature-callout .screen[pos=callout] .welcome-text .inline-icon-container[alignment=top] {
+ align-items: start;
+}
+#feature-callout .screen[pos=callout] .welcome-text .inline-icon-container[alignment=bottom] {
+ align-items: end;
+}
+#feature-callout .screen[pos=callout] .multi-select-container {
+ margin: 0;
+ font-size: 0.813em;
+ row-gap: 12px;
+ color: inherit;
+ overflow: visible;
+}
+#feature-callout .screen[pos=callout] .multi-select-container #multi-stage-multi-select-label {
+ font-size: inherit;
+ margin: -4px 0 0;
+ color: inherit;
+}
+#feature-callout .screen[pos=callout] .cta-link {
+ background: none;
+ text-decoration: underline;
+ cursor: pointer;
+ border: none;
+ padding: 0;
+ color: var(--fc-link-color);
+ order: -1;
+ margin-inline-end: auto;
+ margin-block: 8px;
+}
+#feature-callout .screen[pos=callout] .cta-link:hover {
+ color: var(--fc-link-color-hover);
+}
+#feature-callout .screen[pos=callout] .cta-link:active {
+ color: var(--fc-link-color-active);
+}
+#feature-callout .screen[pos=callout] .section-secondary {
+ display: none;
+}
+#feature-callout .screen[pos=callout] .section-main {
+ height: fit-content;
+ width: fit-content;
+}
+#feature-callout .screen[pos=callout] .section-main .main-content {
+ position: relative;
+ overflow: hidden;
+ border: 1px solid var(--fc-border);
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
+ border-radius: 4px;
+ padding: var(--callout-padding, 24px);
+ width: 25em;
+ gap: 16px;
+ background-color: var(--fc-background);
+}
+#feature-callout .screen[pos=callout] .section-main .main-content .main-content-inner {
+ gap: 12px;
+}
+#feature-callout .screen[pos=callout] .section-main .main-content .steps {
+ height: auto;
+ position: absolute;
+ bottom: calc(var(--callout-padding, 24px) + 12px);
+ padding-block: 0;
+}
+#feature-callout .screen[pos=callout] .section-main .main-content .steps .indicator {
+ border: 4px solid var(--fc-step-color);
+}
+#feature-callout .screen[pos=callout] .section-main .main-content .steps .indicator.current {
+ border-color: var(--fc-accent-color);
+}
+#feature-callout .screen[pos=callout] .section-main .main-content .steps:not(.progress-bar) {
+ flex-flow: row nowrap;
+ gap: 8px;
+}
+#feature-callout .screen[pos=callout] .section-main .main-content .steps:not(.progress-bar) .indicator {
+ margin: 0;
+}
+#feature-callout .screen[pos=callout] .section-main .main-content .steps .indicator.current, #feature-callout .screen[pos=callout] .section-main .main-content .steps.progress-bar .indicator.complete {
+ border-color: var(--fc-accent-color);
+}
+#feature-callout .screen[pos=callout] .section-main .dismiss-button {
+ font-size: 1em;
+ inset-block: 0 auto;
+ inset-inline: auto 0;
+ margin-block: 16px 0;
+ margin-inline: 0 16px;
+ background-color: var(--fc-background);
+}
+#feature-callout .screen[pos=callout] .section-main .dismiss-button[button-size=small] {
+ height: 24px;
+ width: 24px;
+ min-height: 24px;
+ min-width: 24px;
+}
+#feature-callout .screen[pos=callout] .action-buttons {
+ display: flex;
+ flex-flow: row nowrap;
+ align-items: stretch;
+ justify-content: end;
+ gap: 10px;
+ margin-top: 4px;
+}
+#feature-callout .screen[pos=callout] .action-buttons[alignment=start] {
+ justify-content: start;
+}
+#feature-callout .screen[pos=callout] .action-buttons[alignment=space-between] {
+ justify-content: space-between;
+}
+#feature-callout .screen[pos=callout] .action-buttons .secondary-cta {
+ font-size: inherit;
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary,
+#feature-callout .screen[pos=callout] .action-buttons .secondary {
+ padding: 4px 16px;
+ margin: 0;
+ font-size: 0.813em;
+ font-weight: 600;
+ line-height: 16px;
+ min-height: 32px;
+ text-decoration: none;
+ cursor: default;
+}
+#feature-callout .screen[pos=callout] .action-buttons .secondary {
+ background-color: var(--fc-button-background);
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary {
+ background-color: var(--fc-primary-button-background);
+}
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container {
+ align-items: stretch;
+}
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container:not([hidden]) {
+ display: flex;
+}
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container .primary:not(.submenu-button),
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container .secondary:not(.submenu-button),
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container .additional-cta:not(.submenu-button) {
+ border-start-end-radius: 0;
+ border-end-end-radius: 0;
+ margin-inline-end: 0;
+}
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container .primary:focus-visible,
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container .secondary:focus-visible,
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container .additional-cta:focus-visible {
+ z-index: 2;
+}
+#feature-callout .screen[pos=callout] .action-buttons .split-button-container .submenu-button {
+ border-start-start-radius: 0;
+ border-end-start-radius: 0;
+ margin-inline-start: 1px;
+ padding: 8px;
+ min-width: 30px;
+ box-sizing: border-box;
+ background-image: url("chrome://global/skin/icons/arrow-down.svg");
+ background-repeat: no-repeat;
+ background-size: 16px;
+ background-position: center;
+ -moz-context-properties: fill;
+ fill: currentColor;
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary,
+#feature-callout .screen[pos=callout] .action-buttons .secondary,
+#feature-callout .screen[pos=callout] .dismiss-button {
+ border-radius: 4px;
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary:focus-visible,
+#feature-callout .screen[pos=callout] .action-buttons .secondary:focus-visible,
+#feature-callout .screen[pos=callout] .dismiss-button:focus-visible {
+ box-shadow: none;
+ outline: 2px solid var(--fc-accent-color);
+ outline-offset: 2px;
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary:disabled,
+#feature-callout .screen[pos=callout] .action-buttons .secondary:disabled,
+#feature-callout .screen[pos=callout] .dismiss-button:disabled {
+ opacity: 0.4;
+ cursor: auto;
+}
+#feature-callout .screen[pos=callout] .action-buttons .secondary,
+#feature-callout .screen[pos=callout] .dismiss-button {
+ border: 1px solid var(--fc-button-border);
+ color: var(--fc-button-color);
+}
+#feature-callout .screen[pos=callout] .action-buttons .secondary:hover:not(:disabled), #feature-callout .screen[pos=callout] .action-buttons .secondary[open],
+#feature-callout .screen[pos=callout] .dismiss-button:hover:not(:disabled),
+#feature-callout .screen[pos=callout] .dismiss-button[open] {
+ background-color: var(--fc-button-background-hover);
+ color: var(--fc-button-color-hover);
+ border: 1px solid var(--fc-button-border-hover);
+}
+#feature-callout .screen[pos=callout] .action-buttons .secondary:hover:not(:disabled):active, #feature-callout .screen[pos=callout] .action-buttons .secondary[open]:active,
+#feature-callout .screen[pos=callout] .dismiss-button:hover:not(:disabled):active,
+#feature-callout .screen[pos=callout] .dismiss-button[open]:active {
+ background-color: var(--fc-button-background-active);
+ color: var(--fc-button-color-active);
+ border: 1px solid var(--fc-button-border-active);
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary {
+ border: 1px solid var(--fc-primary-button-border);
+ color: var(--fc-primary-button-color);
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary:hover:not(:disabled), #feature-callout .screen[pos=callout] .action-buttons .primary[open] {
+ background-color: var(--fc-primary-button-background-hover);
+ color: var(--fc-primary-button-color-hover);
+ border: 1px solid var(--fc-primary-button-border-hover);
+}
+#feature-callout .screen[pos=callout] .action-buttons .primary:hover:not(:disabled):active, #feature-callout .screen[pos=callout] .action-buttons .primary[open]:active {
+ background-color: var(--fc-primary-button-background-active);
+ color: var(--fc-primary-button-color-active);
+ border: 1px solid var(--fc-primary-button-border-active);
+}
+panel#feature-callout:is([side=top], [side=bottom]):not([hide-arrow=permanent]) {
+ margin-inline: var(--panel-margin-offset);
+}
+
+panel#feature-callout:is([side=left], [side=right]):not([hide-arrow=permanent]) {
+ margin-block: var(--panel-margin-offset);
+}
+
+panel#feature-callout::part(content) {
+ position: relative;
+}
+
+#feature-callout .arrow-box {
+ position: absolute;
+ overflow: visible;
+ transform: rotate(45deg);
+ transform-style: preserve-3d;
+}
+#feature-callout:not([arrow-position]) .arrow-box, #feature-callout[hide-arrow] .arrow-box {
+ display: none;
+}
+#feature-callout .arrow {
+ width: var(--arrow-square-size);
+ height: var(--arrow-square-size);
+}
+#feature-callout .shadow-arrow-box {
+ z-index: -1;
+}
+#feature-callout .shadow-arrow {
+ background: transparent;
+ outline: 1px solid var(--fc-border);
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
+}
+#feature-callout .background-arrow-box {
+ z-index: 1;
+ pointer-events: none;
+}
+#feature-callout .background-arrow {
+ background-color: var(--fc-background);
+ clip-path: var(--fc-arrow-clip-path);
+}
+#feature-callout[arrow-position=top] .arrow-box {
+ top: var(--arrow-offset);
+ inset-inline-start: var(--arrow-center-inset);
+ --fc-arrow-clip-path: polygon(100% 0, 100% 2%, 2% 100%, 0 100%, 0 0);
+}
+panel#feature-callout[arrow-position=top]::part(content) {
+ margin-top: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=top] {
+ margin-top: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=bottom] .arrow-box {
+ bottom: var(--arrow-offset);
+ inset-inline-start: var(--arrow-center-inset);
+ --fc-arrow-clip-path: polygon(100% 0, 98% 0, 0 98%, 0 100%, 100% 100%);
+}
+panel#feature-callout[arrow-position=bottom]::part(content) {
+ margin-bottom: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=bottom] {
+ margin-bottom: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=inline-end] .arrow-box {
+ top: var(--arrow-center-inset);
+ inset-inline-end: var(--arrow-offset);
+ --fc-arrow-clip-path: polygon(100% 0, 100% 100%, 98% 100%, 0 2%, 0 0);
+}
+panel#feature-callout[arrow-position=inline-end]::part(content) {
+ margin-inline-end: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=inline-end] {
+ margin-inline-end: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=inline-start] .arrow-box {
+ top: var(--arrow-center-inset);
+ inset-inline-start: var(--arrow-offset);
+ --fc-arrow-clip-path: polygon(0 100%, 100% 100%, 100% 98%, 2% 0, 0 0);
+}
+panel#feature-callout[arrow-position=inline-start]::part(content) {
+ margin-inline-start: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=inline-start] {
+ margin-inline-start: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=top-end] .arrow-box {
+ top: var(--arrow-offset);
+ inset-inline-end: var(--arrow-corner-inset);
+ --fc-arrow-clip-path: polygon(100% 0, 100% 2%, 2% 100%, 0 100%, 0 0);
+}
+panel#feature-callout[arrow-position=top-end]::part(content) {
+ margin-top: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=top-end] {
+ margin-top: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=top-start] .arrow-box {
+ top: var(--arrow-offset);
+ inset-inline-start: var(--arrow-corner-inset);
+ --fc-arrow-clip-path: polygon(100% 0, 100% 2%, 2% 100%, 0 100%, 0 0);
+}
+panel#feature-callout[arrow-position=top-start]::part(content) {
+ margin-top: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=top-start] {
+ margin-top: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=bottom-end] .arrow-box {
+ bottom: var(--arrow-offset);
+ inset-inline-end: var(--arrow-corner-inset);
+ --fc-arrow-clip-path: polygon(100% 0, 98% 0, 0 98%, 0 100%, 100% 100%);
+}
+panel#feature-callout[arrow-position=bottom-end]::part(content) {
+ margin-bottom: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=bottom-end] {
+ margin-bottom: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=bottom-start] .arrow-box {
+ bottom: var(--arrow-offset);
+ inset-inline-start: var(--arrow-corner-inset);
+ --fc-arrow-clip-path: polygon(100% 0, 98% 0, 0 98%, 0 100%, 100% 100%);
+}
+panel#feature-callout[arrow-position=bottom-start]::part(content) {
+ margin-bottom: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=bottom-start] {
+ margin-bottom: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=inline-end-top] .arrow-box {
+ top: var(--arrow-corner-inset);
+ inset-inline-end: var(--arrow-offset);
+ --fc-arrow-clip-path: polygon(100% 0, 100% 100%, 98% 100%, 0 2%, 0 0);
+}
+panel#feature-callout[arrow-position=inline-end-top]::part(content) {
+ margin-inline-end: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=inline-end-top] {
+ margin-inline-end: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=inline-end-bottom] .arrow-box {
+ bottom: var(--arrow-corner-inset);
+ inset-inline-end: var(--arrow-offset);
+ --fc-arrow-clip-path: polygon(100% 0, 100% 100%, 98% 100%, 0 2%, 0 0);
+}
+panel#feature-callout[arrow-position=inline-end-bottom]::part(content) {
+ margin-inline-end: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=inline-end-bottom] {
+ margin-inline-end: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=inline-start-top] .arrow-box {
+ top: var(--arrow-corner-inset);
+ inset-inline-start: var(--arrow-offset);
+ --fc-arrow-clip-path: polygon(0 100%, 100% 100%, 100% 98%, 2% 0, 0 0);
+}
+panel#feature-callout[arrow-position=inline-start-top]::part(content) {
+ margin-inline-start: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=inline-start-top] {
+ margin-inline-start: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout[arrow-position=inline-start-bottom] .arrow-box {
+ bottom: var(--arrow-corner-inset);
+ inset-inline-start: var(--arrow-offset);
+ --fc-arrow-clip-path: polygon(0 100%, 100% 100%, 100% 98%, 2% 0, 0 0);
+}
+panel#feature-callout[arrow-position=inline-start-bottom]::part(content) {
+ margin-inline-start: var(--panel-arrow-space);
+}
+
+panel#feature-callout[arrow-position=inline-start-bottom] {
+ margin-inline-start: calc(-1 * (var(--panel-shadow-margin) + var(--arrow-overlap-magnitude)));
+}
+
+#feature-callout:focus-visible .screen[pos=callout] .section-main .main-content {
+ outline: 2px solid var(--fc-accent-color);
+ border-color: transparent;
+}
+@media (prefers-contrast) {
+ #feature-callout:focus-visible .screen[pos=callout] .section-main .main-content {
+ border-color: var(--fc-background);
+ }
+}
+#feature-callout:focus-visible .shadow-arrow {
+ outline: 2px solid var(--fc-accent-color);
+}
+
+/* stylelint-disable max-nesting-depth */
+.onboardingContainer.shopping {
+ height: auto;
+}
+.onboardingContainer.shopping .outer-wrapper {
+ height: auto;
+}
+
+.onboardingContainer.shopping .screen[pos=split] {
+ height: auto;
+ margin: 0 auto;
+ min-height: fit-content;
+ border-radius: 8px;
+ box-shadow: 0 2px 6px rgba(58, 57, 68, 0.2);
+ overflow-x: auto;
+}
+@media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ .onboardingContainer.shopping .screen[pos=split] {
+ box-shadow: 0 2px 6px #15141a;
+ }
+}
+.onboardingContainer.shopping .screen[pos=split]::before {
+ display: none;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main {
+ width: auto;
+ height: auto;
+ margin: 0 auto;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content {
+ border-radius: 4px;
+ color: inherit;
+ font: menu;
+}
+@media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ .onboardingContainer.shopping .screen[pos=split] .section-main .main-content {
+ background-color: #52525E;
+ }
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content.no-steps {
+ padding: 16px 0 36px;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .welcome-text {
+ text-align: start;
+ margin-block: 10px 12px;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .welcome-text h1 {
+ width: auto;
+ font-weight: 400;
+ line-height: 1.5;
+ font-size: 1.7em;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .welcome-text h2 {
+ color: inherit;
+ font-size: 1em;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .action-buttons .primary,
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .action-buttons .secondary {
+ min-width: auto;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .action-buttons .primary {
+ font-weight: 400;
+ padding: 4px 16px;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .action-buttons.additional-cta-container {
+ align-items: center;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .legal-paragraph {
+ font-size: 0.85em;
+ line-height: 1.5;
+ margin-block: 0 20px;
+ padding-inline: 30px;
+ text-align: start;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .legal-paragraph a {
+ text-decoration: underline;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .main-content .brand-logo {
+ width: 100%;
+ max-width: 294px;
+ max-height: 290px;
+ height: auto;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-main .dismiss-button {
+ top: 0;
+ margin: 14px 10px;
+}
+.onboardingContainer.shopping .screen[pos=split] .section-secondary {
+ display: none;
+}
+.onboardingContainer.shopping .screen[pos=split] .info-text, .onboardingContainer.shopping .screen[pos=split] .link-paragraph {
+ font-size: 1em;
+ margin: 10px auto;
+ line-height: 1.5;
+}
+.onboardingContainer.shopping .screen[pos=split] .link-paragraph {
+ margin-block: 0 10px;
+ padding-inline: 30px;
+ text-align: start;
+}
+.onboardingContainer.shopping .screen[pos=split] .link-paragraph a {
+ text-decoration: underline;
+}
+
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content {
+ padding: 12px;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner {
+ min-height: auto;
+ align-items: initial;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .welcome-text {
+ align-items: initial;
+ padding: 0;
+ margin-top: 0;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .welcome-text h1,
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .welcome-text h2 {
+ line-height: 20px;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .welcome-text h1 {
+ font-size: 1em;
+ font-weight: 590;
+ margin: 0;
+ margin-inline-end: 28px;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .welcome-text h2 {
+ color: inherit;
+ margin-block: 10px 0;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .action-buttons .cta-link {
+ padding: 4px;
+ margin-block: -4px;
+ outline-offset: 0;
+ min-height: revert;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .multi-select-container {
+ color: inherit;
+ padding: 0;
+ margin-block: 0 24px;
+ align-items: center;
+ overflow: visible;
+ font-size: 1em;
+ gap: 12px;
+ width: 100%;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .multi-select-container #multi-stage-multi-select-label {
+ color: inherit;
+ line-height: 20px;
+ margin-block: -2px 0;
+ font-size: 1em;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .multi-select-container .multi-select-item input {
+ margin-block: 0;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .main-content .main-content-inner .steps {
+ height: auto;
+ margin-bottom: 12px;
+}
+.onboardingContainer.shopping .screen[pos=split][layout=survey] .dismiss-button {
+ width: 24px;
+ height: 24px;
+ min-width: 24px;
+ min-height: 24px;
+ margin: 10px;
+}
+
+.onboardingContainer.shopping shopping-message-bar {
+ font: menu;
+}
+
+/* stylelint-disable max-nesting-depth */
+html {
+ height: 100%;
+}
+
+.dummy {
+ background: var(--mr-welcome-background-color) var(--mr-welcome-background-gradient) var(--mr-secondary-position) var(--mr-screen-background-color);
+}
+
+:root[dialogroot] {
+ background-color: transparent;
+}
+:root[dialogroot] body {
+ padding: 0;
+}
+:root[dialogroot] .onboardingContainer {
+ height: 100%;
+ background-color: transparent;
+}
+:root[dialogroot] .onboardingContainer:dir(rtl) {
+ transform: unset;
+}
+:root[dialogroot] .onboardingContainer .logo-container {
+ pointer-events: none;
+}
+:root[dialogroot] .onboardingContainer .screen:dir(rtl) {
+ transform: unset;
+}
+
+.welcome-container .onboardingContainer {
+ min-height: 610px;
+ min-width: fit-content;
+}
+
+.onboardingContainer {
+ --grey-subtitle-1: #696977;
+ --mr-welcome-background-color: #F8F6F4;
+ --mr-screen-heading-color: var(--in-content-text-color);
+ --mr-welcome-background-gradient: linear-gradient(0deg, rgba(144, 89, 255, 20%) 0%, rgba(2, 144, 238, 20%) 100%);
+ --mr-screen-background-color: #F8F6F4;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Ubuntu, "Helvetica Neue", sans-serif;
+ font-size: 16px;
+ position: relative;
+ text-align: center;
+ height: 100vh;
+ --transition: 0.6s opacity, 0.6s scale, 0.6s rotate, 0.6s translate;
+}
+@media (prefers-color-scheme: dark) {
+ .onboardingContainer {
+ --grey-subtitle-1: #FFF;
+ --mr-welcome-background-color: #333336;
+ --mr-welcome-background-gradient: linear-gradient(0deg, rgba(144, 89, 255, 30%) 0%, rgba(2, 144, 238, 30%) 100%);
+ --mr-screen-background-color: #62697A;
+ }
+}
+@media (prefers-contrast) {
+ .onboardingContainer {
+ --mr-screen-background-color: buttontext;
+ --mr-screen-heading-color: buttonface;
+ background-color: var(--in-content-page-background);
+ }
+}
+@media (prefers-reduced-motion: no-preference) {
+ .onboardingContainer {
+ --translate: 30px;
+ --rotate: 20deg;
+ --scale: 0.4;
+ --progress-bar-transition: 0.6s translate;
+ }
+ .onboardingContainer:dir(rtl) {
+ --scale: -0.4 0.4;
+ }
+}
+@media (prefers-reduced-motion: reduce) {
+ .onboardingContainer {
+ --translate: 0;
+ --rotate: 0deg;
+ --scale: 1;
+ --progress-bar-transition: none;
+ }
+ .onboardingContainer:dir(rtl) {
+ --scale: -1 1;
+ }
+}
+.onboardingContainer:dir(rtl) {
+ transform: rotateY(180deg);
+}
+.onboardingContainer .section-main {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ width: 504px;
+ flex-shrink: 0;
+}
+.onboardingContainer .section-main:not(.embedded-migration) {
+ position: relative;
+}
+.onboardingContainer .main-content {
+ background-color: var(--in-content-page-background);
+ border-radius: 20px;
+ box-shadow: 0 2px 14px 0 rgba(0, 0, 0, 0.2);
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ padding: 0;
+ transition: var(--transition);
+ z-index: 1;
+ box-sizing: border-box;
+}
+.onboardingContainer .main-content.no-steps {
+ padding-bottom: 48px;
+}
+.onboardingContainer .main-content .main-content-inner {
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ justify-content: space-around;
+}
+.onboardingContainer .main-content .no-steps .main-content {
+ padding-bottom: 48px;
+}
+.onboardingContainer .main-content .no-steps .steps {
+ display: none;
+}
+.onboardingContainer .screen {
+ display: flex;
+ position: relative;
+ flex-flow: row nowrap;
+ height: 100%;
+ min-height: 500px;
+ overflow: hidden;
+}
+.onboardingContainer .screen.light-text {
+ --in-content-page-color: rgb(251, 251, 254);
+ --in-content-primary-button-text-color: rgb(43, 42, 51);
+ --in-content-primary-button-text-color-hover: rgb(43, 42, 51);
+ --in-content-primary-button-background: rgb(0, 221, 255);
+ --in-content-primary-button-background-hover: rgb(128, 235, 255);
+ --in-content-primary-button-background-active: rgb(170, 242, 255);
+ --in-content-button-text-color: var(--in-content-page-color);
+}
+.onboardingContainer .screen.dark-text {
+ --in-content-page-color: rgb(21, 20, 26);
+ --in-content-primary-button-text-color: rgb(251, 251, 254);
+ --in-content-primary-button-text-color-hover: rgb(251, 251, 254);
+ --in-content-primary-button-background: #0061E0;
+ --in-content-primary-button-background-hover: #0250BB;
+ --in-content-primary-button-background-active: #053E94;
+ --in-content-primary-button-border-color: transparent;
+ --in-content-primary-button-border-hover: transparent;
+ --in-content-button-text-color: var(--in-content-page-color);
+}
+.onboardingContainer .screen:dir(rtl) {
+ transform: rotateY(180deg);
+}
+.onboardingContainer .screen[pos=center] {
+ background-color: rgba(21, 20, 26, 0.5);
+ min-width: 504px;
+}
+.onboardingContainer .screen[pos=center].with-noodles {
+ min-width: 610px;
+ min-height: 610px;
+}
+.onboardingContainer .screen[pos=center].with-noodles .section-main {
+ height: 504px;
+}
+.onboardingContainer .screen[pos=center].with-video {
+ justify-content: center;
+ background: none;
+ align-items: center;
+}
+.onboardingContainer .screen[pos=center].with-video .section-main {
+ width: 800px;
+ height: 550px;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content {
+ background-color: var(--mr-welcome-background-color);
+ border-radius: 8px;
+ box-shadow: 0 2px 14px rgba(58, 57, 68, 0.2);
+ padding: 44px 85px 20px;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .welcome-text {
+ margin: 0;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .main-content-inner {
+ justify-content: space-between;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content h1,
+.onboardingContainer .screen[pos=center].with-video .main-content h2 {
+ align-self: start;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content h1 {
+ font-size: 24px;
+ line-height: 28.8px;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content h2 {
+ font-size: 15px;
+ line-height: 22px;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta {
+ justify-content: end;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .arrow-icon {
+ -moz-context-properties: fill;
+ fill: currentColor;
+ text-decoration: none;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .arrow-icon::after {
+ content: "";
+ padding-inline-end: 12px;
+ margin-inline-start: 4px;
+ background: url("chrome://browser/skin/forward.svg") no-repeat center/12px;
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .arrow-icon:dir(rtl)::after {
+ background-image: url("chrome://browser/skin/back.svg");
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .secondary {
+ background-color: var(--in-content-button-background);
+ border: 1px solid var(--in-content-button-border-color);
+ line-height: 12px;
+ font-size: 0.72em;
+ font-weight: 600;
+ padding: 8px 16px;
+ text-decoration: none;
+ cursor: default;
+ color: var(--in-content-button-text-color);
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .secondary:hover, .onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .secondary[open] {
+ background-color: var(--in-content-button-background-hover);
+ color: var(--in-content-button-text-color-hover);
+}
+.onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .secondary:hover:active, .onboardingContainer .screen[pos=center].with-video .main-content .secondary-cta .secondary[open]:active {
+ background-color: var(--in-content-button-background-active);
+ color: var(--in-content-button-text-color-active);
+}
+.onboardingContainer .screen[pos=center].addons-picker {
+ justify-content: center;
+ align-items: center;
+ background: none;
+}
+.onboardingContainer .screen[pos=center].addons-picker .section-main {
+ width: 800px;
+ height: 550px;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content {
+ background-color: var(--in-content-page-background);
+ border-radius: 8px;
+ box-shadow: 0 2px 14px rgba(58, 57, 68, 0.2);
+ overflow: hidden;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .welcome-text {
+ display: flex;
+ margin: 0;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .main-content-inner {
+ padding: 25px 56px 0;
+ justify-content: space-between;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content h1,
+.onboardingContainer .screen[pos=center].addons-picker .main-content h2 {
+ align-self: start;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content h2 {
+ font-size: 15px;
+ text-align: start;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .brand-logo {
+ display: block;
+ margin: 40px 56px 0;
+ transition: var(--transition);
+ height: 30px;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .additional-cta {
+ display: block;
+ margin: 8px 0;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .additional-cta.cta-link {
+ background: none;
+ padding: 0;
+ font-weight: normal;
+ background: none;
+ text-decoration: underline;
+ cursor: pointer;
+ color: var(--link-color);
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .additional-cta.cta-link:hover {
+ color: var(--link-color-hover);
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .additional-cta.cta-link:active {
+ color: var(--link-color-active);
+}
+@media (prefers-contrast) {
+ .onboardingContainer .screen[pos=center].addons-picker .main-content .additional-cta.cta-link:active {
+ text-decoration: none;
+ }
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .additional-cta.secondary:hover {
+ background-color: var(--in-content-button-background-hover);
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta {
+ justify-content: end;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .arrow-icon {
+ -moz-context-properties: fill;
+ fill: currentColor;
+ text-decoration: none;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .arrow-icon::after {
+ content: "";
+ padding-inline-end: 12px;
+ margin-inline-start: 4px;
+ background: url("chrome://browser/skin/forward.svg") no-repeat center/12px;
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .arrow-icon:dir(rtl)::after {
+ background-image: url("chrome://browser/skin/back.svg");
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .secondary {
+ background-color: var(--in-content-button-background);
+ border: 1px solid var(--in-content-button-border-color);
+ line-height: 12px;
+ font-size: 0.72em;
+ font-weight: 600;
+ padding: 8px 16px;
+ text-decoration: none;
+ cursor: default;
+ color: var(--in-content-button-text-color);
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .secondary:hover, .onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .secondary[open] {
+ background-color: var(--in-content-button-background-hover);
+ color: var(--in-content-button-text-color-hover);
+}
+.onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .secondary:hover:active, .onboardingContainer .screen[pos=center].addons-picker .main-content .secondary-cta .secondary[open]:active {
+ background-color: var(--in-content-button-background-active);
+ color: var(--in-content-button-text-color-active);
+}
+.onboardingContainer .screen[pos=center].addons-picker .addon-container {
+ display: flex;
+ border: 1px solid var(--in-content-border-color);
+ box-shadow: 0 1px 2px 0 var(--in-content-border-color);
+ border-radius: 4px;
+ margin: 5px auto;
+ text-align: start;
+}
+.onboardingContainer .screen[pos=center].addons-picker .addon-container .rtamo-icon img {
+ margin: 10px;
+}
+.onboardingContainer .screen[pos=center].addons-picker .addon-container .addon-details {
+ display: grid;
+ width: 70%;
+}
+.onboardingContainer .screen[pos=center].addons-picker .addon-container .addon-title {
+ margin: 10px 0 3px;
+ font-size: 16px;
+ font-weight: 600;
+}
+.onboardingContainer .screen[pos=center].addons-picker .addon-container .addon-description {
+ margin: 2px 0 10px;
+ font-size: 13px;
+ font-weight: 400;
+}
+.onboardingContainer .screen[pos=center].addons-picker .addon-container .install-button-wrapper {
+ display: flex;
+}
+.onboardingContainer .screen[pos=center].addons-picker .addon-container button {
+ align-self: center;
+ width: 124px;
+}
+.onboardingContainer .screen[pos=center].addons-picker .loader {
+ width: 1em;
+ height: 1em;
+ border: 3px solid var(--in-content-primary-button-text-color);
+ border-bottom-color: transparent;
+ border-radius: 50%;
+ box-sizing: border-box;
+ animation: rotation 1s linear infinite;
+ justify-self: center;
+}
+@keyframes rotation {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(360deg);
+ }
+}
+.onboardingContainer .screen[pos=center].addons-picker .loaderContainer {
+ display: flex;
+ padding: 1.5px 37.5px;
+ margin: auto;
+}
+.onboardingContainer .screen:not([pos=split]) .secondary-cta .secondary {
+ background: none;
+ text-decoration: underline;
+ cursor: pointer;
+ color: var(--link-color);
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 20px;
+}
+.onboardingContainer .screen:not([pos=split]) .secondary-cta .secondary:hover {
+ color: var(--link-color-hover);
+}
+.onboardingContainer .screen:not([pos=split]) .secondary-cta .secondary:active {
+ color: var(--link-color-active);
+}
+@media (prefers-contrast) {
+ .onboardingContainer .screen:not([pos=split]) .secondary-cta .secondary:active {
+ text-decoration: none;
+ }
+}
+.onboardingContainer .screen:not([pos=split]) .secondary-cta.top button {
+ color: #FFF;
+}
+.onboardingContainer .screen:not([pos=split]) .secondary-cta.top button:hover {
+ color: #E0E0E6;
+}
+.onboardingContainer .screen:not([pos=split]) migration-wizard {
+ padding: 5px 60px;
+}
+.onboardingContainer .screen:not([pos=split]) migration-wizard::part(header) {
+ text-align: center;
+}
+.onboardingContainer .screen:not([pos=split]) migration-wizard::part(buttons) {
+ margin: 32px auto 0;
+}
+.onboardingContainer .screen:not([pos=split]) .welcome-text:empty {
+ margin: 0;
+}
+.onboardingContainer .screen[pos=split] {
+ margin: auto;
+ min-height: 550px;
+}
+.onboardingContainer .screen[pos=split]::before {
+ content: "";
+ position: absolute;
+ box-shadow: 0 2px 14px 0 rgba(0, 0, 0, 0.2);
+ width: 800px;
+ height: 550px;
+ border-radius: 8px;
+ inset: 0;
+ margin: auto;
+ pointer-events: none;
+}
+.onboardingContainer .screen[pos=split] .section-secondary,
+.onboardingContainer .screen[pos=split] .section-main {
+ width: 400px;
+ height: 550px;
+}
+.onboardingContainer .screen[pos=split] .secondary-cta.top {
+ position: fixed;
+ padding-inline-end: 0;
+}
+.onboardingContainer .screen[pos=split] .secondary-cta.top button {
+ padding: 7px 15px;
+}
+.onboardingContainer .screen[pos=split] .section-main {
+ flex-direction: row;
+ display: block;
+ margin: auto auto auto 0;
+}
+.onboardingContainer .screen[pos=split] .section-main:dir(rtl) {
+ margin: auto 0 auto auto;
+}
+.onboardingContainer .screen[pos=split] .section-main.embedded-migration .main-content {
+ padding-block: 100px 0;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content {
+ border-radius: 0 8px 8px 0;
+ overflow: hidden;
+ padding-inline: 35px 20px;
+ padding-block: 120px 0;
+ box-shadow: none;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content.no-steps {
+ padding-bottom: 48px;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content:dir(rtl) {
+ border-radius: 8px 0 0 8px;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .main-content-inner {
+ min-height: 330px;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .main-content-inner .mobile-download-buttons {
+ padding: 0;
+ margin-inline-start: -5px;
+ display: flex;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .main-content-inner .mobile-download-buttons button {
+ cursor: pointer;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .main-content-inner .qr-code-image {
+ margin: 5px 0 10px;
+ display: flex;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .main-content-inner .language-switcher-container .primary {
+ margin-bottom: 5px;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons {
+ position: relative;
+ text-align: initial;
+ height: 100%;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .checkbox-container {
+ font-size: 13px;
+ margin-block: 1em;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .checkbox-container:not(.multi-select-item) {
+ transition: var(--transition);
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .checkbox-container input,
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .checkbox-container label {
+ vertical-align: middle;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box {
+ margin: 8px 0;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box .additional-cta {
+ margin: 0;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box .additional-cta.cta-link {
+ background: none;
+ text-decoration: underline;
+ cursor: pointer;
+ color: var(--link-color);
+ padding: 0;
+ font-weight: normal;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box .additional-cta.cta-link:hover {
+ color: var(--link-color-hover);
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box .additional-cta.cta-link:active {
+ color: var(--link-color-active);
+}
+@media (prefers-contrast) {
+ .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box .additional-cta.cta-link:active {
+ text-decoration: none;
+ }
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box .additional-cta.secondary:hover, .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .additional-cta-box .additional-cta.secondary[open] {
+ background-color: var(--in-content-button-background-hover);
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons.additional-cta-container {
+ flex-wrap: nowrap;
+ align-items: start;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta {
+ position: absolute;
+ bottom: -30px;
+ inset-inline-end: 0;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .secondary {
+ background-color: var(--in-content-button-background);
+ border: 1px solid var(--in-content-button-border-color);
+ line-height: 12px;
+ font-size: 0.72em;
+ font-weight: 600;
+ padding: 8px 16px;
+ text-decoration: none;
+ cursor: default;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .secondary:hover, .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .secondary[open] {
+ background-color: var(--in-content-button-background-hover);
+ color: var(--in-content-button-text-color-hover);
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .secondary:hover:active, .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .secondary[open]:active {
+ background-color: var(--in-content-button-background-active);
+ color: var(--in-content-button-text-color-active);
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .arrow-icon {
+ -moz-context-properties: fill;
+ fill: currentColor;
+ text-decoration: none;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .arrow-icon::after {
+ content: "";
+ padding-inline-end: 12px;
+ margin-inline-start: 4px;
+ background: url("chrome://browser/skin/forward.svg") no-repeat center/12px;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta .arrow-icon:dir(rtl)::after {
+ background-image: url("chrome://browser/skin/back.svg");
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .logo-container {
+ text-align: start;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .brand-logo {
+ height: 25px;
+ margin-block: 0;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .logo-alt {
+ width: inherit;
+ height: inherit;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text {
+ margin-inline: 0 10px;
+ margin-block: 10px 35px;
+ text-align: initial;
+ align-items: initial;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text:empty {
+ margin: 0;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text h1 {
+ font-size: 24px;
+ line-height: 1.2;
+ width: 300px;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text h2 {
+ margin: 10px 0 0;
+ min-height: 1em;
+ font-size: 15px;
+ line-height: 1.5;
+}
+@media (prefers-contrast: no-preference) {
+ .onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text h2 {
+ color: #5B5B66;
+ }
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text h1,
+.onboardingContainer .screen[pos=split] .section-main .main-content .primary {
+ margin: 0;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .steps {
+ z-index: 1;
+}
+.onboardingContainer .screen[pos=split] .section-main .main-content .steps.progress-bar {
+ width: 400px;
+ margin-inline: -35px;
+}
+@media (prefers-contrast) {
+ .onboardingContainer .screen[pos=split] .section-main .main-content {
+ border: 1px solid var(--in-content-page-color);
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .steps.progress-bar {
+ border-top: 1px solid var(--in-content-page-color);
+ background-color: var(--in-content-page-background);
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .steps.progress-bar .indicator {
+ background-color: var(--in-content-accent-color);
+ }
+}
+.onboardingContainer .screen[pos=split] .section-secondary {
+ --mr-secondary-position: center center / auto 350px;
+ border-radius: 8px 0 0 8px;
+ margin: auto 0 auto auto;
+ display: flex;
+ align-items: center;
+ -moz-context-properties: fill, stroke, fill-opacity, stroke-opacity;
+ stroke: currentColor;
+}
+.onboardingContainer .screen[pos=split] .section-secondary:dir(rtl) {
+ border-radius: 0 8px 8px 0;
+ margin: auto auto auto 0;
+}
+.onboardingContainer .screen[pos=split] .section-secondary h1 {
+ color: var(--mr-screen-heading-color);
+ font-weight: 700;
+ font-size: 47px;
+ line-height: 110%;
+ max-width: 340px;
+ text-align: initial;
+ white-space: pre-wrap;
+ text-shadow: none;
+ margin-inline: 40px 0;
+}
+.onboardingContainer .screen[pos=split] .section-secondary .image-alt {
+ width: inherit;
+ height: inherit;
+}
+.onboardingContainer .screen[pos=split] .section-secondary .hero-image {
+ flex: 1;
+ display: flex;
+ justify-content: center;
+ max-height: 100%;
+}
+.onboardingContainer .screen[pos=split] .section-secondary .hero-image img {
+ width: 100%;
+ max-width: 180px;
+ margin: 25px 0;
+ padding-bottom: 30px;
+}
+@media only screen and (width <= 800px) {
+ .onboardingContainer .screen[pos=split] .section-secondary .hero-image img {
+ padding-bottom: unset;
+ }
+}
+.onboardingContainer .screen[pos=split] .multi-select-container {
+ margin-inline: 0 10px;
+}
+@media only screen and (width <= 800px) {
+ .onboardingContainer .screen[pos=split] .multi-select-container {
+ flex-direction: column;
+ align-self: center;
+ align-items: start;
+ justify-content: center;
+ width: 240px;
+ padding: 0 30px;
+ margin-inline: 0;
+ box-sizing: content-box;
+ }
+}
+.onboardingContainer .screen[pos=split] .tiles-theme-container {
+ margin-block: -20px auto;
+ align-items: initial;
+}
+.onboardingContainer .screen[pos=split] .tiles-theme-container .theme {
+ min-width: 38px;
+}
+@media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ .onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text h2 {
+ color: #CFCFD8;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary {
+ background-color: #2B2A33;
+ }
+}
+@media only screen and (width >= 800px) {
+ .onboardingContainer .screen[pos=split] .tiles-theme-section {
+ margin-inline-start: -10px;
+ }
+}
+@media only screen and (width <= 800px) {
+ .onboardingContainer .screen[pos=split] {
+ flex-direction: column;
+ min-height: 550px;
+ }
+ .onboardingContainer .screen[pos=split]::before {
+ width: 400px;
+ }
+ .onboardingContainer .screen[pos=split] .section-secondary,
+.onboardingContainer .screen[pos=split] .section-main {
+ width: 400px;
+ }
+ .onboardingContainer .screen[pos=split] .section-secondary {
+ --mr-secondary-background-position-y: top;
+ --mr-secondary-position: center var(--mr-secondary-background-position-y) / 75%;
+ border-radius: 8px 8px 0 0;
+ margin: auto auto 0;
+ height: 100px;
+ }
+ .onboardingContainer .screen[pos=split] .section-secondary .hero-image img {
+ margin: 6px 0;
+ }
+ .onboardingContainer .screen[pos=split] .section-secondary .message-text {
+ margin-inline: auto;
+ }
+ .onboardingContainer .screen[pos=split] .section-secondary h1 {
+ font-size: 35px;
+ text-align: center;
+ white-space: normal;
+ margin-inline: auto;
+ margin-block: 14px 6px;
+ }
+ .onboardingContainer .screen[pos=split] .section-secondary:dir(rtl) {
+ margin: auto auto 0;
+ border-radius: 8px 8px 0 0;
+ }
+ .onboardingContainer .screen[pos=split] .section-secondary.with-secondary-section-hidden {
+ display: none;
+ }
+ .onboardingContainer .screen[pos=split] migration-wizard::part(deck) {
+ min-width: 330px;
+ margin-inline: 36px;
+ }
+ .onboardingContainer .screen[pos=split] .section-main {
+ margin: 0 auto auto;
+ height: 450px;
+ }
+ .onboardingContainer .screen[pos=split] .section-main migration-wizard::part(buttons) {
+ flex-direction: column;
+ margin-inline: 46px;
+ }
+ .onboardingContainer .screen[pos=split] .section-main[hide-secondary-section=responsive] {
+ height: 550px;
+ margin: auto;
+ }
+ .onboardingContainer .screen[pos=split] .section-main[hide-secondary-section=responsive] .main-content {
+ padding: 50px 0 0;
+ border-radius: 8px;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content {
+ border-radius: 0 0 8px 8px;
+ padding: 30px 0 0;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .main-content-inner {
+ align-items: center;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container {
+ text-align: center;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container .brand-logo {
+ min-height: 25px;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container .brand-logo, .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container .brand-logo:dir(rtl) {
+ background-position: center;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container .logo-alt {
+ width: inherit;
+ height: inherit;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text {
+ align-items: center;
+ text-align: center;
+ margin-inline: 0;
+ padding-inline: 30px;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text .spacer-bottom,
+.onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text .spacer-top {
+ display: none;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons {
+ text-align: center;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .checkbox-container {
+ display: none;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .action-buttons .secondary-cta {
+ position: relative;
+ margin-block: 10px 0;
+ bottom: 0;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .primary,
+.onboardingContainer .screen[pos=split] .section-main .main-content .secondary {
+ min-width: 240px;
+ margin-inline: 0;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .steps {
+ padding-block: 0;
+ margin: 0;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .main-content .steps.progress-bar {
+ margin-inline: 0;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .additional-cta.cta-link {
+ align-self: center;
+ }
+ .onboardingContainer .screen[pos=split] .section-main .dismiss-button {
+ top: -100px;
+ }
+ .onboardingContainer .screen[pos=split] .section-main:dir(rtl) {
+ margin: 0 auto auto;
+ }
+ .onboardingContainer .screen[pos=split] .section-main:dir(rtl) .main-content {
+ border-radius: 0 0 8px 8px;
+ }
+}
+@media only screen and (height <= 650px) and (800px <= width <= 990px) {
+ .onboardingContainer .screen[pos=split] .section-main .secondary-cta.top {
+ display: none;
+ }
+}
+@media only screen and (height <= 650px) and (width <= 620px) {
+ .onboardingContainer .screen[pos=split] .section-main .secondary-cta.top {
+ position: absolute;
+ padding: 0;
+ top: 0;
+ inset-inline-end: 0;
+ }
+}
+.onboardingContainer .brand-logo {
+ margin-block: 60px 10px;
+ transition: var(--transition);
+ height: 80px;
+}
+.onboardingContainer .brand-logo.cta-top {
+ margin-top: 25px;
+}
+.onboardingContainer .brand-logo.hide {
+ visibility: hidden;
+ padding: unset;
+ margin-top: 50px;
+}
+.onboardingContainer .logo-alt {
+ width: inherit;
+ height: inherit;
+}
+.onboardingContainer .rtamo-theme-icon {
+ max-height: 30px;
+ border-radius: 2px;
+ margin-bottom: 10px;
+ margin-top: 24px;
+}
+.onboardingContainer .rtamo-icon {
+ text-align: start;
+}
+@media only screen and (width <= 800px) {
+ .onboardingContainer .rtamo-icon {
+ text-align: center;
+ }
+}
+.onboardingContainer .text-link {
+ background: none;
+ text-decoration: underline;
+ cursor: pointer;
+ color: var(--link-color);
+}
+.onboardingContainer .text-link:hover {
+ color: var(--link-color-hover);
+}
+.onboardingContainer .text-link:active {
+ color: var(--link-color-active);
+}
+@media (prefers-contrast) {
+ .onboardingContainer .text-link:active {
+ text-decoration: none;
+ }
+}
+.onboardingContainer .welcome-text {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+ margin: 0.5em 1em;
+ transition: var(--transition);
+}
+.onboardingContainer .welcome-text h1,
+.onboardingContainer .welcome-text h2 {
+ color: var(--in-content-page-color);
+ line-height: 1.5;
+}
+.onboardingContainer .welcome-text h1 {
+ font-size: 24px;
+ font-weight: 600;
+ margin: 0 6px;
+ letter-spacing: -0.02em;
+ outline: none;
+}
+.onboardingContainer .welcome-text h2 {
+ font-size: 16px;
+ font-weight: normal;
+ margin: 10px 6px 0;
+ max-width: 750px;
+ letter-spacing: -0.01em;
+}
+.onboardingContainer .welcome-text.fancy h1 {
+ background-image: linear-gradient(90deg, #9059FF, #FF4AA2, #FF8C00, #FF4AA2, #9059FF);
+ background-clip: text;
+ background-size: 200%;
+}
+@media (prefers-contrast: no-preference) {
+ .onboardingContainer .welcome-text.fancy h1 {
+ color: transparent;
+ }
+}
+@media (prefers-color-scheme: dark) {
+ .onboardingContainer .welcome-text.fancy h1 {
+ background-image: linear-gradient(90deg, #C688FF, #FF84C0, #FFBD4F, #FF84C0, #C688FF);
+ }
+ .onboardingContainer .welcome-text.fancy h1::selection {
+ color: #FFF;
+ background-color: #696977;
+ }
+}
+.onboardingContainer .welcome-text.shine h1 {
+ animation: shine 50s linear infinite;
+ background-size: 400%;
+}
+@keyframes shine {
+ to {
+ background-position: 400%;
+ }
+}
+.onboardingContainer .welcome-text .cta-paragraph a {
+ margin: 0;
+ text-decoration: underline;
+ cursor: pointer;
+}
+.onboardingContainer .screen.light-text .welcome-text.fancy h1 {
+ background-image: linear-gradient(90deg, #C688FF, #FF84C0, #FFBD4F, #FF84C0, #C688FF);
+}
+.onboardingContainer .screen.dark-text .welcome-text.fancy h1 {
+ background-image: linear-gradient(90deg, #9059FF, #FF4AA2, #FF8C00, #FF4AA2, #9059FF);
+}
+.onboardingContainer .welcomeZap span {
+ position: relative;
+ z-index: 1;
+ white-space: nowrap;
+}
+.onboardingContainer .welcomeZap .zap::after {
+ display: block;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ content: "";
+ position: absolute;
+ top: calc(100% - 0.15em);
+ width: 100%;
+ height: 0.3em;
+ left: 0;
+ z-index: -1;
+ transform: scaleY(3);
+}
+.onboardingContainer .welcomeZap .zap.short::after {
+ background-image: url("chrome://activity-stream/content/data/content/assets/short-zap.svg");
+}
+.onboardingContainer .welcomeZap .zap.long::after {
+ background-image: url("chrome://activity-stream/content/data/content/assets/long-zap.svg");
+}
+.onboardingContainer .language-loader {
+ filter: invert(1);
+ margin-inline-end: 10px;
+ position: relative;
+ top: 3px;
+ width: 16px;
+ height: 16px;
+ margin-top: -6px;
+}
+@media (prefers-color-scheme: dark) {
+ .onboardingContainer .language-loader {
+ filter: invert(0);
+ }
+}
+.onboardingContainer .tiles-theme-container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ margin: 10px auto;
+}
+.onboardingContainer .sr-only {
+ opacity: 0;
+ overflow: hidden;
+ position: absolute;
+}
+.onboardingContainer .sr-only.input {
+ height: 1px;
+ width: 1px;
+}
+.onboardingContainer .tiles-theme-section {
+ border: 0;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 5px;
+ justify-content: space-evenly;
+ margin-inline: 10px;
+ padding: 10px;
+ transition: var(--transition);
+}
+.onboardingContainer .tiles-theme-section:hover, .onboardingContainer .tiles-theme-section:active, .onboardingContainer .tiles-theme-section:focus-within {
+ border-radius: 8px;
+ outline: 2px solid var(--in-content-primary-button-background);
+}
+.onboardingContainer .tiles-theme-section .theme {
+ align-items: center;
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ padding: 0;
+ min-width: 50px;
+ width: 180px;
+ color: #000;
+ box-shadow: none;
+ border-radius: 4px;
+ cursor: pointer;
+ z-index: 0;
+}
+.onboardingContainer .tiles-theme-section .theme:focus, .onboardingContainer .tiles-theme-section .theme:active {
+ outline: initial;
+ outline-offset: initial;
+}
+.onboardingContainer .tiles-theme-section .theme .icon {
+ background-size: cover;
+ width: 40px;
+ height: 40px;
+ border-radius: 40px;
+ outline: 1px solid var(--in-content-border-color);
+ outline-offset: -0.5px;
+ z-index: -1;
+}
+.onboardingContainer .tiles-theme-section .theme .icon:dir(rtl) {
+ transform: scaleX(-1);
+}
+.onboardingContainer .tiles-theme-section .theme .icon:focus, .onboardingContainer .tiles-theme-section .theme .icon:active, .onboardingContainer .tiles-theme-section .theme .icon.selected {
+ outline: 2px solid var(--in-content-primary-button-background);
+ outline-offset: 2px;
+}
+.onboardingContainer .tiles-theme-section .theme .icon.light {
+ background-image: url("resource://builtin-themes/light/icon.svg");
+}
+.onboardingContainer .tiles-theme-section .theme .icon.dark {
+ background-image: url("resource://builtin-themes/dark/icon.svg");
+}
+.onboardingContainer .tiles-theme-section .theme .icon.alpenglow {
+ background-image: url("resource://builtin-themes/alpenglow/icon.svg");
+}
+.onboardingContainer .tiles-theme-section .theme .icon.default, .onboardingContainer .tiles-theme-section .theme .icon.automatic {
+ background-image: url("resource://default-theme/icon.svg");
+}
+.onboardingContainer .tiles-theme-section .theme .text {
+ display: flex;
+ color: var(--in-content-page-color);
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 20px;
+ margin-inline-start: 0;
+ margin-top: 9px;
+}
+.onboardingContainer .tiles-theme-section legend {
+ cursor: default;
+}
+.onboardingContainer .tiles-container {
+ margin: 10px auto;
+}
+.onboardingContainer .tiles-container.info {
+ padding: 6px 12px 12px;
+}
+.onboardingContainer .tiles-container.info:hover, .onboardingContainer .tiles-container.info:focus {
+ background-color: rgba(217, 217, 227, 0.3);
+ border-radius: 4px;
+}
+.onboardingContainer .tiles-delayed {
+ animation: fadein 0.4s;
+}
+.onboardingContainer .multi-select-container {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: wrap;
+ flex-shrink: 0;
+ align-items: flex-start;
+ gap: 16px;
+ margin-block: -1em 2em;
+ margin-inline: 1em;
+ color: #5B5B66;
+ font-weight: 400;
+ font-size: 14px;
+ text-align: initial;
+ transition: var(--transition);
+ z-index: 1;
+}
+.onboardingContainer .multi-select-container #multi-stage-multi-select-label {
+ color: var(--in-content-page-color);
+ line-height: 1.5;
+ font-size: 16px;
+ font-weight: normal;
+ letter-spacing: -0.01em;
+ margin: calc(0.5em + 10px) 6px 0;
+ max-width: 750px;
+}
+.onboardingContainer .screen[pos=split] .multi-select-container #multi-stage-multi-select-label {
+ margin: calc(-35px + 1em + 10px) 0 0;
+ min-height: 1em;
+ font-size: 15px;
+ line-height: 1.5;
+}
+@media (prefers-contrast: no-preference) {
+ .onboardingContainer .screen[pos=split] .multi-select-container #multi-stage-multi-select-label {
+ color: #5B5B66;
+ }
+}
+@media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ .onboardingContainer .screen[pos=split] .multi-select-container #multi-stage-multi-select-label {
+ color: #CFCFD8;
+ }
+}
+
+.onboardingContainer .multi-select-container .checkbox-container {
+ display: flex;
+}
+@media (prefers-contrast: no-preference) and (prefers-color-scheme: dark) {
+ .onboardingContainer .multi-select-container {
+ color: #CFCFD8;
+ }
+}
+.onboardingContainer .mobile-downloads .qr-code-image {
+ margin: 24px 0 10px;
+ width: 113px;
+ height: 113px;
+}
+.onboardingContainer .mobile-downloads .email-link {
+ background: none;
+ text-decoration: underline;
+ cursor: pointer;
+ color: var(--link-color);
+ font-size: 16px;
+ font-weight: 400;
+}
+.onboardingContainer .mobile-downloads .email-link:hover {
+ color: var(--link-color-hover);
+}
+.onboardingContainer .mobile-downloads .email-link:active {
+ color: var(--link-color-active);
+}
+@media (prefers-contrast) {
+ .onboardingContainer .mobile-downloads .email-link:active {
+ text-decoration: none;
+ }
+}
+.onboardingContainer .mobile-downloads .email-link:hover {
+ background: none;
+}
+.onboardingContainer .mobile-downloads .ios button {
+ background-image: url("chrome://app-marketplace-icons/locale/ios.svg");
+}
+.onboardingContainer .mobile-downloads .android button {
+ background-image: url("chrome://app-marketplace-icons/locale/android.png");
+}
+.onboardingContainer .mobile-download-buttons {
+ list-style: none;
+ padding: 10px 0;
+ margin: 0;
+}
+.onboardingContainer .mobile-download-buttons li {
+ display: inline-block;
+}
+.onboardingContainer .mobile-download-buttons li button {
+ display: inline-block;
+ height: 45px;
+ width: 152px;
+ background-repeat: no-repeat;
+ background-size: contain;
+ background-position: center;
+ box-shadow: none;
+ border: 0;
+}
+.onboardingContainer .mobile-download-buttons li:not(:first-child) {
+ margin-inline: 5px 0;
+}
+.onboardingContainer .dismiss-button {
+ position: absolute;
+ z-index: 2;
+ top: 0;
+ left: auto;
+ right: 0;
+ box-sizing: border-box;
+ padding: 0;
+ margin: 16px;
+ display: block;
+ float: inline-end;
+ background: url("chrome://global/skin/icons/close.svg") no-repeat center/16px;
+ height: 32px;
+ width: 32px;
+ align-self: end;
+ min-height: 32px;
+ min-width: 32px;
+ -moz-context-properties: fill;
+ fill: currentColor;
+ transition: var(--transition);
+}
+.onboardingContainer .dismiss-button:dir(rtl) {
+ left: 0;
+ right: auto;
+}
+@keyframes fadein {
+ from {
+ opacity: 0;
+ }
+}
+.onboardingContainer .secondary-cta {
+ display: flex;
+ align-items: end;
+ flex-direction: row;
+ justify-content: center;
+ font-size: 14px;
+ transition: var(--transition);
+}
+.onboardingContainer .secondary-cta.top {
+ justify-content: end;
+ padding-inline-end: min(150px, 500px - 70vh);
+ padding-top: 4px;
+ position: absolute;
+ top: 10px;
+ inset-inline-end: 20px;
+ z-index: 2;
+}
+.onboardingContainer .secondary-cta span {
+ color: var(--grey-subtitle-1);
+ margin: 0 4px;
+}
+.onboardingContainer .message-text {
+ transition: var(--transition);
+}
+.onboardingContainer .helptext {
+ padding: 1em;
+ text-align: center;
+ color: var(--grey-subtitle-1);
+ font-size: 12px;
+ line-height: 18px;
+}
+.onboardingContainer .helptext.default {
+ align-self: center;
+ max-width: 40%;
+}
+.onboardingContainer .helptext span {
+ padding-inline-end: 4px;
+}
+.onboardingContainer .helptext-img {
+ height: 1.5em;
+ width: 1.5em;
+ margin-inline-end: 4px;
+ vertical-align: middle;
+}
+.onboardingContainer .helptext-img.end {
+ margin: 4px;
+}
+.onboardingContainer .helptext-img.footer {
+ vertical-align: bottom;
+}
+.onboardingContainer .steps {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ margin-top: 0;
+ padding-block: 16px 0;
+ transition: var(--transition);
+ z-index: -1;
+ height: 48px;
+ box-sizing: border-box;
+}
+.onboardingContainer .steps.has-helptext {
+ padding-bottom: 0;
+}
+.onboardingContainer .steps .indicator {
+ width: 0;
+ height: 0;
+ margin-inline-end: 4px;
+ margin-inline-start: 4px;
+ background: var(--grey-subtitle-1);
+ border-radius: 5px;
+ border: 3px solid var(--in-content-button-text-color);
+ opacity: 0.35;
+ box-sizing: inherit;
+}
+.onboardingContainer .steps .indicator.current {
+ opacity: 1;
+ border-color: var(--in-content-primary-button-background);
+}
+.onboardingContainer .steps .indicator.current:last-of-type:first-of-type {
+ opacity: 0;
+}
+.onboardingContainer .steps.progress-bar {
+ height: 6px;
+ padding-block: 0;
+ margin-block: 42px 0;
+ background-color: color-mix(in srgb, var(--in-content-button-text-color) 25%, transparent);
+ justify-content: start;
+ opacity: 1;
+ transition: none;
+}
+.onboardingContainer .steps.progress-bar .indicator {
+ width: 100%;
+ height: 100%;
+ margin-inline: -1px;
+ background-color: var(--in-content-primary-button-background);
+ border: 0;
+ border-radius: 0;
+ opacity: 1;
+ transition: var(--progress-bar-transition);
+ translate: calc(var(--progress-bar-progress, 0%) - 100%);
+}
+.onboardingContainer .steps.progress-bar .indicator:dir(rtl) {
+ translate: calc(var(--progress-bar-progress, 0%) * -1 + 100%);
+}
+.onboardingContainer .additional-cta-container[flow] {
+ display: flex;
+ flex-flow: column wrap;
+ align-items: center;
+}
+.onboardingContainer .additional-cta-container[flow][flow=row] {
+ flex-direction: row;
+ justify-content: center;
+}
+.onboardingContainer .additional-cta-container[flow][flow=row] .secondary-cta {
+ flex-basis: 100%;
+}
+.onboardingContainer .primary,
+.onboardingContainer .secondary,
+.onboardingContainer .additional-cta,
+.onboardingContainer .submenu-button {
+ font-size: 13px;
+ line-height: 16px;
+ padding: 11px 15px;
+ transition: var(--transition);
+}
+.onboardingContainer .primary.rtamo,
+.onboardingContainer .secondary.rtamo,
+.onboardingContainer .additional-cta.rtamo,
+.onboardingContainer .submenu-button.rtamo {
+ margin-top: 24px;
+}
+.onboardingContainer .secondary {
+ background-color: var(--in-content-button-background);
+ color: var(--in-content-button-text-color);
+}
+.onboardingContainer .split-button-container,
+.onboardingContainer .screen .action-buttons .split-button-container {
+ align-items: stretch;
+}
+.onboardingContainer .split-button-container:not([hidden]),
+.onboardingContainer .screen .action-buttons .split-button-container:not([hidden]) {
+ display: flex;
+}
+.onboardingContainer .split-button-container .primary:not(.submenu-button),
+.onboardingContainer .split-button-container .secondary:not(.submenu-button),
+.onboardingContainer .split-button-container .additional-cta:not(.submenu-button),
+.onboardingContainer .screen .action-buttons .split-button-container .primary:not(.submenu-button),
+.onboardingContainer .screen .action-buttons .split-button-container .secondary:not(.submenu-button),
+.onboardingContainer .screen .action-buttons .split-button-container .additional-cta:not(.submenu-button) {
+ border-start-end-radius: 0;
+ border-end-end-radius: 0;
+ margin-inline-end: 0;
+}
+.onboardingContainer .split-button-container .primary:focus-visible,
+.onboardingContainer .split-button-container .secondary:focus-visible,
+.onboardingContainer .split-button-container .additional-cta:focus-visible,
+.onboardingContainer .screen .action-buttons .split-button-container .primary:focus-visible,
+.onboardingContainer .screen .action-buttons .split-button-container .secondary:focus-visible,
+.onboardingContainer .screen .action-buttons .split-button-container .additional-cta:focus-visible {
+ z-index: 2;
+}
+.onboardingContainer .split-button-container .submenu-button,
+.onboardingContainer .screen .action-buttons .split-button-container .submenu-button {
+ border-start-start-radius: 0;
+ border-end-start-radius: 0;
+ margin-inline-start: 1px;
+ padding: 8px;
+ min-width: 30px;
+ box-sizing: border-box;
+ background-image: url("chrome://global/skin/icons/arrow-down.svg");
+ background-repeat: no-repeat;
+ background-size: 16px;
+ background-position: center;
+ -moz-context-properties: fill;
+ fill: currentColor;
+}
+.onboardingContainer .noodle {
+ display: block;
+ background-repeat: no-repeat;
+ background-size: 100% 100%;
+ position: absolute;
+ transition: var(--transition);
+}
+.onboardingContainer .noodle:dir(rtl) {
+ scale: -1 1;
+}
+.onboardingContainer .outline-L {
+ background-image: url("chrome://activity-stream/content/data/content/assets/noodle-outline-L.svg");
+}
+.onboardingContainer .solid-L {
+ background-image: url("chrome://activity-stream/content/data/content/assets/noodle-solid-L.svg");
+ -moz-context-properties: fill;
+ fill: var(--in-content-page-background);
+ display: none;
+}
+.onboardingContainer .purple-C {
+ background-image: url("chrome://activity-stream/content/data/content/assets/noodle-C.svg");
+ -moz-context-properties: fill;
+ fill: #E7258C;
+}
+.onboardingContainer .orange-L {
+ background-image: url("chrome://activity-stream/content/data/content/assets/noodle-solid-L.svg");
+ -moz-context-properties: fill;
+ fill: #FFA437;
+}
+.onboardingContainer .screen-1 .section-main {
+ z-index: 1;
+ margin: auto;
+}
+.onboardingContainer .screen-1 .outline-L {
+ width: 87px;
+ height: 80px;
+ transform: rotate(10deg) translate(-30%, 200%);
+ transition-delay: 0.4s;
+ z-index: 2;
+}
+.onboardingContainer .screen-1 .orange-L {
+ width: 550px;
+ height: 660px;
+ transform: rotate(-155deg) translate(11%, -18%);
+ transition-delay: 0.2s;
+}
+.onboardingContainer .screen-1 .purple-C {
+ width: 310px;
+ height: 260px;
+ transform: translate(-18%, -67%);
+}
+.onboardingContainer .screen-1 .yellow-circle {
+ width: 165px;
+ height: 165px;
+ border-radius: 50%;
+ transform: translate(230%, -5%);
+ background: #952BB9;
+ transition-delay: -0.2s;
+}
+.onboardingContainer .dialog-initial .brand-logo {
+ transition-delay: 0.6s;
+}
+.onboardingContainer .dialog-initial .welcome-text {
+ transition-delay: 0.8s;
+}
+.onboardingContainer .dialog-initial .tiles-theme-section,
+.onboardingContainer .dialog-initial .multi-select-container,
+.onboardingContainer .dialog-initial migration-wizard {
+ transition-delay: 0.9s;
+}
+.onboardingContainer .dialog-initial .primary,
+.onboardingContainer .dialog-initial .secondary,
+.onboardingContainer .dialog-initial .secondary-cta,
+.onboardingContainer .dialog-initial .steps,
+.onboardingContainer .dialog-initial .cta-link {
+ transition-delay: 1s;
+}
+.onboardingContainer .screen:not(.dialog-initial) .tiles-theme-section,
+.onboardingContainer .screen:not(.dialog-initial) .multi-select-container {
+ transition-delay: 0.2s;
+}
+.onboardingContainer .screen:not(.dialog-initial) .primary,
+.onboardingContainer .screen:not(.dialog-initial) .secondary,
+.onboardingContainer .screen:not(.dialog-initial) .secondary-cta,
+.onboardingContainer .screen:not(.dialog-initial) .cta-link {
+ transition-delay: 0.4s;
+}
+.onboardingContainer .screen-2 .section-main {
+ z-index: 1;
+ margin: auto;
+}
+.onboardingContainer .screen-2 .outline-L {
+ width: 87px;
+ height: 80px;
+ transform: rotate(250deg) translate(-420%, 425%);
+ transition-delay: 0.2s;
+ z-index: 2;
+}
+.onboardingContainer .screen-2 .orange-L {
+ height: 800px;
+ width: 660px;
+ transform: rotate(35deg) translate(-10%, -7%);
+ transition-delay: -0.4s;
+}
+.onboardingContainer .screen-2 .purple-C {
+ width: 392px;
+ height: 394px;
+ transform: rotate(260deg) translate(-34%, -35%);
+ transition-delay: -0.2s;
+ fill: #952BB9;
+}
+.onboardingContainer .screen-2 .yellow-circle {
+ width: 165px;
+ height: 165px;
+ border-radius: 50%;
+ transform: translate(160%, 130%);
+ background: #E7258C;
+}
+.onboardingContainer.transition-in .noodle {
+ opacity: 0;
+ rotate: var(--rotate);
+ scale: var(--scale);
+}
+.onboardingContainer.transition-in .dialog-initial .main-content,
+.onboardingContainer.transition-in .dialog-initial .dismiss-button {
+ translate: 0 calc(-2 * var(--translate));
+}
+.onboardingContainer.transition-in .dialog-initial .brand-logo,
+.onboardingContainer.transition-in .dialog-initial .steps {
+ opacity: 0;
+ translate: 0 calc(-1 * var(--translate));
+}
+.onboardingContainer.transition-in .screen .welcome-text,
+.onboardingContainer.transition-in .screen .multi-select-container,
+.onboardingContainer.transition-in .screen .tiles-theme-section,
+.onboardingContainer.transition-in .screen .primary,
+.onboardingContainer.transition-in .screen .checkbox-container:not(.multi-select-item),
+.onboardingContainer.transition-in .screen .secondary,
+.onboardingContainer.transition-in .screen .secondary-cta:not(.top),
+.onboardingContainer.transition-in .screen .cta-link,
+.onboardingContainer.transition-in .screen migration-wizard {
+ opacity: 0;
+ translate: 0 calc(-1 * var(--translate));
+}
+.onboardingContainer.transition-in .screen:not(.dialog-initial) .steps:not(.progress-bar) {
+ opacity: 0.2;
+}
+.onboardingContainer.transition-out .noodle {
+ opacity: 0;
+ rotate: var(--rotate);
+ scale: var(--scale);
+ transition-delay: 0.2s;
+}
+.onboardingContainer.transition-out .screen:not(.dialog-last) .main-content {
+ overflow: hidden;
+}
+.onboardingContainer.transition-out .screen:not(.dialog-last) .welcome-text,
+.onboardingContainer.transition-out .screen:not(.dialog-last) .multi-select-container {
+ opacity: 0;
+ translate: 0 var(--translate);
+ transition-delay: 0.1s;
+}
+.onboardingContainer.transition-out .screen:not(.dialog-last) .tiles-theme-section,
+.onboardingContainer.transition-out .screen:not(.dialog-last) migration-wizard {
+ opacity: 0;
+ translate: 0 var(--translate);
+ transition-delay: 0.2s;
+}
+.onboardingContainer.transition-out .screen:not(.dialog-last) .primary,
+.onboardingContainer.transition-out .screen:not(.dialog-last) .checkbox-container:not(.multi-select-item),
+.onboardingContainer.transition-out .screen:not(.dialog-last) .secondary,
+.onboardingContainer.transition-out .screen:not(.dialog-last) .secondary-cta:not(.top),
+.onboardingContainer.transition-out .screen:not(.dialog-last) .cta-link {
+ opacity: 0;
+ translate: 0 var(--translate);
+ transition-delay: 0.3s;
+}
+.onboardingContainer.transition-out .screen:not(.dialog-last) .steps:not(.progress-bar) {
+ opacity: 0.2;
+ transition-delay: 0.5s;
+}
+.onboardingContainer.transition-out .dialog-last .noodle {
+ transition-delay: 0s;
+}
+.onboardingContainer.transition-out .dialog-last .main-content,
+.onboardingContainer.transition-out .dialog-last .dismiss-button {
+ opacity: 0;
+ translate: 0 calc(2 * var(--translate));
+ transition-delay: 0.4s;
+}
+.onboardingContainer migration-wizard {
+ width: unset;
+ transition: var(--transition);
+}
+.onboardingContainer migration-wizard::part(buttons) {
+ margin-top: 24px;
+ justify-content: flex-start;
+}
+.onboardingContainer migration-wizard::part(deck) {
+ font-size: 0.83em;
+}
diff --git a/browser/components/aboutwelcome/content/aboutwelcome.html b/browser/components/aboutwelcome/content/aboutwelcome.html
new file mode 100644
index 0000000000..eb56c63110
--- /dev/null
+++ b/browser/components/aboutwelcome/content/aboutwelcome.html
@@ -0,0 +1,50 @@
+<!-- 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 http://mozilla.org/MPL/2.0/. -->
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta name="color-scheme" content="light dark" />
+ <meta
+ http-equiv="Content-Security-Policy"
+ content="default-src 'none'; object-src 'none'; script-src resource: chrome:; media-src resource: chrome: https://assets.mozilla.net https://www.mozilla.org; connect-src https:; img-src https: data: blob: chrome:; style-src resource: chrome:;"
+ />
+ <title data-l10n-id="onboarding-welcome-header"></title>
+ <link
+ rel="icon"
+ type="image/png"
+ href="chrome://branding/content/icon32.png"
+ />
+ <link rel="stylesheet" href="chrome://global/skin/in-content/common.css" />
+ <link
+ rel="stylesheet"
+ href="chrome://browser/content/aboutwelcome/aboutwelcome.css"
+ />
+ <link rel="localization" href="branding/brand.ftl" />
+ <link rel="localization" href="preview/onboarding.ftl" />
+ <link rel="localization" href="browser/newtab/onboarding.ftl" />
+ <link rel="localization" href="browser/spotlight.ftl" />
+ <link rel="localization" href="browser/migrationWizard.ftl" />
+ <link rel="localization" href="toolkit/branding/accounts.ftl" />
+ <link rel="localization" href="toolkit/branding/brandings.ftl" />
+ </head>
+ <body>
+ <div
+ id="multi-stage-message-root"
+ class="welcome-container"
+ role="presentation"
+ ></div>
+ <script src="resource://activity-stream/vendor/react.js"></script>
+ <script src="resource://activity-stream/vendor/react-dom.js"></script>
+ <script src="chrome://browser/content/contentTheme.js"></script>
+ <script src="chrome://browser/content/aboutwelcome/aboutwelcome.bundle.js"></script>
+ <script src="chrome://global/content/elements/named-deck.js" async></script>
+ <script src="chrome://global/content/elements/panel-list.js" async></script>
+ <script
+ src="chrome://browser/content/migration/migration-wizard.mjs"
+ type="module"
+ ></script>
+ </body>
+</html>
diff --git a/browser/components/aboutwelcome/content/onboarding.ftl b/browser/components/aboutwelcome/content/onboarding.ftl
new file mode 100644
index 0000000000..9a894baf88
--- /dev/null
+++ b/browser/components/aboutwelcome/content/onboarding.ftl
@@ -0,0 +1,13 @@
+# 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 http://mozilla.org/MPL/2.0/.
+
+### This file is not in a locales directory to prevent it from
+### being translated as the feature is still in heavy development
+### and strings are likely to change often.
+
+## AMO (Introduce Add-ons) onboarding screen strings
+
+amo-screen-title = Personalize your { -brand-short-name }
+amo-screen-subtitle = Add-ons are tiny apps that run in { -brand-short-name } and level up the way you browse — from ultimate privacy and safety to changing how { -brand-short-name } looks and behaves.
+amo-screen-primary-cta = Explore staff-recommended add-ons
diff --git a/browser/components/aboutwelcome/docs/index.rst b/browser/components/aboutwelcome/docs/index.rst
new file mode 100644
index 0000000000..16471f0de7
--- /dev/null
+++ b/browser/components/aboutwelcome/docs/index.rst
@@ -0,0 +1,97 @@
+==========================================
+Firefox Welcome Experience (about:welcome)
+==========================================
+
+Files related to the Firefox welcome experience, which includes content that appears on ``about:welcome``, can be found in the ``browser/components/aboutwelcome`` directory.
+Some of these source files (such as ``.js``, ``.jsx``, and ``.scss``) require an additional build step.
+We are working on migrating this to work with ``mach``, but in the meantime, please
+follow the following steps if you need to make changes in this directory:
+
+For ``.sys.mjs`` files (system modules)
+---------------------------------------------------
+
+No build step is necessary. Use ``mach`` and run mochitests according to your regular Firefox workflow.
+
+For ``.js``, ``.jsx``, ``.scss``, or ``.css`` files
+---------------------------------------------------
+
+Prerequisites
+`````````````
+
+You will need the following:
+
+- Node.js 10+ (On Mac, the best way to install Node.js is to use the install link on the `Node.js homepage`_)
+- npm (packaged with Node.js)
+
+To install dependencies, run the following from the root of the mozilla-central repository.
+(Using ``mach`` to call ``npm`` and ``node`` commands will ensure you're using the correct versions of Node and npm.)
+
+.. code-block:: shell
+
+ (cd browser/components/aboutwelcome && ../../../mach npm install)
+
+
+Which files should you edit?
+````````````````````````````
+
+You should not make changes to ``.js`` or ``.css`` files in the ``browser/components/aboutwelcome/content`` directory. Instead, you should edit the ``.jsx``, ``.js``, and ``.scss`` source files
+in ``browser/components/aboutwelcome/content-src`` directory. These files will be compiled into the ``.js`` and ``.css`` files.
+
+
+Building assets and running Firefox
+-----------------------------------
+
+To build assets and run Firefox, run the following from the root of the mozilla-central repository:
+
+.. code-block:: shell
+
+ ./mach npm run bundle --prefix=browser/components/aboutwelcome && ./mach build && ./mach run
+
+Continuous development / debugging
+----------------------------------
+Running ``./mach npm run watchmc --prefix=browser/components/aboutwelcome`` will start a process that watches files in
+``aboutwelcome`` and rebuilds the bundled files when JS or CSS files change.
+
+**IMPORTANT NOTE**: This task will add inline source maps to help with debugging, which changes the memory footprint.
+Do not use the ``watchmc`` task for profiling or performance testing!
+
+Running tests
+-------------
+About:welcome unit tests are written using
+`mocha <https://mochajs.org>`_, and other errors that may show up there are
+`SCSS <https://sass-lang.com/documentation/syntax>`_ issues flagged by
+`stylelint <https://stylelint.io>`_. These things are all run using
+``npm test`` under the ``aboutwelcome`` slug in Treeherder/Try, so if that slug turns
+red, these tests are what is failing. To execute them, do this:
+
+.. code-block:: shell
+
+ ./mach npm test --prefix=browser/components/aboutwelcome
+
+Windows isn't currently supported by ``npm test``
+(`path/invocation difference <https://bugzilla.mozilla.org/show_bug.cgi?id=1737419>`_).
+To run tests that aren't covered by ``mach lint`` and
+``mach test``:
+
+.. code-block:: shell
+
+ ./mach npm run lint:stylelint --prefix=browser/components/aboutwelcome
+ ./mach npm run testmc:build --prefix=browser/components/aboutwelcome
+ ./mach npm run testmc:unit --prefix=browser/components/aboutwelcome
+
+Mochitests run normally, using ``mach test browser/components/aboutwelcome``.
+
+Code Coverage
+-------------
+Our testing setup will run code coverage tools in addition to just the unit
+tests. It will error out if the code coverage metrics don't meet certain thresholds.
+
+If you see any missing test coverage, you can inspect the coverage report by
+running
+
+.. code-block:: shell
+
+ ./mach npm test --prefix=browser/components/aboutwelcome &&
+ ./mach npm run debugcoverage --prefix=browser/components/aboutwelcome
+
+.. _Node.js homepage: https://nodejs.org/
diff --git a/browser/components/aboutwelcome/jar.mn b/browser/components/aboutwelcome/jar.mn
new file mode 100644
index 0000000000..278bd9965a
--- /dev/null
+++ b/browser/components/aboutwelcome/jar.mn
@@ -0,0 +1,38 @@
+# 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 http://mozilla.org/MPL/2.0/.
+
+browser.jar:
+ content/browser/aboutwelcome/aboutwelcome.bundle.js (./content/aboutwelcome.bundle.js)
+ content/browser/aboutwelcome/aboutwelcome.css (./content/aboutwelcome.css)
+ content/browser/aboutwelcome/aboutwelcome.html (./content/aboutwelcome.html)
+
+# This section is for image assets for about:welcome. These are currently
+# placed in the chrome://activity-stream/ path to provide backwards compability
+# with live experiments using these assets at those paths. Removal of this
+# backwards compability is tracked in bug 1866935.
+ content/activity-stream/data/content/assets/confetti.svg (./assets/confetti.svg)
+ content/activity-stream/data/content/assets/device-migration.svg (./assets/device-migration.svg)
+ content/activity-stream/data/content/assets/fox-doodle-tail.png (./assets/fox-doodle-tail.png)
+ content/activity-stream/data/content/assets/fox-doodle-waving.gif (./assets/fox-doodle-waving.gif)
+ content/activity-stream/data/content/assets/fox-doodle-waving-static.png (./assets/fox-doodle-waving-static.png)
+ content/activity-stream/data/content/assets/heart.webp (./assets/heart.webp)
+ content/activity-stream/data/content/assets/long-zap.svg (./assets/long-zap.svg)
+ content/activity-stream/data/content/assets/mobile-download-qr-existing-user-cn.svg (./assets/mobile-download-qr-existing-user-cn.svg)
+ content/activity-stream/data/content/assets/mobile-download-qr-existing-user.svg (./assets/mobile-download-qr-existing-user.svg)
+ content/activity-stream/data/content/assets/mobile-download-qr-new-user-cn.svg (./assets/mobile-download-qr-new-user-cn.svg)
+ content/activity-stream/data/content/assets/mobile-download-qr-new-user.svg (./assets/mobile-download-qr-new-user.svg)
+ content/activity-stream/data/content/assets/mr-amo-collection.svg (./assets/mr-amo-collection.svg)
+ content/activity-stream/data/content/assets/mr-gratitude.svg (./assets/mr-gratitude.svg)
+ content/activity-stream/data/content/assets/mr-import.svg (./assets/mr-import.svg)
+ content/activity-stream/data/content/assets/mr-mobilecrosspromo.svg (./assets/mr-mobilecrosspromo.svg)
+ content/activity-stream/data/content/assets/mr-pinprivate.svg (./assets/mr-pinprivate.svg)
+ content/activity-stream/data/content/assets/mr-pintaskbar.svg (./assets/mr-pintaskbar.svg)
+ content/activity-stream/data/content/assets/mr-privacysegmentation.svg (./assets/mr-privacysegmentation.svg)
+ content/activity-stream/data/content/assets/mr-rtamo-background-image.svg (./assets/mr-rtamo-background-image.svg)
+ content/activity-stream/data/content/assets/mr-settodefault.svg (./assets/mr-settodefault.svg)
+ content/activity-stream/data/content/assets/noodle-C.svg (./assets/noodle-C.svg)
+ content/activity-stream/data/content/assets/noodle-outline-L.svg (./assets/noodle-outline-L.svg)
+ content/activity-stream/data/content/assets/noodle-solid-L.svg (./assets/noodle-solid-L.svg)
+ content/activity-stream/data/content/assets/person-typing.svg (./assets/person-typing.svg)
+ content/activity-stream/data/content/assets/short-zap.svg (./assets/short-zap.svg)
diff --git a/browser/components/aboutwelcome/karma.mc.config.js b/browser/components/aboutwelcome/karma.mc.config.js
new file mode 100644
index 0000000000..b6ba043ad4
--- /dev/null
+++ b/browser/components/aboutwelcome/karma.mc.config.js
@@ -0,0 +1,246 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+const path = require("path");
+const webpack = require("webpack");
+const { ResourceUriPlugin } = require("../newtab/tools/resourceUriPlugin");
+
+const PATHS = {
+ // Where is the entry point for the unit tests?
+ testEntryFile: path.resolve(__dirname, "./tests/unit/unit-entry.js"),
+
+ // A glob-style pattern matching all unit tests
+ testFilesPattern: "./tests/unit/unit-entry.js",
+
+ // The base directory of all source files (used for path resolution in webpack importing)
+ moduleResolveDirectory: __dirname,
+ newtabResolveDirectory: "../newtab",
+
+ // a RegEx matching all Cu.import statements of local files
+ resourcePathRegEx: /^resource:\/\/activity-stream\//,
+
+ coverageReportingPath: "logs/coverage/",
+};
+
+// When tweaking here, be sure to review the docs about the execution ordering
+// semantics of the preprocessors array, as they are somewhat odd.
+const preprocessors = {};
+preprocessors[PATHS.testFilesPattern] = [
+ "webpack", // require("karma-webpack")
+ "sourcemap", // require("karma-sourcemap-loader")
+];
+
+module.exports = function (config) {
+ const isTDD = config.tdd;
+ const browsers = isTDD ? ["Firefox"] : ["FirefoxHeadless"]; // require("karma-firefox-launcher")
+ config.set({
+ singleRun: !isTDD,
+ browsers,
+ customLaunchers: {
+ FirefoxHeadless: {
+ base: "Firefox",
+ flags: ["--headless"],
+ },
+ },
+ frameworks: [
+ "chai", // require("chai") require("karma-chai")
+ "mocha", // require("mocha") require("karma-mocha")
+ "sinon", // require("sinon") require("karma-sinon")
+ ],
+ reporters: [
+ "coverage-istanbul", // require("karma-coverage")
+ "mocha", // require("karma-mocha-reporter")
+
+ // for bin/try-runner.js to parse the output easily
+ "json", // require("karma-json-reporter")
+ ],
+ jsonReporter: {
+ // So this doesn't get interleaved with other karma output
+ stdout: false,
+ outputFile: path.join("logs", "karma-run-results.json"),
+ },
+ coverageIstanbulReporter: {
+ reports: ["lcov", "text-summary"], // for some reason "lcov" reallys means "lcov" and "html"
+ "report-config": {
+ // so the full m-c path gets printed; needed for https://coverage.moz.tools/ integration
+ lcov: {
+ projectRoot: "../../..",
+ },
+ },
+ dir: PATHS.coverageReportingPath,
+ // This will make karma fail if coverage reporting is less than the minimums here
+ thresholds: !isTDD && {
+ each: {
+ statements: 80,
+ lines: 80,
+ functions: 80,
+ branches: 66,
+ overrides: {
+ "modules/*.sys.mjs": {
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/lib/aboutwelcome-utils.mjs": {
+ statements: 50,
+ lines: 50,
+ functions: 50,
+ branches: 0,
+ },
+ "content-src/components/LanguageSwitcher.jsx": {
+ // This file is covered by the mochitest: browser_aboutwelcome_multistage_languageSwitcher.js
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/components/EmbeddedMigrationWizard.jsx": {
+ // This file is covered by the mochitest: browser_aboutwelcome_multistage_mr.js
+ // Can't be unit tested because it relies on the migration-wizard custom element
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/components/AddonsPicker.jsx": {
+ // This file is covered by the mochitest: browser_aboutwelcome_multistage_addonspicker.js
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/components/SubmenuButton.jsx": {
+ // Enzyme can't test this file because it relies on XUL elements
+ // and JS events, which Enzyme can't simulate. Browser tests are
+ // in browser_feature_callout_panel.js
+ statements: 0,
+ lines: 0,
+ functions: 0,
+ branches: 0,
+ },
+ "content-src/components/MSLocalized.jsx": {
+ statements: 77.42,
+ lines: 77.42,
+ functions: 75,
+ },
+ "content-src/components/CTAParagraph.jsx": {
+ functions: 50,
+ },
+ "content-src/components/HeroImage.jsx": {
+ branches: 62.5,
+ },
+ "content-src/components/LinkParagraph.jsx": {
+ functions: 75,
+ branches: 37.5,
+ },
+ "content-src/components/MRColorways.jsx": {
+ statements: 76.09,
+ lines: 75,
+ functions: 76.92,
+ },
+ "content-src/components/MobileDownloads.jsx": {
+ branches: 56.25,
+ },
+ "content-src/components/Themes.jsx": {
+ branches: 50,
+ },
+ "content-src/components/MultiStageAboutWelcome.jsx": {
+ statements: 78.06,
+ lines: 79.89,
+ functions: 73.17,
+ branches: 61.74,
+ },
+ },
+ },
+ },
+ },
+ files: [PATHS.testEntryFile],
+ preprocessors,
+ webpack: {
+ mode: "none",
+ devtool: "inline-source-map",
+ // This loader allows us to override required files in tests
+ resolveLoader: {
+ alias: {
+ inject: path.join(__dirname, "../newtab/loaders/inject-loader"),
+ },
+ },
+ // This resolve config allows us to import with paths relative to the root directory
+ resolve: {
+ extensions: [".js", ".jsx"],
+ modules: [
+ PATHS.moduleResolveDirectory,
+ "node_modules",
+ PATHS.newtabResolveDirectory,
+ ],
+ fallback: {
+ stream: require.resolve("stream-browserify"),
+ buffer: require.resolve("buffer"),
+ },
+ alias: {
+ newtab: path.join(__dirname, "../newtab"),
+ asrouter: path.join(__dirname, "../asrouter"),
+ },
+ },
+ plugins: [
+ // The ResourceUriPlugin handles translating resource URIs in import
+ // statements in .mjs files to paths on the filesystem.
+ new ResourceUriPlugin({
+ resourcePathRegExes: [
+ [
+ new RegExp("^resource://activity-stream/"),
+ path.join(__dirname, "../newtab/"),
+ ],
+ [
+ new RegExp("^resource:///modules/asrouter/"),
+ path.join(__dirname, "../asrouter/modules/"),
+ ],
+ ],
+ }),
+ new webpack.DefinePlugin({
+ "process.env.NODE_ENV": JSON.stringify("development"),
+ }),
+ ],
+ externals: {
+ // enzyme needs these for backwards compatibility with 0.13.
+ // see https://github.com/airbnb/enzyme/blob/master/docs/guides/webpack.md#using-enzyme-with-webpack
+ "react/addons": true,
+ "react/lib/ReactContext": true,
+ "react/lib/ExecutionEnvironment": true,
+ },
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ exclude: [/node_modules\/(?!@fluent\/).*/, /tests/],
+ loader: "babel-loader",
+ },
+ {
+ test: /\.jsx$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ options: {
+ presets: ["@babel/preset-react"],
+ },
+ },
+ {
+ test: /\.md$/,
+ use: "raw-loader",
+ },
+ {
+ enforce: "post",
+ test: /\.m?js[mx]?$/,
+ loader: "@jsdevtools/coverage-istanbul-loader",
+ options: { esModules: true },
+ include: [path.resolve("content-src"), path.resolve("modules")],
+ exclude: [path.resolve("tests"), path.resolve("../newtab")],
+ },
+ ],
+ },
+ },
+ // Silences some overly-verbose logging of individual module builds
+ webpackMiddleware: { noInfo: true },
+ });
+};
diff --git a/browser/components/aboutwelcome/modules/AWScreenUtils.sys.mjs b/browser/components/aboutwelcome/modules/AWScreenUtils.sys.mjs
new file mode 100644
index 0000000000..715ab650a4
--- /dev/null
+++ b/browser/components/aboutwelcome/modules/AWScreenUtils.sys.mjs
@@ -0,0 +1,74 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs",
+ ASRouterTargeting: "resource:///modules/asrouter/ASRouterTargeting.sys.mjs",
+});
+
+export const AWScreenUtils = {
+ /**
+ * Filter the given screens in place with a predicate.
+ *
+ * @param {object[]} screens - The screens to filter.
+ * @param {Function} callback - The predicate for filtering the screens.
+ */
+ async removeScreens(screens, callback) {
+ for (let i = 0; i < screens?.length; i++) {
+ if (await callback(screens[i], i)) {
+ screens.splice(i--, 1);
+ }
+ }
+ },
+ /**
+ * Given a JEXL expression, returns the evaluation of the expression or returns
+ * true if the expression did not evaluate successfully
+ *
+ * @param {string} targeting - The JEXL expression that will be evaluated
+ * @returns {boolean}
+ */
+ async evaluateScreenTargeting(targeting) {
+ const result = await lazy.ASRouter.evaluateExpression({
+ expression: targeting,
+ context: lazy.ASRouterTargeting.Environment,
+ });
+ if (result?.evaluationStatus?.success) {
+ return result.evaluationStatus.result;
+ }
+
+ return true;
+ },
+ /**
+ * Filter out screens whose targeting do not match.
+ *
+ * Given an array of screens, each screen will have it's `targeting` property
+ * evaluated, and removed if it's targeting evaluates to false
+ *
+ * @param {object[]} screens - An array of screens that will be looped
+ * through to be evaluated for removal
+ * @returns {object[]} - A new array containing the screens that were not removed
+ */
+ async evaluateTargetingAndRemoveScreens(screens) {
+ const filteredScreens = [...screens];
+ await this.removeScreens(filteredScreens, async screen => {
+ if (screen.targeting === undefined) {
+ // Don't remove the screen if we don't have a targeting property
+ return false;
+ }
+
+ const result = await this.evaluateScreenTargeting(screen.targeting);
+ // Flipping the value because a true evaluation means we
+ // don't want to remove the screen, while false means we do
+ return !result;
+ });
+
+ return filteredScreens;
+ },
+
+ async addScreenImpression(screen) {
+ await lazy.ASRouter.addScreenImpression(screen);
+ },
+};
diff --git a/browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs b/browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs
new file mode 100644
index 0000000000..828839c8d0
--- /dev/null
+++ b/browser/components/aboutwelcome/modules/AboutWelcomeDefaults.sys.mjs
@@ -0,0 +1,902 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+// We use importESModule here instead of static import so that
+// the Karma test environment won't choke on this module. This
+// is because the Karma test environment already stubs out
+// AppConstants, and overrides importESModule to be a no-op (which
+// can't be done for a static import statement).
+
+// eslint-disable-next-line mozilla/use-static-import
+const { AppConstants } = ChromeUtils.importESModule(
+ "resource://gre/modules/AppConstants.sys.mjs"
+);
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ AddonRepository: "resource://gre/modules/addons/AddonRepository.sys.mjs",
+ AttributionCode: "resource:///modules/AttributionCode.sys.mjs",
+ AWScreenUtils: "resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs",
+ BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
+});
+
+// Message to be updated based on finalized MR designs
+const MR_ABOUT_WELCOME_DEFAULT = {
+ id: "MR_WELCOME_DEFAULT",
+ template: "multistage",
+ // Allow tests to easily disable transitions.
+ transitions: Services.prefs.getBoolPref(
+ "browser.aboutwelcome.transitions",
+ true
+ ),
+ backdrop:
+ "var(--mr-welcome-background-color) var(--mr-welcome-background-gradient)",
+ screens: [
+ {
+ id: "AW_WELCOME_BACK",
+ targeting: "isDeviceMigration",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-100px",
+ image_alt_text: {
+ string_id: "onboarding-device-migration-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/device-migration.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "onboarding-device-migration-title",
+ },
+ subtitle: {
+ string_id: "onboarding-device-migration-subtitle2",
+ },
+ primary_button: {
+ label: {
+ string_id: "onboarding-device-migration-primary-button-label",
+ },
+ action: {
+ type: "FXA_SIGNIN_FLOW",
+ navigate: "actionResult",
+ data: {
+ entrypoint: "fx-device-migration-onboarding",
+ extraParams: {
+ utm_content: "migration-onboarding",
+ utm_source: "fx-new-device-sync",
+ utm_medium: "firefox-desktop",
+ utm_campaign: "migration",
+ },
+ },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ },
+ },
+ {
+ id: "AW_EASY_SETUP_NEEDS_DEFAULT_AND_PIN",
+ targeting:
+ "doesAppNeedPin && 'browser.shell.checkDefaultBrowser'|preferenceValue && !isDefaultBrowser",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-default-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-settodefault.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ hide_secondary_section: "responsive",
+ logo: {},
+ title: {
+ string_id: "onboarding-easy-setup-security-and-privacy-title",
+ },
+ subtitle: {
+ string_id: "onboarding-easy-setup-security-and-privacy-subtitle",
+ },
+ tiles: {
+ type: "multiselect",
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: {
+ string_id: "mr2022-onboarding-pin-primary-button-label",
+ },
+ action: {
+ type: "PIN_FIREFOX_TO_TASKBAR",
+ },
+ },
+ {
+ id: "checkbox-2",
+ defaultValue: true,
+ label: {
+ string_id:
+ "mr2022-onboarding-easy-setup-set-default-checkbox-label",
+ },
+ action: {
+ type: "SET_DEFAULT_BROWSER",
+ },
+ },
+ {
+ id: "checkbox-3",
+ defaultValue: true,
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-import-checkbox-label",
+ },
+ uncheckedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ },
+ },
+ },
+ ],
+ },
+ },
+ checkedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ value: true,
+ },
+ },
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ primary_button: {
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-primary-button-label",
+ },
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ navigate: true,
+ data: {
+ actions: [],
+ },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ secondary_button_top: {
+ label: {
+ string_id: "mr1-onboarding-sign-in-button-label",
+ },
+ action: {
+ data: {
+ entrypoint: "activity-stream-firstrun",
+ where: "tab",
+ },
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ addFlowParams: true,
+ },
+ },
+ },
+ },
+ {
+ id: "AW_EASY_SETUP_NEEDS_DEFAULT",
+ targeting:
+ "!doesAppNeedPin && 'browser.shell.checkDefaultBrowser'|preferenceValue && !isDefaultBrowser",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-default-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-settodefault.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "onboarding-easy-setup-security-and-privacy-title",
+ },
+ subtitle: {
+ string_id: "onboarding-easy-setup-security-and-privacy-subtitle",
+ },
+ tiles: {
+ type: "multiselect",
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: {
+ string_id:
+ "mr2022-onboarding-easy-setup-set-default-checkbox-label",
+ },
+ action: {
+ type: "SET_DEFAULT_BROWSER",
+ },
+ },
+ {
+ id: "checkbox-2",
+ defaultValue: true,
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-import-checkbox-label",
+ },
+ uncheckedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ },
+ },
+ },
+ ],
+ },
+ },
+ checkedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ value: true,
+ },
+ },
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ primary_button: {
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-primary-button-label",
+ },
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ navigate: true,
+ data: {
+ actions: [],
+ },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ secondary_button_top: {
+ label: {
+ string_id: "mr1-onboarding-sign-in-button-label",
+ },
+ action: {
+ data: {
+ entrypoint: "activity-stream-firstrun",
+ where: "tab",
+ },
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ addFlowParams: true,
+ },
+ },
+ },
+ },
+ {
+ id: "AW_EASY_SETUP_NEEDS_PIN",
+ targeting:
+ "doesAppNeedPin && (!'browser.shell.checkDefaultBrowser'|preferenceValue || isDefaultBrowser)",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-default-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-settodefault.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "onboarding-easy-setup-security-and-privacy-title",
+ },
+ subtitle: {
+ string_id: "onboarding-easy-setup-security-and-privacy-subtitle",
+ },
+ tiles: {
+ type: "multiselect",
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: {
+ string_id: "mr2022-onboarding-pin-primary-button-label",
+ },
+ action: {
+ type: "PIN_FIREFOX_TO_TASKBAR",
+ },
+ },
+ {
+ id: "checkbox-2",
+ defaultValue: true,
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-import-checkbox-label",
+ },
+ uncheckedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ },
+ },
+ },
+ ],
+ },
+ },
+ checkedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ value: true,
+ },
+ },
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ primary_button: {
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-primary-button-label",
+ },
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ navigate: true,
+ data: {
+ actions: [],
+ },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ secondary_button_top: {
+ label: {
+ string_id: "mr1-onboarding-sign-in-button-label",
+ },
+ action: {
+ data: {
+ entrypoint: "activity-stream-firstrun",
+ where: "tab",
+ },
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ addFlowParams: true,
+ },
+ },
+ },
+ },
+ {
+ id: "AW_EASY_SETUP_ONLY_IMPORT",
+ targeting:
+ "!doesAppNeedPin && (!'browser.shell.checkDefaultBrowser'|preferenceValue || isDefaultBrowser)",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-default-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-settodefault.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "onboarding-easy-setup-security-and-privacy-title",
+ },
+ subtitle: {
+ string_id: "onboarding-easy-setup-security-and-privacy-subtitle",
+ },
+ tiles: {
+ type: "multiselect",
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-import-checkbox-label",
+ },
+ uncheckedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ },
+ },
+ },
+ ],
+ },
+ },
+ checkedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "showEmbeddedImport",
+ value: true,
+ },
+ },
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ primary_button: {
+ label: {
+ string_id: "mr2022-onboarding-easy-setup-primary-button-label",
+ },
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ navigate: true,
+ data: {
+ actions: [],
+ },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ secondary_button_top: {
+ label: {
+ string_id: "mr1-onboarding-sign-in-button-label",
+ },
+ action: {
+ data: {
+ entrypoint: "activity-stream-firstrun",
+ where: "tab",
+ },
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ addFlowParams: true,
+ },
+ },
+ },
+ },
+ {
+ id: "AW_LANGUAGE_MISMATCH",
+ content: {
+ position: "split",
+ background: "var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "mr2022-onboarding-live-language-text",
+ },
+ subtitle: {
+ string_id: "mr2022-language-mismatch-subtitle",
+ },
+ hero_text: {
+ string_id: "mr2022-onboarding-live-language-text",
+ useLangPack: true,
+ },
+ languageSwitcher: {
+ downloading: {
+ string_id: "onboarding-live-language-button-label-downloading",
+ },
+ cancel: {
+ string_id: "onboarding-live-language-secondary-cancel-download",
+ },
+ waiting: { string_id: "onboarding-live-language-waiting-button" },
+ skip: { string_id: "mr2022-onboarding-secondary-skip-button-label" },
+ action: {
+ navigate: true,
+ },
+ switch: {
+ string_id: "mr2022-onboarding-live-language-switch-to",
+ useLangPack: true,
+ },
+ continue: {
+ string_id: "mr2022-onboarding-live-language-continue-in",
+ },
+ },
+ },
+ },
+ {
+ id: "AW_IMPORT_SETTINGS_EMBEDDED",
+ targeting: `("messaging-system-action.showEmbeddedImport" |preferenceValue == true) && useEmbeddedMigrationWizard`,
+ content: {
+ tiles: { type: "migration-wizard" },
+ position: "split",
+ split_narrow_bkg_position: "-42px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-import-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-import.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ hide_secondary_section: "responsive",
+ migrate_start: {
+ action: {},
+ },
+ migrate_close: {
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ },
+ },
+ {
+ id: "AW_MOBILE_DOWNLOAD",
+ // The mobile download screen should only be shown to users who
+ // are either not logged into FxA, or don't have any mobile devices syncing
+ targeting: "!isFxASignedIn || sync.mobileDevices == 0",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-160px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-mobile-download-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-mobilecrosspromo.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "onboarding-mobile-download-security-and-privacy-title",
+ },
+ subtitle: {
+ string_id: "onboarding-mobile-download-security-and-privacy-subtitle",
+ },
+ hero_image: {
+ url: "chrome://activity-stream/content/data/content/assets/mobile-download-qr-new-user.svg",
+ },
+ cta_paragraph: {
+ text: {
+ string_id: "mr2022-onboarding-mobile-download-cta-text",
+ string_name: "download-label",
+ },
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://www.mozilla.org/firefox/mobile/get-app/?utm_medium=firefox-desktop&utm_source=onboarding-modal&utm_campaign=mr2022&utm_content=new-global",
+ where: "tab",
+ },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ },
+ },
+ {
+ id: "AW_AMO_INTRODUCE",
+ // Show to en-* locales only
+ targeting: "localeLanguageCode == 'en'",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-58px",
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-amo-collection.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: { string_id: "amo-screen-title" },
+ subtitle: { string_id: "amo-screen-subtitle" },
+ primary_button: {
+ label: { string_id: "amo-screen-primary-cta" },
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://addons.mozilla.org/en-US/firefox/collections/4757633/25c2b44583534b3fa8fea977c419cd/?page=1&collection_sort=-added",
+ where: "tabshifted",
+ },
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ {
+ id: "AW_GRATITUDE",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-228px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-gratitude-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-gratitude.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "onboarding-gratitude-security-and-privacy-title",
+ },
+ subtitle: {
+ string_id: "onboarding-gratitude-security-and-privacy-subtitle",
+ },
+ primary_button: {
+ label: {
+ string_id: "mr2-onboarding-start-browsing-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ ],
+};
+
+async function getAddonFromRepository(data) {
+ const [addonInfo] = await lazy.AddonRepository.getAddonsByIDs([data]);
+ if (addonInfo.sourceURI.scheme !== "https") {
+ return null;
+ }
+
+ return {
+ name: addonInfo.name,
+ url: addonInfo.sourceURI.spec,
+ iconURL: addonInfo.icons["64"] || addonInfo.icons["32"],
+ type: addonInfo.type,
+ screenshots: addonInfo.screenshots,
+ };
+}
+
+async function getAddonInfo(attrbObj) {
+ let { content, source } = attrbObj;
+ try {
+ if (!content || source !== "addons.mozilla.org") {
+ return null;
+ }
+ // Attribution data can be double encoded
+ while (content.includes("%")) {
+ try {
+ const result = decodeURIComponent(content);
+ if (result === content) {
+ break;
+ }
+ content = result;
+ } catch (e) {
+ break;
+ }
+ }
+ // return_to_amo embeds the addon id in the content
+ // param, prefixed with "rta:". Translating that
+ // happens in AddonRepository, however we can avoid
+ // an API call if we check up front here.
+ if (content.startsWith("rta:")) {
+ return await getAddonFromRepository(content);
+ }
+ } catch (e) {
+ console.error("Failed to get the latest add-on version for Return to AMO");
+ }
+ return null;
+}
+
+async function getAttributionContent() {
+ let attribution = await lazy.AttributionCode.getAttrDataAsync();
+ if (attribution?.source === "addons.mozilla.org") {
+ let addonInfo = await getAddonInfo(attribution);
+ if (addonInfo) {
+ return {
+ ...addonInfo,
+ template: "return_to_amo",
+ };
+ }
+ }
+ if (attribution?.ua) {
+ return {
+ ua: decodeURIComponent(attribution.ua),
+ };
+ }
+ return null;
+}
+
+// Return default multistage welcome content
+function getDefaults() {
+ return Cu.cloneInto(MR_ABOUT_WELCOME_DEFAULT, {});
+}
+
+let gSourceL10n = null;
+
+// Localize Firefox download source from user agent attribution to show inside
+// import primary button label such as 'Import from <localized browser name>'.
+// no firefox as import wizard doesn't show it
+const allowedUAs = ["chrome", "edge", "ie"];
+function getLocalizedUA(ua) {
+ if (!gSourceL10n) {
+ gSourceL10n = new Localization(["browser/migrationWizard.ftl"]);
+ }
+ if (allowedUAs.includes(ua)) {
+ return gSourceL10n.formatValue(`migration-source-name-${ua.toLowerCase()}`);
+ }
+ return null;
+}
+
+function prepareMobileDownload(content) {
+ let mobileContent = content?.screens?.find(
+ screen => screen.id === "AW_MOBILE_DOWNLOAD"
+ )?.content;
+
+ if (!mobileContent) {
+ return content;
+ }
+ if (!lazy.BrowserUtils.sendToDeviceEmailsSupported()) {
+ // If send to device emails are not supported for a user's locale,
+ // remove the send to device link and update the screen text
+ delete mobileContent.cta_paragraph.action;
+ mobileContent.cta_paragraph.text = {
+ string_id: "mr2022-onboarding-no-mobile-download-cta-text",
+ };
+ }
+ // Update CN specific QRCode url
+ if (AppConstants.isChinaRepack()) {
+ mobileContent.hero_image.url = `${mobileContent.hero_image.url.slice(
+ 0,
+ mobileContent.hero_image.url.indexOf(".svg")
+ )}-cn.svg`;
+ }
+
+ return content;
+}
+
+async function prepareContentForReact(content) {
+ const { screens } = content;
+
+ if (content?.template === "return_to_amo") {
+ return content;
+ }
+
+ // Set the primary import button source based on attribution.
+ if (content?.ua) {
+ // If available, add the browser source to action data
+ // and localized browser string args to primary button label
+ const { label, action } =
+ content?.screens?.find(
+ screen =>
+ screen?.content?.primary_button?.action?.type ===
+ "SHOW_MIGRATION_WIZARD"
+ )?.content?.primary_button ?? {};
+
+ if (action) {
+ action.data = { ...action.data, source: content.ua };
+ }
+
+ let browserStr = await getLocalizedUA(content.ua);
+
+ if (label?.string_id) {
+ label.string_id = browserStr
+ ? "mr1-onboarding-import-primary-button-label-attribution"
+ : "mr2022-onboarding-import-primary-button-label-no-attribution";
+
+ label.args = browserStr ? { previous: browserStr } : {};
+ }
+ }
+
+ // Remove Firefox Accounts related UI and prevent related metrics.
+ if (!Services.prefs.getBoolPref("identity.fxaccounts.enabled", false)) {
+ delete content.screens?.find(
+ screen =>
+ screen.content?.secondary_button_top?.action?.type ===
+ "SHOW_FIREFOX_ACCOUNTS"
+ )?.content.secondary_button_top;
+ content.skipFxA = true;
+ }
+
+ let shouldRemoveLanguageMismatchScreen = true;
+ if (content.languageMismatchEnabled) {
+ const screen = content?.screens?.find(s => s.id === "AW_LANGUAGE_MISMATCH");
+ if (screen && content.appAndSystemLocaleInfo.canLiveReload) {
+ // Add the display names for the OS and Firefox languages, like "American English".
+ function addMessageArgs(obj) {
+ for (const value of Object.values(obj)) {
+ if (value?.string_id) {
+ value.args = content.appAndSystemLocaleInfo.displayNames;
+ }
+ }
+ }
+
+ addMessageArgs(screen.content.languageSwitcher);
+ addMessageArgs(screen.content);
+ shouldRemoveLanguageMismatchScreen = false;
+ }
+ }
+
+ if (shouldRemoveLanguageMismatchScreen) {
+ await lazy.AWScreenUtils.removeScreens(
+ screens,
+ screen => screen.id === "AW_LANGUAGE_MISMATCH"
+ );
+ }
+
+ return prepareMobileDownload(content);
+}
+
+export const AboutWelcomeDefaults = {
+ prepareContentForReact,
+ getDefaults,
+ getAttributionContent,
+};
diff --git a/browser/components/aboutwelcome/modules/AboutWelcomeTelemetry.sys.mjs b/browser/components/aboutwelcome/modules/AboutWelcomeTelemetry.sys.mjs
new file mode 100644
index 0000000000..1447d3ebde
--- /dev/null
+++ b/browser/components/aboutwelcome/modules/AboutWelcomeTelemetry.sys.mjs
@@ -0,0 +1,276 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ AttributionCode: "resource:///modules/AttributionCode.sys.mjs",
+ ClientID: "resource://gre/modules/ClientID.sys.mjs",
+ TelemetrySession: "resource://gre/modules/TelemetrySession.sys.mjs",
+});
+
+ChromeUtils.defineLazyGetter(lazy, "telemetryClientId", () =>
+ lazy.ClientID.getClientID()
+);
+ChromeUtils.defineLazyGetter(
+ lazy,
+ "browserSessionId",
+ () => lazy.TelemetrySession.getMetadata("").sessionId
+);
+
+ChromeUtils.defineLazyGetter(lazy, "log", () => {
+ const { Logger } = ChromeUtils.importESModule(
+ "resource://messaging-system/lib/Logger.sys.mjs"
+ );
+ return new Logger("AboutWelcomeTelemetry");
+});
+
+export class AboutWelcomeTelemetry {
+ constructor() {
+ XPCOMUtils.defineLazyPreferenceGetter(
+ this,
+ "telemetryEnabled",
+ "browser.newtabpage.activity-stream.telemetry",
+ false
+ );
+ }
+
+ /**
+ * Attach browser attribution data to a ping payload.
+ *
+ * It intentionally queries the *cached* attribution data other than calling
+ * `getAttrDataAsync()` in order to minimize the overhead here.
+ * For the same reason, we are not querying the attribution data from
+ * `TelemetryEnvironment.currentEnvironment.settings`.
+ *
+ * In practice, it's very likely that the attribution data is already read
+ * and cached at some point by `AboutWelcomeParent`, so it should be able to
+ * read the cached results for the most if not all of the pings.
+ */
+ _maybeAttachAttribution(ping) {
+ const attribution = lazy.AttributionCode.getCachedAttributionData();
+ if (attribution && Object.keys(attribution).length) {
+ ping.attribution = attribution;
+ }
+ return ping;
+ }
+
+ async _createPing(event) {
+ if (event.event_context && typeof event.event_context === "object") {
+ event.event_context = JSON.stringify(event.event_context);
+ }
+ let ping = {
+ ...event,
+ addon_version: Services.appinfo.appBuildID,
+ locale: Services.locale.appLocaleAsBCP47,
+ client_id: await lazy.telemetryClientId,
+ browser_session_id: lazy.browserSessionId,
+ };
+
+ return this._maybeAttachAttribution(ping);
+ }
+
+ /**
+ * Augment the provided event with some metadata and then send it
+ * to the messaging-system's onboarding endpoint.
+ *
+ * Is sometimes used by non-onboarding events.
+ *
+ * @param event - an object almost certainly from an onboarding flow (though
+ * there is a case where spotlight may use this, too)
+ * containing a nested structure of data for reporting as
+ * telemetry, as documented in
+ * https://firefox-source-docs.mozilla.org/browser/components/newtab/docs/v2-system-addon/data_events.html
+ * Does not have all of its data (`_createPing` will augment
+ * with ids and attribution if available).
+ */
+ async sendTelemetry(event) {
+ if (!this.telemetryEnabled) {
+ return;
+ }
+
+ const ping = await this._createPing(event);
+
+ try {
+ this.submitGleanPingForPing(ping);
+ } catch (e) {
+ // Though Glean APIs are forbidden to throw, it may be possible that a
+ // mismatch between the shape of `ping` and the defined metrics is not
+ // adequately handled.
+ Glean.messagingSystem.gleanPingForPingFailures.add(1);
+ }
+ }
+
+ /**
+ * Tries to infer appropriate Glean metrics on the "messaging-system" ping,
+ * sets them, and submits a "messaging-system" ping.
+ *
+ * Does not check if telemetry is enabled.
+ * (Though Glean will check the global prefs).
+ *
+ * Note: This is a very unusual use of Glean that is specific to the use-
+ * cases of Messaging System. Please do not copy this pattern.
+ */
+ submitGleanPingForPing(ping) {
+ lazy.log.debug(`Submitting Glean ping for ${JSON.stringify(ping)}`);
+ // event.event_context is an object, but it may have been stringified.
+ let event_context = ping?.event_context;
+ let shopping_callout_impression =
+ ping?.message_id?.startsWith("FAKESPOT_CALLOUT") &&
+ ping?.event === "IMPRESSION";
+
+ if (typeof event_context === "string") {
+ try {
+ event_context = JSON.parse(event_context);
+ // This code is for directing Shopping component based clicks into
+ // the Glean Events ping.
+ if (
+ event_context?.page === "about:shoppingsidebar" ||
+ shopping_callout_impression
+ ) {
+ this.handleShoppingPings(ping, event_context);
+ }
+ } catch (e) {
+ // The Empty JSON strings and non-objects often provided by the
+ // existing telemetry we need to send failing to parse do not fit in
+ // the spirit of what this error is meant to capture. Instead, we want
+ // to capture when what we got should have been an object,
+ // but failed to parse.
+ if (event_context.length && event_context.includes("{")) {
+ Glean.messagingSystem.eventContextParseError.add(1);
+ }
+ }
+ }
+
+ // We echo certain properties from event_context into their own metrics
+ // to aid analysis.
+ if (event_context?.reason) {
+ Glean.messagingSystem.eventReason.set(event_context.reason);
+ }
+ if (event_context?.page) {
+ Glean.messagingSystem.eventPage.set(event_context.page);
+ }
+ if (event_context?.source) {
+ Glean.messagingSystem.eventSource.set(event_context.source);
+ }
+ if (event_context?.screen_family) {
+ Glean.messagingSystem.eventScreenFamily.set(event_context.screen_family);
+ }
+ // Screen_index was being coerced into a boolean value
+ // which resulted in 0 (first screen index) being ignored.
+ if (Number.isInteger(event_context?.screen_index)) {
+ Glean.messagingSystem.eventScreenIndex.set(event_context.screen_index);
+ }
+ if (event_context?.screen_id) {
+ Glean.messagingSystem.eventScreenId.set(event_context.screen_id);
+ }
+ if (event_context?.screen_initials) {
+ Glean.messagingSystem.eventScreenInitials.set(
+ event_context.screen_initials
+ );
+ }
+
+ // The event_context is also provided as-is as stringified JSON.
+ if (event_context) {
+ Glean.messagingSystem.eventContext.set(JSON.stringify(event_context));
+ }
+
+ if ("attribution" in ping) {
+ for (const [key, value] of Object.entries(ping.attribution)) {
+ const camelKey = this._snakeToCamelCase(key);
+ try {
+ Glean.messagingSystemAttribution[camelKey].set(value);
+ } catch (e) {
+ // We here acknowledge that we don't know the full breadth of data
+ // being collected. Ideally AttributionCode will later centralize
+ // definition and reporting of attribution data and we can be rid of
+ // this fail-safe for collecting the names of unknown keys.
+ Glean.messagingSystemAttribution.unknownKeys[camelKey].add(1);
+ }
+ }
+ }
+
+ // List of keys handled above.
+ const handledKeys = ["event_context", "attribution"];
+
+ for (const [key, value] of Object.entries(ping)) {
+ if (handledKeys.includes(key)) {
+ continue;
+ }
+ const camelKey = this._snakeToCamelCase(key);
+ try {
+ // We here acknowledge that even known keys might have non-scalar
+ // values. We're pretty sure we handled them all with handledKeys,
+ // but we might not have.
+ // Ideally this can later be removed after running for a version or two
+ // with no values seen in messaging_system.invalid_nested_data
+ if (typeof value === "object") {
+ Glean.messagingSystem.invalidNestedData[camelKey].add(1);
+ } else {
+ Glean.messagingSystem[camelKey].set(value);
+ }
+ } catch (e) {
+ // We here acknowledge that we don't know the full breadth of data being
+ // collected. Ideally we will later gain that confidence and can remove
+ // this fail-safe for collecting the names of unknown keys.
+ Glean.messagingSystem.unknownKeys[camelKey].add(1);
+ // TODO(bug 1600008): For testing, also record the overall count.
+ Glean.messagingSystem.unknownKeyCount.add(1);
+ }
+ }
+
+ // With all the metrics set, now it's time to submit this ping.
+ GleanPings.messagingSystem.submit();
+ }
+
+ _snakeToCamelCase(s) {
+ return s.toString().replace(/_([a-z])/gi, (_str, group) => {
+ return group.toUpperCase();
+ });
+ }
+
+ handleShoppingPings(ping, event_context) {
+ const message_id = ping?.message_id;
+ // This function helps direct a shopping ping to the correct Glean event.
+ if (message_id.startsWith("FAKESPOT_OPTIN_DEFAULT")) {
+ // Onboarding page message IDs are generated, but can reliably be
+ // assumed to start in this manner.
+ switch (ping?.event) {
+ case "CLICK_BUTTON":
+ switch (event_context?.source) {
+ case "privacy_policy":
+ Glean.shopping.surfaceShowPrivacyPolicyClicked.record();
+ break;
+ case "terms_of_use":
+ Glean.shopping.surfaceShowTermsClicked.record();
+ break;
+ case "primary_button":
+ // corresponds to 'Analyze Reviews'
+ Glean.shopping.surfaceOptInClicked.record();
+ break;
+ case "additional_button":
+ // corresponds to "Not Now"
+ Glean.shopping.surfaceNotNowClicked.record();
+ break;
+ case "learn_more":
+ Glean.shopping.surfaceLearnMoreClicked.record();
+ break;
+ }
+ break;
+ case "IMPRESSION":
+ Glean.shopping.surfaceOnboardingDisplayed.record({
+ configuration: ping?.message_id,
+ });
+ break;
+ }
+ }
+ if (message_id.startsWith("FAKESPOT_CALLOUT")) {
+ Glean.shopping.addressBarFeatureCalloutDisplayed.record({
+ configuration: message_id,
+ });
+ }
+ }
+}
diff --git a/browser/components/aboutwelcome/moz.build b/browser/components/aboutwelcome/moz.build
new file mode 100644
index 0000000000..c6e37dd2a7
--- /dev/null
+++ b/browser/components/aboutwelcome/moz.build
@@ -0,0 +1,25 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# 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 http://mozilla.org/MPL/2.0/.
+
+with Files("**"):
+ BUG_COMPONENT = ("Firefox", "Messaging System")
+
+BROWSER_CHROME_MANIFESTS += [
+ "tests/browser/browser.toml",
+]
+
+FINAL_TARGET_FILES.actors += [
+ "actors/AboutWelcomeChild.sys.mjs",
+ "actors/AboutWelcomeParent.sys.mjs",
+]
+
+JAR_MANIFESTS += ["jar.mn"]
+
+EXTRA_JS_MODULES.aboutwelcome += [
+ "modules/AboutWelcomeDefaults.sys.mjs",
+ "modules/AboutWelcomeTelemetry.sys.mjs",
+ "modules/AWScreenUtils.sys.mjs",
+]
diff --git a/browser/components/aboutwelcome/package-lock.json b/browser/components/aboutwelcome/package-lock.json
new file mode 100644
index 0000000000..dcfdb4f2b7
--- /dev/null
+++ b/browser/components/aboutwelcome/package-lock.json
@@ -0,0 +1,11051 @@
+{
+ "name": "about-welcome",
+ "version": "1.0.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "about-welcome",
+ "version": "1.0.0",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "@fluent/bundle": "0.17.1",
+ "@fluent/react": "0.15.0",
+ "react": "16.13.1",
+ "react-dom": "16.13.1",
+ "react-redux": "7.2.6",
+ "react-transition-group": "4.4.2",
+ "redux": "4.1.2"
+ },
+ "devDependencies": {
+ "@babel/preset-react": "7.16.0",
+ "@jsdevtools/coverage-istanbul-loader": "^3.0.5",
+ "babel-loader": "8.2.3",
+ "babel-plugin-jsm-to-esmodules": "0.6.0",
+ "chai": "4.3.4",
+ "enzyme": "3.11.0",
+ "enzyme-adapter-react-16": "1.15.6",
+ "karma": "6.3.8",
+ "karma-chai": "0.1.0",
+ "karma-coverage-istanbul-reporter": "3.0.3",
+ "karma-firefox-launcher": "2.1.2",
+ "karma-json-reporter": "1.2.1",
+ "karma-mocha": "2.0.1",
+ "karma-mocha-reporter": "2.2.5",
+ "karma-sinon": "1.0.5",
+ "karma-sourcemap-loader": "0.3.8",
+ "karma-webpack": "5.0.0",
+ "npm-run-all": "4.1.5",
+ "sass": "1.43.4",
+ "sinon": "12.0.1",
+ "stream-browserify": "3.0.0",
+ "webpack": "5.56.0",
+ "webpack-cli": "4.9.1",
+ "yamscripts": "0.1.0"
+ },
+ "engines": {
+ "//": "when changing node versions, also edit .nvmrc",
+ "firefox": ">=45.0 <=*",
+ "node": "16.19.*",
+ "npm": "8.19.3"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
+ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz",
+ "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helpers": "^7.23.7",
+ "@babel/parser": "^7.23.6",
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.7",
+ "@babel/types": "^7.23.6",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.23.6",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
+ "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
+ "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "browserslist": "^4.22.2",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
+ "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz",
+ "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.7",
+ "@babel/types": "^7.23.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+ "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
+ "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz",
+ "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz",
+ "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-jsx": "^7.23.3",
+ "@babel/types": "^7.23.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
+ "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz",
+ "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz",
+ "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-react-jsx": "^7.16.0",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.0",
+ "@babel/plugin-transform-react-pure-annotations": "^7.16.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz",
+ "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
+ "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.6",
+ "@babel/types": "^7.23.6",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
+ "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@fluent/bundle": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/@fluent/bundle/-/bundle-0.17.1.tgz",
+ "integrity": "sha512-CRFNT9QcSFAeFDneTF59eyv3JXFGhIIN4boUO2y22YmsuuKLyDk+N1I/NQUYz9Ab63e6V7T6vItoZIG/2oOOuw==",
+ "engines": {
+ "node": ">=12.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@fluent/react": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@fluent/react/-/react-0.15.0.tgz",
+ "integrity": "sha512-qUMfaHman+UciOELQc5hnFAv0VerUR6+9gEBCRk9RR66XS13syt91ZElNOTHWe2Ofv70cxAGaJ5Yff4MRPg5Ow==",
+ "dependencies": {
+ "@fluent/sequence": "^0.8.0",
+ "cached-iterable": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=7.0.0"
+ },
+ "peerDependencies": {
+ "@fluent/bundle": ">=0.16.0 <0.18.0",
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@fluent/sequence": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@fluent/sequence/-/sequence-0.8.0.tgz",
+ "integrity": "sha512-eV5QlEEVV/wR3AFQLXO67x4yPRPQXyqke0c8yucyMSeW36B3ecZyVFlY1UprzrfFV8iPJB4TAehDy/dLGbvQ1Q==",
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=7.0.0"
+ },
+ "peerDependencies": {
+ "@fluent/bundle": ">= 0.13.0"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+ "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@jsdevtools/coverage-istanbul-loader": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz",
+ "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==",
+ "dev": true,
+ "dependencies": {
+ "convert-source-map": "^1.7.0",
+ "istanbul-lib-instrument": "^4.0.3",
+ "loader-utils": "^2.0.0",
+ "merge-source-map": "^1.1.0",
+ "schema-utils": "^2.7.0"
+ }
+ },
+ "node_modules/@jsdevtools/coverage-istanbul-loader/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "node_modules/@sinonjs/samsam": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz",
+ "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^1.6.0",
+ "lodash.get": "^4.4.2",
+ "type-detect": "^4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/text-encoding": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
+ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
+ "dev": true
+ },
+ "node_modules/@socket.io/component-emitter": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
+ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
+ "dev": true
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
+ "dev": true
+ },
+ "node_modules/@types/cors": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz",
+ "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "0.0.50",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
+ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
+ "dev": true
+ },
+ "node_modules/@types/hoist-non-react-statics": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
+ "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
+ "dependencies": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.10.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz",
+ "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==",
+ "dev": true,
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.11",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
+ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng=="
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.46",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz",
+ "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-redux": {
+ "version": "7.1.33",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz",
+ "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==",
+ "dependencies": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+ "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+ "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+ "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+ "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+ "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+ "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+ "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+ "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+ "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+ "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+ "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/helper-wasm-section": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-opt": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "@webassemblyjs/wast-printer": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+ "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+ "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+ "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+ "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webpack-cli/configtest": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
+ "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
+ "dev": true,
+ "peerDependencies": {
+ "webpack": "4.x.x || 5.x.x",
+ "webpack-cli": "4.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/info": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
+ "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
+ "dev": true,
+ "dependencies": {
+ "envinfo": "^7.7.3"
+ },
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/serve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
+ "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
+ "dev": true,
+ "peerDependencies": {
+ "webpack-cli": "4.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/airbnb-prop-types": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
+ "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
+ "dev": true,
+ "dependencies": {
+ "array.prototype.find": "^2.1.1",
+ "function.prototype.name": "^1.1.2",
+ "is-regex": "^1.1.0",
+ "object-is": "^1.1.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "prop-types-exact": "^1.2.0",
+ "react-is": "^16.13.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "peerDependencies": {
+ "react": "^0.14 || ^15.0.0 || ^16.0.0-alpha"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.filter": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz",
+ "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.find": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.2.tgz",
+ "integrity": "sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
+ "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
+ "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
+ "dev": true,
+ "dependencies": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^1.4.0",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "engines": {
+ "node": ">= 8.9"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0",
+ "webpack": ">=2"
+ }
+ },
+ "node_modules/babel-loader/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/babel-loader/node_modules/loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/babel-plugin-jsm-to-esmodules": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jsm-to-esmodules/-/babel-plugin-jsm-to-esmodules-0.6.0.tgz",
+ "integrity": "sha512-463Yuq2sLkjoGHl5vPYUQQONnDjxnmxZuhsR1swL5N76hDFGyYZAVd6HoS4E02jBF8bORpS4aFmdr1XjEZ0buQ==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "dev": true,
+ "engines": {
+ "node": "^4.5.0 || >= 5.9"
+ }
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+ "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001565",
+ "electron-to-chromium": "^1.4.601",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cached-iterable": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/cached-iterable/-/cached-iterable-0.3.0.tgz",
+ "integrity": "sha512-MDqM6TpBVebZD4UDtmlFp8EjVtRcsB6xt9aRdWymjk0fWVUUGgmt/V7o0H0gkI2Tkvv8B0ucjidZm4mLosdlWw==",
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001574",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz",
+ "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.2"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/cheerio": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "dev": true,
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "node_modules/colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/connect/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/connect/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "dependencies": {
+ "object-assign": "^4",
+ "vary": "^1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "dependencies": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "engines": {
+ "node": ">=4.8"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/custom-event": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==",
+ "dev": true
+ },
+ "node_modules/date-format": {
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz",
+ "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/di": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+ "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/discontinuous-range": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
+ "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==",
+ "dev": true
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serialize": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+ "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==",
+ "dev": true,
+ "dependencies": {
+ "custom-event": "~1.0.0",
+ "ent": "~2.2.0",
+ "extend": "^3.0.0",
+ "void-elements": "^2.0.0"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.620",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.620.tgz",
+ "integrity": "sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/engine.io": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
+ "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
+ "dev": true,
+ "dependencies": {
+ "@types/cookie": "^0.4.1",
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.11.0"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/engine.io-parser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz",
+ "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+ "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==",
+ "dev": true
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
+ "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
+ "dev": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/enzyme": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz",
+ "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==",
+ "dev": true,
+ "dependencies": {
+ "array.prototype.flat": "^1.2.3",
+ "cheerio": "^1.0.0-rc.3",
+ "enzyme-shallow-equal": "^1.0.1",
+ "function.prototype.name": "^1.1.2",
+ "has": "^1.0.3",
+ "html-element-map": "^1.2.0",
+ "is-boolean-object": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-number-object": "^1.0.4",
+ "is-regex": "^1.0.5",
+ "is-string": "^1.0.5",
+ "is-subset": "^0.1.1",
+ "lodash.escape": "^4.0.1",
+ "lodash.isequal": "^4.5.0",
+ "object-inspect": "^1.7.0",
+ "object-is": "^1.0.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.1",
+ "object.values": "^1.1.1",
+ "raf": "^3.4.1",
+ "rst-selector-parser": "^2.2.3",
+ "string.prototype.trim": "^1.2.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/enzyme-adapter-react-16": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz",
+ "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==",
+ "dev": true,
+ "dependencies": {
+ "enzyme-adapter-utils": "^1.14.0",
+ "enzyme-shallow-equal": "^1.0.4",
+ "has": "^1.0.3",
+ "object.assign": "^4.1.2",
+ "object.values": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.13.1",
+ "react-test-renderer": "^16.0.0-0",
+ "semver": "^5.7.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "peerDependencies": {
+ "enzyme": "^3.0.0",
+ "react": "^16.0.0-0",
+ "react-dom": "^16.0.0-0"
+ }
+ },
+ "node_modules/enzyme-adapter-react-16/node_modules/react-test-renderer": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz",
+ "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==",
+ "dev": true,
+ "dependencies": {
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "react-is": "^16.8.6",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.14.0"
+ }
+ },
+ "node_modules/enzyme-adapter-react-16/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/enzyme-adapter-utils": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz",
+ "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==",
+ "dev": true,
+ "dependencies": {
+ "airbnb-prop-types": "^2.16.0",
+ "function.prototype.name": "^1.1.5",
+ "has": "^1.0.3",
+ "object.assign": "^4.1.4",
+ "object.fromentries": "^2.0.5",
+ "prop-types": "^15.8.1",
+ "semver": "^5.7.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ },
+ "peerDependencies": {
+ "react": "0.13.x || 0.14.x || ^15.0.0-0 || ^16.0.0-0"
+ }
+ },
+ "node_modules/enzyme-adapter-utils/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/enzyme-shallow-equal": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz",
+ "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3",
+ "object-is": "^1.1.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
+ "dev": true,
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.5",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.2",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.12",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "safe-array-concat": "^1.0.1",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "dev": true
+ },
+ "node_modules/es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+ "dev": true
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/execa/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/execa/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/execa/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/finalhandler/node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "dependencies": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.4",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
+ "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/has": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
+ "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/html-element-map": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz",
+ "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==",
+ "dev": true,
+ "dependencies": {
+ "array.prototype.filter": "^1.0.0",
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-errors/node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "dev": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-subset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
+ "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==",
+ "dev": true
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.11"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
+ "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^2.0.5",
+ "make-dir": "^2.1.0",
+ "rimraf": "^2.6.3",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/istanbul-lib-coverage": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
+ "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
+ "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/just-extend": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
+ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
+ "dev": true
+ },
+ "node_modules/karma": {
+ "version": "6.3.8",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.8.tgz",
+ "integrity": "sha512-10wBBU9S0lBHhbCNfmmbWQaY5C1bXlKdnvzN2QKThujCI/+DKaezrI08l6bfTlpJ92VsEboq3zYKpXwK6DOi3A==",
+ "dev": true,
+ "dependencies": {
+ "body-parser": "^1.19.0",
+ "braces": "^3.0.2",
+ "chokidar": "^3.5.1",
+ "colors": "^1.4.0",
+ "connect": "^3.7.0",
+ "di": "^0.0.1",
+ "dom-serialize": "^2.2.1",
+ "glob": "^7.1.7",
+ "graceful-fs": "^4.2.6",
+ "http-proxy": "^1.18.1",
+ "isbinaryfile": "^4.0.8",
+ "lodash": "^4.17.21",
+ "log4js": "^6.3.0",
+ "mime": "^2.5.2",
+ "minimatch": "^3.0.4",
+ "qjobs": "^1.2.0",
+ "range-parser": "^1.2.1",
+ "rimraf": "^3.0.2",
+ "socket.io": "^4.2.0",
+ "source-map": "^0.6.1",
+ "tmp": "^0.2.1",
+ "ua-parser-js": "^0.7.30",
+ "yargs": "^16.1.1"
+ },
+ "bin": {
+ "karma": "bin/karma"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/karma-chai": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz",
+ "integrity": "sha512-mqKCkHwzPMhgTYca10S90aCEX9+HjVjjrBFAsw36Zj7BlQNbokXXCAe6Ji04VUMsxcY5RLP7YphpfO06XOubdg==",
+ "dev": true,
+ "peerDependencies": {
+ "chai": "*",
+ "karma": ">=0.10.9"
+ }
+ },
+ "node_modules/karma-coverage-istanbul-reporter": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz",
+ "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^3.0.6",
+ "istanbul-reports": "^3.0.2",
+ "minimatch": "^3.0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mattlewis92"
+ }
+ },
+ "node_modules/karma-firefox-launcher": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz",
+ "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==",
+ "dev": true,
+ "dependencies": {
+ "is-wsl": "^2.2.0",
+ "which": "^2.0.1"
+ }
+ },
+ "node_modules/karma-json-reporter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/karma-json-reporter/-/karma-json-reporter-1.2.1.tgz",
+ "integrity": "sha512-ASmvranNhUN0ctSuAZKeWISW9Nf4AteMcVy8rJVjS7Qk+qWgssag/nw+yivHWKDROztVFn7TdamHOETMPCkvgA==",
+ "dev": true,
+ "peerDependencies": {
+ "karma": ">=0.9"
+ }
+ },
+ "node_modules/karma-mocha": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz",
+ "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.3"
+ }
+ },
+ "node_modules/karma-mocha-reporter": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz",
+ "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.1.0",
+ "log-symbols": "^2.1.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "peerDependencies": {
+ "karma": ">=0.13"
+ }
+ },
+ "node_modules/karma-sinon": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/karma-sinon/-/karma-sinon-1.0.5.tgz",
+ "integrity": "sha512-wrkyAxJmJbn75Dqy17L/8aILJWFm7znd1CE8gkyxTBFnjMSOe2XTJ3P30T8SkxWZHmoHX0SCaUJTDBEoXs25Og==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "peerDependencies": {
+ "karma": ">=0.10",
+ "sinon": "*"
+ }
+ },
+ "node_modules/karma-sourcemap-loader": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz",
+ "integrity": "sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "node_modules/karma-webpack": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.0.tgz",
+ "integrity": "sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3",
+ "minimatch": "^3.0.4",
+ "webpack-merge": "^4.1.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.escape": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
+ "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
+ "dev": true
+ },
+ "node_modules/lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+ "dev": true
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/log4js": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz",
+ "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
+ "dev": true,
+ "dependencies": {
+ "date-format": "^4.0.14",
+ "debug": "^4.3.4",
+ "flatted": "^3.2.7",
+ "rfdc": "^1.3.0",
+ "streamroller": "^3.1.5"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/moo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
+ "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==",
+ "dev": true
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nearley": {
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
+ "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.19.0",
+ "moo": "^0.5.0",
+ "railroad-diagrams": "^1.0.0",
+ "randexp": "0.4.6"
+ },
+ "bin": {
+ "nearley-railroad": "bin/nearley-railroad.js",
+ "nearley-test": "bin/nearley-test.js",
+ "nearley-unparse": "bin/nearley-unparse.js",
+ "nearleyc": "bin/nearleyc.js"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://nearley.js.org/#give-to-nearley"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "node_modules/nise": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz",
+ "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^2.0.0",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@sinonjs/text-encoding": "^0.7.1",
+ "just-extend": "^4.0.2",
+ "path-to-regexp": "^1.7.0"
+ }
+ },
+ "node_modules/nise/node_modules/@sinonjs/commons": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
+ "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/nise/node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dev": true
+ },
+ "node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/npm-run-all": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "chalk": "^2.4.1",
+ "cross-spawn": "^6.0.5",
+ "memorystream": "^0.3.1",
+ "minimatch": "^3.0.4",
+ "pidtree": "^0.3.0",
+ "read-pkg": "^3.0.0",
+ "shell-quote": "^1.6.1",
+ "string.prototype.padend": "^3.0.0"
+ },
+ "bin": {
+ "npm-run-all": "bin/npm-run-all/index.js",
+ "run-p": "bin/run-p/index.js",
+ "run-s": "bin/run-s/index.js"
+ },
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/npm-run-path/node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
+ "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+ "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
+ "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dev": true,
+ "dependencies": {
+ "entities": "^4.4.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
+ "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+ "dev": true,
+ "dependencies": {
+ "domhandler": "^5.0.2",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "dependencies": {
+ "isarray": "0.0.1"
+ }
+ },
+ "node_modules/path-to-regexp/node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pidtree": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
+ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
+ "dev": true,
+ "bin": {
+ "pidtree": "bin/pidtree.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types-exact": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz",
+ "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3",
+ "object.assign": "^4.1.0",
+ "reflect.ownkeys": "^0.2.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qjobs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.9"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "dev": true,
+ "dependencies": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "node_modules/railroad-diagrams": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
+ "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==",
+ "dev": true
+ },
+ "node_modules/randexp": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
+ "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
+ "dev": true,
+ "dependencies": {
+ "discontinuous-range": "1.0.0",
+ "ret": "~0.1.10"
+ },
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
+ "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
+ "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ },
+ "peerDependencies": {
+ "react": "^16.13.1"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/react-redux": {
+ "version": "7.2.6",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz",
+ "integrity": "sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.15.4",
+ "@types/react-redux": "^7.1.20",
+ "hoist-non-react-statics": "^3.3.2",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.7.2",
+ "react-is": "^17.0.2"
+ },
+ "peerDependencies": {
+ "react": "^16.8.3 || ^17"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-redux/node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz",
+ "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+ "dev": true,
+ "dependencies": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+ "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.9.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/redux": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz",
+ "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/reflect.ownkeys": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz",
+ "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==",
+ "dev": true
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "set-function-name": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ }
+ },
+ "node_modules/rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rst-selector-parser": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz",
+ "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==",
+ "dev": true,
+ "dependencies": {
+ "lodash.flattendeep": "^4.4.0",
+ "nearley": "^2.7.10"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
+ "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sass": {
+ "version": "1.43.4",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz",
+ "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": ">=3.0.0 <4.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true
+ },
+ "node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/sinon": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz",
+ "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==",
+ "deprecated": "16.1.1",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^1.8.3",
+ "@sinonjs/fake-timers": "^8.1.0",
+ "@sinonjs/samsam": "^6.0.2",
+ "diff": "^5.0.0",
+ "nise": "^5.1.0",
+ "supports-color": "^7.2.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/sinon"
+ }
+ },
+ "node_modules/sinon/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sinon/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/socket.io": {
+ "version": "4.7.3",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.3.tgz",
+ "integrity": "sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.3.2",
+ "engine.io": "~6.5.2",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ },
+ "engines": {
+ "node": ">=10.2.0"
+ }
+ },
+ "node_modules/socket.io-adapter": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
+ "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
+ "dev": true,
+ "dependencies": {
+ "ws": "~8.11.0"
+ }
+ },
+ "node_modules/socket.io-parser": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+ "dev": true,
+ "dependencies": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
+ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+ "dev": true
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/stream-browserify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "~2.0.4",
+ "readable-stream": "^3.5.0"
+ }
+ },
+ "node_modules/streamroller": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz",
+ "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
+ "dev": true,
+ "dependencies": {
+ "date-format": "^4.0.14",
+ "debug": "^4.3.4",
+ "fs-extra": "^8.1.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string.prototype.padend": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz",
+ "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
+ "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
+ "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
+ "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
+ "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.10",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
+ "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.20",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.26.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "dependencies": {
+ "rimraf": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.17.0"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/ua-parser-js": {
+ "version": "0.7.37",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz",
+ "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ua-parser-js"
+ },
+ {
+ "type": "paypal",
+ "url": "https://paypal.me/faisalman"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/faisalman"
+ }
+ ],
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dev": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.56.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.56.0.tgz",
+ "integrity": "sha512-pJ7esw2AGkpZL0jqsEAKnDEfRZdrc9NVjAWA+d1mFkwj68ng9VQ6+Wnrl+kS5dlDHvrat5ASK5vd7wp6I7f53Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.0",
+ "@types/estree": "^0.0.50",
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/wasm-edit": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "acorn": "^8.4.1",
+ "acorn-import-assertions": "^1.7.6",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.8.3",
+ "es-module-lexer": "^0.9.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.4",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.1.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.1.3",
+ "watchpack": "^2.2.0",
+ "webpack-sources": "^3.2.0"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz",
+ "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==",
+ "dev": true,
+ "dependencies": {
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^1.1.0",
+ "@webpack-cli/info": "^1.4.0",
+ "@webpack-cli/serve": "^1.6.0",
+ "colorette": "^2.0.14",
+ "commander": "^7.0.0",
+ "execa": "^5.0.0",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^2.2.0",
+ "rechoir": "^0.7.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "4.x.x || 5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generators": {
+ "optional": true
+ },
+ "@webpack-cli/migrate": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-cli/node_modules/webpack-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+ "dev": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+ "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+ "dev": true,
+ "dependencies": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "dev": true,
+ "dependencies": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.4",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/ws": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+ "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yamljs": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz",
+ "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "glob": "^7.0.5"
+ },
+ "bin": {
+ "json2yaml": "bin/json2yaml",
+ "yaml2json": "bin/yaml2json"
+ }
+ },
+ "node_modules/yamscripts": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yamscripts/-/yamscripts-0.1.0.tgz",
+ "integrity": "sha512-i4ThS58KwsK83qSrrc8YZiBqgdl3WewWcWZ4fPdrh7A+qiRU9kXMcIKzngOC7VpJ2nTsWvHG6TcK3JHXpBxACA==",
+ "dev": true,
+ "dependencies": {
+ "colors": "^1.3.2",
+ "fs-extra": "^7.0.0",
+ "minimist": "^1.2.0",
+ "yamljs": "^0.3.0"
+ },
+ "bin": {
+ "yamscripts": "bin/yamscripts.js"
+ }
+ },
+ "node_modules/yamscripts/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@babel/code-frame": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ }
+ },
+ "@babel/compat-data": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
+ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "dev": true
+ },
+ "@babel/core": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz",
+ "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helpers": "^7.23.7",
+ "@babel/parser": "^7.23.6",
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.7",
+ "@babel/types": "^7.23.6",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ }
+ },
+ "@babel/generator": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.23.6",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ }
+ },
+ "@babel/helper-annotate-as-pure": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
+ "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-compilation-targets": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
+ "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "dev": true,
+ "requires": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "browserslist": "^4.22.2",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.15"
+ }
+ },
+ "@babel/helper-module-transforms": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
+ "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ }
+ },
+ "@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "dev": true
+ },
+ "@babel/helper-simple-access": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "dev": true
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true
+ },
+ "@babel/helper-validator-option": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "dev": true
+ },
+ "@babel/helpers": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz",
+ "integrity": "sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.22.15",
+ "@babel/traverse": "^7.23.7",
+ "@babel/types": "^7.23.6"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ }
+ },
+ "@babel/parser": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz",
+ "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==",
+ "dev": true
+ },
+ "@babel/plugin-syntax-jsx": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
+ "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ }
+ },
+ "@babel/plugin-transform-react-display-name": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz",
+ "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ }
+ },
+ "@babel/plugin-transform-react-jsx": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz",
+ "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "@babel/plugin-syntax-jsx": "^7.23.3",
+ "@babel/types": "^7.23.4"
+ }
+ },
+ "@babel/plugin-transform-react-jsx-development": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
+ "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
+ "dev": true,
+ "requires": {
+ "@babel/plugin-transform-react-jsx": "^7.22.5"
+ }
+ },
+ "@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz",
+ "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-annotate-as-pure": "^7.22.5",
+ "@babel/helper-plugin-utils": "^7.22.5"
+ }
+ },
+ "@babel/preset-react": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.0.tgz",
+ "integrity": "sha512-d31IFW2bLRB28uL1WoElyro8RH5l6531XfxMtCeCmp6RVAF1uTfxxUA0LH1tXl+psZdwfmIbwoG4U5VwgbhtLw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.14.5",
+ "@babel/helper-validator-option": "^7.14.5",
+ "@babel/plugin-transform-react-display-name": "^7.16.0",
+ "@babel/plugin-transform-react-jsx": "^7.16.0",
+ "@babel/plugin-transform-react-jsx-development": "^7.16.0",
+ "@babel/plugin-transform-react-pure-annotations": "^7.16.0"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.7.tgz",
+ "integrity": "sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA==",
+ "requires": {
+ "regenerator-runtime": "^0.14.0"
+ }
+ },
+ "@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.23.7",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz",
+ "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.6",
+ "@babel/types": "^7.23.6",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ }
+ },
+ "@babel/types": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz",
+ "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true
+ },
+ "@fluent/bundle": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/@fluent/bundle/-/bundle-0.17.1.tgz",
+ "integrity": "sha512-CRFNT9QcSFAeFDneTF59eyv3JXFGhIIN4boUO2y22YmsuuKLyDk+N1I/NQUYz9Ab63e6V7T6vItoZIG/2oOOuw=="
+ },
+ "@fluent/react": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@fluent/react/-/react-0.15.0.tgz",
+ "integrity": "sha512-qUMfaHman+UciOELQc5hnFAv0VerUR6+9gEBCRk9RR66XS13syt91ZElNOTHWe2Ofv70cxAGaJ5Yff4MRPg5Ow==",
+ "requires": {
+ "@fluent/sequence": "^0.8.0",
+ "cached-iterable": "^0.3.0"
+ }
+ },
+ "@fluent/sequence": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@fluent/sequence/-/sequence-0.8.0.tgz",
+ "integrity": "sha512-eV5QlEEVV/wR3AFQLXO67x4yPRPQXyqke0c8yucyMSeW36B3ecZyVFlY1UprzrfFV8iPJB4TAehDy/dLGbvQ1Q==",
+ "requires": {}
+ },
+ "@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true
+ },
+ "@jridgewell/source-map": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+ "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "@jsdevtools/coverage-istanbul-loader": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@jsdevtools/coverage-istanbul-loader/-/coverage-istanbul-loader-3.0.5.tgz",
+ "integrity": "sha512-EUCPEkaRPvmHjWAAZkWMT7JDzpw7FKB00WTISaiXsbNOd5hCHg77XLA8sLYLFDo1zepYLo2w7GstN8YBqRXZfA==",
+ "dev": true,
+ "requires": {
+ "convert-source-map": "^1.7.0",
+ "istanbul-lib-instrument": "^4.0.3",
+ "loader-utils": "^2.0.0",
+ "merge-source-map": "^1.1.0",
+ "schema-utils": "^2.7.0"
+ },
+ "dependencies": {
+ "convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
+ "dev": true
+ }
+ }
+ },
+ "@sinonjs/commons": {
+ "version": "1.8.6",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
+ "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "@sinonjs/fake-timers": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+ "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.7.0"
+ }
+ },
+ "@sinonjs/samsam": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz",
+ "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.6.0",
+ "lodash.get": "^4.4.2",
+ "type-detect": "^4.0.8"
+ }
+ },
+ "@sinonjs/text-encoding": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
+ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
+ "dev": true
+ },
+ "@socket.io/component-emitter": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz",
+ "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==",
+ "dev": true
+ },
+ "@types/cookie": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
+ "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==",
+ "dev": true
+ },
+ "@types/cors": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/eslint": {
+ "version": "8.56.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.1.tgz",
+ "integrity": "sha512-18PLWRzhy9glDQp3+wOgfLYRWlhgX0azxgJ63rdpoUHyrC9z0f5CkFburjQx4uD7ZCruw85ZtMt6K+L+R8fLJQ==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "requires": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "0.0.50",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
+ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
+ "dev": true
+ },
+ "@types/hoist-non-react-statics": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
+ "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
+ "requires": {
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0"
+ }
+ },
+ "@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "20.10.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz",
+ "integrity": "sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw==",
+ "dev": true,
+ "requires": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "@types/prop-types": {
+ "version": "15.7.11",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
+ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng=="
+ },
+ "@types/react": {
+ "version": "18.2.46",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.46.tgz",
+ "integrity": "sha512-nNCvVBcZlvX4NU1nRRNV/mFl1nNRuTuslAJglQsq+8ldXe5Xv0Wd2f7WTE3jOxhLH2BFfiZGC6GCp+kHQbgG+w==",
+ "requires": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "@types/react-redux": {
+ "version": "7.1.33",
+ "resolved": "https://registry.npmjs.org/@types/react-redux/-/react-redux-7.1.33.tgz",
+ "integrity": "sha512-NF8m5AjWCkert+fosDsN3hAlHzpjSiXlVy9EgQEmLoBhaNXbmyeGs/aj5dQzKuF+/q+S7JQagorGDW8pJ28Hmg==",
+ "requires": {
+ "@types/hoist-non-react-statics": "^3.3.0",
+ "@types/react": "*",
+ "hoist-non-react-statics": "^3.3.0",
+ "redux": "^4.0.0"
+ }
+ },
+ "@types/scheduler": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A=="
+ },
+ "@webassemblyjs/ast": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+ "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/helper-numbers": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+ }
+ },
+ "@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+ "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-api-error": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+ "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-buffer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+ "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-numbers": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+ "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+ "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
+ "dev": true
+ },
+ "@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+ "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1"
+ }
+ },
+ "@webassemblyjs/ieee754": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+ "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+ "dev": true,
+ "requires": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "@webassemblyjs/leb128": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+ "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+ "dev": true,
+ "requires": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webassemblyjs/utf8": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+ "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
+ "dev": true
+ },
+ "@webassemblyjs/wasm-edit": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+ "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/helper-wasm-section": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-opt": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "@webassemblyjs/wast-printer": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-gen": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+ "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-opt": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+ "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-buffer": "1.11.1",
+ "@webassemblyjs/wasm-gen": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wasm-parser": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+ "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/helper-api-error": "1.11.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+ "@webassemblyjs/ieee754": "1.11.1",
+ "@webassemblyjs/leb128": "1.11.1",
+ "@webassemblyjs/utf8": "1.11.1"
+ }
+ },
+ "@webassemblyjs/wast-printer": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+ "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+ "dev": true,
+ "requires": {
+ "@webassemblyjs/ast": "1.11.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "@webpack-cli/configtest": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
+ "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
+ "dev": true,
+ "requires": {}
+ },
+ "@webpack-cli/info": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
+ "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
+ "dev": true,
+ "requires": {
+ "envinfo": "^7.7.3"
+ }
+ },
+ "@webpack-cli/serve": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
+ "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
+ "dev": true,
+ "requires": {}
+ },
+ "@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "requires": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ }
+ },
+ "acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "dev": true
+ },
+ "acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "dev": true,
+ "requires": {}
+ },
+ "airbnb-prop-types": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
+ "integrity": "sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==",
+ "dev": true,
+ "requires": {
+ "array.prototype.find": "^2.1.1",
+ "function.prototype.name": "^1.1.2",
+ "is-regex": "^1.1.0",
+ "object-is": "^1.1.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "prop-types-exact": "^1.2.0",
+ "react-is": "^16.13.1"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "array-buffer-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
+ "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "is-array-buffer": "^3.0.1"
+ }
+ },
+ "array.prototype.filter": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz",
+ "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-array-method-boxes-properly": "^1.0.0",
+ "is-string": "^1.0.7"
+ }
+ },
+ "array.prototype.find": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.2.2.tgz",
+ "integrity": "sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "array.prototype.flat": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ }
+ },
+ "arraybuffer.prototype.slice": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
+ "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
+ "dev": true,
+ "requires": {
+ "array-buffer-byte-length": "^1.0.0",
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "get-intrinsic": "^1.2.1",
+ "is-array-buffer": "^3.0.2",
+ "is-shared-array-buffer": "^1.0.2"
+ }
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "available-typed-arrays": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
+ "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
+ "dev": true
+ },
+ "babel-loader": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
+ "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
+ "dev": true,
+ "requires": {
+ "find-cache-dir": "^3.3.1",
+ "loader-utils": "^1.4.0",
+ "make-dir": "^3.1.0",
+ "schema-utils": "^2.6.5"
+ },
+ "dependencies": {
+ "json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
+ "loader-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+ "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^1.0.1"
+ }
+ }
+ }
+ },
+ "babel-plugin-jsm-to-esmodules": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jsm-to-esmodules/-/babel-plugin-jsm-to-esmodules-0.6.0.tgz",
+ "integrity": "sha512-463Yuq2sLkjoGHl5vPYUQQONnDjxnmxZuhsR1swL5N76hDFGyYZAVd6HoS4E02jBF8bORpS4aFmdr1XjEZ0buQ==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "base64id": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
+ "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==",
+ "dev": true
+ },
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "body-parser": {
+ "version": "1.20.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
+ "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.11.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ }
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
+ "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+ "dev": true,
+ "requires": {
+ "caniuse-lite": "^1.0.30001565",
+ "electron-to-chromium": "^1.4.601",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
+ }
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true
+ },
+ "cached-iterable": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/cached-iterable/-/cached-iterable-0.3.0.tgz",
+ "integrity": "sha512-MDqM6TpBVebZD4UDtmlFp8EjVtRcsB6xt9aRdWymjk0fWVUUGgmt/V7o0H0gkI2Tkvv8B0ucjidZm4mLosdlWw=="
+ },
+ "call-bind": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
+ "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.1",
+ "set-function-length": "^1.1.1"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001574",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001574.tgz",
+ "integrity": "sha512-BtYEK4r/iHt/txm81KBudCUcTy7t+s9emrIaHqjYurQ10x71zJ5VQ9x1dYPcz/b+pKSp4y/v1xSI67A+LzpNyg==",
+ "dev": true
+ },
+ "chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^3.0.1",
+ "get-func-name": "^2.0.0",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "check-error": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
+ "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
+ "dev": true,
+ "requires": {
+ "get-func-name": "^2.0.2"
+ }
+ },
+ "cheerio": {
+ "version": "1.0.0-rc.12",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz",
+ "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==",
+ "dev": true,
+ "requires": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0"
+ }
+ },
+ "cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
+ }
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ }
+ },
+ "chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "dev": true
+ },
+ "cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ }
+ }
+ },
+ "clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "colors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
+ "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
+ "dev": true
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "connect": {
+ "version": "3.7.0",
+ "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz",
+ "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "finalhandler": "1.1.2",
+ "parseurl": "~1.3.3",
+ "utils-merge": "1.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ }
+ }
+ },
+ "content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "dev": true
+ },
+ "cors": {
+ "version": "2.8.5",
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4",
+ "vary": "^1"
+ }
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "dev": true,
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ }
+ },
+ "css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true
+ },
+ "csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "custom-event": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz",
+ "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==",
+ "dev": true
+ },
+ "date-format": {
+ "version": "4.0.14",
+ "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz",
+ "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "deep-eql": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
+ "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "define-data-property": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
+ "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ }
+ },
+ "define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "requires": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true
+ },
+ "destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true
+ },
+ "di": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz",
+ "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==",
+ "dev": true
+ },
+ "diff": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+ "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "dev": true
+ },
+ "discontinuous-range": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
+ "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==",
+ "dev": true
+ },
+ "dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "requires": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "dom-serialize": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
+ "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==",
+ "dev": true,
+ "requires": {
+ "custom-event": "~1.0.0",
+ "ent": "~2.2.0",
+ "extend": "^3.0.0",
+ "void-elements": "^2.0.0"
+ }
+ },
+ "dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ }
+ },
+ "domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.3.0"
+ }
+ },
+ "domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ }
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true
+ },
+ "electron-to-chromium": {
+ "version": "1.4.620",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.620.tgz",
+ "integrity": "sha512-a2fcSHOHrqBJsPNXtf6ZCEZpXrFCcbK1FBxfX3txoqWzNgtEDG1f3M59M98iwxhRW4iMKESnSjbJ310/rkrp0g==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true
+ },
+ "engine.io": {
+ "version": "6.5.4",
+ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz",
+ "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==",
+ "dev": true,
+ "requires": {
+ "@types/cookie": "^0.4.1",
+ "@types/cors": "^2.8.12",
+ "@types/node": ">=10.0.0",
+ "accepts": "~1.3.4",
+ "base64id": "2.0.0",
+ "cookie": "~0.4.1",
+ "cors": "~2.8.5",
+ "debug": "~4.3.1",
+ "engine.io-parser": "~5.2.1",
+ "ws": "~8.11.0"
+ }
+ },
+ "engine.io-parser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz",
+ "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==",
+ "dev": true
+ },
+ "enhanced-resolve": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+ "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ }
+ },
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==",
+ "dev": true
+ },
+ "entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true
+ },
+ "envinfo": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
+ "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
+ "dev": true
+ },
+ "enzyme": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz",
+ "integrity": "sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==",
+ "dev": true,
+ "requires": {
+ "array.prototype.flat": "^1.2.3",
+ "cheerio": "^1.0.0-rc.3",
+ "enzyme-shallow-equal": "^1.0.1",
+ "function.prototype.name": "^1.1.2",
+ "has": "^1.0.3",
+ "html-element-map": "^1.2.0",
+ "is-boolean-object": "^1.0.1",
+ "is-callable": "^1.1.5",
+ "is-number-object": "^1.0.4",
+ "is-regex": "^1.0.5",
+ "is-string": "^1.0.5",
+ "is-subset": "^0.1.1",
+ "lodash.escape": "^4.0.1",
+ "lodash.isequal": "^4.5.0",
+ "object-inspect": "^1.7.0",
+ "object-is": "^1.0.2",
+ "object.assign": "^4.1.0",
+ "object.entries": "^1.1.1",
+ "object.values": "^1.1.1",
+ "raf": "^3.4.1",
+ "rst-selector-parser": "^2.2.3",
+ "string.prototype.trim": "^1.2.1"
+ }
+ },
+ "enzyme-adapter-react-16": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.6.tgz",
+ "integrity": "sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==",
+ "dev": true,
+ "requires": {
+ "enzyme-adapter-utils": "^1.14.0",
+ "enzyme-shallow-equal": "^1.0.4",
+ "has": "^1.0.3",
+ "object.assign": "^4.1.2",
+ "object.values": "^1.1.2",
+ "prop-types": "^15.7.2",
+ "react-is": "^16.13.1",
+ "react-test-renderer": "^16.0.0-0",
+ "semver": "^5.7.0"
+ },
+ "dependencies": {
+ "react-test-renderer": {
+ "version": "16.14.0",
+ "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.14.0.tgz",
+ "integrity": "sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==",
+ "dev": true,
+ "requires": {
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "react-is": "^16.8.6",
+ "scheduler": "^0.19.1"
+ }
+ },
+ "semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true
+ }
+ }
+ },
+ "enzyme-adapter-utils": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz",
+ "integrity": "sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==",
+ "dev": true,
+ "requires": {
+ "airbnb-prop-types": "^2.16.0",
+ "function.prototype.name": "^1.1.5",
+ "has": "^1.0.3",
+ "object.assign": "^4.1.4",
+ "object.fromentries": "^2.0.5",
+ "prop-types": "^15.8.1",
+ "semver": "^5.7.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true
+ }
+ }
+ },
+ "enzyme-shallow-equal": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz",
+ "integrity": "sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3",
+ "object-is": "^1.1.5"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "es-abstract": {
+ "version": "1.22.3",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
+ "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
+ "dev": true,
+ "requires": {
+ "array-buffer-byte-length": "^1.0.0",
+ "arraybuffer.prototype.slice": "^1.0.2",
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.5",
+ "es-set-tostringtag": "^2.0.1",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.2",
+ "get-symbol-description": "^1.0.0",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0",
+ "internal-slot": "^1.0.5",
+ "is-array-buffer": "^3.0.2",
+ "is-callable": "^1.2.7",
+ "is-negative-zero": "^2.0.2",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.2",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.12",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.4",
+ "regexp.prototype.flags": "^1.5.1",
+ "safe-array-concat": "^1.0.1",
+ "safe-regex-test": "^1.0.0",
+ "string.prototype.trim": "^1.2.8",
+ "string.prototype.trimend": "^1.0.7",
+ "string.prototype.trimstart": "^1.0.7",
+ "typed-array-buffer": "^1.0.0",
+ "typed-array-byte-length": "^1.0.0",
+ "typed-array-byte-offset": "^1.0.0",
+ "typed-array-length": "^1.0.4",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.13"
+ }
+ },
+ "es-array-method-boxes-properly": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
+ "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "dev": true
+ },
+ "es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+ "dev": true
+ },
+ "es-set-tostringtag": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
+ "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.2.2",
+ "has-tostringtag": "^1.0.0",
+ "hasown": "^2.0.0"
+ }
+ },
+ "es-shim-unscopables": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "requires": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "dependencies": {
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "dev": true,
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ }
+ }
+ },
+ "find-cache-dir": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+ "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "make-dir": "^3.0.2",
+ "pkg-dir": "^4.1.0"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true
+ },
+ "flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "follow-redirects": {
+ "version": "1.15.4",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
+ "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
+ "dev": true
+ },
+ "for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true
+ },
+ "function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ }
+ },
+ "functions-have-names": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true
+ },
+ "gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
+ "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ },
+ "get-symbol-description": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+ "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
+ "globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
+ "gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.1.3"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "has": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
+ "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
+ "dev": true
+ },
+ "has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "has-property-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
+ "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.2.2"
+ }
+ },
+ "has-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+ "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+ "dev": true
+ },
+ "has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true
+ },
+ "has-tostringtag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+ "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "hasown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.2"
+ }
+ },
+ "hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "requires": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "html-element-map": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz",
+ "integrity": "sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==",
+ "dev": true,
+ "requires": {
+ "array.prototype.filter": "^1.0.0",
+ "call-bind": "^1.0.2"
+ }
+ },
+ "html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "htmlparser2": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz",
+ "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "entities": "^4.4.0"
+ }
+ },
+ "http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "requires": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "dependencies": {
+ "statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true
+ }
+ }
+ },
+ "http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "import-local": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+ "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+ "dev": true,
+ "requires": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "internal-slot": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
+ "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "dev": true,
+ "requires": {
+ "get-intrinsic": "^1.2.2",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ }
+ },
+ "interpret": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+ "dev": true
+ },
+ "is-array-buffer": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
+ "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.0",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true
+ },
+ "is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "requires": {
+ "has-bigints": "^1.0.1"
+ }
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true
+ },
+ "is-core-module": {
+ "version": "2.13.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "dev": true,
+ "requires": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-negative-zero": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
+ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true
+ },
+ "is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-shared-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
+ },
+ "is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "requires": {
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "is-subset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
+ "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.2"
+ }
+ },
+ "is-typed-array": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
+ "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "dev": true,
+ "requires": {
+ "which-typed-array": "^1.1.11"
+ }
+ },
+ "is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2"
+ }
+ },
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ },
+ "isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true
+ },
+ "istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true
+ },
+ "istanbul-lib-instrument": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+ "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+ "dev": true,
+ "requires": {
+ "@babel/core": "^7.7.5",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.0.0",
+ "semver": "^6.3.0"
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "requires": {
+ "semver": "^7.5.3"
+ }
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz",
+ "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^2.0.5",
+ "make-dir": "^2.1.0",
+ "rimraf": "^2.6.3",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "istanbul-lib-coverage": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
+ "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
+ "dev": true
+ },
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "requires": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ }
+ },
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true
+ }
+ }
+ },
+ "istanbul-reports": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz",
+ "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==",
+ "dev": true,
+ "requires": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ }
+ },
+ "jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "just-extend": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
+ "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
+ "dev": true
+ },
+ "karma": {
+ "version": "6.3.8",
+ "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.8.tgz",
+ "integrity": "sha512-10wBBU9S0lBHhbCNfmmbWQaY5C1bXlKdnvzN2QKThujCI/+DKaezrI08l6bfTlpJ92VsEboq3zYKpXwK6DOi3A==",
+ "dev": true,
+ "requires": {
+ "body-parser": "^1.19.0",
+ "braces": "^3.0.2",
+ "chokidar": "^3.5.1",
+ "colors": "^1.4.0",
+ "connect": "^3.7.0",
+ "di": "^0.0.1",
+ "dom-serialize": "^2.2.1",
+ "glob": "^7.1.7",
+ "graceful-fs": "^4.2.6",
+ "http-proxy": "^1.18.1",
+ "isbinaryfile": "^4.0.8",
+ "lodash": "^4.17.21",
+ "log4js": "^6.3.0",
+ "mime": "^2.5.2",
+ "minimatch": "^3.0.4",
+ "qjobs": "^1.2.0",
+ "range-parser": "^1.2.1",
+ "rimraf": "^3.0.2",
+ "socket.io": "^4.2.0",
+ "source-map": "^0.6.1",
+ "tmp": "^0.2.1",
+ "ua-parser-js": "^0.7.30",
+ "yargs": "^16.1.1"
+ }
+ },
+ "karma-chai": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz",
+ "integrity": "sha512-mqKCkHwzPMhgTYca10S90aCEX9+HjVjjrBFAsw36Zj7BlQNbokXXCAe6Ji04VUMsxcY5RLP7YphpfO06XOubdg==",
+ "dev": true,
+ "requires": {}
+ },
+ "karma-coverage-istanbul-reporter": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-3.0.3.tgz",
+ "integrity": "sha512-wE4VFhG/QZv2Y4CdAYWDbMmcAHeS926ZIji4z+FkB2aF/EposRb6DP6G5ncT/wXhqUfAb/d7kZrNKPonbvsATw==",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^3.0.6",
+ "istanbul-reports": "^3.0.2",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "karma-firefox-launcher": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-2.1.2.tgz",
+ "integrity": "sha512-VV9xDQU1QIboTrjtGVD4NCfzIH7n01ZXqy/qpBhnOeGVOkG5JYPEm8kuSd7psHE6WouZaQ9Ool92g8LFweSNMA==",
+ "dev": true,
+ "requires": {
+ "is-wsl": "^2.2.0",
+ "which": "^2.0.1"
+ }
+ },
+ "karma-json-reporter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/karma-json-reporter/-/karma-json-reporter-1.2.1.tgz",
+ "integrity": "sha512-ASmvranNhUN0ctSuAZKeWISW9Nf4AteMcVy8rJVjS7Qk+qWgssag/nw+yivHWKDROztVFn7TdamHOETMPCkvgA==",
+ "dev": true,
+ "requires": {}
+ },
+ "karma-mocha": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-2.0.1.tgz",
+ "integrity": "sha512-Tzd5HBjm8his2OA4bouAsATYEpZrp9vC7z5E5j4C5Of5Rrs1jY67RAwXNcVmd/Bnk1wgvQRou0zGVLey44G4tQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.3"
+ }
+ },
+ "karma-mocha-reporter": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz",
+ "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.1.0",
+ "log-symbols": "^2.1.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "karma-sinon": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/karma-sinon/-/karma-sinon-1.0.5.tgz",
+ "integrity": "sha512-wrkyAxJmJbn75Dqy17L/8aILJWFm7znd1CE8gkyxTBFnjMSOe2XTJ3P30T8SkxWZHmoHX0SCaUJTDBEoXs25Og==",
+ "dev": true,
+ "requires": {}
+ },
+ "karma-sourcemap-loader": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.8.tgz",
+ "integrity": "sha512-zorxyAakYZuBcHRJE+vbrK2o2JXLFWK8VVjiT/6P+ltLBUGUvqTEkUiQ119MGdOrK7mrmxXHZF1/pfT6GgIZ6g==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "karma-webpack": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-5.0.0.tgz",
+ "integrity": "sha512-+54i/cd3/piZuP3dr54+NcFeKOPnys5QeM1IY+0SPASwrtHsliXUiCL50iW+K9WWA7RvamC4macvvQ86l3KtaA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3",
+ "minimatch": "^3.0.4",
+ "webpack-merge": "^4.1.5"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true
+ },
+ "load-json-file": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
+ "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^4.0.0",
+ "pify": "^3.0.0",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true
+ },
+ "loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "requires": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ }
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash.escape": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
+ "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
+ "dev": true
+ },
+ "lodash.flattendeep": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
+ "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
+ "dev": true
+ },
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+ "dev": true
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "dev": true
+ },
+ "log-symbols": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.0.1"
+ }
+ },
+ "log4js": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz",
+ "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==",
+ "dev": true,
+ "requires": {
+ "date-format": "^4.0.14",
+ "debug": "^4.3.4",
+ "flatted": "^3.2.7",
+ "rfdc": "^1.3.0",
+ "streamroller": "^3.1.5"
+ }
+ },
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "requires": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true
+ },
+ "memorystream": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz",
+ "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==",
+ "dev": true
+ },
+ "merge-source-map": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
+ "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true
+ },
+ "moo": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz",
+ "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "nearley": {
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz",
+ "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.19.0",
+ "moo": "^0.5.0",
+ "railroad-diagrams": "^1.0.0",
+ "randexp": "0.4.6"
+ }
+ },
+ "negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
+ "dev": true
+ },
+ "nise": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz",
+ "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^2.0.0",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@sinonjs/text-encoding": "^0.7.1",
+ "just-extend": "^4.0.2",
+ "path-to-regexp": "^1.7.0"
+ },
+ "dependencies": {
+ "@sinonjs/commons": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
+ "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^3.0.0"
+ },
+ "dependencies": {
+ "@sinonjs/commons": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
+ "dev": true,
+ "requires": {
+ "type-detect": "4.0.8"
+ }
+ }
+ }
+ }
+ }
+ },
+ "node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true
+ }
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "npm-run-all": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz",
+ "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "chalk": "^2.4.1",
+ "cross-spawn": "^6.0.5",
+ "memorystream": "^0.3.1",
+ "minimatch": "^3.0.4",
+ "pidtree": "^0.3.0",
+ "read-pkg": "^3.0.0",
+ "shell-quote": "^1.6.1",
+ "string.prototype.padend": "^3.0.0"
+ }
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ }
+ }
+ },
+ "nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
+ },
+ "object-inspect": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
+ "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
+ "dev": true
+ },
+ "object-is": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz",
+ "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.3"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "object.entries": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
+ "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "object.fromentries": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
+ "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "object.values": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
+ "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "parse-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
+ "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ }
+ },
+ "parse5": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
+ "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
+ "dev": true,
+ "requires": {
+ "entities": "^4.4.0"
+ }
+ },
+ "parse5-htmlparser2-tree-adapter": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
+ "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
+ "dev": true,
+ "requires": {
+ "domhandler": "^5.0.2",
+ "parse5": "^7.0.0"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ }
+ }
+ },
+ "path-type": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
+ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "dev": true,
+ "requires": {
+ "pify": "^3.0.0"
+ }
+ },
+ "pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true
+ },
+ "pidtree": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz",
+ "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==",
+ "dev": true
+ },
+ "pify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
+ "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
+ "dev": true
+ },
+ "pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "requires": {
+ "find-up": "^4.0.0"
+ }
+ },
+ "prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "requires": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "prop-types-exact": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz",
+ "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3",
+ "object.assign": "^4.1.0",
+ "reflect.ownkeys": "^0.2.0"
+ }
+ },
+ "punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true
+ },
+ "qjobs": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz",
+ "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
+ "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "dev": true,
+ "requires": {
+ "side-channel": "^1.0.4"
+ }
+ },
+ "raf": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
+ "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
+ "dev": true,
+ "requires": {
+ "performance-now": "^2.1.0"
+ }
+ },
+ "railroad-diagrams": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
+ "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==",
+ "dev": true
+ },
+ "randexp": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz",
+ "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==",
+ "dev": true,
+ "requires": {
+ "discontinuous-range": "1.0.0",
+ "ret": "~0.1.10"
+ }
+ },
+ "randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "react": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
+ "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "react-dom": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
+ "integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1",
+ "prop-types": "^15.6.2",
+ "scheduler": "^0.19.1"
+ }
+ },
+ "react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "react-redux": {
+ "version": "7.2.6",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-7.2.6.tgz",
+ "integrity": "sha512-10RPdsz0UUrRL1NZE0ejTkucnclYSgXp5q+tB5SWx2qeG2ZJQJyymgAhwKy73yiL/13btfB6fPr+rgbMAaZIAQ==",
+ "requires": {
+ "@babel/runtime": "^7.15.4",
+ "@types/react-redux": "^7.1.20",
+ "hoist-non-react-statics": "^3.3.2",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.7.2",
+ "react-is": "^17.0.2"
+ },
+ "dependencies": {
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
+ }
+ }
+ },
+ "react-transition-group": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.2.tgz",
+ "integrity": "sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==",
+ "requires": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ }
+ },
+ "read-pkg": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
+ "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^4.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^3.0.0"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "rechoir": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+ "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
+ "dev": true,
+ "requires": {
+ "resolve": "^1.9.0"
+ }
+ },
+ "redux": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz",
+ "integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==",
+ "requires": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "reflect.ownkeys": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz",
+ "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==",
+ "dev": true
+ },
+ "regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "regexp.prototype.flags": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
+ "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "set-function-name": "^2.0.0"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "requires": {
+ "resolve-from": "^5.0.0"
+ }
+ },
+ "resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "dev": true
+ },
+ "rfdc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz",
+ "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "rst-selector-parser": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz",
+ "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==",
+ "dev": true,
+ "requires": {
+ "lodash.flattendeep": "^4.4.0",
+ "nearley": "^2.7.10"
+ }
+ },
+ "safe-array-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
+ "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "safe-regex-test": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
+ "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.1.3",
+ "is-regex": "^1.1.4"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sass": {
+ "version": "1.43.4",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz",
+ "integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==",
+ "dev": true,
+ "requires": {
+ "chokidar": ">=3.0.0 <4.0.0"
+ }
+ },
+ "scheduler": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
+ "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+ "requires": {
+ "loose-envify": "^1.1.0",
+ "object-assign": "^4.1.1"
+ }
+ },
+ "schema-utils": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+ "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.5",
+ "ajv": "^6.12.4",
+ "ajv-keywords": "^3.5.2"
+ }
+ },
+ "semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ },
+ "serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "dev": true,
+ "requires": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "set-function-length": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
+ "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "dev": true,
+ "requires": {
+ "define-data-property": "^1.1.1",
+ "get-intrinsic": "^1.2.1",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.0"
+ }
+ },
+ "set-function-name": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
+ "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "dev": true,
+ "requires": {
+ "define-data-property": "^1.0.1",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.0"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true
+ },
+ "shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "requires": {
+ "kind-of": "^6.0.2"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^1.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true
+ },
+ "shell-quote": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "dev": true
+ },
+ "side-channel": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+ "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.0",
+ "get-intrinsic": "^1.0.2",
+ "object-inspect": "^1.9.0"
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "sinon": {
+ "version": "12.0.1",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz",
+ "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==",
+ "dev": true,
+ "requires": {
+ "@sinonjs/commons": "^1.8.3",
+ "@sinonjs/fake-timers": "^8.1.0",
+ "@sinonjs/samsam": "^6.0.2",
+ "diff": "^5.0.0",
+ "nise": "^5.1.0",
+ "supports-color": "^7.2.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ }
+ }
+ },
+ "socket.io": {
+ "version": "4.7.3",
+ "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.3.tgz",
+ "integrity": "sha512-SE+UIQXBQE+GPG2oszWMlsEmWtHVqw/h1VrYJGK5/MC7CH5p58N448HwIrtREcvR4jfdOJAY4ieQfxMr55qbbw==",
+ "dev": true,
+ "requires": {
+ "accepts": "~1.3.4",
+ "base64id": "~2.0.0",
+ "cors": "~2.8.5",
+ "debug": "~4.3.2",
+ "engine.io": "~6.5.2",
+ "socket.io-adapter": "~2.5.2",
+ "socket.io-parser": "~4.2.4"
+ }
+ },
+ "socket.io-adapter": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz",
+ "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==",
+ "dev": true,
+ "requires": {
+ "ws": "~8.11.0"
+ }
+ },
+ "socket.io-parser": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz",
+ "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==",
+ "dev": true,
+ "requires": {
+ "@socket.io/component-emitter": "~3.1.0",
+ "debug": "~4.3.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "requires": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-exceptions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
+ "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
+ "dev": true
+ },
+ "spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "requires": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "spdx-license-ids": {
+ "version": "3.0.16",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
+ "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
+ "dev": true
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true
+ },
+ "stream-browserify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz",
+ "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==",
+ "dev": true,
+ "requires": {
+ "inherits": "~2.0.4",
+ "readable-stream": "^3.5.0"
+ }
+ },
+ "streamroller": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz",
+ "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==",
+ "dev": true,
+ "requires": {
+ "date-format": "^4.0.14",
+ "debug": "^4.3.4",
+ "fs-extra": "^8.1.0"
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ }
+ }
+ },
+ "string.prototype.padend": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.5.tgz",
+ "integrity": "sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "string.prototype.trim": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
+ "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
+ "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
+ "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true
+ },
+ "terser": {
+ "version": "5.26.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
+ "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ }
+ },
+ "terser-webpack-plugin": {
+ "version": "5.3.10",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
+ "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/trace-mapping": "^0.3.20",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.26.0"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "requires": {
+ "rimraf": "^3.0.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ }
+ },
+ "typed-array-buffer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
+ "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "typed-array-byte-length": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
+ "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "typed-array-byte-offset": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "has-proto": "^1.0.1",
+ "is-typed-array": "^1.1.10"
+ }
+ },
+ "typed-array-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
+ "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "for-each": "^0.3.3",
+ "is-typed-array": "^1.1.9"
+ }
+ },
+ "ua-parser-js": {
+ "version": "0.7.37",
+ "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz",
+ "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==",
+ "dev": true
+ },
+ "unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "requires": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ }
+ },
+ "undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true
+ },
+ "update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "dev": true,
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true
+ },
+ "void-elements": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
+ "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==",
+ "dev": true
+ },
+ "watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dev": true,
+ "requires": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ }
+ },
+ "webpack": {
+ "version": "5.56.0",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.56.0.tgz",
+ "integrity": "sha512-pJ7esw2AGkpZL0jqsEAKnDEfRZdrc9NVjAWA+d1mFkwj68ng9VQ6+Wnrl+kS5dlDHvrat5ASK5vd7wp6I7f53Q==",
+ "dev": true,
+ "requires": {
+ "@types/eslint-scope": "^3.7.0",
+ "@types/estree": "^0.0.50",
+ "@webassemblyjs/ast": "1.11.1",
+ "@webassemblyjs/wasm-edit": "1.11.1",
+ "@webassemblyjs/wasm-parser": "1.11.1",
+ "acorn": "^8.4.1",
+ "acorn-import-assertions": "^1.7.6",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.8.3",
+ "es-module-lexer": "^0.9.0",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.4",
+ "json-parse-better-errors": "^1.0.2",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.1.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.1.3",
+ "watchpack": "^2.2.0",
+ "webpack-sources": "^3.2.0"
+ },
+ "dependencies": {
+ "schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ }
+ }
+ }
+ },
+ "webpack-cli": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz",
+ "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==",
+ "dev": true,
+ "requires": {
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^1.1.0",
+ "@webpack-cli/info": "^1.4.0",
+ "@webpack-cli/serve": "^1.6.0",
+ "colorette": "^2.0.14",
+ "commander": "^7.0.0",
+ "execa": "^5.0.0",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^2.2.0",
+ "rechoir": "^0.7.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true
+ },
+ "webpack-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+ "dev": true,
+ "requires": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
+ }
+ }
+ }
+ },
+ "webpack-merge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
+ "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.17.15"
+ }
+ },
+ "webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "requires": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ }
+ },
+ "which-typed-array": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
+ "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
+ "dev": true,
+ "requires": {
+ "available-typed-arrays": "^1.0.5",
+ "call-bind": "^1.0.4",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.0"
+ }
+ },
+ "wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "ws": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz",
+ "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==",
+ "dev": true,
+ "requires": {}
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "yamljs": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz",
+ "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "glob": "^7.0.5"
+ }
+ },
+ "yamscripts": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yamscripts/-/yamscripts-0.1.0.tgz",
+ "integrity": "sha512-i4ThS58KwsK83qSrrc8YZiBqgdl3WewWcWZ4fPdrh7A+qiRU9kXMcIKzngOC7VpJ2nTsWvHG6TcK3JHXpBxACA==",
+ "dev": true,
+ "requires": {
+ "colors": "^1.3.2",
+ "fs-extra": "^7.0.0",
+ "minimist": "^1.2.0",
+ "yamljs": "^0.3.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ }
+ }
+ },
+ "yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "requires": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ }
+ },
+ "yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true
+ }
+ }
+}
diff --git a/browser/components/aboutwelcome/package.json b/browser/components/aboutwelcome/package.json
new file mode 100644
index 0000000000..210c9dc7a8
--- /dev/null
+++ b/browser/components/aboutwelcome/package.json
@@ -0,0 +1,80 @@
+{
+ "name": "about-welcome",
+ "description": "Task running for the about:welcome page",
+ "version": "1.0.0",
+ "author": "Mozilla (https://mozilla.org/)",
+ "dependencies": {
+ "@fluent/bundle": "0.17.1",
+ "@fluent/react": "0.15.0",
+ "react": "16.13.1",
+ "react-dom": "16.13.1",
+ "react-redux": "7.2.6",
+ "react-transition-group": "4.4.2",
+ "redux": "4.1.2"
+ },
+ "devDependencies": {
+ "@babel/preset-react": "7.16.0",
+ "@jsdevtools/coverage-istanbul-loader": "^3.0.5",
+ "babel-loader": "8.2.3",
+ "babel-plugin-jsm-to-esmodules": "0.6.0",
+ "chai": "4.3.4",
+ "enzyme": "3.11.0",
+ "enzyme-adapter-react-16": "1.15.6",
+ "karma": "6.3.8",
+ "karma-chai": "0.1.0",
+ "karma-coverage-istanbul-reporter": "3.0.3",
+ "karma-firefox-launcher": "2.1.2",
+ "karma-json-reporter": "1.2.1",
+ "karma-mocha": "2.0.1",
+ "karma-mocha-reporter": "2.2.5",
+ "karma-sinon": "1.0.5",
+ "karma-sourcemap-loader": "0.3.8",
+ "karma-webpack": "5.0.0",
+ "npm-run-all": "4.1.5",
+ "sass": "1.43.4",
+ "sinon": "12.0.1",
+ "stream-browserify": "3.0.0",
+ "webpack": "5.56.0",
+ "webpack-cli": "4.9.1",
+ "yamscripts": "0.1.0"
+ },
+ "engines": {
+ "firefox": ">=45.0 <=*",
+ "//": "when changing node versions, also edit .nvmrc",
+ "node": "16.19.*",
+ "npm": "8.19.3"
+ },
+ "license": "MPL-2.0",
+ "config": {
+ "mc_root": "../../..",
+ "welcome_path": "browser/components/aboutwelcome"
+ },
+ "scripts": {
+ "bundle": "npm-run-all bundle:*",
+ "bundle:welcomeBundle": "webpack-cli --config webpack.aboutwelcome.config.js",
+ "bundle:welcomeCss": "sass content-src:content --no-source-map",
+ "watchmc": "npm-run-all --parallel watchmc:*",
+ "watchmc:welcomeBundle": "npm run bundle:welcomeBundle -- --env development -w",
+ "watchmc:welcomeCss": "npm run bundle:welcomeCss -- --source-map --embed-sources --embed-source-map -w",
+ "testmc": "npm-run-all testmc:*",
+ "testmc:lint": "npm run lint",
+ "testmc:build": "npm run bundle:welcomeBundle",
+ "testmc:unit": "karma start karma.mc.config.js",
+ "tddmc": "karma start karma.mc.config.js --tdd",
+ "debugcoverage": "open logs/coverage/lcov-report/index.html",
+ "lint": "npm-run-all lint:*",
+ "lint:codespell": "(cd $npm_package_config_mc_root && ./mach lint -l codespell $npm_package_config_welcome_path)",
+ "lint:eslint": "(cd $npm_package_config_mc_root && ./mach lint -l eslint $npm_package_config_welcome_path)",
+ "lint:l10n": "(cd $npm_package_config_mc_root && ./mach lint -l l10n --warnings soft browser/locales/en-US/browser/newtab)",
+ "lint:license": "(cd $npm_package_config_mc_root && ./mach lint -l license $npm_package_config_welcome_path)",
+ "lint:stylelint": "(cd $npm_package_config_mc_root && ./mach lint -l stylelint $npm_package_config_welcome_path)",
+ "test": "npm run testmc",
+ "tdd": "npm run tddmc",
+ "fix": "npm-run-all fix:*",
+ "fix:eslint": "npm run lint:eslint -- --fix",
+ "fix:stylelint": "npm run lint:stylelint -- --fix",
+ "help": "yamscripts help",
+ "yamscripts": "yamscripts compile",
+ "__": "# NOTE: THESE SCRIPTS ARE COMPILED!!! EDIT yamscripts.yml instead!!!"
+ }
+}
diff --git a/browser/components/aboutwelcome/tests/browser/browser.toml b/browser/components/aboutwelcome/tests/browser/browser.toml
new file mode 100644
index 0000000000..22d95272e8
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser.toml
@@ -0,0 +1,57 @@
+[DEFAULT]
+support-files = [
+ "head.js",
+]
+
+prefs = [
+ "intl.multilingual.aboutWelcome.languageMismatchEnabled=false",
+]
+
+["browser_aboutwelcome_attribution.js"]
+skip-if = [
+ "os == 'linux'", # Test setup only implemented for OSX and Windows
+ "os == 'win' && msix", # These tests rely on the ability to write postSigningData, which we can't do in MSIX builds. https://bugzilla.mozilla.org/show_bug.cgi?id=1805911
+]
+
+["browser_aboutwelcome_configurable_ui.js"]
+skip-if = ["os == 'linux' && bits == 64 && debug"] # Bug 1784548
+
+["browser_aboutwelcome_fxa_signin_flow.js"]
+
+["browser_aboutwelcome_glean.js"]
+
+["browser_aboutwelcome_import.js"]
+fail-if = ["a11y_checks"] # Bug 1854514 clicked primary button may not be focusable
+
+["browser_aboutwelcome_mobile_downloads.js"]
+
+["browser_aboutwelcome_multistage_addonspicker.js"]
+
+["browser_aboutwelcome_multistage_default.js"]
+
+["browser_aboutwelcome_multistage_experimentAPI.js"]
+
+["browser_aboutwelcome_multistage_languageSwitcher.js"]
+skip-if = ["os == 'linux' && bits == 64"] # Bug 1757875
+
+["browser_aboutwelcome_multistage_mr.js"]
+skip-if = ["os == 'linux' && bits == 64 && debug"] # Bug 1812050
+
+["browser_aboutwelcome_multistage_video.js"]
+
+["browser_aboutwelcome_observer.js"]
+https_first_disabled = true
+
+["browser_aboutwelcome_rtamo.js"]
+skip-if = [
+ "os == 'linux'", # Test setup only implemented for OSX and Windows
+ "os == 'win' && msix", # These tests rely on the ability to write postSigningData, which we can't do in MSIX builds. https://bugzilla.mozilla.org/show_bug.cgi?id=1805911
+]
+
+["browser_aboutwelcome_screen_targeting.js"]
+
+["browser_aboutwelcome_upgrade_multistage_mr.js"]
+skip-if = [
+ "win11_2009 && debug",
+ "os == 'linux' && debug", # Bug 1804804 - disabled on win && linux for extremely high failure rate
+]
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_attribution.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_attribution.js
new file mode 100644
index 0000000000..f0727c9b6f
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_attribution.js
@@ -0,0 +1,214 @@
+"use strict";
+
+const { ASRouter } = ChromeUtils.importESModule(
+ "resource:///modules/asrouter/ASRouter.sys.mjs"
+);
+const { AttributionCode } = ChromeUtils.importESModule(
+ "resource:///modules/AttributionCode.sys.mjs"
+);
+const { AddonRepository } = ChromeUtils.importESModule(
+ "resource://gre/modules/addons/AddonRepository.sys.mjs"
+);
+
+const TEST_ATTRIBUTION_DATA = {
+ source: "addons.mozilla.org",
+ medium: "referral",
+ campaign: "non-fx-button",
+ // with the sinon override, the id doesn't matter
+ content: "rta:whatever",
+};
+
+const TEST_ADDON_INFO = [
+ {
+ name: "Test Add-on",
+ sourceURI: { scheme: "https", spec: "https://test.xpi" },
+ icons: { 32: "test.png", 64: "test.png" },
+ type: "extension",
+ },
+];
+
+const TEST_UA_ATTRIBUTION_DATA = {
+ ua: "chrome",
+};
+
+const TEST_PROTON_CONTENT = [
+ {
+ id: "AW_STEP1",
+ content: {
+ title: "Step 1",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ has_noodles: true,
+ },
+ },
+ {
+ id: "AW_STEP2",
+ content: {
+ title: "Step 2",
+ primary_button: {
+ label: {
+ string_id: "onboarding-multistage-import-primary-button-label",
+ },
+ action: {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: {},
+ },
+ },
+ has_noodles: true,
+ },
+ },
+];
+
+async function openRTAMOWithAttribution() {
+ const sandbox = sinon.createSandbox();
+ sandbox.stub(AddonRepository, "getAddonsByIDs").resolves(TEST_ADDON_INFO);
+
+ await AttributionCode.deleteFileAsync();
+ await ASRouter.forceAttribution(TEST_ATTRIBUTION_DATA);
+
+ AttributionCode._clearCache();
+ const data = await AttributionCode.getAttrDataAsync();
+
+ Assert.equal(
+ data.source,
+ "addons.mozilla.org",
+ "Attribution data should be set"
+ );
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(async () => {
+ BrowserTestUtils.removeTab(tab);
+ await ASRouter.forceAttribution("");
+ sandbox.restore();
+ });
+ return tab.linkedBrowser;
+}
+
+/**
+ * Setup and test RTAMO welcome UI
+ */
+async function test_screen_content(
+ browser,
+ experiment,
+ expectedSelectors = [],
+ unexpectedSelectors = []
+) {
+ await ContentTask.spawn(
+ browser,
+ { expectedSelectors, experiment, unexpectedSelectors },
+ async ({
+ expectedSelectors: expected,
+ experiment: experimentName,
+ unexpectedSelectors: unexpected,
+ }) => {
+ for (let selector of expected) {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector(selector),
+ `Should render ${selector} in ${experimentName}`
+ );
+ }
+ for (let selector of unexpected) {
+ ok(
+ !content.document.querySelector(selector),
+ `Should not render ${selector} in ${experimentName}`
+ );
+ }
+ }
+ );
+}
+
+add_task(async function test_rtamo_attribution() {
+ let browser = await openRTAMOWithAttribution();
+
+ await test_screen_content(
+ browser,
+ "RTAMO UI",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "h2[data-l10n-id='mr1-return-to-amo-addon-title']",
+ "div.rtamo-icon",
+ "button.primary",
+ "button.secondary",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP1",
+ "main.AW_STEP2",
+ "main.AW_STEP3",
+ "div.tiles-container.info",
+ ]
+ );
+});
+
+async function openMultiStageWithUserAgentAttribution() {
+ const sandbox = sinon.createSandbox();
+ await ASRouter.forceAttribution(TEST_UA_ATTRIBUTION_DATA);
+ const TEST_PROTON_JSON = JSON.stringify(TEST_PROTON_CONTENT);
+
+ await setAboutWelcomePref(true);
+ await pushPrefs(["browser.aboutwelcome.screens", TEST_PROTON_JSON]);
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(async () => {
+ BrowserTestUtils.removeTab(tab);
+ await ASRouter.forceAttribution("");
+ sandbox.restore();
+ });
+ return tab.linkedBrowser;
+}
+
+async function onButtonClick(browser, elementId) {
+ await ContentTask.spawn(
+ browser,
+ { elementId },
+ async ({ elementId: buttonId }) => {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector(buttonId),
+ buttonId
+ );
+ let button = content.document.querySelector(buttonId);
+ button.click();
+ }
+ );
+}
+
+add_task(async function test_ua_attribution() {
+ let browser = await openMultiStageWithUserAgentAttribution();
+
+ await test_screen_content(
+ browser,
+ "multistage step 1 with ua attribution",
+ // Expected selectors:
+ ["div.onboardingContainer", "main.AW_STEP1", "button.primary"],
+ // Unexpected selectors:
+ ["main.AW_STEP2"]
+ );
+
+ await onButtonClick(browser, "button.primary");
+
+ await test_screen_content(
+ browser,
+ "multistage step 2 with ua attribution",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "main.AW_STEP2",
+ "button.primary[data-l10n-args*='Google Chrome']",
+ ],
+ // Unexpected selectors:
+ ["main.AW_STEP1"]
+ );
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_configurable_ui.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_configurable_ui.js
new file mode 100644
index 0000000000..d53b5acc14
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_configurable_ui.js
@@ -0,0 +1,724 @@
+"use strict";
+
+const { ExperimentFakes } = ChromeUtils.importESModule(
+ "resource://testing-common/NimbusTestUtils.sys.mjs"
+);
+
+const { AboutWelcomeTelemetry } = ChromeUtils.importESModule(
+ "resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs"
+);
+
+const BASE_SCREEN_CONTENT = {
+ title: "Step 1",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+};
+
+const makeTestContent = (id, contentAdditions) => {
+ return {
+ id,
+ content: Object.assign({}, BASE_SCREEN_CONTENT, contentAdditions),
+ };
+};
+
+async function openAboutWelcome(json) {
+ if (json) {
+ await setAboutWelcomeMultiStage(json);
+ }
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+ return tab.linkedBrowser;
+}
+
+async function testAboutWelcomeLogoFor(logo = {}) {
+ info(`Testing logo: ${JSON.stringify(logo)}`);
+
+ let screens = [makeTestContent("TEST_LOGO_SELECTION_STEP", { logo })];
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: { enabled: true, screens },
+ });
+
+ let browser = await openAboutWelcome(JSON.stringify(screens));
+
+ let expected = [
+ `.brand-logo[src="${
+ logo.imageURL ?? "chrome://branding/content/about-logo.svg"
+ }"][alt=""]`,
+ ];
+ let unexpected = [];
+ (logo.alt ? unexpected : expected).push('.brand-logo[role="presentation"]');
+ (logo.width ? expected : unexpected).push(`.brand-logo[style*="width"]`);
+ (logo.height ? expected : unexpected).push(`.brand-logo[style*="height"]`);
+ (logo.marginBlock ? expected : unexpected).push(
+ `.logo-container[style*="margin-block"]`
+ );
+ (logo.marginInline ? expected : unexpected).push(
+ `.logo-container[style*="margin-inline"]`
+ );
+ (logo.darkModeImageURL ? expected : unexpected).push(
+ `.logo-container source[media="(prefers-color-scheme: dark)"]${
+ logo.darkModeImageURL ? `[srcset="${logo.darkModeImageURL}"]` : ""
+ }`
+ );
+ (logo.reducedMotionImageURL ? expected : unexpected).push(
+ `.logo-container source[media="(prefers-reduced-motion: reduce)"]${
+ logo.reducedMotionImageURL
+ ? `[srcset="${logo.reducedMotionImageURL}"]`
+ : ""
+ }`
+ );
+ (logo.darkModeReducedMotionImageURL ? expected : unexpected).push(
+ `.logo-container source[media="(prefers-color-scheme: dark) and (prefers-reduced-motion: reduce)"]${
+ logo.darkModeReducedMotionImageURL
+ ? `[srcset="${logo.darkModeReducedMotionImageURL}"]`
+ : ""
+ }`
+ );
+ await test_screen_content(
+ browser,
+ "renders screen with passed logo",
+ expected,
+ unexpected
+ );
+
+ await doExperimentCleanup();
+ browser.closeBrowser();
+}
+
+/**
+ * Test rendering a screen in about welcome with decorative noodles
+ */
+add_task(async function test_aboutwelcome_with_noodles() {
+ const TEST_NOODLE_CONTENT = makeTestContent("TEST_NOODLE_STEP", {
+ has_noodles: true,
+ });
+ const TEST_NOODLE_JSON = JSON.stringify([TEST_NOODLE_CONTENT]);
+ let browser = await openAboutWelcome(TEST_NOODLE_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with noodles",
+ // Expected selectors:
+ [
+ "main.TEST_NOODLE_STEP[pos='center']",
+ "div.noodle.purple-C",
+ "div.noodle.orange-L",
+ "div.noodle.outline-L",
+ "div.noodle.yellow-circle",
+ ]
+ );
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a customized logo
+ */
+add_task(async function test_aboutwelcome_with_customized_logo() {
+ const TEST_LOGO_URL = "chrome://branding/content/icon64.png";
+ const TEST_LOGO_HEIGHT = "50px";
+ const TEST_LOGO_CONTENT = makeTestContent("TEST_LOGO_STEP", {
+ logo: {
+ height: TEST_LOGO_HEIGHT,
+ imageURL: TEST_LOGO_URL,
+ },
+ });
+ const TEST_LOGO_JSON = JSON.stringify([TEST_LOGO_CONTENT]);
+ let browser = await openAboutWelcome(TEST_LOGO_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with customized logo",
+ // Expected selectors:
+ ["main.TEST_LOGO_STEP[pos='center']", `.brand-logo[src="${TEST_LOGO_URL}"]`]
+ );
+
+ // Ensure logo has custom height
+ await test_element_styles(
+ browser,
+ ".brand-logo",
+ // Expected styles:
+ {
+ // Override default text-link styles
+ height: TEST_LOGO_HEIGHT,
+ }
+ );
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with empty logo used for padding
+ */
+add_task(async function test_aboutwelcome_with_empty_logo_spacing() {
+ const TEST_LOGO_HEIGHT = "50px";
+ const TEST_LOGO_CONTENT = makeTestContent("TEST_LOGO_STEP", {
+ logo: {
+ height: TEST_LOGO_HEIGHT,
+ imageURL: "none",
+ },
+ });
+ const TEST_LOGO_JSON = JSON.stringify([TEST_LOGO_CONTENT]);
+ let browser = await openAboutWelcome(TEST_LOGO_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with empty logo element",
+ // Expected selectors:
+ ["main.TEST_LOGO_STEP[pos='center']", ".brand-logo[src='none']"]
+ );
+
+ // Ensure logo has custom height
+ await test_element_styles(
+ browser,
+ ".brand-logo",
+ // Expected styles:
+ {
+ // Override default text-link styles
+ height: TEST_LOGO_HEIGHT,
+ }
+ );
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a "Title Logo"
+ */
+add_task(async function test_title_logo() {
+ const TEST_TITLE_LOGO_URL = "chrome://branding/content/icon64.png";
+ const TEST_CONTENT = makeTestContent("TITLE_LOGO", {
+ title_logo: {
+ imageURL: TEST_TITLE_LOGO_URL,
+ },
+ });
+ const TEST_JSON = JSON.stringify([TEST_CONTENT]);
+ let browser = await openAboutWelcome(TEST_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with title_logo",
+ // Expected selectors:
+ [".inline-icon-container"]
+ );
+
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a title with custom styles.
+ */
+add_task(async function test_aboutwelcome_with_title_styles() {
+ const TEST_TITLE_STYLE_CONTENT = makeTestContent("TEST_TITLE_STYLE_STEP", {
+ title: {
+ fontSize: "36px",
+ fontWeight: 276,
+ letterSpacing: 0,
+ raw: "test",
+ },
+ title_style: "fancy shine",
+ });
+
+ const TEST_TITLE_STYLE_JSON = JSON.stringify([TEST_TITLE_STYLE_CONTENT]);
+ let browser = await openAboutWelcome(TEST_TITLE_STYLE_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with customized title style",
+ // Expected selectors:
+ [`div.welcome-text.fancy.shine`]
+ );
+
+ await test_element_styles(
+ browser,
+ "#mainContentHeader",
+ // Expected styles:
+ {
+ "font-weight": "276",
+ "font-size": "36px",
+ animation: "50s linear 0s infinite normal none running shine",
+ "letter-spacing": "normal",
+ }
+ );
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with an image for the dialog window's background
+ */
+add_task(async function test_aboutwelcome_with_background() {
+ const BACKGROUND_URL =
+ "chrome://activity-stream/content/data/content/assets/confetti.svg";
+ const TEST_BACKGROUND_CONTENT = makeTestContent("TEST_BACKGROUND_STEP", {
+ background: `url(${BACKGROUND_URL}) no-repeat center/cover`,
+ });
+
+ const TEST_BACKGROUND_JSON = JSON.stringify([TEST_BACKGROUND_CONTENT]);
+ let browser = await openAboutWelcome(TEST_BACKGROUND_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with dialog background image",
+ // Expected selectors:
+ [`div.main-content[style*='${BACKGROUND_URL}'`]
+ );
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with defined dimensions
+ */
+add_task(async function test_aboutwelcome_with_dimensions() {
+ const TEST_DIMENSIONS_CONTENT = makeTestContent("TEST_DIMENSIONS_STEP", {
+ width: "100px",
+ position: "center",
+ });
+
+ const TEST_DIMENSIONS_JSON = JSON.stringify([TEST_DIMENSIONS_CONTENT]);
+ let browser = await openAboutWelcome(TEST_DIMENSIONS_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with defined dimensions",
+ // Expected selectors:
+ [`div.main-content[style*='width: 100px;']`]
+ );
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a dismiss button
+ */
+add_task(async function test_aboutwelcome_dismiss_button() {
+ let browser = await openAboutWelcome(
+ JSON.stringify(
+ // Use 2 screens to test that the message is dismissed, not navigated
+ [1, 2].map(i =>
+ makeTestContent(`TEST_DISMISS_STEP_${i}`, {
+ dismiss_button: { action: { dismiss: true }, size: "small" },
+ })
+ )
+ )
+ );
+
+ await test_screen_content(
+ browser,
+ "renders screen with dismiss button",
+ // Expected selectors:
+ ['div.section-main button.dismiss-button[button-size="small"]']
+ );
+
+ // Click dismiss button
+ await onButtonClick(browser, "button.dismiss-button");
+
+ // Wait for about:home to load
+ await BrowserTestUtils.browserLoaded(browser, false, "about:home");
+ is(browser.currentURI.spec, "about:home", "about:home loaded");
+
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with the "split" position
+ */
+add_task(async function test_aboutwelcome_split_position() {
+ const TEST_SPLIT_STEP = makeTestContent("TEST_SPLIT_STEP", {
+ position: "split",
+ hero_text: "hero test",
+ });
+
+ const TEST_SPLIT_JSON = JSON.stringify([TEST_SPLIT_STEP]);
+ let browser = await openAboutWelcome(TEST_SPLIT_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen secondary section containing hero text",
+ // Expected selectors:
+ [`main.screen[pos="split"]`, `.section-secondary`, `.message-text h1`]
+ );
+
+ // Ensure secondary section has split template styling
+ await test_element_styles(
+ browser,
+ "main.screen .section-secondary",
+ // Expected styles:
+ {
+ display: "flex",
+ margin: "auto 0px auto auto",
+ }
+ );
+
+ // Ensure secondary action has button styling
+ await test_element_styles(
+ browser,
+ ".action-buttons .secondary-cta .secondary",
+ // Expected styles:
+ {
+ // Override default text-link styles
+ "background-color": "color(srgb 0.0823529 0.0784314 0.101961 / 0.07)",
+ color: "rgb(21, 20, 26)",
+ }
+ );
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a URL value and default color for backdrop
+ */
+add_task(async function test_aboutwelcome_with_url_backdrop() {
+ const TEST_BACKDROP_URL = `url("chrome://activity-stream/content/data/content/assets/confetti.svg")`;
+ const TEST_BACKDROP_VALUE = `#212121 ${TEST_BACKDROP_URL} center/cover no-repeat fixed`;
+ const TEST_URL_BACKDROP_CONTENT = makeTestContent("TEST_URL_BACKDROP_STEP");
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ enabled: true,
+ backdrop: TEST_BACKDROP_VALUE,
+ screens: [TEST_URL_BACKDROP_CONTENT],
+ },
+ });
+ let browser = await openAboutWelcome();
+
+ await test_screen_content(
+ browser,
+ "renders screen with background image",
+ // Expected selectors:
+ [`div.outer-wrapper.onboardingContainer[style*='${TEST_BACKDROP_URL}']`]
+ );
+ await doExperimentCleanup();
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a color name for backdrop
+ */
+add_task(async function test_aboutwelcome_with_color_backdrop() {
+ const TEST_BACKDROP_COLOR = "transparent";
+ const TEST_BACKDROP_COLOR_CONTENT = makeTestContent(
+ "TEST_COLOR_NAME_BACKDROP_STEP"
+ );
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ enabled: true,
+ backdrop: TEST_BACKDROP_COLOR,
+ screens: [TEST_BACKDROP_COLOR_CONTENT],
+ },
+ });
+ let browser = await openAboutWelcome();
+
+ await test_screen_content(
+ browser,
+ "renders screen with background color",
+ // Expected selectors:
+ [`div.outer-wrapper.onboardingContainer[style*='${TEST_BACKDROP_COLOR}']`]
+ );
+ await doExperimentCleanup();
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a text color override
+ */
+add_task(async function test_aboutwelcome_with_text_color_override() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ // Override the system color scheme to dark
+ ["ui.systemUsesDarkTheme", 1],
+ ],
+ });
+
+ let screens = [];
+ // we need at least two screens to test the step indicator
+ for (let i = 0; i < 2; i++) {
+ screens.push(
+ makeTestContent("TEST_TEXT_COLOR_OVERRIDE_STEP", {
+ text_color: "dark",
+ background: "white",
+ })
+ );
+ }
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ enabled: true,
+ screens,
+ },
+ });
+ let browser = await openAboutWelcome(JSON.stringify(screens));
+
+ await test_screen_content(
+ browser,
+ "renders screen with dark text",
+ // Expected selectors:
+ [`main.screen.dark-text`, `.indicator.current`, `.indicator:not(.current)`],
+ // Unexpected selectors:
+ [`main.screen.light-text`]
+ );
+
+ // Ensure title inherits light text color
+ await test_element_styles(
+ browser,
+ "#mainContentHeader",
+ // Expected styles:
+ {
+ color: "rgb(21, 20, 26)",
+ }
+ );
+
+ // Ensure next step indicator inherits light color
+ await test_element_styles(
+ browser,
+ ".indicator:not(.current)",
+ // Expected styles:
+ {
+ color: "rgb(251, 251, 254)",
+ }
+ );
+
+ await doExperimentCleanup();
+ await SpecialPowers.popPrefEnv();
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with a "progress bar" style step indicator
+ */
+add_task(async function test_aboutwelcome_with_progress_bar() {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["ui.systemUsesDarkTheme", 0],
+ ["ui.prefersReducedMotion", 0],
+ ],
+ });
+ let screens = [];
+ // we need at least three screens to test the progress bar styling
+ for (let i = 0; i < 3; i++) {
+ screens.push(
+ makeTestContent(`TEST_MR_PROGRESS_BAR_${i + 1}`, {
+ position: "split",
+ progress_bar: true,
+ primary_button: {
+ label: "next",
+ action: {
+ navigate: true,
+ },
+ },
+ })
+ );
+ }
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ enabled: true,
+ screens,
+ },
+ });
+ let browser = await openAboutWelcome(JSON.stringify(screens));
+
+ await SpecialPowers.spawn(browser, [], async () => {
+ const progressBar = await ContentTaskUtils.waitForCondition(() =>
+ content.document.querySelector(".progress-bar")
+ );
+ const indicator = await ContentTaskUtils.waitForCondition(() =>
+ content.document.querySelector(".indicator")
+ );
+ // Progress bar should have a gray background.
+ is(
+ content.window.getComputedStyle(progressBar)["background-color"],
+ "color(srgb 0.0823529 0.0784314 0.101961 / 0.25)",
+ "Correct progress bar background"
+ );
+
+ const indicatorStyles = content.window.getComputedStyle(indicator);
+ for (let [key, val] of Object.entries({
+ // The filled "completed" element should have
+ // `background-color: var(--in-content-primary-button-background);`
+ "background-color": "rgb(0, 97, 224)",
+ // Base progress bar step styles.
+ height: "6px",
+ "margin-inline": "-1px",
+ "padding-block": "0px",
+ })) {
+ is(indicatorStyles[key], val, `Correct indicator ${key} style`);
+ }
+ const indicatorX = indicator.getBoundingClientRect().x;
+ content.document.querySelector("button.primary").click();
+ await ContentTaskUtils.waitForCondition(
+ () =>
+ content.document.querySelector(".indicator")?.getBoundingClientRect()
+ .x > indicatorX,
+ "Indicator should have grown"
+ );
+ });
+
+ await doExperimentCleanup();
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a message with session history updates disabled
+ */
+add_task(async function test_aboutwelcome_history_updates_disabled() {
+ let screens = [];
+ // we need at least two screens to test the history state
+ for (let i = 1; i < 3; i++) {
+ screens.push(makeTestContent(`TEST_PUSH_STATE_STEP_${i}`));
+ }
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ enabled: true,
+ disableHistoryUpdates: true,
+ screens,
+ },
+ });
+ let browser = await openAboutWelcome(JSON.stringify(screens));
+
+ let startHistoryLength = await SpecialPowers.spawn(browser, [], () => {
+ return content.window.history.length;
+ });
+ // Advance to second screen
+ await onButtonClick(browser, "button.primary");
+ let endHistoryLength = await SpecialPowers.spawn(browser, [], async () => {
+ // Ensure next screen has rendered
+ await ContentTaskUtils.waitForCondition(() =>
+ content.document.querySelector(".TEST_PUSH_STATE_STEP_2")
+ );
+ return content.window.history.length;
+ });
+
+ Assert.strictEqual(
+ startHistoryLength,
+ endHistoryLength,
+ "No entries added to the session's history stack with history updates disabled"
+ );
+
+ await doExperimentCleanup();
+ browser.closeBrowser();
+});
+
+/**
+ * Test rendering a screen with different logos depending on reduced motion and
+ * color scheme preferences
+ */
+add_task(async function test_aboutwelcome_logo_selection() {
+ // Test a screen config that includes every logo parameter
+ await testAboutWelcomeLogoFor({
+ imageURL: "chrome://branding/content/icon16.png",
+ darkModeImageURL: "chrome://branding/content/icon32.png",
+ reducedMotionImageURL: "chrome://branding/content/icon64.png",
+ darkModeReducedMotionImageURL: "chrome://branding/content/icon128.png",
+ alt: "TEST_LOGO_SELECTION_ALT",
+ width: "16px",
+ height: "16px",
+ marginBlock: "0px",
+ marginInline: "0px",
+ });
+ // Test a screen config with no animated/static logos
+ await testAboutWelcomeLogoFor({
+ imageURL: "chrome://branding/content/icon16.png",
+ darkModeImageURL: "chrome://branding/content/icon32.png",
+ });
+ // Test a screen config with no dark mode logos
+ await testAboutWelcomeLogoFor({
+ imageURL: "chrome://branding/content/icon16.png",
+ reducedMotionImageURL: "chrome://branding/content/icon64.png",
+ });
+ // Test a screen config that includes only the default logo
+ await testAboutWelcomeLogoFor({
+ imageURL: "chrome://branding/content/icon16.png",
+ });
+ // Test a screen config with no logos
+ await testAboutWelcomeLogoFor();
+});
+
+/**
+ * Test rendering a message that starts on a specific screen
+ */
+add_task(async function test_aboutwelcome_start_screen_configured() {
+ let startScreen = 1;
+ let screens = [];
+ // we need at least two screens to test
+ for (let i = 1; i < 3; i++) {
+ screens.push(makeTestContent(`TEST_START_STEP_${i}`));
+ }
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ enabled: true,
+ startScreen,
+ screens,
+ },
+ });
+
+ let sandbox = sinon.createSandbox();
+ let spy = sandbox.spy(AboutWelcomeTelemetry.prototype, "sendTelemetry");
+
+ let browser = await openAboutWelcome(JSON.stringify(screens));
+
+ let secondScreenShown = await SpecialPowers.spawn(browser, [], async () => {
+ // Ensure screen has rendered
+ await ContentTaskUtils.waitForCondition(() =>
+ content.document.querySelector(".TEST_START_STEP_2")
+ );
+ return true;
+ });
+
+ ok(
+ secondScreenShown,
+ `Starts on second screen when configured with startScreen index equal to ${startScreen}`
+ );
+ // Wait for screen elements to render before checking impression pings
+ await test_screen_content(
+ browser,
+ "renders second screen elements",
+ // Expected selectors:
+ [`main.screen`, "div.secondary-cta"]
+ );
+
+ let expectedTelemetry = sinon.match({
+ event: "IMPRESSION",
+ message_id: `MR_WELCOME_DEFAULT_${startScreen}_TEST_START_STEP_${
+ startScreen + 1
+ }_${screens.map(({ id }) => id?.split("_")[1]?.[0]).join("")}`,
+ });
+ if (spy.calledWith(expectedTelemetry)) {
+ ok(
+ true,
+ "Impression events have the correct message id with start screen configured"
+ );
+ } else if (spy.called) {
+ ok(
+ false,
+ `Wrong telemetry sent: ${JSON.stringify(
+ spy.getCalls().map(c => c.args[0]),
+ null,
+ 2
+ )}`
+ );
+ } else {
+ ok(false, "No telemetry sent");
+ }
+
+ await doExperimentCleanup();
+ browser.closeBrowser();
+ sandbox.restore();
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_fxa_signin_flow.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_fxa_signin_flow.js
new file mode 100644
index 0000000000..9de9acb7b3
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_fxa_signin_flow.js
@@ -0,0 +1,303 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const { UIState } = ChromeUtils.importESModule(
+ "resource://services-sync/UIState.sys.mjs"
+);
+
+const TEST_ROOT = "https://example.com/";
+
+add_setup(async () => {
+ await SpecialPowers.pushPrefEnv({
+ set: [["identity.fxaccounts.remote.root", TEST_ROOT]],
+ });
+});
+
+/**
+ * Tests that the FXA_SIGNIN_FLOW special action resolves to `true` and
+ * closes the FxA sign-in tab if sign-in is successful.
+ */
+add_task(async function test_fxa_sign_success() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ });
+ });
+ let fxaTab = await fxaTabPromise;
+ let fxaTabClosing = BrowserTestUtils.waitForTabClosing(fxaTab);
+
+ // We'll fake-out the UIState being in the STATUS_SIGNED_IN status
+ // and not test the actual FxA sign-in mechanism.
+ sandbox.stub(UIState, "get").returns({
+ status: UIState.STATUS_SIGNED_IN,
+ syncEnabled: true,
+ email: "email@example.com",
+ });
+
+ Services.obs.notifyObservers(null, UIState.ON_UPDATE);
+
+ await fxaTabClosing;
+ Assert.ok(true, "FxA tab automatically closed.");
+ let result = await resultPromise;
+ Assert.ok(result, "FXA_SIGNIN_FLOW action's result should be true");
+ });
+
+ sandbox.restore();
+});
+
+/**
+ * Tests that the FXA_SIGNIN_FLOW action's data.autoClose parameter can
+ * disable the autoclose behavior.
+ */
+add_task(async function test_fxa_sign_success_no_autoclose() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ data: { autoClose: false },
+ });
+ });
+ let fxaTab = await fxaTabPromise;
+
+ // We'll fake-out the UIState being in the STATUS_SIGNED_IN status
+ // and not test the actual FxA sign-in mechanism.
+ sandbox.stub(UIState, "get").returns({
+ status: UIState.STATUS_SIGNED_IN,
+ syncEnabled: true,
+ email: "email@example.com",
+ });
+
+ Services.obs.notifyObservers(null, UIState.ON_UPDATE);
+
+ let result = await resultPromise;
+ Assert.ok(result, "FXA_SIGNIN_FLOW should have resolved to true");
+ Assert.ok(!fxaTab.closing, "FxA tab was not asked to close.");
+ BrowserTestUtils.removeTab(fxaTab);
+ });
+
+ sandbox.restore();
+});
+
+/**
+ * Tests that the FXA_SIGNIN_FLOW action resolves to `false` if the tab
+ * closes before sign-in completes.
+ */
+add_task(async function test_fxa_signin_aborted() {
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ });
+ });
+ let fxaTab = await fxaTabPromise;
+ Assert.ok(!fxaTab.closing, "FxA tab was not asked to close yet.");
+
+ BrowserTestUtils.removeTab(fxaTab);
+ let result = await resultPromise;
+ Assert.ok(!result, "FXA_SIGNIN_FLOW action's result should be false");
+ });
+});
+
+/**
+ * Tests that the FXA_SIGNIN_FLOW action can open a separate window, if need
+ * be, and that if that window closes, the flow is considered aborted.
+ */
+add_task(async function test_fxa_signin_window_aborted() {
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaWindowPromise = BrowserTestUtils.waitForNewWindow();
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ data: {
+ where: "window",
+ },
+ });
+ });
+ let fxaWindow = await fxaWindowPromise;
+ Assert.ok(!fxaWindow.closed, "FxA window was not asked to close yet.");
+
+ await BrowserTestUtils.closeWindow(fxaWindow);
+ let result = await resultPromise;
+ Assert.ok(!result, "FXA_SIGNIN_FLOW action's result should be false");
+ });
+});
+
+/**
+ * Tests that the FXA_SIGNIN_FLOW action can open a separate window, if need
+ * be, and that if sign-in completes, that new window will close automatically.
+ */
+add_task(async function test_fxa_signin_window_success() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaWindowPromise = BrowserTestUtils.waitForNewWindow();
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ data: {
+ where: "window",
+ },
+ });
+ });
+ let fxaWindow = await fxaWindowPromise;
+ Assert.ok(!fxaWindow.closed, "FxA window was not asked to close yet.");
+
+ let windowClosed = BrowserTestUtils.windowClosed(fxaWindow);
+
+ // We'll fake-out the UIState being in the STATUS_SIGNED_IN status
+ // and not test the actual FxA sign-in mechanism.
+ sandbox.stub(UIState, "get").returns({
+ status: UIState.STATUS_SIGNED_IN,
+ syncEnabled: true,
+ email: "email@example.com",
+ });
+
+ Services.obs.notifyObservers(null, UIState.ON_UPDATE);
+
+ let result = await resultPromise;
+ Assert.ok(result, "FXA_SIGNIN_FLOW action's result should be true");
+
+ await windowClosed;
+ Assert.ok(fxaWindow.closed, "Sign-in window was automatically closed.");
+ });
+
+ sandbox.restore();
+});
+
+/**
+ * Tests that the FXA_SIGNIN_FLOW action can open a separate window, if need
+ * be, and that if a new tab is opened in that window and the sign-in tab
+ * is closed:
+ *
+ * 1. The new window isn't closed
+ * 2. The sign-in is considered aborted.
+ */
+add_task(async function test_fxa_signin_window_multiple_tabs_aborted() {
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaWindowPromise = BrowserTestUtils.waitForNewWindow();
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ data: {
+ where: "window",
+ },
+ });
+ });
+ let fxaWindow = await fxaWindowPromise;
+ Assert.ok(!fxaWindow.closed, "FxA window was not asked to close yet.");
+ let fxaTab = fxaWindow.gBrowser.selectedTab;
+ await BrowserTestUtils.openNewForegroundTab(
+ fxaWindow.gBrowser,
+ "about:blank"
+ );
+ BrowserTestUtils.removeTab(fxaTab);
+
+ let result = await resultPromise;
+ Assert.ok(!result, "FXA_SIGNIN_FLOW action's result should be false");
+ Assert.ok(!fxaWindow.closed, "FxA window was not asked to close.");
+ await BrowserTestUtils.closeWindow(fxaWindow);
+ });
+});
+
+/**
+ * Tests that the FXA_SIGNIN_FLOW action can open a separate window, if need
+ * be, and that if a new tab is opened in that window but then sign-in
+ * completes
+ *
+ * 1. The new window isn't closed, but the sign-in tab is.
+ * 2. The sign-in is considered a success.
+ */
+add_task(async function test_fxa_signin_window_multiple_tabs_success() {
+ let sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaWindowPromise = BrowserTestUtils.waitForNewWindow();
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ data: {
+ where: "window",
+ },
+ });
+ });
+ let fxaWindow = await fxaWindowPromise;
+ Assert.ok(!fxaWindow.closed, "FxA window was not asked to close yet.");
+ let fxaTab = fxaWindow.gBrowser.selectedTab;
+
+ // This will open an about:blank tab in the background.
+ await BrowserTestUtils.addTab(fxaWindow.gBrowser);
+ let fxaTabClosed = BrowserTestUtils.waitForTabClosing(fxaTab);
+
+ // We'll fake-out the UIState being in the STATUS_SIGNED_IN status
+ // and not test the actual FxA sign-in mechanism.
+ sandbox.stub(UIState, "get").returns({
+ status: UIState.STATUS_SIGNED_IN,
+ syncEnabled: true,
+ email: "email@example.com",
+ });
+
+ Services.obs.notifyObservers(null, UIState.ON_UPDATE);
+
+ let result = await resultPromise;
+ Assert.ok(result, "FXA_SIGNIN_FLOW action's result should be true");
+ await fxaTabClosed;
+
+ Assert.ok(!fxaWindow.closed, "FxA window was not asked to close.");
+ await BrowserTestUtils.closeWindow(fxaWindow);
+ });
+
+ sandbox.restore();
+});
+
+/**
+ * Tests that we can pass an entrypoint and UTM parameters to the FxA sign-in
+ * page.
+ */
+add_task(async function test_fxa_signin_flow_entrypoint_utm_params() {
+ await BrowserTestUtils.withNewTab("about:welcome", async browser => {
+ let fxaTabPromise = BrowserTestUtils.waitForNewTab(gBrowser);
+ let resultPromise = SpecialPowers.spawn(browser, [], async () => {
+ return content.wrappedJSObject.AWSendToParent("SPECIAL_ACTION", {
+ type: "FXA_SIGNIN_FLOW",
+ data: {
+ entrypoint: "test-entrypoint",
+ extraParams: {
+ utm_test1: "utm_test1",
+ utm_test2: "utm_test2",
+ },
+ },
+ });
+ });
+ let fxaTab = await fxaTabPromise;
+
+ let uriParams = new URLSearchParams(fxaTab.linkedBrowser.currentURI.query);
+ Assert.equal(uriParams.get("entrypoint"), "test-entrypoint");
+ Assert.equal(uriParams.get("utm_test1"), "utm_test1");
+ Assert.equal(uriParams.get("utm_test2"), "utm_test2");
+
+ BrowserTestUtils.removeTab(fxaTab);
+ await resultPromise;
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_glean.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_glean.js
new file mode 100644
index 0000000000..d08a3c834c
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_glean.js
@@ -0,0 +1,162 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Tests for the Glean version of onboarding telemetry.
+ */
+
+const { AboutWelcomeTelemetry } = ChromeUtils.importESModule(
+ "resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs"
+);
+
+const TEST_DEFAULT_CONTENT = [
+ {
+ id: "AW_STEP1",
+
+ content: {
+ position: "split",
+ title: "Step 1",
+ page: "page 1",
+ source: "test",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ secondary_button_top: {
+ label: "link top",
+ action: {
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ data: { entrypoint: "test" },
+ },
+ },
+ },
+ },
+ {
+ id: "AW_STEP2",
+ content: {
+ position: "center",
+ title: "Step 2",
+ page: "page 1",
+ source: "test",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ has_noodles: true,
+ },
+ },
+];
+
+const TEST_DEFAULT_JSON = JSON.stringify(TEST_DEFAULT_CONTENT);
+
+async function openAboutWelcome() {
+ await setAboutWelcomePref(true);
+ await setAboutWelcomeMultiStage(TEST_DEFAULT_JSON);
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+ return tab.linkedBrowser;
+}
+
+add_task(async function test_welcome_telemetry() {
+ // Have to turn on AS telemetry for anything to be recorded.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.newtabpage.activity-stream.telemetry", true]],
+ });
+ registerCleanupFunction(async () => {
+ await SpecialPowers.popPrefEnv();
+ });
+
+ Services.fog.testResetFOG();
+ // Let's check that there is nothing in the impression event.
+ // This is useful in mochitests because glean inits fairly late in startup.
+ // We want to make sure we are fully initialized during testing so that
+ // when we call testGetValue() we get predictable behavior.
+ Assert.equal(undefined, Glean.messagingSystem.messageId.testGetValue());
+
+ // Setup testBeforeNextSubmit. We do this first, progress onboarding, submit
+ // and then check submission. We put the asserts inside testBeforeNextSubmit
+ // because metric lifetimes are 'ping' and are cleared after submission.
+ // See: https://firefox-source-docs.mozilla.org/toolkit/components/glean/user/instrumentation_tests.html#xpcshell-tests
+ let pingSubmitted = false;
+ GleanPings.messagingSystem.testBeforeNextSubmit(() => {
+ pingSubmitted = true;
+
+ const message = Glean.messagingSystem.messageId.testGetValue();
+ // Because of the asynchronous nature of receiving messages, we cannot
+ // guarantee that we will get the same message first. Instead we check
+ // that the one we get is a valid example of that type.
+ Assert.ok(
+ message.startsWith("MR_WELCOME_DEFAULT"),
+ "Ping is of an expected type"
+ );
+ Assert.equal(
+ Glean.messagingSystem.unknownKeyCount.testGetValue(),
+ undefined
+ );
+ });
+
+ let browser = await openAboutWelcome();
+ // `openAboutWelcome` isn't synchronous wrt the onboarding flow impressing.
+ await TestUtils.waitForCondition(
+ () => pingSubmitted,
+ "Ping was submitted, callback was called."
+ );
+
+ // Let's reset and assert some values in the next button click.
+ pingSubmitted = false;
+ GleanPings.messagingSystem.testBeforeNextSubmit(() => {
+ pingSubmitted = true;
+
+ // Sometimes the impression for MR_WELCOME_DEFAULT_0_AW_STEP1_SS reaches
+ // the parent process before the button click does.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=1834620
+ if (Glean.messagingSystem.event.testGetValue() === "IMPRESSION") {
+ Assert.equal(
+ Glean.messagingSystem.eventPage.testGetValue(),
+ "about:welcome"
+ );
+ const message = Glean.messagingSystem.messageId.testGetValue();
+ Assert.ok(
+ message.startsWith("MR_WELCOME_DEFAULT"),
+ "Ping is of an expected type"
+ );
+ } else {
+ // This is the common and, to my mind, correct case:
+ // the click coming before the next steps' impression.
+ Assert.equal(Glean.messagingSystem.event.testGetValue(), "CLICK_BUTTON");
+ Assert.equal(
+ Glean.messagingSystem.eventSource.testGetValue(),
+ "primary_button"
+ );
+ Assert.equal(
+ Glean.messagingSystem.messageId.testGetValue(),
+ "MR_WELCOME_DEFAULT_0_AW_STEP1"
+ );
+ }
+ Assert.equal(
+ Glean.messagingSystem.unknownKeyCount.testGetValue(),
+ undefined
+ );
+ });
+ await onButtonClick(browser, "button.primary");
+ Assert.ok(pingSubmitted, "Ping was submitted, callback was called.");
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_import.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_import.js
new file mode 100644
index 0000000000..f2ec85001a
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_import.js
@@ -0,0 +1,94 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+const IMPORT_SCREEN = {
+ id: "AW_IMPORT",
+ content: {
+ primary_button: {
+ label: "import",
+ action: {
+ navigate: true,
+ type: "SHOW_MIGRATION_WIZARD",
+ },
+ },
+ },
+};
+
+add_task(async function test_wait_import_modal() {
+ await setAboutWelcomeMultiStage(
+ JSON.stringify([IMPORT_SCREEN, { id: "AW_NEXT", content: {} }])
+ );
+ const { cleanup, browser } = await openMRAboutWelcome();
+
+ // execution
+ await test_screen_content(
+ browser,
+ "renders IMPORT screen",
+ //Expected selectors
+ ["main.AW_IMPORT", "button[value='primary_button']"],
+
+ //Unexpected selectors:
+ ["main.AW_NEXT"]
+ );
+
+ const wizardPromise = BrowserTestUtils.waitForMigrationWizard(window);
+ const prefsTab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:preferences"
+ );
+ await onButtonClick(browser, "button.primary");
+ const wizard = await wizardPromise;
+
+ await test_screen_content(
+ browser,
+ "still shows IMPORT screen",
+ //Expected selectors
+ ["main.AW_IMPORT", "button[value='primary_button']"],
+
+ //Unexpected selectors:
+ ["main.AW_NEXT"]
+ );
+
+ await BrowserTestUtils.removeTab(wizard);
+
+ await test_screen_content(
+ browser,
+ "moved to NEXT screen",
+ //Expected selectors
+ ["main.AW_NEXT"],
+
+ //Unexpected selectors:
+ []
+ );
+
+ // cleanup
+ await SpecialPowers.popPrefEnv(); // for setAboutWelcomeMultiStage
+ BrowserTestUtils.removeTab(prefsTab);
+ await cleanup();
+});
+
+add_task(async function test_wait_import_spotlight() {
+ const spotlightPromise = TestUtils.topicObserved("subdialog-loaded");
+ ChromeUtils.importESModule(
+ "resource:///modules/asrouter/Spotlight.sys.mjs"
+ ).Spotlight.showSpotlightDialog(gBrowser.selectedBrowser, {
+ content: { modal: "tab", screens: [IMPORT_SCREEN] },
+ });
+ const [win] = await spotlightPromise;
+
+ const wizardPromise = BrowserTestUtils.waitForMigrationWizard(window);
+ const prefsTab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:preferences"
+ );
+ win.document
+ .querySelector(".onboardingContainer button[value='primary_button']")
+ .click();
+ const wizard = await wizardPromise;
+
+ await BrowserTestUtils.removeTab(wizard);
+
+ // cleanup
+ BrowserTestUtils.removeTab(prefsTab);
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_mobile_downloads.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_mobile_downloads.js
new file mode 100644
index 0000000000..bb94d575fe
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_mobile_downloads.js
@@ -0,0 +1,112 @@
+"use strict";
+
+const BASE_CONTENT = {
+ id: "MOBILE_DOWNLOADS",
+ content: {
+ tiles: {
+ type: "mobile_downloads",
+ data: {
+ QR_code: {
+ image_url: "chrome://browser/content/assets/focus-qr-code.svg",
+ alt_text: "Test alt",
+ },
+ email: {
+ link_text: {
+ string_id: "spotlight-focus-promo-email-link",
+ },
+ },
+ marketplace_buttons: ["ios", "android"],
+ },
+ },
+ },
+};
+
+async function openAboutWelcome(json) {
+ if (json) {
+ await setAboutWelcomeMultiStage(json);
+ }
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+ return tab.linkedBrowser;
+}
+
+const ALT_TEXT = BASE_CONTENT.content.tiles.data.QR_code.alt_text;
+
+/**
+ * Test rendering a screen with a mobile downloads tile
+ * including QR code, email, and marketplace elements
+ */
+add_task(async function test_aboutwelcome_mobile_downloads_all() {
+ const TEST_JSON = JSON.stringify([BASE_CONTENT]);
+ let browser = await openAboutWelcome(TEST_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with all mobile download elements",
+ // Expected selectors:
+ [
+ `img.qr-code-image[alt="${ALT_TEXT}"]`,
+ "ul.mobile-download-buttons",
+ "li.android",
+ "li.ios",
+ "button.email-link",
+ ]
+ );
+});
+
+/**
+ * Test rendering a screen with a mobile downloads tile
+ * including only a QR code and marketplace elements
+ */
+add_task(
+ async function test_aboutwelcome_mobile_downloads_qr_and_marketplace() {
+ const SCREEN_CONTENT = structuredClone(BASE_CONTENT);
+ delete SCREEN_CONTENT.content.tiles.data.email;
+ const TEST_JSON = JSON.stringify([SCREEN_CONTENT]);
+ let browser = await openAboutWelcome(TEST_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with QR code and marketplace badges",
+ // Expected selectors:
+ [
+ `img.qr-code-image[alt="${ALT_TEXT}"]`,
+ "ul.mobile-download-buttons",
+ "li.android",
+ "li.ios",
+ ],
+ // Unexpected selectors:
+ [`button.email-link`]
+ );
+ }
+);
+
+/**
+ * Test rendering a screen with a mobile downloads tile
+ * including only a QR code
+ */
+add_task(async function test_aboutwelcome_mobile_downloads_qr() {
+ let SCREEN_CONTENT = structuredClone(BASE_CONTENT);
+ const QR_CODE_SRC = SCREEN_CONTENT.content.tiles.data.QR_code.image_url;
+
+ delete SCREEN_CONTENT.content.tiles.data.email;
+ delete SCREEN_CONTENT.content.tiles.data.marketplace_buttons;
+ const TEST_JSON = JSON.stringify([SCREEN_CONTENT]);
+ let browser = await openAboutWelcome(TEST_JSON);
+
+ await test_screen_content(
+ browser,
+ "renders screen with QR code",
+ // Expected selectors:
+ [`img.qr-code-image[alt="${ALT_TEXT}"][src="${QR_CODE_SRC}"]`],
+ // Unexpected selectors:
+ ["button.email-link", "li.android", "li.ios"]
+ );
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_addonspicker.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_addonspicker.js
new file mode 100644
index 0000000000..71c72f6d1d
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_addonspicker.js
@@ -0,0 +1,178 @@
+"use strict";
+
+const { AboutWelcomeParent } = ChromeUtils.importESModule(
+ "resource:///actors/AboutWelcomeParent.sys.mjs"
+);
+
+const { AboutWelcomeTelemetry } = ChromeUtils.importESModule(
+ "resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs"
+);
+const { AWScreenUtils } = ChromeUtils.importESModule(
+ "resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs"
+);
+const { InternalTestingProfileMigrator } = ChromeUtils.importESModule(
+ "resource:///modules/InternalTestingProfileMigrator.sys.mjs"
+);
+
+async function clickVisibleButton(browser, selector) {
+ // eslint-disable-next-line no-shadow
+ await ContentTask.spawn(browser, { selector }, async ({ selector }) => {
+ function getVisibleElement() {
+ for (const el of content.document.querySelectorAll(selector)) {
+ if (el.offsetParent !== null) {
+ return el;
+ }
+ }
+ return null;
+ }
+ await ContentTaskUtils.waitForCondition(
+ getVisibleElement,
+ selector,
+ 200, // interval
+ 100 // maxTries
+ );
+ getVisibleElement().click();
+ });
+}
+
+add_setup(async function () {
+ SpecialPowers.pushPrefEnv({
+ set: [
+ ["ui.prefersReducedMotion", 1],
+ ["browser.aboutwelcome.transitions", false],
+ ],
+ });
+});
+
+add_task(async function test_aboutwelcome_addonspicker() {
+ const TEST_ADDON_CONTENT = [
+ {
+ id: "AW_ADDONS_PICKER",
+ content: {
+ position: "center",
+ tiles: {
+ type: "addons-picker",
+ data: [
+ {
+ id: "addon-one-id",
+ name: "uBlock Origin",
+ install_label: "Add to Firefox",
+ icon: "",
+ type: "extension",
+ description: "An efficient wide-spectrum content blocker.",
+ source_id: "ADD_EXTENSION_BUTTON",
+ action: {
+ type: "INSTALL_ADDON_FROM_URL",
+ data: {
+ url: "https://test.xpi",
+ telemetrySource: "aboutwelcome-addon",
+ },
+ },
+ },
+ {
+ id: "addon-two-id",
+ name: "Tree-Style Tabs",
+ install_label: "Add to Firefox",
+ icon: "",
+ type: "extension",
+ description: "Show tabs like a tree.",
+ source_id: "ADD_EXTENSION_BUTTON",
+ action: {
+ type: "INSTALL_ADDON_FROM_URL",
+ data: {
+ url: "https://test.xpi",
+ telemetrySource: "aboutwelcome-addon",
+ },
+ },
+ },
+ ],
+ },
+ progress_bar: true,
+ logo: {},
+ title: {
+ raw: "Customize your Firefox",
+ },
+ subtitle: {
+ raw: "Extensions and themes are like apps for your browser, and they let you protect passwords, download videos, find deals, block annoying ads, change how your browser looks, and much more.",
+ },
+ additional_button: {
+ label: {
+ raw: "Explore more add-ons",
+ },
+ style: "link",
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://test.xpi",
+ where: "tab",
+ },
+ },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2-onboarding-start-browsing-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ ];
+
+ await setAboutWelcomeMultiStage(JSON.stringify(TEST_ADDON_CONTENT)); // NB: calls SpecialPowers.pushPrefEnv
+ let { cleanup, browser } = await openMRAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ const messageSandbox = sinon.createSandbox();
+ registerCleanupFunction(() => {
+ messageSandbox.restore();
+ });
+ // Stub AboutWelcomeParent's Content Message Handler
+ const messageStub = messageSandbox
+ .stub(aboutWelcomeActor, "onContentMessage")
+ .withArgs("AWPage:SPECIAL_ACTION");
+
+ // execution
+ await test_screen_content(
+ browser,
+ "renders the addons-picker screen and tiles",
+ //Expected selectors
+ [
+ "main.AW_ADDONS_PICKER",
+ "div.addons-picker-container",
+ "button[value='secondary_button']",
+ "button[value='additional_button']",
+ ],
+
+ //Unexpected selectors:
+ [
+ `main.screen[pos="split"]`,
+ "main.AW_SET_DEFAULT",
+ "button[value='primary_button']",
+ ]
+ );
+
+ await clickVisibleButton(browser, ".addon-container button[value='0']"); //click the first install button
+
+ const installExtensionCall = messageStub.getCall(0);
+ info(
+ `Call #${installExtensionCall}: ${
+ installExtensionCall.args[0]
+ } ${JSON.stringify(installExtensionCall.args[1])}`
+ );
+ Assert.equal(
+ installExtensionCall.args[0],
+ "AWPage:SPECIAL_ACTION",
+ "send special action to install add on"
+ );
+ Assert.equal(
+ installExtensionCall.args[1].type,
+ "INSTALL_ADDON_FROM_URL",
+ "Special action type is INSTALL_ADDON_FROM_URL"
+ );
+
+ // cleanup
+ await SpecialPowers.popPrefEnv(); // for setAboutWelcomeMultiStage
+ await cleanup();
+ messageSandbox.restore();
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_default.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_default.js
new file mode 100644
index 0000000000..d234ff7d06
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_default.js
@@ -0,0 +1,794 @@
+"use strict";
+const { SpecialMessageActions } = ChromeUtils.importESModule(
+ "resource://messaging-system/lib/SpecialMessageActions.sys.mjs"
+);
+
+const DID_SEE_ABOUT_WELCOME_PREF = "trailhead.firstrun.didSeeAboutWelcome";
+
+const TEST_DEFAULT_CONTENT = [
+ {
+ id: "AW_STEP1",
+ content: {
+ position: "split",
+ title: "Step 1",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ secondary_button_top: {
+ label: "link top",
+ action: {
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ data: { entrypoint: "test" },
+ },
+ },
+ info_text: {
+ raw: "Here's some sample help text",
+ },
+ },
+ },
+ {
+ id: "AW_STEP2",
+ content: {
+ position: "center",
+ title: "Step 2",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ has_noodles: true,
+ },
+ },
+ {
+ id: "AW_STEP3",
+ content: {
+ title: "Step 3",
+ tiles: {
+ type: "theme",
+ action: {
+ theme: "<event>",
+ },
+ data: [
+ {
+ theme: "automatic",
+ label: "theme-1",
+ tooltip: "test-tooltip",
+ },
+ {
+ theme: "dark",
+ label: "theme-2",
+ },
+ ],
+ },
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "Import",
+ action: {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: { source: "chrome" },
+ },
+ },
+ },
+ },
+ {
+ id: "AW_STEP4",
+ auto_advance: "primary_button",
+ content: {
+ title: "Step 4",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ },
+ },
+];
+
+const TEST_AMO_CONTENT = [
+ {
+ id: "AW_AMO_INTRODUCE",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-58px",
+ progress_bar: true,
+ logo: {},
+ title: { string_id: "amo-screen-title" },
+ subtitle: { string_id: "amo-screen-subtitle" },
+ primary_button: {
+ label: { string_id: "amo-screen-primary-cta" },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+];
+
+const TEST_DEFAULT_JSON = JSON.stringify(TEST_DEFAULT_CONTENT);
+
+async function openAboutWelcome() {
+ await setAboutWelcomePref(true);
+ await setAboutWelcomeMultiStage(TEST_DEFAULT_JSON);
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+ return tab.linkedBrowser;
+}
+
+/**
+ * Test the multistage welcome default UI
+ */
+add_task(async function test_multistage_aboutwelcome_default() {
+ const sandbox = sinon.createSandbox();
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ // Stub AboutWelcomeParent Content Message Handler
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await test_screen_content(
+ browser,
+ "multistage step 1",
+ // Expected selectors:
+ [
+ "main.AW_STEP1",
+ "div.onboardingContainer",
+ "div.section-secondary",
+ "div.secondary-cta.top",
+ "div.steps",
+ "div.indicator.current",
+ "span.info-text",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP2",
+ "main.AW_STEP3",
+ "main.dialog-initial",
+ "main.dialog-last",
+ ]
+ );
+
+ await onButtonClick(browser, "button.primary");
+
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ Assert.greaterOrEqual(callCount, 1, `${callCount} Stub was called`);
+ let clickCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ clickCall = call;
+ }
+ }
+
+ Assert.ok(
+ clickCall.args[1].message_id === "MR_WELCOME_DEFAULT_0_AW_STEP1",
+ "AboutWelcome MR message id joined with screen id"
+ );
+
+ await test_screen_content(
+ browser,
+ "multistage step 2",
+ // Expected selectors:
+ [
+ "main.AW_STEP2",
+ "div.onboardingContainer",
+ "div.section-main",
+ "div.steps",
+ "div.indicator.current",
+ "main.with-noodles",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP1",
+ "main.AW_STEP3",
+ "div.section-secondary",
+ "main.dialog-last",
+ ]
+ );
+
+ await onButtonClick(browser, "button.primary");
+
+ await test_screen_content(
+ browser,
+ "multistage step 3",
+ // Expected selectors:
+ [
+ "main.AW_STEP3",
+ "div.onboardingContainer",
+ "div.section-main",
+ "div.tiles-theme-container",
+ "div.steps",
+ "div.indicator.current",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP2",
+ "main.AW_STEP1",
+ "div.section-secondary",
+ "main.dialog-initial",
+ "main.with-noodles",
+ "main.dialog-last",
+ ]
+ );
+
+ await onButtonClick(browser, "button.primary");
+
+ await test_screen_content(
+ browser,
+ "multistage step 4",
+ // Expected selectors:
+ [
+ "main.AW_STEP4.screen-1",
+ "main.AW_STEP4.dialog-last",
+ "div.onboardingContainer",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP2",
+ "main.AW_STEP1",
+ "main.AW_STEP3",
+ "div.steps",
+ "main.dialog-initial",
+ "main.AW_STEP4.screen-0",
+ "main.AW_STEP4.screen-2",
+ "main.AW_STEP4.screen-3",
+ ]
+ );
+});
+
+/**
+ * Test navigating back/forward between screens
+ */
+add_task(async function test_Multistage_About_Welcome_navigation() {
+ let browser = await openAboutWelcome();
+
+ await onButtonClick(browser, "button.primary");
+ await TestUtils.waitForCondition(() => browser.canGoBack);
+ browser.goBack();
+
+ await test_screen_content(
+ browser,
+ "multistage step 1",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "main.AW_STEP1",
+ "div.secondary-cta",
+ "div.secondary-cta.top",
+ "button[value='secondary_button']",
+ "button[value='secondary_button_top']",
+ "span.info-text",
+ ],
+ // Unexpected selectors:
+ ["main.AW_STEP2", "main.AW_STEP3"]
+ );
+
+ await document.getElementById("forward-button").click();
+});
+
+/**
+ * Test the multistage welcome UI primary button action
+ */
+add_task(async function test_AWMultistage_Primary_Action() {
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ const sandbox = sinon.createSandbox();
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await onButtonClick(browser, "button.primary");
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ Assert.greaterOrEqual(callCount, 1, `${callCount} Stub was called`);
+
+ let clickCall;
+ let performanceCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ clickCall = call;
+ } else if (
+ call.calledWithMatch("", {
+ event_context: { mountStart: sinon.match.number },
+ })
+ ) {
+ performanceCall = call;
+ }
+ }
+
+ // For some builds, we can stub fast enough to catch the performance
+ if (performanceCall) {
+ Assert.equal(
+ performanceCall.args[0],
+ "AWPage:TELEMETRY_EVENT",
+ "send telemetry event"
+ );
+ Assert.equal(
+ performanceCall.args[1].event,
+ "IMPRESSION",
+ "performance impression event recorded in telemetry"
+ );
+ Assert.equal(
+ typeof performanceCall.args[1].event_context.domComplete,
+ "number",
+ "numeric domComplete recorded in telemetry"
+ );
+ Assert.equal(
+ typeof performanceCall.args[1].event_context.domInteractive,
+ "number",
+ "numeric domInteractive recorded in telemetry"
+ );
+ Assert.equal(
+ typeof performanceCall.args[1].event_context.mountStart,
+ "number",
+ "numeric mountStart recorded in telemetry"
+ );
+ Assert.equal(
+ performanceCall.args[1].message_id,
+ "MR_WELCOME_DEFAULT",
+ "MessageId sent in performance event telemetry"
+ );
+ }
+
+ Assert.equal(
+ clickCall.args[0],
+ "AWPage:TELEMETRY_EVENT",
+ "send telemetry event"
+ );
+ Assert.equal(
+ clickCall.args[1].event,
+ "CLICK_BUTTON",
+ "click button event recorded in telemetry"
+ );
+ Assert.equal(
+ clickCall.args[1].event_context.source,
+ "primary_button",
+ "primary button click source recorded in telemetry"
+ );
+ Assert.equal(
+ clickCall.args[1].message_id,
+ "MR_WELCOME_DEFAULT_0_AW_STEP1",
+ "MessageId sent in click event telemetry"
+ );
+});
+
+add_task(async function test_AWMultistage_Secondary_Open_URL_Action() {
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ const sandbox = sinon.createSandbox();
+ // Stub AboutWelcomeParent Content Message Handler
+ sandbox.stub(aboutWelcomeActor, "onContentMessage").resolves(null);
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await onButtonClick(browser, "button[value='secondary_button_top']");
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ Assert.greaterOrEqual(
+ callCount,
+ 2,
+ `${callCount} Stub called twice to handle FxA open URL and Telemetry`
+ );
+
+ let actionCall;
+ let eventCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("SPECIAL")) {
+ actionCall = call;
+ } else if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ eventCall = call;
+ }
+ }
+
+ Assert.equal(
+ actionCall.args[0],
+ "AWPage:SPECIAL_ACTION",
+ "Got call to handle special action"
+ );
+ Assert.equal(
+ actionCall.args[1].type,
+ "SHOW_FIREFOX_ACCOUNTS",
+ "Special action SHOW_FIREFOX_ACCOUNTS event handled"
+ );
+ Assert.equal(
+ actionCall.args[1].data.extraParams.utm_term,
+ "aboutwelcome-default-screen",
+ "UTMTerm set in FxA URL"
+ );
+ Assert.equal(
+ actionCall.args[1].data.entrypoint,
+ "test",
+ "EntryPoint set in FxA URL"
+ );
+ Assert.equal(
+ eventCall.args[0],
+ "AWPage:TELEMETRY_EVENT",
+ "Got call to handle Telemetry event"
+ );
+ Assert.equal(
+ eventCall.args[1].event,
+ "CLICK_BUTTON",
+ "click button event recorded in Telemetry"
+ );
+ Assert.equal(
+ eventCall.args[1].event_context.source,
+ "secondary_button_top",
+ "secondary_top button click source recorded in Telemetry"
+ );
+});
+
+add_task(async function test_AWMultistage_Themes() {
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+
+ const sandbox = sinon.createSandbox();
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+ await onButtonClick(browser, "button.primary");
+
+ await test_screen_content(
+ browser,
+ "multistage proton step 2",
+ // Expected selectors:
+ ["main.AW_STEP2"],
+ // Unexpected selectors:
+ ["main.AW_STEP1"]
+ );
+ await onButtonClick(browser, "button.primary");
+
+ await ContentTask.spawn(browser, "Themes", async () => {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector("label.theme"),
+ "Theme Icons"
+ );
+ let themes = content.document.querySelectorAll("label.theme");
+ Assert.equal(themes.length, 2, "Two themes displayed");
+ });
+
+ await onButtonClick(browser, "input[value=automatic]");
+
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ Assert.greaterOrEqual(callCount, 1, `${callCount} Stub was called`);
+
+ let actionCall;
+ let eventCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("SELECT_THEME")) {
+ actionCall = call;
+ } else if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ eventCall = call;
+ }
+ }
+
+ Assert.equal(
+ actionCall.args[0],
+ "AWPage:SELECT_THEME",
+ "Got call to handle select theme"
+ );
+ Assert.equal(
+ actionCall.args[1],
+ "AUTOMATIC",
+ "Theme value passed as AUTOMATIC"
+ );
+ Assert.equal(
+ eventCall.args[0],
+ "AWPage:TELEMETRY_EVENT",
+ "Got call to handle Telemetry event when theme tile clicked"
+ );
+ Assert.equal(
+ eventCall.args[1].event,
+ "CLICK_BUTTON",
+ "click button event recorded in Telemetry"
+ );
+ Assert.equal(
+ eventCall.args[1].event_context.source,
+ "automatic",
+ "automatic click source recorded in Telemetry"
+ );
+});
+
+add_task(async function test_AWMultistage_can_restore_theme() {
+ const { XPIExports } = ChromeUtils.importESModule(
+ "resource://gre/modules/addons/XPIExports.sys.mjs"
+ );
+ const sandbox = sinon.createSandbox();
+ registerCleanupFunction(() => sandbox.restore());
+
+ const fakeAddons = [];
+ class FakeAddon {
+ constructor({ id = "default-theme@mozilla.org", isActive = false } = {}) {
+ this.id = id;
+ this.isActive = isActive;
+ }
+
+ enable() {
+ for (let addon of fakeAddons) {
+ addon.isActive = false;
+ }
+ this.isActive = true;
+ }
+ }
+ fakeAddons.push(
+ new FakeAddon({ id: "fake-theme-1@mozilla.org", isActive: true }),
+ new FakeAddon({ id: "fake-theme-2@mozilla.org" })
+ );
+
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+
+ sandbox.stub(XPIExports.XPIProvider, "getAddonsByTypes").resolves(fakeAddons);
+ sandbox
+ .stub(XPIExports.XPIProvider, "getAddonByID")
+ .callsFake(id => fakeAddons.find(addon => addon.id === id));
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+
+ // Test that the active theme ID is stored in LIGHT_WEIGHT_THEMES
+ await aboutWelcomeActor.receiveMessage({
+ name: "AWPage:GET_SELECTED_THEME",
+ });
+ Assert.equal(
+ await aboutWelcomeActor.onContentMessage.lastCall.returnValue,
+ "automatic",
+ `Should return "automatic" for non-built-in theme`
+ );
+
+ await aboutWelcomeActor.receiveMessage({
+ name: "AWPage:SELECT_THEME",
+ data: "AUTOMATIC",
+ });
+ Assert.equal(
+ XPIExports.XPIProvider.getAddonByID.lastCall.args[0],
+ fakeAddons[0].id,
+ `LIGHT_WEIGHT_THEMES.AUTOMATIC should be ${fakeAddons[0].id}`
+ );
+
+ // Enable a different theme...
+ fakeAddons[1].enable();
+ // And test that AWGetSelectedTheme updates the active theme ID
+ await aboutWelcomeActor.receiveMessage({
+ name: "AWPage:GET_SELECTED_THEME",
+ });
+ await aboutWelcomeActor.receiveMessage({
+ name: "AWPage:SELECT_THEME",
+ data: "AUTOMATIC",
+ });
+ Assert.equal(
+ XPIExports.XPIProvider.getAddonByID.lastCall.args[0],
+ fakeAddons[1].id,
+ `LIGHT_WEIGHT_THEMES.AUTOMATIC should be ${fakeAddons[1].id}`
+ );
+});
+
+add_task(async function test_AWMultistage_Import() {
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+
+ // Click twice to advance to screen 3
+ await onButtonClick(browser, "button.primary");
+ await test_screen_content(
+ browser,
+ "multistage proton step 2",
+ // Expected selectors:
+ ["main.AW_STEP2"],
+ // Unexpected selectors:
+ ["main.AW_STEP1"]
+ );
+ await onButtonClick(browser, "button.primary");
+
+ const sandbox = sinon.createSandbox();
+ sandbox.stub(SpecialMessageActions, "handleAction");
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+
+ await test_screen_content(
+ browser,
+ "multistage proton step 2",
+ // Expected selectors:
+ ["main.AW_STEP3"],
+ // Unexpected selectors:
+ ["main.AW_STEP2"]
+ );
+
+ await onButtonClick(browser, "button[value='secondary_button']");
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+
+ let actionCall;
+ let eventCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("SPECIAL")) {
+ actionCall = call;
+ } else if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ eventCall = call;
+ }
+ }
+
+ Assert.equal(
+ actionCall.args[0],
+ "AWPage:SPECIAL_ACTION",
+ "Got call to handle special action"
+ );
+ Assert.equal(
+ actionCall.args[1].type,
+ "SHOW_MIGRATION_WIZARD",
+ "Special action SHOW_MIGRATION_WIZARD event handled"
+ );
+ Assert.equal(
+ actionCall.args[1].data.source,
+ "chrome",
+ "Source passed to event handler"
+ );
+ Assert.equal(
+ eventCall.args[0],
+ "AWPage:TELEMETRY_EVENT",
+ "Got call to handle Telemetry event"
+ );
+});
+
+add_task(async function test_updatesPrefOnAWOpen() {
+ Services.prefs.setBoolPref(DID_SEE_ABOUT_WELCOME_PREF, false);
+ await setAboutWelcomePref(true);
+
+ await openAboutWelcome();
+ await TestUtils.waitForCondition(
+ () =>
+ Services.prefs.getBoolPref(DID_SEE_ABOUT_WELCOME_PREF, false) === true,
+ "Updated pref to seen AW"
+ );
+ Services.prefs.clearUserPref(DID_SEE_ABOUT_WELCOME_PREF);
+});
+
+add_setup(async function () {
+ const sandbox = sinon.createSandbox();
+ // This needs to happen before any about:welcome page opens
+ sandbox.stub(FxAccounts.config, "promiseMetricsFlowURI").resolves("");
+ await setAboutWelcomeMultiStage("");
+
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+});
+
+add_task(async function test_FxA_metricsFlowURI() {
+ let browser = await openAboutWelcome();
+
+ await ContentTask.spawn(browser, {}, async () => {
+ Assert.ok(
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector("div.onboardingContainer"),
+ "Wait for about:welcome to load"
+ ),
+ "about:welcome loaded"
+ );
+ });
+
+ Assert.ok(FxAccounts.config.promiseMetricsFlowURI.called, "Stub was called");
+ Assert.equal(
+ FxAccounts.config.promiseMetricsFlowURI.firstCall.args[0],
+ "aboutwelcome",
+ "Called by AboutWelcomeParent"
+ );
+
+ SpecialPowers.popPrefEnv();
+});
+
+add_task(async function test_send_aboutwelcome_as_page_in_event_telemetry() {
+ const sandbox = sinon.createSandbox();
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+
+ await onButtonClick(browser, "button.primary");
+
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ Assert.greaterOrEqual(callCount, 1, `${callCount} Stub was called`);
+
+ let eventCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ eventCall = call;
+ }
+ }
+
+ Assert.equal(
+ eventCall.args[1].event,
+ "CLICK_BUTTON",
+ "Event telemetry sent on primary button press"
+ );
+ Assert.equal(
+ eventCall.args[1].event_context.page,
+ "about:welcome",
+ "Event context page set to 'about:welcome' in event telemetry"
+ );
+
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+});
+
+add_task(async function test_AMO_untranslated_strings() {
+ const sandbox = sinon.createSandbox();
+
+ await setAboutWelcomePref(true);
+ await setAboutWelcomeMultiStage(JSON.stringify(TEST_AMO_CONTENT));
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+
+ let browser = tab.linkedBrowser;
+
+ await test_screen_content(
+ browser,
+ "renders the AMO screen with preview strings",
+ //Expected selectors
+ [
+ "main.AW_AMO_INTRODUCE",
+ `main.screen[pos="split"]`,
+ "button.primary[data-l10n-id='amo-screen-primary-cta']",
+ "h1[data-l10n-id='amo-screen-title']",
+ "h2[data-l10n-id='amo-screen-subtitle']",
+ ],
+
+ //Unexpected selectors:
+ ["main.AW_EASY_SETUP_NEEDS_DEFAULT"]
+ );
+
+ registerCleanupFunction(async () => {
+ await popPrefs(); // for setAboutWelcomePref()
+ sandbox.restore();
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_experimentAPI.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_experimentAPI.js
new file mode 100644
index 0000000000..960d42a1f8
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_experimentAPI.js
@@ -0,0 +1,641 @@
+"use strict";
+
+const { ExperimentAPI } = ChromeUtils.importESModule(
+ "resource://nimbus/ExperimentAPI.sys.mjs"
+);
+const { ExperimentFakes } = ChromeUtils.importESModule(
+ "resource://testing-common/NimbusTestUtils.sys.mjs"
+);
+const { TelemetryTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/TelemetryTestUtils.sys.mjs"
+);
+
+const TEST_PROTON_CONTENT = [
+ {
+ id: "AW_STEP1",
+ content: {
+ title: "Step 1",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ secondary_button_top: {
+ label: "link top",
+ action: {
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ data: { entrypoint: "test" },
+ },
+ },
+ has_noodles: true,
+ },
+ },
+ {
+ id: "AW_STEP2",
+ content: {
+ title: "Step 2",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ has_noodles: true,
+ },
+ },
+ {
+ id: "AW_STEP3",
+ content: {
+ title: "Step 3",
+ tiles: {
+ type: "theme",
+ action: {
+ theme: "<event>",
+ },
+ data: [
+ {
+ theme: "automatic",
+ label: "theme-1",
+ tooltip: "test-tooltip",
+ },
+ {
+ theme: "dark",
+ label: "theme-2",
+ },
+ ],
+ },
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "Import",
+ action: {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: { source: "chrome" },
+ },
+ },
+ has_noodles: true,
+ },
+ },
+ {
+ id: "AW_STEP4",
+ content: {
+ title: "Step 4",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ has_noodles: true,
+ },
+ },
+];
+
+/**
+ * Test the zero onboarding using ExperimentAPI
+ */
+add_task(async function test_multistage_zeroOnboarding_experimentAPI() {
+ await setAboutWelcomePref(true);
+ await ExperimentAPI.ready();
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: { enabled: false },
+ });
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+
+ const browser = tab.linkedBrowser;
+
+ await test_screen_content(
+ browser,
+ "Opens new tab",
+ // Expected selectors:
+ ["div.search-wrapper", "body.activity-stream"],
+ // Unexpected selectors:
+ ["div.onboardingContainer", "main.AW_STEP1"]
+ );
+
+ await doExperimentCleanup();
+});
+
+/**
+ * Test the multistage welcome UI with test content theme as first screen
+ */
+add_task(async function test_multistage_aboutwelcome_experimentAPI() {
+ const TEST_CONTENT = [
+ {
+ id: "AW_STEP1",
+ content: {
+ title: "Step 1",
+ tiles: {
+ type: "theme",
+ action: {
+ theme: "<event>",
+ },
+ data: [
+ {
+ theme: "automatic",
+ label: "theme-1",
+ tooltip: "test-tooltip",
+ },
+ {
+ theme: "dark",
+ label: "theme-2",
+ },
+ ],
+ },
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ secondary_button_top: {
+ label: "link top",
+ action: {
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ data: { entrypoint: "test" },
+ },
+ },
+ has_noodles: true,
+ },
+ },
+ {
+ id: "AW_STEP2",
+ content: {
+ zap: true,
+ title: "Step 2 test",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "link",
+ },
+ has_noodles: true,
+ },
+ },
+ {
+ id: "AW_STEP3",
+ content: {
+ logo: {},
+ title: "Step 3",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "Import",
+ action: {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: { source: "chrome" },
+ },
+ },
+ has_noodles: true,
+ },
+ },
+ ];
+ const sandbox = sinon.createSandbox();
+ NimbusFeatures.aboutwelcome._didSendExposureEvent = false;
+ await setAboutWelcomePref(true);
+ await ExperimentAPI.ready();
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ enabled: true,
+ value: {
+ id: "my-mochitest-experiment",
+ screens: TEST_CONTENT,
+ },
+ });
+
+ sandbox.spy(ExperimentAPI, "recordExposureEvent");
+
+ Services.telemetry.clearScalars();
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ const browser = tab.linkedBrowser;
+
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ // Stub AboutWelcomeParent Content Message Handler
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ sandbox.restore();
+ });
+
+ // Test first (theme) screen.
+ await test_screen_content(
+ browser,
+ "multistage step 1",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "main.AW_STEP1",
+ "div.secondary-cta",
+ "div.secondary-cta.top",
+ "button[value='secondary_button']",
+ "button[value='secondary_button_top']",
+ "label.theme",
+ "input[type='radio']",
+ ],
+ // Unexpected selectors:
+ ["main.AW_STEP2", "main.AW_STEP3", "div.tiles-container.info"]
+ );
+
+ await onButtonClick(browser, "button.primary");
+
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ Assert.greaterOrEqual(callCount, 1, `${callCount} Stub was called`);
+ let clickCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ clickCall = call;
+ }
+ }
+
+ Assert.equal(
+ clickCall.args[0],
+ "AWPage:TELEMETRY_EVENT",
+ "send telemetry event"
+ );
+
+ Assert.equal(
+ clickCall.args[1].message_id,
+ "MY-MOCHITEST-EXPERIMENT_0_AW_STEP1",
+ "Telemetry should join id defined in feature value with screen"
+ );
+
+ await test_screen_content(
+ browser,
+ "multistage step 2",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "main.AW_STEP2",
+ "button[value='secondary_button']",
+ ],
+ // Unexpected selectors:
+ ["main.AW_STEP1", "main.AW_STEP3", "div.secondary-cta.top"]
+ );
+ await onButtonClick(browser, "button.primary");
+ await test_screen_content(
+ browser,
+ "multistage step 3",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "main.AW_STEP3",
+ "img.brand-logo",
+ "div.welcome-text",
+ ],
+ // Unexpected selectors:
+ ["main.AW_STEP1", "main.AW_STEP2"]
+ );
+ await onButtonClick(browser, "button.primary");
+ await test_screen_content(
+ browser,
+ "home",
+ // Expected selectors:
+ ["body.activity-stream"],
+ // Unexpected selectors:
+ ["div.onboardingContainer"]
+ );
+
+ Assert.equal(
+ ExperimentAPI.recordExposureEvent.callCount,
+ 1,
+ "Called only once for exposure event"
+ );
+
+ const scalars = TelemetryTestUtils.getProcessScalars("parent", true, true);
+ TelemetryTestUtils.assertKeyedScalar(
+ scalars,
+ "telemetry.event_counts",
+ "normandy#expose#nimbus_experiment",
+ 1
+ );
+
+ await doExperimentCleanup();
+});
+
+/**
+ * Test the multistage proton welcome UI using ExperimentAPI with transitions
+ */
+add_task(async function test_multistage_aboutwelcome_transitions() {
+ const sandbox = sinon.createSandbox();
+ await setAboutWelcomePref(true);
+ await ExperimentAPI.ready();
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ id: "my-mochitest-experiment",
+ enabled: true,
+ screens: TEST_PROTON_CONTENT,
+ transitions: true,
+ },
+ });
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ const browser = tab.linkedBrowser;
+
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ // Stub AboutWelcomeParent Content Message Handler
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ sandbox.restore();
+ });
+
+ await test_screen_content(
+ browser,
+ "multistage proton step 1",
+ // Expected selectors:
+ ["div.proton.transition- .screen"],
+ // Unexpected selectors:
+ ["div.proton.transition-out"]
+ );
+
+ // Double click should still only transition once.
+ await onButtonClick(browser, "button.primary");
+ await onButtonClick(browser, "button.primary");
+
+ await test_screen_content(
+ browser,
+ "multistage proton step 1 transition to 2",
+ // Expected selectors:
+ ["div.proton.transition-out .screen", "div.proton.transition- .screen-1"]
+ );
+
+ await doExperimentCleanup();
+});
+
+/**
+ * Test the multistage proton welcome UI using ExperimentAPI without transitions
+ */
+add_task(async function test_multistage_aboutwelcome_transitions_off() {
+ const sandbox = sinon.createSandbox();
+ await setAboutWelcomePref(true);
+ await ExperimentAPI.ready();
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ id: "my-mochitest-experiment",
+ enabled: true,
+ screens: TEST_PROTON_CONTENT,
+ transitions: false,
+ },
+ });
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ const browser = tab.linkedBrowser;
+
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ // Stub AboutWelcomeParent Content Message Handler
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ sandbox.restore();
+ });
+
+ await test_screen_content(
+ browser,
+ "multistage proton step 1",
+ // Expected selectors:
+ ["div.proton.transition- .screen"],
+ // Unexpected selectors:
+ ["div.proton.transition-out"]
+ );
+
+ await onButtonClick(browser, "button.primary");
+ await test_screen_content(
+ browser,
+ "multistage proton step 1 no transition to 2",
+ // Expected selectors:
+ [],
+ // Unexpected selectors:
+ ["div.proton.transition-out .screen-0"]
+ );
+
+ await doExperimentCleanup();
+});
+
+/* Test multistage custom backdrop
+ */
+add_task(async function test_multistage_aboutwelcome_backdrop() {
+ const sandbox = sinon.createSandbox();
+ const TEST_BACKDROP = "blue";
+
+ const TEST_CONTENT = [
+ {
+ id: "TEST_SCREEN",
+ content: {
+ position: "split",
+ logo: {},
+ title: "test",
+ },
+ },
+ ];
+ await setAboutWelcomePref(true);
+ await ExperimentAPI.ready();
+ await pushPrefs(["browser.aboutwelcome.backdrop", TEST_BACKDROP]);
+
+ const doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ id: "my-mochitest-experiment",
+ screens: TEST_CONTENT,
+ },
+ });
+
+ const tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ const browser = tab.linkedBrowser;
+
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ sandbox.restore();
+ });
+
+ await test_screen_content(
+ browser,
+ "multistage step 1",
+ // Expected selectors:
+ [`div.outer-wrapper.onboardingContainer[style*='${TEST_BACKDROP}']`]
+ );
+
+ await doExperimentCleanup();
+});
+
+add_task(async function test_multistage_aboutwelcome_utm_term() {
+ const sandbox = sinon.createSandbox();
+
+ const TEST_CONTENT = [
+ {
+ id: "TEST_SCREEN",
+ content: {
+ position: "split",
+ logo: {},
+ title: "test",
+ secondary_button_top: {
+ label: "test",
+ style: "link",
+ action: {
+ type: "OPEN_URL",
+ data: {
+ args: "https://www.mozilla.org/",
+ },
+ },
+ },
+ },
+ },
+ ];
+ await setAboutWelcomePref(true);
+ await ExperimentAPI.ready();
+
+ const doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ id: "my-mochitest-experiment",
+ screens: TEST_CONTENT,
+ UTMTerm: "test",
+ },
+ });
+
+ const tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ const browser = tab.linkedBrowser;
+ const aboutWelcomeActor = await getAboutWelcomeParent(browser);
+
+ sandbox.stub(aboutWelcomeActor, "onContentMessage");
+
+ await onButtonClick(browser, "button[value='secondary_button_top']");
+
+ let actionCall;
+
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ for (let i = 0; i < callCount; i++) {
+ const call = aboutWelcomeActor.onContentMessage.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("SPECIAL")) {
+ actionCall = call;
+ }
+ }
+
+ Assert.equal(
+ actionCall.args[1].data.args,
+ "https://www.mozilla.org/?utm_source=activity-stream&utm_campaign=firstrun&utm_medium=referral&utm_term=test-screen",
+ "UTMTerm set in mobile"
+ );
+
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ BrowserTestUtils.removeTab(tab);
+ });
+
+ await doExperimentCleanup();
+});
+
+add_task(async function test_multistage_aboutwelcome_newtab_urlbar_focus() {
+ const sandbox = sinon.createSandbox();
+
+ const TEST_CONTENT = [
+ {
+ id: "TEST_SCREEN",
+ content: {
+ position: "split",
+ logo: {},
+ title: "Test newtab url focus",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ ];
+ await setAboutWelcomePref(true);
+ await ExperimentAPI.ready();
+ await pushPrefs(["browser.aboutwelcome.newtabUrlBarFocus", true]);
+
+ const doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: {
+ id: "my-mochitest-experiment",
+ screens: TEST_CONTENT,
+ },
+ });
+
+ const tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ const browser = tab.linkedBrowser;
+ let focused = BrowserTestUtils.waitForEvent(gURLBar.inputField, "focus");
+ await onButtonClick(browser, "button.primary");
+ await focused;
+ Assert.ok(gURLBar.focused, "focus should be on url bar");
+
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ sandbox.restore();
+ });
+ await doExperimentCleanup();
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_languageSwitcher.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_languageSwitcher.js
new file mode 100644
index 0000000000..5291a66f7e
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_languageSwitcher.js
@@ -0,0 +1,708 @@
+"use strict";
+
+const { getAddonAndLocalAPIsMocker } = ChromeUtils.importESModule(
+ "resource://testing-common/LangPackMatcherTestUtils.sys.mjs"
+);
+
+const { AWScreenUtils } = ChromeUtils.importESModule(
+ "resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs"
+);
+
+const sandbox = sinon.createSandbox();
+const mockAddonAndLocaleAPIs = getAddonAndLocalAPIsMocker(this, sandbox);
+add_task(function initSandbox() {
+ registerCleanupFunction(() => {
+ sandbox.restore();
+ });
+});
+
+/**
+ * Spy specifically on the button click telemetry.
+ *
+ * The returned function flushes the spy of all of the matching button click events, and
+ * returns the events.
+ *
+ * @returns {function(): TelemetryEvents[]}
+ */
+async function spyOnTelemetryButtonClicks(browser) {
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+ return () => {
+ const result = aboutWelcomeActor.onContentMessage
+ .getCalls()
+ .filter(
+ call =>
+ call.args[0] === "AWPage:TELEMETRY_EVENT" &&
+ call.args[1]?.event === "CLICK_BUTTON"
+ )
+ // The second argument is the telemetry event.
+ .map(call => call.args[1]);
+
+ aboutWelcomeActor.onContentMessage.resetHistory();
+ return result;
+ };
+}
+
+async function openAboutWelcome() {
+ await pushPrefs(
+ // Speed up the tests by disabling transitions.
+ ["browser.aboutwelcome.transitions", false],
+ ["intl.multilingual.aboutWelcome.languageMismatchEnabled", true]
+ );
+ await setAboutWelcomePref(true);
+
+ sandbox
+ .stub(AWScreenUtils, "evaluateScreenTargeting")
+ .resolves(true)
+ // Renders easy setup import screen as first screen to prevent pin/default dialog boxes breaking tests
+ .withArgs(
+ "doesAppNeedPin && 'browser.shell.checkDefaultBrowser'|preferenceValue && !isDefaultBrowser"
+ )
+ .resolves(false)
+ .withArgs(
+ "!doesAppNeedPin && 'browser.shell.checkDefaultBrowser'|preferenceValue && !isDefaultBrowser"
+ )
+ .resolves(false)
+ .withArgs(
+ "doesAppNeedPin && (!'browser.shell.checkDefaultBrowser'|preferenceValue || isDefaultBrowser)"
+ )
+ .resolves(false)
+ .withArgs("isDeviceMigration")
+ .resolves(false);
+
+ info("Opening about:welcome");
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ registerCleanupFunction(async () => {
+ BrowserTestUtils.removeTab(tab);
+ });
+
+ return {
+ browser: tab.linkedBrowser,
+ flushClickTelemetry: await spyOnTelemetryButtonClicks(tab.linkedBrowser),
+ };
+}
+
+async function clickVisibleButton(browser, selector) {
+ // eslint-disable-next-line no-shadow
+ await ContentTask.spawn(browser, { selector }, async ({ selector }) => {
+ function getVisibleElement() {
+ for (const el of content.document.querySelectorAll(selector)) {
+ if (el.offsetParent !== null) {
+ return el;
+ }
+ }
+ return null;
+ }
+
+ await ContentTaskUtils.waitForCondition(
+ getVisibleElement,
+ selector,
+ 200, // interval
+ 100 // maxTries
+ );
+ getVisibleElement().click();
+ });
+}
+
+/**
+ * Test that selectors are present and visible.
+ */
+async function testScreenContent(
+ browser,
+ name,
+ expectedSelectors = [],
+ unexpectedSelectors = []
+) {
+ await ContentTask.spawn(
+ browser,
+ { expectedSelectors, name, unexpectedSelectors },
+ async ({
+ expectedSelectors: expected,
+ name: experimentName,
+ unexpectedSelectors: unexpected,
+ }) => {
+ function selectorIsVisible(selector) {
+ const els = content.document.querySelectorAll(selector);
+ // The offsetParent will be null if element is hidden through "display: none;"
+ return [...els].some(el => el.offsetParent !== null);
+ }
+
+ for (let selector of expected) {
+ await ContentTaskUtils.waitForCondition(
+ () => selectorIsVisible(selector),
+ `Should render ${selector} in ${experimentName}`
+ );
+ }
+ for (let selector of unexpected) {
+ ok(
+ !selectorIsVisible(selector),
+ `Should not render ${selector} in ${experimentName}`
+ );
+ }
+ }
+ );
+}
+
+/**
+ * Report telemetry mismatches nicely.
+ */
+function eventsMatch(
+ actualEvents,
+ expectedEvents,
+ message = "Telemetry events match"
+) {
+ if (actualEvents.length !== expectedEvents.length) {
+ console.error("Events do not match");
+ console.error("Actual: ", JSON.stringify(actualEvents, null, 2));
+ console.error("Expected: ", JSON.stringify(expectedEvents, null, 2));
+ }
+ for (let i = 0; i < actualEvents.length; i++) {
+ const actualEvent = JSON.stringify(actualEvents[i], null, 2);
+ const expectedEvent = JSON.stringify(expectedEvents[i], null, 2);
+ if (actualEvent !== expectedEvent) {
+ console.error("Events do not match");
+ dump(`Actual: ${actualEvent}`);
+ dump("\n");
+ dump(`Expected: ${expectedEvent}`);
+ dump("\n");
+ }
+ Assert.strictEqual(actualEvent, expectedEvent, message);
+ }
+}
+
+const liveLanguageSwitchSelectors = [
+ ".screen.AW_LANGUAGE_MISMATCH",
+ `[data-l10n-id*="onboarding-live-language"]`,
+ `[data-l10n-id="mr2022-onboarding-live-language-text"]`,
+];
+
+/**
+ * Accept the about:welcome offer to change the Firefox language when
+ * there is a mismatch between the operating system language and the Firefox
+ * language.
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_accept() {
+ sandbox.restore();
+ const { resolveLangPacks, resolveInstaller, mockable } =
+ mockAddonAndLocaleAPIs({
+ systemLocale: "es-ES",
+ appLocale: "en-US",
+ });
+
+ const { browser, flushClickTelemetry } = await openAboutWelcome();
+ await testScreenContent(
+ browser,
+ "First Screen primary CTA loaded",
+ // Expected selectors:
+ [`button.primary[value="primary_button"]`],
+ // Unexpected selectors:
+ []
+ );
+
+ info("Clicking the primary button to start the onboarding process.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ await testScreenContent(
+ browser,
+ "Live language switching (waiting for languages)",
+ // Expected selectors:
+ [
+ ...liveLanguageSwitchSelectors,
+ `[data-l10n-id="mr2022-onboarding-live-language-text"]`,
+ `button[disabled] [data-l10n-id="onboarding-live-language-waiting-button"]`,
+ `[data-l10n-id="mr2022-onboarding-secondary-skip-button-label"]`,
+ ],
+ // Unexpected selectors:
+ []
+ );
+
+ // Ignore the telemetry of the initial welcome screen.
+ flushClickTelemetry();
+
+ resolveLangPacks(["es-MX", "es-ES", "fr-FR"]);
+
+ await testScreenContent(
+ browser,
+ "Live language switching, asking for a language",
+ // Expected selectors:
+ [
+ ...liveLanguageSwitchSelectors,
+ `button.primary[value="primary_button"]`,
+ `button.primary[value="decline"]`,
+ ],
+ // Unexpected selectors:
+ [
+ `button[disabled] [data-l10n-id="mr2022-onboarding-live-language-waiting-button"]`,
+ `[data-l10n-id="mr2022-onboarding-secondary-skip-button-label"]`,
+ ]
+ );
+
+ info("Clicking the primary button to view language switching page.");
+
+ await clickVisibleButton(browser, "button.primary");
+
+ await testScreenContent(
+ browser,
+ "Live language switching, waiting for langpack to download",
+ // Expected selectors:
+ [
+ ...liveLanguageSwitchSelectors,
+ `[data-l10n-id="onboarding-live-language-button-label-downloading"]`,
+ `[data-l10n-id="onboarding-live-language-secondary-cancel-download"]`,
+ ],
+ // Unexpected selectors:
+ [
+ `button[disabled] [data-l10n-id="onboarding-live-language-waiting-button"]`,
+ ]
+ );
+
+ eventsMatch(flushClickTelemetry(), [
+ {
+ event: "CLICK_BUTTON",
+ event_context: {
+ source: "download_langpack",
+ page: "about:welcome",
+ },
+ message_id: "MR_WELCOME_DEFAULT_1_AW_LANGUAGE_MISMATCH",
+ },
+ ]);
+
+ sinon.assert.notCalled(mockable.setRequestedAppLocales);
+
+ await resolveInstaller();
+
+ await testScreenContent(
+ browser,
+ "Language changed",
+ // Expected selectors:
+ [`.screen.AW_IMPORT_SETTINGS_EMBEDDED`],
+ // Unexpected selectors:
+ liveLanguageSwitchSelectors
+ );
+
+ info("The app locale was changed to the OS locale.");
+ sinon.assert.calledWith(mockable.setRequestedAppLocales, ["es-ES", "en-US"]);
+
+ eventsMatch(flushClickTelemetry(), [
+ {
+ event: "CLICK_BUTTON",
+ event_context: {
+ source: "download_complete",
+ page: "about:welcome",
+ },
+ message_id: "MR_WELCOME_DEFAULT_1_AW_LANGUAGE_MISMATCH",
+ },
+ ]);
+});
+
+/**
+ * Test declining the about:welcome offer to change the Firefox language when
+ * there is a mismatch between the operating system language and the Firefox
+ * language.
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_decline() {
+ sandbox.restore();
+ const { resolveLangPacks, resolveInstaller, mockable } =
+ mockAddonAndLocaleAPIs({
+ systemLocale: "es-ES",
+ appLocale: "en-US",
+ });
+
+ const { browser, flushClickTelemetry } = await openAboutWelcome();
+ await testScreenContent(
+ browser,
+ "First Screen primary CTA loaded",
+ // Expected selectors:
+ [`button.primary[value="primary_button"]`],
+ // Unexpected selectors:
+ []
+ );
+
+ info("Clicking the primary button to view language switching page.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ await testScreenContent(
+ browser,
+ "Live language switching (waiting for languages)",
+ // Expected selectors:
+ [
+ ...liveLanguageSwitchSelectors,
+ `[data-l10n-id="mr2022-onboarding-live-language-text"]`,
+ `button[disabled] [data-l10n-id="onboarding-live-language-waiting-button"]`,
+ `[data-l10n-id="mr2022-onboarding-secondary-skip-button-label"]`,
+ ],
+ // Unexpected selectors:
+ []
+ );
+
+ // Ignore the telemetry of the initial welcome screen.
+ flushClickTelemetry();
+
+ resolveLangPacks(["es-MX", "es-ES", "fr-FR"]);
+ resolveInstaller();
+
+ await testScreenContent(
+ browser,
+ "Live language switching, asking for a language",
+ // Expected selectors:
+ [
+ ...liveLanguageSwitchSelectors,
+ `button.primary[value="primary_button"]`,
+ `button.primary[value="decline"]`,
+ ],
+ // Unexpected selectors:
+ [
+ `button[disabled] [data-l10n-id="onboarding-live-language-waiting-button"]`,
+ `[data-l10n-id="mr2022-onboarding-secondary-skip-button-label"]`,
+ ]
+ );
+
+ sinon.assert.notCalled(mockable.setRequestedAppLocales);
+
+ info("Clicking the secondary button to skip installing the langpack.");
+ await clickVisibleButton(browser, `button.primary[value="decline"]`);
+
+ await testScreenContent(
+ browser,
+ "Language selection declined",
+ // Expected selectors:
+ [`.screen.AW_IMPORT_SETTINGS_EMBEDDED`],
+ // Unexpected selectors:
+ liveLanguageSwitchSelectors
+ );
+
+ info("The requested locale should be set to the original en-US");
+ sinon.assert.calledWith(mockable.setRequestedAppLocales, ["en-US"]);
+
+ eventsMatch(flushClickTelemetry(), [
+ {
+ event: "CLICK_BUTTON",
+ event_context: {
+ source: "decline",
+ page: "about:welcome",
+ },
+ message_id: "MR_WELCOME_DEFAULT_1_AW_LANGUAGE_MISMATCH",
+ },
+ ]);
+});
+
+/**
+ * Ensure the langpack can be installed before the user gets to the language screen.
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_asyncCalls() {
+ sandbox.restore();
+ const { resolveLangPacks, resolveInstaller, mockable } =
+ mockAddonAndLocaleAPIs({
+ systemLocale: "es-ES",
+ appLocale: "en-US",
+ });
+
+ await openAboutWelcome();
+
+ info("Waiting for getAvailableLangpacks to be called.");
+ await TestUtils.waitForCondition(
+ () => mockable.getAvailableLangpacks.called,
+ "getAvailableLangpacks called once"
+ );
+ ok(mockable.installLangPack.notCalled);
+
+ resolveLangPacks(["es-MX", "es-ES", "fr-FR"]);
+
+ await TestUtils.waitForCondition(
+ () => mockable.installLangPack.called,
+ "installLangPack was called once"
+ );
+ ok(mockable.getAvailableLangpacks.called);
+
+ resolveInstaller();
+});
+
+/**
+ * Test that the "en-US" langpack is installed, if it's already available as the last
+ * fallback locale.
+ */
+add_task(async function test_aboutwelcome_fallback_locale() {
+ sandbox.restore();
+ const { resolveLangPacks, resolveInstaller, mockable } =
+ mockAddonAndLocaleAPIs({
+ systemLocale: "en-US",
+ appLocale: "it",
+ });
+
+ await openAboutWelcome();
+
+ info("Waiting for getAvailableLangpacks to be called.");
+ await TestUtils.waitForCondition(
+ () => mockable.getAvailableLangpacks.called,
+ "getAvailableLangpacks called once"
+ );
+ ok(mockable.installLangPack.notCalled);
+
+ resolveLangPacks(["en-US"]);
+
+ await TestUtils.waitForCondition(
+ () => mockable.installLangPack.called,
+ "installLangPack was called once"
+ );
+ ok(mockable.getAvailableLangpacks.called);
+
+ resolveInstaller();
+});
+
+/**
+ * Test when AMO does not have a matching language.
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_noMatch() {
+ sandbox.restore();
+ const { resolveLangPacks, mockable } = mockAddonAndLocaleAPIs({
+ systemLocale: "tlh", // Klingon
+ appLocale: "en-US",
+ });
+
+ const { browser } = await openAboutWelcome();
+
+ info("Clicking the primary button to start installing the langpack.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ // Klingon is not supported.
+ resolveLangPacks(["es-MX", "es-ES", "fr-FR"]);
+
+ await testScreenContent(
+ browser,
+ "Language selection skipped",
+ // Expected selectors:
+ [`.screen.AW_IMPORT_SETTINGS_EMBEDDED`],
+ // Unexpected selectors:
+ [
+ `[data-l10n-id*="onboarding-live-language"]`,
+ `[data-l10n-id="onboarding-live-language-header"]`,
+ ]
+ );
+ sinon.assert.notCalled(mockable.setRequestedAppLocales);
+});
+
+/**
+ * Test when bidi live reloading is not supported.
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_bidiNotSupported() {
+ sandbox.restore();
+ await pushPrefs(["intl.multilingual.liveReloadBidirectional", false]);
+
+ const { mockable } = mockAddonAndLocaleAPIs({
+ systemLocale: "ar-EG", // Arabic (Egypt)
+ appLocale: "en-US",
+ });
+
+ const { browser } = await openAboutWelcome();
+
+ info("Clicking the primary button to start installing the langpack.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ await testScreenContent(
+ browser,
+ "Language selection skipped for bidi",
+ // Expected selectors:
+ [`.screen.AW_IMPORT_SETTINGS_EMBEDDED`],
+ // Unexpected selectors:
+ [
+ `[data-l10n-id*="onboarding-live-language"]`,
+ `[data-l10n-id="onboarding-live-language-header"]`,
+ ]
+ );
+
+ sinon.assert.notCalled(mockable.setRequestedAppLocales);
+});
+
+/**
+ * Test when bidi live reloading is not supported and no langpacks.
+ */
+add_task(
+ async function test_aboutwelcome_languageSwitcher_bidiNotSupported_noLangPacks() {
+ sandbox.restore();
+ await pushPrefs(["intl.multilingual.liveReloadBidirectional", false]);
+
+ const { resolveLangPacks, mockable } = mockAddonAndLocaleAPIs({
+ systemLocale: "ar-EG", // Arabic (Egypt)
+ appLocale: "en-US",
+ });
+ resolveLangPacks([]);
+
+ const { browser } = await openAboutWelcome();
+
+ info("Clicking the primary button to start installing the langpack.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ await testScreenContent(
+ browser,
+ "Language selection skipped for bidi",
+ // Expected selectors:
+ [`.screen.AW_IMPORT_SETTINGS_EMBEDDED`],
+ // Unexpected selectors:
+ [
+ `[data-l10n-id*="onboarding-live-language"]`,
+ `[data-l10n-id="onboarding-live-language-header"]`,
+ ]
+ );
+
+ sinon.assert.notCalled(mockable.setRequestedAppLocales);
+ }
+);
+
+/**
+ * Test when bidi live reloading is supported.
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_bidiNotSupported() {
+ sandbox.restore();
+ await pushPrefs(["intl.multilingual.liveReloadBidirectional", true]);
+
+ const { resolveLangPacks, mockable } = mockAddonAndLocaleAPIs({
+ systemLocale: "ar-EG", // Arabic (Egypt)
+ appLocale: "en-US",
+ });
+
+ const { browser } = await openAboutWelcome();
+
+ info("Clicking the primary button to start installing the langpack.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ resolveLangPacks(["ar-EG", "es-ES", "fr-FR"]);
+
+ await testScreenContent(
+ browser,
+ "Live language switching with bidi supported",
+ // Expected selectors:
+ [...liveLanguageSwitchSelectors],
+ // Unexpected selectors:
+ []
+ );
+
+ sinon.assert.notCalled(mockable.setRequestedAppLocales);
+});
+
+/**
+ * Test hitting the cancel button when waiting on a langpack.
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_cancelWaiting() {
+ sandbox.restore();
+ const { resolveLangPacks, resolveInstaller, mockable } =
+ mockAddonAndLocaleAPIs({
+ systemLocale: "es-ES",
+ appLocale: "en-US",
+ });
+
+ const { browser, flushClickTelemetry } = await openAboutWelcome();
+
+ info("Clicking the primary button to start the onboarding process.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+ resolveLangPacks(["es-MX", "es-ES", "fr-FR"]);
+
+ await testScreenContent(
+ browser,
+ "Live language switching, asking for a language",
+ // Expected selectors:
+ liveLanguageSwitchSelectors,
+ // Unexpected selectors:
+ []
+ );
+
+ info("Clicking the primary button to view language switching page.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ await testScreenContent(
+ browser,
+ "Live language switching, waiting for langpack to download",
+ // Expected selectors:
+ [
+ ...liveLanguageSwitchSelectors,
+ `[data-l10n-id="onboarding-live-language-button-label-downloading"]`,
+ `[data-l10n-id="onboarding-live-language-secondary-cancel-download"]`,
+ ],
+ // Unexpected selectors:
+ [
+ `button[disabled] [data-l10n-id="onboarding-live-language-waiting-button"]`,
+ ]
+ );
+
+ // Ignore all the telemetry up to this point.
+ flushClickTelemetry();
+
+ info("Cancel the request for the language");
+ await clickVisibleButton(browser, "button.secondary");
+
+ await testScreenContent(
+ browser,
+ "Language selection declined waiting",
+ // Expected selectors:
+ [`.screen.AW_IMPORT_SETTINGS_EMBEDDED`],
+ // Unexpected selectors:
+ liveLanguageSwitchSelectors
+ );
+
+ eventsMatch(flushClickTelemetry(), [
+ {
+ event: "CLICK_BUTTON",
+ event_context: {
+ source: "cancel_waiting",
+ page: "about:welcome",
+ },
+ message_id: "MR_WELCOME_DEFAULT_1_AW_LANGUAGE_MISMATCH",
+ },
+ ]);
+
+ await resolveInstaller();
+
+ is(flushClickTelemetry().length, 0);
+ sinon.assert.notCalled(mockable.setRequestedAppLocales);
+});
+
+/**
+ * Test MR About Welcome language mismatch screen
+ */
+add_task(async function test_aboutwelcome_languageSwitcher_MR() {
+ sandbox.restore();
+
+ const { resolveLangPacks, resolveInstaller } = mockAddonAndLocaleAPIs({
+ systemLocale: "es-ES",
+ appLocale: "en-US",
+ });
+
+ const { browser } = await openAboutWelcome(true);
+
+ info("Clicking the primary button to view language switching screen.");
+ await clickVisibleButton(browser, `button.primary[value="primary_button"]`);
+
+ resolveLangPacks(["es-AR"]);
+ await testScreenContent(
+ browser,
+ "Live language switching, asking for a language",
+ // Expected selectors:
+ [
+ `#mainContentHeader[data-l10n-id="mr2022-onboarding-live-language-text"]`,
+ `[data-l10n-id="mr2022-language-mismatch-subtitle"]`,
+ `.section-secondary [data-l10n-id="mr2022-onboarding-live-language-text"]`,
+ `[data-l10n-id="mr2022-onboarding-live-language-switch-to"]`,
+ `button.primary[value="primary_button"]`,
+ `button.primary[value="decline"]`,
+ ],
+ // Unexpected selectors:
+ [`[data-l10n-id="onboarding-live-language-header"]`]
+ );
+
+ await resolveInstaller();
+ await testScreenContent(
+ browser,
+ "Switched some to langpack (raw) strings after install",
+ // Expected selectors:
+ [`#mainContentHeader[data-l10n-id="mr2022-onboarding-live-language-text"]`],
+ // Unexpected selectors:
+ [
+ `.section-secondary [data-l10n-id="mr2022-onboarding-live-language-text"]`,
+ `[data-l10n-id="mr2022-onboarding-live-language-switch-to"]`,
+ ]
+ );
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_mr.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_mr.js
new file mode 100644
index 0000000000..1832b75778
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_mr.js
@@ -0,0 +1,770 @@
+"use strict";
+
+const { AboutWelcomeParent } = ChromeUtils.importESModule(
+ "resource:///actors/AboutWelcomeParent.sys.mjs"
+);
+
+const { AboutWelcomeTelemetry } = ChromeUtils.importESModule(
+ "resource:///modules/aboutwelcome/AboutWelcomeTelemetry.sys.mjs"
+);
+const { AWScreenUtils } = ChromeUtils.importESModule(
+ "resource:///modules/aboutwelcome/AWScreenUtils.sys.mjs"
+);
+const { InternalTestingProfileMigrator } = ChromeUtils.importESModule(
+ "resource:///modules/InternalTestingProfileMigrator.sys.mjs"
+);
+
+async function clickVisibleButton(browser, selector) {
+ // eslint-disable-next-line no-shadow
+ await ContentTask.spawn(browser, { selector }, async ({ selector }) => {
+ function getVisibleElement() {
+ for (const el of content.document.querySelectorAll(selector)) {
+ if (el.offsetParent !== null) {
+ return el;
+ }
+ }
+ return null;
+ }
+ await ContentTaskUtils.waitForCondition(
+ getVisibleElement,
+ selector,
+ 200, // interval
+ 100 // maxTries
+ );
+ getVisibleElement().click();
+ });
+}
+
+add_setup(async function () {
+ SpecialPowers.pushPrefEnv({
+ set: [
+ ["ui.prefersReducedMotion", 1],
+ ["browser.aboutwelcome.transitions", false],
+ ["browser.shell.checkDefaultBrowser", true],
+ ],
+ });
+});
+
+/**
+ * Test MR message telemetry
+ */
+add_task(async function test_aboutwelcome_mr_template_telemetry() {
+ const sandbox = sinon.createSandbox();
+
+ let { browser, cleanup } = await openMRAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ // Stub AboutWelcomeParent's Content Message Handler
+ const messageStub = sandbox.spy(aboutWelcomeActor, "onContentMessage");
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+
+ const { callCount } = messageStub;
+ Assert.greaterOrEqual(callCount, 1, `${callCount} Stub was called`);
+ let clickCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = messageStub.getCall(i);
+ info(`Call #${i}: ${call.args[0]} ${JSON.stringify(call.args[1])}`);
+ if (call.calledWithMatch("", { event: "CLICK_BUTTON" })) {
+ clickCall = call;
+ }
+ }
+
+ Assert.ok(
+ clickCall.args[1].message_id.startsWith("MR_WELCOME_DEFAULT"),
+ "Telemetry includes MR message id"
+ );
+
+ await cleanup();
+ sandbox.restore();
+});
+
+/**
+ * Telemetry Impression with Easy Setup Need Default and Pin as First Screen
+ */
+add_task(async function test_aboutwelcome_easy_setup_screen_impression() {
+ const sandbox = sinon.createSandbox();
+ sandbox
+ .stub(AWScreenUtils, "evaluateScreenTargeting")
+ .resolves(false)
+ .withArgs(
+ "doesAppNeedPin && 'browser.shell.checkDefaultBrowser'|preferenceValue && !isDefaultBrowser"
+ )
+ .resolves(true)
+ .withArgs("isDeviceMigration")
+ .resolves(false);
+
+ let impressionSpy = sandbox.spy(
+ AboutWelcomeTelemetry.prototype,
+ "sendTelemetry"
+ );
+
+ let { browser, cleanup } = await openMRAboutWelcome();
+ // Wait for screen elements to render before checking impression pings
+ await test_screen_content(
+ browser,
+ "Onboarding screen elements rendered",
+ // Expected selectors:
+ [
+ `main.screen[pos="split"]`,
+ "div.secondary-cta.top",
+ "button[value='secondary_button_top']",
+ ]
+ );
+
+ const { callCount } = impressionSpy;
+ Assert.greaterOrEqual(callCount, 1, `${callCount} impressionSpy was called`);
+ let impressionCall;
+ for (let i = 0; i < callCount; i++) {
+ const call = impressionSpy.getCall(i);
+ info(`Call #${i}: ${JSON.stringify(call.args[0])}`);
+ if (
+ call.calledWithMatch({ event: "IMPRESSION" }) &&
+ !call.calledWithMatch({ message_id: "MR_WELCOME_DEFAULT" })
+ ) {
+ info(`Screen Impression Call #${i}: ${JSON.stringify(call.args[0])}`);
+ impressionCall = call;
+ }
+ }
+
+ Assert.ok(
+ impressionCall.args[0].message_id.startsWith(
+ "MR_WELCOME_DEFAULT_0_AW_EASY_SETUP_NEEDS_DEFAULT_AND_PIN"
+ ),
+ "Impression telemetry includes correct message id"
+ );
+ await cleanup();
+ sandbox.restore();
+});
+
+add_task(async function test_aboutwelcome_gratitude() {
+ const TEST_CONTENT = [
+ {
+ id: "AW_GRATITUDE",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-228px",
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-gratitude.svg') var(--mr-secondary-position) no-repeat, var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "mr2022-onboarding-gratitude-title",
+ },
+ subtitle: {
+ string_id: "mr2022-onboarding-gratitude-subtitle",
+ },
+ primary_button: {
+ label: {
+ string_id: "mr2022-onboarding-gratitude-primary-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ ];
+ await setAboutWelcomeMultiStage(JSON.stringify(TEST_CONTENT)); // NB: calls SpecialPowers.pushPrefEnv
+ let { cleanup, browser } = await openMRAboutWelcome();
+
+ // execution
+ await test_screen_content(
+ browser,
+ "doesn't render secondary button on gratitude screen",
+ //Expected selectors
+ ["main.AW_GRATITUDE", "button[value='primary_button']"],
+
+ //Unexpected selectors:
+ ["button[value='secondary_button']"]
+ );
+ await clickVisibleButton(browser, ".action-buttons button.primary");
+
+ // make sure the button navigates to newtab
+ await test_screen_content(
+ browser,
+ "home",
+ //Expected selectors
+ ["body.activity-stream"],
+
+ //Unexpected selectors:
+ ["main.AW_GRATITUDE"]
+ );
+
+ // cleanup
+ await SpecialPowers.popPrefEnv(); // for setAboutWelcomeMultiStage
+ await cleanup();
+});
+
+add_task(async function test_aboutwelcome_embedded_migration() {
+ // Let's make sure at least one migrator is available and enabled - the
+ // InternalTestingProfileMigrator.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.migrate.internal-testing.enabled", true]],
+ });
+
+ const sandbox = sinon.createSandbox();
+ sandbox
+ .stub(InternalTestingProfileMigrator.prototype, "getResources")
+ .callsFake(() =>
+ Promise.resolve([
+ {
+ type: MigrationUtils.resourceTypes.BOOKMARKS,
+ migrate: () => {},
+ },
+ ])
+ );
+ sandbox.stub(MigrationUtils, "_importQuantities").value({
+ bookmarks: 123,
+ history: 123,
+ logins: 123,
+ });
+ const migrated = new Promise(resolve => {
+ sandbox
+ .stub(InternalTestingProfileMigrator.prototype, "migrate")
+ .callsFake((aResourceTypes, aStartup, aProfile, aProgressCallback) => {
+ aProgressCallback(MigrationUtils.resourceTypes.BOOKMARKS);
+ Services.obs.notifyObservers(null, "Migration:Ended");
+ resolve();
+ });
+ });
+
+ let telemetrySpy = sandbox.spy(
+ AboutWelcomeTelemetry.prototype,
+ "sendTelemetry"
+ );
+
+ const TEST_CONTENT = [
+ {
+ id: "AW_IMPORT_SETTINGS_EMBEDDED",
+ content: {
+ tiles: { type: "migration-wizard" },
+ position: "split",
+ split_narrow_bkg_position: "-42px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-import-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-import.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ migrate_start: {
+ action: {},
+ },
+ migrate_close: {
+ action: { navigate: true },
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ },
+ },
+ {
+ id: "AW_STEP2",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-228px",
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-gratitude.svg') var(--mr-secondary-position) no-repeat, var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: {
+ string_id: "mr2022-onboarding-gratitude-title",
+ },
+ subtitle: {
+ string_id: "mr2022-onboarding-gratitude-subtitle",
+ },
+ primary_button: {
+ label: {
+ string_id: "mr2022-onboarding-gratitude-primary-button-label",
+ },
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ ];
+
+ await setAboutWelcomeMultiStage(JSON.stringify(TEST_CONTENT)); // NB: calls SpecialPowers.pushPrefEnv
+ let { cleanup, browser } = await openMRAboutWelcome();
+
+ // execution
+ await test_screen_content(
+ browser,
+ "Renders a <migration-wizard> custom element",
+ // We expect <migration-wizard> to automatically request the set of migrators
+ // upon binding to the DOM, and to not be in dialog mode.
+ [
+ "main.AW_IMPORT_SETTINGS_EMBEDDED",
+ "migration-wizard[auto-request-state]:not([dialog-mode])",
+ ]
+ );
+
+ // Do a basic test to make sure that the <migration-wizard> is on the right
+ // page and the <panel-list> can open.
+ await SpecialPowers.spawn(
+ browser,
+ [`panel-item[key="${InternalTestingProfileMigrator.key}"]`],
+ async menuitemSelector => {
+ const { MigrationWizardConstants } = ChromeUtils.importESModule(
+ "chrome://browser/content/migration/migration-wizard-constants.mjs"
+ );
+
+ let wizard = content.document.querySelector("migration-wizard");
+ await new Promise(resolve => content.requestAnimationFrame(resolve));
+ let shadow = wizard.openOrClosedShadowRoot;
+ let deck = shadow.querySelector("#wizard-deck");
+
+ // It's unlikely but possible that the deck might not yet be showing the
+ // selection page yet, in which case we wait for that page to appear.
+ if (deck.selectedViewName !== MigrationWizardConstants.PAGES.SELECTION) {
+ await ContentTaskUtils.waitForMutationCondition(
+ deck,
+ { attributeFilter: ["selected-view"] },
+ () => {
+ return (
+ deck.getAttribute("selected-view") ===
+ `page-${MigrationWizardConstants.PAGES.SELECTION}`
+ );
+ }
+ );
+ }
+
+ Assert.ok(true, "Selection page is being shown in the migration wizard.");
+
+ // Now let's make sure that the <panel-list> can appear.
+ let panelList = shadow.querySelector("panel-list");
+ Assert.ok(panelList, "Found the <panel-list>.");
+
+ // The "shown" event from the panel-list is coming from a lower level
+ // of privilege than where we're executing this SpecialPowers.spawn
+ // task. In order to properly listen for it, we have to ask
+ // ContentTaskUtils.waitForEvent to listen for untrusted events.
+ let shown = ContentTaskUtils.waitForEvent(
+ panelList,
+ "shown",
+ false /* capture */,
+ null /* checkFn */,
+ true /* wantsUntrusted */
+ );
+ let selector = shadow.querySelector("#browser-profile-selector");
+
+ // The migration wizard programmatically focuses the selector after
+ // the selection page is shown using an rAF. If we click the button
+ // before that occurs, then the focus can shift after the panel opens
+ // which will cause it to immediately close again. So we wait for the
+ // selection button to gain focus before continuing.
+ if (!selector.matches(":focus")) {
+ await ContentTaskUtils.waitForEvent(selector, "focus");
+ }
+
+ selector.click();
+ await shown;
+
+ let panelRect = panelList.getBoundingClientRect();
+ let selectorRect = selector.getBoundingClientRect();
+
+ // Recalculate the <panel-list> rect top value relative to the top-left
+ // of the selectorRect. We expect the <panel-list> to be tightly anchored
+ // to the bottom of the <button>, so we expect this new value to be close to 0,
+ // to account for subpixel rounding
+ let panelTopLeftRelativeToAnchorTopLeft =
+ panelRect.top - selectorRect.top - selectorRect.height;
+
+ function isfuzzy(actual, expected, epsilon, msg) {
+ if (actual >= expected - epsilon && actual <= expected + epsilon) {
+ ok(true, msg);
+ } else {
+ is(actual, expected, msg);
+ }
+ }
+
+ isfuzzy(
+ panelTopLeftRelativeToAnchorTopLeft,
+ 0,
+ 1,
+ "Panel should be tightly anchored to the bottom of the button shadow node."
+ );
+
+ let panelItem = shadow.querySelector(menuitemSelector);
+ panelItem.click();
+
+ let importButton = shadow.querySelector("#import");
+ importButton.click();
+ }
+ );
+
+ await migrated;
+ Assert.ok(
+ telemetrySpy.calledWithMatch({
+ event: "CLICK_BUTTON",
+ event_context: { source: "primary_button", page: "about:welcome" },
+ message_id: sinon.match.string,
+ }),
+ "Should have sent telemetry for clicking the 'Import' button."
+ );
+
+ await SpecialPowers.spawn(browser, [], async () => {
+ let wizard = content.document.querySelector("migration-wizard");
+ let shadow = wizard.openOrClosedShadowRoot;
+ let continueButton = shadow.querySelector(
+ "div[name='page-progress'] .continue-button"
+ );
+ continueButton.click();
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector("main.AW_STEP2"),
+ "Waiting for step 2 to render"
+ );
+ });
+
+ Assert.ok(
+ telemetrySpy.calledWithMatch({
+ event: "CLICK_BUTTON",
+ event_context: { source: "migrate_close", page: "about:welcome" },
+ message_id: sinon.match.string,
+ }),
+ "Should have sent telemetry for clicking the 'Continue' button."
+ );
+
+ // Ensure that we can go back and get the migration wizard to appear
+ // again.
+ await SpecialPowers.spawn(browser, [], async () => {
+ const { MigrationWizardConstants } = ChromeUtils.importESModule(
+ "chrome://browser/content/migration/migration-wizard-constants.mjs"
+ );
+
+ let migrationWizardReady = ContentTaskUtils.waitForEvent(
+ content,
+ "MigrationWizard:Ready"
+ );
+
+ // Waiting for the history length to update seems to allow us to avoid
+ // an intermittent test failure.
+ await ContentTaskUtils.waitForCondition(() => {
+ return content.history.length === 2;
+ });
+
+ content.history.back();
+ await migrationWizardReady;
+
+ let wizard = content.document.querySelector("migration-wizard");
+ let shadow = wizard.openOrClosedShadowRoot;
+ let deck = shadow.querySelector("#wizard-deck");
+
+ Assert.equal(
+ deck.getAttribute("selected-view"),
+ `page-${MigrationWizardConstants.PAGES.SELECTION}`
+ );
+ });
+
+ // cleanup
+ await SpecialPowers.popPrefEnv(); // for the InternalTestingProfileMigrator.
+ await SpecialPowers.popPrefEnv(); // for setAboutWelcomeMultiStage
+ await cleanup();
+ sandbox.restore();
+ let migrator = await MigrationUtils.getMigrator(
+ InternalTestingProfileMigrator.key
+ );
+ migrator.flushResourceCache();
+});
+
+add_task(async function test_aboutwelcome_multiselect() {
+ const TEST_SCREENS = [
+ {
+ id: "AW_EASY_SETUP_X",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ progress_bar: true,
+ logo: {},
+ title: { string_id: "mr2022-onboarding-set-default-title" },
+ tiles: {
+ type: "multiselect",
+ style: { flexDirection: "column", alignItems: "flex-start" },
+ data: [
+ {
+ id: "radio-1",
+ type: "radio",
+ group: "radios",
+ defaultValue: true,
+ label: {
+ raw: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
+ },
+ action: { type: "OPEN_PROTECTION_REPORT" },
+ },
+ {
+ id: "radio-2",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: {
+ raw: "Nulla facilisi nullam vehicula ipsum a arcu cursus vitae.",
+ },
+ action: { type: "OPEN_FIREFOX_VIEW" },
+ },
+ {
+ id: "radio-3",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { raw: "Natoque penatibus et magnis dis." },
+ action: { type: "OPEN_PRIVATE_BROWSER_WINDOW" },
+ },
+ ],
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: { navigate: true },
+ has_arrow_icon: true,
+ },
+ },
+ },
+ {
+ id: "AW_EASY_SETUP_Y",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ progress_bar: true,
+ logo: {},
+ title: { string_id: "mr2022-onboarding-set-default-title" },
+ tiles: {
+ type: "multiselect",
+ style: { flexDirection: "row", gap: "24px" },
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: { raw: "Test1" },
+ action: { type: "OPEN_PROTECTION_REPORT" },
+ },
+ {
+ id: "checkbox-2",
+ defaultValue: true,
+ label: { raw: "Test2" },
+ action: { type: "OPEN_FIREFOX_VIEW" },
+ },
+ {
+ id: "radio-1",
+ type: "radio",
+ group: "radios",
+ defaultValue: true,
+ label: { raw: "Test3" },
+ action: { type: "OPEN_PROTECTION_REPORT" },
+ },
+ {
+ id: "radio-2",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { raw: "Test4" },
+ action: { type: "OPEN_FIREFOX_VIEW" },
+ },
+ {
+ id: "radio-3",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { raw: "Test5" },
+ action: { type: "OPEN_PRIVATE_BROWSER_WINDOW" },
+ },
+ ],
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: { navigate: true },
+ has_arrow_icon: true,
+ },
+ },
+ },
+ {
+ id: "AW_EASY_SETUP_Z",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ progress_bar: true,
+ logo: {},
+ title: { string_id: "mr2022-onboarding-set-default-title" },
+ tiles: {
+ type: "multiselect",
+ style: {
+ flexDirection: "column",
+ flexShrink: 1,
+ justifyContent: "flex-start",
+ },
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: { raw: "Test1" },
+ action: { type: "OPEN_PROTECTION_REPORT" },
+ },
+ {
+ id: "checkbox-2",
+ defaultValue: true,
+ label: { raw: "Test2" },
+ action: { type: "OPEN_FIREFOX_VIEW" },
+ },
+ {
+ id: "radio-1",
+ type: "radio",
+ group: "radios",
+ defaultValue: true,
+ label: { raw: "Test3" },
+ action: { type: "OPEN_PROTECTION_REPORT" },
+ },
+ {
+ id: "radio-2",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { raw: "Test4" },
+ action: { type: "OPEN_FIREFOX_VIEW" },
+ },
+ {
+ id: "radio-3",
+ type: "radio",
+ group: "radios",
+ defaultValue: false,
+ label: { raw: "Test5" },
+ action: { type: "OPEN_PRIVATE_BROWSER_WINDOW" },
+ },
+ ],
+ },
+ secondary_button: {
+ label: {
+ string_id: "mr2022-onboarding-secondary-skip-button-label",
+ },
+ action: { navigate: true },
+ has_arrow_icon: true,
+ },
+ },
+ },
+ ];
+
+ const sandbox = sinon.createSandbox();
+ sandbox.stub(AWScreenUtils, "addScreenImpression").resolves();
+
+ await setAboutWelcomeMultiStage(JSON.stringify(TEST_SCREENS));
+ let { cleanup, browser } = await openMRAboutWelcome();
+
+ await test_screen_content(
+ browser,
+ "renders default screen",
+ ["main.AW_EASY_SETUP_X", "#radio-1:checked"],
+ ["#radio-2:checked", "#radio-3:checked"]
+ );
+
+ await clickVisibleButton(browser, "#radio-3");
+
+ await test_screen_content(
+ browser,
+ "renders radio button selection",
+ ["main.AW_EASY_SETUP_X", "#radio-3:checked"],
+ ["#radio-1:checked", "#radio-2:checked"]
+ );
+
+ await test_element_styles(
+ browser,
+ ".multi-select-container",
+ { flexDirection: "column", alignItems: "flex-start" },
+ {}
+ );
+
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+
+ await test_screen_content(
+ browser,
+ "renders screen 2",
+ [
+ "main.AW_EASY_SETUP_Y",
+ "#checkbox-1:checked",
+ "#checkbox-2:checked",
+ "#radio-1:checked",
+ ],
+ ["#radio-2:checked", "#radio-3:checked"]
+ );
+
+ await clickVisibleButton(browser, "#checkbox-1");
+ await clickVisibleButton(browser, "#checkbox-2");
+ await clickVisibleButton(browser, "#radio-2");
+
+ await test_screen_content(
+ browser,
+ "renders checkbox and radio button selection",
+ ["main.AW_EASY_SETUP_Y", "#radio-2:checked"],
+ ["#checkbox-1:checked", "#checkbox-2:checked", "#radio-1:checked"]
+ );
+
+ await test_element_styles(
+ browser,
+ ".multi-select-container",
+ { flexDirection: "row", gap: "24px" },
+ {}
+ );
+
+ browser.goBack();
+
+ await test_screen_content(
+ browser,
+ "renders screen 1 and remembers selection",
+ ["main.AW_EASY_SETUP_X", "#radio-3:checked"],
+ ["#radio-1:checked", "#radio-2:checked"]
+ );
+
+ browser.goForward();
+
+ await test_screen_content(
+ browser,
+ "renders screen 2 and remembers selection",
+ ["main.AW_EASY_SETUP_Y", "#radio-2:checked"],
+ ["#checkbox-1:checked", "#checkbox-2:checked", "#radio-1:checked"]
+ );
+
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+
+ await test_screen_content(
+ browser,
+ "renders screen 3",
+ [
+ "main.AW_EASY_SETUP_Z",
+ "#checkbox-1:checked",
+ "#checkbox-2:checked",
+ "#radio-1:checked",
+ ],
+ ["#radio-2:checked", "#radio-3:checked"]
+ );
+
+ await clickVisibleButton(browser, "#radio-3");
+
+ await test_screen_content(
+ browser,
+ "renders radio button selection without removing checkbox selection",
+ [
+ "main.AW_EASY_SETUP_Z",
+ "#checkbox-1:checked",
+ "#checkbox-2:checked",
+ "#radio-3:checked",
+ ],
+ ["#radio-1:checked", "#radio-2:checked"]
+ );
+
+ await test_element_styles(
+ browser,
+ ".multi-select-container",
+ { flexDirection: "column", flexShrink: 1, justifyContent: "flex-start" },
+ {}
+ );
+
+ await SpecialPowers.popPrefEnv();
+ await cleanup();
+
+ sandbox.restore();
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_video.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_video.js
new file mode 100644
index 0000000000..ed331e6752
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_multistage_video.js
@@ -0,0 +1,97 @@
+"use strict";
+
+const { PermissionTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/PermissionTestUtils.sys.mjs"
+);
+
+const videoUrl =
+ "https://www.mozilla.org/tests/dom/media/webaudio/test/noaudio.webm";
+
+function testAutoplayPermission(browser) {
+ let principal = browser.contentPrincipal;
+ is(
+ PermissionTestUtils.testPermission(principal, "autoplay-media"),
+ Services.perms.ALLOW_ACTION,
+ `Autoplay is allowed on ${principal.origin}`
+ );
+}
+
+async function openAWWithVideo({
+ autoPlay = false,
+ video_url = videoUrl,
+ ...rest
+} = {}) {
+ const content = [
+ {
+ id: "VIDEO_ONBOARDING",
+ content: {
+ position: "center",
+ logo: {},
+ title: "Video onboarding",
+ secondary_button: { label: "Skip video", action: { navigate: true } },
+ video_container: {
+ video_url,
+ action: { navigate: true },
+ autoPlay,
+ ...rest,
+ },
+ },
+ },
+ ];
+ await setAboutWelcomeMultiStage(JSON.stringify(content));
+ let { cleanup, browser } = await openMRAboutWelcome();
+ return {
+ browser,
+ content,
+ async cleanup() {
+ await SpecialPowers.popPrefEnv();
+ await cleanup();
+ },
+ };
+}
+
+add_task(async function test_aboutwelcome_video_autoplay() {
+ let { cleanup, browser } = await openAWWithVideo({ autoPlay: true });
+
+ testAutoplayPermission(browser);
+
+ await SpecialPowers.spawn(browser, [videoUrl], async url => {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector("main.with-video"),
+ "Waiting for video onboarding screen"
+ );
+ let video = content.document.querySelector(`video[src='${url}'][autoplay]`);
+ await ContentTaskUtils.waitForCondition(
+ () =>
+ video.currentTime > 0 &&
+ !video.paused &&
+ !video.ended &&
+ video.readyState > 2,
+ "Waiting for video to play"
+ );
+ ok(!video.error, "Video should not have an error");
+ });
+
+ await cleanup();
+});
+
+add_task(async function test_aboutwelcome_video_no_autoplay() {
+ let { cleanup, browser } = await openAWWithVideo();
+
+ testAutoplayPermission(browser);
+
+ await SpecialPowers.spawn(browser, [videoUrl], async url => {
+ let video = await ContentTaskUtils.waitForCondition(
+ () =>
+ content.document.querySelector(`video[src='${url}']:not([autoplay])`),
+ "Waiting for video element to render"
+ );
+ await ContentTaskUtils.waitForCondition(
+ () => video.paused && !video.ended && video.readyState > 2,
+ "Waiting for video to be playable but not playing"
+ );
+ ok(!video.error, "Video should not have an error");
+ });
+
+ await cleanup();
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_observer.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_observer.js
new file mode 100644
index 0000000000..58f9059532
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_observer.js
@@ -0,0 +1,73 @@
+"use strict";
+
+const { AboutWelcomeParent } = ChromeUtils.importESModule(
+ "resource:///actors/AboutWelcomeParent.sys.mjs"
+);
+
+async function openAboutWelcomeTab() {
+ await setAboutWelcomePref(true);
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome"
+ );
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+ return tab;
+}
+
+/**
+ * Test simplified welcome UI tab closed terminate reason
+ */
+add_task(async function test_About_Welcome_Tab_Close() {
+ await setAboutWelcomePref(true);
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ false
+ );
+
+ Assert.ok(Services.focus.activeWindow, "Active window is not null");
+ let AWP = new AboutWelcomeParent();
+ Assert.ok(AWP.AboutWelcomeObserver, "AboutWelcomeObserver is not null");
+
+ BrowserTestUtils.removeTab(tab);
+ Assert.equal(
+ AWP.AboutWelcomeObserver.terminateReason,
+ AWP.AboutWelcomeObserver.AWTerminate.TAB_CLOSED,
+ "Terminated due to tab closed"
+ );
+});
+
+/**
+ * Test simplified welcome UI closed due to change in location uri
+ */
+add_task(async function test_About_Welcome_Location_Change() {
+ await openAboutWelcomeTab();
+ let windowGlobalParent =
+ gBrowser.selectedBrowser.browsingContext.currentWindowGlobal;
+
+ let aboutWelcomeActor = await windowGlobalParent.getActor("AboutWelcome");
+
+ Assert.ok(
+ aboutWelcomeActor.AboutWelcomeObserver,
+ "AboutWelcomeObserver is not null"
+ );
+ BrowserTestUtils.startLoadingURIString(
+ gBrowser.selectedBrowser,
+ // eslint-disable-next-line @microsoft/sdl/no-insecure-url
+ "http://example.com/#foo"
+ );
+ await BrowserTestUtils.waitForLocationChange(
+ gBrowser,
+ // eslint-disable-next-line @microsoft/sdl/no-insecure-url
+ "http://example.com/#foo"
+ );
+
+ Assert.equal(
+ aboutWelcomeActor.AboutWelcomeObserver.terminateReason,
+ aboutWelcomeActor.AboutWelcomeObserver.AWTerminate.ADDRESS_BAR_NAVIGATED,
+ "Terminated due to location uri changed"
+ );
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_rtamo.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_rtamo.js
new file mode 100644
index 0000000000..4db4569eb6
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_rtamo.js
@@ -0,0 +1,299 @@
+"use strict";
+
+const { ASRouter } = ChromeUtils.importESModule(
+ "resource:///modules/asrouter/ASRouter.sys.mjs"
+);
+const { AddonRepository } = ChromeUtils.importESModule(
+ "resource://gre/modules/addons/AddonRepository.sys.mjs"
+);
+const { ExperimentFakes } = ChromeUtils.importESModule(
+ "resource://testing-common/NimbusTestUtils.sys.mjs"
+);
+
+const TEST_ADDON_INFO = [
+ {
+ name: "Test Add-on",
+ sourceURI: { scheme: "https", spec: "https://test.xpi" },
+ icons: { 32: "test.png", 64: "test.png" },
+ type: "extension",
+ },
+];
+
+const TEST_ADDON_INFO_THEME = [
+ {
+ name: "Test Add-on",
+ sourceURI: { scheme: "https", spec: "https://test.xpi" },
+ icons: { 32: "test.png", 64: "test.png" },
+ screenshots: [{ url: "test.png" }],
+ type: "theme",
+ },
+];
+
+async function openRTAMOWelcomePage() {
+ // Can't properly stub the child/parent actors so instead
+ // we stub the modules they depend on for the RTAMO flow
+ // to ensure the right thing is rendered.
+ await ASRouter.forceAttribution({
+ source: "addons.mozilla.org",
+ medium: "referral",
+ campaign: "non-fx-button",
+ // with the sinon override, the id doesn't matter
+ content: "rta:whatever",
+ experiment: "ua-onboarding",
+ variation: "chrome",
+ ua: "Google Chrome 123",
+ dltoken: "00000000-0000-0000-0000-000000000000",
+ });
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ registerCleanupFunction(async () => {
+ BrowserTestUtils.removeTab(tab);
+ // Clear cache call is only possible in a testing environment
+ Services.env.set("XPCSHELL_TEST_PROFILE_DIR", "testing");
+ await ASRouter.forceAttribution({
+ source: "",
+ medium: "",
+ campaign: "",
+ content: "",
+ experiment: "",
+ variation: "",
+ ua: "",
+ dltoken: "",
+ });
+ });
+
+ return tab.linkedBrowser;
+}
+
+/**
+ * Setup and test RTAMO welcome UI
+ */
+async function test_screen_content(
+ browser,
+ experiment,
+ expectedSelectors = [],
+ unexpectedSelectors = []
+) {
+ await ContentTask.spawn(
+ browser,
+ { expectedSelectors, experiment, unexpectedSelectors },
+ async ({
+ expectedSelectors: expected,
+ experiment: experimentName,
+ unexpectedSelectors: unexpected,
+ }) => {
+ for (let selector of expected) {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector(selector),
+ `Should render ${selector} in ${experimentName}`
+ );
+ }
+ for (let selector of unexpected) {
+ ok(
+ !content.document.querySelector(selector),
+ `Should not render ${selector} in ${experimentName}`
+ );
+ }
+ }
+ );
+}
+
+async function onButtonClick(browser, elementId) {
+ await ContentTask.spawn(
+ browser,
+ { elementId },
+ async ({ elementId: buttonId }) => {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector(buttonId),
+ buttonId
+ );
+ let button = content.document.querySelector(buttonId);
+ button.click();
+ }
+ );
+}
+
+/**
+ * Test the RTAMO welcome UI
+ */
+add_task(async function test_rtamo_aboutwelcome() {
+ let sandbox = sinon.createSandbox();
+ sandbox.stub(AddonRepository, "getAddonsByIDs").resolves(TEST_ADDON_INFO);
+
+ let browser = await openRTAMOWelcomePage();
+
+ await test_screen_content(
+ browser,
+ "RTAMO UI",
+ // Expected selectors:
+ [
+ `div.onboardingContainer[style*='background: var(--mr-welcome-background-color) var(--mr-welcome-background-gradient)']`,
+ "h2[data-l10n-id='mr1-return-to-amo-addon-title']",
+ `h2[data-l10n-args='{"addon-name":"${TEST_ADDON_INFO[0].name}"}'`,
+ "div.rtamo-icon",
+ "button.primary[data-l10n-id='mr1-return-to-amo-add-extension-label']",
+ "button[data-l10n-id='onboarding-not-now-button-label']",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP1",
+ "main.AW_STEP2",
+ "main.AW_STEP3",
+ "div.tiles-container.info",
+ ]
+ );
+
+ await onButtonClick(
+ browser,
+ "button[data-l10n-id='onboarding-not-now-button-label']"
+ );
+ Assert.ok(gURLBar.focused, "Focus should be on awesome bar");
+
+ let windowGlobalParent = browser.browsingContext.currentWindowGlobal;
+ let aboutWelcomeActor = windowGlobalParent.getActor("AboutWelcome");
+ const messageSandbox = sinon.createSandbox();
+ // Stub AboutWelcomeParent Content Message Handler
+ messageSandbox.stub(aboutWelcomeActor, "onContentMessage");
+ registerCleanupFunction(() => {
+ messageSandbox.restore();
+ });
+
+ await onButtonClick(browser, "button.primary");
+ const { callCount } = aboutWelcomeActor.onContentMessage;
+ Assert.strictEqual(
+ callCount,
+ 2,
+ `${callCount} Stub called twice to install extension and send telemetry`
+ );
+
+ const installExtensionCall = aboutWelcomeActor.onContentMessage.getCall(0);
+ Assert.equal(
+ installExtensionCall.args[0],
+ "AWPage:SPECIAL_ACTION",
+ "send special action to install add on"
+ );
+ Assert.equal(
+ installExtensionCall.args[1].type,
+ "INSTALL_ADDON_FROM_URL",
+ "Special action type is INSTALL_ADDON_FROM_URL"
+ );
+ Assert.equal(
+ installExtensionCall.args[1].data.url,
+ "https://test.xpi",
+ "Install add on url"
+ );
+ Assert.equal(
+ installExtensionCall.args[1].data.telemetrySource,
+ "rtamo",
+ "Install add on telemetry source"
+ );
+ const telemetryCall = aboutWelcomeActor.onContentMessage.getCall(1);
+ Assert.equal(
+ telemetryCall.args[0],
+ "AWPage:TELEMETRY_EVENT",
+ "send add extension telemetry"
+ );
+ Assert.equal(
+ telemetryCall.args[1].event,
+ "CLICK_BUTTON",
+ "Telemetry event sent as INSTALL"
+ );
+ Assert.equal(
+ telemetryCall.args[1].event_context.source,
+ "ADD_EXTENSION_BUTTON",
+ "Source of the event is Add Extension Button"
+ );
+ Assert.equal(
+ telemetryCall.args[1].message_id,
+ "RTAMO_DEFAULT_WELCOME_EXTENSION",
+ "Message Id sent in telemetry for default RTAMO"
+ );
+
+ sandbox.restore();
+});
+
+add_task(async function test_rtamo_over_experiments() {
+ let sandbox = sinon.createSandbox();
+ sandbox.stub(AddonRepository, "getAddonsByIDs").resolves(TEST_ADDON_INFO);
+
+ let doExperimentCleanup = await ExperimentFakes.enrollWithFeatureConfig({
+ featureId: "aboutwelcome",
+ value: { screens: [], enabled: true },
+ });
+
+ let browser = await openRTAMOWelcomePage();
+
+ // If addon attribution exist, we should see RTAMO even if enrolled
+ // in about:welcome experiment
+ await test_screen_content(
+ browser,
+ "Experiment RTAMO UI",
+ // Expected selectors:
+ ["h2[data-l10n-id='mr1-return-to-amo-addon-title']"],
+ // Unexpected selectors:
+ []
+ );
+
+ await doExperimentCleanup();
+
+ browser = await openRTAMOWelcomePage();
+
+ await test_screen_content(
+ browser,
+ "No Experiment RTAMO UI",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "h2[data-l10n-id='mr1-return-to-amo-addon-title']",
+ "div.rtamo-icon",
+ "button.primary",
+ "button.secondary",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP1",
+ "main.AW_STEP2",
+ "main.AW_STEP3",
+ "div.tiles-container.info",
+ ]
+ );
+
+ sandbox.restore();
+});
+
+add_task(async function test_rtamo_primary_button_theme() {
+ let themeSandbox = sinon.createSandbox();
+ themeSandbox
+ .stub(AddonRepository, "getAddonsByIDs")
+ .resolves(TEST_ADDON_INFO_THEME);
+
+ let browser = await openRTAMOWelcomePage();
+
+ await test_screen_content(
+ browser,
+ "RTAMO UI",
+ // Expected selectors:
+ [
+ "div.onboardingContainer",
+ "h2[data-l10n-id='mr1-return-to-amo-addon-title']",
+ "div.rtamo-icon",
+ "button.primary[data-l10n-id='return-to-amo-add-theme-label']",
+ "button[data-l10n-id='onboarding-not-now-button-label']",
+ "img.rtamo-theme-icon",
+ ],
+ // Unexpected selectors:
+ [
+ "main.AW_STEP1",
+ "main.AW_STEP2",
+ "main.AW_STEP3",
+ "div.tiles-container.info",
+ ]
+ );
+
+ themeSandbox.restore();
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_screen_targeting.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_screen_targeting.js
new file mode 100644
index 0000000000..1d91d4ca05
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_screen_targeting.js
@@ -0,0 +1,274 @@
+"use strict";
+
+const TEST_DEFAULT_CONTENT = [
+ {
+ id: "AW_STEP1",
+ content: {
+ title: "Step 1",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "Secondary",
+ },
+ },
+ },
+ {
+ id: "AW_STEP2",
+ targeting: "false",
+ content: {
+ title: "Step 2",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "Secondary",
+ },
+ },
+ },
+ {
+ id: "AW_STEP3",
+ content: {
+ title: "Step 3",
+ primary_button: {
+ label: "Next",
+ action: {
+ navigate: true,
+ },
+ },
+ secondary_button: {
+ label: "Secondary",
+ },
+ },
+ },
+];
+
+const TEST_DEFAULT_JSON = JSON.stringify(TEST_DEFAULT_CONTENT);
+async function openAboutWelcome() {
+ await setAboutWelcomePref(true);
+ await setAboutWelcomeMultiStage(TEST_DEFAULT_JSON);
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+ return tab.linkedBrowser;
+}
+
+add_task(async function second_screen_filtered_by_targeting() {
+ const sandbox = sinon.createSandbox();
+ let browser = await openAboutWelcome();
+ let aboutWelcomeActor = await getAboutWelcomeParent(browser);
+ // Stub AboutWelcomeParent Content Message Handler
+ sandbox.spy(aboutWelcomeActor, "onContentMessage");
+
+ await test_screen_content(
+ browser,
+ "multistage step 1",
+ // Expected selectors:
+ ["main.AW_STEP1"],
+ // Unexpected selectors:
+ ["main.AW_STEP2", "main.AW_STEP3"]
+ );
+
+ await onButtonClick(browser, "button.primary");
+
+ await test_screen_content(
+ browser,
+ "multistage step 3",
+ // Expected selectors:
+ ["main.AW_STEP3"],
+ // Unexpected selectors:
+ ["main.AW_STEP2", "main.AW_STEP1"]
+ );
+
+ sandbox.restore();
+ await popPrefs();
+});
+
+/**
+ * Test MR template easy setup default content - Browser is not pinned
+ * and not set as default
+ */
+add_task(async function test_aboutwelcome_mr_template_easy_setup_default() {
+ const sandbox = sinon.createSandbox();
+ await pushPrefs(
+ ["browser.shell.checkDefaultBrowser", true],
+ ["messaging-system-action.showEmbeddedImport", false]
+ );
+ sandbox.stub(ShellService, "doesAppNeedPin").returns(true);
+ sandbox.stub(ShellService, "isDefaultBrowser").returns(false);
+
+ await clearHistoryAndBookmarks();
+
+ const { browser, cleanup } = await openMRAboutWelcome();
+
+ //should render easy setup with all checkboxes (default, pin, import)
+ await test_screen_content(
+ browser,
+ "doesn't render only pin, default, or import easy setup",
+ //Expected selectors:
+ ["main.AW_EASY_SETUP_NEEDS_DEFAULT_AND_PIN"],
+ //Unexpected selectors:
+ [
+ "main.AW_EASY_SETUP_NEEDS_DEFAULT",
+ "main.AW_EASY_SETUP_NEEDS_PIN",
+ "main.AW_ONLY_IMPORT",
+ ]
+ );
+
+ await onButtonClick(browser, ".action-buttons button.secondary");
+
+ await test_screen_content(
+ browser,
+ "renders mobile download screen",
+ //Expected selectors:
+ ["main.AW_MOBILE_DOWNLOAD"],
+ //Unexpected selectors:
+ ["main.AW_IMPORT_SETTINGS_EMBEDDED"]
+ );
+
+ await cleanup();
+ await popPrefs();
+ sandbox.restore();
+});
+
+/**
+ * Test MR template easy setup content - Browser is not pinned
+ * and set as default
+ */
+add_task(async function test_aboutwelcome_mr_template_easy_setup_needs_pin() {
+ const sandbox = sinon.createSandbox();
+ await pushPrefs(
+ ["browser.shell.checkDefaultBrowser", true],
+ ["messaging-system-action.showEmbeddedImport", false]
+ );
+ sandbox.stub(ShellService, "doesAppNeedPin").returns(true);
+ sandbox.stub(ShellService, "isDefaultBrowser").returns(true);
+
+ await clearHistoryAndBookmarks();
+
+ const { browser, cleanup } = await openMRAboutWelcome();
+
+ //should render easy setup needs pin
+ await test_screen_content(
+ browser,
+ "doesn't render default and pin, only default or import easy setup",
+ //Expected selectors:
+ ["main.AW_EASY_SETUP_NEEDS_PIN"],
+ //Unexpected selectors:
+ [
+ "main.AW_EASY_SETUP_NEEDS_DEFAULT",
+ "main.AW_EASY_SETUP_NEEDS_DEFAULT_AND_PIN",
+ "main.AW_ONLY_IMPORT",
+ ]
+ );
+
+ await cleanup();
+ await popPrefs();
+ sandbox.restore();
+});
+
+/**
+ * Test MR template easy setup content - Browser is pinned and
+ * not set as default
+ */
+add_task(
+ async function test_aboutwelcome_mr_template_easy_setup_needs_default() {
+ const sandbox = sinon.createSandbox();
+ await pushPrefs(
+ ["browser.shell.checkDefaultBrowser", true],
+ ["messaging-system-action.showEmbeddedImport", false]
+ );
+ sandbox.stub(ShellService, "doesAppNeedPin").returns(false);
+ sandbox.stub(ShellService, "isDefaultBrowser").returns(false);
+
+ await clearHistoryAndBookmarks();
+
+ const { browser, cleanup } = await openMRAboutWelcome();
+
+ //should render easy setup needs default
+ await test_screen_content(
+ browser,
+ "doesn't render pin, import and set to default",
+ //Expected selectors:
+ ["main.AW_EASY_SETUP_NEEDS_DEFAULT"],
+ //Unexpected selectors:
+ [
+ "main.AW_EASY_SETUP_NEEDS_PIN",
+ "main.AW_EASY_SETUP_NEEDS_DEFAULT_AND_PIN",
+ "main.AW_ONLY_IMPORT",
+ ]
+ );
+
+ await onButtonClick(browser, ".action-buttons button.secondary");
+ await test_screen_content(
+ browser,
+ "renders mobile download screen",
+ //Expected selectors:
+ ["main.AW_MOBILE_DOWNLOAD"],
+ //Unexpected selectors:
+ ["main.AW_IMPORT_SETTINGS_EMBEDDED"]
+ );
+
+ await cleanup();
+ await popPrefs();
+ sandbox.restore();
+ }
+);
+
+/**
+ * Test MR template easy setup content - Browser is pinned and
+ * set as default
+ */
+add_task(async function test_aboutwelcome_mr_template_easy_setup_only_import() {
+ const sandbox = sinon.createSandbox();
+ await pushPrefs(
+ ["browser.shell.checkDefaultBrowser", true],
+ ["messaging-system-action.showEmbeddedImport", false]
+ );
+ sandbox.stub(ShellService, "doesAppNeedPin").returns(false);
+ sandbox.stub(ShellService, "isDefaultBrowser").returns(true);
+
+ await clearHistoryAndBookmarks();
+
+ const { browser, cleanup } = await openMRAboutWelcome();
+
+ //should render easy setup - only import
+ await test_screen_content(
+ browser,
+ "doesn't render any combination of pin and default",
+ //Expected selectors:
+ ["main.AW_EASY_SETUP_ONLY_IMPORT"],
+ //Unexpected selectors:
+ [
+ "main.AW_EASY_SETUP_NEEDS_PIN",
+ "main.AW_EASY_SETUP_NEEDS_DEFAULT_AND_PIN",
+ "main.AW_EASY_SETUP_NEEDS_DEFAULT",
+ ]
+ );
+
+ await onButtonClick(browser, ".action-buttons button.secondary");
+ await test_screen_content(
+ browser,
+ "renders mobile download screen",
+ //Expected selectors:
+ ["main.AW_MOBILE_DOWNLOAD"],
+ //Unexpected selectors:
+ ["main.AW_IMPORT_SETTINGS_EMBEDDED"]
+ );
+
+ await cleanup();
+ await popPrefs();
+ sandbox.restore();
+});
diff --git a/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_upgrade_multistage_mr.js b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_upgrade_multistage_mr.js
new file mode 100644
index 0000000000..d6bc53d8ce
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/browser_aboutwelcome_upgrade_multistage_mr.js
@@ -0,0 +1,320 @@
+"use strict";
+
+const { OnboardingMessageProvider } = ChromeUtils.importESModule(
+ "resource:///modules/asrouter/OnboardingMessageProvider.sys.mjs"
+);
+const { SpecialMessageActions } = ChromeUtils.importESModule(
+ "resource://messaging-system/lib/SpecialMessageActions.sys.mjs"
+);
+const {
+ assertFirefoxViewTabSelected,
+ closeFirefoxViewTab,
+ init: FirefoxViewTestUtilsInit,
+} = ChromeUtils.importESModule(
+ "resource://testing-common/FirefoxViewTestUtils.sys.mjs"
+);
+FirefoxViewTestUtilsInit(this);
+
+const HOMEPAGE_PREF = "browser.startup.homepage";
+const NEWTAB_PREF = "browser.newtabpage.enabled";
+const PINPBM_DISABLED_PREF = "browser.startup.upgradeDialog.pinPBM.disabled";
+
+// A bunch of the helper functions here are variants of the helper functions in
+// browser_aboutwelcome_multistage_mr.js, because the onboarding
+// experience runs in the parent process rather than elsewhere.
+// If these start to get used in more than just the two files, it may become
+// worth refactoring them to avoid duplicated code, and hoisting them
+// into head.js.
+
+let sandbox;
+
+add_setup(async () => {
+ requestLongerTimeout(2);
+
+ await setAboutWelcomePref(true);
+
+ sandbox = sinon.createSandbox();
+ sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(false);
+ sandbox
+ .stub(OnboardingMessageProvider, "_doesAppNeedDefault")
+ .resolves(false);
+
+ sandbox.stub(SpecialMessageActions, "pinFirefoxToTaskbar").resolves();
+
+ registerCleanupFunction(async () => {
+ await popPrefs();
+ sandbox.restore();
+ });
+});
+
+/**
+ * Get the content by OnboardingMessageProvider.getUpgradeMessage(),
+ * discard any screens whose ids are not in the "screensToTest" array,
+ * and then open an upgrade dialog with just those screens.
+ *
+ * @param {Array} screensToTest
+ * A list of which screen ids to be displayed
+ *
+ * @returns {Promise<Window>}
+ * Resolves to the window global object for the dialog once it has been
+ * opened
+ */
+async function openMRUpgradeWelcome(screensToTest) {
+ const data = await OnboardingMessageProvider.getUpgradeMessage();
+
+ if (screensToTest) {
+ data.content.screens = data.content.screens.filter(screen =>
+ screensToTest.includes(screen.id)
+ );
+ }
+
+ sandbox.stub(OnboardingMessageProvider, "getUpgradeMessage").resolves(data);
+
+ let dialogOpenPromise = BrowserTestUtils.promiseAlertDialogOpen(
+ null,
+ "chrome://browser/content/spotlight.html",
+ { isSubDialog: true }
+ );
+
+ Cc["@mozilla.org/browser/browserglue;1"]
+ .getService()
+ .wrappedJSObject._showUpgradeDialog();
+
+ let browser = await dialogOpenPromise;
+
+ OnboardingMessageProvider.getUpgradeMessage.restore();
+ return Promise.resolve(browser);
+}
+
+async function clickVisibleButton(browser, selector) {
+ await BrowserTestUtils.waitForCondition(
+ () => browser.document.querySelector(selector),
+ `waiting for selector ${selector}`,
+ 200, // interval
+ 100 // maxTries
+ );
+ browser.document.querySelector(selector).click();
+}
+
+async function test_upgrade_screen_content(
+ browser,
+ expected = [],
+ unexpected = []
+) {
+ for (let selector of expected) {
+ await TestUtils.waitForCondition(
+ () => browser.document.querySelector(selector),
+ `Should render ${selector}`
+ );
+ }
+ for (let selector of unexpected) {
+ Assert.ok(
+ !browser.document.querySelector(selector),
+ `Should not render ${selector}`
+ );
+ }
+}
+
+async function waitForDialogClose(browser) {
+ await BrowserTestUtils.waitForCondition(
+ () => !browser.top?.document.querySelector(".dialogFrame"),
+ "waiting for dialog to close"
+ );
+}
+
+/**
+ * Test homepage/newtab prefs start off as defaults and do not change
+ */
+add_task(async function test_aboutwelcome_upgrade_mr_prefs_off() {
+ let browser = await openMRUpgradeWelcome(["UPGRADE_GET_STARTED"]);
+
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors:
+ ["main.UPGRADE_GET_STARTED"],
+ //Unexpected selectors:
+ ["main.PIN_FIREFOX"]
+ );
+
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+ await clickVisibleButton(browser, ".action-buttons button.primary");
+ await waitForDialogClose(browser);
+
+ Assert.ok(
+ !Services.prefs.prefHasUserValue(HOMEPAGE_PREF),
+ "homepage pref should be default"
+ );
+ Assert.ok(
+ !Services.prefs.prefHasUserValue(NEWTAB_PREF),
+ "newtab pref should be default"
+ );
+
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/*
+ *Test checkbox if needPrivatePin is true
+ */
+add_task(async function test_aboutwelcome_upgrade_mr_private_pin() {
+ OnboardingMessageProvider._doesAppNeedPin.resolves(true);
+ let browser = await openMRUpgradeWelcome(["UPGRADE_PIN_FIREFOX"]);
+
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors:
+ ["main.UPGRADE_PIN_FIREFOX", "input#action-checkbox"],
+ //Unexpected selectors:
+ ["main.UPGRADE_COLORWAY"]
+ );
+ await clickVisibleButton(browser, ".action-buttons button.primary");
+ await waitForDialogClose(browser);
+
+ const pinStub = SpecialMessageActions.pinFirefoxToTaskbar;
+ Assert.equal(
+ pinStub.callCount,
+ 2,
+ "pinFirefoxToTaskbar should have been called twice"
+ );
+ Assert.ok(
+ // eslint-disable-next-line eqeqeq
+ pinStub.firstCall.lastArg != pinStub.secondCall.lastArg,
+ "pinFirefoxToTaskbar should have been called once for private, once not"
+ );
+
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/*
+ *Test checkbox shouldn't be shown in get started screen
+ */
+
+add_task(async function test_aboutwelcome_upgrade_mr_private_pin_get_started() {
+ OnboardingMessageProvider._doesAppNeedPin.resolves(false);
+
+ let browser = await openMRUpgradeWelcome(["UPGRADE_GET_STARTED"]);
+
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors
+ ["main.UPGRADE_GET_STARTED"],
+ //Unexpected selectors:
+ ["input#action-checkbox"]
+ );
+
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+
+ await waitForDialogClose(browser);
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/*
+ *Test checkbox shouldn't be shown if needPrivatePin is false
+ */
+add_task(async function test_aboutwelcome_upgrade_mr_private_pin_not_needed() {
+ OnboardingMessageProvider._doesAppNeedPin
+ .resolves(true)
+ .withArgs(true)
+ .resolves(false);
+
+ let browser = await openMRUpgradeWelcome(["UPGRADE_PIN_FIREFOX"]);
+
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors
+ ["main.UPGRADE_PIN_FIREFOX"],
+ //Unexpected selectors:
+ ["input#action-checkbox"]
+ );
+
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+ await waitForDialogClose(browser);
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/*
+ * Make sure we don't get an extraneous checkbox here.
+ */
+add_task(
+ async function test_aboutwelcome_upgrade_mr_pin_not_needed_default_needed() {
+ OnboardingMessageProvider._doesAppNeedPin.resolves(false);
+ OnboardingMessageProvider._doesAppNeedDefault.resolves(false);
+
+ let browser = await openMRUpgradeWelcome(["UPGRADE_GET_STARTED"]);
+
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors
+ ["main.UPGRADE_GET_STARTED"],
+ //Unexpected selectors:
+ ["input#action-checkbox"]
+ );
+
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+ await waitForDialogClose(browser);
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+ }
+);
+
+add_task(async function test_aboutwelcome_privacy_segmentation_pref() {
+ async function testPrivacySegmentation(enabled = false) {
+ await pushPrefs(["browser.privacySegmentation.preferences.show", enabled]);
+ let screenIds = ["UPGRADE_DATA_RECOMMENDATION", "UPGRADE_GRATITUDE"];
+ let browser = await openMRUpgradeWelcome(screenIds);
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors
+ [`main.${screenIds[enabled ? 0 : 1]}`],
+ //Unexpected selectors:
+ [`main.${screenIds[enabled ? 1 : 0]}`]
+ );
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+ await popPrefs();
+ }
+
+ for (let enabled of [true, false]) {
+ await testPrivacySegmentation(enabled);
+ }
+});
+
+add_task(async function test_aboutwelcome_upgrade_show_firefox_view() {
+ let browser = await openMRUpgradeWelcome(["UPGRADE_GRATITUDE"]);
+
+ // execution
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors
+ ["main.UPGRADE_GRATITUDE"],
+ //Unexpected selectors:
+ []
+ );
+ await clickVisibleButton(browser, ".action-buttons button.primary");
+
+ // verification
+ await BrowserTestUtils.waitForEvent(gBrowser, "TabSwitchDone");
+ assertFirefoxViewTabSelected(gBrowser.ownerGlobal);
+
+ closeFirefoxViewTab(gBrowser.ownerGlobal);
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
+
+/*
+ *Checkbox shouldn't be shown if pinPBMDisabled pref is true
+ */
+add_task(async function test_aboutwelcome_upgrade_mr_private_pin_not_needed() {
+ OnboardingMessageProvider._doesAppNeedPin.resolves(true);
+ await pushPrefs([PINPBM_DISABLED_PREF, true]);
+
+ const browser = await openMRUpgradeWelcome(["UPGRADE_PIN_FIREFOX"]);
+
+ await test_upgrade_screen_content(
+ browser,
+ //Expected selectors
+ ["main.UPGRADE_PIN_FIREFOX"],
+ //Unexpected selectors:
+ ["input#action-checkbox"]
+ );
+
+ await clickVisibleButton(browser, ".action-buttons button.secondary");
+ await waitForDialogClose(browser);
+ await BrowserTestUtils.removeTab(gBrowser.selectedTab);
+});
diff --git a/browser/components/aboutwelcome/tests/browser/head.js b/browser/components/aboutwelcome/tests/browser/head.js
new file mode 100644
index 0000000000..0854a3efb0
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/browser/head.js
@@ -0,0 +1,149 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+ChromeUtils.defineESModuleGetters(this, {
+ FxAccounts: "resource://gre/modules/FxAccounts.sys.mjs",
+ QueryCache: "resource:///modules/asrouter/ASRouterTargeting.sys.mjs",
+ sinon: "resource://testing-common/Sinon.sys.mjs",
+});
+
+// Set the content pref to make it available across tests
+const ABOUT_WELCOME_OVERRIDE_CONTENT_PREF = "browser.aboutwelcome.screens";
+
+function popPrefs() {
+ return SpecialPowers.popPrefEnv();
+}
+function pushPrefs(...prefs) {
+ return SpecialPowers.pushPrefEnv({ set: prefs });
+}
+
+async function getAboutWelcomeParent(browser) {
+ let windowGlobalParent = browser.browsingContext.currentWindowGlobal;
+ return windowGlobalParent.getActor("AboutWelcome");
+}
+
+async function setAboutWelcomeMultiStage(value = "") {
+ return pushPrefs([ABOUT_WELCOME_OVERRIDE_CONTENT_PREF, value]);
+}
+
+async function setAboutWelcomePref(value) {
+ return pushPrefs(["browser.aboutwelcome.enabled", value]);
+}
+
+async function openMRAboutWelcome() {
+ await setAboutWelcomePref(true); // NB: Calls pushPrefs
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "about:welcome",
+ true
+ );
+
+ return {
+ browser: tab.linkedBrowser,
+ cleanup: async () => {
+ BrowserTestUtils.removeTab(tab);
+ await popPrefs(); // for setAboutWelcomePref()
+ },
+ };
+}
+
+async function onButtonClick(browser, elementId) {
+ await ContentTask.spawn(
+ browser,
+ { elementId },
+ async ({ elementId: buttonId }) => {
+ let button = await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector(buttonId),
+ buttonId
+ );
+ button.click();
+ }
+ );
+}
+
+async function clearHistoryAndBookmarks() {
+ await PlacesUtils.bookmarks.eraseEverything();
+ await PlacesUtils.history.clear();
+ QueryCache.expireAll();
+}
+
+/**
+ * Setup functions to test welcome UI
+ */
+async function test_screen_content(
+ browser,
+ experiment,
+ expectedSelectors = [],
+ unexpectedSelectors = []
+) {
+ await ContentTask.spawn(
+ browser,
+ { expectedSelectors, experiment, unexpectedSelectors },
+ async ({
+ expectedSelectors: expected,
+ experiment: experimentName,
+ unexpectedSelectors: unexpected,
+ }) => {
+ for (let selector of expected) {
+ await ContentTaskUtils.waitForCondition(
+ () => content.document.querySelector(selector),
+ `Should render ${selector} in ${experimentName}`
+ );
+ }
+ for (let selector of unexpected) {
+ ok(
+ !content.document.querySelector(selector),
+ `Should not render ${selector} in ${experimentName}`
+ );
+ }
+
+ if (experimentName === "home") {
+ Assert.equal(
+ content.document.location.href,
+ "about:home",
+ "Navigated to about:home"
+ );
+ } else {
+ Assert.equal(
+ content.document.location.href,
+ "about:welcome",
+ "Navigated to a welcome screen"
+ );
+ }
+ }
+ );
+}
+
+async function test_element_styles(
+ browser,
+ elementSelector,
+ expectedStyles = {},
+ unexpectedStyles = {}
+) {
+ await ContentTask.spawn(
+ browser,
+ [elementSelector, expectedStyles, unexpectedStyles],
+ async ([selector, expected, unexpected]) => {
+ const element = await ContentTaskUtils.waitForCondition(() =>
+ content.document.querySelector(selector)
+ );
+ const computedStyles = content.window.getComputedStyle(element);
+ Object.entries(expected).forEach(([attr, val]) =>
+ is(
+ computedStyles[attr],
+ val,
+ `${selector} should have computed ${attr} of ${val}`
+ )
+ );
+ Object.entries(unexpected).forEach(([attr, val]) =>
+ isnot(
+ computedStyles[attr],
+ val,
+ `${selector} should not have computed ${attr} of ${val}`
+ )
+ );
+ }
+ );
+}
diff --git a/browser/components/aboutwelcome/tests/unit/AWScreenUtils.test.jsx b/browser/components/aboutwelcome/tests/unit/AWScreenUtils.test.jsx
new file mode 100644
index 0000000000..b6e9489ef9
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/AWScreenUtils.test.jsx
@@ -0,0 +1,140 @@
+import { AWScreenUtils } from "modules/AWScreenUtils.sys.mjs";
+import { GlobalOverrider } from "newtab/test/unit/utils";
+import { ASRouter } from "asrouter/modules/ASRouter.sys.mjs";
+
+describe("AWScreenUtils", () => {
+ let sandbox;
+ let globals;
+
+ beforeEach(() => {
+ globals = new GlobalOverrider();
+ globals.set({
+ ASRouter,
+ ASRouterTargeting: {
+ Environment: {},
+ },
+ });
+
+ sandbox = sinon.createSandbox();
+ });
+ afterEach(() => {
+ sandbox.restore();
+ globals.restore();
+ });
+ describe("removeScreens", () => {
+ it("should run callback function once for each array element", async () => {
+ const callback = sandbox.stub().resolves(false);
+ const arr = ["foo", "bar"];
+ await AWScreenUtils.removeScreens(arr, callback);
+ assert.calledTwice(callback);
+ });
+ it("should remove screen when passed function evaluates true", async () => {
+ const callback = sandbox.stub().resolves(true);
+ const arr = ["foo", "bar"];
+ await AWScreenUtils.removeScreens(arr, callback);
+ assert.deepEqual(arr, []);
+ });
+ });
+ describe("evaluateScreenTargeting", () => {
+ it("should return the eval result if the eval succeeds", async () => {
+ const evalStub = sandbox.stub(ASRouter, "evaluateExpression").resolves({
+ evaluationStatus: {
+ success: true,
+ result: false,
+ },
+ });
+ const result = await AWScreenUtils.evaluateScreenTargeting(
+ "test expression"
+ );
+ assert.calledOnce(evalStub);
+ assert.equal(result, false);
+ });
+ it("should return true if the targeting eval fails", async () => {
+ const evalStub = sandbox.stub(ASRouter, "evaluateExpression").resolves({
+ evaluationStatus: {
+ success: false,
+ result: false,
+ },
+ });
+ const result = await AWScreenUtils.evaluateScreenTargeting(
+ "test expression"
+ );
+ assert.calledOnce(evalStub);
+ assert.equal(result, true);
+ });
+ });
+ describe("evaluateTargetingAndRemoveScreens", () => {
+ it("should manipulate an array of screens", async () => {
+ const screens = [
+ {
+ id: "first",
+ targeting: true,
+ },
+ {
+ id: "second",
+ targeting: false,
+ },
+ ];
+
+ const expectedScreens = [
+ {
+ id: "first",
+ targeting: true,
+ },
+ ];
+ sandbox.stub(ASRouter, "evaluateExpression").callsFake(targeting => {
+ return {
+ evaluationStatus: {
+ success: true,
+ result: targeting.expression,
+ },
+ };
+ });
+ const evaluatedStrings =
+ await AWScreenUtils.evaluateTargetingAndRemoveScreens(screens);
+ assert.deepEqual(evaluatedStrings, expectedScreens);
+ });
+ it("should not remove screens with no targeting", async () => {
+ const screens = [
+ {
+ id: "first",
+ },
+ {
+ id: "second",
+ targeting: false,
+ },
+ ];
+
+ const expectedScreens = [
+ {
+ id: "first",
+ },
+ ];
+ sandbox
+ .stub(AWScreenUtils, "evaluateScreenTargeting")
+ .callsFake(targeting => {
+ if (targeting === undefined) {
+ return true;
+ }
+ return targeting;
+ });
+ const evaluatedStrings =
+ await AWScreenUtils.evaluateTargetingAndRemoveScreens(screens);
+ assert.deepEqual(evaluatedStrings, expectedScreens);
+ });
+ });
+
+ describe("addScreenImpression", () => {
+ it("Should call addScreenImpression with provided screen ID", () => {
+ const addScreenImpressionStub = sandbox.stub(
+ ASRouter,
+ "addScreenImpression"
+ );
+ const testScreen = { id: "test" };
+ AWScreenUtils.addScreenImpression(testScreen);
+
+ assert.calledOnce(addScreenImpressionStub);
+ assert.equal(addScreenImpressionStub.firstCall.args[0].id, testScreen.id);
+ });
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/CTAParagraph.test.jsx b/browser/components/aboutwelcome/tests/unit/CTAParagraph.test.jsx
new file mode 100644
index 0000000000..c60e8e2666
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/CTAParagraph.test.jsx
@@ -0,0 +1,49 @@
+import React from "react";
+import { shallow } from "enzyme";
+import { CTAParagraph } from "content-src/components/CTAParagraph";
+
+describe("CTAParagraph component", () => {
+ let sandbox;
+ let wrapper;
+ let handleAction;
+
+ beforeEach(() => {
+ sandbox = sinon.createSandbox();
+ handleAction = sandbox.stub();
+ wrapper = shallow(
+ <CTAParagraph
+ content={{
+ text: {
+ raw: "Link Text",
+ string_name: "Test Name",
+ },
+ }}
+ handleAction={handleAction}
+ />
+ );
+ });
+
+ afterEach(() => {
+ sandbox.restore();
+ });
+
+ it("should render CTAParagraph component", () => {
+ assert.ok(wrapper.exists());
+ });
+
+ it("should render CTAParagraph component if only CTA text is passed", () => {
+ wrapper.setProps({ content: { text: "CTA Text" } });
+ assert.ok(wrapper.exists());
+ });
+
+ it("should call handleAction method when button is link is clicked", () => {
+ const btnLink = wrapper.find(".cta-paragraph span");
+ btnLink.simulate("click");
+ assert.calledOnce(handleAction);
+ });
+
+ it("should not render CTAParagraph component if CTA text is not passed", () => {
+ wrapper.setProps({ content: { text: null } });
+ assert.ok(wrapper.isEmptyRender());
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/HelpText.test.jsx b/browser/components/aboutwelcome/tests/unit/HelpText.test.jsx
new file mode 100644
index 0000000000..e9b722b9d8
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/HelpText.test.jsx
@@ -0,0 +1,41 @@
+import { HelpText } from "content-src/components/HelpText";
+import { Localized } from "content-src/components/MSLocalized";
+import React from "react";
+import { shallow } from "enzyme";
+
+describe("<HelpText>", () => {
+ it("should render text inside Localized", () => {
+ const shallowWrapper = shallow(<HelpText text="test" />);
+
+ assert.equal(shallowWrapper.find(Localized).props().text, "test");
+ });
+ it("should render the img if there is an img and a string_id", () => {
+ const shallowWrapper = shallow(
+ <HelpText
+ text={{ string_id: "test_id" }}
+ hasImg={{
+ src: "chrome://activity-stream/content/data/content/assets/cfr_fb_container.png",
+ }}
+ />
+ );
+ assert.ok(
+ shallowWrapper
+ .find(Localized)
+ .findWhere(n => n.text.string_id === "test_id")
+ );
+ assert.lengthOf(shallowWrapper.find("p.helptext"), 1);
+ assert.lengthOf(shallowWrapper.find("img[data-l10n-name='help-img']"), 1);
+ });
+ it("should render the img if there is an img and plain text", () => {
+ const shallowWrapper = shallow(
+ <HelpText
+ text={"Sample help text"}
+ hasImg={{
+ src: "chrome://activity-stream/content/data/content/assets/cfr_fb_container.png",
+ }}
+ />
+ );
+ assert.equal(shallowWrapper.find("p.helptext").text(), "Sample help text");
+ assert.lengthOf(shallowWrapper.find("img.helptext-img"), 1);
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/HeroImage.test.jsx b/browser/components/aboutwelcome/tests/unit/HeroImage.test.jsx
new file mode 100644
index 0000000000..244e64f906
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/HeroImage.test.jsx
@@ -0,0 +1,40 @@
+import React from "react";
+import { shallow } from "enzyme";
+import { HeroImage } from "content-src/components/HeroImage";
+
+describe("HeroImage component", () => {
+ const imageUrl = "https://example.com";
+ const imageHeight = "100px";
+ const imageAlt = "Alt text";
+
+ let wrapper;
+ beforeEach(() => {
+ wrapper = shallow(
+ <HeroImage url={imageUrl} alt={imageAlt} height={imageHeight} />
+ );
+ });
+
+ it("should render HeroImage component", () => {
+ assert.ok(wrapper.exists());
+ });
+
+ it("should render an image element with src prop", () => {
+ let imgEl = wrapper.find("img");
+ assert.strictEqual(imgEl.prop("src"), imageUrl);
+ });
+
+ it("should render image element with alt text prop", () => {
+ let imgEl = wrapper.find("img");
+ assert.equal(imgEl.prop("alt"), imageAlt);
+ });
+
+ it("should render an image with a set height prop", () => {
+ let imgEl = wrapper.find("img");
+ assert.propertyVal(imgEl.prop("style"), "height", imageHeight);
+ });
+
+ it("should not render HeroImage component", () => {
+ wrapper.setProps({ url: null });
+ assert.ok(wrapper.isEmptyRender());
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/LinkParagraph.test.jsx b/browser/components/aboutwelcome/tests/unit/LinkParagraph.test.jsx
new file mode 100644
index 0000000000..240342b5e2
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/LinkParagraph.test.jsx
@@ -0,0 +1,102 @@
+import React from "react";
+import { mount } from "enzyme";
+import { LinkParagraph } from "content-src/components/LinkParagraph";
+
+describe("LinkParagraph component", () => {
+ let sandbox;
+ let wrapper;
+ let handleAction;
+
+ beforeEach(() => {
+ sandbox = sinon.createSandbox();
+ handleAction = sandbox.stub();
+
+ wrapper = mount(
+ <LinkParagraph
+ text_content={{
+ text: {
+ string_id:
+ "shopping-onboarding-opt-in-privacy-policy-and-terms-of-use3",
+ },
+ link_keys: ["privacy_policy"],
+ font_styles: "legal",
+ }}
+ handleAction={handleAction}
+ />
+ );
+ });
+
+ afterEach(() => {
+ sandbox.restore();
+ });
+
+ it("should render LinkParagraph component", () => {
+ assert.ok(wrapper.exists());
+ });
+
+ it("should render copy with legal style if legal is passed to font_styles", () => {
+ assert.strictEqual(wrapper.find(".legal-paragraph").length, 1);
+ });
+
+ it("should render one link when only one link id is passed", () => {
+ assert.strictEqual(wrapper.find(".legal-paragraph a").length, 1);
+ });
+
+ it("should call handleAction method when link is clicked", () => {
+ const linkEl = wrapper.find(".legal-paragraph a");
+ linkEl.simulate("click");
+ assert.calledOnce(handleAction);
+ });
+
+ it("should render two links if an additional link id is passed", () => {
+ wrapper.setProps({
+ text_content: {
+ text: {
+ string_id:
+ "shopping-onboarding-opt-in-privacy-policy-and-terms-of-use3",
+ },
+ link_keys: ["privacy_policy", "terms_of_use"],
+ font_styles: "legal",
+ },
+ });
+ assert.strictEqual(wrapper.find(".legal-paragraph a").length, 2);
+ });
+
+ it("should render no links when no link id is passed", () => {
+ wrapper.setProps({
+ text_content: { links: null },
+ });
+ assert.strictEqual(wrapper.find(".legal-paragraph a").length, 0);
+ });
+
+ it("should render copy even when no link id is passed", () => {
+ wrapper.setProps({
+ text_content: { links: null },
+ });
+ assert.ok(wrapper.find(".legal-paragraph"));
+ });
+
+ it("should not render LinkParagraph component if text is not passed", () => {
+ wrapper.setProps({ text_content: { text: null } });
+ assert.ok(wrapper.isEmptyRender());
+ });
+
+ it("should render copy in link style if no font style is passed", () => {
+ wrapper.setProps({
+ text_content: {
+ text: {
+ string_id: "shopping-onboarding-body",
+ },
+ link_keys: ["learn_more"],
+ },
+ });
+ assert.strictEqual(wrapper.find(".link-paragraph").length, 1);
+ });
+
+ it("should not render links if string_id is not provided", () => {
+ wrapper.setProps({
+ text_content: { text: { string_id: null } },
+ });
+ assert.strictEqual(wrapper.find(".link-paragraph a").length, 0);
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/MRColorways.test.jsx b/browser/components/aboutwelcome/tests/unit/MRColorways.test.jsx
new file mode 100644
index 0000000000..2d9ebf7ec9
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/MRColorways.test.jsx
@@ -0,0 +1,328 @@
+import React from "react";
+import { shallow } from "enzyme";
+import {
+ Colorways,
+ computeColorWay,
+ ColorwayDescription,
+ computeVariationIndex,
+} from "content-src/components/MRColorways";
+import { WelcomeScreen } from "content-src/components/MultiStageAboutWelcome";
+
+describe("Multistage AboutWelcome module", () => {
+ let sandbox;
+ let COLORWAY_SCREEN_PROPS;
+ beforeEach(() => {
+ sandbox = sinon.createSandbox();
+ COLORWAY_SCREEN_PROPS = {
+ id: "test-colorway-screen",
+ totalNumberofScreens: 1,
+ content: {
+ subtitle: "test subtitle",
+ tiles: {
+ type: "colorway",
+ action: {
+ theme: "<event>",
+ },
+ defaultVariationIndex: 0,
+ systemVariations: ["automatic", "light"],
+ variations: ["soft", "bold"],
+ colorways: [
+ {
+ id: "default",
+ label: "Default",
+ },
+ {
+ id: "abstract",
+ label: "Abstract",
+ },
+ ],
+ },
+ primary_button: {
+ action: {},
+ label: "test button",
+ },
+ },
+ messageId: "test-mr-colorway-screen",
+ activeTheme: "automatic",
+ };
+ });
+ afterEach(() => {
+ sandbox.restore();
+ });
+
+ describe("MRColorway component", () => {
+ it("should render WelcomeScreen", () => {
+ const wrapper = shallow(<WelcomeScreen {...COLORWAY_SCREEN_PROPS} />);
+
+ assert.ok(wrapper.exists());
+ });
+
+ it("should use default when activeTheme is not set", () => {
+ const wrapper = shallow(<Colorways {...COLORWAY_SCREEN_PROPS} />);
+ wrapper.setProps({ activeTheme: null });
+
+ const colorwaysOptionIcons = wrapper.find(
+ ".tiles-theme-section .theme .icon"
+ );
+ assert.strictEqual(colorwaysOptionIcons.length, 2);
+
+ // Default automatic theme is selected by default
+ assert.strictEqual(
+ colorwaysOptionIcons.first().prop("className").includes("selected"),
+ true
+ );
+
+ assert.strictEqual(
+ colorwaysOptionIcons.first().prop("className").includes("default"),
+ true
+ );
+ });
+
+ it("should use default when activeTheme is alpenglow", () => {
+ const wrapper = shallow(<Colorways {...COLORWAY_SCREEN_PROPS} />);
+ wrapper.setProps({ activeTheme: "alpenglow" });
+
+ const colorwaysOptionIcons = wrapper.find(
+ ".tiles-theme-section .theme .icon"
+ );
+ assert.strictEqual(colorwaysOptionIcons.length, 2);
+
+ // Default automatic theme is selected when unsupported in colorway alpenglow theme is active
+ assert.strictEqual(
+ colorwaysOptionIcons.first().prop("className").includes("selected"),
+ true
+ );
+
+ assert.strictEqual(
+ colorwaysOptionIcons.first().prop("className").includes("default"),
+ true
+ );
+ });
+
+ it("should render colorways options", () => {
+ const wrapper = shallow(<Colorways {...COLORWAY_SCREEN_PROPS} />);
+
+ const colorwaysOptions = wrapper.find(
+ ".tiles-theme-section .theme input[name='theme']"
+ );
+
+ const colorwaysOptionIcons = wrapper.find(
+ ".tiles-theme-section .theme .icon"
+ );
+
+ const colorwaysLabels = wrapper.find(
+ ".tiles-theme-section .theme span.sr-only"
+ );
+
+ assert.strictEqual(colorwaysOptions.length, 2);
+ assert.strictEqual(colorwaysOptionIcons.length, 2);
+ assert.strictEqual(colorwaysLabels.length, 2);
+
+ // First colorway option
+ // Default theme radio option is selected by default
+ assert.strictEqual(
+ colorwaysOptionIcons.first().prop("className").includes("selected"),
+ true
+ );
+
+ //Colorway should be using id property
+ assert.strictEqual(
+ colorwaysOptions.first().prop("data-colorway"),
+ "default"
+ );
+
+ // Second colorway option
+ assert.strictEqual(
+ colorwaysOptionIcons.last().prop("className").includes("selected"),
+ false
+ );
+
+ //Colorway should be using id property
+ assert.strictEqual(
+ colorwaysOptions.last().prop("data-colorway"),
+ "abstract"
+ );
+
+ //Colorway should be labelled for screen readers (parent label is for tooltip only, and does not describe the Colorway)
+ assert.strictEqual(
+ colorwaysOptions.last().prop("aria-labelledby"),
+ "abstract-label"
+ );
+ });
+
+ it("should handle colorway clicks", () => {
+ sandbox.stub(React, "useEffect").callsFake((fn, vals) => {
+ if (vals === undefined) {
+ fn();
+ } else if (vals[0] === "in") {
+ fn();
+ }
+ });
+
+ const handleAction = sandbox.stub();
+ const wrapper = shallow(
+ <Colorways handleAction={handleAction} {...COLORWAY_SCREEN_PROPS} />
+ );
+ const colorwaysOptions = wrapper.find(
+ ".tiles-theme-section .theme input[name='theme']"
+ );
+
+ let props = wrapper.find(ColorwayDescription).props();
+ assert.propertyVal(props.colorway, "label", "Default");
+
+ const option = colorwaysOptions.last();
+ assert.propertyVal(option.props(), "value", "abstract-soft");
+ colorwaysOptions.last().simulate("click");
+ assert.calledOnce(handleAction);
+ });
+
+ it("should render colorway description", () => {
+ const wrapper = shallow(<Colorways {...COLORWAY_SCREEN_PROPS} />);
+
+ let descriptionsWrapper = wrapper.find(ColorwayDescription);
+ assert.ok(descriptionsWrapper.exists());
+
+ let props = descriptionsWrapper.props();
+
+ // Colorway description should display Default theme desc by default
+ assert.strictEqual(props.colorway.label, "Default");
+ });
+
+ it("ColorwayDescription should display active colorway desc", () => {
+ let TEST_COLORWAY_PROPS = {
+ colorway: {
+ label: "Activist",
+ description: "Test Activist",
+ },
+ };
+ const descWrapper = shallow(
+ <ColorwayDescription {...TEST_COLORWAY_PROPS} />
+ );
+ assert.ok(descWrapper.exists());
+ const descText = descWrapper.find(".colorway-text");
+ assert.equal(
+ descText.props()["data-l10n-args"].includes("Activist"),
+ true
+ );
+ });
+
+ it("should computeColorWayId for default active theme", () => {
+ let TEST_COLORWAY_PROPS = {
+ ...COLORWAY_SCREEN_PROPS,
+ };
+
+ const colorwayId = computeColorWay(
+ TEST_COLORWAY_PROPS.activeTheme,
+ TEST_COLORWAY_PROPS.content.tiles.systemVariations
+ );
+ assert.strictEqual(colorwayId, "default");
+ });
+
+ it("should computeColorWayId for non-default active theme", () => {
+ let TEST_COLORWAY_PROPS = {
+ ...COLORWAY_SCREEN_PROPS,
+ activeTheme: "abstract-soft",
+ };
+
+ const colorwayId = computeColorWay(
+ TEST_COLORWAY_PROPS.activeTheme,
+ TEST_COLORWAY_PROPS.content.tiles.systemVariations
+ );
+ assert.strictEqual(colorwayId, "abstract");
+ });
+
+ it("should computeVariationIndex for default active theme", () => {
+ let TEST_COLORWAY_PROPS = {
+ ...COLORWAY_SCREEN_PROPS,
+ };
+
+ const variationIndex = computeVariationIndex(
+ TEST_COLORWAY_PROPS.activeTheme,
+ TEST_COLORWAY_PROPS.content.tiles.systemVariations,
+ TEST_COLORWAY_PROPS.content.tiles.variations,
+ TEST_COLORWAY_PROPS.content.tiles.defaultVariationIndex
+ );
+ assert.strictEqual(
+ variationIndex,
+ TEST_COLORWAY_PROPS.content.tiles.defaultVariationIndex
+ );
+ });
+
+ it("should computeVariationIndex for active theme", () => {
+ let TEST_COLORWAY_PROPS = {
+ ...COLORWAY_SCREEN_PROPS,
+ };
+
+ const variationIndex = computeVariationIndex(
+ "light",
+ TEST_COLORWAY_PROPS.content.tiles.systemVariations,
+ TEST_COLORWAY_PROPS.content.tiles.variations,
+ TEST_COLORWAY_PROPS.content.tiles.defaultVariationIndex
+ );
+ assert.strictEqual(variationIndex, 1);
+ });
+
+ it("should computeVariationIndex for colorway theme", () => {
+ let TEST_COLORWAY_PROPS = {
+ ...COLORWAY_SCREEN_PROPS,
+ };
+
+ const variationIndex = computeVariationIndex(
+ "abstract-bold",
+ TEST_COLORWAY_PROPS.content.tiles.systemVariations,
+ TEST_COLORWAY_PROPS.content.tiles.variations,
+ TEST_COLORWAY_PROPS.content.tiles.defaultVariationIndex
+ );
+ assert.strictEqual(variationIndex, 1);
+ });
+
+ describe("random colorways", () => {
+ let test;
+ beforeEach(() => {
+ COLORWAY_SCREEN_PROPS.handleAction = sandbox.stub();
+ sandbox.stub(window, "matchMedia");
+ // eslint-disable-next-line max-nested-callbacks
+ sandbox.stub(React, "useEffect").callsFake((fn, vals) => {
+ if (vals?.length === 0) {
+ fn();
+ }
+ });
+ test = () => {
+ shallow(<Colorways {...COLORWAY_SCREEN_PROPS} />);
+ return COLORWAY_SCREEN_PROPS.handleAction.firstCall.firstArg
+ .currentTarget;
+ };
+ });
+
+ it("should select a random colorway", () => {
+ const { value } = test();
+
+ assert.strictEqual(value, "abstract-soft");
+ assert.calledThrice(React.useEffect);
+ assert.notCalled(window.matchMedia);
+ });
+
+ it("should select a random soft colorway when not dark", () => {
+ window.matchMedia.returns({ matches: false });
+ COLORWAY_SCREEN_PROPS.content.tiles.darkVariation = 1;
+
+ const { value } = test();
+
+ assert.strictEqual(value, "abstract-soft");
+ assert.calledThrice(React.useEffect);
+ assert.calledOnce(window.matchMedia);
+ });
+
+ it("should select a random bold colorway when dark", () => {
+ window.matchMedia.returns({ matches: true });
+ COLORWAY_SCREEN_PROPS.content.tiles.darkVariation = 1;
+
+ const { value } = test();
+
+ assert.strictEqual(value, "abstract-bold");
+ assert.calledThrice(React.useEffect);
+ assert.calledOnce(window.matchMedia);
+ });
+ });
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/MSLocalized.test.jsx b/browser/components/aboutwelcome/tests/unit/MSLocalized.test.jsx
new file mode 100644
index 0000000000..57f7e5526c
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/MSLocalized.test.jsx
@@ -0,0 +1,48 @@
+import { Localized } from "content-src/components/MSLocalized";
+import React from "react";
+import { shallow } from "enzyme";
+
+describe("<MSLocalized>", () => {
+ it("should render span with no children", () => {
+ const shallowWrapper = shallow(<Localized text="test" />);
+
+ assert.ok(shallowWrapper.find("span").exists());
+ assert.equal(shallowWrapper.text(), "test");
+ });
+ it("should render span when using string_id with no children", () => {
+ const shallowWrapper = shallow(
+ <Localized text={{ string_id: "test_id" }} />
+ );
+
+ assert.ok(shallowWrapper.find("span[data-l10n-id='test_id']").exists());
+ });
+ it("should render text inside child", () => {
+ const shallowWrapper = shallow(
+ <Localized text="test">
+ <div />
+ </Localized>
+ );
+
+ assert.ok(shallowWrapper.find("div").text(), "test");
+ });
+ it("should use l10n id on child", () => {
+ const shallowWrapper = shallow(
+ <Localized text={{ string_id: "test_id" }}>
+ <div />
+ </Localized>
+ );
+
+ assert.ok(shallowWrapper.find("div[data-l10n-id='test_id']").exists());
+ });
+ it("should keep original children", () => {
+ const shallowWrapper = shallow(
+ <Localized text={{ string_id: "test_id" }}>
+ <h1>
+ <span data-l10n-name="test" />
+ </h1>
+ </Localized>
+ );
+
+ assert.ok(shallowWrapper.find("span[data-l10n-name='test']").exists());
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/MobileDownloads.test.jsx b/browser/components/aboutwelcome/tests/unit/MobileDownloads.test.jsx
new file mode 100644
index 0000000000..143c7d2f8d
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/MobileDownloads.test.jsx
@@ -0,0 +1,69 @@
+import React from "react";
+import { shallow, mount } from "enzyme";
+import { GlobalOverrider } from "newtab/test/unit/utils";
+import { MobileDownloads } from "content-src/components/MobileDownloads";
+
+describe("Multistage AboutWelcome MobileDownloads module", () => {
+ let globals;
+ let sandbox;
+
+ beforeEach(async () => {
+ globals = new GlobalOverrider();
+ globals.set({
+ AWFinish: () => Promise.resolve(),
+ AWSendToDeviceEmailsSupported: () => Promise.resolve(),
+ });
+ sandbox = sinon.createSandbox();
+ });
+
+ afterEach(() => {
+ sandbox.restore();
+ globals.restore();
+ });
+
+ describe("Mobile Downloads component", () => {
+ const MOBILE_DOWNLOADS_PROPS = {
+ data: {
+ QR_code: {
+ image_url:
+ "chrome://browser/components/privatebrowsing/content/assets/focus-qr-code.svg",
+ alt_text: {
+ string_id: "spotlight-focus-promo-qr-code",
+ },
+ },
+ email: {
+ link_text: "Email yourself a link",
+ },
+ marketplace_buttons: ["ios", "android"],
+ },
+ handleAction: () => {
+ window.AWFinish();
+ },
+ };
+
+ it("should render MobileDownloads", () => {
+ const wrapper = shallow(<MobileDownloads {...MOBILE_DOWNLOADS_PROPS} />);
+
+ assert.ok(wrapper.exists());
+ });
+
+ it("should handle action on markeplace badge click", () => {
+ const wrapper = mount(<MobileDownloads {...MOBILE_DOWNLOADS_PROPS} />);
+
+ const stub = sandbox.stub(global, "AWFinish");
+ wrapper.find(".ios button").simulate("click");
+ wrapper.find(".android button").simulate("click");
+
+ assert.calledTwice(stub);
+ });
+
+ it("should handle action on email button click", () => {
+ const wrapper = shallow(<MobileDownloads {...MOBILE_DOWNLOADS_PROPS} />);
+
+ const stub = sandbox.stub(global, "AWFinish");
+ wrapper.find("button.email-link").simulate("click");
+
+ assert.calledOnce(stub);
+ });
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/MultiSelect.test.jsx b/browser/components/aboutwelcome/tests/unit/MultiSelect.test.jsx
new file mode 100644
index 0000000000..b42964f906
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/MultiSelect.test.jsx
@@ -0,0 +1,221 @@
+import React from "react";
+import { mount } from "enzyme";
+import { MultiSelect } from "content-src/components/MultiSelect";
+
+describe("MultiSelect component", () => {
+ let sandbox;
+ let MULTISELECT_SCREEN_PROPS;
+ let setScreenMultiSelects;
+ let setActiveMultiSelect;
+ beforeEach(() => {
+ sandbox = sinon.createSandbox();
+ setScreenMultiSelects = sandbox.stub();
+ setActiveMultiSelect = sandbox.stub();
+ MULTISELECT_SCREEN_PROPS = {
+ id: "multiselect-screen",
+ content: {
+ position: "split",
+ split_narrow_bkg_position: "-60px",
+ image_alt_text: {
+ string_id: "mr2022-onboarding-default-image-alt",
+ },
+ background:
+ "url('chrome://activity-stream/content/data/content/assets/mr-settodefault.svg') var(--mr-secondary-position) no-repeat var(--mr-screen-background-color)",
+ progress_bar: true,
+ logo: {},
+ title: "Test Title",
+ tiles: {
+ type: "multiselect",
+ label: "Test Subtitle",
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: {
+ string_id: "mr2022-onboarding-set-default-primary-button-label",
+ },
+ action: {
+ type: "SET_DEFAULT_BROWSER",
+ },
+ },
+ {
+ id: "checkbox-2",
+ defaultValue: true,
+ label: "Test Checkbox 2",
+ action: {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: {},
+ },
+ },
+ {
+ id: "checkbox-3",
+ defaultValue: false,
+ label: "Test Checkbox 3",
+ action: {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: {},
+ },
+ },
+ ],
+ },
+ primary_button: {
+ label: "Save and Continue",
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ navigate: true,
+ data: { actions: [] },
+ },
+ },
+ secondary_button: {
+ label: "Skip",
+ action: {
+ navigate: true,
+ },
+ has_arrow_icon: true,
+ },
+ },
+ setScreenMultiSelects,
+ setActiveMultiSelect,
+ };
+ });
+ afterEach(() => {
+ sandbox.restore();
+ });
+
+ it("should call setScreenMultiSelects with all ids of checkboxes", () => {
+ mount(<MultiSelect {...MULTISELECT_SCREEN_PROPS} />);
+
+ assert.calledOnce(setScreenMultiSelects);
+ assert.calledWith(setScreenMultiSelects, [
+ "checkbox-1",
+ "checkbox-2",
+ "checkbox-3",
+ ]);
+ });
+
+ it("should not call setScreenMultiSelects if it's already set", () => {
+ let map = sandbox
+ .stub()
+ .returns(MULTISELECT_SCREEN_PROPS.content.tiles.data);
+
+ mount(
+ <MultiSelect screenMultiSelects={{ map }} {...MULTISELECT_SCREEN_PROPS} />
+ );
+
+ assert.notCalled(setScreenMultiSelects);
+ assert.calledOnce(map);
+ assert.calledWith(map, sinon.match.func);
+ });
+
+ it("should call setActiveMultiSelect with ids of checkboxes with defaultValue true", () => {
+ const wrapper = mount(<MultiSelect {...MULTISELECT_SCREEN_PROPS} />);
+
+ wrapper.setProps({ activeMultiSelect: null });
+ assert.calledOnce(setActiveMultiSelect);
+ assert.calledWith(setActiveMultiSelect, ["checkbox-1", "checkbox-2"]);
+ });
+
+ it("should use activeMultiSelect ids to set checked state for respective checkbox", () => {
+ const wrapper = mount(<MultiSelect {...MULTISELECT_SCREEN_PROPS} />);
+
+ wrapper.setProps({ activeMultiSelect: ["checkbox-1", "checkbox-2"] });
+ const checkBoxes = wrapper.find(".checkbox-container input");
+ assert.strictEqual(checkBoxes.length, 3);
+
+ assert.strictEqual(checkBoxes.first().props().checked, true);
+ assert.strictEqual(checkBoxes.at(1).props().checked, true);
+ assert.strictEqual(checkBoxes.last().props().checked, false);
+ });
+
+ it("cover the randomize property", async () => {
+ MULTISELECT_SCREEN_PROPS.content.tiles.data.forEach(
+ item => (item.randomize = true)
+ );
+
+ const wrapper = mount(<MultiSelect {...MULTISELECT_SCREEN_PROPS} />);
+
+ const checkBoxes = wrapper.find(".checkbox-container input");
+ assert.strictEqual(checkBoxes.length, 3);
+
+ // We don't want to actually test the randomization, just that it doesn't
+ // throw. We _could_ render the component until we get a different order,
+ // and that should work the vast majority of the time, but it's
+ // theoretically possible that we get the same order over and over again
+ // until we hit the 2 second timeout. That would be an extremely low failure
+ // rate, but we already know Math.random() works, so we don't really need to
+ // test it anyway. It's not worth the added risk of false failures.
+ });
+
+ it("should filter out id when checkbox is unchecked", () => {
+ const wrapper = mount(<MultiSelect {...MULTISELECT_SCREEN_PROPS} />);
+ wrapper.setProps({ activeMultiSelect: ["checkbox-1", "checkbox-2"] });
+
+ const ckbx1 = wrapper.find(".checkbox-container input").at(0);
+ assert.strictEqual(ckbx1.prop("value"), "checkbox-1");
+ ckbx1.getDOMNode().checked = false;
+ ckbx1.simulate("change");
+ assert.calledWith(setActiveMultiSelect, ["checkbox-2"]);
+ });
+
+ it("should add id when checkbox is checked", () => {
+ const wrapper = mount(<MultiSelect {...MULTISELECT_SCREEN_PROPS} />);
+ wrapper.setProps({ activeMultiSelect: ["checkbox-1", "checkbox-2"] });
+
+ const ckbx3 = wrapper.find(".checkbox-container input").at(2);
+ assert.strictEqual(ckbx3.prop("value"), "checkbox-3");
+ ckbx3.getDOMNode().checked = true;
+ ckbx3.simulate("change");
+ assert.calledWith(setActiveMultiSelect, [
+ "checkbox-1",
+ "checkbox-2",
+ "checkbox-3",
+ ]);
+ });
+
+ it("should render radios and checkboxes with correct styles", async () => {
+ const SCREEN_PROPS = { ...MULTISELECT_SCREEN_PROPS };
+ SCREEN_PROPS.content.tiles.style = { flexDirection: "row", gap: "24px" };
+ SCREEN_PROPS.content.tiles.data = [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ label: { raw: "Test1" },
+ action: { type: "OPEN_PROTECTION_REPORT" },
+ style: { color: "red" },
+ icon: { style: { color: "blue" } },
+ },
+ {
+ id: "radio-1",
+ type: "radio",
+ group: "radios",
+ defaultValue: true,
+ label: { raw: "Test3" },
+ action: { type: "OPEN_PROTECTION_REPORT" },
+ style: { color: "purple" },
+ icon: { style: { color: "yellow" } },
+ },
+ ];
+ const wrapper = mount(<MultiSelect {...SCREEN_PROPS} />);
+
+ // wait for effect hook
+ await new Promise(resolve => queueMicrotask(resolve));
+ // activeMultiSelect was called on effect hook with default values
+ assert.calledWith(setActiveMultiSelect, ["checkbox-1", "radio-1"]);
+
+ const container = wrapper.find(".multi-select-container");
+ assert.strictEqual(container.prop("style").flexDirection, "row");
+ assert.strictEqual(container.prop("style").gap, "24px");
+
+ // checkboxes/radios are rendered with correct styles
+ const checkBoxes = wrapper.find(".checkbox-container");
+ assert.strictEqual(checkBoxes.length, 2);
+ assert.strictEqual(checkBoxes.first().prop("style").color, "red");
+ assert.strictEqual(checkBoxes.at(1).prop("style").color, "purple");
+
+ const checks = wrapper.find(".checkbox-container input");
+ assert.strictEqual(checks.length, 2);
+ assert.strictEqual(checks.first().prop("style").color, "blue");
+ assert.strictEqual(checks.at(1).prop("style").color, "yellow");
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/MultiStageAWProton.test.jsx b/browser/components/aboutwelcome/tests/unit/MultiStageAWProton.test.jsx
new file mode 100644
index 0000000000..a40af1c4a1
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/MultiStageAWProton.test.jsx
@@ -0,0 +1,571 @@
+import { AboutWelcomeDefaults } from "modules/AboutWelcomeDefaults.sys.mjs";
+import { MultiStageProtonScreen } from "content-src/components/MultiStageProtonScreen";
+import { AWScreenUtils } from "modules/AWScreenUtils.sys.mjs";
+import React from "react";
+import { mount } from "enzyme";
+
+describe("MultiStageAboutWelcomeProton module", () => {
+ let sandbox;
+ let clock;
+ beforeEach(() => {
+ clock = sinon.useFakeTimers();
+ sandbox = sinon.createSandbox();
+ });
+ afterEach(() => {
+ clock.restore();
+ sandbox.restore();
+ });
+
+ describe("MultiStageAWProton component", () => {
+ it("should render MultiStageProton Screen", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ });
+
+ it("should render secondary section for split positioned screens", () => {
+ const SCREEN_PROPS = {
+ content: {
+ position: "split",
+ title: "test title",
+ hero_text: "test subtitle",
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".welcome-text h1").text(), "test title");
+ assert.equal(
+ wrapper.find(".section-secondary h1").text(),
+ "test subtitle"
+ );
+ assert.equal(wrapper.find("main").prop("pos"), "split");
+ });
+
+ it("should render secondary section with content background for split positioned screens", () => {
+ const BACKGROUND_URL =
+ "chrome://activity-stream/content/data/content/assets/confetti.svg";
+ const SCREEN_PROPS = {
+ content: {
+ position: "split",
+ background: `url(${BACKGROUND_URL}) var(--mr-secondary-position) no-repeat`,
+ split_narrow_bkg_position: "10px",
+ title: "test title",
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.ok(
+ wrapper
+ .find("div.section-secondary")
+ .prop("style")
+ .background.includes("--mr-secondary-position")
+ );
+ assert.ok(
+ wrapper.find("div.section-secondary").prop("style")[
+ "--mr-secondary-background-position-y"
+ ],
+ "10px"
+ );
+ });
+
+ it("should render with secondary section for split positioned screens", () => {
+ const SCREEN_PROPS = {
+ content: {
+ position: "split",
+ title: "test title",
+ hero_text: "test subtitle",
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".welcome-text h1").text(), "test title");
+ assert.equal(
+ wrapper.find(".section-secondary h1").text(),
+ "test subtitle"
+ );
+ assert.equal(wrapper.find("main").prop("pos"), "split");
+ });
+
+ it("should render with no secondary section for center positioned screens", () => {
+ const SCREEN_PROPS = {
+ content: {
+ position: "center",
+ title: "test title",
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".section-secondary").exists(), false);
+ assert.equal(wrapper.find(".welcome-text h1").text(), "test title");
+ assert.equal(wrapper.find("main").prop("pos"), "center");
+ });
+
+ it("should not render multiple action buttons if an additional button does not exist", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ primary_button: {
+ label: "test primary button",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.isFalse(wrapper.find(".additional-cta").exists());
+ });
+
+ it("should render an additional action button with primary styling if no style has been specified", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ primary_button: {
+ label: "test primary button",
+ },
+ additional_button: {
+ label: "test additional button",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.isTrue(wrapper.find(".additional-cta.primary").exists());
+ });
+
+ it("should render an additional action button with secondary styling", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ primary_button: {
+ label: "test primary button",
+ },
+ additional_button: {
+ label: "test additional button",
+ style: "secondary",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".additional-cta.secondary").exists(), true);
+ });
+
+ it("should render an additional action button with primary styling", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ primary_button: {
+ label: "test primary button",
+ },
+ additional_button: {
+ label: "test additional button",
+ style: "primary",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".additional-cta.primary").exists(), true);
+ });
+
+ it("should render an additional action with link styling", () => {
+ const SCREEN_PROPS = {
+ content: {
+ position: "split",
+ title: "test title",
+ primary_button: {
+ label: "test primary button",
+ },
+ additional_button: {
+ label: "test additional button",
+ style: "link",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".additional-cta.cta-link").exists(), true);
+ });
+
+ it("should render an additional button with vertical orientation", () => {
+ const SCREEN_PROPS = {
+ content: {
+ position: "center",
+ title: "test title",
+ primary_button: {
+ label: "test primary button",
+ },
+ additional_button: {
+ label: "test additional button",
+ style: "secondary",
+ flow: "column",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(
+ wrapper.find(".additional-cta-container[flow='column']").exists(),
+ true
+ );
+ });
+
+ it("should render disabled primary button if activeMultiSelect is in disabled property", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ primary_button: {
+ label: "test primary button",
+ disabled: "activeMultiSelect",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.isTrue(wrapper.find("button.primary[disabled]").exists());
+ });
+
+ it("should render disabled secondary button if activeMultiSelect is in disabled property", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ secondary_button: {
+ label: "test secondary button",
+ disabled: "activeMultiSelect",
+ },
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.isTrue(wrapper.find("button.secondary[disabled]").exists());
+ });
+
+ it("should not render a progress bar if there is 1 step", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ progress_bar: true,
+ },
+ isSingleScreen: true,
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".steps.progress-bar").exists(), false);
+ });
+
+ it("should not render a steps indicator if steps indicator is force hidden", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ },
+ forceHideStepsIndicator: true,
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".steps").exists(), false);
+ });
+
+ it("should render a steps indicator above action buttons", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ progress_bar: true,
+ primary_button: {},
+ },
+ aboveButtonStepsIndicator: true,
+ totalNumberOfScreens: 2,
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+
+ const stepsIndicator = wrapper.find(".steps");
+ assert.ok(stepsIndicator, true);
+
+ const stepsDOMNode = stepsIndicator.getDOMNode();
+ const siblingElement = stepsDOMNode.nextElementSibling;
+ assert.equal(siblingElement.classList.contains("action-buttons"), true);
+ });
+
+ it("should render a progress bar if there are 2 steps", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ progress_bar: true,
+ },
+ totalNumberOfScreens: 2,
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find(".steps.progress-bar").exists(), true);
+ });
+
+ it("should render confirmation-screen if layout property is set to inline", () => {
+ const SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ layout: "inline",
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ assert.equal(wrapper.find("[layout='inline']").exists(), true);
+ });
+
+ it("should render an inline image with alt text and height property", async () => {
+ const SCREEN_PROPS = {
+ content: {
+ above_button_content: [
+ {
+ type: "image",
+ url: "https://example.com/test.svg",
+ height: "auto",
+ alt_text: "test alt text",
+ },
+ ],
+ },
+ };
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ const imageEl = wrapper.find(".inline-image img");
+ assert.equal(imageEl.exists(), true);
+ assert.propertyVal(imageEl.prop("style"), "height", "auto");
+ const altTextCointainer = wrapper.find(".sr-only");
+ assert.equal(altTextCointainer.contains("test alt text"), true);
+ });
+
+ it("should render multiple inline elements in correct order", async () => {
+ const SCREEN_PROPS = {
+ content: {
+ above_button_content: [
+ {
+ type: "image",
+ url: "https://example.com/test.svg",
+ height: "auto",
+ alt_text: "test alt text",
+ },
+ {
+ type: "text",
+ text: {
+ string_id: "test-string-id",
+ },
+ link_keys: ["privacy_policy", "terms_of_use"],
+ },
+ {
+ type: "image",
+ url: "https://example.com/test_2.svg",
+ height: "auto",
+ alt_text: "test alt text 2",
+ },
+ {
+ type: "text",
+ text: {
+ string_id: "test-string-id-2",
+ },
+ link_keys: ["privacy_policy", "terms_of_use"],
+ },
+ ],
+ },
+ };
+
+ const wrapper = mount(<MultiStageProtonScreen {...SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ const imageEl = wrapper.find(".inline-image img");
+ const textEl = wrapper.find(".link-paragraph");
+
+ assert.equal(imageEl.length, 2);
+ assert.equal(textEl.length, 2);
+
+ assert.equal(imageEl.at(0).prop("src"), "https://example.com/test.svg");
+ assert.equal(imageEl.at(1).prop("src"), "https://example.com/test_2.svg");
+
+ assert.equal(textEl.at(0).prop("data-l10n-id"), "test-string-id");
+ assert.equal(textEl.at(1).prop("data-l10n-id"), "test-string-id-2");
+ });
+ });
+
+ describe("AboutWelcomeDefaults for proton", () => {
+ const getData = () => AboutWelcomeDefaults.getDefaults();
+
+ async function prepConfig(config, evalFalseScreenIds) {
+ let data = await getData();
+
+ if (evalFalseScreenIds?.length) {
+ data.screens.forEach(async screen => {
+ if (evalFalseScreenIds.includes(screen.id)) {
+ screen.targeting = false;
+ }
+ });
+ data.screens = await AWScreenUtils.evaluateTargetingAndRemoveScreens(
+ data.screens
+ );
+ }
+
+ return AboutWelcomeDefaults.prepareContentForReact({
+ ...data,
+ ...config,
+ });
+ }
+ beforeEach(() => {
+ sandbox.stub(global.Services.prefs, "getBoolPref").returns(true);
+ sandbox.stub(AWScreenUtils, "evaluateScreenTargeting").returnsArg(0);
+ // This is necessary because there are still screens being removed with
+ // `removeScreens` in `prepareContentForReact()`. Once we've migrated
+ // to using screen targeting instead of manually removing screens,
+ // we can remove this stub.
+ sandbox
+ .stub(global.AWScreenUtils, "removeScreens")
+ .callsFake((screens, callback) =>
+ AWScreenUtils.removeScreens(screens, callback)
+ );
+ });
+ it("should have a multi action primary button by default", async () => {
+ const data = await prepConfig({}, ["AW_WELCOME_BACK"]);
+ assert.propertyVal(
+ data.screens[0].content.primary_button.action,
+ "type",
+ "MULTI_ACTION"
+ );
+ });
+ it("should have a FxA button", async () => {
+ const data = await prepConfig({}, ["AW_WELCOME_BACK"]);
+
+ assert.notProperty(data, "skipFxA");
+ assert.property(data.screens[0].content, "secondary_button_top");
+ });
+ it("should remove the FxA button if pref disabled", async () => {
+ global.Services.prefs.getBoolPref.returns(false);
+
+ const data = await prepConfig();
+
+ assert.property(data, "skipFxA", true);
+ assert.notProperty(data.screens[0].content, "secondary_button_top");
+ });
+ });
+
+ describe("AboutWelcomeDefaults for MR split template proton", () => {
+ const getData = () => AboutWelcomeDefaults.getDefaults(true);
+ beforeEach(() => {
+ sandbox.stub(global.Services.prefs, "getBoolPref").returns(true);
+ });
+
+ it("should use 'split' position template by default", async () => {
+ const data = await getData();
+ assert.propertyVal(data.screens[0].content, "position", "split");
+ });
+
+ it("should not include noodles by default", async () => {
+ const data = await getData();
+ assert.notProperty(data.screens[0].content, "has_noodles");
+ });
+ });
+
+ describe("AboutWelcomeDefaults prepareMobileDownload", () => {
+ const TEST_CONTENT = {
+ screens: [
+ {
+ id: "AW_MOBILE_DOWNLOAD",
+ content: {
+ title: "test",
+ hero_image: {
+ url: "https://example.com/test.svg",
+ },
+ cta_paragraph: {
+ text: {},
+ action: {},
+ },
+ },
+ },
+ ],
+ };
+ it("should not set url for default qrcode svg", async () => {
+ sandbox.stub(global.AppConstants, "isChinaRepack").returns(false);
+ const data = await AboutWelcomeDefaults.prepareContentForReact(
+ TEST_CONTENT
+ );
+ assert.propertyVal(
+ data.screens[0].content.hero_image,
+ "url",
+ "https://example.com/test.svg"
+ );
+ });
+ it("should set url for cn qrcode svg", async () => {
+ sandbox.stub(global.AppConstants, "isChinaRepack").returns(true);
+ const data = await AboutWelcomeDefaults.prepareContentForReact(
+ TEST_CONTENT
+ );
+ assert.propertyVal(
+ data.screens[0].content.hero_image,
+ "url",
+ "https://example.com/test-cn.svg"
+ );
+ });
+ });
+
+ describe("AboutWelcomeDefaults prepareContentForReact", () => {
+ it("should not set action without screens", async () => {
+ const data = await AboutWelcomeDefaults.prepareContentForReact({
+ ua: "test",
+ });
+
+ assert.propertyVal(data, "ua", "test");
+ assert.notProperty(data, "screens");
+ });
+ it("should set action for import action", async () => {
+ const TEST_CONTENT = {
+ ua: "test",
+ screens: [
+ {
+ id: "AW_IMPORT_SETTINGS",
+ content: {
+ primary_button: {
+ action: {
+ type: "SHOW_MIGRATION_WIZARD",
+ },
+ },
+ },
+ },
+ ],
+ };
+ const data = await AboutWelcomeDefaults.prepareContentForReact(
+ TEST_CONTENT
+ );
+ assert.propertyVal(data, "ua", "test");
+ assert.propertyVal(
+ data.screens[0].content.primary_button.action.data,
+ "source",
+ "test"
+ );
+ });
+ it("should not set action if the action type != SHOW_MIGRATION_WIZARD", async () => {
+ const TEST_CONTENT = {
+ ua: "test",
+ screens: [
+ {
+ id: "AW_IMPORT_SETTINGS",
+ content: {
+ primary_button: {
+ action: {
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ data: {},
+ },
+ },
+ },
+ },
+ ],
+ };
+ const data = await AboutWelcomeDefaults.prepareContentForReact(
+ TEST_CONTENT
+ );
+ assert.propertyVal(data, "ua", "test");
+ assert.notPropertyVal(
+ data.screens[0].content.primary_button.action.data,
+ "source",
+ "test"
+ );
+ });
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/MultiStageAboutWelcome.test.jsx b/browser/components/aboutwelcome/tests/unit/MultiStageAboutWelcome.test.jsx
new file mode 100644
index 0000000000..b4593a45f3
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/MultiStageAboutWelcome.test.jsx
@@ -0,0 +1,859 @@
+import { GlobalOverrider } from "newtab/test/unit/utils";
+import {
+ MultiStageAboutWelcome,
+ SecondaryCTA,
+ StepsIndicator,
+ ProgressBar,
+ WelcomeScreen,
+} from "content-src/components/MultiStageAboutWelcome";
+import { Themes } from "content-src/components/Themes";
+import React from "react";
+import { shallow, mount } from "enzyme";
+import { AboutWelcomeDefaults } from "modules/AboutWelcomeDefaults.sys.mjs";
+import { AboutWelcomeUtils } from "content-src/lib/aboutwelcome-utils.mjs";
+
+describe("MultiStageAboutWelcome module", () => {
+ let globals;
+ let sandbox;
+
+ const DEFAULT_PROPS = {
+ defaultScreens: AboutWelcomeDefaults.getDefaults().screens,
+ metricsFlowUri: "http://localhost/",
+ message_id: "DEFAULT_ABOUTWELCOME",
+ utm_term: "default",
+ startScreen: 0,
+ };
+
+ beforeEach(async () => {
+ globals = new GlobalOverrider();
+ globals.set({
+ AWGetSelectedTheme: () => Promise.resolve("automatic"),
+ AWSendEventTelemetry: () => {},
+ AWWaitForMigrationClose: () => Promise.resolve(),
+ AWSelectTheme: () => Promise.resolve(),
+ AWFinish: () => Promise.resolve(),
+ });
+ sandbox = sinon.createSandbox();
+ });
+
+ afterEach(() => {
+ sandbox.restore();
+ globals.restore();
+ });
+
+ describe("MultiStageAboutWelcome functional component", () => {
+ it("should render MultiStageAboutWelcome", () => {
+ const wrapper = shallow(<MultiStageAboutWelcome {...DEFAULT_PROPS} />);
+
+ assert.ok(wrapper.exists());
+ });
+
+ it("should pass activeTheme and initialTheme props to WelcomeScreen", async () => {
+ let wrapper = mount(<MultiStageAboutWelcome {...DEFAULT_PROPS} />);
+ // Spin the event loop to allow the useEffect hooks to execute,
+ // any promises to resolve, and re-rendering to happen after the
+ // promises have updated the state/props
+ await new Promise(resolve => setTimeout(resolve, 0));
+ // sync up enzyme's representation with the real DOM
+ wrapper.update();
+
+ let welcomeScreenWrapper = wrapper.find(WelcomeScreen);
+ assert.strictEqual(welcomeScreenWrapper.prop("activeTheme"), "automatic");
+ assert.strictEqual(
+ welcomeScreenWrapper.prop("initialTheme"),
+ "automatic"
+ );
+ });
+
+ it("should handle primary Action", () => {
+ const screens = [
+ {
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ primary_button: {
+ label: "Test button",
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ ];
+
+ const PRIMARY_ACTION_PROPS = {
+ defaultScreens: screens,
+ metricsFlowUri: "http://localhost/",
+ message_id: "DEFAULT_ABOUTWELCOME",
+ utm_term: "default",
+ startScreen: 0,
+ };
+
+ const stub = sinon.stub(AboutWelcomeUtils, "sendActionTelemetry");
+ let wrapper = mount(<MultiStageAboutWelcome {...PRIMARY_ACTION_PROPS} />);
+ wrapper.update();
+
+ let welcomeScreenWrapper = wrapper.find(WelcomeScreen);
+ const btnPrimary = welcomeScreenWrapper.find(".primary");
+ btnPrimary.simulate("click");
+ assert.calledOnce(stub);
+ assert.equal(
+ stub.firstCall.args[0],
+ welcomeScreenWrapper.props().messageId
+ );
+ assert.equal(stub.firstCall.args[1], "primary_button");
+ stub.restore();
+ });
+
+ it("should autoAdvance on last screen and send appropriate telemetry", () => {
+ let clock = sinon.useFakeTimers();
+ const screens = [
+ {
+ auto_advance: "primary_button",
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ primary_button: {
+ label: "Test Button",
+ action: {
+ navigate: true,
+ },
+ },
+ },
+ },
+ ];
+ const AUTO_ADVANCE_PROPS = {
+ defaultScreens: screens,
+ metricsFlowUri: "http://localhost/",
+ message_id: "DEFAULT_ABOUTWELCOME",
+ utm_term: "default",
+ startScreen: 0,
+ };
+ const wrapper = mount(<MultiStageAboutWelcome {...AUTO_ADVANCE_PROPS} />);
+ wrapper.update();
+ const finishStub = sandbox.stub(global, "AWFinish");
+ const telemetryStub = sinon.stub(
+ AboutWelcomeUtils,
+ "sendActionTelemetry"
+ );
+
+ assert.notCalled(finishStub);
+ clock.tick(20001);
+ assert.calledOnce(finishStub);
+ assert.calledOnce(telemetryStub);
+ assert.equal(telemetryStub.lastCall.args[2], "AUTO_ADVANCE");
+ clock.restore();
+ finishStub.restore();
+ telemetryStub.restore();
+ });
+
+ it("should send telemetry ping on collectSelect", () => {
+ const screens = [
+ {
+ id: "EASY_SETUP_TEST",
+ content: {
+ tiles: {
+ type: "multiselect",
+ data: [
+ {
+ id: "checkbox-1",
+ defaultValue: true,
+ },
+ ],
+ },
+ primary_button: {
+ label: "Test Button",
+ action: {
+ collectSelect: true,
+ },
+ },
+ },
+ },
+ ];
+ const EASY_SETUP_PROPS = {
+ defaultScreens: screens,
+ message_id: "DEFAULT_ABOUTWELCOME",
+ startScreen: 0,
+ };
+ const stub = sinon.stub(AboutWelcomeUtils, "sendActionTelemetry");
+ let wrapper = mount(<MultiStageAboutWelcome {...EASY_SETUP_PROPS} />);
+ wrapper.update();
+
+ let welcomeScreenWrapper = wrapper.find(WelcomeScreen);
+ const btnPrimary = welcomeScreenWrapper.find(".primary");
+ btnPrimary.simulate("click");
+ assert.calledTwice(stub);
+ assert.equal(
+ stub.firstCall.args[0],
+ welcomeScreenWrapper.props().messageId
+ );
+ assert.equal(stub.firstCall.args[1], "primary_button");
+ assert.equal(
+ stub.lastCall.args[0],
+ welcomeScreenWrapper.props().messageId
+ );
+ assert.ok(stub.lastCall.args[1].includes("checkbox-1"));
+ assert.equal(stub.lastCall.args[2], "SELECT_CHECKBOX");
+ stub.restore();
+ });
+ });
+
+ describe("WelcomeScreen component", () => {
+ describe("easy setup screen", () => {
+ const screen = AboutWelcomeDefaults.getDefaults().screens.find(
+ s => s.id === "AW_EASY_SETUP_NEEDS_DEFAULT_AND_PIN"
+ );
+ let EASY_SETUP_SCREEN_PROPS;
+
+ beforeEach(() => {
+ EASY_SETUP_SCREEN_PROPS = {
+ id: screen.id,
+ content: screen.content,
+ messageId: `${DEFAULT_PROPS.message_id}_${screen.id}`,
+ UTMTerm: DEFAULT_PROPS.utm_term,
+ flowParams: null,
+ totalNumberOfScreens: 1,
+ setScreenMultiSelects: sandbox.stub(),
+ setActiveMultiSelect: sandbox.stub(),
+ };
+ });
+
+ it("should render Easy Setup screen", () => {
+ const wrapper = shallow(<WelcomeScreen {...EASY_SETUP_SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ });
+
+ it("should render secondary.top button", () => {
+ let SCREEN_PROPS = {
+ content: {
+ title: "Step",
+ secondary_button_top: {
+ text: "test",
+ label: "test label",
+ },
+ },
+ position: "top",
+ };
+ const wrapper = mount(<SecondaryCTA {...SCREEN_PROPS} />);
+ assert.ok(wrapper.find("div.secondary-cta.top").exists());
+ });
+
+ it("should render the arrow icon in the secondary button", () => {
+ let SCREEN_PROPS = {
+ content: {
+ title: "Step",
+ secondary_button: {
+ has_arrow_icon: true,
+ label: "test label",
+ },
+ },
+ };
+ const wrapper = mount(<SecondaryCTA {...SCREEN_PROPS} />);
+ assert.ok(wrapper.find("button.arrow-icon").exists());
+ });
+
+ it("should render steps indicator", () => {
+ let PROPS = { totalNumberOfScreens: 1 };
+ const wrapper = mount(<StepsIndicator {...PROPS} />);
+ assert.ok(wrapper.find("div.indicator").exists());
+ });
+
+ it("should assign the total number of screens and current screen to the aria-valuemax and aria-valuenow labels", () => {
+ const EXTRA_PROPS = { totalNumberOfScreens: 3, order: 1 };
+ const wrapper = mount(
+ <WelcomeScreen {...EASY_SETUP_SCREEN_PROPS} {...EXTRA_PROPS} />
+ );
+
+ const steps = wrapper.find(`div.steps`);
+ assert.ok(steps.exists());
+ const { attributes } = steps.getDOMNode();
+ assert.equal(
+ parseInt(attributes.getNamedItem("aria-valuemax").value, 10),
+ EXTRA_PROPS.totalNumberOfScreens
+ );
+ assert.equal(
+ parseInt(attributes.getNamedItem("aria-valuenow").value, 10),
+ EXTRA_PROPS.order + 1
+ );
+ });
+
+ it("should render progress bar", () => {
+ let SCREEN_PROPS = {
+ step: 1,
+ previousStep: 0,
+ totalNumberOfScreens: 2,
+ };
+ const wrapper = mount(<ProgressBar {...SCREEN_PROPS} />);
+ assert.ok(wrapper.find("div.indicator").exists());
+ assert.propertyVal(
+ wrapper.find("div.indicator").prop("style"),
+ "--progress-bar-progress",
+ "50%"
+ );
+ });
+
+ it("should have a primary, secondary and secondary.top button in the rendered input", () => {
+ const wrapper = mount(<WelcomeScreen {...EASY_SETUP_SCREEN_PROPS} />);
+ assert.ok(wrapper.find(".primary").exists());
+ assert.ok(
+ wrapper
+ .find(".secondary-cta button.secondary[value='secondary_button']")
+ .exists()
+ );
+ assert.ok(
+ wrapper
+ .find(
+ ".secondary-cta.top button.secondary[value='secondary_button_top']"
+ )
+ .exists()
+ );
+ });
+ });
+
+ describe("theme screen", () => {
+ const THEME_SCREEN_PROPS = {
+ id: "test-theme-screen",
+ totalNumberOfScreens: 1,
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ tiles: {
+ type: "theme",
+ action: {
+ theme: "<event>",
+ },
+ data: [
+ {
+ theme: "automatic",
+ label: "test-label",
+ tooltip: "test-tooltip",
+ description: "test-description",
+ },
+ ],
+ },
+ primary_button: {
+ action: {},
+ label: "test button",
+ },
+ },
+ navigate: null,
+ messageId: `${DEFAULT_PROPS.message_id}_"test-theme-screen"`,
+ UTMTerm: DEFAULT_PROPS.utm_term,
+ flowParams: null,
+ activeTheme: "automatic",
+ };
+
+ it("should render WelcomeScreen", () => {
+ const wrapper = shallow(<WelcomeScreen {...THEME_SCREEN_PROPS} />);
+
+ assert.ok(wrapper.exists());
+ });
+
+ it("should check this.props.activeTheme in the rendered input", () => {
+ const wrapper = shallow(<Themes {...THEME_SCREEN_PROPS} />);
+
+ const selectedThemeInput = wrapper.find(".theme input[checked=true]");
+ assert.strictEqual(
+ selectedThemeInput.prop("value"),
+ THEME_SCREEN_PROPS.activeTheme
+ );
+ });
+ });
+ describe("import screen", () => {
+ const IMPORT_SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ },
+ };
+ it("should render ImportScreen", () => {
+ const wrapper = mount(<WelcomeScreen {...IMPORT_SCREEN_PROPS} />);
+ assert.ok(wrapper.exists());
+ });
+ it("should not have a primary or secondary button", () => {
+ const wrapper = mount(<WelcomeScreen {...IMPORT_SCREEN_PROPS} />);
+ assert.isFalse(wrapper.find(".primary").exists());
+ assert.isFalse(
+ wrapper.find(".secondary button[value='secondary_button']").exists()
+ );
+ assert.isFalse(
+ wrapper
+ .find(".secondary button[value='secondary_button_top']")
+ .exists()
+ );
+ });
+ });
+ describe("#handleAction", () => {
+ let SCREEN_PROPS;
+ let TEST_ACTION;
+ beforeEach(() => {
+ SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ primary_button: {
+ action: {},
+ label: "test button",
+ },
+ },
+ navigate: sandbox.stub(),
+ setActiveTheme: sandbox.stub(),
+ UTMTerm: "you_tee_emm",
+ };
+ TEST_ACTION = SCREEN_PROPS.content.primary_button.action;
+ sandbox.stub(AboutWelcomeUtils, "handleUserAction").resolves();
+ });
+ it("should handle navigate", () => {
+ TEST_ACTION.navigate = true;
+ const wrapper = mount(<WelcomeScreen {...SCREEN_PROPS} />);
+
+ wrapper.find(".primary").simulate("click");
+
+ assert.calledOnce(SCREEN_PROPS.navigate);
+ });
+ it("should handle theme", () => {
+ TEST_ACTION.theme = "test";
+ const wrapper = mount(<WelcomeScreen {...SCREEN_PROPS} />);
+
+ wrapper.find(".primary").simulate("click");
+
+ assert.calledWith(SCREEN_PROPS.setActiveTheme, "test");
+ });
+ it("should handle dismiss", () => {
+ SCREEN_PROPS.content.dismiss_button = {
+ action: { dismiss: true },
+ };
+ const finishStub = sandbox.stub(global, "AWFinish");
+ const wrapper = mount(<WelcomeScreen {...SCREEN_PROPS} />);
+
+ wrapper.find(".dismiss-button").simulate("click");
+
+ assert.calledOnce(finishStub);
+ });
+ it("should handle SHOW_FIREFOX_ACCOUNTS", () => {
+ TEST_ACTION.type = "SHOW_FIREFOX_ACCOUNTS";
+ const wrapper = mount(<WelcomeScreen {...SCREEN_PROPS} />);
+
+ wrapper.find(".primary").simulate("click");
+
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ data: {
+ extraParams: {
+ utm_campaign: "firstrun",
+ utm_medium: "referral",
+ utm_source: "activity-stream",
+ utm_term: "you_tee_emm-screen",
+ },
+ },
+ type: "SHOW_FIREFOX_ACCOUNTS",
+ });
+ });
+ it("should handle OPEN_URL", () => {
+ TEST_ACTION.type = "OPEN_URL";
+ TEST_ACTION.data = {
+ args: "https://example.com?utm_campaign=test-campaign",
+ };
+ TEST_ACTION.addFlowParams = true;
+ let flowBeginTime = Date.now();
+ const wrapper = mount(
+ <WelcomeScreen
+ {...SCREEN_PROPS}
+ flowParams={{
+ deviceId: "test-device-id",
+ flowId: "test-flow-id",
+ flowBeginTime,
+ }}
+ />
+ );
+
+ wrapper.find(".primary").simulate("click");
+
+ let [handledAction] = AboutWelcomeUtils.handleUserAction.firstCall.args;
+ assert.equal(handledAction.type, "OPEN_URL");
+ let { searchParams } = new URL(handledAction.data.args);
+ assert.equal(searchParams.get("utm_campaign"), "test-campaign");
+ assert.equal(searchParams.get("utm_medium"), "referral");
+ assert.equal(searchParams.get("utm_source"), "activity-stream");
+ assert.equal(searchParams.get("utm_term"), "you_tee_emm-screen");
+ assert.equal(searchParams.get("device_id"), "test-device-id");
+ assert.equal(searchParams.get("flow_id"), "test-flow-id");
+ assert.equal(
+ searchParams.get("flow_begin_time"),
+ flowBeginTime.toString()
+ );
+ });
+ it("should handle SHOW_MIGRATION_WIZARD", () => {
+ TEST_ACTION.type = "SHOW_MIGRATION_WIZARD";
+ const wrapper = mount(<WelcomeScreen {...SCREEN_PROPS} />);
+
+ wrapper.find(".primary").simulate("click");
+
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ type: "SHOW_MIGRATION_WIZARD",
+ });
+ });
+ it("should handle SHOW_MIGRATION_WIZARD INSIDE MULTI_ACTION", async () => {
+ const migrationCloseStub = sandbox.stub(
+ global,
+ "AWWaitForMigrationClose"
+ );
+ const MULTI_ACTION_SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ primary_button: {
+ action: {
+ type: "MULTI_ACTION",
+ navigate: true,
+ data: {
+ actions: [
+ {
+ type: "PIN_FIREFOX_TO_TASKBAR",
+ },
+ {
+ type: "SET_DEFAULT_BROWSER",
+ },
+ {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: {},
+ },
+ ],
+ },
+ },
+ label: "test button",
+ },
+ },
+ navigate: sandbox.stub(),
+ };
+ const wrapper = mount(<WelcomeScreen {...MULTI_ACTION_SCREEN_PROPS} />);
+
+ wrapper.find(".primary").simulate("click");
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ type: "MULTI_ACTION",
+ navigate: true,
+ data: {
+ actions: [
+ {
+ type: "PIN_FIREFOX_TO_TASKBAR",
+ },
+ {
+ type: "SET_DEFAULT_BROWSER",
+ },
+ {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: {},
+ },
+ ],
+ },
+ });
+ // handleUserAction returns a Promise, so let's let the microtask queue
+ // flush so that anything waiting for the handleUserAction Promise to
+ // resolve can run.
+ await new Promise(resolve => queueMicrotask(resolve));
+ assert.calledOnce(migrationCloseStub);
+ });
+
+ it("should handle SHOW_MIGRATION_WIZARD INSIDE NESTED MULTI_ACTION", async () => {
+ const migrationCloseStub = sandbox.stub(
+ global,
+ "AWWaitForMigrationClose"
+ );
+ const MULTI_ACTION_SCREEN_PROPS = {
+ content: {
+ title: "test title",
+ subtitle: "test subtitle",
+ primary_button: {
+ action: {
+ type: "MULTI_ACTION",
+ navigate: true,
+ data: {
+ actions: [
+ {
+ type: "PIN_FIREFOX_TO_TASKBAR",
+ },
+ {
+ type: "SET_DEFAULT_BROWSER",
+ },
+ {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ },
+ {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: {},
+ },
+ ],
+ },
+ },
+ ],
+ },
+ },
+ label: "test button",
+ },
+ },
+ navigate: sandbox.stub(),
+ };
+ const wrapper = mount(<WelcomeScreen {...MULTI_ACTION_SCREEN_PROPS} />);
+
+ wrapper.find(".primary").simulate("click");
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ type: "MULTI_ACTION",
+ navigate: true,
+ data: {
+ actions: [
+ {
+ type: "PIN_FIREFOX_TO_TASKBAR",
+ },
+ {
+ type: "SET_DEFAULT_BROWSER",
+ },
+ {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ },
+ {
+ type: "SHOW_MIGRATION_WIZARD",
+ data: {},
+ },
+ ],
+ },
+ },
+ ],
+ },
+ });
+ // handleUserAction returns a Promise, so let's let the microtask queue
+ // flush so that anything waiting for the handleUserAction Promise to
+ // resolve can run.
+ await new Promise(resolve => queueMicrotask(resolve));
+ assert.calledOnce(migrationCloseStub);
+ });
+ it("should unset prefs from unchecked checkboxes", () => {
+ const PREF_SCREEN_PROPS = {
+ content: {
+ title: "Checkboxes",
+ tiles: {
+ type: "multiselect",
+ data: [
+ {
+ id: "checkbox-1",
+ label: "checkbox 1",
+ checkedAction: {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "pref-a",
+ value: true,
+ },
+ },
+ },
+ uncheckedAction: {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "pref-a",
+ },
+ },
+ },
+ },
+ {
+ id: "checkbox-2",
+ label: "checkbox 2",
+ checkedAction: {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "pref-b",
+ value: "pref-b",
+ },
+ },
+ },
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "pref-c",
+ value: 3,
+ },
+ },
+ },
+ ],
+ },
+ },
+ uncheckedAction: {
+ type: "SET_PREF",
+ data: {
+ pref: { name: "pref-b" },
+ },
+ },
+ },
+ ],
+ },
+ primary_button: {
+ label: "Set Prefs",
+ action: {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ isDynamic: true,
+ navigate: true,
+ data: {
+ actions: [],
+ },
+ },
+ },
+ },
+ navigate: sandbox.stub(),
+ setScreenMultiSelects: sandbox.stub(),
+ setActiveMultiSelect: sandbox.stub(),
+ };
+
+ // No checkboxes checked. All prefs will be unset and pref-c will not be
+ // reset.
+ {
+ const wrapper = mount(
+ <WelcomeScreen {...PREF_SCREEN_PROPS} activeMultiSelect={[]} />
+ );
+ wrapper.find(".primary").simulate("click");
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ isDynamic: true,
+ navigate: true,
+ data: {
+ actions: [
+ { type: "SET_PREF", data: { pref: { name: "pref-a" } } },
+ { type: "SET_PREF", data: { pref: { name: "pref-b" } } },
+ ],
+ },
+ });
+
+ AboutWelcomeUtils.handleUserAction.resetHistory();
+ }
+
+ // The first checkbox is checked. Only pref-a will be set and pref-c
+ // will not be reset.
+ {
+ const wrapper = mount(
+ <WelcomeScreen
+ {...PREF_SCREEN_PROPS}
+ activeMultiSelect={["checkbox-1"]}
+ />
+ );
+ wrapper.find(".primary").simulate("click");
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ isDynamic: true,
+ navigate: true,
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: {
+ pref: {
+ name: "pref-a",
+ value: true,
+ },
+ },
+ },
+ { type: "SET_PREF", data: { pref: { name: "pref-b" } } },
+ ],
+ },
+ });
+
+ AboutWelcomeUtils.handleUserAction.resetHistory();
+ }
+
+ // The second checkbox is checked. Prefs pref-b and pref-c will be set.
+ {
+ const wrapper = mount(
+ <WelcomeScreen
+ {...PREF_SCREEN_PROPS}
+ activeMultiSelect={["checkbox-2"]}
+ />
+ );
+ wrapper.find(".primary").simulate("click");
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ isDynamic: true,
+ navigate: true,
+ data: {
+ actions: [
+ { type: "SET_PREF", data: { pref: { name: "pref-a" } } },
+ {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: { pref: { name: "pref-b", value: "pref-b" } },
+ },
+ {
+ type: "SET_PREF",
+ data: { pref: { name: "pref-c", value: 3 } },
+ },
+ ],
+ },
+ },
+ ],
+ },
+ });
+
+ AboutWelcomeUtils.handleUserAction.resetHistory();
+ }
+
+ // // Both checkboxes are checked. All prefs will be set.
+ {
+ const wrapper = mount(
+ <WelcomeScreen
+ {...PREF_SCREEN_PROPS}
+ activeMultiSelect={["checkbox-1", "checkbox-2"]}
+ />
+ );
+ wrapper.find(".primary").simulate("click");
+ assert.calledWith(AboutWelcomeUtils.handleUserAction, {
+ type: "MULTI_ACTION",
+ collectSelect: true,
+ isDynamic: true,
+ navigate: true,
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: { pref: { name: "pref-a", value: true } },
+ },
+ {
+ type: "MULTI_ACTION",
+ data: {
+ actions: [
+ {
+ type: "SET_PREF",
+ data: { pref: { name: "pref-b", value: "pref-b" } },
+ },
+ {
+ type: "SET_PREF",
+ data: { pref: { name: "pref-c", value: 3 } },
+ },
+ ],
+ },
+ },
+ ],
+ },
+ });
+
+ AboutWelcomeUtils.handleUserAction.resetHistory();
+ }
+ });
+ });
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/OnboardingVideoTest.test.jsx b/browser/components/aboutwelcome/tests/unit/OnboardingVideoTest.test.jsx
new file mode 100644
index 0000000000..078c8e17c4
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/OnboardingVideoTest.test.jsx
@@ -0,0 +1,45 @@
+import React from "react";
+import { mount } from "enzyme";
+import { OnboardingVideo } from "content-src/components/OnboardingVideo";
+
+describe("OnboardingVideo component", () => {
+ let sandbox;
+
+ beforeEach(async () => {
+ sandbox = sinon.createSandbox();
+ });
+
+ afterEach(() => {
+ sandbox.restore();
+ });
+
+ const SCREEN_PROPS = {
+ content: {
+ title: "Test title",
+ video_container: {
+ video_url: "test url",
+ },
+ },
+ };
+
+ it("should handle video_start action when video is played", () => {
+ const handleAction = sandbox.stub();
+ const wrapper = mount(
+ <OnboardingVideo handleAction={handleAction} {...SCREEN_PROPS} />
+ );
+ wrapper.find("video").simulate("play");
+ assert.calledWith(handleAction, {
+ currentTarget: { value: "video_start" },
+ });
+ });
+ it("should handle video_end action when video has completed playing", () => {
+ const handleAction = sandbox.stub();
+ const wrapper = mount(
+ <OnboardingVideo handleAction={handleAction} {...SCREEN_PROPS} />
+ );
+ wrapper.find("video").simulate("ended");
+ assert.calledWith(handleAction, {
+ currentTarget: { value: "video_end" },
+ });
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/addUtmParams.test.js b/browser/components/aboutwelcome/tests/unit/addUtmParams.test.js
new file mode 100644
index 0000000000..2c078b4f49
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/addUtmParams.test.js
@@ -0,0 +1,34 @@
+import { addUtmParams, BASE_PARAMS } from "content-src/lib/addUtmParams.mjs";
+
+describe("addUtmParams", () => {
+ const originalBaseParams = JSON.parse(JSON.stringify(BASE_PARAMS));
+ afterEach(() => Object.assign(BASE_PARAMS, originalBaseParams));
+ it("should convert a string URL", () => {
+ const result = addUtmParams("https://foo.com", "foo");
+ assert.equal(result.hostname, "foo.com");
+ });
+ it("should add all base params", () => {
+ assert.match(
+ addUtmParams(new URL("https://foo.com"), "foo").toString(),
+ /utm_source=activity-stream&utm_campaign=firstrun&utm_medium=referral/
+ );
+ });
+ it("should allow updating base params utm values", () => {
+ BASE_PARAMS.utm_campaign = "firstrun-default";
+ assert.match(
+ addUtmParams(new URL("https://foo.com"), "foo", "default").toString(),
+ /utm_source=activity-stream&utm_campaign=firstrun-default&utm_medium=referral/
+ );
+ });
+ it("should add utm_term", () => {
+ const params = addUtmParams(new URL("https://foo.com"), "foo").searchParams;
+ assert.equal(params.get("utm_term"), "foo", "utm_term");
+ });
+ it("should not override the URL's existing utm param values", () => {
+ const url = new URL("https://foo.com/?utm_source=foo&utm_campaign=bar");
+ const params = addUtmParams(url, "foo").searchParams;
+ assert.equal(params.get("utm_source"), "foo", "utm_source");
+ assert.equal(params.get("utm_campaign"), "bar", "utm_campaign");
+ assert.equal(params.get("utm_medium"), "referral", "utm_medium");
+ });
+});
diff --git a/browser/components/aboutwelcome/tests/unit/unit-entry.js b/browser/components/aboutwelcome/tests/unit/unit-entry.js
new file mode 100644
index 0000000000..fb70eeb843
--- /dev/null
+++ b/browser/components/aboutwelcome/tests/unit/unit-entry.js
@@ -0,0 +1,716 @@
+import {
+ EventEmitter,
+ FakePrefs,
+ FakensIPrefService,
+ GlobalOverrider,
+ FakeConsoleAPI,
+ FakeLogger,
+} from "newtab/test/unit/utils";
+import Adapter from "enzyme-adapter-react-16";
+import { chaiAssertions } from "newtab/test/schemas/pings";
+import enzyme from "enzyme";
+
+enzyme.configure({ adapter: new Adapter() });
+
+// Cause React warnings to make tests that trigger them fail
+const origConsoleError = console.error;
+console.error = function (msg, ...args) {
+ origConsoleError.apply(console, [msg, ...args]);
+
+ if (
+ /(Invalid prop|Failed prop type|Check the render method|React Intl)/.test(
+ msg
+ )
+ ) {
+ throw new Error(msg);
+ }
+};
+
+const req = require.context(".", true, /\.test\.jsx?$/);
+const files = req.keys();
+
+// This exposes sinon assertions to chai.assert
+sinon.assert.expose(assert, { prefix: "" });
+
+chai.use(chaiAssertions);
+
+const overrider = new GlobalOverrider();
+
+const RemoteSettings = name => ({
+ get: () => {
+ if (name === "attachment") {
+ return Promise.resolve([{ attachment: {} }]);
+ }
+ return Promise.resolve([]);
+ },
+ on: () => {},
+ off: () => {},
+});
+RemoteSettings.pollChanges = () => {};
+
+class JSWindowActorParent {
+ sendAsyncMessage(name, data) {
+ return { name, data };
+ }
+}
+
+class JSWindowActorChild {
+ sendAsyncMessage(name, data) {
+ return { name, data };
+ }
+
+ sendQuery(name, data) {
+ return Promise.resolve({ name, data });
+ }
+
+ get contentWindow() {
+ return {
+ Promise,
+ };
+ }
+}
+
+// Detect plain object passed to lazy getter APIs, and set its prototype to
+// global object, and return the global object for further modification.
+// Returns the object if it's not plain object.
+//
+// This is a workaround to make the existing testharness and testcase keep
+// working even after lazy getters are moved to plain `lazy` object.
+const cachedPlainObject = new Set();
+function updateGlobalOrObject(object) {
+ // Given this function modifies the prototype, and the following
+ // condition doesn't meet on the second call, cache the result.
+ if (cachedPlainObject.has(object)) {
+ return global;
+ }
+
+ if (Object.getPrototypeOf(object).constructor.name !== "Object") {
+ return object;
+ }
+
+ cachedPlainObject.add(object);
+ Object.setPrototypeOf(object, global);
+ return global;
+}
+
+const TEST_GLOBAL = {
+ JSWindowActorParent,
+ JSWindowActorChild,
+ AboutReaderParent: {
+ addMessageListener: (messageName, listener) => {},
+ removeMessageListener: (messageName, listener) => {},
+ },
+ AboutWelcomeTelemetry: class {
+ submitGleanPingForPing() {}
+ },
+ AddonManager: {
+ getActiveAddons() {
+ return Promise.resolve({ addons: [], fullData: false });
+ },
+ },
+ AppConstants: {
+ MOZILLA_OFFICIAL: true,
+ MOZ_APP_VERSION: "69.0a1",
+ isChinaRepack() {
+ return false;
+ },
+ isPlatformAndVersionAtMost() {
+ return false;
+ },
+ platform: "win",
+ },
+ ASRouterPreferences: {
+ console: new FakeConsoleAPI({
+ maxLogLevel: "off", // set this to "debug" or "all" to get more ASRouter logging in tests
+ prefix: "ASRouter",
+ }),
+ },
+ AWScreenUtils: {
+ evaluateTargetingAndRemoveScreens() {
+ return true;
+ },
+ async removeScreens() {
+ return true;
+ },
+ evaluateScreenTargeting() {
+ return true;
+ },
+ },
+ BrowserUtils: {
+ sendToDeviceEmailsSupported() {
+ return true;
+ },
+ },
+ UpdateUtils: { getUpdateChannel() {} },
+ BasePromiseWorker: class {
+ constructor() {
+ this.ExceptionHandlers = [];
+ }
+ post() {}
+ },
+ browserSearchRegion: "US",
+ BrowserWindowTracker: { getTopWindow() {} },
+ ChromeUtils: {
+ defineLazyGetter(object, name, f) {
+ updateGlobalOrObject(object)[name] = f();
+ },
+ defineModuleGetter: updateGlobalOrObject,
+ defineESModuleGetters: updateGlobalOrObject,
+ generateQI() {
+ return {};
+ },
+ import() {
+ return global;
+ },
+ importESModule() {
+ return global;
+ },
+ },
+ ClientEnvironment: {
+ get userId() {
+ return "foo123";
+ },
+ },
+ Components: {
+ Constructor(classId) {
+ switch (classId) {
+ case "@mozilla.org/referrer-info;1":
+ return function (referrerPolicy, sendReferrer, originalReferrer) {
+ this.referrerPolicy = referrerPolicy;
+ this.sendReferrer = sendReferrer;
+ this.originalReferrer = originalReferrer;
+ };
+ }
+ return function () {};
+ },
+ isSuccessCode: () => true,
+ },
+ ConsoleAPI: FakeConsoleAPI,
+ // NB: These are functions/constructors
+ // eslint-disable-next-line object-shorthand
+ ContentSearchUIController: function () {},
+ // eslint-disable-next-line object-shorthand
+ ContentSearchHandoffUIController: function () {},
+ Cc: {
+ "@mozilla.org/browser/nav-bookmarks-service;1": {
+ addObserver() {},
+ getService() {
+ return this;
+ },
+ removeObserver() {},
+ SOURCES: {},
+ TYPE_BOOKMARK: {},
+ },
+ "@mozilla.org/browser/nav-history-service;1": {
+ addObserver() {},
+ executeQuery() {},
+ getNewQuery() {},
+ getNewQueryOptions() {},
+ getService() {
+ return this;
+ },
+ insert() {},
+ markPageAsTyped() {},
+ removeObserver() {},
+ },
+ "@mozilla.org/io/string-input-stream;1": {
+ createInstance() {
+ return {};
+ },
+ },
+ "@mozilla.org/security/hash;1": {
+ createInstance() {
+ return {
+ init() {},
+ updateFromStream() {},
+ finish() {
+ return "0";
+ },
+ };
+ },
+ },
+ "@mozilla.org/updates/update-checker;1": { createInstance() {} },
+ "@mozilla.org/widget/useridleservice;1": {
+ getService() {
+ return {
+ idleTime: 0,
+ addIdleObserver() {},
+ removeIdleObserver() {},
+ };
+ },
+ },
+ "@mozilla.org/streamConverters;1": {
+ getService() {
+ return this;
+ },
+ },
+ "@mozilla.org/network/stream-loader;1": {
+ createInstance() {
+ return {};
+ },
+ },
+ },
+ Ci: {
+ nsICryptoHash: {},
+ nsIReferrerInfo: { UNSAFE_URL: 5 },
+ nsITimer: { TYPE_ONE_SHOT: 1 },
+ nsIWebProgressListener: { LOCATION_CHANGE_SAME_DOCUMENT: 1 },
+ nsIDOMWindow: Object,
+ nsITrackingDBService: {
+ TRACKERS_ID: 1,
+ TRACKING_COOKIES_ID: 2,
+ CRYPTOMINERS_ID: 3,
+ FINGERPRINTERS_ID: 4,
+ SOCIAL_ID: 5,
+ },
+ nsICookieBannerService: {
+ MODE_DISABLED: 0,
+ MODE_REJECT: 1,
+ MODE_REJECT_OR_ACCEPT: 2,
+ MODE_UNSET: 3,
+ },
+ },
+ Cu: {
+ importGlobalProperties() {},
+ now: () => window.performance.now(),
+ cloneInto: o => JSON.parse(JSON.stringify(o)),
+ },
+ console: {
+ ...console,
+ error() {},
+ },
+ dump() {},
+ EveryWindow: {
+ registerCallback: (id, init, uninit) => {},
+ unregisterCallback: id => {},
+ },
+ setTimeout: window.setTimeout.bind(window),
+ clearTimeout: window.clearTimeout.bind(window),
+ fetch() {},
+ // eslint-disable-next-line object-shorthand
+ Image: function () {}, // NB: This is a function/constructor
+ IOUtils: {
+ writeJSON() {
+ return Promise.resolve(0);
+ },
+ readJSON() {
+ return Promise.resolve({});
+ },
+ read() {
+ return Promise.resolve(new Uint8Array());
+ },
+ makeDirectory() {
+ return Promise.resolve(0);
+ },
+ write() {
+ return Promise.resolve(0);
+ },
+ exists() {
+ return Promise.resolve(0);
+ },
+ remove() {
+ return Promise.resolve(0);
+ },
+ stat() {
+ return Promise.resolve(0);
+ },
+ },
+ NewTabUtils: {
+ activityStreamProvider: {
+ getTopFrecentSites: () => [],
+ executePlacesQuery: async (sql, options) => ({ sql, options }),
+ },
+ },
+ OS: {
+ File: {
+ writeAtomic() {},
+ makeDir() {},
+ stat() {},
+ Error: {},
+ read() {},
+ exists() {},
+ remove() {},
+ removeEmptyDir() {},
+ },
+ Path: {
+ join() {
+ return "/";
+ },
+ },
+ Constants: {
+ Path: {
+ localProfileDir: "/",
+ },
+ },
+ },
+ PathUtils: {
+ join(...parts) {
+ return parts[parts.length - 1];
+ },
+ joinRelative(...parts) {
+ return parts[parts.length - 1];
+ },
+ getProfileDir() {
+ return Promise.resolve("/");
+ },
+ getLocalProfileDir() {
+ return Promise.resolve("/");
+ },
+ },
+ PlacesUtils: {
+ get bookmarks() {
+ return TEST_GLOBAL.Cc["@mozilla.org/browser/nav-bookmarks-service;1"];
+ },
+ get history() {
+ return TEST_GLOBAL.Cc["@mozilla.org/browser/nav-history-service;1"];
+ },
+ observers: {
+ addListener() {},
+ removeListener() {},
+ },
+ },
+ Preferences: FakePrefs,
+ PrivateBrowsingUtils: {
+ isBrowserPrivate: () => false,
+ isWindowPrivate: () => false,
+ permanentPrivateBrowsing: false,
+ },
+ DownloadsViewUI: {
+ getDisplayName: () => "filename.ext",
+ getSizeWithUnits: () => "1.5 MB",
+ },
+ FileUtils: {
+ // eslint-disable-next-line object-shorthand
+ File: function () {}, // NB: This is a function/constructor
+ },
+ Region: {
+ home: "US",
+ REGION_TOPIC: "browser-region-updated",
+ },
+ Services: {
+ dirsvc: {
+ get: () => ({ parent: { parent: { path: "appPath" } } }),
+ },
+ env: {
+ set: () => undefined,
+ },
+ locale: {
+ get appLocaleAsBCP47() {
+ return "en-US";
+ },
+ negotiateLanguages() {},
+ },
+ urlFormatter: { formatURL: str => str, formatURLPref: str => str },
+ mm: {
+ addMessageListener: (msg, cb) => this.receiveMessage(),
+ removeMessageListener() {},
+ },
+ obs: {
+ addObserver() {},
+ removeObserver() {},
+ notifyObservers() {},
+ },
+ telemetry: {
+ setEventRecordingEnabled: () => {},
+ recordEvent: eventDetails => {},
+ scalarSet: () => {},
+ keyedScalarAdd: () => {},
+ },
+ uuid: {
+ generateUUID() {
+ return "{foo-123-foo}";
+ },
+ },
+ console: { logStringMessage: () => {} },
+ prefs: new FakensIPrefService(),
+ tm: {
+ dispatchToMainThread: cb => cb(),
+ idleDispatchToMainThread: cb => cb(),
+ },
+ eTLD: {
+ getBaseDomain({ spec }) {
+ return spec.match(/\/([^/]+)/)[1];
+ },
+ getBaseDomainFromHost(host) {
+ return host.match(/.*?(\w+\.\w+)$/)[1];
+ },
+ getPublicSuffix() {},
+ },
+ io: {
+ newURI: spec => ({
+ mutate: () => ({
+ setRef: ref => ({
+ finalize: () => ({
+ ref,
+ spec,
+ }),
+ }),
+ }),
+ spec,
+ }),
+ },
+ search: {
+ init() {
+ return Promise.resolve();
+ },
+ getVisibleEngines: () =>
+ Promise.resolve([{ identifier: "google" }, { identifier: "bing" }]),
+ defaultEngine: {
+ identifier: "google",
+ searchForm:
+ "https://www.google.com/search?q=&ie=utf-8&oe=utf-8&client=firefox-b",
+ aliases: ["@google"],
+ },
+ defaultPrivateEngine: {
+ identifier: "bing",
+ searchForm: "https://www.bing.com",
+ aliases: ["@bing"],
+ },
+ getEngineByAlias: async () => null,
+ },
+ scriptSecurityManager: {
+ createNullPrincipal() {},
+ getSystemPrincipal() {},
+ },
+ wm: {
+ getMostRecentWindow: () => window,
+ getMostRecentBrowserWindow: () => window,
+ getEnumerator: () => [],
+ },
+ ww: { registerNotification() {}, unregisterNotification() {} },
+ appinfo: { appBuildID: "20180710100040", version: "69.0a1" },
+ scriptloader: { loadSubScript: () => {} },
+ startup: {
+ getStartupInfo() {
+ return {
+ process: {
+ getTime() {
+ return 1588010448000;
+ },
+ },
+ };
+ },
+ },
+ },
+ XPCOMUtils: {
+ defineLazyGlobalGetters: updateGlobalOrObject,
+ defineLazyModuleGetters: updateGlobalOrObject,
+ defineLazyServiceGetter: updateGlobalOrObject,
+ defineLazyServiceGetters: updateGlobalOrObject,
+ defineLazyPreferenceGetter(object, name) {
+ updateGlobalOrObject(object)[name] = "";
+ },
+ generateQI() {
+ return {};
+ },
+ },
+ EventEmitter,
+ ShellService: {
+ doesAppNeedPin: () => false,
+ isDefaultBrowser: () => true,
+ },
+ FilterExpressions: {
+ eval() {
+ return Promise.resolve(false);
+ },
+ },
+ RemoteSettings,
+ Localization: class {
+ async formatMessages(stringsIds) {
+ return Promise.resolve(
+ stringsIds.map(({ id, args }) => ({ value: { string_id: id, args } }))
+ );
+ }
+ async formatValue(stringId) {
+ return Promise.resolve(stringId);
+ }
+ },
+ FxAccountsConfig: {
+ promiseConnectAccountURI(id) {
+ return Promise.resolve(id);
+ },
+ },
+ FX_MONITOR_OAUTH_CLIENT_ID: "fake_client_id",
+ ExperimentAPI: {
+ getExperiment() {},
+ getExperimentMetaData() {},
+ getRolloutMetaData() {},
+ },
+ NimbusFeatures: {
+ glean: {
+ getVariable() {},
+ },
+ newtab: {
+ getVariable() {},
+ getAllVariables() {},
+ onUpdate() {},
+ offUpdate() {},
+ },
+ pocketNewtab: {
+ getVariable() {},
+ getAllVariables() {},
+ onUpdate() {},
+ offUpdate() {},
+ },
+ cookieBannerHandling: {
+ getVariable() {},
+ },
+ },
+ TelemetryEnvironment: {
+ setExperimentActive() {},
+ currentEnvironment: {
+ profile: {
+ creationDate: 16587,
+ },
+ settings: {},
+ },
+ },
+ TelemetryStopwatch: {
+ start: () => {},
+ finish: () => {},
+ },
+ Sampling: {
+ ratioSample(seed, ratios) {
+ return Promise.resolve(0);
+ },
+ },
+ BrowserHandler: {
+ get kiosk() {
+ return false;
+ },
+ },
+ TelemetrySession: {
+ getMetadata(reason) {
+ return {
+ reason,
+ sessionId: "fake_session_id",
+ };
+ },
+ },
+ PageThumbs: {
+ addExpirationFilter() {},
+ removeExpirationFilter() {},
+ },
+ Logger: FakeLogger,
+ getFxAccountsSingleton() {},
+ AboutNewTab: {},
+ Glean: {
+ newtab: {
+ opened: {
+ record() {},
+ },
+ closed: {
+ record() {},
+ },
+ locale: {
+ set() {},
+ },
+ newtabCategory: {
+ set() {},
+ },
+ homepageCategory: {
+ set() {},
+ },
+ blockedSponsors: {
+ set() {},
+ },
+ sovAllocation: {
+ set() {},
+ },
+ },
+ newtabSearch: {
+ enabled: {
+ set() {},
+ },
+ },
+ pocket: {
+ enabled: {
+ set() {},
+ },
+ impression: {
+ record() {},
+ },
+ isSignedIn: {
+ set() {},
+ },
+ sponsoredStoriesEnabled: {
+ set() {},
+ },
+ click: {
+ record() {},
+ },
+ save: {
+ record() {},
+ },
+ topicClick: {
+ record() {},
+ },
+ },
+ topsites: {
+ enabled: {
+ set() {},
+ },
+ sponsoredEnabled: {
+ set() {},
+ },
+ impression: {
+ record() {},
+ },
+ click: {
+ record() {},
+ },
+ rows: {
+ set() {},
+ },
+ showPrivacyClick: {
+ record() {},
+ },
+ dismiss: {
+ record() {},
+ },
+ prefChanged: {
+ record() {},
+ },
+ },
+ topSites: {
+ pingType: {
+ set() {},
+ },
+ position: {
+ set() {},
+ },
+ source: {
+ set() {},
+ },
+ tileId: {
+ set() {},
+ },
+ reportingUrl: {
+ set() {},
+ },
+ advertiser: {
+ set() {},
+ },
+ contextId: {
+ set() {},
+ },
+ },
+ },
+ GleanPings: {
+ newtab: {
+ submit() {},
+ },
+ topSites: {
+ submit() {},
+ },
+ },
+ Utils: {
+ SERVER_URL: "bogus://foo",
+ },
+};
+overrider.set(TEST_GLOBAL);
+
+describe("activity-stream", () => {
+ after(() => overrider.restore());
+ files.forEach(file => req(file));
+});
diff --git a/browser/components/aboutwelcome/webpack.aboutwelcome.config.js b/browser/components/aboutwelcome/webpack.aboutwelcome.config.js
new file mode 100644
index 0000000000..681ad09dc8
--- /dev/null
+++ b/browser/components/aboutwelcome/webpack.aboutwelcome.config.js
@@ -0,0 +1,24 @@
+/* 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 http://mozilla.org/MPL/2.0/. */
+
+const path = require("path");
+const config = require("../newtab/webpack.system-addon.config.js");
+const webpack = require("webpack");
+const absolute = relPath => path.join(__dirname, relPath);
+const banner = `
+NOTE: This file is generated by webpack from aboutwelcome.jsx
+using the npm bundle task.
+`;
+module.exports = Object.assign({}, config(), {
+ entry: absolute("content-src/aboutwelcome.jsx"),
+ output: {
+ path: absolute("content"),
+ filename: "aboutwelcome.bundle.js",
+ },
+ externals: {
+ react: "React",
+ "react-dom": "ReactDOM",
+ },
+ plugins: [new webpack.BannerPlugin(banner)],
+});
diff --git a/browser/components/aboutwelcome/yamscripts.yml b/browser/components/aboutwelcome/yamscripts.yml
new file mode 100644
index 0000000000..c2bc2f18e3
--- /dev/null
+++ b/browser/components/aboutwelcome/yamscripts.yml
@@ -0,0 +1,45 @@
+# This file compiles to package.json scripts.
+# When you add or modify anything, you *MUST* run:
+# npm run yamscripts
+# to compile your changes.
+
+scripts:
+ # bundle: Build all assets for activity stream
+ bundle:
+ welcomeBundle: webpack-cli --config webpack.aboutwelcome.config.js
+ welcomeCss: sass content-src:content --no-source-map
+
+ # watchmc: Automatically rebuild when files are changed. NOTE: Includes sourcemaps, do not use for profiling/perf testing.
+ watchmc:
+ _parallel: true
+ welcomeBundle: =>bundle:welcomeBundle -- --env development -w
+ welcomeCss: =>bundle:welcomeCss -- --source-map --embed-sources --embed-source-map -w
+
+ testmc:
+ lint: =>lint
+ build: =>bundle:welcomeBundle
+ unit: karma start karma.mc.config.js
+
+ tddmc: karma start karma.mc.config.js --tdd
+
+ debugcoverage: open logs/coverage/lcov-report/index.html
+
+ # lint: Run various linters with mach or local dev dependencies
+ lint:
+ codespell: (cd $npm_package_config_mc_root && ./mach lint -l codespell $npm_package_config_welcome_path)
+ eslint: (cd $npm_package_config_mc_root && ./mach lint -l eslint $npm_package_config_welcome_path)
+ l10n: (cd $npm_package_config_mc_root && ./mach lint -l l10n --warnings soft browser/locales/en-US/browser/newtab)
+ license: (cd $npm_package_config_mc_root && ./mach lint -l license $npm_package_config_welcome_path)
+ stylelint: (cd $npm_package_config_mc_root && ./mach lint -l stylelint $npm_package_config_welcome_path)
+
+ # test: Run all tests once
+ test: =>testmc
+
+ # tdd: Run content tests continuously
+ tdd: =>tddmc
+
+ fix:
+ # Note that since we're currently running eslint-plugin-prettier,
+ # running fix:eslint will also reformat changed JS files using prettier.
+ eslint: =>lint:eslint -- --fix
+ stylelint: =>lint:stylelint -- --fix