Discogs Submitter

Parse release data from Bandcamp, Qobuz, Juno Download, Beatport, 7digital, Amazon Music, Bleep, HDtracks and submit releases to Discogs.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Discogs Submitter
// @namespace    discogs-submitter
// @version      3.3.1
// @author       Denis G. <https://github.com/denis-g>
// @description  Parse release data from Bandcamp, Qobuz, Juno Download, Beatport, 7digital, Amazon Music, Bleep, HDtracks and submit releases to Discogs.
// @license      MIT
// @icon         https://raw.githubusercontent.com/denis-g/userscript-discogs-submitter/master/src/ui/assets/images/logo.svg
// @homepage     https://github.com/denis-g/userscript-discogs-submitter
// @homepageURL  https://github.com/denis-g/userscript-discogs-submitter
// @source       https://github.com/denis-g/userscript-discogs-submitter.git
// @supportURL   https://github.com/denis-g/userscript-discogs-submitter/issues
// @match        https://*.bandcamp.com/album/*
// @match        https://web.archive.org/web/*/*://*.bandcamp.com*/album/*
// @match        https://*.qobuz.com/*
// @match        https://*.junodownload.com/*
// @match        https://*.beatport.com/*
// @match        https://*.7digital.com/artist/*/release/*
// @match        https://bleep.com/*
// @match        https://*.hdtracks.com/*
// @match        https://*.amazon.co.jp/*
// @match        https://*.amazon.com/*
// @match        https://*.amazon.ae/*
// @match        https://*.amazon.co.uk/*
// @match        https://*.amazon.it/*
// @match        https://*.amazon.in/*
// @match        https://*.amazon.eg/*
// @match        https://*.amazon.com.au/*
// @match        https://*.amazon.nl/*
// @match        https://*.amazon.ca/*
// @match        https://*.amazon.sa/*
// @match        https://*.amazon.sg/*
// @match        https://*.amazon.se/*
// @match        https://*.amazon.es/*
// @match        https://*.amazon.de/*
// @match        https://*.amazon.com.tr/*
// @match        https://*.amazon.com.br/*
// @match        https://*.amazon.fr/*
// @match        https://*.amazon.com.be/*
// @match        https://*.amazon.pl/*
// @match        https://*.amazon.com.mx/*
// @match        https://*.amazon.cn/*
// @connect      discogs.com
// @connect      bandcamp.com
// @connect      bcbits.com
// @connect      qobuz.com
// @connect      static.qobuz.com
// @connect      junodownload.com
// @connect      imagescdn.junodownload.com
// @connect      beatport.com
// @connect      api.beatport.com
// @connect      geo-media.beatport.com
// @connect      7digital.com
// @connect      api.7digital.com
// @connect      artwork-cdn.7static.com
// @connect      m.media-amazon.com
// @connect      cloudfront.net
// @connect      cdn.hdtracks.com
// @grant        GM_info
// @grant        GM_openInTab
// @grant        GM_setClipboard
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @run-at       document-end
// ==/UserScript==

