remove unnecesarry stuff

This commit is contained in:
C10udburst 2022-08-04 10:48:52 +02:00
parent 1457cb4647
commit 3337e08c45
9 changed files with 17 additions and 886 deletions

65
.github/site-list.py vendored
View file

@ -1,65 +0,0 @@
#!/usr/bin/python3
from glob import glob
from re import findall, compile, DOTALL
from json import dump, load
from typing import List, Dict
# Globals
JSON_PATH = "docs/providers.json"
GLOB_ANIME = "app/src/main/java/com/lagradost/cloudstream3/animeproviders/*Provider.kt"
GLOB_MOVIE = "app/src/main/java/com/lagradost/cloudstream3/movieproviders/*Provider.kt"
URL_REGEX = compile("override\sva[lr]\smainUrl[^\"']+[\"'](https?://[a-zA-Z0-9\.-/]+)[\"']")
FILENAME_REGEX = compile("([A-Za-z0-9]+)(?:.kt)$")
PROVIDER_CLASSNAME_REGEX = compile("(?<=class\s)([a-zA-Z]+)(?=\s:\sMainAPI\(\))")
NAME_REGEX = compile("override\sva[lr]\sname[^\"']+[\"']([a-zA-Z-.\s]+)")
LANG_REGEX = compile("override\sva[lr]\slang[^\"']+[\"']([a-zA-Z]+)")
old_sites: Dict[str, Dict] = load(open(JSON_PATH, "r", encoding="utf-8"))
sites: Dict[str, Dict] = {}
animelist = glob(GLOB_ANIME)
movielist = glob(GLOB_MOVIE)
allProvidersList = animelist + movielist
# parse all *Provider.kt files
for path in allProvidersList:
with open(path, "r", encoding='utf-8') as file:
try:
site_text: str = file.read()
filename: str = findall(FILENAME_REGEX, path)[0]
name: str = [*findall(PROVIDER_CLASSNAME_REGEX, site_text), filename][0]
provider_url: str = [*findall(URL_REGEX, site_text), ""][0]
lang: str = [*findall(LANG_REGEX, site_text), "en"][0]
if name in old_sites.keys(): # if already in previous list use old status and name
sites[name] = {
"name": old_sites[name]['name'],
"url": provider_url if provider_url else old_sites[name]['url'],
"status": old_sites[name]['status'],
"language": lang
}
else: # if not in previous list add with new data
display_name: str = [*findall(NAME_REGEX, site_text), name][0]
if display_name.endswith("Provider"):
display_name = display_name[:-len("Provider")]
sites[name] = {
"name": display_name,
"url": provider_url if provider_url else "",
"status": 1,
"language": lang
}
except Exception as ex:
print("Error => {0}: {1}".format(path, ex))
# add sites from old_sites that are missing in new list
for name in old_sites.keys():
if name not in sites.keys():
sites[name] = {
"name": old_sites[name]['name'],
"url": old_sites[name]['url'],
"status": old_sites[name]['status']
}
dump(sites, open(JSON_PATH, "w+", encoding="utf-8"), indent=4, sort_keys=True)

View file