(function() {
    'use strict';
    var styles_default$8 = ".discogs-submitter__header__cover__image{opacity:1}";
    var IGNORE_CAPITALIZATION = [
        "FM",
        "VHS",
        "VIP",
        "UFO",
        "WTF",
        "WWII",
        "WWIII",
        "LSD",
        "TNT",
        "DNA",
        "BBQ",
        "MK",
        "I",
        "II",
        "III",
        "IV",
        "V",
        "VI",
        "VII",
        "VIII",
        "IX",
        "X",
        "XI",
        "XII",
        "XIII",
        "XIV",
        "XV",
        "XVI",
        "XVII",
        "XVIII",
        "XIX",
        "DJ",
        "MC",
        "EP",
        "LP",
        "CD",
        "DVD",
        "HD",
        "MP3",
        "DAT",
        "NASA",
        "FBI",
        "CIA",
        "KGB",
        "MI6",
        "UK",
        "USA",
        "USSR",
        "GDR",
        "DDR"
    ];
    var ignoreCapitalizationMap = new Map();
    IGNORE_CAPITALIZATION.forEach((word) => {
        ignoreCapitalizationMap.set(word.replace(/\./g, "").toUpperCase(), word);
    });
    var SPACE_REGEX = /\s+/g;
    var WORD_BOUNDARY_END_REGEX = /\w$/;
    var PLACEHOLDER_REGEX = /\{\{p\}\}/g;
    var PLACEHOLDER_BOUNDARY_REGEX = /\{\{p\}\}\\b/g;
    var JOINER_REPLACE_REGEX = /[.*+?^${}()|[\]\\]/g;
    function buildCreditRegexes(phrases, templates) {
        return phrases.flatMap((phrase) => {
            const creditPhrase = phrase.replace(SPACE_REGEX, "\\s+");
            return templates.map((template) => {
                let finalTemplate = template;
                if (!WORD_BOUNDARY_END_REGEX.test(phrase)) finalTemplate = finalTemplate.replace(PLACEHOLDER_BOUNDARY_REGEX, "{{p}}");
                return new RegExp(finalTemplate.replace(PLACEHOLDER_REGEX, creditPhrase), "gi");
            });
        });
    }
    function escapeRegExp(text) {
        return text.replace(JOINER_REPLACE_REGEX, "\\$&");
    }
    function buildJoinerPattern(joiners) {
        const escapedJoiners = joiners.map((joiner) => escapeRegExp(joiner));
        const strongJoiners = escapedJoiners.filter((joiner) => joiner.toLowerCase() !== "x");
        const xJoiner = escapedJoiners.find((joiner) => joiner.toLowerCase() === "x");
        const strongPattern = `(?:\\s+(?:${strongJoiners.join("|")})(?=\\s+)|\\s*,\\s*)`;
        if (xJoiner) {
            const xPattern = `\\s+${xJoiner}(?=\\s+(?!${strongJoiners.join("|")}|,))`;
            return new RegExp(`((?:${strongPattern})+|${xPattern})`, "i");
        }
        return new RegExp(`((?:${strongPattern})+)`, "i");
    }
    function buildOxfordPattern(joiners) {
        const nonCommaJoiners = joiners.filter((joiner) => joiner !== ",").map((joiner) => escapeRegExp(joiner));
        return nonCommaJoiners.length > 0 ? new RegExp(`,\\s*(${nonCommaJoiners.join("|")})(?:\\s+|$)`, "gi") : null;
    }
    var REMOVE_FROM_ARTIST = [];
    var REMOVE_FROM_TITLE = [...buildCreditRegexes([
        "original mix",
        "original",
        "remaster",
        "remastered",
        "explicit",
        "digital bonus track",
        "digital bonus",
        "bonus track",
        "bonus",
        "24bit",
        "24 bit",
        "16bit",
        "16 bit"
    ], [
        "\\(\\s*{{p}}\\s*\\)",
        "\\[\\s*{{p}}\\s*\\]",
        "-\\s*{{p}}\\b"
    ]), /[([-]?\s*\b\d{2,3}\s*bpm\b\s*[)\]]?/gi];
    var GLOBAL_CREDIT_REGEX = [
        "(?:\\(|\\[)\\s*{{p}}\\b\\s*(?:by)?\\s*[:\\s-]*([^()[\\]]+)(?:\\)|\\])",
        "(?:\\s+|^)(?:\\w+\\s+(?:and|&)\\s+)?{{p}}(?:\\s+(?:and|&)\\s+\\w+)?\\s+by\\b\\s*[:\\s-]*(.+?)(?=\\s*(?:\\/|;|[A-Z][a-z]+:(?=\\s*\\S)|,|$))",
        "(?:\\s+|^)(?:\\w+\\s+(?:and|&)\\s+)?{{p}}(?:\\s+(?:and|&)\\s+\\w+)?\\b\\s*[:-]\\s*(.+?)(?=\\s*(?:\\/|;|[A-Z][a-z]+:(?=\\s*\\S)|,|$))",
        "(?:\\s+|^){{p}}(?:\\s+\\w+)*\\s+by\\b\\s*[:\\s-]*(.+?)(?=\\s*(?:\\/|;|,|$))"
    ];
    var ARTIST_CREDIT_ROLES = {
        "Featuring": buildCreditRegexes([
            "featuring",
            "feat",
            "ft",
            "f/"
        ], ["(?:\\(|\\[)\\s*{{p}}\\b\\.?\\s*([^()[\\]]+)(?:\\)|\\])", "(?:\\s+|^){{p}}\\b\\.?\\s*(.+?)(?=\\s+\\b(?:feat|ft|prod|remix|vs|with|and|&)\\b|\\s*[\\[\\(]|$)"]),
        "Remix": [
            ...buildCreditRegexes([
                "remix",
                "rmx",
                "remixed",
                "mix",
                "mixed",
                "re-mix",
                "re-mixed",
                "version",
                "edit",
                "edited",
                "re-edit",
                "re-edited",
                "rework",
                "reworked",
                "rebuild",
                "rebuilt"
            ], ["(?:\\(|\\[)\\s*{{p}}\\b\\s*(?:by)?\\s*[:\\s-]*([^()[\\]]+)(?:\\)|\\])", "(?:\\s+|^)-\\s*{{p}}\\b\\s*(?:by)?\\s*[:\\s-]*(.+?)(?=\\s*[\\[\\(]|$)"]),
            ...buildCreditRegexes([
                "remix",
                "rmx",
                "re-mix"
            ], ["(?:\\(|\\[)\\s*([^()[\\]]+)\\s+{{p}}\\b\\s*(?:\\)|\\])"]),
            ...buildCreditRegexes([
                "remix",
                "rmx",
                "remixed",
                "mix",
                "mixed",
                "re-mix",
                "re-mixed",
                "version",
                "edit",
                "edited",
                "re-edit",
                "re-edited",
                "rework",
                "reworked",
                "rebuild",
                "rebuilt"
            ], ["(?:\\(|\\[)\\s*([^()[\\]]+)'s(?:\\s+.*?)?\\s+{{p}}\\b\\s*(?:\\)|\\])"])
        ],
        "DJ Mix": buildCreditRegexes(["dj mix", "dj-mix"], GLOBAL_CREDIT_REGEX),
        "Compiled By": buildCreditRegexes(["compiled", "selected"], GLOBAL_CREDIT_REGEX),
        "Artwork": buildCreditRegexes([
            "artwork",
            "art work",
            "art",
            "design",
            "designed",
            "cover",
            "cover art",
            "layout"
        ], GLOBAL_CREDIT_REGEX),
        "Producer": buildCreditRegexes([
            "produced",
            "producer",
            "prod."
        ], GLOBAL_CREDIT_REGEX),
        "Written-By": buildCreditRegexes([
            "written",
            "written-by",
            "writing"
        ], GLOBAL_CREDIT_REGEX),
        "Written-By, Producer": buildCreditRegexes([
            "w&p",
            "w & p",
            "written & produced",
            "written and produced",
            "produced & written",
            "produced and written"
        ], GLOBAL_CREDIT_REGEX),
        "Mastered By": buildCreditRegexes([
            "mastered",
            "mastering",
            "master",
            "mastering engineer"
        ], GLOBAL_CREDIT_REGEX),
        "Curated By": buildCreditRegexes([
            "curated",
            "curated by",
            "curation",
            "curator"
        ], GLOBAL_CREDIT_REGEX),
        "Performer": buildCreditRegexes([
            "performer",
            "performed",
            "performing"
        ], GLOBAL_CREDIT_REGEX)
    };
    var TITLE_FORMAT = {
        "Album": ["remix album", "rmx album"],
        "Mini-Album": [],
        "EP": [
            "EP",
            "E.P",
            "E.P.",
            "E-P",
            "Extended Play"
        ],
        "Maxi-Single": ["maxi single", "maxi-single"],
        "Single": ["single"],
        "Compilation": ["compilation", "compiled by"],
        "Deluxe Edition": [
            "deluxe edition",
            "deluxe version",
            "deluxe",
            "dlx"
        ],
        "Limited Edition": [
            "limited edition",
            "limited version",
            "ltd. edition",
            "ltd. version",
            "ltd edition",
            "ltd version"
        ],
        "Mixed": ["mix by", "mixed by"],
        "Mixtape": ["mixtape"],
        "Reissue": ["reissue", "re-issue"],
        "Remastered": ["remaster", "remastered"],
        "Unofficial Release": [
            "unofficial",
            "non official",
            "unofficial release"
        ]
    };
    var RELEASE_TYPES = Object.keys(TITLE_FORMAT);
    var FILE_FORMATS = [
        "WAV",
        "FLAC",
        "MP3",
        "AIFF",
        "ALAC",
        "DFS"
    ];
    var ARTIST_JOINERS = [
        ",",
        "/",
        "|",
        "And",
        "&",
        "X",
        "×",
        "With",
        "w/",
        "Vs",
        "Vs.",
        "Versus",
        "Present",
        "Pres.",
        "Aka",
        "Meets"
    ];
    var joinerPattern = buildJoinerPattern(ARTIST_JOINERS);
    var oxfordPattern = buildOxfordPattern(ARTIST_JOINERS);
    var bugs = { "url": "https://github.com/denis-g/userscript-discogs-submitter/issues" };
    var info = typeof GM_info !== "undefined" ? GM_info : null;
    var USERSCRIPT = {
        ID: info?.script?.namespace || "discogs-submitter",
        NAME: info?.script?.name || "discogs-submitter",
        VERSION: info?.script?.version || "3.3.1",
        HOMEPAGE: info?.script?.homepage || "https://github.com/denis-g/userscript-discogs-submitter",
        SUPPORT_URL: info?.script?.supportURL || bugs?.url,
        FUNDING_URL: "https://buymeacoffee.com/denis_g"
    };
    var VARIOUS_ARTISTS = buildCreditRegexes([
        "VA",
        "V.A",
        "V.A.",
        "V. A",
        "V. A.",
        "V A",
        "V\\/A",
        "Various",
        "Various Artists",
        "Varios",
        "Varios Artistas",
        "Různí",
        "Různí interpreti"
    ], ["^{{p}}$"]);
    function cleanString(text, collapseWhitespace = true) {
        if (typeof text !== "string") return null;
        let cleaned = text.replace(/&nbsp;/gi, " ");
        if (collapseWhitespace) cleaned = cleaned.replace(/\s+/g, " ");
        return cleaned.trim() || null;
    }
    function capitalizeString(text) {
        if (!text) return "";
        let cleaned = String(text).trim();
        cleaned = cleaned.replace(/[’`´]/g, "'");
        cleaned = cleaned.replace(/\(\s+/g, "(").replace(/\s+\)/g, ")");
        return cleaned.split(/(\s+|(?=\/)|(?<=\/))/).map((word, index, words) => {
            if (!word || /\s+/.test(word) || word === "/") return word;
            const match = word.match(/^([^\p{L}\p{N}]*)([\p{L}\p{N}](?:.*?[\p{L}\p{N}])?)([^\p{L}\p{N}]*)$/iu);
            if (!match) return word;
            const prefix = match[1];
            const core = match[2];
            const suffix = match[3];
            if (/^[A-Z](?:\.[A-Z])+\.?$/i.test(core + suffix)) return prefix + (core + suffix).toUpperCase();
            const upperCoreNoDots = core.toUpperCase().replace(/\./g, "");
            const isWordAMorPM = upperCoreNoDots === "AM" || upperCoreNoDots === "PM";
            const isFusedTime = /^\d+(?::\d+)?(?:AM|PM)$/.test(upperCoreNoDots);
            if (isWordAMorPM || isFusedTime) {
                let isTimeContext = isFusedTime;
                if (!isTimeContext) {
                    const prevNonSpace = words.slice(0, index).reverse().find((word) => /\S/.test(word));
                    isTimeContext = !!(prevNonSpace && /\d/.test(prevNonSpace));
                }
                if (isTimeContext) return prefix + upperCoreNoDots + suffix;
            }
            const exception = ignoreCapitalizationMap.get(upperCoreNoDots);
            if (exception) return prefix + exception + suffix;
            const hasUppercaseAfterFirst = /[^\p{L}\p{N}]*[\p{L}\p{N}].*\p{Lu}/u.test(core);
            const hasLowercase = /\p{Ll}/u.test(core);
            if (hasUppercaseAfterFirst && hasLowercase) return prefix + core + suffix;
            if (core.length > 0) return prefix + (core.charAt(0).toUpperCase() + core.slice(1).toLowerCase()) + suffix;
            return word;
        }).join("");
    }
    function extractBpm(text) {
        if (!text) return;
        const match = text.match(/[([-]?\s*\b(\d{2,3})\s*bpm\b\s*[)\]]?/i);
        return match ? Number.parseInt(match[1], 10) : void 0;
    }
    function isValidCreditPhrase(text) {
        if (!text || text.length > 150) return false;
        if (/\b(?:tracks?|music|album|exclusive|material|songs?|ep|lp|release|available|digital|vinyl|download|stream|out\s+now|listen|debut|compilation|collection)\b/i.test(text)) return false;
        return !text.split(joinerPattern).filter(Boolean).some((block) => {
            return block.trim().replace(/[.,;!"'()[\]{}<>:]/g, "").split(/\s+/).filter(Boolean).length > 5;
        });
    }
    function parseArtists(artistString, extraArtists = null) {
        if (!artistString) return [];
        let processedString = artistString;
        if (oxfordPattern) processedString = artistString.replace(oxfordPattern, " $1 ");
        const parts = processedString.split(joinerPattern);
        const artists = [];
        for (let index = 0; index < parts.length; index += 2) {
            const rawName = parts[index].trim();
            const join = parts[index + 1] || null;
            if (rawName) {
                const normalized = normalizeArtists(rawName, extraArtists, true);
                if (normalized.length > 0) {
                    const artist = { ...normalized[0] };
                    if (join) artist.join = ARTIST_JOINERS.find((joiner) => joiner.toLowerCase() === join.trim().toLowerCase()) || join;
                    else artist.join = ",";
                    artists.push(artist);
                }
            }
        }
        return artists;
    }
    function extractExtraArtists(text, extraArtists, preserveRoles = []) {
        if (!text) return "";
        let processedText = text;
        for (const [role, patterns] of Object.entries(ARTIST_CREDIT_ROLES)) {for (const pattern of patterns) {processedText = processedText.replace(pattern, (fullMatch, capturedName) => {
            if (typeof capturedName !== "string") return fullMatch;
            let cleanCapture = capturedName.replace(/[.:,;\s]+$/, "").trim();
            const chunks = cleanCapture.split(/\.\s+/);
            if (chunks.length > 1) {
                let validName = chunks[0];
                const namePrefixes = new Set([
                    "mr",
                    "mrs",
                    "dr",
                    "st",
                    "vs",
                    "feat",
                    "ft",
                    "prof",
                    "bros",
                    "inc",
                    "ltd",
                    "vol"
                ]);
                for (let chunkIndex = 1; chunkIndex < chunks.length; chunkIndex++) {
                    const lastWord = chunks[chunkIndex - 1].split(/\s+/).at(-1)?.toLowerCase() || "";
                    if (lastWord.length === 1 || namePrefixes.has(lastWord)) validName += `. ${chunks[chunkIndex]}`;
                    else break;
                }
                cleanCapture = validName;
            }
            if (isValidCreditPhrase(cleanCapture)) {
                parseArtists(cleanCapture, extraArtists).forEach((artist) => {
                    if (artist.name && !extraArtists.some((existing) => existing.name === artist.name && existing.role === role)) {extraArtists.push({
                        name: artist.name,
                        role
                    });}
                });
                return preserveRoles.includes(role) ? fullMatch : "";
            }
            return fullMatch;
        });}}
        return processedText.replace(/\s{2,}/g, " ").trim();
    }
    function normalizeArtists(artists, extraArtists = null, isSubcall = false) {
        if (!artists) {return isSubcall ? [] : [{
            name: "",
            join: ","
        }];}
        if (!isSubcall) {
            const processedString = Array.isArray(artists) ? artists.filter(Boolean).join(", ") : artists;
            if (typeof processedString === "string") return parseArtists(processedString, extraArtists);
        }
        const normalizedNames = (Array.isArray(artists) ? artists : [artists]).map((rawArtist) => {
            if (!rawArtist) return null;
            let cleaned = cleanString(rawArtist);
            if (!cleaned) return null;
            if (extraArtists) cleaned = extractExtraArtists(cleaned, extraArtists);
            REMOVE_FROM_ARTIST.forEach((pattern) => {
                cleaned = cleaned.replace(pattern, "").trim();
            });
            return capitalizeString(cleaned);
        }).filter((name) => Boolean(name));
        if (normalizedNames.length === 0) {return isSubcall ? [] : [{
            name: "Unknown Artist",
            join: ","
        }];}
        return normalizedNames.map((name) => ({
            name,
            join: ","
        }));
    }
    function normalizeMainArtists(rawArtists, extraArtists = null) {
        const normalized = normalizeArtists(rawArtists, extraArtists);
        if (Array.isArray(extraArtists)) {
            const compilers = extraArtists.filter((artist) => artist.role === "Compiled By");
            if (compilers.length > 0) {
                const compilerMap = new Map();
                compilers.forEach((compiler) => {
                    const normalizedName = compiler.name.toLowerCase();
                    let found = false;
                    for (const [existingName] of compilerMap.entries()) {if (existingName.includes(normalizedName) || normalizedName.includes(existingName)) {
                        if (normalizedName.length > existingName.length) {
                            compilerMap.delete(existingName);
                            compilerMap.set(normalizedName, compiler.name);
                        }
                        found = true;
                        break;
                    }}
                    if (!found) compilerMap.set(normalizedName, compiler.name);
                });
                return Array.from(compilerMap.values()).map((name) => ({
                    name,
                    join: ","
                }));
            }
        }
        if (normalized.length > 5) {return [{
            name: "Various",
            join: ","
        }];}
        if (VARIOUS_ARTISTS.length > 0) {
            if (normalized.some((artist) => VARIOUS_ARTISTS.some((pattern) => pattern.test(artist.name)))) {return [{
                name: "Various",
                join: ","
            }];}
        }
        return normalized;
    }
    function groupExtraArtists(artists) {
        if (!Array.isArray(artists) || !artists.length) return [];
        const nameKeys = new Map();
        const roleGroups = new Map();
        artists.forEach((artist) => {
            if (!artist.name || !artist.role) return;
            const trimmedName = artist.name.trim();
            const normalizedName = trimmedName.toLowerCase();
            if (!nameKeys.has(normalizedName)) {
                nameKeys.set(normalizedName, trimmedName);
                roleGroups.set(normalizedName, new Set());
            }
            roleGroups.get(normalizedName).add(artist.role.trim());
        });
        return Array.from(nameKeys.entries()).map(([key, name]) => {
            return {
                name,
                role: Array.from(roleGroups.get(key)).sort((roleA, roleB) => roleA.localeCompare(roleB)).join(", ")
            };
        });
    }
    var MONTHS = [
        "Jan",
        "Feb",
        "Mar",
        "Apr",
        "May",
        "Jun",
        "Jul",
        "Aug",
        "Sep",
        "Oct",
        "Nov",
        "Dec"
    ];
    function normalizeReleaseDate(date) {
        if (!date) return null;
        const gmtMatch = date.match(/(?:(\d{1,2})\s+)?([a-z]{3,})\s+(\d{4})/i);
        if (gmtMatch) {
            const day = gmtMatch[1] ? String(gmtMatch[1]).padStart(2, "0") : "00";
            const monthStr = gmtMatch[2].substring(0, 3).toLowerCase();
            const monthIndex = MONTHS.findIndex((month) => month.toLowerCase() === monthStr);
            const year = gmtMatch[3];
            if (monthIndex !== -1) return `${year}-${String(monthIndex + 1).padStart(2, "0")}-${day}`;
        }
        const euroDateMatch = date.match(/(\d{1,2})\/(\d{1,2})\/(\d{4})/);
        if (euroDateMatch) {
            const day = euroDateMatch[1].padStart(2, "0");
            const month = euroDateMatch[2].padStart(2, "0");
            return `${euroDateMatch[3]}-${month}-${day}`;
        }
        const dateMatch = date.match(/(\d{1,2})\s+([a-z]{3,}),?\s+(\d{4})/i);
        if (dateMatch) {
            const day = dateMatch[1].padStart(2, "0");
            const monthStr = dateMatch[2].substring(0, 3).toLowerCase();
            const monthIndex = MONTHS.findIndex((month) => month.toLowerCase() === monthStr);
            const year = dateMatch[3];
            if (monthIndex !== -1) return `${year}-${String(monthIndex + 1).padStart(2, "0")}-${day}`;
        }
        const usDateMatch = date.match(/([a-z]{3,})\s+(\d{1,2}),?\s+(\d{4})/i);
        if (usDateMatch) {
            const monthStr = usDateMatch[1].substring(0, 3).toLowerCase();
            const day = usDateMatch[2].padStart(2, "0");
            const year = usDateMatch[3];
            const monthIndex = MONTHS.findIndex((month) => month.toLowerCase() === monthStr);
            if (monthIndex !== -1) return `${year}-${String(monthIndex + 1).padStart(2, "0")}-${day}`;
        }
        const releasedMatch = date.match(/^(?:Released )?(\d{4}-\d{2}-\d{2})/);
        if (releasedMatch) return releasedMatch[1];
        const yearOnlyMatch = date.match(/(?<![\d-])\b(19|20)\d{2}\b(?![\d-])/);
        if (yearOnlyMatch) return yearOnlyMatch[0];
        return date;
    }
    function normalizeDuration(rawDuration) {
        if (!rawDuration) return "";
        const trimmed = String(rawDuration).trim();
        if (/^\d+(?:\.\d+)?$/.test(trimmed)) {
            const totalSeconds = Math.round(Number.parseFloat(trimmed));
            const hours = Math.floor(totalSeconds / 3600);
            const timeParts = [Math.floor(totalSeconds % 3600 / 60), totalSeconds % 60].map((value) => String(value).padStart(2, "0"));
            if (hours > 0) timeParts.unshift(String(hours));
            else timeParts[0] = Number.parseInt(timeParts[0], 10).toString();
            return timeParts.join(":");
        }
        if (trimmed.match(/^(?:\d+:)?\d{1,2}:\d{2}$/)) {
            const parts = trimmed.split(":").map((part) => part.padStart(2, "0"));
            if (parts.length === 3 && Number.parseInt(parts[0], 10) === 0) parts.shift();
            parts[0] = Number.parseInt(parts[0], 10).toString();
            return parts.join(":");
        }
        return trimmed || "";
    }
    function normalizeTitle(rawTitle, extraArtists = null) {
        if (!rawTitle) return "";
        let title = capitalizeString(rawTitle);
        REMOVE_FROM_TITLE.forEach((pattern) => {
            title = title.replace(pattern, "").trim();
        });
        if (extraArtists) title = extractExtraArtists(title, extraArtists, ["Remix"]);
        title = title.replace(/(\S)([[(])/g, "$1 $2");
        return cleanString(title) || "";
    }
    function splitArtistTitle(rawTitle, defaultArtists, extraArtists) {
        let cleanTitleForSplit = rawTitle || "";
        REMOVE_FROM_TITLE.forEach((pattern) => {
            cleanTitleForSplit = cleanTitleForSplit.replace(pattern, "").trim();
        });
        const splitMatch = cleanTitleForSplit.match(/^(\S(?:.*?\S)?)\s+[-–—]\s*(\S.*)$/) || cleanTitleForSplit.match(/^(\S(?:.*?\S)?)[-–—]\s+(\S.*)$/);
        if (splitMatch) {
            const artistPart = splitMatch[1].trim();
            const titlePart = splitMatch[2].trim();
            const technicalParts = /^(?:intro|outro|skit|reprise|interlude)$/i;
            if (!technicalParts.test(artistPart) && !technicalParts.test(titlePart)) {return {
                artists: normalizeArtists(artistPart, extraArtists),
                title: normalizeTitle(titlePart, extraArtists),
                bpm: extractBpm(rawTitle)
            };}
        }
        return {
            artists: defaultArtists,
            title: normalizeTitle(rawTitle || "", extraArtists),
            bpm: extractBpm(rawTitle)
        };
    }
    function networkRequest(options, retries = 2, timeout = 15e3) {
        const attempt = (currentTry) => new Promise((resolve, reject) => {
            const config = {
                method: "GET",
                timeout,
                anonymous: false,
                fetch: false,
                cookiePartition: { topLevelSite: unsafeWindow.location.origin },
                ...options,
                onload: (response) => {
                    if (response.status >= 200 && response.status < 300) {if (config.responseType === "json") resolve(response.response);
                    else resolve(!config.responseType || config.responseType === "text" ? response.responseText : response.response);}
                    else reject(new Error(`HTTP Error: ${response.status} ${response.statusText || ""}`.trim()));
                },
                onerror: (response) => {
                    reject(new Error(`Network Error: ${response.status} ${response.statusText || ""}`.trim() || "Connection failed"));
                },
                ontimeout: () => reject(new Error("Request timed out"))
            };
            GM_xmlhttpRequest(config);
        }).catch((error) => {
            if (currentTry < retries) {
                console.warn(`[Discogs Submitter] Request failed (${error.message}). Retrying... (${currentTry + 1}/${retries})`);
                return attempt(currentTry + 1);
            }
            throw error;
        });
        return attempt(0);
    }
    function getManyTextFromTags(target, parent = null, keepNewlines = false) {
        const context = parent || document;
        return Array.from(context.querySelectorAll(target)).map((element) => {
            if (keepNewlines) {
                const clone = element.cloneNode(true);
                clone.querySelectorAll("br").forEach((breakElement) => {
                    breakElement.replaceWith("\n");
                });
                return cleanString(clone.textContent, false);
            }
            return cleanString(element.textContent);
        }).filter((text) => Boolean(text));
    }
    function getTextFromTag(target, parent = null, attribute = "", keepNewlines = false, visible = false) {
        const result = (parent || document).querySelector(target);
        let output = null;
        if (!result) return null;
        if (attribute) {
            output = cleanString(result.getAttribute(attribute));
            return output;
        }
        let elementToProcess = result;
        if (keepNewlines) {
            const clone = result.cloneNode(true);
            clone.querySelectorAll("br").forEach((breakElement) => {
                breakElement.replaceWith("\n");
            });
            elementToProcess = clone;
        }
        if (visible) output = getVisibleText(elementToProcess);
        else output = elementToProcess.textContent;
        return cleanString(output, !keepNewlines);
    }
    function getVisibleText(element) {
        if (element && element.childNodes.length > 0) return Array.from(element.childNodes).filter((node) => node.nodeType === Node.TEXT_NODE).map((node) => node.textContent || "").join("");
        return null;
    }
    function bindActivation(element, handler) {
        if (!element) return;
        element.addEventListener("click", handler);
        element.addEventListener("keydown", (event) => {
            if (event.key === "Enter" || event.key === " ") {
                event.preventDefault();
                handler();
            }
        });
    }
    function matchUrls(...patterns) {
        const regexes = patterns.map((pattern) => new RegExp(`^${pattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\\*/g, ".*")}$`, "i"));
        return (url) => regexes.some((regex) => regex.test(url));
    }
    function getReleaseIdFromUrl(url = unsafeWindow.location.href) {
        try {
            return new URL(url).pathname.split("/").filter(Boolean).at(-1) || null;
        } catch {
            return url.split("/").filter(Boolean).at(-1) || null;
        }
    }
    function isWebarchive() {
        try {
            const url = new URL(unsafeWindow.location.href);
            return url.hostname === "web.archive.org" && url.pathname.startsWith("/web/");
        } catch {}
        return false;
    }
    async function getData$3() {
        const releaseId = getTextFromTag(".release-info", null, "data-releaseid");
        if (!releaseId) throw new Error(`[Discogs Submitter] Release ID not found`);
        return (await networkRequest({
            url: `https://api.7digital.com/1.2/release/tracks?releaseid=${releaseId}&pagesize=100&imagesize=800&usageTypes=download&oauth_consumer_key=7digital.com`,
            headers: { Accept: "application/json" },
            responseType: "json"
        })).tracks;
    }
    var sevendigital = {
        id: "7digital",
        test: matchUrls("https://*.7digital.com/artist/*/release/*"),
        supports: { formats: ["FLAC", "MP3"] },
        parse: async () => {
            const data = await getData$3();
            const smallCover = data[0].release.image?.replace("_800", "_350");
            const albumCover = data[0].release.image;
            const albumExtraArtists = [];
            return {
                thumb: smallCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: normalizeMainArtists([data[0].release.artist.name], albumExtraArtists),
                title: normalizeTitle(data[0].release.title, albumExtraArtists),
                label: data[0].release.label.name,
                released: normalizeReleaseDate(getTextFromTag(".release-data-label + .release-data-info")),
                tracks: data.map((track, index) => {
                    const trackPosition = `${index + 1}`;
                    const trackExtraArtists = [];
                    return {
                        pos: trackPosition,
                        extraartists: trackExtraArtists,
                        artists: normalizeArtists(track.artist.name, trackExtraArtists),
                        title: normalizeTitle(track.version !== "" ? `${track.title} (${track.version})` : track.title, trackExtraArtists),
                        duration: normalizeDuration(track.duration)
                    };
                })
            };
        }
    };
    var amazonmusic = {
        id: "amazonmusic",
        test: matchUrls("https://*.amazon.*/*"),
        supports: { formats: ["MP3"] },
        parse: async () => {
            const albumCover = getTextFromTag("#main_content music-detail-header", null, "image-src");
            const albumExtraArtists = [];
            const albumArtists = normalizeMainArtists(getTextFromTag("#main_content music-detail-header", null, "primary-text"), albumExtraArtists);
            const albumTitle = normalizeTitle(getTextFromTag("#main_content music-detail-header", null, "headline"), albumExtraArtists);
            let albumLabel = getTextFromTag("#main_content .music-tertiary-text");
            let albumTracks = [];
            if (albumLabel) albumLabel = albumLabel.replace(/^[℗©\s\d:]+/, "").trim();
            let albumReleased = getTextFromTag("#main_content music-detail-header", null, "tertiary-text");
            if (albumReleased) {
                const dateParts = albumReleased.split("•");
                albumReleased = normalizeReleaseDate(dateParts[dateParts.length - 1].trim());
            }
            const tracklistContainer = document.querySelector("#main_content music-container");
            const tracklistRows = (tracklistContainer?.shadowRoot ?? tracklistContainer)?.querySelectorAll("music-text-row") || [];
            if (tracklistRows.length) {albumTracks = Array.from(tracklistRows).map((track, index) => {
                const trackPosition = `${index + 1}`;
                const trackExtraArtists = [];
                return {
                    pos: trackPosition,
                    extraartists: trackExtraArtists,
                    artists: normalizeArtists(getTextFromTag(".col3 > music-link", track, "title") || albumArtists.map((artist) => artist.name), trackExtraArtists),
                    title: normalizeTitle(getTextFromTag(".col1 > music-link", track), trackExtraArtists),
                    duration: normalizeDuration(getTextFromTag(".col4 > music-link", track, "title"))
                };
            });}
            return {
                thumb: albumCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: albumArtists,
                title: albumTitle,
                label: albumLabel,
                released: albumReleased,
                tracks: albumTracks
            };
        }
    };
    function extractCatalogNumber(items) {
        const catPrefixes = [
            "Catalog Number",
            "Calalog No",
            "Catalogue N°",
            "Release Catalog No",
            "Cat.#",
            "Cat#",
            "CatNo",
            "Cat.no",
            "Cat. Number",
            "Cat.",
            "Catalog#",
            "Catalog #",
            "Catalogue Number",
            "Catalogue #",
            "Catalogue No",
            "Cat No."
        ];
        const buildPrefixRegex = (prefixes) => {
            const escaped = prefixes.map((prefix) => prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\s+/g, "\\s+"));
            return new RegExp(`(?:${escaped.join("|")})[\\s:-]+(\\S.+)`, "i");
        };
        const catRegex = buildPrefixRegex(catPrefixes);
        const bracketedCatRegex = /\[([A-Z0-9-]{3,15})\]/;
        let labelNumber = null;
        items.some((element) => {
            const match = element.match(catRegex);
            if (match?.[1]) {
                labelNumber = cleanString(match[1]);
                return true;
            }
            const bracketMatch = element.match(bracketedCatRegex);
            if (bracketMatch?.[1]) {
                labelNumber = cleanString(bracketMatch[1]);
                return true;
            }
            return false;
        });
        if (!labelNumber) {
            const suspectedCat = items.find((item) => /^[A-Z0-9]{3,10}-\d{1,5}$/.test(item) || /^[A-Z]{2,4}\d{3,6}$/.test(item));
            if (suspectedCat && suspectedCat.length < 20) labelNumber = suspectedCat;
        }
        return labelNumber;
    }
    function extractLabelName(items, credits) {
        const labelPrefixes = [
            "Label",
            "Released on",
            "Record Label"
        ];
        const buildPrefixRegex = (prefixes) => {
            const escaped = prefixes.map((prefix) => prefix.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\s+/g, "\\s+"));
            return new RegExp(`(?:${escaped.join("|")})[\\s:-]+(\\S.+)`, "i");
        };
        const labelRegex = buildPrefixRegex(labelPrefixes);
        let albumLabel = null;
        items.some((element) => {
            if (/label|released\s+on/i.test(element) && element.length < 100) {
                const match = element.match(labelRegex);
                if (match?.[1]) {
                    albumLabel = cleanString(match[1]);
                    return true;
                }
            }
            return false;
        });
        if (!albumLabel && credits.length) albumLabel = credits.find((item) => item.length > 1) || null;
        return albumLabel;
    }
    var bandcamp = {
        id: "bandcamp",
        test: matchUrls("https://*.bandcamp.com/album/*", "https://web.archive.org/web/*/*://*.bandcamp.com*/album/*"),
        supports: { formats: [
            "WAV",
            "FLAC",
            "AIFF",
            "MP3"
        ] },
        parse: async () => {
            const smallCover = isWebarchive() ? getTextFromTag("#tralbumArt img[itemprop=\"image\"]", null, "src") : getTextFromTag("a.popupImage img", null, "src");
            const albumCover = isWebarchive() ? getTextFromTag("#tralbumArt img[itemprop=\"image\"]", null, "src") : getTextFromTag("a.popupImage", null, "href");
            const albumExtraArtists = [];
            const about = getManyTextFromTags(".tralbum-about", null, true);
            const credits = getManyTextFromTags(".tralbum-credits", null, true);
            [...about.flatMap((credit) => credit.split(/\r?\n/)), ...credits.flatMap((credit) => credit.split(/\r?\n/))].forEach((line) => {
                const trimmedLine = line.trim();
                if (trimmedLine) normalizeTitle(trimmedLine, albumExtraArtists);
            });
            const albumArtists = normalizeMainArtists(isWebarchive() ? getTextFromTag("[itemtype*=\"MusicGroup\"] meta[itemprop=\"name\"]", null, "content") : getTextFromTag("#name-section h3 span") || getTextFromTag("#band-name-location .title"), albumExtraArtists);
            const albumTitle = normalizeTitle(getTextFromTag("#name-section .trackTitle"), albumExtraArtists);
            const albumTracks = Array.from(document.querySelectorAll("#track_table .track_row_view")).map((track, index) => {
                const trackPosition = `${index + 1}`;
                const trackExtraArtists = [];
                const { artists: trackArtists, title: trackTitle, bpm: trackBpm } = splitArtistTitle(getTextFromTag(".title > span, .title > a", track), albumArtists, trackExtraArtists);
                return {
                    pos: trackPosition,
                    extraartists: trackExtraArtists,
                    artists: trackArtists,
                    title: trackTitle,
                    duration: normalizeDuration(getTextFromTag(".time, .time.secondaryText", track)),
                    bpm: trackBpm
                };
            });
            const location = document.querySelector("#band-name-location");
            let albumLabel = location ? getTextFromTag(".title", location) : null;
            const labelCountry = location ? getTextFromTag(".location", location)?.split(",").pop()?.trim() || null : null;
            let labelNumber = null;
            const aboutItems = about.flatMap((credit) => credit.split(/\r?\n/).map((line) => cleanString(line)).filter(Boolean));
            const creditItems = credits.flatMap((credit) => credit.split(/\r?\n/).map((line) => cleanString(line)).filter(Boolean));
            const combinedItems = [...aboutItems, ...creditItems];
            labelNumber = extractCatalogNumber(combinedItems);
            if (!albumLabel) albumLabel = extractLabelName(combinedItems, creditItems);
            if (!albumLabel) albumLabel = getTextFromTag("[itemprop=\"publisher\"]");
            let albumReleased = normalizeReleaseDate(isWebarchive() ? getTextFromTag(".tralbumData") : getTextFromTag(".tralbum-credits"));
            if (albumReleased) {
                const dateParts = albumReleased.split("-");
                const year = Number.parseInt(dateParts[0], 10);
                const month = dateParts[1] ? Number.parseInt(dateParts[1], 10) : 0;
                if (year < 2008 || year === 2008 && month < 9) albumReleased = null;
            }
            return {
                thumb: smallCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: albumArtists,
                title: albumTitle,
                label: albumLabel,
                number: labelNumber,
                country: labelCountry,
                released: albumReleased,
                tracks: albumTracks
            };
        }
    };
    async function getData$2() {
        const releaseId = getReleaseIdFromUrl();
        if (!releaseId) throw new Error(`[Discogs Submitter] Release ID not found`);
        const accessToken = (await networkRequest({
            url: `https://www.beatport.com/api/auth/refresh-anon-token`,
            method: "POST",
            responseType: "json"
        })).access_token;
        if (!accessToken) throw new Error("Beatport access token not found");
        const [meta, tracksResponse] = await Promise.all([networkRequest({
            url: `https://api.beatport.com/v4/catalog/releases/${releaseId}`,
            headers: { Authorization: `Bearer ${accessToken}` },
            responseType: "json"
        }), networkRequest({
            url: `https://api.beatport.com/v4/catalog/releases/${releaseId}/tracks?per_page=100`,
            headers: { Authorization: `Bearer ${accessToken}` },
            responseType: "json"
        })]);
        const tracks = tracksResponse.results;
        return {
            ...meta,
            tracks
        };
    }
    var beatport = {
        id: "beatport",
        test: matchUrls("https://*.beatport.com/*"),
        supports: { formats: [
            "WAV",
            "FLAC",
            "AIFF",
            "MP3"
        ] },
        parse: async () => {
            const data = await getData$2();
            const smallCover = data.image.dynamic_uri?.replace("{w}", "350")?.replace("{h}", "350");
            const albumCover = data.image.uri;
            const albumExtraArtists = [];
            const albumArtists = normalizeMainArtists(data.artists.map((artist) => artist.name), albumExtraArtists);
            const albumTitle = normalizeTitle(data.name, albumExtraArtists);
            const albumLabel = data.label.name;
            const labelNumber = data.catalog_number;
            return {
                thumb: smallCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: albumArtists,
                title: albumTitle,
                label: albumLabel,
                released: data.publish_date,
                number: labelNumber,
                tracks: data.tracks.map((track, index) => {
                    const trackPosition = `${index + 1}`;
                    const trackExtraArtists = [];
                    return {
                        pos: trackPosition,
                        extraartists: trackExtraArtists,
                        artists: normalizeArtists(track.artists.map((artist) => artist.name), trackExtraArtists),
                        title: normalizeTitle(track.mix_name !== "" ? `${track.name} (${track.mix_name})` : track.name, trackExtraArtists),
                        duration: track.length,
                        bpm: track.bpm
                    };
                })
            };
        }
    };
    var bleep = {
        id: "bleep",
        test: matchUrls("https://bleep.com/*"),
        supports: { formats: [
            "WAV",
            "FLAC",
            "MP3"
        ] },
        parse: async () => {
            const albumMainArtistsRaw = getManyTextFromTags(".product-page .product-details .main-artists a");
            const albumMainArtistsSource = albumMainArtistsRaw.length > 0 ? albumMainArtistsRaw : getTextFromTag(".product-page .product-details .artist a");
            const smallCover = getTextFromTag(".product-page .main-product-image img", null, "src")?.replace("/b/", "/s/") || null;
            const albumCover = getTextFromTag(".product-page .main-product-image img", null, "src");
            const albumExtraArtists = [];
            const albumArtists = normalizeMainArtists(albumMainArtistsSource, albumExtraArtists);
            const albumTitle = normalizeTitle(getTextFromTag(".product-page .product-details .release-title"));
            const albumLabel = getTextFromTag(".product-page .product-details .label");
            const labelNumber = getTextFromTag(".product-page .product-details .catalogue-number");
            const albumReleased = normalizeReleaseDate(getTextFromTag(".product-page .product-details .product-release-date"));
            const albumTracks = Array.from(document.querySelectorAll(".track-list > li")).map((track, index) => {
                const featuredArtistAnchors = new Set(track.querySelectorAll(".track-featured-artists a"));
                const mainArtistAnchors = new Set([...track.querySelectorAll(".track-main-artists a"), ...track.querySelectorAll(".track-artist a")]);
                featuredArtistAnchors.forEach((anchor) => mainArtistAnchors.delete(anchor));
                const trackMainArtists = Array.from(mainArtistAnchors).map((anchor) => cleanString(anchor.textContent)).filter((text) => Boolean(text));
                const trackFeaturedArtists = getManyTextFromTags(".track-featured-artists a", track);
                const trackPosition = `${index + 1}`;
                const trackExtraArtists = [];
                const trackArtists = trackMainArtists.length > 0 ? normalizeArtists(trackMainArtists, trackExtraArtists) : albumArtists;
                const trackTitle = normalizeTitle(getTextFromTag(".track-name [itemprop=\"name\"]", track), trackExtraArtists);
                const trackDuration = normalizeDuration(getTextFromTag(".track-duration", track));
                if (trackFeaturedArtists.length > 0) {normalizeArtists(trackFeaturedArtists).forEach((artist) => {
                    if (!trackExtraArtists.some((extraArtist) => extraArtist.name === artist.name && extraArtist.role === "Featuring")) {trackExtraArtists.push({
                        ...artist,
                        role: "Featuring"
                    });}
                });}
                return {
                    pos: trackPosition,
                    extraartists: trackExtraArtists,
                    artists: trackArtists,
                    title: trackTitle,
                    duration: trackDuration
                };
            });
            const featuredArtists = getManyTextFromTags(".product-page .product-details .featured-artists a");
            if (featuredArtists?.length) {normalizeArtists(featuredArtists).forEach((artist) => {
                if (!albumExtraArtists.some((extraArtist) => extraArtist.name === artist.name && extraArtist.role === "Featuring")) {albumExtraArtists.push({
                    ...artist,
                    role: "Featuring"
                });}
            });}
            return {
                thumb: smallCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: albumArtists,
                title: albumTitle,
                label: albumLabel,
                released: albumReleased,
                number: labelNumber,
                tracks: albumTracks
            };
        }
    };
    var hdtracks = {
        id: "hdtracks",
        test: matchUrls("https://*.hdtracks.com/*"),
        supports: { formats: ["WAV", "DSF"] },
        parse: async () => {
            const context = document.querySelector(".list-page.page-current:not(.page-swipeback-active)") || document.querySelector(".list-page.page-current");
            const albumCover = getTextFromTag(".list-info .list-cover", context, "style")?.match(/background-image:\s*url\("?(.*?)"?\)/)?.[1] ?? null;
            const albumExtraArtists = [];
            return {
                thumb: albumCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: normalizeMainArtists(getTextFromTag(".list-info .list-artist", context), albumExtraArtists),
                title: normalizeTitle(getTextFromTag(".list-info .list-title h2", context)),
                label: getTextFromTag(".list-info .list-artist + p", context),
                released: normalizeReleaseDate(getTextFromTag(".list-content .list-footer p:first-child", context)),
                tracks: Array.from((context || document).querySelectorAll(".tracks-table .list:not(.tracks-table-header) > ul > li")).map((track, index) => {
                    const trackPosition = `${index + 1}`;
                    const trackExtraArtists = [];
                    return {
                        pos: trackPosition,
                        extraartists: trackExtraArtists,
                        artists: normalizeArtists(getTextFromTag(".item-cell.artist", track, "", false, true), trackExtraArtists),
                        title: normalizeTitle(getTextFromTag(".item-cell.title", track, "", false, true), trackExtraArtists),
                        duration: normalizeDuration(getTextFromTag(".item-cell.duration .duration-container", track))
                    };
                })
            };
        }
    };
    async function getData$1() {
        const releaseId = getReleaseIdFromUrl();
        if (!releaseId) throw new Error(`[Discogs Submitter] Release ID not found`);
        return (await networkRequest({
            url: `https://www.junodownload.com/api/1.2/playlist/getplaylistdetails/?product_key=${releaseId}&limit=100&output_type=json`,
            method: "GET",
            responseType: "json"
        })).items;
    }
    var junodownload = {
        id: "junodownload",
        test: matchUrls("https://*.junodownload.com/*"),
        supports: { formats: [
            "WAV",
            "FLAC",
            "AIFF",
            "MP3"
        ] },
        parse: async () => {
            const data = await getData$1();
            const smallCover = getTextFromTag(".product-image-for-modal", null, "src");
            const albumCover = getTextFromTag(".product-image-for-modal", null, "data-src-full");
            const albumExtraArtists = [];
            const albumArtists = normalizeMainArtists(data[0].releaseArtists.map((artist) => artist.name), albumExtraArtists);
            const albumTitle = normalizeTitle(data[0].releaseTitle, albumExtraArtists);
            const albumLabel = data[0].label.name;
            const albumReleased = normalizeReleaseDate(getTextFromTag("#product-page-digi [itemprop=\"datePublished\"]"));
            let labelNumber = null;
            Array.from(document.querySelectorAll("#product-page-digi .mb-2")).some((element) => {
                const match = (element.innerHTML || "").replace(/&nbsp;/g, " ").match(/<strong>Cat:<\/strong>([^<]+)<br>/i);
                if (match?.[1]) {
                    labelNumber = cleanString(match[1]);
                    return true;
                }
                return false;
            });
            const albumTracks = data.map((track, index) => {
                const trackPosition = `${index + 1}`;
                const trackExtraArtists = [];
                return {
                    pos: trackPosition,
                    extraartists: trackExtraArtists,
                    artists: normalizeArtists(track.artists.map((artist) => artist.name), trackExtraArtists),
                    title: normalizeTitle(track.version ? `${track.title} (${track.version})` : track.title, trackExtraArtists),
                    duration: normalizeDuration(track.length),
                    bpm: track.bpm
                };
            });
            return {
                thumb: smallCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: albumArtists,
                title: albumTitle,
                label: albumLabel,
                released: albumReleased,
                number: labelNumber,
                tracks: albumTracks
            };
        }
    };
    async function getData() {
        const scripts = document.querySelectorAll("script[type=\"application/ld+json\"]");
        let data = null;
        Array.from(scripts).some((script) => {
            try {
                const jsonData = JSON.parse(script.textContent || "{}");
                if (jsonData["@type"] === "Product") {
                    data = jsonData;
                    return true;
                }
            } catch {
                return false;
            }
            return false;
        });
        return data;
    }
    var qobuz = {
        id: "qobuz",
        test: matchUrls("https://*.qobuz.com/*"),
        supports: { formats: [
            "WAV",
            "FLAC",
            "AIFF",
            "MP3"
        ] },
        beforeParse: () => {
            if (typeof unsafeWindow.infiniteScroll === "function") {try {
                unsafeWindow.infiniteScroll("/v4/ajax/album/load-tracks");
            } catch (error) {
                console.warn("[Discogs Submitter] Qobuz infiniteScroll trigger failed:", error);
            }}
        },
        parse: async () => {
            const data = await getData();
            const smallCover = getTextFromTag(".album-cover__image", null, "src");
            const albumCover = smallCover?.replace(/_(600|300)\.jpg$/, "_max.jpg").replace("_600", "_max") || null;
            const albumExtraArtists = [];
            const albumArtists = normalizeMainArtists(getTextFromTag(".album-meta__title .artist-name"), albumExtraArtists);
            return {
                thumb: smallCover,
                cover: albumCover,
                extraartists: albumExtraArtists,
                artists: albumArtists,
                title: normalizeTitle(getTextFromTag(".album-meta__title .album-title"), albumExtraArtists),
                label: getTextFromTag(".album-meta__item a[href*=\"/label/\"]"),
                released: data?.releaseDate || null,
                tracks: Array.from(document.querySelectorAll("#playerTracks > .player__item")).map((track, index) => {
                    const artistRow = getTextFromTag(".track__item--artist", track);
                    const trackPosition = `${index + 1}`;
                    const trackExtraArtists = [];
                    return {
                        pos: trackPosition,
                        extraartists: trackExtraArtists,
                        artists: artistRow ? normalizeArtists([artistRow], trackExtraArtists) : albumArtists,
                        title: normalizeTitle(getTextFromTag(".track__item--name", track), trackExtraArtists),
                        duration: normalizeDuration(getTextFromTag(".track__item--duration", track))
                    };
                })
            };
        }
    };
    var PROVIDER_STYLES = Object.fromEntries(Object.entries(Object.assign({ "./bleep/styles.css": styles_default$8 })).map(([path, content]) => {
        const match = path.match(/^\.\/([^/]+)\/styles\.css$/);
        return match ? [match[1], content] : null;
    }).filter((entry) => entry !== null));
    var DigitalStoreRegistry = {
        list: [
            bandcamp,
            qobuz,
            junodownload,
            beatport,
            sevendigital,
            amazonmusic,
            bleep,
            hdtracks
        ],
        detectByLocation: () => DigitalStoreRegistry.list.find((provider) => provider.test(unsafeWindow.location.href)),
        getStyles: (storeId) => PROVIDER_STYLES[storeId]
    };
    var FORBIDDEN_KEYS = new Set([
        "__proto__",
        "prototype",
        "constructor"
    ]);
    function defineOwnProperty(target, key, value) {
        Object.defineProperty(target, key, {
            value,
            writable: true,
            enumerable: true,
            configurable: true
        });
    }
    function getValueByPath(object, path) {
        if (!path) return object;
        return path.split(".").reduce((accumulator, key) => accumulator?.[key], object);
    }
    function setValueByPath(object, path, value) {
        if (!path) return;
        const parts = path.split(".");
        if (parts.some((part) => FORBIDDEN_KEYS.has(part))) return;
        let current = object;
        for (let index = 0; index < parts.length - 1; index++) {
            const key = parts[index];
            const nextKey = parts[index + 1];
            const existing = Reflect.get(current, key);
            const isContainer = existing !== null && (typeof existing === "object" || typeof existing === "function");
            if (!Object.hasOwn(current, key) || !isContainer) {
                const nextContainer = /^\d+$/.test(nextKey) ? [] : {};
                defineOwnProperty(current, key, nextContainer);
                current = nextContainer;
            } else current = existing;
        }
        defineOwnProperty(current, parts[parts.length - 1], value);
    }
    var EVENT_NAME_RE = /^[A-Z][\w-]*$/i;
    var HANDLER_NAME_RE = /^[A-Z_$][\w$]*$/i;
    function parseDataEventDeclaration(declaration) {
        const source = declaration.trim();
        if (!source) throw new TypeError("Invalid data-event declaration: empty value");
        return source.split("|").map((rawBinding) => {
            const binding = rawBinding.trim();
            const parts = binding.split(":").map((part) => part.trim());
            const [eventName, handlerName] = parts;
            if (parts.length !== 2 || !EVENT_NAME_RE.test(eventName) || !HANDLER_NAME_RE.test(handlerName)) throw new TypeError(`Invalid data-event declaration: "${binding}"`);
            return {
                eventName,
                handlerName
            };
        });
    }
    function bindCollectedEvents(bindings, events) {
        if (!events || typeof events !== "object") throw new TypeError("options.events must be an object");
        for (const { handlerName } of bindings) {
            const handler = events[handlerName];
            if (typeof handler !== "function" && typeof handler?.handleEvent !== "function") throw new TypeError(`Missing event handler: ${handlerName}`);
        }
        const processedElements = new Set();
        for (const { element, eventName, handlerName } of bindings) {
            element.addEventListener(eventName, events[handlerName]);
            processedElements.add(element);
        }
        for (const element of processedElements) element.removeAttribute("data-event");
    }
    function renderTemplate(template, data, domElement, { replace = false, events } = {}) {
        if (replace) domElement.textContent = "";
        let templateElement;
        if (typeof template === "string") {
            templateElement = document.createElement("template");
            templateElement.innerHTML = template;
        } else templateElement = template;
        const fragment = templateElement.content.cloneNode(true);
        const eventBindings = events == null ? null : [];
        walk(fragment, data, eventBindings);
        if (eventBindings && eventBindings.length > 0 && events) bindCollectedEvents(eventBindings, events);
        domElement.append(fragment);
    }
    var processIf = (element, context, walk, eventBindings) => {
        if (!element.dataset.if) return false;
        let expression = element.dataset.if.trim();
        let invert = false;
        if (expression.startsWith("!")) {
            invert = true;
            expression = expression.slice(1).trim();
        }
        const rawValue = getValueByPath(context, expression);
        let condition = Boolean(rawValue);
        if (invert) condition = !condition;
        element.removeAttribute("data-if");
        if (!condition) {
            element.remove();
            return true;
        }
        if (element.tagName === "VAR" || "unwrap" in element.dataset) {
            const children = Array.from(element.childNodes);
            if (element.parentElement) {
                element.before(...children);
                element.remove();
                for (const childNode of children) walk(childNode, context, eventBindings);
            } else for (const childNode of children) walk(childNode, context, eventBindings);
            return true;
        }
        return false;
    };
    var processLoop = (element, context, walk, eventBindings) => {
        if (!element.dataset.loop) return false;
        const loopExpression = element.dataset.loop;
        const source = getValueByPath(context, loopExpression);
        const processItem = (itemContext) => {
            const clone = element.cloneNode(true);
            clone.removeAttribute("data-loop");
            walk(clone, itemContext, eventBindings);
            if (element.tagName === "VAR" || "unwrap" in element.dataset) element.before(...Array.from(clone.childNodes));
            else element.before(clone);
        };
        if (Array.isArray(source)) {
            const length = source.length;
            for (let index = 0; index < length; index++) {
                const item = source[index];
                processItem({
                    _value: item,
                    ...item && typeof item === "object" ? { ...item } : { _value: item },
                    _index: index,
                    _first: index === 0,
                    _last: index === length - 1
                });
            }
        } else if (source && typeof source === "object") {
            const entries = Object.entries(source);
            for (let index = 0; index < entries.length; index++) {
                const [key, value] = entries[index];
                processItem(Array.isArray(value) ? {
                    _key: key,
                    _value: value,
                    _index: index
                } : value && typeof value === "object" ? {
                    _value: value,
                    ...value,
                    _key: key,
                    _index: index
                } : {
                    _key: key,
                    _value: value,
                    _index: index
                });
            }
        } else if (source != null) throw new TypeError(`data for "${loopExpression}" must be array or object`);
        element.remove();
        return true;
    };
    var processStyle = (element, context) => {
        if (!element.dataset.style) return false;
        element.dataset.style.split("|").forEach((pair) => {
            const [property, path] = pair.split(":");
            const value = getValueByPath(context, path);
            if (value != null) element.style.setProperty(property, String(value));
        });
        element.removeAttribute("data-style");
        return false;
    };
    var processAttr = (element, context) => {
        if (!element.dataset.attr) return false;
        element.dataset.attr.split("|").forEach((binding) => {
            const [key, path] = binding.split(":");
            const value = getValueByPath(context, path);
            if (value != null) {if (key === "class") {
                const classNames = String(value).trim().split(/\s+/).filter(Boolean);
                if (classNames.length) element.classList.add(...classNames);
            } else element.setAttribute(key, String(value));}
        });
        element.removeAttribute("data-attr");
        return false;
    };
    var processText = (element, context) => {
        if (element.dataset.text == null) return false;
        const path = element.dataset.text.trim();
        const value = path === "" ? context && typeof context === "object" && "_value" in context ? context._value : context : getValueByPath(context, path);
        element.textContent = value != null ? String(value) : "";
        element.removeAttribute("data-text");
        return false;
    };
    var processEvent = (element, context, walk, eventBindings) => {
        if (!eventBindings || !element.dataset.event) return false;
        const parsed = parseDataEventDeclaration(element.dataset.event);
        for (const { eventName, handlerName } of parsed) {eventBindings.push({
            element,
            eventName,
            handlerName
        });}
        return false;
    };
    var processVar = (element, context, walk, eventBindings) => {
        if (element.tagName === "VAR" && !element.firstElementChild) {
            const path = element.textContent?.trim() || "";
            const value = path === "" ? context && typeof context === "object" && "_value" in context ? context._value : context : getValueByPath(context, path);
            element.replaceWith(document.createTextNode(value != null ? String(value) : ""));
            return true;
        }
        if (element.tagName === "VAR" || "unwrap" in element.dataset) {
            const children = Array.from(element.childNodes);
            if (element.parentElement) {
                element.before(...children);
                element.remove();
                for (const childNode of children) walk(childNode, context, eventBindings);
            } else for (const childNode of children) walk(childNode, context, eventBindings);
            return true;
        }
        return false;
    };
    function walk(node, context, eventBindings = null) {
        if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {
            for (const child of Array.from(node.childNodes)) walk(child, context, eventBindings);
            return;
        }
        if (node.nodeType === Node.COMMENT_NODE) {
            node.parentElement?.removeChild(node);
            return;
        }
        if (node.nodeType === Node.ELEMENT_NODE) {
            const element = node;
            if (processIf(element, context, walk, eventBindings)) return;
            if (processLoop(element, context, walk, eventBindings)) return;
            processStyle(element, context, walk, eventBindings);
            processAttr(element, context, walk, eventBindings);
            processText(element, context, walk, eventBindings);
            processEvent(element, context, walk, eventBindings);
            if (processVar(element, context, walk, eventBindings)) return;
            for (const child of Array.from(element.childNodes)) walk(child, context, eventBindings);
        }
    }
    var styles_default$7 = ".discogs-submitter__inject{z-index:999998;filter:drop-shadow(0 0 1px rgba(var(--ds-palette-secondary-color), 1)) drop-shadow(0 0 2px rgba(var(--ds-palette-secondary-color), 1));flex-direction:column;transition:all .5s;display:flex;position:fixed;top:50%;transform:translateY(-50%);&.is-position-left{left:0;& .discogs-submitter__button.is-inject{mask:radial-gradient(var(--ds-radius) at 100% var(--ds-radius), rgba(var(--ds-color-black), 0) 98%, rgba(var(--ds-color-black), 1) 101%) 0 calc(-1 * var(--ds-radius)) / var(--ds-radius) 100% repeat-y, conic-gradient(rgba(var(--ds-color-black), 1) 0 0) padding-box;border-radius:0 50% 50% 0}&.is-hidden{opacity:0;pointer-events:none;transform:translate(-100%,-50%)}}&.is-position-right{right:0;& .discogs-submitter__button.is-inject{mask:radial-gradient(var(--ds-radius) at 0 var(--ds-radius), rgba(var(--ds-color-black), 0) 98%, rgba(var(--ds-color-black), 1) 101%) 100% calc(-1 * var(--ds-radius)) / var(--ds-radius) 100% repeat-y, conic-gradient(rgba(var(--ds-color-black), 1) 0 0) padding-box;border-radius:50% 0 0 50%}&.is-hidden{opacity:0;pointer-events:none;transform:translate(100%,-50%)}}&:hover{filter:drop-shadow(0 0 1px rgba(var(--ds-palette-primary-color), 1)) drop-shadow(0 0 2px rgba(var(--ds-palette-primary-color), 1));& .discogs-submitter__button.is-inject{background:rgba(var(--ds-palette-secondary-color), 1)}}}.discogs-submitter__button.is-inject{box-sizing:content-box;border-block:var(--ds-radius) solid rgba(var(--ds-color-black), 0);background:rgba(var(--ds-palette-primary-color), 1);font-size:14px;&.is-icon{padding:.15em}}";
    var template_default$8 = "<div class=\"discogs-submitter__inject\" role=\"button\" tabindex=\"0\" data-attr=\"title:scriptName|aria-label:scriptName\">\n  <svg class=\"discogs-submitter__button is-icon is-inject\" aria-hidden=\"true\"><use href=\"#ds-logo\"></use></svg>\n</div>\n";
    var InjectButton = class {
        element = null;
        constructor() {
            this.build();
            this.injectStyles();
        }
        injectStyles() {
            if (document.getElementById(`${USERSCRIPT.ID}-inject-button-styles`)) return;
            const style = document.createElement("style");
            style.id = `${USERSCRIPT.ID}-inject-button-styles`;
            style.textContent = styles_default$7;
            document.head.appendChild(style);
        }
        build() {
            const data = { scriptName: USERSCRIPT.NAME };
            const wrapper = document.createElement("div");
            renderTemplate(template_default$8, data, wrapper);
            this.element = wrapper.firstElementChild;
        }
        setPosition(side) {
            if (!this.element) return;
            this.element.classList.toggle("is-position-left", side === "left");
            this.element.classList.toggle("is-position-right", side === "right");
        }
        setHidden(hidden) {
            this.element?.classList.toggle("is-hidden", hidden);
        }
    };
    var styles_default$6 = ".discogs-submitter__footer{padding:var(--ds-gap) var(--ds-gap) calc(var(--ds-gap) / 2)}.discogs-submitter__copyright{justify-content:center;gap:var(--ds-gap);margin:var(--ds-gap) 0 0;font-size:10px;display:flex}.discogs-submitter__copyright__link{color:currentColor;text-decoration:none;&:hover{text-decoration:underline}& span{vertical-align:middle;color:rgba(var(--ds-color-error), 1);font-family:var(--ds-font-monospace);animation:1s ease-in-out infinite ds-pulse;display:inline-block}}";
    var styles_default$5 = ".discogs-submitter__header{gap:var(--ds-gap);padding:calc(var(--ds-gap) / 2) var(--ds-gap) var(--ds-gap);display:flex}.discogs-submitter__header__cover{width:40px;height:40px}.discogs-submitter__header__cover__logo,.discogs-submitter__header__cover__image{width:100%;height:100%}.discogs-submitter__header__cover__image{outline:1px solid rgba(var(--ds-palette-secondary-color), 1);border:1px solid rgba(var(--ds-palette-primary-color), 1);border-radius:calc(var(--ds-radius) / 2);object-fit:cover}.discogs-submitter__header__content{justify-content:space-between;align-items:center;gap:var(--ds-gap);flex:auto;display:flex}.discogs-submitter__header__title{text-shadow:0 0 10px rgba(var(--ds-color-white), .5);font-size:20px;font-weight:700}.discogs-submitter__header__actions{align-items:center;gap:var(--ds-gap);display:flex;& .discogs-submitter__button{&.is-to-left,&.is-to-right{background:rgba(var(--ds-palette-secondary-color), .3);color:rgba(var(--ds-palette-primary-color), 1);letter-spacing:.05em;text-transform:uppercase;&:hover{background:rgba(var(--ds-color-info), 1)}}&.is-close{background:rgba(var(--ds-palette-secondary-color), 1);color:rgba(var(--ds-palette-primary-color), 1);padding:.15em;&:hover{background:rgba(var(--ds-color-error), 1)}}}}.discogs-submitter.is-position-left{& .discogs-submitter__header{flex-direction:row-reverse}& .discogs-submitter__header__actions{flex-direction:row-reverse;& .discogs-submitter__button.is-to-left{display:none}}& .discogs-submitter__header__content{flex-direction:row-reverse}}.discogs-submitter.is-position-right{& .discogs-submitter__header__actions{& .discogs-submitter__button.is-to-right{display:none}}}";
    var styles_default$4 = ".discogs-submitter__loader{justify-content:center;align-items:center;gap:var(--ds-gap);visibility:hidden;opacity:0;z-index:-1;backdrop-filter:blur(5px);background:rgba(var(--ds-palette-primary-color), .8);flex-direction:column;width:100%;height:100%;transition:all 1s;display:flex;position:absolute;top:0;left:0;&.is-loading{visibility:visible;opacity:1;z-index:10}}.discogs-submitter__loader__icon{width:4em;height:4em;animation:.5s linear infinite ds-spinner}.discogs-submitter__loader__cover{outline:.1px solid rgba(var(--ds-palette-secondary-color), 1);border:.1px solid rgba(var(--ds-palette-primary-color), 1);border-radius:calc(var(--ds-radius) / 2);background:var(--ds-thumb-url) no-repeat 50%;object-fit:cover;background-size:cover;width:8em;height:8em;animation:2s ease-in-out infinite ds-pulse}.discogs-submitter__loader__label{color:rgba(var(--ds-palette-secondary-color), 1);font-size:12px}";
    var styles_default$3 = ".discogs-submitter__results{gap:0 var(--ds-gap);font-size:10px;line-height:normal;font-family:var(--ds-font-monospace);flex-wrap:wrap;display:flex}.discogs-submitter__results__row{gap:calc(var(--ds-gap) / 2);border-bottom:2px dotted rgba(var(--ds-palette-secondary-color), .15);grid-template-columns:60px 1fr;width:100%;padding:2px 0;display:grid;&.is-half{width:calc(50% - var(--ds-gap) / 2)}&.is-tracklist{grid-template-columns:20px 1fr 1fr 50px;&.is-no-artist{grid-template-columns:20px 1fr 50px}&>.discogs-submitter__results__head{text-align:left}&>.discogs-submitter__results__body:last-child{text-align:right}}&.is-notes{gap:calc(var(--ds-gap) / 6);grid-template-columns:1fr;&>.discogs-submitter__results__head{text-align:left}}}.discogs-submitter__results__head{text-align:right;padding-top:3px;font-weight:700}.discogs-submitter__results__body{align-items:start;gap:calc(var(--ds-gap) / 6);flex-direction:column;display:flex;& small{font-size:9px}&.is-multiple{display:block;& .discogs-submitter__results__field{vertical-align:middle;width:auto;display:inline-flex}}&.is-inner{padding-left:calc(var(--ds-gap) / 2)}}.discogs-submitter__results__field{align-items:start;gap:calc(var(--ds-gap) / 6);flex-wrap:nowrap;width:100%;display:flex;& .discogs-submitter__textarea{width:100%;min-height:60px}& .discogs-submitter__button{padding:calc(var(--ds-gap) / 6);flex:none}}";
    var styles_default$2 = ".discogs-submitter__status{--status-color:rgba(var(--ds-palette-secondary-color), 1);align-items:start;gap:var(--ds-gap);z-index:1;margin-bottom:var(--ds-gap);border-left:4px solid var(--status-color);border-radius:calc(var(--ds-radius) / 2);padding:calc(var(--ds-gap) / 2);transition:all .3s;display:flex;position:relative;overflow:hidden;&:after{opacity:.1;z-index:-1;background:var(--status-color);content:\"\";width:100%;height:100%;transition:all .3s;position:absolute;top:0;left:0}&.is-success{--status-color:rgba(var(--ds-color-success), 1)}&.is-error{--status-color:rgba(var(--ds-color-error), 1)}&.is-info{--status-color:rgba(var(--ds-color-info), 1)}&.is-warning{--status-color:rgba(var(--ds-color-warning), 1)}& .discogs-submitter__button{flex:none;margin-left:auto;&.is-debug{color:rgba(var(--ds-color-black), 1);background:0 0;&.is-success{color:rgba(var(--ds-color-success), 1)}&.is-error{color:rgba(var(--ds-color-error), 1)}}}}";
    var styles_default$1 = ".discogs-submitter{visibility:hidden;opacity:0;z-index:999999;box-shadow:0 0 15px rgba(var(--ds-color-black), .3);background:rgba(var(--ds-palette-primary-color), 1);width:calc(100% - (var(--ds-gap) * 2));max-width:500px;color:rgba(var(--ds-palette-secondary-color), 1);flex-direction:column;justify-content:start;transition:all .5s;display:flex;position:fixed;top:0;bottom:0;overflow:hidden;&:after{z-index:-1;mask-image:linear-gradient(to bottom, rgba(var(--ds-color-black), 1) 0%, rgba(var(--ds-color-black), .025) 150px);filter:blur(4px)opacity(80%);background:var(--ds-thumb-url) no-repeat 50% 0;content:\"\";background-size:100%;width:100%;height:100%;position:absolute;top:0;left:0;overflow:hidden;transform:scale(1.04)}&.is-open{visibility:visible;opacity:1}&.is-position-left{border-right:1px solid rgba(var(--ds-palette-primary-color), 1);left:0;transform:translate(-100%);&.is-open{transform:translate(0)}}&.is-position-right{border-left:1px solid rgba(var(--ds-palette-primary-color), 1);right:0;transform:translate(100%);&.is-open{transform:translate(0)}}&.is-webarchive{top:var(--wm-toolbar-height)}}.discogs-submitter__content{margin:0 calc(var(--ds-gap) - 2px);scrollbar-color:rgba(var(--ds-palette-secondary-color), 1) transparent;scrollbar-width:thin;-webkit-overflow-scrolling:touch;height:100%;padding:0 2px;overflow:auto;&::-webkit-scrollbar{width:6px}}@keyframes ds-spinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes ds-pulse{0%{transform:scale(1)}50%{transform:scale(1.2)}to{transform:scale(1)}}";
    var styles_default = ".discogs-submitter__actions{gap:var(--ds-gap);flex-wrap:nowrap;display:flex}";
    var ALLOWED_COUNTRIES = [
        "Worldwide",
        "Australia",
        "Belgium",
        "Brazil",
        "Canada",
        "China",
        "Cuba",
        "France",
        "Germany",
        "Italy",
        "Ireland",
        "India",
        "Jamaica",
        "Japan",
        "Mexico",
        "Netherlands",
        "New Zealand",
        "Spain",
        "Sweden",
        "Switzerland",
        "UK",
        "US",
        "Africa",
        "Asia",
        "Australia & New Zealand",
        "Benelux",
        "Australasia",
        "Central America",
        "Czech Republic & Slovakia",
        "Czech And Slovak Federative Republic",
        "Europe",
        "Gulf Cooperation Council",
        "Germany, Austria, & Switzerland",
        "Germany & Switzerland",
        "France & Benelux",
        "Middle East",
        "North America (inc Mexico)",
        "North & South America",
        "South America",
        "Scandinavia",
        "South East Asia",
        "UK & Ireland",
        "UK, Europe & US",
        "UK & Europe",
        "UK & US",
        "UK & France",
        "UK, Europe & Japan",
        "UK, Europe & Israel",
        "UK & Germany",
        "USA & Canada",
        "USA, Canada & UK",
        "USA, Canada & Europe",
        "USA & Europe",
        "Afghanistan",
        "Abkhazia",
        "Albania",
        "Algeria",
        "American Samoa",
        "Andorra",
        "Angola",
        "Anguilla",
        "Antarctica",
        "Antigua & Barbuda",
        "Argentina",
        "Armenia",
        "Aruba",
        "Austria",
        "Austria-Hungary",
        "Azerbaijan",
        "Bahamas, The",
        "Bahrain",
        "Bangladesh",
        "Barbados",
        "Belarus",
        "Belize",
        "Belgian Congo",
        "Benin",
        "Bermuda",
        "Bhutan",
        "Bolivia",
        "Bohemia",
        "Bosnia & Herzegovina",
        "Botswana",
        "British Indian Ocean Territory",
        "British Virgin Islands",
        "Brunei",
        "Bulgaria",
        "Burkina Faso",
        "Burma",
        "Burundi",
        "Cambodia",
        "Cameroon",
        "Cape Verde",
        "Cayman Islands",
        "Central African Republic",
        "Chad",
        "Chile",
        "Christmas Island",
        "Cocos (Keeling) Islands",
        "Colombia",
        "Comoros",
        "Congo, Democratic Republic of the",
        "Congo, Republic of the",
        "Cook Islands",
        "Costa Rica",
        "Croatia",
        "Curaçao",
        "Cyprus",
        "Czech Republic",
        "Czechoslovakia",
        "Denmark",
        "Dahomey",
        "Djibouti",
        "Dominica",
        "Dominican Republic",
        "Dutch East Indies",
        "East Timor",
        "Ecuador",
        "Egypt",
        "El Salvador",
        "Equatorial Guinea",
        "Eritrea",
        "Estonia",
        "Ethiopia",
        "Falkland Islands",
        "Faroe Islands",
        "Fiji",
        "Finland",
        "French Guiana",
        "French Polynesia",
        "French Southern & Antarctic Lands",
        "Gabon",
        "Gambia, The",
        "Gaza Strip",
        "Georgia",
        "German Democratic Republic (GDR)",
        "Ghana",
        "Gibraltar",
        "Greece",
        "Greenland",
        "Grenada",
        "Guadeloupe",
        "Guam",
        "Guatemala",
        "Guernsey",
        "Guinea",
        "Guinea-Bissau",
        "Guyana",
        "Haiti",
        "Honduras",
        "Hong Kong",
        "Hong Kong & Thailand",
        "Hungary",
        "Iceland",
        "Indochina",
        "Indonesia",
        "Iran",
        "Iraq",
        "Israel",
        "Ivory Coast",
        "Isle Of Man",
        "Italian East Africa",
        "Jersey",
        "Jordan",
        "Kazakhstan",
        "Kenya",
        "Kiribati",
        "Korea (pre-1945)",
        "Kuwait",
        "Kosovo",
        "Kyrgyzstan",
        "Laos",
        "Latvia",
        "Lebanon",
        "Lesotho",
        "Liberia",
        "Libya",
        "Liechtenstein",
        "Lithuania",
        "Luxembourg",
        "Macau",
        "Macedonia",
        "Madagascar",
        "Malawi",
        "Malaysia",
        "Maldives",
        "Mali",
        "Malta",
        "Marshall Islands",
        "Martinique",
        "Mauritania",
        "Mauritius",
        "Mayotte",
        "Micronesia, Federated States of",
        "Moldova, Republic of",
        "Monaco",
        "Mongolia",
        "Montserrat",
        "Montenegro",
        "Morocco",
        "Mozambique",
        "Namibia",
        "Nauru",
        "Nepal",
        "Netherlands Antilles",
        "New Caledonia",
        "Nicaragua",
        "Niger",
        "Nigeria",
        "Niue",
        "Norfolk Island",
        "Northern Mariana Islands",
        "North Korea",
        "Norway",
        "Oman",
        "Ottoman Empire",
        "Pakistan",
        "Palau",
        "Palestine",
        "Panama",
        "Papua New Guinea",
        "Paraguay",
        "Peru",
        "Philippines",
        "Pitcairn Islands",
        "Poland",
        "Portugal",
        "Protectorate of Bohemia and Moravia",
        "Puerto Rico",
        "Qatar",
        "Reunion",
        "Romania",
        "Rhodesia",
        "Russia",
        "Russia & CIS",
        "Rwanda",
        "Saint Helena",
        "Saar",
        "Saint Kitts and Nevis",
        "Saint Lucia",
        "Saint Pierre and Miquelon",
        "Saint Vincent and the Grenadines",
        "Samoa",
        "San Marino",
        "Sao Tome and Principe",
        "Saudi Arabia",
        "Senegal",
        "Serbia and Montenegro",
        "Serbia",
        "Seychelles",
        "Sierra Leone",
        "Singapore",
        "Sint Maarten",
        "Singapore, Malaysia & Hong Kong",
        "Singapore & Malaysia",
        "Singapore, Malaysia, Hong Kong & Thailand",
        "Slovakia",
        "Slovenia",
        "Solomon Islands",
        "Somalia",
        "Southern Rhodesia",
        "South Africa",
        "South Georgia and the South Sandwich Islands",
        "South Korea",
        "South Vietnam",
        "South Pacific",
        "South West Africa",
        "Southern Sudan",
        "Sri Lanka",
        "Sudan",
        "Suriname",
        "Swaziland",
        "Syria",
        "Taiwan",
        "Tajikistan",
        "Tanzania",
        "Thailand",
        "Togo",
        "Tibet",
        "Tokelau",
        "Tonga",
        "Trinidad & Tobago",
        "Tunisia",
        "Turkey",
        "Turkmenistan",
        "Turks and Caicos Islands",
        "Tuvalu",
        "Uganda",
        "Ukraine",
        "United Arab Emirates",
        "Upper Volta",
        "Uruguay",
        "USSR",
        "Uzbekistan",
        "Vanuatu",
        "Vatican City",
        "Venezuela",
        "Vietnam",
        "Virgin Islands",
        "Wake Island",
        "Wallis and Futuna",
        "West Bank",
        "Western Sahara",
        "Yemen",
        "Yugoslavia",
        "Zambia",
        "Zaire",
        "Zanzibar",
        "Zimbabwe"
    ];
    var COUNTRY_MAP = new Map([
        ["usa", "US"],
        ["united states", "US"],
        ["united states of america", "US"],
        ["united kingdom", "UK"],
        ["the uk", "UK"],
        ["great britain", "UK"],
        ["bahamas", "Bahamas, The"],
        ["micronesia", "Micronesia, Federated States of"],
        ["moldova", "Moldova, Republic of"],
        ["russian federation", "Russia"],
        ["holland", "Netherlands"],
        ["republic of korea", "South Korea"],
        ["dprk", "North Korea"],
        ["uae", "United Arab Emirates"],
        ["bolivarian republic of venezuela", "Venezuela"],
        ["syrian arab republic", "Syria"],
        ["viet nam", "Vietnam"],
        ["lao peoples democratic republic", "Laos"],
        ["brunei darussalam", "Brunei"],
        ["macao", "Macau"],
        ["czechia", "Czech Republic"]
    ]);
    var LOWERCASE_ALLOWED_COUNTRIES = new Map(ALLOWED_COUNTRIES.map((country) => [country.toLowerCase(), country]));
    function normalizeCountry(country) {
        if (!country) return "";
        const cleaned = country.replace(/\./g, "").trim().toLowerCase();
        const mapped = COUNTRY_MAP.get(cleaned);
        if (mapped) return mapped;
        return LOWERCASE_ALLOWED_COUNTRIES.get(cleaned) || "";
    }
    function resolveCountry(raw) {
        if (!raw) return "Worldwide";
        if (ALLOWED_COUNTRIES.includes(raw)) return raw;
        return normalizeCountry(raw) || "Worldwide";
    }
    function extractFormatFromTitle(title) {
        if (!title) return [];
        const detectedFormats = new Set();
        for (const [description, keywords] of Object.entries(TITLE_FORMAT)) {
            if (keywords.length === 0) continue;
            const pattern = `\\b(?:${keywords.map((keyword) => keyword.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("|")})\\b`;
            if (new RegExp(pattern, "i").test(title)) detectedFormats.add(description);
        }
        return Array.from(detectedFormats);
    }
    var DiscogsMapper = { mapToPayload: (data, sourceUrl, options) => {
        const { format = "WAV" } = options || {};
        const releaseArtistsArr = data.artists || [];
        const tracks = data.tracks || [];
        const firstTrackArtists = tracks[0]?.artists || [];
        const allTracksShareSameArtists = tracks.length > 0 && tracks.every((track) => {
            const trackArtists = track.artists || [];
            if (trackArtists.length !== firstTrackArtists.length) return false;
            return trackArtists.every((artist, index) => artist.name === firstTrackArtists[index].name && artist.join === firstTrackArtists[index].join);
        });
        let finalReleaseArtists = releaseArtistsArr;
        if ((!finalReleaseArtists.length || finalReleaseArtists.length === 1 && !finalReleaseArtists[0].name) && allTracksShareSameArtists && firstTrackArtists.length > 0) finalReleaseArtists = firstTrackArtists;
        const allTracksMatchRelease = tracks.length > 0 && tracks.every((track) => {
            const trackArtists = track.artists || [];
            if (trackArtists.length !== finalReleaseArtists.length) return false;
            const trackArtistNames = trackArtists.map((artist) => (artist.name || "").trim().toLowerCase()).sort();
            const releaseArtistNames = finalReleaseArtists.map((artist) => (artist.name || "").trim().toLowerCase()).sort();
            return JSON.stringify(trackArtistNames) === JSON.stringify(releaseArtistNames);
        });
        const labelName = data.label || "Not On Label";
        let formatText = options?.formatText ?? "";
        if (!formatText) {
            if (format === "MP3") formatText = "320 kbps";
        }
        const releaseFormat = options?.descriptions || extractFormatFromTitle(data.title);
        const totalTracks = data.tracks?.length ? `${data.tracks.length}` : "1";
        const validBpmTracks = (data.tracks || []).filter((track) => track.bpm);
        const infoBpm = validBpmTracks.length > 0 ? `BPM's:\n${validBpmTracks.map((track) => `${track.pos}: ${track.bpm}`).join("\n")}` : "";
        let finalArtists = finalReleaseArtists;
        if ((!finalArtists.length || finalArtists[0]?.name === "") && tracks.length > 1) {
            if (new Set(tracks.map((track) => (track.artists?.[0]?.name || "").toLowerCase()).filter(Boolean)).size >= 4) {finalArtists = [{
                name: "Various",
                join: ","
            }];}
        }
        const payload = {
            cover: data.cover || null,
            title: data.title || "",
            artists: finalArtists.length ? finalArtists : [{
                name: "",
                join: ","
            }],
            extraartists: groupExtraArtists(data.extraartists || []),
            country: normalizeCountry(options?.country !== void 0 ? options.country : data.country || "Worldwide"),
            released: data.released || "",
            labels: labelName ? [{
                name: labelName,
                catno: data.number || "none"
            }] : [{
                name: "",
                catno: ""
            }],
            format: [{
                name: "File",
                qty: totalTracks,
                desc: [format, ...releaseFormat],
                text: formatText
            }],
            tracks: (data.tracks || []).map((track) => ({
                pos: track.pos || "",
                artists: allTracksMatchRelease ? [] : track.artists || [],
                extraartists: groupExtraArtists(track.extraartists || []),
                title: track.title || "",
                duration: track.duration || ""
            })),
            notes: data.notes ?? infoBpm,
            submissionNotes: data.submissionNotes || `${sourceUrl}\n---\nA digital release has been added.`
        };
        return {
            _previewObject: payload,
            full_data: JSON.stringify(payload),
            sub_notes: payload.submissionNotes
        };
    } };
    function normalizeLabel(label, primaryArtistName) {
        const cleanLabel = cleanString(label) || "";
        const cleanArtist = cleanString(primaryArtistName) || "";
        if (!cleanLabel) return "Not On Label";
        if (cleanArtist && cleanLabel.toLowerCase() === cleanArtist.toLowerCase()) return `Not On Label (${cleanArtist} Self-released)`;
        return cleanLabel;
    }
    var template_default$7 = "<div class=\"discogs-submitter__status\"></div>\n\n<div class=\"discogs-submitter__actions\"></div>\n\n<div class=\"discogs-submitter__copyright\">\n  <a class=\"discogs-submitter__copyright__link\" data-attr=\"href:homepage\" target=\"_blank\">Homepage</a>\n  <a class=\"discogs-submitter__copyright__link\" data-attr=\"href:supportURL\" target=\"_blank\">Report Bug</a>\n  <a class=\"discogs-submitter__copyright__link\" data-attr=\"href:funding\" target=\"_blank\">Made with <span>♥</span> for music</a>\n</div>\n";
    var FooterController = class {
        slot;
        statusSlot = null;
        actionsSlot = null;
        constructor(slot) {
            this.slot = slot;
            if (!this.slot) return;
            renderTemplate(template_default$7, {
                homepage: USERSCRIPT.HOMEPAGE,
                supportURL: USERSCRIPT.SUPPORT_URL,
                funding: USERSCRIPT.FUNDING_URL
            }, this.slot, { replace: true });
            this.statusSlot = this.slot.querySelector(".discogs-submitter__status");
            this.actionsSlot = this.slot.querySelector(".discogs-submitter__actions");
        }
    };
    var template_default$6 = "<div class=\"discogs-submitter__header__cover\">\n  <var data-if=\"thumb\">\n    <img class=\"discogs-submitter__header__cover__image\" data-attr=\"src:thumb\" alt=\"\" />\n  </var>\n\n  <var data-if=\"!thumb\">\n    <svg class=\"discogs-submitter__header__cover__logo\" aria-hidden=\"true\"><use href=\"#ds-logo\"></use></svg>\n  </var>\n</div>\n\n<div class=\"discogs-submitter__header__content\">\n  <div class=\"discogs-submitter__header__title\">\n    <var>scriptName</var>\n  </div>\n\n  <div class=\"discogs-submitter__header__actions\">\n    <div class=\"discogs-submitter__button is-to-left\" role=\"button\" tabindex=\"0\" aria-label=\"Dock widget to left side\">Move to left</div>\n    <div class=\"discogs-submitter__button is-to-right\" role=\"button\" tabindex=\"0\" aria-label=\"Dock widget to right side\">Move to right</div>\n    <svg class=\"discogs-submitter__button is-icon is-large is-close\" role=\"button\" tabindex=\"0\" title=\"Close widget\" aria-label=\"Close widget\"><use href=\"#ds-icon-close\"></use></svg>\n  </div>\n</div>\n";
    var HeaderController = class {
        slot;
        hooks;
        getThumb;
        buttonToLeft = null;
        buttonToRight = null;
        buttonClose = null;
        constructor(slot, hooks, getThumb) {
            this.slot = slot;
            this.hooks = hooks;
            this.getThumb = getThumb;
            this.refresh();
        }
        updateCover() {
            this.refresh();
        }
        refresh() {
            if (!this.slot) return;
            renderTemplate(template_default$6, {
                scriptName: USERSCRIPT.NAME,
                thumb: this.getThumb()
            }, this.slot, { replace: true });
            this.buttonToLeft = this.slot.querySelector(".discogs-submitter__button.is-to-left");
            this.buttonToRight = this.slot.querySelector(".discogs-submitter__button.is-to-right");
            this.buttonClose = this.slot.querySelector(".discogs-submitter__button.is-close");
            bindActivation(this.buttonToLeft, () => this.hooks.onPositionChange?.("left"));
            bindActivation(this.buttonToRight, () => this.hooks.onPositionChange?.("right"));
            bindActivation(this.buttonClose, () => this.hooks.onClose?.());
        }
    };
    var template_default$5 = "<var data-if=\"thumb\">\n  <img class=\"discogs-submitter__loader__cover\" data-attr=\"src:thumb\" alt=\"\" />\n</var>\n\n<var data-if=\"!thumb\">\n  <svg class=\"discogs-submitter__loader__icon\" aria-hidden=\"true\"><use href=\"#ds-logo\"></use></svg>\n</var>\n\n<div class=\"discogs-submitter__loader__label\"><var>label</var></div>\n";
    var LoaderController = class {
        element;
        getThumb;
        constructor(element, getThumb) {
            this.element = element;
            this.getThumb = getThumb;
        }
        setActive(isActive, label = "Please wait...") {
            if (!this.element) return;
            this.element.classList.toggle("is-loading", isActive);
            if (isActive) {renderTemplate(template_default$5, {
                thumb: this.getThumb(),
                label
            }, this.element, { replace: true });}
        }
        setLabel(message) {
            const labelElement = this.element?.querySelector(".discogs-submitter__loader__label");
            if (labelElement) labelElement.textContent = message;
        }
    };
    var EditableHelper = {
        handlePaste: (event) => {
            event.preventDefault();
            const text = (event.clipboardData || unsafeWindow.clipboardData).getData("text/plain");
            document.execCommand("insertText", false, text);
        },
        handleKeydown: (event) => {
            const target = event.target;
            const isTextArea = target.classList.contains("discogs-submitter__textarea");
            if (event.key === "Enter" && !isTextArea) {
                event.preventDefault();
                target.blur();
            }
            event.stopPropagation();
        }
    };
    var template_item_default = "<div class=\"discogs-submitter__select__list__item\" role=\"option\" data-attr=\"class:itemClass|data-value:value|aria-selected:isSelected\">\n  <var data-if=\"isMultiple\">\n    <svg class=\"discogs-submitter__checkbox\" aria-hidden=\"true\"><use href=\"#ds-square-check\"></use></svg>\n    <span><var>text</var></span>\n  </var>\n\n  <var data-if=\"!isMultiple\">\n    <var>text</var>\n  </var>\n</div>\n";
    var template_default$4 = "<div class=\"discogs-submitter__select\" data-attr=\"class:containerClass\">\n  <div class=\"discogs-submitter__select__label\" role=\"combobox\" tabindex=\"0\" aria-haspopup=\"listbox\" aria-expanded=\"false\">\n    <div class=\"discogs-submitter__select__placeholder\"><var>placeholder</var></div>\n    <var data-if=\"isMultiple\">\n      <div class=\"discogs-submitter__select__count\"><var>count</var></div>\n    </var>\n\n    <svg class=\"discogs-submitter__select__arrow\" aria-hidden=\"true\"><use href=\"#ds-icon-chevron-down\"></use></svg>\n  </div>\n\n  <div class=\"discogs-submitter__select__list\" role=\"listbox\" data-attr=\"aria-multiselectable:isMultiple\"></div>\n</div>\n";
    var Select = class Select {
        select;
        static DATA_KEY = "dsSelectInstance";
        ui = {};
        state = {
            isOpen: false,
            isBusy: false,
            isMultiple: false
        };
        constructor(select) {
            this.select = select;
            this.state.isMultiple = select.multiple;
            this.buildUI().then(() => {
                this.bindEvents();
                this.refresh();
            });
            this.select[Select.DATA_KEY] = this;
        }
        async buildUI() {
            const placeholder = this.select.dataset.placeholder || (this.state.isMultiple ? "Select options..." : "Select an option...");
            const data = {
                containerClass: `${this.state.isMultiple ? "is-multiple" : "is-single"}`,
                placeholder,
                count: "",
                isMultiple: this.state.isMultiple
            };
            const wrapper = document.createElement("div");
            renderTemplate(template_default$4, data, wrapper);
            const container = wrapper.firstElementChild;
            if (!container) return;
            this.ui.container = container;
            this.ui.active = container.querySelector(".discogs-submitter__select__label");
            this.ui.list = container.querySelector(".discogs-submitter__select__list");
            this.ui.placeholder = container.querySelector(".discogs-submitter__select__placeholder");
            this.ui.count = container.querySelector(".discogs-submitter__select__count");
            this.select.setAttribute("hidden", "true");
            this.select.parentElement?.insertBefore(container, this.select);
            container.appendChild(this.select);
        }
        async refresh() {
            if (!this.ui.active || !this.ui.list) return;
            this.ui.list.innerHTML = "";
            const options = Array.from(this.select.options);
            const selectedOptions = options.filter((option) => option.selected);
            for (const option of options) await this.addListItem(option.value, option.text, option.selected);
            this.updateLabel(selectedOptions);
        }
        updateLabel(selectedOptions) {
            if (!this.ui.placeholder) return;
            const count = selectedOptions.length;
            if (count === 0) {
                if (this.ui.count) this.ui.count.textContent = "";
                this.ui.placeholder.textContent = this.select.dataset.placeholder || (this.state.isMultiple ? "Select options..." : "Select an option...");
                this.ui.placeholder.classList.remove("is-selected");
            } else if (count === 1) {
                if (this.ui.count) this.ui.count.textContent = "";
                this.ui.placeholder.textContent = selectedOptions[0].text;
                this.ui.placeholder.classList.add("is-selected");
            } else {
                if (this.ui.count) this.ui.count.textContent = `+${count - 1}`;
                this.ui.placeholder.textContent = selectedOptions[0].text;
                this.ui.placeholder.classList.add("is-selected");
            }
        }
        bindEvents() {
            if (!this.ui.container || !this.ui.active || !this.ui.list) return;
            this.ui.list.addEventListener("click", (event) => {
                const item = event.target.closest(".discogs-submitter__select__list__item");
                if (!item || this.state.isBusy) return;
                this.selectOption(item);
            });
            this.ui.active.addEventListener("click", (event) => {
                const arrow = event.target.closest(".discogs-submitter__select__arrow");
                const placeholder = event.target.closest(".discogs-submitter__select__placeholder");
                if (arrow || placeholder || event.target === this.ui.active) this.toggleDropdown();
            });
            this.ui.active.addEventListener("keydown", (event) => {
                if (event.key === "Enter" || event.key === " ") {
                    event.preventDefault();
                    this.toggleDropdown();
                } else if (event.key === "Escape" && this.state.isOpen) {
                    event.preventDefault();
                    this.closeDropdown();
                }
            });
            document.addEventListener("click", (event) => {
                if (this.ui.container && !this.ui.container.contains(event.target)) this.closeDropdown();
            });
        }
        toggleDropdown() {
            this.state.isOpen = !this.state.isOpen;
            this.ui.container?.classList.toggle("is-open", this.state.isOpen);
            this.ui.active?.setAttribute("aria-expanded", String(this.state.isOpen));
        }
        closeDropdown() {
            this.state.isOpen = false;
            this.ui.container?.classList.remove("is-open");
            this.ui.active?.setAttribute("aria-expanded", "false");
        }
        selectOption(item) {
            const value = item.dataset.value ?? "";
            const option = Array.from(this.select.options).find((option) => option.value === value);
            if (!option) return;
            if (this.state.isMultiple) {
                option.selected = !option.selected;
                this.refresh();
                this.triggerChange();
            } else {
                Array.from(this.select.options).forEach((otherOption) => {
                    otherOption.selected = false;
                });
                option.selected = true;
                this.closeDropdown();
                this.refresh();
                this.triggerChange();
            }
        }
        async addListItem(value, text, isSelected) {
            if (!this.ui.list) return;
            const itemClass = `${isSelected ? "is-selected" : ""}`;
            renderTemplate(template_item_default, {
                value,
                text,
                isSelected,
                isMultiple: this.state.isMultiple,
                itemClass
            }, this.ui.list);
        }
        triggerChange() {
            const event = new Event("change", { bubbles: true });
            this.select.dispatchEvent(event);
        }
        static init(select, force = false) {
            if (!select) return;
            const instance = select[Select.DATA_KEY];
            if (instance) {
                if (force) instance.refresh();
                return;
            }
            new Select(select);
        }
    };
    var template_default$3 = "<div class=\"discogs-submitter__results\">\n  <div class=\"discogs-submitter__results__row\">\n    <div class=\"discogs-submitter__results__head\">Artists</div>\n    <div class=\"discogs-submitter__results__body is-multiple\">\n      <var data-loop=\"releaseArtists\">\n        <div class=\"discogs-submitter__results__field\">\n          <span class=\"discogs-submitter__input is-edit\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Release artist\" data-field=\"artists.name\" data-text=\"name\" data-attr=\"data-index:_index\" placeholder=\"Artist...\"></span>\n          <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"artists.name\" data-attr=\"data-index:_index\" title=\"Restore original artist\" aria-label=\"Restore original artist\"><use href=\"#ds-rotate-left\"></use></svg>\n        </div>\n        <var data-if=\"!_last\">\n          <var data-if=\"join\"><var>join</var></var>\n        </var>\n      </var>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row\">\n    <div class=\"discogs-submitter__results__head\">Title</div>\n    <div class=\"discogs-submitter__results__body\">\n      <div class=\"discogs-submitter__results__field\">\n        <span class=\"discogs-submitter__input is-edit\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Release title\" data-field=\"title\" data-text=\"rawTitle\" placeholder=\"Title...\"></span>\n        <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"title\" title=\"Restore original title\" aria-label=\"Restore original title\"><use href=\"#ds-rotate-left\"></use></svg>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row is-half\">\n    <div class=\"discogs-submitter__results__head\">Label</div>\n    <div class=\"discogs-submitter__results__body\">\n      <div class=\"discogs-submitter__results__field\">\n        <span class=\"discogs-submitter__input is-edit\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Record label\" data-field=\"label\" data-text=\"rawLabel\" placeholder=\"Label...\"></span>\n        <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"label\" title=\"Restore original label\" aria-label=\"Restore original label\"><use href=\"#ds-rotate-left\"></use></svg>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row is-half\">\n    <div class=\"discogs-submitter__results__head\">Catalog</div>\n    <div class=\"discogs-submitter__results__body\">\n      <div class=\"discogs-submitter__results__field\">\n        <span class=\"discogs-submitter__input is-edit\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Catalog number\" data-field=\"number\" data-text=\"rawNumber\" placeholder=\"Catalog...\"></span>\n        <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"number\" title=\"Restore original catalog\" aria-label=\"Restore original catalog number\"><use href=\"#ds-rotate-left\"></use></svg>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row is-half\">\n    <div class=\"discogs-submitter__results__head\">Released</div>\n    <div class=\"discogs-submitter__results__body\">\n      <div class=\"discogs-submitter__results__field\">\n        <span class=\"discogs-submitter__input is-edit\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Release date\" data-field=\"released\" data-text=\"rawReleased\" placeholder=\"Date...\"></span>\n        <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"released\" title=\"Restore original release date\" aria-label=\"Restore original release date\"><use href=\"#ds-rotate-left\"></use></svg>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row is-half\">\n    <div class=\"discogs-submitter__results__head\">Country</div>\n    <div class=\"discogs-submitter__results__body\">\n      <div class=\"discogs-submitter__results__field\">\n        <select class=\"is-edit is-country\" autocomplete=\"off\" data-field=\"country\" data-placeholder=\"Country...\">\n          <option value=\"\">–</option>\n          <optgroup data-unwrap data-loop=\"availableCountries\">\n            <option data-attr=\"value:_value\" data-if=\"isSelected\" data-text=\"_value\" selected></option>\n            <option data-attr=\"value:_value\" data-if=\"!isSelected\" data-text=\"_value\"></option>\n          </optgroup>\n        </select>\n        <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"country\" title=\"Restore original country\" aria-label=\"Restore original country\"><use href=\"#ds-rotate-left\"></use></svg>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row\">\n    <div class=\"discogs-submitter__results__head\">Format</div>\n    <div class=\"discogs-submitter__results__body is-multiple\">\n      <var data-loop=\"format\"> <var>qty</var> x <var>name</var>, </var>\n      <div class=\"discogs-submitter__results__field\">\n        <select class=\"is-format\" autocomplete=\"off\" tabindex=\"-1\" data-placeholder=\"Format...\">\n          <optgroup data-unwrap data-loop=\"availableFormats\">\n            <option data-attr=\"value:_value\" data-if=\"isSelected\" data-text=\"_value\" selected></option>\n            <option data-attr=\"value:_value\" data-if=\"!isSelected\" data-text=\"_value\"></option>\n          </optgroup>\n        </select>\n      </div>\n      <div class=\"discogs-submitter__results__field\">\n        <select class=\"is-description\" multiple autocomplete=\"off\" tabindex=\"-1\" data-placeholder=\"Description...\">\n          <optgroup data-unwrap data-loop=\"availableDescriptions\">\n            <option data-attr=\"value:_value\" data-if=\"isSelected\" data-text=\"_value\" selected></option>\n            <option data-attr=\"value:_value\" data-if=\"!isSelected\" data-text=\"_value\"></option>\n          </optgroup>\n        </select>\n      </div>\n      <div class=\"discogs-submitter__results__field\">\n        <span class=\"discogs-submitter__input is-edit is-format-text\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Format details\" data-field=\"formatText\" data-text=\"formatText\" placeholder=\"Free Text...\"></span>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row is-tracklist\" data-attr=\"class:rowClass\">\n    <div class=\"discogs-submitter__results__head\">#</div>\n    <var data-if=\"hasTrackArtists\">\n      <div class=\"discogs-submitter__results__head\">Artist</div>\n    </var>\n    <div class=\"discogs-submitter__results__head\">Title / Credits</div>\n    <div class=\"discogs-submitter__results__head\">Duration</div>\n  </div>\n\n  <var data-if=\"!tracks.length\">\n    <div class=\"discogs-submitter__results__row\">\n      <div class=\"discogs-submitter__results__body\">⚠️ No tracks found.</div>\n    </div>\n  </var>\n\n  <var data-loop=\"tracks\">\n    <div class=\"discogs-submitter__results__row is-tracklist\" data-attr=\"class:rowClass\" data-attr=\"data-index:_index\">\n      <div class=\"discogs-submitter__results__body\"><var>pos</var></div>\n      <var data-if=\"hasTrackArtists\">\n        <div class=\"discogs-submitter__results__body is-multiple\">\n          <var data-loop=\"trackArtists\">\n            <div class=\"discogs-submitter__results__field\">\n              <span class=\"discogs-submitter__input is-edit is-track-artists\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Track artist\" data-field=\"tracks.artists.name\" data-text=\"name\" data-attr=\"data-index:_trackIndex|data-subindex:_index\" placeholder=\"Artist...\"></span>\n              <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"tracks.artists.name\" data-attr=\"data-index:_trackIndex|data-subindex:_index\" title=\"Restore original artist\" aria-label=\"Restore original track artist\"><use href=\"#ds-rotate-left\"></use></svg>\n            </div>\n            <var data-if=\"!_last\">\n              <var data-if=\"join\"><var>join</var></var>\n            </var>\n          </var>\n        </div>\n      </var>\n      <div class=\"discogs-submitter__results__body\">\n        <div class=\"discogs-submitter__results__field\">\n          <span class=\"discogs-submitter__input is-edit is-track-title\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Track title\" data-field=\"tracks.title\" data-text=\"title\" data-attr=\"data-index:_index\" placeholder=\"Title...\"></span>\n          <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"tracks.title\" data-attr=\"data-index:_index\" title=\"Restore original title\" aria-label=\"Restore original track title\"><use href=\"#ds-rotate-left\"></use></svg>\n        </div>\n        <var data-if=\"trackExtraartists.length\">\n          <var data-loop=\"trackExtraartists\">\n            <div class=\"discogs-submitter__results__body is-multiple is-inner\">\n              <small><var>role</var> – </small>\n              <div class=\"discogs-submitter__results__field\">\n                <span class=\"discogs-submitter__input is-edit is-track-extraartists\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-label=\"Track credit artist\" data-field=\"tracks.extraartists.name\" data-text=\"name\" data-attr=\"data-index:_trackIndex|data-subindex:_index\" placeholder=\"Artist...\"></span>\n                <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"tracks.extraartists.name\" data-attr=\"data-index:_trackIndex|data-subindex:_index\" title=\"Restore original credit\" aria-label=\"Restore original track credit\"><use href=\"#ds-rotate-left\"></use></svg>\n              </div>\n            </div>\n          </var>\n        </var>\n      </div>\n      <div class=\"discogs-submitter__results__body\"><var>duration</var></div>\n    </div>\n  </var>\n\n  <var data-if=\"showExtraArtists\">\n    <div class=\"discogs-submitter__results__row is-notes\">\n      <div class=\"discogs-submitter__results__head\">Credits</div>\n      <div class=\"discogs-submitter__results__body is-multiple\">\n        <var data-loop=\"rawExtraartists\">\n          <var>role</var> –\n          <div class=\"discogs-submitter__results__field\">\n            <span class=\"discogs-submitter__input is-edit\" contenteditable=\"plaintext-only\" role=\"textbox\" aria-label=\"Credit artist\" data-field=\"extraartists.name\" data-text=\"name\" data-attr=\"data-index:_index\" placeholder=\"Artist...\"></span>\n            <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"extraartists.name\" data-attr=\"data-index:_index\" title=\"Restore original credit\" aria-label=\"Restore original credit\"><use href=\"#ds-rotate-left\"></use></svg>\n          </div>\n          <br />\n        </var>\n      </div>\n    </div>\n  </var>\n\n  <div class=\"discogs-submitter__results__row is-notes\">\n    <div class=\"discogs-submitter__results__head\">Notes</div>\n    <div class=\"discogs-submitter__results__body\">\n      <div class=\"discogs-submitter__results__field\">\n        <span class=\"discogs-submitter__textarea is-edit\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-multiline=\"true\" aria-label=\"Release notes\" data-field=\"notes\" data-text=\"rawNotes\" placeholder=\"Notes...\"></span>\n        <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"notes\" title=\"Restore original notes\" aria-label=\"Restore original notes\"><use href=\"#ds-rotate-left\"></use></svg>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"discogs-submitter__results__row is-notes\">\n    <div class=\"discogs-submitter__results__head\">Submission Notes</div>\n    <div class=\"discogs-submitter__results__body\">\n      <div class=\"discogs-submitter__results__field\">\n        <span class=\"discogs-submitter__textarea is-edit\" contenteditable=\"plaintext-only\" spellcheck=\"false\" role=\"textbox\" aria-multiline=\"true\" aria-label=\"Submission notes\" data-field=\"submissionNotes\" data-text=\"rawSubmissionNotes\" placeholder=\"Submission Notes...\"></span>\n        <svg class=\"discogs-submitter__button is-icon\" role=\"button\" tabindex=\"0\" data-field=\"submissionNotes\" title=\"Restore original submission notes\" aria-label=\"Restore original submission notes\"><use href=\"#ds-rotate-left\"></use></svg>\n      </div>\n    </div>\n  </div>\n</div>\n";
    async function renderFragment(release, options, container, editedData) {
        const { selectedFormat, selectedDescriptions, formatText, supports } = options;
        const tracks = release.tracks || [];
        const hasTrackArtists = tracks.some((track) => (track.artists || []).length > 0);
        renderTemplate(template_default$3, {
            ...release,
            releaseArtists: (editedData.artists || []).map((artist, index) => ({
                ...artist,
                _index: index,
                _last: index === (editedData.artists || []).length - 1
            })),
            rawTitle: editedData.title,
            rawLabel: editedData.label || "",
            rawNumber: editedData.number || "none",
            rawReleased: editedData.released || "",
            rawCountry: editedData.country || "",
            rawExtraartists: (editedData.extraartists || []).map((credit, index) => ({
                ...credit,
                _index: index
            })),
            showExtraArtists: (editedData.extraartists || []).length > 0,
            rawNotes: editedData.notes,
            rawSubmissionNotes: editedData.submissionNotes,
            availableCountries: ALLOWED_COUNTRIES.map((country) => ({
                _value: country,
                isSelected: country === editedData.country
            })),
            selectedFormat,
            availableFormats: (supports.formats || FILE_FORMATS).map((format) => ({
                _value: format,
                isSelected: format === selectedFormat
            })),
            formatText,
            availableDescriptions: RELEASE_TYPES.map((type) => ({
                _value: type,
                isSelected: selectedDescriptions.includes(type)
            })),
            hasTrackArtists,
            rowClass: `${hasTrackArtists ? "" : "is-no-artist"}`,
            tracks: tracks.map((track, trackIndex) => {
                const rawTrack = editedData.tracks[trackIndex];
                return {
                    ...track,
                    trackArtists: (rawTrack?.artists || []).map((artist, artistIndex) => ({
                        ...artist,
                        _trackIndex: trackIndex,
                        _index: artistIndex,
                        _last: artistIndex === (rawTrack?.artists || []).length - 1
                    })),
                    trackExtraartists: (rawTrack?.extraartists || []).map((credit, creditIndex) => ({
                        ...credit,
                        _trackIndex: trackIndex,
                        _index: creditIndex
                    })),
                    hasTrackArtists,
                    rowClass: `${hasTrackArtists ? "" : "is-no-artist"}`,
                    _index: trackIndex
                };
            })
        }, container, { replace: true });
    }
    function resolvePath(element) {
        const field = element.dataset.field;
        if (!field) return "";
        const indexStr = element.dataset.index;
        const indices = indexStr ? indexStr.split("|").map((segment) => Number.parseInt(segment, 10)) : [];
        const subindex = element.dataset.subindex ? Number.parseInt(element.dataset.subindex, 10) : null;
        if (field === "formatText") return "formatText";
        if (field === "artists.name") return `artists.${indices[0]}.name`;
        if (field === "extraartists.name") return `extraartists.${indices[0]}.name`;
        if (field.startsWith("tracks.")) {
            const trackIdx = indices[0];
            const trackField = field.split(".")[1];
            if (trackField === "artists" || trackField === "extraartists") return `tracks.${trackIdx}.${trackField}.${subindex}.name`;
            return `tracks.${trackIdx}.${trackField}`;
        }
        return field;
    }
    var PreviewController = class {
        state;
        contentElement;
        hooks;
        constructor(state, contentElement, hooks) {
            this.state = state;
            this.contentElement = contentElement;
            this.hooks = hooks;
        }
        async render() {
            if (!this.state.editedData || !this.state.currentDigitalStore) return;
            if (this.state.selectedFormat === "MP3" && !this.state.formatText) this.state.formatText = "320 kbps";
            else if (this.state.selectedFormat !== "MP3" && this.state.formatText === "320 kbps") this.state.formatText = "";
            this.state.currentPayload = DiscogsMapper.mapToPayload(this.state.editedData, unsafeWindow.location.href, {
                format: this.state.selectedFormat || "WAV",
                descriptions: this.state.selectedDescriptions,
                formatText: this.state.formatText,
                country: this.state.editedData.country || ""
            });
            const previewObject = this.state.currentPayload._previewObject;
            const rawJsonString = JSON.stringify(previewObject, null, 2);
            if (this.contentElement) {
                await renderFragment(previewObject, {
                    selectedFormat: this.state.selectedFormat || "WAV",
                    selectedDescriptions: this.state.selectedDescriptions,
                    formatText: this.state.formatText,
                    supports: this.state.currentDigitalStore.supports || { formats: [] }
                }, this.contentElement, this.state.editedData);
                Select.init(this.contentElement.querySelector(".is-format"));
                Select.init(this.contentElement.querySelector(".is-description"));
                Select.init(this.contentElement.querySelector(".is-country"));
            }
            this.hooks.onRendered(rawJsonString);
        }
        bindEvents() {
            if (!this.contentElement) return;
            this.contentElement.addEventListener("change", (event) => void this.handleChange(event));
            this.contentElement.addEventListener("click", async (event) => {
                const fieldButton = event.target.closest(".discogs-submitter__results__field .discogs-submitter__button");
                if (fieldButton) await this.handleRestore(fieldButton);
            });
            this.contentElement.addEventListener("keydown", (event) => {
                const target = event.target;
                if (target.classList.contains("is-edit")) {
                    EditableHelper.handleKeydown(event);
                    return;
                }
                if (event.key === "Enter" || event.key === " ") {
                    const fieldButton = target.closest(".discogs-submitter__results__field .discogs-submitter__button");
                    if (fieldButton) {
                        event.preventDefault();
                        this.handleRestore(fieldButton);
                    }
                }
            });
            this.contentElement.addEventListener("keyup", (event) => {
                if (event.target.classList.contains("is-edit")) event.stopPropagation();
            });
            this.contentElement.addEventListener("paste", (event) => {
                if (event.target.classList.contains("is-edit")) EditableHelper.handlePaste(event);
            });
            this.contentElement.addEventListener("blur", (event) => {
                if (event.target.classList.contains("is-edit")) this.handleChange(event);
            }, true);
        }
        clear() {
            if (this.contentElement) this.contentElement.innerHTML = "";
        }
        async handleChange(event) {
            const target = event.target;
            if (target.classList.contains("is-format")) {
                this.state.selectedFormat = target.value;
                await this.render();
            } else if (target.classList.contains("is-description")) {
                const select = target;
                this.state.selectedDescriptions = Array.from(select.selectedOptions).map((option) => option.value);
                await this.render();
            } else if (target.classList.contains("is-edit") && this.state.editedData) {
                const value = target.contentEditable === "plaintext-only" || target.contentEditable === "true" ? target.textContent?.trim() || "" : target.value;
                this.updateEditedData(target, value);
                await this.render();
            }
        }
        async handleRestore(element) {
            const path = resolvePath(element);
            if (!path || !this.state.originalData || !this.state.editedData) return;
            if (path === "formatText") this.state.formatText = "";
            else {
                const oldValue = getValueByPath(this.state.editedData, path);
                const originalValue = getValueByPath(this.state.originalData, path);
                const valueToRestore = typeof originalValue === "object" && originalValue !== null ? JSON.parse(JSON.stringify(originalValue)) : originalValue;
                setValueByPath(this.state.editedData, path, valueToRestore);
                const artistMatch = path.match(/^artists\.(\d+)\.name$/);
                if (artistMatch && typeof oldValue === "string" && typeof valueToRestore === "string") this.syncTrackArtists(Number.parseInt(artistMatch[1], 10), oldValue, valueToRestore);
            }
            await this.render();
        }
        updateEditedData(element, value) {
            const path = resolvePath(element);
            if (!path || !this.state.editedData) return;
            if (path === "formatText") this.state.formatText = value;
            else {
                const oldValue = getValueByPath(this.state.editedData, path);
                setValueByPath(this.state.editedData, path, value);
                const artistMatch = path.match(/^artists\.(\d+)\.name$/);
                if (artistMatch && typeof oldValue === "string") this.syncTrackArtists(Number.parseInt(artistMatch[1], 10), oldValue, value);
            }
        }
        syncTrackArtists(index, oldName, newName) {
            if (!this.state.editedData) return;
            const trimmedOld = oldName.trim().toLowerCase();
            for (const track of this.state.editedData.tracks) {
                const trackArtist = track.artists?.[index];
                if (trackArtist && (trackArtist.name || "").trim().toLowerCase() === trimmedOld) trackArtist.name = newName;
            }
        }
    };
    var template_default$2 = "<div class=\"discogs-submitter__status__text\">Waiting...</div>\n<svg class=\"discogs-submitter__button is-icon is-debug\" role=\"button\" tabindex=\"0\" hidden title=\"Copy debug info\" aria-label=\"Copy debug info to clipboard\"><use href=\"#ds-icon-bug\"></use></svg>\n";
    var StatusController = class {
        statusElement;
        getStore;
        hasParsedData;
        textElement = null;
        debugButton = null;
        constructor(statusElement, getStore, hasParsedData) {
            this.statusElement = statusElement;
            this.getStore = getStore;
            this.hasParsedData = hasParsedData;
            if (this.statusElement) {
                this.statusElement.setAttribute("role", "status");
                this.statusElement.setAttribute("aria-live", "polite");
                renderTemplate(template_default$2, {}, this.statusElement, { replace: true });
                this.textElement = this.statusElement.querySelector(".discogs-submitter__status__text");
                this.debugButton = this.statusElement.querySelector(".discogs-submitter__button.is-debug");
            }
        }
        set(message, kind = "info") {
            if (this.textElement) this.textElement.innerHTML = message;
            if (this.statusElement) {
                this.statusElement.classList.remove("is-error", "is-success", "is-info", "is-warning");
                this.statusElement.classList.add(`is-${kind}`);
            }
            if (this.debugButton) {if (kind === "error" || kind === "success") this.debugButton.removeAttribute("hidden");
            else this.debugButton.setAttribute("hidden", "true");}
        }
        restoreReady() {
            if (!this.hasParsedData()) return;
            this.set(this.getReadyMessage(), "success");
        }
        getReadyMessage() {
            const warning = this.getStoreWarning();
            return warning ? `Parsed successfully! Ready to submit.<br />${warning}` : "Parsed successfully! Ready to submit.";
        }
        setRawJson(json) {
            if (this.statusElement) this.statusElement.dataset.rawJson = json;
        }
        setRawError(trace) {
            if (this.statusElement) this.statusElement.dataset.rawJson = trace;
        }
        clearRawJson() {
            if (this.statusElement) delete this.statusElement.dataset.rawJson;
        }
        getRawJson() {
            return this.statusElement?.dataset.rawJson ?? null;
        }
        setDebugFeedback(className, isActive) {
            this.debugButton?.classList.toggle(className, isActive);
        }
        bindDebugCopy(handler) {
            bindActivation(this.debugButton, handler);
        }
        getStoreWarning() {
            if (this.getStore()?.id === "bandcamp") return "<small><strong>Be sure to check the metadata, as formatting can vary significantly between labels and artists.</strong></small>";
            return "<small><strong>The list of artists is presented in random order, separated by commas (`,`), and may not exactly match the list of authors from the official release source.</strong></small>";
        }
    };
    var template_default$1 = "<div class=\"discogs-submitter__button is-full is-large is-primary\" role=\"button\" tabindex=\"0\" aria-label=\"Submit release to Discogs\" hidden>Submit to Discogs</div>\n";
    var MIN_STEP_DURATION_MS = 5e3;
    var SubmissionController = class {
        state;
        slot;
        loader;
        status;
        submitButton = null;
        constructor(state, slot, loader, status) {
            this.state = state;
            this.slot = slot;
            this.loader = loader;
            this.status = status;
            if (!this.slot) return;
            renderTemplate(template_default$1, {}, this.slot, { replace: true });
            this.submitButton = this.slot.querySelector(".discogs-submitter__button.is-primary");
        }
        bindEvents() {
            bindActivation(this.submitButton, () => void this.submit());
        }
        setHidden(hidden) {
            if (!this.submitButton) return;
            if (hidden) this.submitButton.setAttribute("hidden", "true");
            else this.submitButton.removeAttribute("hidden");
        }
        async submit() {
            if (!this.state.currentPayload) return;
            this.submitButton?.setAttribute("hidden", "true");
            this.loader.setActive(true, "Sending to Discogs...");
            let coverUploadFailed = false;
            let releaseId = null;
            try {
                const formData = new FormData();
                formData.append("full_data", this.state.currentPayload.full_data);
                formData.append("sub_notes", this.state.currentPayload.sub_notes);
                const jsonData = await this.runStep("Sending to Discogs...", () => networkRequest({
                    method: "POST",
                    url: "https://www.discogs.com/submission/release/create",
                    data: formData,
                    responseType: "json"
                }));
                if (!jsonData?.id) throw new Error("Response missing release ID");
                releaseId = jsonData.id;
                if (this.state.editedData?.cover) {
                    const coverUrl = this.state.editedData.cover;
                    try {
                        await this.runStep("Draft created. Uploading cover image...", async () => {
                            const coverBlob = await networkRequest({
                                url: coverUrl,
                                method: "GET",
                                responseType: "blob"
                            });
                            const imageFormData = new FormData();
                            imageFormData.append("image", coverBlob, "cover.jpg");
                            imageFormData.append("pos", "1");
                            await networkRequest({
                                method: "POST",
                                url: `https://www.discogs.com/release/${releaseId}/images/upload`,
                                data: imageFormData
                            });
                        });
                    } catch (imageError) {
                        console.error("[Discogs Submitter] Cover upload failed:", imageError);
                        coverUploadFailed = true;
                    }
                }
                GM_openInTab(`https://www.discogs.com/release/edit/${releaseId}`, true);
                if (coverUploadFailed) this.status.set("Draft created, but cover upload failed!<br /><strong><em>Please review your draft before publishing on Discogs!</em></strong>", "warning");
                else this.status.restoreReady();
            } catch (error) {
                let errorMessage = error.message || String(error);
                if (errorMessage.includes("404")) errorMessage = "This usually means you are not logged in or use Containers, Incognito, or strict tracking protection.";
                this.status.set(`Failed to create Discogs draft:<br />${errorMessage}`, "error");
            } finally {
                this.loader.setActive(false);
                this.submitButton?.removeAttribute("hidden");
            }
        }
        async runStep(message, operation) {
            this.loader.setLabel(message);
            const startTime = Date.now();
            const result = await operation();
            const elapsed = Date.now() - startTime;
            if (elapsed < MIN_STEP_DURATION_MS) await new Promise((resolve) => setTimeout(resolve, MIN_STEP_DURATION_MS - elapsed));
            return result;
        }
    };
    var template_default = "<aside data-attr=\"id:scriptId|class:rootClasses|aria-label:scriptName\" role=\"dialog\" aria-modal=\"false\">\n  <div class=\"discogs-submitter__header\"></div>\n\n  <div class=\"discogs-submitter__content\"></div>\n\n  <div class=\"discogs-submitter__footer\"></div>\n\n  <div class=\"discogs-submitter__loader\" role=\"status\" aria-busy=\"true\" aria-label=\"Loading\"></div>\n</aside>\n";
    function createWidgetState() {
        return {
            currentDigitalStore: null,
            currentPayload: null,
            originalData: null,
            editedData: null,
            selectedFormat: null,
            selectedDescriptions: [],
            formatText: ""
        };
    }
    var WIDGET_CSS = Object.values([
        styles_default$6,
        styles_default$5,
        styles_default$4,
        styles_default$3,
        styles_default$2,
        styles_default$1,
        styles_default
    ]).join("\n");
    var WIDGET_STYLES_ID = `${USERSCRIPT.ID}-widget-styles`;
    var DEBUG_FEEDBACK_DURATION_MS = 2e3;
    var Widget = class {
        state = createWidgetState();
        elements = {};
        hooks;
        loader;
        header;
        footer;
        status;
        preview;
        submission;
        constructor(hooks = {}) {
            this.hooks = hooks;
        }
        async init() {
            this.injectStyles();
            await this.buildPopup();
            this.composeControllers();
            this.bindEvents();
        }
        injectStyles() {
            if (document.getElementById(WIDGET_STYLES_ID)) return;
            const style = document.createElement("style");
            style.id = WIDGET_STYLES_ID;
            style.textContent = WIDGET_CSS;
            document.head.appendChild(style);
        }
        open(store) {
            this.state.currentDigitalStore = store;
            if (this.elements.widget) {
                this.elements.widget.classList.add("is-open");
                this.hooks.onOpen?.();
                this.startParsing();
            }
        }
        reset() {
            if (this.elements.widget) this.elements.widget.classList.remove("is-open");
            this.state.currentPayload = null;
            this.state.originalData = null;
            this.state.editedData = null;
            this.preview.clear();
            this.status.set("Ready to parse...", "info");
            this.submission.setHidden(true);
            this.header.updateCover();
            this.hooks.onClose?.();
        }
        async buildPopup() {
            if (document.getElementById(USERSCRIPT.ID)) return;
            const data = {
                scriptId: USERSCRIPT.ID,
                scriptName: USERSCRIPT.NAME,
                rootClasses: `${USERSCRIPT.ID} is-position-right${isWebarchive() ? " is-webarchive" : ""}`
            };
            const wrapper = document.createElement("div");
            renderTemplate(template_default, data, wrapper);
            const container = wrapper.firstElementChild;
            document.body.appendChild(container);
            this.elements.widget = container;
            this.elements.header = container.querySelector(".discogs-submitter__header");
            this.elements.content = container.querySelector(".discogs-submitter__content");
            this.elements.footer = container.querySelector(".discogs-submitter__footer");
            this.elements.loader = container.querySelector(".discogs-submitter__loader");
        }
        composeControllers() {
            this.loader = new LoaderController(this.elements.loader, () => this.state.editedData?.thumb);
            this.header = new HeaderController(this.elements.header, {
                onClose: () => {
                    this.elements.widget?.classList.remove("is-open");
                    this.hooks.onClose?.();
                },
                onPositionChange: (side) => this.setPosition(side)
            }, () => this.state.editedData?.thumb);
            this.footer = new FooterController(this.elements.footer);
            this.status = new StatusController(this.footer.statusSlot, () => this.state.currentDigitalStore, () => Boolean(this.state.originalData));
            this.preview = new PreviewController(this.state, this.elements.content, { onRendered: (rawJson) => {
                this.status.setRawJson(rawJson);
                if (this.elements.widget && this.state.editedData?.thumb) document.documentElement.style.setProperty("--ds-thumb-url", `url('${this.state.editedData.thumb}')`);
                this.header.updateCover();
                this.submission.setHidden(false);
            } });
            this.submission = new SubmissionController(this.state, this.footer.actionsSlot, this.loader, this.status);
        }
        async startParsing() {
            if (!this.state.currentDigitalStore) return;
            this.status.set("Parsing current release...", "info");
            this.loader.setActive(true);
            this.submission.setHidden(true);
            this.preview.clear();
            this.status.clearRawJson();
            try {
                await this.state.currentDigitalStore.beforeParse?.();
                const data = await this.state.currentDigitalStore.parse();
                data.country = resolveCountry(data.country);
                const primaryArtistName = (data.artists?.[0]?.name || "").trim();
                data.label = normalizeLabel(data.label, primaryArtistName);
                this.state.originalData = JSON.parse(JSON.stringify(data));
                this.state.editedData = JSON.parse(JSON.stringify(data));
                this.state.selectedFormat = this.state.currentDigitalStore.supports?.formats?.[0] || "WAV";
                this.state.selectedDescriptions = extractFormatFromTitle(this.state.originalData?.title);
                this.state.formatText = "";
                if (this.state.editedData && this.state.originalData) {
                    const tempPayload = DiscogsMapper.mapToPayload(this.state.editedData, unsafeWindow.location.href, {
                        format: this.state.selectedFormat || "WAV",
                        descriptions: this.state.selectedDescriptions
                    });
                    if (!this.state.editedData.notes && tempPayload._previewObject.notes) {
                        this.state.editedData.notes = tempPayload._previewObject.notes;
                        this.state.originalData.notes = tempPayload._previewObject.notes;
                    }
                    if (!this.state.editedData.submissionNotes) {
                        this.state.editedData.submissionNotes = tempPayload._previewObject.submissionNotes;
                        this.state.originalData.submissionNotes = tempPayload._previewObject.submissionNotes;
                    }
                }
                await this.preview.render();
                this.status.set(this.status.getReadyMessage(), "success");
            } catch (error) {
                this.state.currentPayload = null;
                this.state.originalData = null;
                this.state.editedData = null;
                const errorMessage = error.message || String(error);
                this.status.set(errorMessage, "error");
                this.status.setRawError(`URL: ${unsafeWindow.location.href}\nVersion: ${USERSCRIPT.VERSION}\nError Trace:\n${error.stack || error}`);
            } finally {
                this.loader.setActive(false);
            }
        }
        bindEvents() {
            this.preview.bindEvents();
            this.submission.bindEvents();
            this.status.bindDebugCopy(() => void this.handleDebugCopy());
        }
        setPosition(side) {
            const widget = this.elements.widget;
            if (!widget) return;
            widget.classList.toggle("is-position-left", side === "left");
            widget.classList.toggle("is-position-right", side === "right");
            this.hooks.onPositionChange?.(side);
        }
        async handleDebugCopy() {
            const textToCopy = this.status.getRawJson();
            if (!textToCopy) return;
            this.loader.setActive(true);
            const feedback = async (className) => {
                this.status.setDebugFeedback(className, true);
                setTimeout(() => {
                    this.status.setDebugFeedback(className, false);
                    this.loader.setActive(false);
                }, DEBUG_FEEDBACK_DURATION_MS);
            };
            try {
                await GM_setClipboard(textToCopy, "text");
                await feedback("is-success");
            } catch {
                await feedback("is-error");
            }
        }
    };
    var MUTATION_DEBOUNCE_MS = 100;
    var POST_NAVIGATION_DELAYS_MS = [
        100,
        300,
        600,
        1e3
    ];
    var SpaObserver = class {
        currentUrl;
        mutationObserver = null;
        debounceTimer = null;
        constructor() {
            this.currentUrl = unsafeWindow.location.href;
        }
        start(handlers) {
            const handleMutation = () => {
                if (this.debounceTimer) clearTimeout(this.debounceTimer);
                this.debounceTimer = setTimeout(handlers.onMutate, MUTATION_DEBOUNCE_MS);
            };
            this.mutationObserver = new MutationObserver(handleMutation);
            this.mutationObserver.observe(document.body, {
                childList: true,
                subtree: true
            });
            this.patchPushState(() => this.handlePotentialUrlChange(handlers));
            unsafeWindow.addEventListener("popstate", () => this.handlePotentialUrlChange(handlers));
        }
        handlePotentialUrlChange(handlers) {
            const newUrl = unsafeWindow.location.href;
            if (newUrl === this.currentUrl) return;
            this.currentUrl = newUrl;
            handlers.onUrlChange();
            POST_NAVIGATION_DELAYS_MS.forEach((delay) => setTimeout(handlers.onMutate, delay));
        }
        patchPushState(onChange) {
            const originalPushState = history.pushState;
            history.pushState = (...callArguments) => {
                originalPushState.apply(history, callArguments);
                onChange();
            };
        }
    };
    var GLOBAL_CSS = Object.values([
        ".discogs-submitter,.discogs-submitter__inject{text-shadow:none;text-transform:none;font-size:14px;font-weight:400;line-height:1.2;font-family:var(--ds-font-sans)!important;& *,& :after,& :before{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;box-sizing:border-box;text-rendering:optimizelegibility}& a{text-decoration:none}& em{font-style:oblique}& strong{font-weight:700}& [hidden]{display:none!important}}",
        ":root{--ds-font-sans:\"Helvetica Neue\", Helvetica, Arial, sans-serif;--ds-font-monospace:\"SFMono-Regular\", Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;--ds-gap:20px;--ds-radius:12px;--ds-color-primary:20, 138, 102;--ds-color-success:40, 167, 69;--ds-color-error:220, 53, 69;--ds-color-warning:255, 193, 7;--ds-color-info:23, 162, 184;--ds-color-white:255, 255, 255;--ds-color-black:0, 0, 0;--ds-palette-secondary-color:var(--ds-color-black);--ds-palette-primary-color:var(--ds-color-white)}",
        ".discogs-submitter__select,.discogs-submitter__input,.discogs-submitter__textarea{z-index:1;border:1px solid rgba(var(--ds-palette-secondary-color), .25);border-radius:calc(var(--ds-radius) / 4);background:rgba(var(--ds-palette-secondary-color), .075);padding:calc(var(--ds-gap) / 8) calc(var(--ds-gap) / 4);min-width:20px;min-height:1.2em;font-size:inherit;font-family:inherit;line-height:normal;transition:all .3s;display:inline-block;position:relative}.discogs-submitter__input,.discogs-submitter__textarea{white-space:pre-wrap;word-break:break-word;&:focus{z-index:2;outline:.1px solid rgba(var(--ds-palette-secondary-color), 1);border-color:rgba(var(--ds-palette-secondary-color), 1);background:rgba(var(--ds-palette-primary-color), 1);color:rgba(var(--ds-palette-secondary-color), 1)}&[contenteditable]{&:empty:before{pointer-events:none;content:attr(placeholder);color:rgba(var(--ds-palette-secondary-color), .4)}}}.discogs-submitter__textarea{resize:vertical}.discogs-submitter__select{--min-width:60px;--max-width:160px;vertical-align:middle;min-width:var(--min-width);max-width:var(--max-width);user-select:none;display:inline-block;position:relative;&.is-open{z-index:2;outline-width:.1px;outline:1px solid rgba(var(--ds-palette-secondary-color), 1);border-color:rgba(var(--ds-palette-secondary-color), 1);background:rgba(var(--ds-palette-primary-color), 1);& .discogs-submitter__select__placeholder{&.is-selected{color:rgba(var(--ds-palette-secondary-color), 1)}&:not(.is-selected){color:rgba(var(--ds-palette-secondary-color), .4)}}& .discogs-submitter__select__arrow{transform:rotate(180deg)}& .discogs-submitter__select__list{visibility:visible;opacity:1;transform:translateY(6px)scale(1)}}}.discogs-submitter__select__arrow{fill:currentColor;width:1em;height:1em;transition:all .3s}.discogs-submitter__select__placeholder{text-overflow:ellipsis;white-space:nowrap;width:100%;transition:all .3s;overflow:hidden;&:not(.is-selected){color:rgba(var(--ds-palette-secondary-color), .4)}}.discogs-submitter__select__count{white-space:nowrap;font-size:9px}.discogs-submitter__select__label{align-items:center;gap:calc(var(--ds-gap) / 6);z-index:2;flex-wrap:nowrap;display:flex;position:relative}.discogs-submitter__select__list{visibility:hidden;z-index:1;min-width:calc(var(--min-width) + 4px);max-width:calc(var(--max-width) + 4px);-webkit-overflow-scrolling:touch;transform-origin:0 0;opacity:0;outline:1px solid rgba(var(--ds-palette-secondary-color), 1);border:1px solid rgba(var(--ds-palette-secondary-color), 1);border-radius:calc(var(--ds-radius) / 4);background:rgba(var(--ds-palette-primary-color), 1);scrollbar-color:rgba(var(--ds-palette-secondary-color), .5) transparent;scrollbar-width:thin;max-height:200px;color:rgba(var(--ds-palette-secondary-color), 1);transition:all .3s;position:absolute;top:100%;left:-2px;overflow-y:auto;transform:translateY(10px)scale(.9)}.discogs-submitter__select__list__item{align-items:center;gap:calc(var(--ds-gap) / 4);cursor:pointer;flex-wrap:nowrap;padding:2px 4px;transition:all .3s;display:flex;&:not(:last-child){border-bottom:1px solid rgba(var(--ds-palette-secondary-color), .1)}&:hover{background:rgba(var(--ds-palette-secondary-color), .5);color:rgba(var(--ds-palette-primary-color), 1)}&.is-selected{background:rgba(var(--ds-color-primary), 1);color:rgba(var(--ds-palette-primary-color), 1);&:hover{background:rgba(var(--ds-palette-secondary-color), .5);color:rgba(var(--ds-palette-primary-color), 1)}}&.is-showing{opacity:0;animation:.3s forwards ds-scale-up;transform:scale(0)}& .discogs-submitter__checkbox{flex:none}}.discogs-submitter__checkbox{fill:currentColor;width:1.75em;height:1.75em;transition:all .3s}@keyframes ds-scale-up{0%{opacity:0;transform:scale(0)}to{opacity:1;transform:scale(1)}}",
        ".discogs-submitter__button{cursor:pointer;border-radius:calc(var(--ds-radius) / 4);background:rgba(var(--ds-palette-secondary-color), .1);padding:calc(var(--ds-gap) / 4);color:currentColor;user-select:none;text-align:center;justify-content:center;align-items:center;font-size:8px;font-weight:700;transition:all .3s;display:inline-flex;&.is-icon{fill:currentColor;width:2em;height:2em;&,&.is-large{border-radius:100%;padding:0}&:hover{background:rgba(var(--ds-palette-secondary-color), 1);color:rgba(var(--ds-palette-primary-color), 1)}}&.is-full{width:100%;display:flex}&.is-large{border-radius:calc(var(--ds-radius) / 2);padding:calc(var(--ds-gap) / 2);font-size:16px}&.is-primary{background:rgba(var(--ds-color-primary), 1);color:rgba(var(--ds-color-white), 1);&:hover{outline:2px solid rgba(var(--ds-palette-secondary-color), 1);outline-offset:2px;background:rgba(var(--ds-palette-secondary-color), 1);color:rgba(var(--ds-palette-primary-color), 1)}}}"
    ]).join("\n");
    var GLOBAL_STYLES_ID = `${USERSCRIPT.ID}-styles`;
    var PROVIDER_STYLES_ID_PREFIX = `${USERSCRIPT.ID}-styles-`;
    var StylesInjector = class {
        injectGlobal() {
            if (document.getElementById(GLOBAL_STYLES_ID)) return;
            const style = document.createElement("style");
            style.id = GLOBAL_STYLES_ID;
            style.textContent = GLOBAL_CSS;
            document.head.appendChild(style);
        }
        injectProvider(storeId, css) {
            const styleId = `${PROVIDER_STYLES_ID_PREFIX}${storeId}`;
            if (document.getElementById(styleId)) return;
            this.cleanupProvider();
            if (!css) return;
            const style = document.createElement("style");
            style.id = styleId;
            style.textContent = css;
            document.head.appendChild(style);
        }
        cleanupProvider() {
            const selector = `style[id^="${PROVIDER_STYLES_ID_PREFIX}"]`;
            document.querySelectorAll(selector).forEach((element) => element.remove());
        }
    };
    var ICON_REGISTRY = {
        "ds-logo": "<svg height=\"488\" viewBox=\"0 0 488 488\" width=\"488\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\"><linearGradient id=\"a\" x1=\"50%\" x2=\"50%\" y1=\"0%\" y2=\"100%\"><stop offset=\"0\" stop-color=\"#0b0b0b\"/><stop offset=\"1\" stop-color=\"#333\"/></linearGradient><linearGradient id=\"b\" x1=\"50%\" x2=\"50.022587%\" y1=\"50%\" y2=\"50.022724%\"><stop offset=\"0\" stop-color=\"#f20000\"/><stop offset=\"1\" stop-color=\"#d8d8d8\"/></linearGradient><g fill=\"none\" fill-rule=\"evenodd\"><circle cx=\"244\" cy=\"244\" fill=\"url(#a)\" r=\"242\" stroke=\"#fff\" stroke-width=\"4\"/><circle cx=\"245.1\" cy=\"244.2\" fill=\"url(#b)\" r=\"104.8\" stroke=\"#292929\" stroke-width=\"12\"/><g fill=\"#000\" fill-rule=\"nonzero\"><g transform=\"translate(192.5 290)\"><path d=\"m1.675 2.86v7.14h1.47v-5.01h.02l1.75 5.01h1.21l1.75-5.06h.02v5.06h1.47v-7.14h-2.21l-1.58 4.91h-.02l-1.67-4.91z\"/><path d=\"m12.545 7.24.93-2.62h.02l.9 2.62zm.15-4.38-2.7 7.14h1.58l.56-1.59h2.67l.54 1.59h1.63l-2.67-7.14z\"/><path d=\"m17.595 2.86v7.14h1.57v-2.3l.9-.91 2.15 3.21h1.97l-3.06-4.32 2.79-2.82h-1.96l-2.79 2.96v-2.96z\"/><path d=\"m24.815 2.86v7.14h5.42v-1.32h-3.85v-1.75h3.46v-1.22h-3.46v-1.53h3.77v-1.32z\"/><path d=\"m35.645 8.68v-4.5h1.12c.3866667 0 .7116667.055.975.165s.475.26833333.635.475.275.455.345.745.105.615.105.975c0 .39333333-.05.72666667-.15 1s-.2333333.495-.4.665-.3566667.29166667-.57.365-.4333333.11-.66.11zm-1.57-5.82v7.14h3.08c.5466667 0 1.0216667-.09166667 1.425-.275s.74-.435 1.01-.755.4716667-.7.605-1.14.2-.92.2-1.44c0-.59333333-.0816667-1.11-.245-1.55s-.39-.80666667-.68-1.1-.6333333-.51333333-1.03-.66-.825-.22-1.285-.22z\"/><path d=\"m43.055 6.09v-2.01h1.72c.36 0 .63.07833333.81.235s.27.40833333.27.755c0 .36-.09.62-.27.78s-.45.24-.81.24zm-1.57-3.23v7.14h1.57v-2.79h1.57c.3933333 0 .6766667.08666667.85.26s.2866667.44666667.34.82c.04.28666667.07.58666667.09.9s.0733333.58333333.16.81h1.57c-.0733333-.1-.1283333-.22166667-.165-.365s-.0633333-.295-.08-.455-.0283333-.31666667-.035-.47-.0133333-.28666667-.02-.4c-.0133333-.18-.0383333-.36-.075-.54s-.095-.345-.175-.495-.1833333-.28-.31-.39-.2866667-.19166667-.48-.245v-.02c.4-.16.6883333-.39333333.865-.7s.265-.67.265-1.09c0-.27333333-.0483333-.52833333-.145-.765s-.2366667-.445-.42-.625-.4033333-.32166667-.66-.425-.545-.155-.865-.155z\"/><path d=\"m50.505 7.24.93-2.62h.02l.9 2.62zm.15-4.38-2.7 7.14h1.58l.56-1.59h2.67l.54 1.59h1.63l-2.67-7.14z\"/><path d=\"m55.555 2.86v7.14h1.57v-2.95h2.99v-1.22h-2.99v-1.65h3.45v-1.32z\"/><path d=\"m63.065 4.18v5.82h1.57v-5.82h2.14v-1.32h-5.85v1.32z\"/><path d=\"m75.535 9.19.16.81h1v-3.86h-3v1.17h1.58c-.0466667.5-.2116667.88166667-.495 1.145s-.685.395-1.205.395c-.3533333 0-.6533333-.06833333-.9-.205s-.4466667-.31833333-.6-.545-.265-.48166667-.335-.765-.105-.575-.105-.875c0-.31333333.035-.61666667.105-.91s.1816667-.555.335-.785.3533333-.41333333.6-.55.5466667-.205.9-.205c.38 0 .7033333.1.97.3s.4466667.5.54.9h1.5c-.04-.40666667-.15-.76666667-.33-1.08s-.4083333-.57666667-.685-.79-.5866667-.375-.93-.485-.6983333-.165-1.065-.165c-.5466667 0-1.0383333.09666667-1.475.29s-.805.46-1.105.8-.53.73833333-.69 1.195-.24.95166667-.24 1.485c0 .52.08 1.005.24 1.455s.39.84166667.69 1.175.6683333.595 1.105.785.9283333.285 1.475.285c.3466667 0 .69-.0716667 1.03-.215.34-.14333333.65-.395.93-.755z\"/><path d=\"m79.535 6.09v-2.01h1.72c.36 0 .63.07833333.81.235s.27.40833333.27.755c0 .36-.09.62-.27.78s-.45.24-.81.24zm-1.57-3.23v7.14h1.57v-2.79h1.57c.3933333 0 .6766667.08666667.85.26s.2866667.44666667.34.82c.04.28666667.07.58666667.09.9s.0733333.58333333.16.81h1.57c-.0733333-.1-.1283333-.22166667-.165-.365s-.0633333-.295-.08-.455-.0283333-.31666667-.035-.47-.0133333-.28666667-.02-.4c-.0133333-.18-.0383333-.36-.075-.54s-.095-.345-.175-.495-.1833333-.28-.31-.39-.2866667-.19166667-.48-.245v-.02c.4-.16.6883333-.39333333.865-.7s.265-.67.265-1.09c0-.27333333-.0483333-.52833333-.145-.765s-.2366667-.445-.42-.625-.4033333-.32166667-.66-.425-.545-.155-.865-.155z\"/><path d=\"m85.185 2.86v7.14h5.42v-1.32h-3.85v-1.75h3.46v-1.22h-3.46v-1.53h3.77v-1.32z\"/><path d=\"m93.465 7.24.93-2.62h.02l.9 2.62zm.15-4.38-2.7 7.14h1.58l.56-1.59h2.67l.54 1.59h1.63l-2.67-7.14z\"/><path d=\"m99.175 4.18v5.82h1.57v-5.82h2.14v-1.32h-5.85v1.32z\"/><path d=\"m24.585 19.24.93-2.62h.02l.9 2.62zm.15-4.38-2.7 7.14h1.58l.56-1.59h2.67l.54 1.59h1.63l-2.67-7.14z\"/><path d=\"m34.795 21.19.16.81h1v-3.86h-3v1.17h1.58c-.0466667.5-.2116667.8816667-.495 1.145s-.685.395-1.205.395c-.3533333 0-.6533333-.0683333-.9-.205s-.4466667-.3183333-.6-.545-.265-.4816667-.335-.765-.105-.575-.105-.875c0-.3133333.035-.6166667.105-.91s.1816667-.555.335-.785.3533333-.4133333.6-.55.5466667-.205.9-.205c.38 0 .7033333.1.97.3s.4466667.5.54.9h1.5c-.04-.4066667-.15-.7666667-.33-1.08s-.4083333-.5766667-.685-.79-.5866667-.375-.93-.485-.6983333-.165-1.065-.165c-.5466667 0-1.0383333.0966667-1.475.29s-.805.46-1.105.8-.53.7383333-.69 1.195-.24.9516667-.24 1.485c0 .52.08 1.005.24 1.455s.39.8416667.69 1.175.6683333.595 1.105.785.9283333.285 1.475.285c.3466667 0 .69-.0716667 1.03-.215s.65-.395.93-.755z\"/><path d=\"m39.025 19.24.93-2.62h.02l.9 2.62zm.15-4.38-2.7 7.14h1.58l.56-1.59h2.67l.54 1.59h1.63l-2.67-7.14z\"/><path d=\"m44.075 14.86v7.14h1.57v-7.14z\"/><path d=\"m47.025 14.86v7.14h1.47v-4.78h.02l2.97 4.78h1.57v-7.14h-1.47v4.79h-.02l-2.98-4.79z\"/><path d=\"m59.555 14.69h-1.19c-.22.32-.4116667.67-.575 1.05s-.3.7733333-.41 1.18-.1933333.815-.25 1.225-.085.8016667-.085 1.175c0 .7866667.115 1.56.345 2.32s.555 1.4833333.975 2.17h1.18c-.38-.7266667-.655-1.4733333-.825-2.24s-.255-1.55-.255-2.35c0-.7866667.0866667-1.5616667.26-2.325s.45-1.4983333.83-2.205z\"/><path d=\"m61.765 17.83v1c.1733333 0 .355.005.545.015s.365.0466667.525.11.2916667.165.395.305.155.3433333.155.61c0 .34-.11.6083333-.33.805s-.49.295-.81.295c-.2066667 0-.385-.0366667-.535-.11s-.275-.1716667-.375-.295-.1766667-.27-.23-.44-.0833333-.3483333-.09-.535h-1.35c-.0066667.4066667.0516667.7666667.175 1.08s.2983333.5783333.525.795.5016667.3816667.825.495.6816667.17 1.075.17c.34 0 .6666667-.05.98-.15s.59-.2466667.83-.44.4316667-.4333333.575-.72.215-.6133333.215-.98c0-.4-.11-.7433333-.33-1.03s-.5233333-.4733333-.91-.56v-.02c.3266667-.0933333.5716667-.27.735-.53s.245-.56.245-.9c0-.3133333-.07-.59-.21-.83s-.3216667-.4433333-.545-.61-.475-.2916667-.755-.375-.56-.125-.84-.125c-.36 0-.6866667.0583333-.98.175s-.545.2816667-.755.495-.3733333.4683333-.49.765-.1816667.625-.195.985h1.35c-.0066667-.36.0816667-.6583333.265-.895s.455-.355.815-.355c.26 0 .49.08.69.24s.3.39.3.69c0 .2-.0483333.36-.145.48s-.22.2116667-.37.275-.3116667.1016667-.485.115-.3366667.0133333-.49 0z\"/><path d=\"m67.225 18.46v-1.54h-1.57v1.54zm-1.57 2v1.54h1.57v-1.54z\"/><path d=\"m71.745 22v-7h-1.13c-.04.2666667-.1233333.49-.25.67s-.2816667.325-.465.435-.39.1866667-.62.23-.4683333.0616667-.715.055v1.07h1.76v4.54z\"/><path d=\"m75.105 16.9c0-.16.0283333-.3.085-.42s.135-.22.235-.3.215-.1416667.345-.185.265-.065.405-.065c.22 0 .3983333.0333333.535.1s.2433333.15.32.25.1283333.205.155.315.04.2116667.04.305c0 .3-.1.5283333-.3.685s-.45.235-.75.235c-.2866667 0-.5366667-.0783333-.75-.235s-.32-.385-.32-.685zm-1.29-.13c0 .3466667.0866667.65.26.91s.43.4366667.77.53v.02c-.42.1-.745.3-.975.6s-.345.6733333-.345 1.12c0 .38.075.7066667.225.98s.35.5.6.68.5333333.3116667.85.395.645.125.985.125c.3266667 0 .6466667-.045.96-.135s.5933333-.225.84-.405.445-.4066667.595-.68.225-.5966667.225-.97c0-.44-.1133333-.8116667-.34-1.115s-.55-.5016667-.97-.595v-.02c.34-.1133333.595-.3.765-.56s.255-.5633333.255-.91c0-.1733333-.04-.3683333-.12-.585s-.2116667-.42-.395-.61-.425-.3516667-.725-.485-.6666667-.2-1.1-.2c-.2866667 0-.57.04-.85.12s-.5316667.2-.755.36-.405.36-.545.6-.21.5166667-.21.83zm1.13 3.11c0-.36.12-.635.36-.825s.5333333-.285.88-.285c.1666667 0 .3216667.0266667.465.08s.27.13.38.23.1966667.2183333.26.355.095.2883333.095.455c0 .1733333-.03.3333333-.09.48s-.145.2716667-.255.375-.2366667.1833333-.38.24-.3016667.085-.475.085c-.1666667 0-.3266667-.0283333-.48-.085s-.285-.1366667-.395-.24-.1983333-.2283333-.265-.375-.1-.31-.1-.49z\"/><path d=\"m78.885 23.81h1.18c.22-.3133333.4133333-.66.58-1.04s.305-.7716667.415-1.175.1916667-.81.245-1.22.08-.8016667.08-1.175c0-.7866667-.115-1.5633333-.345-2.33s-.555-1.4933333-.975-2.18h-1.17c.3666667.7266667.6366667 1.4766667.81 2.25s.26 1.56.26 2.36c0 .7866667-.0883333 1.5583333-.265 2.315s-.4483333 1.4883333-.815 2.195z\"/></g><g transform=\"translate(158 266)\"><path d=\"m2.946 2.97h.54c-.008-.236-.053-.439-.135-.609s-.194-.311-.336-.423-.307-.194-.495-.246-.392-.078-.612-.078c-.196 0-.387.025-.573.075s-.352.126-.498.228-.263.232-.351.39-.132.345-.132.561c0 .196.039.359.117.489s.182.236.312.318.277.148.441.198.331.094.501.132.337.075.501.111.311.083.441.141.234.133.312.225.117.212.117.36c0 .156-.032.284-.096.384s-.148.179-.252.237-.221.099-.351.123-.259.036-.387.036c-.16 0-.316-.02-.468-.06s-.285-.102-.399-.186-.206-.191-.276-.321-.105-.285-.105-.465h-.54c0 .26.047.485.141.675s.222.346.384.468.35.213.564.273.441.09.681.09c.196 0 .393-.023.591-.069s.377-.12.537-.222.291-.234.393-.396.153-.357.153-.585c0-.212-.039-.388-.117-.528s-.182-.256-.312-.348-.277-.165-.441-.219-.331-.101-.501-.141-.337-.077-.501-.111-.311-.077-.441-.129-.234-.119-.312-.201-.117-.189-.117-.321c0-.14.027-.257.081-.351s.126-.169.216-.225.193-.096.309-.12.234-.036.354-.036c.296 0 .539.069.729.207s.301.361.333.669z\"/><path d=\"m4.38 1.716v4.284h.57v-4.284z\"/><path d=\"m6.48 5.52v-3.324h.96c.264 0 .486.037.666.111s.327.182.441.324.196.314.246.516.075.431.075.687c0 .264-.027.489-.081.675s-.123.341-.207.465-.179.222-.285.294-.213.127-.321.165-.21.062-.306.072-.176.015-.24.015zm-.57-3.804v4.284h1.47c.356 0 .664-.05.924-.15s.474-.245.642-.435.292-.424.372-.702.12-.597.12-.957c0-.688-.178-1.2-.534-1.536s-.864-.504-1.524-.504z\"/><path d=\"m10.134 1.716v4.284h2.976v-.48h-2.406v-1.482h2.226v-.48h-2.226v-1.362h2.388v-.48z\"/><path d=\"m16.206 4.23.726-1.998h.012l.714 1.998zm.426-2.514-1.668 4.284h.582l.48-1.29h1.812l.468 1.29h.63l-1.674-4.284z\"/></g><g transform=\"translate(291 266)\"><path d=\"m11.456 6v-4.254h-.39c-.028.16-.08.292-.156.396s-.169.186-.279.246-.233.101-.369.123-.276.033-.42.033v.408h1.104v3.048z\"/><path d=\"m12.92 3.252h.51c-.004-.128.009-.255.039-.381s.079-.239.147-.339.155-.181.261-.243.233-.093.381-.093c.112 0 .218.018.318.054s.187.088.261.156.133.149.177.243.066.199.066.315c0 .148-.023.278-.069.39s-.114.216-.204.312-.203.191-.339.285-.294.197-.474.309c-.148.088-.29.182-.426.282s-.258.216-.366.348-.197.287-.267.465-.115.393-.135.645h2.778v-.45h-2.184c.024-.132.075-.249.153-.351s.172-.197.282-.285.231-.171.363-.249.264-.157.396-.237c.132-.084.26-.172.384-.264s.234-.195.33-.309.173-.243.231-.387.087-.31.087-.498c0-.2-.035-.376-.105-.528s-.165-.279-.285-.381-.261-.18-.423-.234-.335-.081-.519-.081c-.224 0-.424.038-.6.114s-.323.181-.441.315-.205.293-.261.477-.078.384-.066.6z\"/><path d=\"m17.486 1.716v1.548h.408v-1.548zm-.84 0v1.548h.408v-1.548z\"/><path d=\"m21.254 3.768v-1.572h1.116c.324 0 .561.067.711.201s.225.329.225.585-.075.452-.225.588-.387.202-.711.198zm-.57-2.052v4.284h.57v-1.752h1.308c.432.004.759-.106.981-.33s.333-.536.333-.936-.111-.711-.333-.933-.549-.333-.981-.333z\"/><path d=\"m24.47 2.898v3.102h.51v-1.38c0-.2.02-.377.06-.531s.104-.285.192-.393.204-.19.348-.246.318-.084.522-.084v-.54c-.276-.008-.504.048-.684.168s-.332.306-.456.558h-.012v-.654z\"/><path d=\"m26.75 4.452c0-.188.025-.355.075-.501s.119-.269.207-.369.191-.176.309-.228.243-.078.375-.078.257.026.375.078.221.128.309.228.157.223.207.369.075.313.075.501-.025.355-.075.501-.119.268-.207.366-.191.173-.309.225-.243.078-.375.078-.257-.026-.375-.078-.221-.127-.309-.225-.157-.22-.207-.366-.075-.313-.075-.501zm-.54 0c0 .228.032.44.096.636s.16.367.288.513.286.26.474.342.404.123.648.123c.248 0 .465-.041.651-.123s.343-.196.471-.342.224-.317.288-.513.096-.408.096-.636-.032-.441-.096-.639-.16-.37-.288-.516-.285-.261-.471-.345-.403-.126-.651-.126c-.244 0-.46.042-.648.126s-.346.199-.474.345-.224.318-.288.516-.096.411-.096.639z\"/><path d=\"m29.822 2.898v3.102h.51v-1.932c0-.06.015-.135.045-.225s.078-.177.144-.261.152-.156.258-.216.233-.09.381-.09c.116 0 .211.017.285.051s.133.082.177.144.075.135.093.219.027.176.027.276v2.034h.51v-1.932c0-.24.072-.432.216-.576s.342-.216.594-.216c.124 0 .225.018.303.054s.139.085.183.147.074.135.09.219.024.174.024.27v2.034h.51v-2.274c0-.16-.025-.297-.075-.411s-.12-.207-.21-.279-.198-.125-.324-.159-.267-.051-.423-.051c-.204 0-.391.046-.561.138s-.307.222-.411.39c-.064-.192-.174-.328-.33-.408s-.33-.12-.522-.12c-.436 0-.77.176-1.002.528h-.012v-.456z\"/><path d=\"m35.312 4.452c0-.188.025-.355.075-.501s.119-.269.207-.369.191-.176.309-.228.243-.078.375-.078.257.026.375.078.221.128.309.228.157.223.207.369.075.313.075.501-.025.355-.075.501-.119.268-.207.366-.191.173-.309.225-.243.078-.375.078-.257-.026-.375-.078-.221-.127-.309-.225-.157-.22-.207-.366-.075-.313-.075-.501zm-.54 0c0 .228.032.44.096.636s.16.367.288.513.286.26.474.342.404.123.648.123c.248 0 .465-.041.651-.123s.343-.196.471-.342.224-.317.288-.513.096-.408.096-.636-.032-.441-.096-.639-.16-.37-.288-.516-.285-.261-.471-.345-.403-.126-.651-.126c-.244 0-.46.042-.648.126s-.346.199-.474.345-.224.318-.288.516-.096.411-.096.639z\"/><path d=\"m1.808 10.57v.432c.096-.012.198-.018.306-.018.128 0 .247.017.357.051s.205.086.285.156.144.156.192.258.072.219.072.351c0 .128-.025.243-.075.345s-.117.188-.201.258-.182.124-.294.162-.23.057-.354.057c-.292 0-.514-.087-.666-.261s-.232-.399-.24-.675h-.51c-.004.22.027.416.093.588s.161.317.285.435.274.207.45.267.372.09.588.09c.2 0 .389-.027.567-.081s.333-.135.465-.243.237-.243.315-.405.117-.349.117-.561c0-.256-.063-.478-.189-.666s-.319-.31-.579-.366v-.012c.168-.076.308-.188.42-.336s.168-.318.168-.51c0-.196-.033-.366-.099-.51s-.157-.262-.273-.354-.253-.161-.411-.207-.329-.069-.513-.069c-.212 0-.399.034-.561.102s-.297.162-.405.282-.191.264-.249.432-.091.354-.099.558h.51c0-.124.016-.242.048-.354s.081-.21.147-.294.15-.151.252-.201.221-.075.357-.075c.216 0 .396.057.54.171s.216.285.216.513c0 .112-.022.212-.066.3s-.103.161-.177.219-.16.102-.258.132-.201.045-.309.045h-.108c-.02 0-.04 0-.06 0-.016 0-.034-.002-.054-.006z\"/><path d=\"m5.144 10.57v.432c.096-.012.198-.018.306-.018.128 0 .247.017.357.051s.205.086.285.156.144.156.192.258.072.219.072.351c0 .128-.025.243-.075.345s-.117.188-.201.258-.182.124-.294.162-.23.057-.354.057c-.292 0-.514-.087-.666-.261s-.232-.399-.24-.675h-.51c-.004.22.027.416.093.588s.161.317.285.435.274.207.45.267.372.09.588.09c.2 0 .389-.027.567-.081s.333-.135.465-.243.237-.243.315-.405.117-.349.117-.561c0-.256-.063-.478-.189-.666s-.319-.31-.579-.366v-.012c.168-.076.308-.188.42-.336s.168-.318.168-.51c0-.196-.033-.366-.099-.51s-.157-.262-.273-.354-.253-.161-.411-.207-.329-.069-.513-.069c-.212 0-.399.034-.561.102s-.297.162-.405.282-.191.264-.249.432-.091.354-.099.558h.51c0-.124.016-.242.048-.354s.081-.21.147-.294.15-.151.252-.201.221-.075.357-.075c.216 0 .396.057.54.171s.216.285.216.513c0 .112-.022.212-.066.3s-.103.161-.177.219-.16.102-.258.132-.201.045-.309.045h-.108c-.02 0-.04 0-.06 0-.016 0-.034-.002-.054-.006z\"/><path d=\"m12.644 13v-4.254h-.39c-.028.16-.08.292-.156.396s-.169.186-.279.246-.233.101-.369.123-.276.033-.42.033v.408h1.104v3.048z\"/><path d=\"m15.512 8.614-1.77 4.482h.432l1.776-4.482z\"/><path d=\"m17.15 10.57v.432c.096-.012.198-.018.306-.018.128 0 .247.017.357.051s.205.086.285.156.144.156.192.258.072.219.072.351c0 .128-.025.243-.075.345s-.117.188-.201.258-.182.124-.294.162-.23.057-.354.057c-.292 0-.514-.087-.666-.261s-.232-.399-.24-.675h-.51c-.004.22.027.416.093.588s.161.317.285.435.274.207.45.267.372.09.588.09c.2 0 .389-.027.567-.081s.333-.135.465-.243.237-.243.315-.405.117-.349.117-.561c0-.256-.063-.478-.189-.666s-.319-.31-.579-.366v-.012c.168-.076.308-.188.42-.336s.168-.318.168-.51c0-.196-.033-.366-.099-.51s-.157-.262-.273-.354-.253-.161-.411-.207-.329-.069-.513-.069c-.212 0-.399.034-.561.102s-.297.162-.405.282-.191.264-.249.432-.091.354-.099.558h.51c0-.124.016-.242.048-.354s.081-.21.147-.294.15-.151.252-.201.221-.075.357-.075c.216 0 .396.057.54.171s.216.285.216.513c0 .112-.022.212-.066.3s-.103.161-.177.219-.16.102-.258.132-.201.045-.309.045h-.108c-.02 0-.04 0-.06 0-.016 0-.034-.002-.054-.006z\"/><path d=\"m21.314 8.716v4.284h.57v-1.83h1.392c.14 0 .252.021.336.063s.152.098.204.168.09.152.114.246.044.193.06.297c.02.104.032.21.036.318s.008.209.012.303.013.179.027.255.041.136.081.18h.636c-.06-.072-.105-.155-.135-.249s-.053-.193-.069-.297-.026-.21-.03-.318-.01-.214-.018-.318c-.012-.104-.029-.204-.051-.3s-.056-.183-.102-.261-.108-.145-.186-.201-.179-.096-.303-.12v-.012c.26-.072.449-.206.567-.402s.177-.424.177-.684c0-.348-.115-.622-.345-.822s-.549-.3-.957-.3zm1.758 1.974h-1.188v-1.494h1.416c.268 0 .462.068.582.204s.18.312.18.528c0 .156-.027.283-.081.381s-.126.176-.216.234-.195.097-.315.117-.246.03-.378.03z\"/><path d=\"m25.454 12.334v.666h.666v-.666z\"/><path d=\"m27.662 10.768v-1.572h1.116c.324 0 .561.067.711.201s.225.329.225.585-.075.452-.225.588-.387.202-.711.198zm-.57-2.052v4.284h.57v-1.752h1.308c.432.004.759-.106.981-.33s.333-.536.333-.936-.111-.711-.333-.933-.549-.333-.981-.333z\"/><path d=\"m29.936 12.334v.666h.666v-.666z\"/><path d=\"m31.586 8.716v4.284h.54v-3.564h.012l1.338 3.564h.486l1.338-3.564h.012v3.564h.54v-4.284h-.78l-1.356 3.6-1.35-3.6z\"/><path d=\"m36.83 12.334v.666h.666v-.666z\"/></g><g transform=\"translate(195.5 179)\"><path d=\"m9.10546875.15625h3.01562505c2.1510416 0 3.8307291.49479167 5.0390624 1.484375.8854167.72395833 1.5390626 1.44791667 1.9609376 2.171875h.7421874c.6354167 1.08333333.953125 2.01822917.953125 2.8046875v.109375c0 .015625-.0364583.06770833-.109375.15625l-.2656249-.046875h-.421875v.2578125c0 .07291667-.0364584.109375-.109375.109375h-.578125v.421875h.578125c.0729166.01041667.109375.046875.109375.109375v.1015625c0 .77083333-.2994792 1.77864583-.8984375 3.0234375-.0729167.0104167-.109375.046875-.109375.109375v.046875h1.0078125c.0677083.0104167.1015625.046875.1015625.109375-.1145834.0677083-.21875.1015625-.3125001.1015625h-.9062499l-.7890626.9609375h-1.0078125c-.5312499 0-.7968749.0859375-.7968749.2578125v.0546875h1.375c.0729166.0104167.109375.046875.109375.109375-.0572917 0-.2682292.1588542-.6328126.4765625-1.3333333.953125-2.6223958 1.4296875-3.8671875 1.4296875h-5.83593745v-1.90625c0-.0729167-.03385417-.109375-.1015625-.109375h-.109375c-.91666667 0-1.375-.0520833-1.375-.15625v-.0546875c.01041667-.0677083.046875-.1015625.109375-.1015625h1.375c.06770833 0 .1015625-.0364583.1015625-.109375v-.8515625c.234375 0 .58854167-.015625 1.0625-.046875v-.109375c-.47916667-.0364583-.81510417-.0546875-1.0078125-.0546875l-.0546875-.1015625v-3.125c0-.05208333-.05208333-.10677083-.15625-.1640625h-.4765625c-.06770833 0-.1015625-.03385417-.1015625-.1015625v-.2109375c0-.08333333.140625-.13802083.421875-.1640625l.1015625.0546875.375-.3203125c.45833333 0 .6875-.05208333.6875-.15625v-2.8046875c0-.08333333-.28385417-.15625-.8515625-.21875v-3.390625l.0546875-.1015625c.70833333-.03645833 1.23958333-.0546875 1.59375-.0546875zm2.17187505 2.96875v.578125c.0104166.07291667.0442708.109375.1015624.109375h.640625c.0677084.01041667.1015625.046875.1015625.109375v2.8046875c0 .02604167-.0520833.078125-.15625.15625l-.2656249-.046875h-.3203126l-.2109374.3671875h-.4765626c-.0677083.01041667-.1015624.046875-.1015624.109375v.3125h.578125c.03125 0 .0859374.0546875.1640624.1640625l-.0546874.265625v2.0625c0 .078125.0182291.1484375.0546874.2109375-.0364583.0625-.0546874.1328125-.0546874.2109375v.2109375l.0546874.265625h.6328125c.0781251 0 .1484375.0182292.2109375.0546875.0625001-.0364583.1328125-.0546875.2109376-.0546875l.0546874.109375-.2109374.1015625c-.0729167 0-.1093751-.015625-.1093751-.046875l-.3671874.046875h-.4218751l-.0546874.265625v.109375c.0104166.0729167.0442708.109375.1015624.109375h1.1171876c.34375 0 .9088541-.1614583 1.6953125-.484375.5312499-.03125.9192708-.046875 1.1640624-.046875l.0546875-.109375c-.3541666-.0364583-.6197916-.0546875-.796875-.0546875h-.1015624v-.1015625c.6510416-.4739583 1.1276041-1.1640625 1.4296875-2.0703125l.2656249-1.109375-.1640624-.109375h-.4765626c-.0677083 0-.1015624-.03385417-.1015624-.1015625v-.2109375c0-.05208333.0520833-.10677083.15625-.1640625.0364583 0 .0546874.01822917.0546874.0546875.328125 0 .5390626-.10677083.6328126-.3203125h.3203124l.3671876-.046875v-.109375c-.1302084-1.04166667-.640625-1.99479167-1.53125-2.859375-.7760417-.0625-1.2552084-.1875-1.4375-.375-.5677084-.31770833-1.0442709-.4765625-1.4296876-.4765625h-1.21875c-.0677083.01041667-.1015624.046875-.1015624.109375zm-4.07812505.6875h.1015625c.07291667.01041667.109375.046875.109375.109375v.1015625c0 .0625-.08854167.11458333-.265625.15625l-.0546875-.1015625v-.15625c.01041667-.07291667.046875-.109375.109375-.109375zm7.52343745 3.0703125h.578125c.0729167.01041667.109375.046875.109375.109375v.0546875c0 .06770833-.0364583.1015625-.109375.1015625h-.4765624c-.0677084 0-.1015626-.03385417-.1015626-.1015625zm-8.48437495.265625h.109375c.07291667.01041667.109375.046875.109375.109375v.265625c0 .06770833-.03645833.1015625-.109375.1015625h-.2109375v-.3671875c.01041667-.07291667.04427083-.109375.1015625-.109375z\"/><path d=\"m21.3554688.1796875h3.6484374c.0729167 0 .1276042.19270833.1640626.578125h.578125c.0729166.015625.109375.05208333.109375.109375l-.1640625.109375c-.1197917-.03645833-.1901042-.0546875-.2109375-.0546875-.0625.03645833-.1328126.0546875-.2109376.0546875v-.0546875c-.0677083.03645833-.1197916.0546875-.15625.0546875v6.2421875c0 .08333333.140625.13541667.421875.15625.0625-.03645833.1328126-.0546875.2109376-.0546875 0 .015625.0364583.06770833.109375.15625v.1640625c0 .046875-.0546875.09895833-.1640625.15625h-.3125001c-.109375 0-.1640624-.01822917-.1640624-.0546875l-.2578126.0546875h-.53125c-.0729166.01041667-.109375.046875-.109375.109375v.2109375c.0104167.06770833.046875.1015625.109375.1015625h1.109375v3.703125c0 .078125.0182292.1484375.0546876.2109375-.0572917.1770833-.1640625.265625-.3203126.265625 0-.0364583-.0182291-.0546875-.0546874-.0546875l-.046875.109375v1.53125c.0104166.0729167.0442708.109375.1015624.109375.0625-.0364583.1328126-.0546875.2109376-.0546875.0729166.1302083.109375.2708333.109375.421875l-.109375.0546875h-2.328125c-.296875 0-.7708334-.0182292-1.421875-.0546875v-.3125l-.375-.2109375c0-.0364583-.0182292-.0546875-.0546876-.0546875l.0546876-.375v-.3125c0-.0833333-.0182292-.1536458-.0546876-.2109375.0364584-.0625.0546876-.1328125.0546876-.2109375v-.265625c0-.0677083-.1588542-.15625-.4765626-.265625-.0364583-.0677083-.0546874-.1197917-.0546874-.15625.0572916-.1458333.1119791-.21875.1640624-.21875h.2109376c.0625 0 .1145833.1588542.15625.4765625h.265625c.0729166 0 .109375-.0338542.109375-.1015625v-3.9140625c0-.07291667-.0364584-.109375-.109375-.109375-.6197917-.03645833-.9895834-.0546875-1.109375-.0546875l-.0546876-.1015625v-.15625c0-.05208333.0520834-.10677083.15625-.1640625.0364584 0 .0546876.01822917.0546876.0546875l.109375-.0546875h1.109375c.0677083 0 .1015624-.03385417.1015624-.1015625v-.1640625l-.1015624-.15625-.375.0546875h-.1015626c-.0520833 0-.1041666-.05208333-.15625-.15625v-6.140625l.046875-.1015625c-.0520833-.03645833-.15625-.0546875-.3125-.0546875v-.109375h.265625v-.5234375c.0104167-.07291667.0442709-.109375.1015626-.109375zm.265625.6875c.0104166.07291667.046875.109375.109375.109375h.1015624c.0729167 0 .109375-.03645833.109375-.109375s-.0364583-.109375-.109375-.109375h-.1015624c-.0729167.015625-.109375.05208333-.109375.109375z\"/><path d=\"m31.3085937.1328125c.0572917.03645833.125.0546875.2031251.0546875h.1562499c.7500001 0 1.2473959.0859375 1.4921876.2578125h.3046875c.1041666 0 .5494791.16927083 1.3359374.5078125h.515625c.0520834 0 .1041667.05208333.15625.15625-.0364583.03645833-.1744791.0546875-.4140624.0546875.6197916.546875.9296875.85416667.9296875.921875v.0546875c-.0156251.05729167-.6692709.69010417-1.9609375 1.8984375h-.71875c-.6979167-.671875-1.2291667-1.03125-1.59375-1.078125h-.0468751c-.6874999 0-1.0312499.13802083-1.0312499.4140625-.1458334 0-.2317709.23958333-.2578126.71875l.0546876.2578125h.4609374c.1145834 0 .2682292.0859375.4609376.2578125.2395833.046875.359375.11458333.359375.203125l-.0468751.1015625.1015625.0546875h1.234375v.15625h-1.0312499v.046875c.0104166.09375.3697916.265625 1.0781249.515625 1.359375.40104167 2.4401042.95052083 3.2421876 1.6484375 0 .04166667.171875.24739583.515625.6171875-.4114584.03125-.6171876.08072917-.6171876.1484375.078125 0 .1302084.0859375.1562501.2578125h.6171875c.09375 0 .1953124.20572917.3046874.6171875l-.1015624.0546875h-.515625c-.0677084.01041667-.1015626.04427083-.1015626.1015625h.671875c.046875 0 .0963542.05208333.1484376.15625v.1015625c0 .06770833-.0338542.1015625-.1015626.1015625h-.515625v.0546875c0 .17708333.0182292.46875.0546876.875 0 .5677083-.2057292 1.2369792-.6171876 2.0078125-.0677083.0104167-.1015624.0442708-.1015624.1015625v.1015625h.71875c.0677083.0104167.1015624.0442708.1015624.1015625-.0416666 0-.2630208.2239583-.6640624.671875-.8958334.6822917-2.1145834 1.0234375-3.65625 1.0234375h-.046875c-1.8906251 0-3.4348959-.5833333-4.6328126-1.75-.890625-.0572917-1.3359374-.2447917-1.3359374-.5625-.328125-.296875-.5-.5703125-.515625-.8203125.5104166-.3385417.9036458-.578125 1.1796874-.71875l.2109376.046875c.0989583-.0260417.5963541-.3177083 1.4921874-.875h.6171876c.0572916 0 .2447916.2578125.5625.7734375v.1015625h-.15625v.1015625c.5833333.515625 1.1666666.7734375 1.75.7734375.890625-.1458333 1.3359374-.5755208 1.3359374-1.2890625 0-.109375-.0859374-.34895833-.2578124-.71875h.515625v-.046875c-.0885417-.171875-.2239584-.2578125-.40625-.2578125h-.515625c-.1458334 0-.3359376-.01822917-.5703126-.0546875l-.1015624.0546875c-.0677084-.03645833-.1197917-.0546875-.15625-.0546875v-.1015625h.0546875c.0937499 0 .4374999-.01822917 1.0312499-.0546875v-.1015625l-1.4453125-.4609375c-.1041666 0-.2239583-.01822917-.359375-.0546875-.0572916.03645833-.125.0546875-.2031249.0546875-.2187501-.10416667-.5286459-.20833333-.9296876-.3125v-.1015625h.3671876v-.1015625c-1.0625-.39583333-1.7838542-.92708333-2.1640626-1.59375-.2604166-.35416667-.4140624-.74739583-.4609374-1.1796875l.1015624-.0546875h.2031251c.0364583 0 .0546875.01822917.0546875.0546875.0520833-.03645833.1536458-.0546875.3046875-.0546875v-.1015625h-.6640625v-.1015625c.171875 0 .2578124-.03385417.2578124-.1015625l-.359375-.2109375c-.0520833-.13541667-.1041666-.203125-.15625-.203125h-.5703124v-.4140625c0-1.07291667.4973958-2.015625 1.4921875-2.828125h.1562499c.0364584 0 .0546876.01822917.0546876.0546875l.1015624-.0546875.1015626.0546875c.2083333-.03645833.3124999-.08854167.3124999-.15625l-.109375-.0546875h-.3046875v-.046875c.4427084-.25520833.6640625-.40885417.6640625-.4609375 0-.09895833.4114584-.18489583 1.2343751-.2578125h.7734374c.0781251 0 .1484375-.01822917.2109375-.0546875zm-2.9843749 4.8359375v.1015625h.046875v-.1015625zm.1484374 0v.1015625h.15625c0-.06770833-.0338541-.1015625-.1015624-.1015625zm-2.2578124 0h.1015624v.1015625h-.1015624zm.2578124 0h.1484376v.1015625h-.1484376zm3.9609376 4.0625h.5078124v.15625l-.359375-.0546875h-.1484374zm-1.546875.921875v.109375h.0546874v-.109375z\"/><path d=\"m42.4726562.15625c.0364584 0 .0546876.01822917.0546876.0546875l.203125-.0546875c1.65625 0 3.0703124.39583333 4.2421875 1.1875 1.2395833 0 1.8593749.13802083 1.8593749.4140625.7760417.625 1.3776042 1.296875 1.8046876 2.015625v.3125l-1.9140626.9765625c-.3541666.20833333-.6119791.3125-.7734374.3125h-.515625c-.7760417-1.08333333-1.4817709-1.703125-2.1171875-1.859375-.2083334-.09895833-.5364584-.21875-.984375-.359375-.6093751 0-1.3151042.20572917-2.1171875.6171875v.0546875c.3802083 0 .5703124.03385417.5703124.1015625-.9322916.83854167-1.3984374 1.4921875-1.3984374 1.9609375-.1093751.13020833-.2109376.47395833-.3046876 1.03125h-1.0390624c-.0677084.01041667-.1015626.046875-.1015626.109375 0 .046875.0520834.09635417.1562501.1484375h.8749999c.0520834 0 .1380209.43229167.2578126 1.296875.1770833.69791667.5390624 1.31770833 1.0859375 1.859375l-.1015625.046875h-.5703126v.109375c.4583334.4479167 1.2161459.7916667 2.2734375 1.03125.3906251 0 .9609375-.15625 1.7109376-.46875.6927083 0 1.2265625-.2239583 1.6015625-.671875h.046875v-.1015625h-.515625v-.046875c.1302083-.234375.3541666-.54427083.671875-.9296875h.6171874c.0729167 0 .6770834.30989583 1.8125001.9296875.7239583 0 1.2239583.1536458 1.4999999.4609375v.0546875c-.140625.1510417-.2109375.2369792-.2109375.2578125l-.3593749-.0546875c-.2239584 0-.5338542.34375-.9296875 1.03125-.1510417.0729167-.4270834.109375-.8281251.109375h-.1015624c-.0520834 0-.1041667.0494792-.15625.1484375h.671875v.15625c-1.0989584 1.0208333-2.0286459 1.5911458-2.7890626 1.7109375-.546875.2708333-1.1666666.40625-1.859375.40625h-1.0859374c-1.8802084 0-3.5520834-.6692708-5.015625-2.0078125-.1458334-.1770833-.4036459-.265625-.7734376-.265625-.1197916.0364583-.1874999.0546875-.203125.0546875-.140625-.0520833-.2109374-.1041667-.2109374-.15625.0104166-.0677083.046875-.1015625.109375-.1015625.0364583 0 .0859374.0182292.1484375.0546875l.3125-.0546875h.1015625v-.0546875c-.6197917-.8489583-.9296876-1.3645833-.9296876-1.546875v-.0546875h.5156251l.2578124-.046875c-.4010416-.91666667-.6249999-1.84635417-.6718749-2.7890625h-.6640626v-.15625h.5625c.0677084 0 .1015626-.03385417.1015626-.1015625 0-.07291667-.0338542-.109375-.1015626-.109375h-.9296874c-.0677084 0-.1015626-.03385417-.1015626-.1015625v-.15625c.15625 0 .2604167-.015625.3125-.046875l.1015626.046875c.515625 0 .7734374-.06770833.7734374-.203125.0677084-.97395833.3437501-1.88802083.828125-2.7421875v-.046875c0-.06770833-.0338541-.1015625-.1015624-.1015625h-.515625l-.109375-.0546875c.6197916-1.09375 1.3255208-1.8515625 2.1171874-2.2734375 0-.06770833-.0338541-.1015625-.1015624-.1015625h-1.03125v-.0546875c.4010416-.359375 1.1249999-.6875 2.171875-.984375.5572916-.09895833 1.0572916-.1484375 1.5-.1484375h.1015624c.0781251 0 .1458334-.01822917.203125-.0546875zm-3.359375 7.234375v.15625h.15625c.0677084 0 .1015626-.03645833.1015626-.109375l-.1015626-.046875zm5.4765626 2.890625h.46875c.0677083.0104167.1015624.0442708.1015624.1015625-.4322916.3802083-.7421874.5703125-.9296874.5703125h-.4140626v-.1015625c.1302084 0 .3880209-.1901042.7734376-.5703125z\"/><path d=\"m59.0820313.1796875c1.2135416 0 2.2395833.2578125 3.078125.7734375-.0625001.03125-.1302084.046875-.2031251.046875v.1015625c.1250001 0 .6015626.32552083 1.4296876.9765625.203125 0 .4088541.06770833.6171875.203125h.5703125l.25.0546875v.0546875c0 .06770833-.0338542.1015625-.1015625.1015625h-.2578125c-.03125 0-.046875-.01822917-.046875-.0546875-.0572917.03645833-.1432292.0546875-.2578126.0546875v.046875c.7760417.86458333 1.3567709 2.02864583 1.7421876 3.4921875l-.1484376.1015625h-1.234375v.0546875c.5052084 0 .796875.015625.875.046875.0572917-.03125.1432292-.046875.2578126-.046875h.1015624c.1354167 0 .203125.32552083.203125.9765625.0104167.06770833.0442709.1015625.1015626.1015625h.515625c.03125 0 .046875.015625.046875.046875l.109375-.046875h.046875c.2083333.02083333.3125.0703125.3125.1484375 0 1.140625-.3255209 2.2890625-.9765626 3.4453125l-.1015624.046875h-.9765626l-.2109374.15625h-.5078126c-.0677083.0104167-.1015624.0442708-.1015624.1015625.375 0 .5625.0182292.5625.0546875-.796875 1.3125-2.0286459 2.2864583-3.6953125 2.921875-.8125001.2083333-1.5494792.3125-2.2109375.3125h-.5625001c-.4010416 0-.6744791-.0364583-.8203125-.109375-.0677083.0364583-.1197916.0546875-.15625.0546875-1.5052083-.2552083-2.6848958-.7526042-3.5390625-1.4921875-.6614583-.5572917-1.1927083-1.1197917-1.5937499-1.6875-.0572917-.0364583-.125-.0546875-.203125-.0546875h-.4609376v-.1015625h.5078126c0-.1041667.0364583-.15625.109375-.15625h.6640624l.2578126-.046875c-.53125-1.01041667-.8229167-1.93489583-.875-2.7734375v-.15625l.0546874-.1015625c.03125 0 .046875.01822917.046875.0546875.515625-.03645833.8932292-.0546875 1.1328126-.0546875h.765625v-.0546875c0-.06770833-.0338542-.1015625-.1015626-.1015625h-1.84375c-.0416666 0-.1276041-.11979167-.2578124-.359375h-.875c-.0677084 0-.1015626-.03385417-.1015626-.1015625s.1380209-.11979167.4140626-.15625v-.203125c-.0364584 0-.0885417-.015625-.15625-.046875-.0677084.03125-.1197917.046875-.15625.046875-.03125-.06770833-.046875-.11979167-.046875-.15625.0989583-1.1875.5416666-2.3828125 1.328125-3.5859375.3020833-.41145833.578125-.6171875.8281249-.6171875.4427084 0 .6640625-.05208333.6640625-.15625-.1145833-.06770833-.2161458-.1015625-.3046875-.1015625h-.0546875l-.2578124.046875-.0468751-.1015625.0468751-.1015625c-.1354167 0-.203125-.03385417-.203125-.1015625.2552083-.22395833.7343749-.54947917 1.4374999-.9765625h.5625001c.9166666-.546875 2.2526041-.8203125 4.0078125-.8203125zm-4.2656251 6.4140625v.1015625l.3125.2109375v.1015625c0 .06770833-.0364583.1015625-.109375.1015625h-.25v.15625h.9218751c.0572916 0 .1093749.11979167.1562499.359375.734375.03125 1.28125.046875 1.640625.046875h.40625v.1015625c0 .07291667-.0338541.109375-.1015624.109375-.0625-.03645833-.1119792-.0546875-.1484376-.0546875-.0364583 0-.0546874.01822917-.0546874.0546875l-.2578126-.0546875c-.125 0-.6041666.01822917-1.4375.0546875v.25c.1666667.83854167.59375 1.59375 1.28125 2.265625.3802084.2604167.5703126.4140625.5703126.4609375l-.1015626.046875h-.71875l.046875.1015625v.0546875h-.3046874v.1015625h.6171874c.609375.171875 1.0182292.2578125 1.2265626.2578125.1979166 0 .5234374-.0520833.9765624-.15625 0-.0677083-.0338541-.1015625-.1015624-.1015625h-.2578126v-.1015625h.5625c.0364584 0 .2760417-.0520833.71875-.15625h.515625c.078125 0 .1458334-.015625.203125-.046875.0677084.03125.1197917.046875.15625.046875.671875-.2864583 1.2708334-.91927083 1.7968751-1.8984375.2031249-.6875.3046875-1.08072917.3046875-1.1796875v-.4140625c0-.05729167-.1692709-.10677083-.5078126-.1484375l-.1015624.046875h-.359375c-.140625 0-.2109376-.34114583-.2109376-1.0234375l-.25-.0546875h-1.75v-.1015625c.515625-.03125.8932292-.046875 1.1328126-.046875h.765625v-.0546875c-.3229167-.91145833-.8359376-1.61197917-1.5390626-2.1015625-.7760416-.47916667-1.4088541-.71875-1.8984374-.71875-1.4322917 0-2.5963542.734375-3.4921876 2.203125-.2395833.60416667-.359375.99739583-.359375 1.1796875zm-3.5390624 1.078125h.5625c.0677083.01041667.1015624.04427083.1015624.1015625l-.1015624.0546875h-.5625zm12.625.2109375-.046875.1015625v.046875h.046875c0-.06770833.0338541-.1015625.1015624-.1015625v-.046875zm-6.3125.765625h.0546874c.0677084.01041667.1015626.04427083.1015626.1015625v.15625c0 .06770833-.0338542.1015625-.1015626.1015625h-.0546874c-.0677084 0-.1015626-.03385417-.1015626-.1015625v-.15625c.0104167-.06770833.0442709-.1015625.1015626-.1015625zm-6.0078126.5625h.3125l.046875.2578125-.1484374.1015625h-.15625c-.0677084 0-.1197917-.1015625-.15625-.3046875z\"/><path d=\"m74.9414062.1953125c1.21875 0 2.3463542.29166667 3.3828126.875v.046875c-.1822917 0-.3359376.01822917-.4609375.0546875v.046875c.7708333.36458333 1.5729166 1.1171875 2.4062499 2.2578125.3333334 0 .5390626.1015625.6171876.3046875 0 .046875-.1015626.09895833-.3046875.15625 0 .15625-.5651042.48177083-1.6953125.9765625-.5104167.33854167-.8697917.5078125-1.078125.5078125h-.40625l-.9765626-1.171875c-.25-.13020833-.3854166-.234375-.40625-.3125v-.046875h.203125v-.109375c-.046875 0-.2682291-.1015625-.6640624-.3046875h-.2109376c-.3177083 0-.5729166-.06770833-.765625-.203125h-.8203124c-.078125 0-.1458334.015625-.203125.046875l-.1015626-.046875c-1.1822916.36979167-1.953125.84895833-2.3124999 1.4375-.0833334.09895833-.3046875.16666667-.6640625.203125v.046875c.0104166.07291667.0442708.109375.1015624.109375.0677084 0 .1015626-.01822917.1015626-.0546875l.515625.0546875h.921875v.046875c0 .06770833-.0338542.1015625-.1015626.1015625h-1.234375c-.203125.13541667-.4062499.71614583-.609375 1.7421875v.4140625c0 .41666667.1015626.96354167.3046876 1.640625l-.1015625.046875h-.5156251l-.3046874.0546875c-.0677084-.03645833-.1197917-.0546875-.15625-.0546875l-.1015626.0546875c-.0677083-.03645833-.1197916-.0546875-.15625-.0546875v.0546875c.2291667.65104167.6901042 1.1979167 1.3828126 1.640625.3385416.2395833.578125.359375.71875.359375h1.28125c.8020833.2395833 1.3854166.359375 1.75.359375.7083333-.2395833 1.1510416-.359375 1.328125-.359375.0677083.0364583.1197916.0546875.15625.0546875.7760416-.5208333 1.1848958-.8463542 1.2265624-.9765625.1979167-.140625.4713542-.5.8203126-1.078125v-.0546875h-4.1015626c-.0677083 0-.1015624-.03385417-.1015624-.1015625v-1.4296875c.171875-.10416667.2578124-.19010417.2578124-.2578125l-.046875-.1015625c.03125-.0625.046875-.1328125.046875-.2109375-.171875-.04166667-.2578124-.09114583-.2578124-.1484375.0677083-.08854167.1015624-.140625.1015624-.15625.0729167 0 .109375.01822917.109375.0546875.4010417-.03645833.6901042-.0546875.8671876-.0546875h5.3359374c.0729167 0 .140625.01822917.203125.0546875.0572917-.03645833.1250001-.0546875.203125-.0546875h.921875l.3125.359375v.3046875c-.171875.09375-.2760416.31770833-.3125.671875-.03125.5-.046875.84114583-.046875 1.0234375.171875 0 .2578126.03385417.2578126.1015625v.0546875c-.390625 1.3333333-.734375 2-1.03125 2-.0572917-.0364583-.125-.0546875-.203125-.0546875-.8020834 1.4479167-2.2369792 2.5078125-4.3046876 3.1796875-.578125.1041667-1.0052083.15625-1.28125.15625h-.9765624c-2.625 0-4.6927084-1.1119792-6.203125-3.3359375h-1.3828126c-.171875-.09375-.4635416-.6744792-.875-1.7421875v-.3125h1.3828126l-.203125-1.640625v-.25c.1510416-1.30208333.2864583-1.953125.40625-1.953125.6614583-.03125 1.0911458-.046875 1.2890624-.046875v-.1015625h-.0546874c-.359375 0-.90625-.01822917-1.640625-.0546875 0-.05208333.171875-.11979167.515625-.203125.6614583-1.66145833 1.6848958-2.875 3.0703124-3.640625.5416667 0 1.0052084-.11979167 1.390625-.359375.9166667-.41145833 2.078125-.6171875 3.484375-.6171875zm-8.875 4.6640625h.15625v.15625c-.1197916.03645833-.1875.0546875-.203125.0546875l-.0546874-.109375c.0104166-.06770833.0442708-.1015625.1015624-.1015625zm6.7734376 1.796875c.3385416.02604167.5078124.078125.5078124.15625 0 .06770833-.0338541.1015625-.1015624.1015625h-.4609376c-.0677083 0-.1015624-.03385417-.1015624-.1015625 0-.05208333.0520833-.10416667.15625-.15625zm-.671875.0546875h.109375c.0677083.01041667.1015624.04427083.1015624.1015625v.1015625h-.2109374c-.0677084 0-.1015626-.03385417-.1015626-.1015625.0104167-.06770833.0442709-.1015625.1015626-.1015625z\"/><path d=\"m87.1054688.1328125c.0572916.03645833.125.0546875.203125.0546875h.15625c.75 0 1.2473958.0859375 1.4921874.2578125h.3046876c.1041666 0 .5494791.16927083 1.3359374.5078125h.515625c.0520834 0 .1041667.05208333.15625.15625-.0364583.03645833-.1744791.0546875-.4140624.0546875.6197916.546875.9296874.85416667.9296874.921875v.0546875c-.015625.05729167-.6692708.69010417-1.9609374 1.8984375h-.71875c-.6979167-.671875-1.2291667-1.03125-1.59375-1.078125h-.046875c-.6875 0-1.03125.13802083-1.03125.4140625-.1458334 0-.2317709.23958333-.2578126.71875l.0546876.2578125h.4609374c.1145834 0 .2682292.0859375.4609376.2578125.2395833.046875.359375.11458333.359375.203125l-.046875.1015625.1015624.0546875h1.234375v.15625h-1.03125v.046875c.0104167.09375.3697917.265625 1.078125.515625 1.359375.40104167 2.4401042.95052083 3.2421876 1.6484375 0 .04166667.171875.24739583.515625.6171875-.4114584.03125-.6171876.08072917-.6171876.1484375.078125 0 .1302084.0859375.15625.2578125h.6171876c.09375 0 .1953124.20572917.3046874.6171875l-.1015624.0546875h-.515625c-.0677084.01041667-.1015626.04427083-.1015626.1015625h.671875c.046875 0 .0963542.05208333.1484376.15625v.1015625c0 .06770833-.0338542.1015625-.1015626.1015625h-.515625v.0546875c0 .17708333.0182292.46875.0546876.875 0 .5677083-.2057292 1.2369792-.6171876 2.0078125-.0677083.0104167-.1015624.0442708-.1015624.1015625v.1015625h.71875c.0677083.0104167.1015624.0442708.1015624.1015625-.0416666 0-.2630208.2239583-.6640624.671875-.8958334.6822917-2.1145834 1.0234375-3.65625 1.0234375h-.046875c-1.890625 0-3.4348959-.5833333-4.6328126-1.75-.890625-.0572917-1.3359374-.2447917-1.3359374-.5625-.328125-.296875-.5-.5703125-.515625-.8203125.5104166-.3385417.9036458-.578125 1.1796874-.71875l.2109376.046875c.0989583-.0260417.5963541-.3177083 1.4921874-.875h.6171876c.0572916 0 .2447916.2578125.5625.7734375v.1015625h-.15625v.1015625c.5833333.515625 1.1666666.7734375 1.75.7734375.890625-.1458333 1.3359374-.5755208 1.3359374-1.2890625 0-.109375-.0859374-.34895833-.2578124-.71875h.515625v-.046875c-.0885417-.171875-.2239584-.2578125-.40625-.2578125h-.515625c-.1458334 0-.3359376-.01822917-.5703126-.0546875l-.1015624.0546875c-.0677084-.03645833-.1197917-.0546875-.15625-.0546875v-.1015625h.0546874c.09375 0 .4375-.01822917 1.03125-.0546875v-.1015625l-1.4453124-.4609375c-.1041667 0-.2239584-.01822917-.359375-.0546875-.0572917.03645833-.125.0546875-.203125.0546875-.21875-.10416667-.5286459-.20833333-.9296876-.3125v-.1015625h.3671876v-.1015625c-1.0625-.39583333-1.7838542-.92708333-2.1640626-1.59375-.2604166-.35416667-.4140624-.74739583-.4609374-1.1796875l.1015624-.0546875h.203125c.0364584 0 .0546876.01822917.0546876.0546875.0520833-.03645833.1536458-.0546875.3046874-.0546875v-.1015625h-.6640624v-.1015625c.171875 0 .2578124-.03385417.2578124-.1015625l-.359375-.2109375c-.0520833-.13541667-.1041666-.203125-.15625-.203125h-.5703124v-.4140625c0-1.07291667.4973958-2.015625 1.4921874-2.828125h.15625c.0364584 0 .0546876.01822917.0546876.0546875l.1015624-.0546875.1015626.0546875c.2083333-.03645833.3125-.08854167.3125-.15625l-.109375-.0546875h-.3046876v-.046875c.4427084-.25520833.6640626-.40885417.6640626-.4609375 0-.09895833.4114583-.18489583 1.234375-.2578125h.7734374c.078125 0 .1484376-.01822917.2109376-.0546875zm-2.984375 4.8359375v.1015625h.046875v-.1015625zm.1484374 0v.1015625h.15625c0-.06770833-.0338541-.1015625-.1015624-.1015625zm-2.2578124 0h.1015624v.1015625h-.1015624zm.2578124 0h.1484376v.1015625h-.1484376zm3.9609376 4.0625h.5078124v.15625l-.359375-.0546875h-.1484374zm-1.546875.921875v.109375h.0546874v-.109375z\"/><path d=\"m6.15625 16.1328125c.05729167.0364583.125.0546875.203125.0546875h.15625c.75 0 1.24739583.0859375 1.4921875.2578125h.3046875c.10416667 0 .54947917.1692708 1.3359375.5078125h.515625c.0520833 0 .1041667.0520833.15625.15625-.0364583.0364583-.1744792.0546875-.4140625.0546875.6197917.546875.9296875.8541667.9296875.921875v.0546875c-.015625.0572917-.6692708.6901042-1.9609375 1.8984375h-.71875c-.69791667-.671875-1.22916667-1.03125-1.59375-1.078125h-.046875c-.6875 0-1.03125.1380208-1.03125.4140625-.14583333 0-.23177083.2395833-.2578125.71875l.0546875.2578125h.4609375c.11458333 0 .26822917.0859375.4609375.2578125.23958333.046875.359375.1145833.359375.203125l-.046875.1015625.1015625.0546875h1.234375v.15625h-1.03125v.046875c.01041667.09375.36979167.265625 1.078125.515625 1.359375.4010417 2.4401042.9505208 3.2421875 1.6484375 0 .0416667.171875.2473958.515625.6171875-.4114583.03125-.6171875.0807292-.6171875.1484375.078125 0 .1302083.0859375.15625.2578125h.6171875c.09375 0 .1953125.2057292.3046875.6171875l-.1015625.0546875h-.515625c-.0677083.0104167-.1015625.0442708-.1015625.1015625h.671875c.046875 0 .0963542.0520833.1484375.15625v.1015625c0 .0677083-.0338542.1015625-.1015625.1015625h-.515625v.0546875c0 .1770833.0182292.46875.0546875.875 0 .5677083-.2057292 1.2369792-.6171875 2.0078125-.0677083.0104167-.1015625.0442708-.1015625.1015625v.1015625h.71875c.0677083.0104167.1015625.0442708.1015625.1015625-.0416667 0-.2630208.2239583-.6640625.671875-.8958333.6822917-2.11458333 1.0234375-3.65625 1.0234375h-.046875c-1.890625 0-3.43489583-.5833333-4.6328125-1.75-.890625-.0572917-1.3359375-.2447917-1.3359375-.5625-.328125-.296875-.5-.5703125-.515625-.8203125.51041667-.3385417.90364583-.578125 1.1796875-.71875l.2109375.046875c.09895833-.0260417.59635417-.3177083 1.4921875-.875h.6171875c.05729167 0 .24479167.2578125.5625.7734375v.1015625h-.15625v.1015625c.58333333.515625 1.16666667.7734375 1.75.7734375.890625-.1458333 1.3359375-.5755208 1.3359375-1.2890625 0-.109375-.0859375-.3489583-.2578125-.71875h.515625v-.046875c-.08854167-.171875-.22395833-.2578125-.40625-.2578125h-.515625c-.14583333 0-.3359375-.0182292-.5703125-.0546875l-.1015625.0546875c-.06770833-.0364583-.11979167-.0546875-.15625-.0546875v-.1015625h.0546875c.09375 0 .4375-.0182292 1.03125-.0546875v-.1015625l-1.4453125-.4609375c-.10416667 0-.22395833-.0182292-.359375-.0546875-.05729167.0364583-.125.0546875-.203125.0546875-.21875-.1041667-.52864583-.2083333-.9296875-.3125v-.1015625h.3671875v-.1015625c-1.0625-.3958333-1.78385417-.9270833-2.1640625-1.59375-.26041667-.3541667-.4140625-.7473958-.4609375-1.1796875l.1015625-.0546875h.203125c.03645833 0 .0546875.0182292.0546875.0546875.05208333-.0364583.15364583-.0546875.3046875-.0546875v-.1015625h-.6640625v-.1015625c.171875 0 .2578125-.0338542.2578125-.1015625l-.359375-.2109375c-.05208333-.1354167-.10416667-.203125-.15625-.203125h-.5703125v-.4140625c0-1.0729167.49739583-2.015625 1.4921875-2.828125h.15625c.03645833 0 .0546875.0182292.0546875.0546875l.1015625-.0546875.1015625.0546875c.20833333-.0364583.3125-.0885417.3125-.15625l-.109375-.0546875h-.3046875v-.046875c.44270833-.2552083.6640625-.4088542.6640625-.4609375 0-.0989583.41145833-.1848958 1.234375-.2578125h.7734375c.078125 0 .1484375-.0182292.2109375-.0546875zm-2.984375 4.8359375v.1015625h.046875v-.1015625zm.1484375 0v.1015625h.15625c0-.0677083-.03385417-.1015625-.1015625-.1015625zm-2.2578125 0h.1015625v.1015625h-.1015625zm.2578125 0h.1484375v.1015625h-.1484375zm3.9609375 4.0625h.5078125v.15625l-.359375-.0546875h-.1484375zm-1.546875.921875v.109375h.0546875v-.109375z\"/><path d=\"m12.296875 16.1796875h3.5859375c.0729167.0104167.109375.0442708.109375.1015625v3.75h.984375c.0729167.0104167.109375.0442708.109375.1015625v.0546875c-.46875.0364583-.8177083.0546875-1.046875.0546875h-.046875v.359375l-.265625.2109375v.3125c.1197917 0 .2421875.0859375.3671875.2578125h.625c.0677083.0104167.1015625.046875.1015625.109375v2.703125c0 .0677083-.0338542.1015625-.1015625.1015625-.0364583 0-.0546875-.015625-.0546875-.046875-.0572917.03125-.125.046875-.203125.046875v.109375c0 .078125.015625.1458333.046875.203125 0 .3125-.15625.46875-.46875.46875v.0546875l.3671875.046875.2109375-.046875c.1354167 0 .2395833.2604167.3125.78125.1041667.078125.15625.1979167.15625.359375l-.2109375.109375c-.1875-.0364583-.34375-.0546875-.46875-.0546875h-.0546875c0 .3385417.3984375.7213542 1.1953125 1.1484375.1979167.1041667.5807292.171875 1.1484375.203125.7395833-.2135417 1.3307292-.6302083 1.7734375-1.25.0104167-.0677083.0442708-.1015625.1015625-.1015625h.4140625c.2916667 0 .4817708-.1744792.5703125-.5234375l.0546875-.2578125v-.8828125c0-.2447917.0338542-.4348958.1015625-.5703125-.0677083 0-.1015625-.0364583-.1015625-.109375v-2.1875l.0546875-.2578125c-.1510417-.1041667-.3958333-.15625-.734375-.15625 0 .0364583-.015625.0546875-.046875.0546875 0-.1875-.1223958-.2916667-.3671875-.3125v-.3125l.3125-.2109375c0-.2760417.0338542-.4140625.1015625-.4140625h.9375v-.1015625c-.46875-.0364583-.8151042-.0546875-1.0390625-.0546875v-3.75c.0104167-.0677083.0442708-.1015625.1015625-.1015625h3.5390625c.0729167.0104167.109375.0442708.109375.1015625v3.6484375c.0104167.0677083.0442708.1015625.1015625.1015625h.8828125c.0729167.0104167.109375.0442708.109375.1015625-.1770833.0729167-.4895833.109375-.9375.109375h-.109375c0 .3125-.1015625.46875-.3046875.46875v.4140625c.171875 0 .2578125.0338542.2578125.1015625l-.0546875.109375.2578125.046875h.5234375l.15625.109375-.0546875.2578125v3.8515625c0 .078125.0182292.1458333.0546875.203125-.0364583.3489583-.0885417.5234375-.15625.5234375h-.625c-.1145833 0-.234375.3125-.359375.9375-.2395833.6614583-.8307292 1.3723958-1.7734375 2.1328125.0677083.0104167.1015625.0442708.1015625.1015625v.0546875c-1.140625.5885417-2.1979167.8828125-3.171875.8828125-.1458333 0-.2838542.0182292-.4140625.0546875-1.4479167 0-2.75-.2604167-3.90625-.78125-.3177083-.2083333-.6302083-.3307292-.9375-.3671875-.9375-.6458333-1.5625-1.4609375-1.875-2.4453125l-.1015625-.515625.1015625-.0546875h.578125c.046875 0 .0989583-.0520833.15625-.15625l-.0546875-.7265625c.0364583-.0677083.0546875-.1197917.0546875-.15625l-.15625-.109375h-.625c-.0729167 0-.109375-.0338542-.109375-.1015625l.109375-.046875h.359375v-.625l.3671875-.2109375c0-.2083333.0182292-.3125.0546875-.3125l-.0546875-.3671875v-.9375c0-.125.0182292-.28125.0546875-.46875-.0364583-.0416667-.0546875-.1614583-.0546875-.359375v-.109375c0-.03125.0182292-.046875.0546875-.046875 0-.09375-.1041667-.1640625-.3125-.2109375-.0677083.0364583-.1197917.0546875-.15625.0546875v-.0546875l-.109375.0546875h-.203125c-.09375-.171875-.1640625-.2578125-.2109375-.2578125h-.1015625v-.15625l-.0546875-.265625c.2083333 0 .3125-.1901042.3125-.5703125h1.0390625v-.1015625c-.515625-.0364583-.8619792-.0546875-1.0390625-.0546875l-.0546875-.1015625v-3.6484375c.0104167-.0677083.046875-.1015625.109375-.1015625zm9.8828125 7.390625c0 .0677083-.0338542.1015625-.1015625.1015625v.0546875h.1015625l.0546875-.1015625v-.0546875z\"/><path d=\"m27.2265625 16.15625h4.7109375c1.9479167 0 3.3229167.6875 4.125 2.0625-.09375.0260417-.3072917.0598958-.640625.1015625.15625.3229167.296875.78125.421875 1.375h.53125c.0729167 0 .109375.0520833.109375.15625h.6328125c.0677083.015625.1015625.0520833.1015625.109375v.2109375c0 .0729167-.0338542.109375-.1015625.109375-.0364583 0-.0546875-.0182292-.0546875-.0546875-.0364583 0-.0546875.0182292-.0546875.0546875l-.2578125-.0546875h-.21875c0 1.3072917-.5442708 2.2942708-1.6328125 2.9609375v.1015625c1.40625.6197917 2.109375 1.7135417 2.109375 3.28125v.421875h.0546875c.046875 0 .2239583-.0182292.53125-.0546875l.0546875.109375c-.0260417.4583333-.0963542.6875-.2109375.6875h-.21875c-.078125 0-.1484375-.0182292-.2109375-.0546875-.1197917 0-.2786458.3177083-.4765625.953125l-.421875.421875-.3671875-.0546875h-.15625c-.9635417.9895833-1.9505208 1.484375-2.9609375 1.484375h-7.7734375c-.0729167 0-.109375-.0364583-.109375-.109375v-1.265625c.0104167-.0729167.046875-.109375.109375-.109375h.5234375c.0729167 0 .109375-.0338542.109375-.1015625v-.109375c0-.1041667-.0182292-.15625-.0546875-.15625l.0546875-.265625v-3.1171875c0-.0729167-.0364583-.109375-.109375-.109375h-.3125c-.3020833 0-.7786458-.0182292-1.4296875-.0546875l-.0546875-.1015625v-.0546875l.0546875-.1015625c.6510417-.0364583 1.1276042-.0546875 1.4296875-.0546875h.3671875l.0546875-.265625v-3.9140625l-.0546875-.3125c.0364583-.0625.0546875-.1510417.0546875-.265625v-.1640625c0-.0416667-.125-.1276042-.375-.2578125v-1.21875c0-.046875.1067708-.0989583.3203125-.15625.0364583-.0729167.0546875-.1276042.0546875-.1640625 0-.109375-.0182292-.4427083-.0546875-1 .0364583-.53125.0729167-.8151042.109375-.8515625.7552083-.03125 1.3177083-.046875 1.6875-.046875zm-2.9609375 2.1640625h.109375v1.3203125h-.109375zm.375 0h.1015625v1.3203125h-.1015625zm4.9140625.6875h-.953125v.5859375c.0104167.0677083.046875.1015625.109375.1015625h.4765625c.015625 0 .0677083.0364583.15625.109375l-.0546875.3671875v1.7421875c.0104167.0729167.046875.109375.109375.109375h2.109375c.7760417-.3125 1.1640625-.7708333 1.1640625-1.375v-.421875h.640625v-.0546875c0-.1510417-.0729167-.2578125-.21875-.3203125l-.1015625.0546875c-.0364583 0-.0546875-.0182292-.0546875-.0546875l-.1015625.0546875h-.265625c-.125-.140625-.25-.2109375-.375-.2109375h-.421875c-.421875-.4583333-.7552083-.6875-1-.6875h-1.0625c-.03125 0-.046875-.0182292-.046875-.0546875zm-.2109375 5.65625v.1640625h.578125c.5260417 0 1.2317708-.0182292 2.1171875-.0546875-.0208333-.1041667-.1614583-.15625-.421875-.15625h-.84375c-.3020833 0-.7786458.015625-1.4296875.046875zm-1.90625.1640625c0 .0677083-.015625.1015625-.046875.1015625.03125.0677083.046875.1197917.046875.15625h1.75v-.15625l-.375-.1015625zm5.7109375 0v.2109375l.0546875.1015625.3671875-.0546875h1.375c.0729167 0 .109375-.0338542.109375-.1015625v-.0546875c0-.0677083-.0364583-.1015625-.109375-.1015625zm-9.9375 0c.0677083.0104167.1015625.0442708.1015625.1015625v.0546875c0 .0677083-.0338542.1015625-.1015625.1015625-.0729167 0-.109375-.0338542-.109375-.1015625v-.0546875c.0104167-.0677083.046875-.1015625.109375-.1015625zm6.453125.3125h-.3203125l-.0546875.375c0 .1041667.0182292.15625.0546875.15625l-.0546875.265625v.265625c0 .3020833.0182292.6171875.0546875.9453125-.0364583.1354167-.0546875.2942708-.0546875.4765625l.109375.0546875h3.2265625c.2864583 0 .6015625-.2109375.9453125-.6328125-.421875-.0364583-.6328125-.0885417-.6328125-.15625.1197917 0 .2083333-.3359375.265625-1.0078125-.28125-.4947917-.4401042-.7421875-.4765625-.7421875-.2604167 0-1.125-.0182292-2.59375-.0546875l-.3671875.0546875v-.0546875z\"/><path d=\"m38.3046875 16.15625c.1927083.0364583.3515625.0546875.4765625.0546875h1.6953125c.078125 0 .1484375-.0182292.2109375-.0546875.4583333 0 .6875.1588542.6875.4765625l1 2.5859375h.4765625v.1640625h-.3125c-.0729167.0104167-.109375.0442708-.109375.1015625 0 .0625.1588542.1171875.4765625.1640625l.0546875.1015625v.265625h-.2109375c.28125.8697917.9140625 2.4895833 1.8984375 4.859375l.265625-.046875h.3203125l-.0546875-.375v-.2109375c.0729167-.2291667.109375-.4036458.109375-.5234375-.0729167 0-.109375-.0364583-.109375-.109375v-.0546875c.0104167-.0677083.046875-.1015625.109375-.1015625h.046875l.109375.0546875 1.6875-4.125.265625.0546875c.0208333 0 .0911458-.0182292.2109375-.0546875v-.1640625h-.2578125c-.0729167 0-.109375-.0338542-.109375-.1015625l1.109375-2.8515625.109375-.0546875h3.484375c.0729167.0104167.109375.0442708.109375.1015625v2.90625h.3125c.0729167.015625.109375.0520833.109375.109375l-.109375.0546875h-.3125v4.0703125h.265625c.0677083.0104167.1015625.0442708.1015625.1015625v.0546875c0 .0520833-.0520833.1041667-.15625.15625h-.0546875l-.109375-.046875-.046875.1015625v1.0078125h.578125c.0729167.0104167.109375.0442708.109375.1015625v3.3828125c0 .0729167-.0364583.109375-.109375.109375h-.578125v2.0078125c0 .0677083-.0364583.1015625-.109375.1015625h-1.7421875c-.3541667 0-.8828125-.015625-1.5859375-.046875v-1.75l-.0546875-.2578125.109375-.0546875h.3671875l.265625-.0546875v-2.8515625c.140625-.2135417.2109375-.4270833.2109375-.640625-.3854167-.0260417-.578125-.078125-.578125-.15625.2083333-.6666667.3645833-1 .46875-1 .140625 0 .2109375-.0364583.2109375-.109375v-.1015625c-.2447917 0-.3671875-.0546875-.3671875-.1640625v-.953125h-.0546875c-.046875 0-.1875.3359375-.421875 1.0078125.2135417.046875.3203125.0989583.3203125.15625 0 .09375-.125.1640625-.375.2109375 0-.03125-.015625-.046875-.046875-.046875-.140625.2552083-.28125.625-.421875 1.109375h.5234375c.0729167.0104167.109375.0442708.109375.1015625-.53125 1.3177083-.8671875 2.2005208-1.0078125 2.6484375-.2291667.5625-.3697917.84375-.421875.84375h-.6328125l-.796875 2.109375h-.9453125c-.3541667 0-.8828125-.015625-1.5859375-.046875-.4583333-1.1458333-.6875-1.8333333-.6875-2.0625h.4765625c.0677083 0 .1015625-.0364583.1015625-.109375-.6458333-1.6145833-.9817708-2.53125-1.0078125-2.75v-.6875c-.0208333 0-.2473958-.015625-.6796875-.046875l-.0546875.1015625v3.3828125c0 .0729167-.0364583.109375-.109375.109375h-.4765625c-.0677083.0104167-.1015625.0442708-.1015625.1015625v.1640625h.265625c.0677083.0104167.1015625.0442708.1015625.1015625 0 .0729167-.0338542.109375-.1015625.109375h-.265625v1.53125c0 .0677083-.0364583.1015625-.109375.1015625h-1.8515625c-.296875 0-.7708333-.015625-1.421875-.046875l-.0546875-.109375v-1.375l.3203125-.2109375-.3203125-.2109375v-.0546875c.0104167-.0677083.046875-.1015625.109375-.1015625h.578125l.0546875-.265625v-3.0703125l-.0546875-.2578125h-.578125c-.0729167 0-.109375-.0364583-.109375-.109375v-4.6015625c.0104167-.0677083.046875-.1015625.109375-.1015625h.2578125v-.421875h-.2578125c-.0729167 0-.109375-.0364583-.109375-.109375v-.046875h.3671875c.0729167 0 .109375-.0364583.109375-.109375v-.109375c-.078125 0-.1484375-.015625-.2109375-.046875-.0625.03125-.1328125.046875-.2109375.046875l-.0546875-.1015625v-1.1640625c0-.078125.0182292-.1484375.0546875-.2109375-.0364583-.0625-.0546875-.1328125-.0546875-.2109375v-1.21875c.0104167-.0677083.046875-.1015625.109375-.1015625h.3125c.203125 0 .3255208-.0182292.3671875-.0546875zm6.609375 3.0625h.3203125c.0364583 0 .0546875.0182292.0546875.0546875l.1015625-.0546875h.0546875v.1640625h-.53125c-.0677083 0-.1015625-.0364583-.1015625-.109375zm1.4296875 0h.53125v.1640625h-.53125c-.0729167 0-.109375-.0364583-.109375-.109375zm-5.390625 2.9140625v2.6953125h.6875v-.796875c-.2135417-.84375-.4427083-1.4765625-.6875-1.8984375zm4.703125 1.421875v.1640625h.0546875c.0677083 0 .1015625-.0364583.1015625-.109375v-.15625h-.046875c-.0729167.0104167-.109375.0442708-.109375.1015625zm-.265625 1.2734375c0 .03125-.0182292.046875-.0546875.046875.2395833.6979167.4166667 1.0859375.53125 1.1640625l.265625-.8984375c-.0729167-.1145833-.109375-.203125-.109375-.265625z\"/><path d=\"m52.9375 16.1796875h3.6484375c.0729167 0 .1276042.1927083.1640625.578125h.578125c.0729167.015625.109375.0520833.109375.109375l-.1640625.109375c-.1197917-.0364583-.1901042-.0546875-.2109375-.0546875-.0625.0364583-.1328125.0546875-.2109375.0546875v-.0546875c-.0677083.0364583-.1197917.0546875-.15625.0546875v6.2421875c0 .0833333.140625.1354167.421875.15625.0625-.0364583.1328125-.0546875.2109375-.0546875 0 .015625.0364583.0677083.109375.15625v.1640625c0 .046875-.0546875.0989583-.1640625.15625h-.3125c-.109375 0-.1640625-.0182292-.1640625-.0546875l-.2578125.0546875h-.53125c-.0729167.0104167-.109375.046875-.109375.109375v.2109375c.0104167.0677083.046875.1015625.109375.1015625h1.109375v3.703125c0 .078125.0182292.1484375.0546875.2109375-.0572917.1770833-.1640625.265625-.3203125.265625 0-.0364583-.0182292-.0546875-.0546875-.0546875l-.046875.109375v1.53125c.0104167.0729167.0442708.109375.1015625.109375.0625-.0364583.1328125-.0546875.2109375-.0546875.0729167.1302083.109375.2708333.109375.421875l-.109375.0546875h-2.328125c-.296875 0-.7708333-.0182292-1.421875-.0546875v-.3125l-.375-.2109375c0-.0364583-.0182292-.0546875-.0546875-.0546875l.0546875-.375v-.3125c0-.0833333-.0182292-.1536458-.0546875-.2109375.0364583-.0625.0546875-.1328125.0546875-.2109375v-.265625c0-.0677083-.1588542-.15625-.4765625-.265625-.0364583-.0677083-.0546875-.1197917-.0546875-.15625.0572917-.1458333.1119792-.21875.1640625-.21875h.2109375c.0625 0 .1145833.1588542.15625.4765625h.265625c.0729167 0 .109375-.0338542.109375-.1015625v-3.9140625c0-.0729167-.0364583-.109375-.109375-.109375-.6197917-.0364583-.9895833-.0546875-1.109375-.0546875l-.0546875-.1015625v-.15625c0-.0520833.0520833-.1067708.15625-.1640625.0364583 0 .0546875.0182292.0546875.0546875l.109375-.0546875h1.109375c.0677083 0 .1015625-.0338542.1015625-.1015625v-.1640625l-.1015625-.15625-.375.0546875h-.1015625c-.0520833 0-.1041667-.0520833-.15625-.15625v-6.140625l.046875-.1015625c-.0520833-.0364583-.15625-.0546875-.3125-.0546875v-.109375h.265625v-.5234375c.0104167-.0729167.0442708-.109375.1015625-.109375zm.265625.6875c.0104167.0729167.046875.109375.109375.109375h.1015625c.0729167 0 .109375-.0364583.109375-.109375s-.0364583-.109375-.109375-.109375h-.1015625c-.0729167.015625-.109375.0520833-.109375.109375z\"/><path d=\"m58.9375 16.171875h8.7890625c.078125 0 .1484375.0182292.2109375.0546875.0625-.0364583.1328125-.0546875.2109375-.0546875.0729167.0885417.109375.1588542.109375.2109375l-.0546875.109375c.0364583.1822917.1067708.3229167.2109375.421875v2l-.0546875.1015625-.265625-.046875h-1.1015625l-.3203125.046875c-.0572917-.03125-.1432292-.046875-.2578125-.046875l-.3671875.046875c-.0625-.03125-.1328125-.046875-.2109375-.046875l-.109375.046875c-.0364583 0-.0546875-.015625-.0546875-.046875l-.2578125.046875h-.53125v1.84375c0 .0729167-.140625.1276042-.421875.1640625 0 .1354167-.0338542.203125-.1015625.203125h-.4765625c-.0677083.015625-.1015625.0520833-.1015625.109375.0104167.0677083.0442708.1015625.1015625.1015625h.53125l.1015625.0546875-.0546875.265625v.4765625l.3203125.2109375c0 .0677083-.2109375.1197917-.6328125.15625v3.1015625c0 .0989583-.1770833.1692708-.53125.2109375v.0546875h.796875c.2083333.09375.3125.1640625.3125.2109375v4.1640625c0 .0677083-.0338542.1015625-.1015625.1015625h-2.109375c-.3541667 0-.8802083-.0182292-1.578125-.0546875-.0364583-.6458333-.0546875-1.1197917-.0546875-1.421875v-2.84375c-.3177083-.0677083-.4765625-.1380208-.4765625-.2109375l-.1015625.0546875h-.4765625v-.0546875c.0104167-.0677083.046875-.1015625.109375-.1015625l.2578125.0546875c.0677083-.0364583.1223958-.0546875.1640625-.0546875v-3.1640625c.0104167-.0677083.0442708-.1015625.1015625-.1015625h.4765625v-.2109375c-.1770833 0-.265625-.0338542-.265625-.1015625v-.6875c0-.0729167-.0364583-.109375-.109375-.109375h-.46875c-.0729167 0-.109375-.0338542-.109375-.1015625.0104167-.0729167.046875-.109375.109375-.109375h.46875l.2109375-.2578125h.265625l.0546875-.4765625c0-.0677083-.0182292-.1015625-.0546875-.1015625l.0546875-.265625v-.84375c0-.1510417-.0703125-.2552083-.2109375-.3125-.0364583 0-.0546875.015625-.0546875.046875l-.265625-.046875h-3.046875c-.0729167 0-.109375-.0364583-.109375-.109375v-2c-.140625 0-.2109375-.0338542-.2109375-.1015625v-.0546875c0-.078125.0182292-.1484375.0546875-.2109375-.0364583-.0625-.0546875-.1328125-.0546875-.2109375.0364583 0 .0546875-.0182292.0546875-.0546875.7552083-.0364583 1.3177083-.0546875 1.6875-.0546875zm.46875 5.0546875h.109375c.0677083.015625.1015625.0520833.1015625.109375 0 .0677083-.0338542.1015625-.1015625.1015625h-.109375c-.0677083 0-.1015625-.0338542-.1015625-.1015625.0104167-.0729167.0442708-.109375.1015625-.109375zm1.4765625 4.1640625v.1015625h.0546875v-.1015625z\"/><path d=\"m68.7578125 16.171875h8.7890625c.078125 0 .1484375.0182292.2109375.0546875.0625-.0364583.1328125-.0546875.2109375-.0546875.0729167.0885417.109375.1588542.109375.2109375l-.0546875.109375c.0364583.1822917.1067708.3229167.2109375.421875v2l-.0546875.1015625-.265625-.046875h-1.1015625l-.3203125.046875c-.0572917-.03125-.1432292-.046875-.2578125-.046875l-.3671875.046875c-.0625-.03125-.1328125-.046875-.2109375-.046875l-.109375.046875c-.0364583 0-.0546875-.015625-.0546875-.046875l-.2578125.046875h-.53125v1.84375c0 .0729167-.140625.1276042-.421875.1640625 0 .1354167-.0338542.203125-.1015625.203125h-.4765625c-.0677083.015625-.1015625.0520833-.1015625.109375.0104167.0677083.0442708.1015625.1015625.1015625h.53125l.1015625.0546875-.0546875.265625v.4765625l.3203125.2109375c0 .0677083-.2109375.1197917-.6328125.15625v3.1015625c0 .0989583-.1770833.1692708-.53125.2109375v.0546875h.796875c.2083333.09375.3125.1640625.3125.2109375v4.1640625c0 .0677083-.0338542.1015625-.1015625.1015625h-2.109375c-.3541667 0-.8802083-.0182292-1.578125-.0546875-.0364583-.6458333-.0546875-1.1197917-.0546875-1.421875v-2.84375c-.3177083-.0677083-.4765625-.1380208-.4765625-.2109375l-.1015625.0546875h-.4765625v-.0546875c.0104167-.0677083.046875-.1015625.109375-.1015625l.2578125.0546875c.0677083-.0364583.1223958-.0546875.1640625-.0546875v-3.1640625c.0104167-.0677083.0442708-.1015625.1015625-.1015625h.4765625v-.2109375c-.1770833 0-.265625-.0338542-.265625-.1015625v-.6875c0-.0729167-.0364583-.109375-.109375-.109375h-.46875c-.0729167 0-.109375-.0338542-.109375-.1015625.0104167-.0729167.046875-.109375.109375-.109375h.46875l.2109375-.2578125h.265625l.0546875-.4765625c0-.0677083-.0182292-.1015625-.0546875-.1015625l.0546875-.265625v-.84375c0-.1510417-.0703125-.2552083-.2109375-.3125-.0364583 0-.0546875.015625-.0546875.046875l-.265625-.046875h-3.046875c-.0729167 0-.109375-.0364583-.109375-.109375v-2c-.140625 0-.2109375-.0338542-.2109375-.1015625v-.0546875c0-.078125.0182292-.1484375.0546875-.2109375-.0364583-.0625-.0546875-.1328125-.0546875-.2109375.0364583 0 .0546875-.0182292.0546875-.0546875.7552083-.0364583 1.3177083-.0546875 1.6875-.0546875zm.46875 5.0546875h.109375c.0677083.015625.1015625.0520833.1015625.109375 0 .0677083-.0338542.1015625-.1015625.1015625h-.109375c-.0677083 0-.1015625-.0338542-.1015625-.1015625.0104167-.0729167.0442708-.109375.1015625-.109375zm1.4765625 4.1640625v.1015625h.0546875v-.1015625z\"/><path d=\"m79.0625 16.15625h7.515625c.046875 0 .0989583.0520833.15625.15625v1.8046875c0 .046875.0520833.0989583.15625.15625h.2109375c.0833333 0 .15625-.0182292.21875-.0546875.171875.046875.2578125.0989583.2578125.15625v.109375c0 .0677083-.0338542.1015625-.1015625.1015625h-.265625v.265625c0 .0729167-.0364583.109375-.109375.109375h-3.6484375c-.3697917 0-.9322917.0182292-1.6875.0546875v.4765625c.0104167.0677083.0442708.1015625.1015625.1015625h.4765625c.0729167.0104167.109375.046875.109375.109375v2.2734375h4.6015625c.0677083.0104167.1015625.0442708.1015625.1015625v.796875c0 .0677083-.1927083.1197917-.578125.15625l-.109375-.0546875-.3125.0546875c-.0729167-.0364583-.1276042-.0546875-.1640625-.0546875l-.0546875.265625v.8984375l.0546875.53125-.15625.109375h-4.5c0 .1197917-.1223958.1901042-.3671875.2109375l-.3203125-.0546875h-.1015625c-.0729167.0104167-.109375.046875-.109375.109375v.046875h.3203125l.53125.0546875v1.75c0 .1875.1041667.2916667.3125.3125 0 .078125.0182292.1484375.0546875.2109375-.0364583.0625-.0546875.1328125-.0546875.2109375v.0546875h5.03125c.0677083 0 .1197917.1770833.15625.53125h.7890625c.0729167.0104167.109375.0442708.109375.1015625 0 .0729167-.0364583.109375-.109375.109375h-.578125l-.265625.0546875v2.0078125h-8.671875c-.0364583 0-.0546875-.0182292-.0546875-.0546875l-.109375.0546875h-.3125c-.0520833 0-.1067708-.0520833-.1640625-.15625v-.109375c0-.0364583.0182292-.0546875.0546875-.0546875l-.0546875-.1015625v-1.2734375l-.265625-.046875h-.46875c-.0729167 0-.109375-.0364583-.109375-.109375v-.109375c.0104167-.0677083.046875-.1015625.109375-.1015625.5885417-.0364583 1.046875-.0546875 1.375-.0546875h.2109375v-.1015625l-.53125-.0546875h-.2109375c-.0729167 0-.109375-.0520833-.109375-.15625l.0546875-.109375c-.0364583-.0625-.0546875-.1328125-.0546875-.2109375 0-.046875.1067708-.0989583.3203125-.15625.0364583-.0625.0546875-.1354167.0546875-.21875 0-.1510417-.125-.2369792-.375-.2578125v-1.8046875l.0546875-.1015625-.1015625-.0546875h-.6875c-.0729167 0-.109375-.0338542-.109375-.1015625.0104167-.0729167.046875-.109375.109375-.109375h.6328125c.0677083 0 .1015625-.0364583.1015625-.109375v-1.7421875c0-.0729167.0546875-.109375.1640625-.109375s.4427083-.015625 1-.046875v-3.2265625c0-.109375-.1927083-.1640625-.578125-.1640625h-.109375v-.84375l.375-.2109375v-.109375c0-.0677083-.0364583-.1015625-.109375-.1015625h-.6328125c-.0729167 0-.109375-.0364583-.109375-.109375v-1.8515625l.0546875-.1015625c.7083333-.0364583 1.2369792-.0546875 1.5859375-.0546875zm-2.0078125 6.3515625h.265625c.0677083.0104167.1015625.0442708.1015625.1015625v.265625c0 .0677083-.0338542.1015625-.1015625.1015625h-.265625c-.0729167 0-.109375-.0338542-.109375-.1015625v-.265625c.015625-.0677083.0520833-.1015625.109375-.1015625zm1.90625 5.8671875h.4765625v-.1015625h-.375c-.0677083.0104167-.1015625.0442708-.1015625.1015625zm5.7109375.0546875v.2109375c.0104167.0729167.046875.109375.109375.109375h.734375c0-.0416667.0182292-.0963542.0546875-.1640625-.0364583-.0677083-.0546875-.1197917-.0546875-.15625z\"/><path d=\"m88.3515625 16.15625c.0677083 0 .1015625.0182292.1015625.0546875.53125-.0364583.921875-.0546875 1.171875-.0546875h3.703125c1.34375 0 2.2447917.1223958 2.703125.3671875.3177083.09375.5130208.2005208.5859375.3203125-.0364583.0625-.0546875.1328125-.0546875.2109375.5520833.265625 1.0286458.8489583 1.4296875 1.75.25.75.375 1.3151042.375 1.6953125 0 .1302083-.0520833.5546875-.15625 1.2734375.2083333 0 .3125.0364583.3125.109375-.4010417 1.0989583-1.0364583 1.9114583-1.90625 2.4375l-.796875.3125v.0546875c.0833333.078125.2786458.3619792.5859375.8515625-.1145833.0677083-.203125.1015625-.265625.1015625l.0546875.109375v.0546875c-.640625.03125-1.0651042.046875-1.2734375.046875v.0546875c.0104167.0729167.046875.109375.109375.109375h1.3203125l.4765625.578125c.3489583 0 .578125.1770833.6875.53125v.0546875c-.1770833 0-.265625.0364583-.265625.109375 1.0989583 1.578125 1.6484375 2.390625 1.6484375 2.4375-.140625.0260417-.2109375.0598958-.2109375.1015625.2447917.3697917.3671875.5833333.3671875.640625l-.1015625.046875h-2.65625c-.296875 0-.7734375-.015625-1.4296875-.046875-.28125-.4010417-.421875-.6145833-.421875-.640625.0572917-.0364583.1458333-.0546875.265625-.0546875v-.046875c-1.0260417-1.5572917-1.5390625-2.40625-1.5390625-2.546875h.2109375v-.109375c-.109375-.3489583-.3203125-.5234375-.6328125-.5234375-.2760417-.3541667-.4895833-.53125-.640625-.53125h-.953125v.265625c0 .03125-.015625.046875-.046875.046875l.046875.109375v2.4375h.5859375c.0729167.0104167.109375.046875.109375.109375 0 .0677083-.0364583.1015625-.109375.1015625h-.5859375c0 .1770833-.015625.265625-.046875.265625l.046875.109375v.6328125c0 .078125-.015625.1484375-.046875.2109375.03125.0677083.046875.1223958.046875.1640625l-.1015625.046875h-2.171875c-.3541667 0-.8854167-.015625-1.59375-.046875v-1.2734375c.0104167-.0729167.046875-.109375.109375-.109375h.578125v-.15625h-.578125c-.0729167 0-.109375-.0364583-.109375-.109375v-2.75l-.265625-.0546875h-1.0546875c-.0729167 0-.109375-.0364583-.109375-.109375l.109375-.0546875c.8802083-.015625 1.3203125-.0494792 1.3203125-.1015625 0-.109375.0364583-.1640625.109375-.1640625.0677083.0364583.1197917.0546875.15625.0546875l.0546875-.1015625v-3.609375c.0104167-.0677083.0442708-.1015625.1015625-.1015625h.265625l.0546875-.3203125c-.0677083-.0364583-.1197917-.0546875-.15625-.0546875-.3125.0364583-.4895833.0546875-.53125.0546875 0-.28125-.140625-.421875-.421875-.421875v-.265625l.3671875-.2109375v-3.5546875l.3203125-.2109375v-.53125c.0104167-.0677083.0442708-.1015625.1015625-.1015625h.375c.1197917 0 .2083333-.0182292.265625-.0546875zm2.8046875 2.8125c0 .03125-.015625.046875-.046875.046875.03125.3541667.046875.6197917.046875.796875v.3203125c0 .0364583-.015625.0546875-.046875.0546875l.046875.1015625v.0546875c0 .3177083-.140625.4765625-.421875.4765625v.3203125c.28125.0208333.421875.0729167.421875.15625h-.046875c.03125.0677083.046875.1197917.046875.15625h1.2734375v.109375h-.4765625l-.2109375.265625h-.265625v.53125h1.640625c.7135417 0 1.1927083-.1770833 1.4375-.53125.3489583 0 .5234375-.125.5234375-.375h-.4765625l-.1015625-.046875c.0677083-.2447917.1015625-.4583333.1015625-.640625v-.421875c0-.3697917-.3177083-.7760417-.953125-1.21875-.078125-.0729167-.4296875-.125-1.0546875-.15625l-.109375.046875-.109375-.046875c-.03125 0-.046875.015625-.046875.046875-.125-.03125-.1979167-.046875-.21875-.046875-.3072917.03125-.4817708.046875-.5234375.046875-.1979167-.03125-.3411458-.046875-.4296875-.046875zm-3.015625 2.5390625v.0546875h.1015625v-.0546875zm.265625 0v.0546875h.1015625v-.0546875zm10.015625-.0546875h.15625v.109375h-.15625zm.3671875 0h.1640625v.109375h-.1640625zm.265625 0h.4765625v.109375h-.4765625zm-7.734375 4.1875-.109375-.0546875c0 .0729167-.0338542.109375-.1015625.109375.03125.0677083.046875.1197917.046875.15625.3541667-.03125.6197917-.046875.796875-.046875h.0546875l.1015625.046875.21875-.3671875c-.140625-.3177083-.2291667-.4765625-.265625-.4765625h-.4765625c-.0729167 0-.1276042.2109375-.1640625.6328125zm-1.59375.2109375v.0546875c.0104167.0729167.046875.109375.109375.109375h.953125c.0677083 0 .1015625-.0364583.1015625-.109375v-.0546875zm4.2421875 3.9765625h.1015625c0 .0572917.0364583.1276042.109375.2109375v.109375c-.046875-.0052083-.1171875-.09375-.2109375-.265625zm.3671875.53125h.0546875v.109375h-.0546875z\"/></g></g><g fill=\"#fff\"><circle cx=\"245.1\" cy=\"244.2\" r=\"11\" stroke=\"#323232\" stroke-width=\"2\"/><g transform=\"translate(-2)\"><path d=\"m244.1 448.2c-112.8 0-204-91.2-204-204 0-4 3.2-8 8-8 4 0 8 3.2 8 8-.8 104 84 188.8 188 188.8 4 0 8 3.2 8 8 0 4-4 7.2-8 7.2z\"/><path d=\"m440.9 252.2c-4 0-8-3.2-8-8 0-104-84.8-188.8-188.8-188.8-4 0-8-3.2-8-8 0-4 3.2-8 8-8 112.8 0 204 92 204 204 0 4.8-3.2 8.8-7.2 8.8z\"/><path d=\"m244.1 401c-86.4 0-156.8-70.4-156.8-156.8 0-4 3.2-8 8-8 4 0 8 3.2 8 8 0 77.6 63.2 141.6 141.6 141.6 4 0 8 3.2 8 8-.8 4-4.8 7.2-8.8 7.2z\"/><path d=\"m392.9 252.2c-4 0-8-3.2-8-8 0-77.6-63.2-141.6-141.6-141.6-4 0-8-3.2-8-8 0-4 3.2-8 8-8 86.4 0 156.8 70.4 156.8 156.8.8 4.8-2.4 8.8-7.2 8.8z\"/></g></g></g></svg>",
        "ds-icon-close": "<svg viewBox=\"0 0 640 640\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m183.1 137.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l137.4 137.3-137.3 137.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l137.3-137.4 137.4 137.3c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-137.4-137.3 137.3-137.4c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-137.3 137.4z\"/></svg>",
        "ds-icon-bug": "<svg viewBox=\"0 0 640 640\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m224 160c0-53 43-96 96-96s96 43 96 96v3.6c0 15.7-12.7 28.4-28.4 28.4h-135.1c-15.7 0-28.4-12.7-28.4-28.4v-3.6zm345.6 12.8c10.6 14.1 7.7 34.2-6.4 44.8l-97.8 73.3c5.3 8.9 9.3 18.7 11.8 29.1h98.8c17.7 0 32 14.3 32 32s-14.3 32-32 32h-96v32c0 2.6-.1 5.3-.2 7.9l83.4 62.5c14.1 10.6 17 30.7 6.4 44.8s-30.7 17-44.8 6.4l-63.1-47.3c-23.2 44.2-66.5 76.2-117.7 83.9v-230.2c0-13.3-10.7-24-24-24s-24 10.7-24 24v230.2c-51.2-7.7-94.5-39.7-117.7-83.9l-63.1 47.3c-14.1 10.6-34.2 7.7-44.8-6.4s-7.7-34.2 6.4-44.8l83.4-62.5c-.1-2.6-.2-5.2-.2-7.9v-32h-96c-17.7 0-32-14.3-32-32s14.3-32 32-32h98.8c2.5-10.4 6.5-20.2 11.8-29.1l-97.8-73.3c-14.1-10.6-17-30.7-6.4-44.8s30.7-17 44.8-6.4l108.8 81.6c12.3-5.1 25.8-8 40-8h112c14.2 0 27.7 2.8 40 8l108.8-81.6c14.1-10.6 34.2-7.7 44.8 6.4z\"/></svg>",
        "ds-icon-chevron-down": "<svg viewBox=\"0 0 640 640\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m297.4 470.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-169.4 169.4-169.4-169.3c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"/></svg>",
        "ds-square-check": "<svg viewBox=\"0 0 640 640\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m480 96c35.3 0 64 28.7 64 64v320c0 35.3-28.7 64-64 64h-320c-35.3 0-64-28.7-64-64v-320c0-35.3 28.7-64 64-64zm-42 113.7c-10.7-7.8-25.7-5.4-33.5 5.3l-119.4 164.2-52.1-52.1c-9.4-9.4-24.6-9.4-33.9 0s-9.4 24.6 0 33.9l72 72c5 5 11.9 7.5 18.8 7s13.4-4.1 17.5-9.8l135.9-187c7.8-10.7 5.4-25.7-5.3-33.5z\"/></svg>",
        "ds-rotate-left": "<svg viewBox=\"0 0 640 640\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m88 256h144c9.7 0 18.5-5.8 22.2-14.8s1.7-19.3-5.2-26.2l-46.7-46.7c75.3-58.6 184.3-53.3 253.5 15.9 75 75 75 196.5 0 271.5s-196.5 75-271.5 0c-10.2-10.2-19-21.3-26.4-33-9.5-14.9-29.3-19.3-44.2-9.8s-19.3 29.3-9.8 44.2c9.8 15.6 21.5 30.4 35.1 43.9 100 100 262 100 362 0s100-262 0-362c-94.2-94.3-243.7-99.7-344.3-16.2l-51.7-51.8c-6.9-6.8-17.2-8.9-26.2-5.2s-14.8 12.5-14.8 22.2v144c0 13.3 10.7 24 24 24z\"/></svg>"
    };
    var SvgSprite = class {
        mount() {
            if (document.getElementById(`${USERSCRIPT.ID}-svg-sprite`)) return;
            const sprite = document.createElementNS("http://www.w3.org/2000/svg", "svg");
            sprite.id = `${USERSCRIPT.ID}-svg-sprite`;
            sprite.style.display = "none";
            sprite.innerHTML = this.buildSymbols();
            document.body.appendChild(sprite);
        }
        buildSymbols() {
            const parser = new DOMParser();
            return Object.entries(ICON_REGISTRY).map(([iconId, svgString]) => {
                if (!svgString) return "";
                const svgElement = parser.parseFromString(svgString, "image/svg+xml").querySelector("svg");
                if (!svgElement) return "";
                return `<symbol id="${iconId}" viewBox="${svgElement.getAttribute("viewBox") || "0 0 1024 1024"}">${svgElement.innerHTML.trim()}</symbol>`;
            }).filter(Boolean).join("");
        }
    };
    var App = class {
        position = "right";
        injectButton = new InjectButton();
        widget = new Widget({
            onOpen: () => this.injectButton.setHidden(true),
            onClose: () => this.injectButton.setHidden(false),
            onPositionChange: (side) => {
                this.position = side;
                this.injectButton.setPosition(side);
            }
        });
        styles = new StylesInjector();
        sprite = new SvgSprite();
        observer = new SpaObserver();
        async init() {
            this.styles.injectGlobal();
            this.sprite.mount();
            await this.widget.init();
            this.injectButton.setPosition(this.position);
            this.bindEvents();
            this.observer.start({
                onMutate: () => this.refreshInjection(),
                onUrlChange: () => this.handleUrlChange()
            });
            this.refreshInjection();
        }
        bindEvents() {
            bindActivation(this.injectButton.element, () => {
                const store = DigitalStoreRegistry.detectByLocation();
                if (store) this.widget.open(store);
            });
        }
        refreshInjection() {
            const store = DigitalStoreRegistry.detectByLocation();
            if (!store) {
                if (this.injectButton.element?.parentElement) this.injectButton.element.remove();
                this.styles.cleanupProvider();
                return;
            }
            if (this.injectButton.element && !this.injectButton.element.isConnected) document.body.appendChild(this.injectButton.element);
            this.styles.injectProvider(store.id, DigitalStoreRegistry.getStyles(store.id));
        }
        handleUrlChange() {
            this.widget.reset();
            if (this.injectButton.element?.parentElement) this.injectButton.element.remove();
        }
    };
    new App().init();
})();