@ -31,25 +31,25 @@ jobs:
run: |
COMMIT_HASH="$(git log -1 --format='%H')"
sed -i "s/<string name=\"prerelease_commit_hash\" translatable=\"false\">unknown_prerelease<\/string>/<string name=\"prerelease_commit_hash\">$COMMIT_HASH<\/string>/g" app/src/main/res/values/strings.xml
- name: Decode Keystore
env:
ENCODED_STRING: ${{ secrets.KEYSTORE }}
run: |
TMP_KEYSTORE_FILE_PATH="${RUNNER_TEMP}"/keystore
mkdir -p "${TMP_KEYSTORE_FILE_PATH}"
echo $ENCODED_STRING | base64 -di > "${TMP_KEYSTORE_FILE_PATH}"/prerelease_keystore.keystore
# - name: Decode Keystore
# env:
# ENCODED_STRING: ${{ secrets.KEYSTORE }}
# run: |
# TMP_KEYSTORE_FILE_PATH="${RUNNER_TEMP}"/keystore
# mkdir -p "${TMP_KEYSTORE_FILE_PATH}"
# echo $ENCODED_STRING | base64 -di > "${TMP_KEYSTORE_FILE_PATH}"/prerelease_keystore.keystore
- name: Run Gradle
run: ./gradlew app:assemblePrerelease
run: ./gradlew app:assembleDebug
env:
SIGNING_KEY_ALIAS: ${{ secrets.SIGNING_KEY_ALIAS }}
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }}
SIGNING_STORE_PASSWORD: ${{ secrets.SIGNING_STORE_PASSWORD }}
#- name: Create pre-release
# uses: "marvinpinto/action-automatic-releases@latest"
# with:
# repo_token: "${{ secrets.GITHUB_TOKEN }}"
# automatic_release_tag: "pre-release"
# prerelease: true
# title: "Pre-release Build"
# files: |
# app/build/outputs/apk/prerelease/*.apk
- name: Create pre-release
uses: "marvinpinto/action-automatic-releases@latest"
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
automatic_release_tag: "pre-release"
prerelease: true
title: "Pre-release Build"
files: |
app/build/outputs/apk/prerelease/*.apk

View file

@ -1,32 +0,0 @@
name: Create site list
on:
push:
branches: [ master ]
paths:
- 'app/src/main/java/com/lagradost/cloudstream3/*providers/*Provider.kt'
- '.github/workflows/site_list.yml'
- '.github/site-list.py'
- 'docs/providers.json'
- 'app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt'
concurrency:
group: "site-list"
cancel-in-progress: true
jobs:
create:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Edit providers.json
run: |
python3 .github/site-list.py
- name: Commit to the repo
run: |
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git add .
# "echo" returns true so the build succeeds, even if no changed files
git commit -m 'chore(docs): update list of sites' || echo
git push

View file

@ -1 +0,0 @@
theme: jekyll-theme-modernist

View file

@ -1,23 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto">
<title>CloudStream-3 Supported Sites</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div>
<h1>Sites supported (<span id="count">0</span>):</h1>
<table>
<tbody id="siteList"></tbody>
</table>
</div>
<script src="script.js" type="text/javascript"></script>
</body>
</html>

View file

@ -1,4 +0,0 @@
{
"wco_key": "51wJ0FDq/UVCefLopEcmK3ni4WIQztMjZdSYOsbHr9R2h7PvxBGAuglaN8+kXT6y",
"wco_cipher_key": "vZUFFBPxMqDeOfAm"
}

View file

@ -1,633 +0,0 @@
{
"AkwamProvider": {
"language": "ar",
"name": "Akwam",
"status": 1,
"url": "https://akwam.to"
},
"AllAnimeProvider": {
"language": "en",
"name": "AllAnime",
"status": 1,
"url": "https://allanime.site"
},
"AllMoviesForYouProvider": {
"language": "en",
"name": "AllMoviesForYou",
"status": 1,
"url": "https://allmoviesforyou.net"
},
"AltadefinizioneProvider": {
"language": "it",
"name": "Altadefinizione",
"status": 1,
"url": "https://altadefinizione.tienda"
},
"AniPlayProvider": {
"language": "it",
"name": "AniPlay",
"status": 1,
"url": "https://aniplay.it"
},
"AniflixProvider": {
"language": "en",
"name": "Aniflix",
"status": 1,
"url": "https://aniflix.pro"
},
"AnimeFlickProvider": {
"language": "en",
"name": "AnimeFlick",
"status": 1,
"url": "https://animeflick.net"
},
"AnimeIndoProvider": {
"language": "id",
"name": "AnimeIndo",
"status": 1,
"url": "https://animeindo.sbs"
},
"AnimePaheProvider": {
"language": "en",
"name": "AnimePahe",
"status": 0,
"url": "https://animepahe.com"
},
"AnimeSailProvider": {
"language": "id",
"name": "AnimeSail",
"status": 1,
"url": "https://111.90.143.42"
},
"AnimeSaturnProvider": {
"language": "it",
"name": "AnimeSaturn",
"status": 1,
"url": "https://www.animesaturn.cc"
},
"AnimeWorldProvider": {
"language": "it",
"name": "AnimeWorld",
"status": 1,
"url": "https://www.animeworld.tv"
},
"AnimefenixProvider": {
"language": "es",
"name": "Animefenix",
"status": 1,
"url": "https://animefenix.com"
},
"AnimeflvIOProvider": {
"language": "es",
"name": "Animeflv.io",
"status": 1,
"url": "https://animeflv.io"
},
"AnimeflvnetProvider": {
"language": "es",
"name": "Animeflv.net",
"status": 1,
"url": "https://www3.animeflv.net"
},
"AnimekisaProvider": {
"language": "en",
"name": "Animekisa",
"status": 1,
"url": "https://animekisa.in"
},
"ApiMDBProvider": {
"name": "ApiMDB",
"status": 0,
"url": "https://v2.apimdb.net"
},
"AsiaFlixProvider": {
"language": "en",
"name": "AsiaFlix",
"status": 0,
"url": "https://asiaflix.app"
},
"AsianLoadProvider": {
"language": "en",
"name": "AsianLoad",
"status": 1,
"url": "https://asianembed.io"
},
"BflixProvider": {
"language": "en",
"name": "Bflix",
"status": 1,
"url": "https://bflix.ru"
},
"CimaNowProvider": {
"language": "ar",
"name": "CimaNow",
"status": 1,
"url": "https://cimanow.cc"
},
"CineblogProvider": {
"language": "it",
"name": "CineBlog",
"status": 1,
"url": "https://cb01.rip"
},
"CinecalidadProvider": {
"language": "es",
"name": "Cinecalidad",
"status": 1,
"url": "https://cinecalidad.lol"
},
"CuevanaProvider": {
"language": "es",
"name": "Cuevana",
"status": 1,
"url": "https://cuevana3.me"
},
"DopeboxProvider": {
"language": "en",
"name": "Dopebox",
"status": 1,
"url": "https://dopebox.to"
},
"DoramasYTProvider": {
"language": "es",
"name": "DoramasYT",
"status": 1,
"url": "https://doramasyt.com"
},
"DramaSeeProvider": {
"language": "en",
"name": "DramaSee",
"status": 1,
"url": "https://dramasee.net"
},
"DramaidProvider": {
"language": "id",
"name": "DramaId",
"status": 1,
"url": "https://185.224.83.103"
},
"DreamSubProvider": {
"name": "DreamSub",
"status": 1,
"url": "https://dreamsub.me"
},
"DubbedAnimeProvider": {
"language": "en",
"name": "DubbedAnime",
"status": 1,
"url": "https://bestdubbedanime.com"
},
"DubokuProvider": {
"language": "zh",
"name": "Duboku",
"status": 1,
"url": "https://www.duboku.tv"
},
"EgyBestProvider": {
"language": "ar",
"name": "EgyBest",
"status": 1,
"url": "https://www.egy.best"
},
"ElifilmsProvider": {
"language": "es",
"name": "Elifilms",
"status": 1,
"url": "https://elifilms.net"
},
"EntrePeliculasySeriesProvider": {
"name": "EntrePeliculasySeries",
"status": 1,
"url": "https://entrepeliculasyseries.nu"
},
"EntrepeliculasyseriesProvider": {
"language": "es",
"name": "EntrePeliculasySeries",
"status": 1,
"url": "https://entrepeliculasyseries.nu"
},
"EstrenosDoramasProvider": {
"language": "es",
"name": "EstrenosDoramas",
"status": 1,
"url": "https://www23.estrenosdoramas.net"
},
"FaselHDProvider": {
"language": "ar",
"name": "FaselHD",
"status": 0,
"url": "https://faselhd.io"
},
"FilmanProvider": {
"language": "pl",
"name": "filman.cc",
"status": 1,
"url": "https://filman.cc"
},
"FilmpertuttiProvider": {
"language": "it",
"name": "Filmpertutti",
"status": 1,
"url": "https://filmpertutti.photo"
},
"FmoviesToProvider": {
"language": "en",
"name": "Fmovies.to",
"status": 1,
"url": "https://fmovies.to"
},
"FrenchStreamProvider": {
"language": "fr",
"name": "French Stream",
"status": 1,
"url": "https://french-stream.re"
},
"GogoanimeProvider": {
"language": "en",
"name": "GogoAnime",
"status": 1,
"url": "https://gogoanime.lu"
},
"GomunimeProvider": {
"language": "id",
"name": "Gomunime",
"status": 1,
"url": "https://185.231.223.76"
},
"HDMProvider": {
"language": "en",
"name": "HD Movies",
"status": 0,
"url": "https://hdm.to"
},
"HDTodayProvider": {
"language": "en",
"name": "HDToday",
"status": 1,
"url": "https://hdtoday.cc"
},
"HDrezkaProvider": {
"language": "ru",
"name": "HDrezka",
"status": 1,
"url": "https://hdrezka19139.org"
},
"IHaveNoTvProvider": {
"language": "en",
"name": "I Have No TV",
"status": 1,
"url": "https://ihavenotv.com"
},
"IdlixProvider": {
"language": "id",
"name": "Idlix",
"status": 1,
"url": "https://94.103.82.88"
},
"IlGenioDelloStreamingProvider": {
"language": "it",
"name": "IlGenioDelloStreaming",
"status": 1,
"url": "https://ilgeniodellostreaming.quest"
},
"JKAnimeProvider": {
"language": "es",
"name": "JKAnime",
"status": 1,
"url": "https://jkanime.net"
},
"KawaiifuProvider": {
"language": "en",
"name": "Kawaiifu",
"status": 1,
"url": "https://kawaiifu.com"
},
"KdramaHoodProvider": {
"language": "en",
"name": "KDramaHood",
"status": 1,
"url": "https://kdramahood.com"
},
"KimCartoonProvider": {
"language": "en",
"name": "Kim Cartoon",
"status": 1,
"url": "https://kimcartoon.li"
},
"KisskhProvider": {
"language": "en",
"name": "Kisskh",
"status": 1,
"url": "https://kisskh.me"
},
"KuramanimeProvider": {
"language": "id",
"name": "Kuramanime",
"status": 1,
"url": "https://kuramanime.com"
},
"KuronimeProvider": {
"language": "id",
"name": "Kuronime",
"status": 1,
"url": "https://45.12.2.2"
},
"LayarKaca21Provider": {
"name": "LayarKaca",
"status": 1,
"url": "https://149.56.24.226/"
},
"LayarKacaProvider": {
"language": "id",
"name": "LayarKaca",
"status": 1,
"url": "https://149.56.24.226"
},
"LookMovieProvider": {
"name": "LookMovie",
"status": 0,
"url": "https://lookmovie.io"
},
"MeloMovieProvider": {
"language": "en",
"name": "MeloMovie",
"status": 0,
"url": "https://melomovie.com"
},
"MonoschinosProvider": {
"language": "es",
"name": "Monoschinos",
"status": 1,
"url": "https://monoschinos2.com"
},
"MultiplexProvider": {
"language": "id",
"name": "Multiplex",
"status": 1,
"url": "https://146.19.24.137"
},
"MundoDonghuaProvider": {
"language": "es",
"name": "MundoDonghua",
"status": 1,
"url": "https://www.mundodonghua.com"
},
"MyCimaProvider": {
"language": "ar",
"name": "MyCima",
"status": 1,
"url": "https://mycima.tv"
},
"NeonimeProvider": {
"language": "id",
"name": "Neonime",
"status": 1,
"url": "https://neonime.watch"
},
"NginxProvider": {
"language": "en",
"name": "Nginx",
"status": 1,
"url": ""
},
"NineAnimeProvider": {
"language": "en",
"name": "9Anime",
"status": 1,
"url": "https://9anime.id"
},
"NontonAnimeIDProvider": {
"language": "id",
"name": "NontonAnimeID",
"status": 1,
"url": "https://75.119.159.228"
},
"OlgplyProvider": {
"language": "en",
"name": "Olgply",
"status": 1,
"url": "https://olgply.com"
},
"OpenVidsProvider": {
"language": "en",
"name": "OpenVids",
"status": 1,
"url": "https://openvids.io"
},
"OploverzProvider": {
"language": "id",
"name": "Oploverz",
"status": 1,
"url": "https://65.108.132.145"
},
"OtakudesuProvider": {
"language": "id",
"name": "Otakudesu",
"status": 1,
"url": "https://otakudesu.watch"
},
"PeliSmartProvider": {
"language": "es",
"name": "PeliSmart",
"status": 1,
"url": "https://pelismart.com"
},
"PelisflixProvider": {
"language": "es",
"name": "Pelisflix",
"status": 1,
"url": "https://pelisflix.li"
},
"PelisplusHDProvider": {
"language": "es",
"name": "PelisplusHD",
"status": 1,
"url": "https://pelisplushd.net"
},
"PelisplusProvider": {
"language": "en",
"name": "Pelisplus",
"status": 1,
"url": "https://pelisplus.icu"
},
"PhimmoichillProvider": {
"language": "vi",
"name": "Phimmoichill",
"status": 1,
"url": "https://phimmoichill.net"
},
"PinoyHDXyzProvider": {
"language": "tl",
"name": "Pinoy-HD",
"status": 1,
"url": "https://www.pinoy-hd.xyz"
},
"PinoyMoviePediaProvider": {
"language": "tl",
"name": "Pinoy Moviepedia",
"status": 1,
"url": "https://pinoymoviepedia.ru"
},
"PinoyMoviesEsProvider": {
"language": "tl",
"name": "Pinoy Movies",
"status": 1,
"url": "https://pinoymovies.es"
},
"RebahinProvider": {
"language": "id",
"name": "Rebahin",
"status": 1,
"url": "http://104.237.198.194"
},
"SeriesflixProvider": {
"language": "es",
"name": "Seriesflix",
"status": 1,
"url": "https://seriesflix.video"
},
"SflixProProvider": {
"language": "en",
"name": "Sflix.pro",
"status": 1,
"url": "https://sflix.pro"
},
"SflixProvider": {
"language": "en",
"name": "Sflix.to",
"status": 1,
"url": "https://sflix.to"
},
"SoaptwoDayProvider": {
"language": "en",
"name": "Soap2Day",
"status": 0,
"url": "https://secretlink.xyz"
},
"SolarmovieProvider": {
"language": "en",
"name": "Solarmovie",
"status": 1,
"url": "https://solarmovie.pe"
},
"StreamingcommunityProvider": {
"language": "it",
"name": "Streamingcommunity",
"status": 1,
"url": "https://streamingcommunity.best"
},
"TantifilmProvider": {
"language": "it",
"name": "Tantifilm",
"status": 1,
"url": "https://tantifilm.autos"
},
"TenshiProvider": {
"language": "en",
"name": "Tenshi.moe",
"status": 1,
"url": "https://tenshi.moe"
},
"TheFlixToProvider": {
"language": "en",
"name": "TheFlix.to",
"status": 0,
"url": "https://theflix.to"
},
"TocanimeProvider": {
"language": "vi",
"name": "Tocanime",
"status": 1,
"url": "https://tocanime.co"
},
"TrailersTwoProvider": {
"language": "en",
"name": "Trailers.to",
"status": 1,
"url": "https://trailers.to"
},
"TwoEmbedProvider": {
"language": "en",
"name": "2Embed",
"status": 1,
"url": "https://www.2embed.to"
},
"UakinoProvider": {
"language": "uk",
"name": "Uakino",
"status": 1,
"url": "https://uakino.club"
},
"VMoveeProvider": {
"language": "en",
"name": "VMovee",
"status": 1,
"url": "https://www.vmovee.watch"
},
"VfFilmProvider": {
"language": "fr",
"name": "vf-film.me",
"status": 1,
"url": "https://vf-film.me"
},
"VfSerieProvider": {
"language": "fr",
"name": "vf-serie.org",
"status": 1,
"url": "https://vf-serie.org"
},
"VidEmbedProvider": {
"language": "en",
"name": "VidEmbed",
"status": 1,
"url": "https://membed.net"
},
"VidSrcProvider": {
"language": "en",
"name": "VidSrc",
"status": 1,
"url": "https://v2.vidsrc.me"
},
"WatchAsianProvider": {
"language": "en",
"name": "WatchAsian",
"status": 1,
"url": "https://watchasian.cx"
},
"WatchCartoonOnlineProvider": {
"language": "en",
"name": "WatchCartoonOnline",
"status": 1,
"url": "https://www.wcostream.com"
},
"WcoProvider": {
"language": "en",
"name": "WCO Stream",
"status": 1,
"url": "https://wcostream.cc"
},
"WcofunProvider": {
"language": "en",
"name": "WCO Fun",
"status": 1,
"url": "https://www.wcofun.com"
},
"XcineProvider": {
"language": "de",
"name": "Xcine",
"status": 1,
"url": "https://xcine.me"
},
"YomoviesProvider": {
"language": "hi",
"name": "Yomovies",
"status": 1,
"url": "https://yomovies.skin"
},
"ZoroProvider": {
"language": "en",
"name": "Zoro",
"status": 1,
"url": "https://zoro.to"
}
}

View file

@ -1,62 +0,0 @@
const count = document.getElementById("count")
const mainContainer = document.getElementById("siteList")
const regionNamesInEnglish = new Intl.DisplayNames(['en'], { type: 'language' });
fetch("providers.json" + "?v=" + Date.now())
.then(r => r.json())
.then(function (data) {
count.innerHTML = Object.keys(data).length;
for (var key in data) {
if (data.hasOwnProperty(key)) {
var value = data[key];
if (value.url == "NONE") { continue; }
var _status = value.status
var _lang = value.language
var node = document.createElement("tr");
node.classList.add("row");
var _a = document.createElement("a");
_a.setAttribute('href', value.url);
_a.innerHTML = value.name
var _langEl = document.createElement("sup");
var _langName = "Unknown";
try {
_langName = regionNamesInEnglish.of(_lang);
} catch (langerr) {
_langName = "Unknown";
console.log("Error on parsing language code => " + langerr);
}
_langEl.innerHTML = " " + _langName
_a.appendChild(_langEl);
var _statusText = "Unknown";
var _buttonText = "yellow";
switch (_status) {
case 0:
_statusText = "Unavailable";
_buttonText = "red";
break;
case 1:
_statusText = "Available";
_buttonText = "green";
break;
case 2:
_statusText = "Slow";
_buttonText = "yellow";
break;
case 3:
_statusText = "Beta";
_buttonText = "blue";
break;
}
_a.classList.add(_buttonText + "Button");
_a.classList.add("indicator");
_a.classList.add("button");
node.appendChild(_a);
mainContainer.appendChild(node);
}
}
})

View file

@ -1,49 +0,0 @@
body {
font-family: "Roboto", sans-serif;
background-color: #FFF;
}
.whiteText {
color : #FFF;
}
.button {
color : #000;
text-decoration: none;
}
.row {
padding: 0px 10px;
white-space: nowrap;
}
table {
border-spacing: 0.5rem;
}
.yellowButton::before {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-6.62744-5.3726-12-12-12-6.62744 0-12 5.37256-12 12 0 6.6274 5.37256 12 12 12zm0-17.5c.4141 0 .75.33582.75.75v4.5c0 .4142-.3359.75-.75.75s-.75-.3358-.75-.75v-4.5c0-.41418.3359-.75.75-.75zm.8242 9.5658c.0635-.0919.1118-.195.1416-.3054.0132-.0482.0225-.0979.0283-.1487.0039-.0366.0059-.074.0059-.1117 0-.5522-.4478-1-1-1s-1 .4478-1 1 .4478 1 1 1c.3423 0 .644-.172.8242-.4342z' fill='%23dbab09'/%3E%3C/svg%3e");
}
.blueButton::before {
filter: sepia(100%) saturate(300%) brightness(70%) hue-rotate(180deg);
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-6.62744-5.3726-12-12-12-6.62744 0-12 5.37256-12 12 0 6.6274 5.37256 12 12 12zm0-17.5c.4141 0 .75.33582.75.75v4.5c0 .4142-.3359.75-.75.75s-.75-.3358-.75-.75v-4.5c0-.41418.3359-.75.75-.75zm.8242 9.5658c.0635-.0919.1118-.195.1416-.3054.0132-.0482.0225-.0979.0283-.1487.0039-.0366.0059-.074.0059-.1117 0-.5522-.4478-1-1-1s-1 .4478-1 1 .4478 1 1 1c.3423 0 .644-.172.8242-.4342z' fill='%23dbab09'/%3E%3C/svg%3e");
}
.redButton::before {
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='m12 24c6.6274 0 12-5.3726 12-12 0-6.62744-5.3726-12-12-12-6.62744 0-12 5.37256-12 12 0 6.6274 5.37256 12 12 12zm0-17.5c.4141 0 .75.33582.75.75v4.5c0 .4142-.3359.75-.75.75s-.75-.3358-.75-.75v-4.5c0-.41418.3359-.75.75-.75zm.8242 9.5658c.0635-.0919.1118-.195.1416-.3054.0132-.0482.0225-.0979.0283-.1487.0039-.0366.0059-.074.0059-.1117 0-.5522-.4478-1-1-1s-1 .4478-1 1 .4478 1 1 1c.3423 0 .644-.172.8242-.4342z' fill='%23d73a49'/%3E%3C/svg%3e");
}
.greenButton::before{
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg width='15' height='15' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='m1 12c0-6.07513 4.92487-11 11-11 6.0751 0 11 4.92487 11 11 0 6.0751-4.9249 11-11 11-6.07513 0-11-4.9249-11-11zm16.2803-2.71967c.2929-.29289.2929-.76777 0-1.06066s-.7677-.29289-1.0606 0l-5.9697 5.96963-2.46967-2.4696c-.29289-.2929-.76777-.2929-1.06066 0s-.29289.7677 0 1.0606l3 3c.29293.2929.76773.2929 1.06063 0z' fill='%2328a745'/%3E%3C/svg%3e");ontent: '';
}
.indicator::before {
display: inline-block;
width: 24px;
height: 24px;
content: "";
vertical-align: text-bottom;
background-size: 100% 100%;
background-repeat: no-repeat;
background-position: center center;
margin-right:10px;
}