Merge remote-tracking branch 'origin/develop' into shigusegubu
* origin/develop: (129 commits) Uploaders.S3: Replace unsafe characters in object key update pleroma frontend test: add smoketests for the scrubbing policies html: twittertext: add missing catchall scrub function twitter api: add no_rich_text option to userview for account prefs test: add tests for new User.html_filter_policy() mastodon api: formatting twitter api: add support for disabling rich text mastodon api: add support for user-supplied html policy twitter api: add support for user-specified html policy user: add User.html_filter_policy() html: default to using normal scrub policy if provided scrub policy is nil mix: remove fix_ap_users task, now obsolete test: add test proving that users are refreshed when stale user: implement dynamic refresh of profiles (gets rid of need for fix_ap_users task) Update mastodon frontend [Pleroma.Web.MastodonAPI.MastodonAPIController]: Bump mastodon_api_level to 2.5.0 [Pleroma.Web.MastodonAPI.MastodonAPIController]: Remove unused variables [Pleroma.Web.Router]: Fake /api/v1/endorsements [Pleroma.Web.MastodonAPI.AccountView]: relationship.json: fake endorsed value (false) ...
|
|
@ -11,10 +11,16 @@ config :pleroma, ecto_repos: [Pleroma.Repo]
|
||||||
config :pleroma, Pleroma.Repo, types: Pleroma.PostgresTypes
|
config :pleroma, Pleroma.Repo, types: Pleroma.PostgresTypes
|
||||||
|
|
||||||
config :pleroma, Pleroma.Upload,
|
config :pleroma, Pleroma.Upload,
|
||||||
|
uploader: Pleroma.Uploaders.Local,
|
||||||
|
strip_exif: false
|
||||||
|
|
||||||
|
config :pleroma, Pleroma.Uploaders.Local,
|
||||||
uploads: "uploads",
|
uploads: "uploads",
|
||||||
strip_exif: false,
|
uploads_url: "{{base_url}}/media/{{file}}"
|
||||||
use_s3: false,
|
|
||||||
s3_bucket: nil
|
config :pleroma, Pleroma.Uploaders.S3,
|
||||||
|
bucket: nil,
|
||||||
|
public_endpoint: "https://s3.amazonaws.com"
|
||||||
|
|
||||||
config :pleroma, :emoji, shortcode_globs: ["/emoji/custom/**/*.png"]
|
config :pleroma, :emoji, shortcode_globs: ["/emoji/custom/**/*.png"]
|
||||||
|
|
||||||
|
|
@ -26,7 +32,8 @@ config :pleroma, Pleroma.Web.Endpoint,
|
||||||
protocol: "https",
|
protocol: "https",
|
||||||
secret_key_base: "aK4Abxf29xU9TTDKre9coZPUgevcVCFQJe/5xP/7Lt4BEif6idBIbjupVbOrbKxl",
|
secret_key_base: "aK4Abxf29xU9TTDKre9coZPUgevcVCFQJe/5xP/7Lt4BEif6idBIbjupVbOrbKxl",
|
||||||
render_errors: [view: Pleroma.Web.ErrorView, accepts: ~w(json)],
|
render_errors: [view: Pleroma.Web.ErrorView, accepts: ~w(json)],
|
||||||
pubsub: [name: Pleroma.PubSub, adapter: Phoenix.PubSub.PG2]
|
pubsub: [name: Pleroma.PubSub, adapter: Phoenix.PubSub.PG2],
|
||||||
|
secure_cookie_flag: true
|
||||||
|
|
||||||
# Configures Elixir's Logger
|
# Configures Elixir's Logger
|
||||||
config :logger, :console,
|
config :logger, :console,
|
||||||
|
|
@ -68,10 +75,24 @@ config :pleroma, :instance,
|
||||||
public: true,
|
public: true,
|
||||||
quarantined_instances: ["pleroma.rareome.ga"]
|
quarantined_instances: ["pleroma.rareome.ga"]
|
||||||
|
|
||||||
|
config :pleroma, :markup,
|
||||||
|
# XXX - unfortunately, inline images must be enabled by default right now, because
|
||||||
|
# of custom emoji. Issue #275 discusses defanging that somehow.
|
||||||
|
allow_inline_images: true,
|
||||||
|
allow_headings: false,
|
||||||
|
allow_tables: false,
|
||||||
|
allow_fonts: false,
|
||||||
|
scrub_policy: [
|
||||||
|
Pleroma.HTML.Transform.MediaProxy,
|
||||||
|
Pleroma.HTML.Scrubber.Default
|
||||||
|
]
|
||||||
|
|
||||||
config :pleroma, :fe,
|
config :pleroma, :fe,
|
||||||
theme: "sigsegv2",
|
theme: "sigsegv2",
|
||||||
logo: "/static/logo.svg",
|
logo: "/static/logo.svg",
|
||||||
background: "/static/sigsegv_s.png",
|
background: "/static/sigsegv_s.png",
|
||||||
|
logo_mask: true,
|
||||||
|
logo_margin: "0.1em",
|
||||||
redirect_root_no_login: "/main/all",
|
redirect_root_no_login: "/main/all",
|
||||||
redirect_root_login: "/main/friends",
|
redirect_root_login: "/main/friends",
|
||||||
show_instance_panel: true,
|
show_instance_panel: true,
|
||||||
|
|
@ -85,6 +106,8 @@ config :pleroma, :activitypub,
|
||||||
|
|
||||||
config :pleroma, :user, deny_follow_blocked: true
|
config :pleroma, :user, deny_follow_blocked: true
|
||||||
|
|
||||||
|
config :pleroma, :mrf_normalize_markup, scrub_policy: Pleroma.HTML.Scrubber.Default
|
||||||
|
|
||||||
config :pleroma, :mrf_rejectnonpublic,
|
config :pleroma, :mrf_rejectnonpublic,
|
||||||
allow_followersonly: false,
|
allow_followersonly: false,
|
||||||
allow_direct: false
|
allow_direct: false
|
||||||
|
|
@ -118,6 +141,7 @@ config :pleroma, :suggestions,
|
||||||
third_party_engine:
|
third_party_engine:
|
||||||
"http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}",
|
"http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-suggestions-api.cgi?{{host}}+{{user}}",
|
||||||
timeout: 300_000,
|
timeout: 300_000,
|
||||||
|
limit: 23,
|
||||||
web: "https://vinayaka.distsn.org/?{{host}}+{{user}}"
|
web: "https://vinayaka.distsn.org/?{{host}}+{{user}}"
|
||||||
|
|
||||||
# Import environment specific config. This must remain at the bottom
|
# Import environment specific config. This must remain at the bottom
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ social.domain.tld {
|
||||||
Referrer-Policy "same-origin"
|
Referrer-Policy "same-origin"
|
||||||
Strict-Transport-Security "max-age=31536000; includeSubDomains;"
|
Strict-Transport-Security "max-age=31536000; includeSubDomains;"
|
||||||
Expect-CT "enforce, max-age=2592000"
|
Expect-CT "enforce, max-age=2592000"
|
||||||
|
Content-Security-Policy "default-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' data: https:; media-src 'self' https:; style-src 'self' 'unsafe-inline'; font-src 'self'; script-src 'self'; connect-src 'self' wss://social.domain.tld; upgrade-insecure-requests;"
|
||||||
}
|
}
|
||||||
|
|
||||||
# If you do not want remote frontends to be able to access your Pleroma backend server, remove these lines.
|
# If you do not want remote frontends to be able to access your Pleroma backend server, remove these lines.
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,40 @@
|
||||||
|
#Example configuration for when Apache httpd and Pleroma are on the same host.
|
||||||
|
#Needed modules: headers proxy proxy_http proxy_wstunnel rewrite ssl
|
||||||
|
#This assumes a Debian style Apache config. Put this in /etc/apache2/sites-available
|
||||||
|
#Install your TLS certificate, possibly using Let's Encrypt.
|
||||||
|
#Replace 'pleroma.example.com' with your instance's domain wherever it appears
|
||||||
|
|
||||||
|
ServerName pleroma.example.com
|
||||||
|
ServerTokens Prod
|
||||||
|
|
||||||
|
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||||
|
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||||
|
|
||||||
<VirtualHost *:80>
|
<VirtualHost *:80>
|
||||||
#Example configuration for when Apache httpd and Pleroma are on the same host.
|
Redirect permanent / https://pleroma.example.com
|
||||||
#Needed modules: proxy proxy_http proxy_wstunnel rewrite
|
</VirtualHost>
|
||||||
#This assumes a Debian style Apache config. Put this in /etc/apache2/sites-available
|
|
||||||
#Doesn't include SSL, just run certbot and let it take care of that.
|
|
||||||
|
|
||||||
|
<VirtualHost *:443>
|
||||||
|
SSLEngine on
|
||||||
|
SSLCertificateFile /etc/letsencrypt/live/pleroma.example.com/cert.pem
|
||||||
|
SSLCertificateKeyFile /etc/letsencrypt/live/pleroma.example.com/privkey.pem
|
||||||
|
SSLCertificateChainFile /etc/letsencrypt/live/pleroma.example.com/fullchain.pem
|
||||||
|
|
||||||
#Change this:
|
# Mozilla modern configuration, tweak to your needs
|
||||||
ServerName pleroma.example.com
|
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
|
||||||
|
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
|
||||||
|
SSLHonorCipherOrder on
|
||||||
|
SSLCompression off
|
||||||
|
SSLSessionTickets off
|
||||||
|
|
||||||
|
Header always set X-Xss-Protection "1; mode=block"
|
||||||
|
Header always set X-Frame-Options "DENY"
|
||||||
|
Header always set X-Content-Type-Options "nosniff"
|
||||||
|
Header always set Referrer-Policy same-origin
|
||||||
|
Header always set Content-Security-Policy "default-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' data: https:; media-src 'self' https:; style-src 'self' 'unsafe-inline'; font-src 'self'; script-src 'self'; connect-src 'self' wss://pleroma.example.tld; upgrade-insecure-requests;"
|
||||||
|
|
||||||
|
# Uncomment this only after you get HTTPS working.
|
||||||
|
# Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
|
||||||
|
|
||||||
RewriteEngine On
|
RewriteEngine On
|
||||||
RewriteCond %{HTTP:Connection} Upgrade [NC]
|
RewriteCond %{HTTP:Connection} Upgrade [NC]
|
||||||
|
|
@ -17,10 +45,12 @@
|
||||||
ProxyPass / http://localhost:4000/
|
ProxyPass / http://localhost:4000/
|
||||||
ProxyPassReverse / http://localhost:4000/
|
ProxyPassReverse / http://localhost:4000/
|
||||||
|
|
||||||
#Change this too:
|
|
||||||
RequestHeader set Host "pleroma.example.com"
|
RequestHeader set Host "pleroma.example.com"
|
||||||
ProxyPreserveHost On
|
ProxyPreserveHost On
|
||||||
|
|
||||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
|
||||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
|
||||||
</VirtualHost>
|
</VirtualHost>
|
||||||
|
|
||||||
|
# OCSP Stapling, only in httpd 2.3.3 and later
|
||||||
|
SSLUseStapling on
|
||||||
|
SSLStaplingResponderTimeout 5
|
||||||
|
SSLStaplingReturnResponderErrors off
|
||||||
|
SSLStaplingCache shmcb:/var/run/ocsp(128000)
|
||||||
|
|
@ -71,16 +71,16 @@ server {
|
||||||
}
|
}
|
||||||
# stop removing lines here.
|
# stop removing lines here.
|
||||||
|
|
||||||
add_header X-XSS-Protection "1; mode=block";
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
add_header X-Permitted-Cross-Domain-Policies none;
|
add_header X-Permitted-Cross-Domain-Policies "none" always;
|
||||||
add_header X-Frame-Options DENY;
|
add_header X-Frame-Options "DENY" always;
|
||||||
add_header X-Content-Type-Options nosniff;
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
add_header Referrer-Policy same-origin;
|
add_header Referrer-Policy "same-origin" always;
|
||||||
add_header X-Download-Options noopen;
|
add_header X-Download-Options "noopen" always;
|
||||||
add_header Content-Security-Policy "default-src 'none'; base-uri 'self'; form-action 'self'; img-src 'self' data: https:; media-src 'self' https:; style-src 'self' 'unsafe-inline'; font-src 'self'; script-src 'self'; connect-src 'self' wss://example.tld; upgrade-insecure-requests;";
|
add_header Content-Security-Policy "default-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' data: https:; media-src 'self' https:; style-src 'self' 'unsafe-inline'; font-src 'self'; script-src 'self'; connect-src 'self' wss://example.tld; upgrade-insecure-requests;" always;
|
||||||
|
|
||||||
# Uncomment this only after you get HTTPS working.
|
# Uncomment this only after you get HTTPS working.
|
||||||
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
|
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
|
||||||
|
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
|
|
||||||
|
|
@ -119,3 +119,13 @@ sub vcl_pipe {
|
||||||
set bereq.http.connection = req.http.connection;
|
set bereq.http.connection = req.http.connection;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub vcl_deliver {
|
||||||
|
set resp.http.X-Frame-Options = "DENY";
|
||||||
|
set resp.http.X-XSS-Protection = "1; mode=block";
|
||||||
|
set resp.http.X-Content-Type-Options = "nosniff";
|
||||||
|
set resp.http.Referrer-Policy = "same-origin";
|
||||||
|
set resp.http.Content-Security-Policy = "default-src 'none'; base-uri 'self'; form-action 'self'; frame-ancestors 'none'; img-src 'self' data: https:; media-src 'self' https:; style-src 'self' 'unsafe-inline'; font-src 'self'; script-src 'self'; connect-src 'self' wss://" + req.http.host + "; upgrade-insecure-requests;";
|
||||||
|
# Uncomment this only after you get HTTPS working.
|
||||||
|
# set resp.http.Strict-Transport-Security= "max-age=31536000; includeSubDomains";
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
||||||
defmodule Mix.Tasks.FixApUsers do
|
|
||||||
use Mix.Task
|
|
||||||
import Ecto.Query
|
|
||||||
alias Pleroma.{Repo, User}
|
|
||||||
|
|
||||||
@shortdoc "Grab all ap users again"
|
|
||||||
def run([]) do
|
|
||||||
Mix.Task.run("app.start")
|
|
||||||
|
|
||||||
q =
|
|
||||||
from(
|
|
||||||
u in User,
|
|
||||||
where: fragment("? @> ?", u.info, ^%{"ap_enabled" => true}),
|
|
||||||
where: u.local == false
|
|
||||||
)
|
|
||||||
|
|
||||||
users = Repo.all(q)
|
|
||||||
|
|
||||||
Enum.each(users, fn user ->
|
|
||||||
try do
|
|
||||||
IO.puts("Fetching #{user.nickname}")
|
|
||||||
Pleroma.Web.ActivityPub.Transmogrifier.upgrade_user_from_ap_id(user.ap_id, false)
|
|
||||||
rescue
|
|
||||||
e -> IO.inspect(e)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
@ -29,8 +29,7 @@ config :pleroma, Pleroma.Repo,
|
||||||
# The public S3 endpoint is different depending on region and provider,
|
# The public S3 endpoint is different depending on region and provider,
|
||||||
# consult your S3 provider's documentation for details on what to use.
|
# consult your S3 provider's documentation for details on what to use.
|
||||||
#
|
#
|
||||||
# config :pleroma, Pleroma.Upload,
|
# config :pleroma, Pleroma.Uploaders.S3,
|
||||||
# use_s3: true,
|
|
||||||
# bucket: "some-bucket",
|
# bucket: "some-bucket",
|
||||||
# public_endpoint: "https://s3.amazonaws.com"
|
# public_endpoint: "https://s3.amazonaws.com"
|
||||||
#
|
#
|
||||||
|
|
@ -44,3 +43,21 @@ config :pleroma, Pleroma.Repo,
|
||||||
# For using third-party S3 clones like wasabi, also do:
|
# For using third-party S3 clones like wasabi, also do:
|
||||||
# config :ex_aws, :s3,
|
# config :ex_aws, :s3,
|
||||||
# host: "s3.wasabisys.com"
|
# host: "s3.wasabisys.com"
|
||||||
|
|
||||||
|
|
||||||
|
# Configure Openstack Swift support if desired.
|
||||||
|
#
|
||||||
|
# Many openstack deployments are different, so config is left very open with
|
||||||
|
# no assumptions made on which provider you're using. This should allow very
|
||||||
|
# wide support without needing separate handlers for OVH, Rackspace, etc.
|
||||||
|
#
|
||||||
|
# config :pleroma, Pleroma.Uploaders.Swift,
|
||||||
|
# container: "some-container",
|
||||||
|
# username: "api-username-yyyy",
|
||||||
|
# password: "api-key-xxxx",
|
||||||
|
# tenant_id: "<openstack-project/tenant-id>",
|
||||||
|
# auth_url: "https://keystone-endpoint.provider.com",
|
||||||
|
# storage_url: "https://swift-endpoint.prodider.com/v1/AUTH_<tenant>/<container>",
|
||||||
|
# object_url: "https://cdn-endpoint.provider.com/<container>"
|
||||||
|
#
|
||||||
|
|
||||||
|
|
|
||||||
62
lib/pleroma/filter.ex
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
defmodule Pleroma.Filter do
|
||||||
|
use Ecto.Schema
|
||||||
|
import Ecto.{Changeset, Query}
|
||||||
|
alias Pleroma.{User, Repo, Activity}
|
||||||
|
|
||||||
|
schema "filters" do
|
||||||
|
belongs_to(:user, Pleroma.User)
|
||||||
|
field(:filter_id, :integer)
|
||||||
|
field(:hide, :boolean, default: false)
|
||||||
|
field(:whole_word, :boolean, default: true)
|
||||||
|
field(:phrase, :string)
|
||||||
|
field(:context, {:array, :string})
|
||||||
|
field(:expires_at, :utc_datetime)
|
||||||
|
|
||||||
|
timestamps()
|
||||||
|
end
|
||||||
|
|
||||||
|
def get(id, %{id: user_id} = _user) do
|
||||||
|
query =
|
||||||
|
from(
|
||||||
|
f in Pleroma.Filter,
|
||||||
|
where: f.filter_id == ^id,
|
||||||
|
where: f.user_id == ^user_id
|
||||||
|
)
|
||||||
|
|
||||||
|
Repo.one(query)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_filters(%Pleroma.User{id: user_id} = user) do
|
||||||
|
query =
|
||||||
|
from(
|
||||||
|
f in Pleroma.Filter,
|
||||||
|
where: f.user_id == ^user_id
|
||||||
|
)
|
||||||
|
|
||||||
|
Repo.all(query)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create(%Pleroma.Filter{} = filter) do
|
||||||
|
Repo.insert(filter)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete(%Pleroma.Filter{id: filter_key} = filter) when is_number(filter_key) do
|
||||||
|
Repo.delete(filter)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete(%Pleroma.Filter{id: filter_key} = filter) when is_nil(filter_key) do
|
||||||
|
%Pleroma.Filter{id: id} = get(filter.filter_id, %{id: filter.user_id})
|
||||||
|
|
||||||
|
filter
|
||||||
|
|> Map.put(:id, id)
|
||||||
|
|> Repo.delete()
|
||||||
|
end
|
||||||
|
|
||||||
|
def update(%Pleroma.Filter{} = filter) do
|
||||||
|
destination = Map.from_struct(filter)
|
||||||
|
|
||||||
|
Pleroma.Filter.get(filter.filter_id, %{id: filter.user_id})
|
||||||
|
|> cast(destination, [:phrase, :context, :hide, :expires_at, :whole_word])
|
||||||
|
|> Repo.update()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
defmodule Pleroma.Formatter do
|
defmodule Pleroma.Formatter do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Web.MediaProxy
|
alias Pleroma.Web.MediaProxy
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
@tag_regex ~r/\#\w+/u
|
@tag_regex ~r/\#\w+/u
|
||||||
def parse_tags(text, data \\ %{}) do
|
def parse_tags(text, data \\ %{}) do
|
||||||
|
|
@ -144,8 +145,8 @@ defmodule Pleroma.Formatter do
|
||||||
|
|
||||||
def emojify(text, emoji) do
|
def emojify(text, emoji) do
|
||||||
Enum.reduce(emoji, text, fn {emoji, file}, text ->
|
Enum.reduce(emoji, text, fn {emoji, file}, text ->
|
||||||
emoji = HtmlSanitizeEx.strip_tags(emoji)
|
emoji = HTML.strip_tags(emoji)
|
||||||
file = HtmlSanitizeEx.strip_tags(file)
|
file = HTML.strip_tags(file)
|
||||||
|
|
||||||
String.replace(
|
String.replace(
|
||||||
text,
|
text,
|
||||||
|
|
@ -154,13 +155,16 @@ defmodule Pleroma.Formatter do
|
||||||
MediaProxy.url(file)
|
MediaProxy.url(file)
|
||||||
}' />"
|
}' />"
|
||||||
)
|
)
|
||||||
|
|> HTML.filter_tags()
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_emoji(text) do
|
def get_emoji(text) when is_binary(text) do
|
||||||
Enum.filter(@emoji, fn {emoji, _} -> String.contains?(text, ":#{emoji}:") end)
|
Enum.filter(@emoji, fn {emoji, _} -> String.contains?(text, ":#{emoji}:") end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_emoji(_), do: []
|
||||||
|
|
||||||
def get_custom_emoji() do
|
def get_custom_emoji() do
|
||||||
@emoji
|
@emoji
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ defmodule Pleroma.Gopher.Server.ProtocolHandler do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
@instance Application.get_env(:pleroma, :instance)
|
@instance Application.get_env(:pleroma, :instance)
|
||||||
@gopher Application.get_env(:pleroma, :gopher)
|
@gopher Application.get_env(:pleroma, :gopher)
|
||||||
|
|
@ -78,11 +79,7 @@ defmodule Pleroma.Gopher.Server.ProtocolHandler do
|
||||||
link("Post ##{activity.id} by #{user.nickname}", "/notices/#{activity.id}") <>
|
link("Post ##{activity.id} by #{user.nickname}", "/notices/#{activity.id}") <>
|
||||||
info("#{like_count} likes, #{announcement_count} repeats") <>
|
info("#{like_count} likes, #{announcement_count} repeats") <>
|
||||||
"i\tfake\t(NULL)\t0\r\n" <>
|
"i\tfake\t(NULL)\t0\r\n" <>
|
||||||
info(
|
info(HTML.strip_tags(String.replace(activity.data["object"]["content"], "<br>", "\r")))
|
||||||
HtmlSanitizeEx.strip_tags(
|
|
||||||
String.replace(activity.data["object"]["content"], "<br>", "\r")
|
|
||||||
)
|
|
||||||
)
|
|
||||||
end)
|
end)
|
||||||
|> Enum.join("i\tfake\t(NULL)\t0\r\n")
|
|> Enum.join("i\tfake\t(NULL)\t0\r\n")
|
||||||
end
|
end
|
||||||
|
|
|
||||||
179
lib/pleroma/html.ex
Normal file
|
|
@ -0,0 +1,179 @@
|
||||||
|
defmodule Pleroma.HTML do
|
||||||
|
alias HtmlSanitizeEx.Scrubber
|
||||||
|
|
||||||
|
@markup Application.get_env(:pleroma, :markup)
|
||||||
|
|
||||||
|
defp get_scrubbers(scrubber) when is_atom(scrubber), do: [scrubber]
|
||||||
|
defp get_scrubbers(scrubbers) when is_list(scrubbers), do: scrubbers
|
||||||
|
defp get_scrubbers(_), do: [Pleroma.HTML.Scrubber.Default]
|
||||||
|
|
||||||
|
def get_scrubbers() do
|
||||||
|
Keyword.get(@markup, :scrub_policy)
|
||||||
|
|> get_scrubbers
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter_tags(html, nil) do
|
||||||
|
get_scrubbers()
|
||||||
|
|> Enum.reduce(html, fn scrubber, html ->
|
||||||
|
filter_tags(html, scrubber)
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter_tags(html, scrubber) do
|
||||||
|
html |> Scrubber.scrub(scrubber)
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter_tags(html), do: filter_tags(html, nil)
|
||||||
|
|
||||||
|
def strip_tags(html) do
|
||||||
|
html |> Scrubber.scrub(Scrubber.StripTags)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defmodule Pleroma.HTML.Scrubber.TwitterText do
|
||||||
|
@moduledoc """
|
||||||
|
An HTML scrubbing policy which limits to twitter-style text. Only
|
||||||
|
paragraphs, breaks and links are allowed through the filter.
|
||||||
|
"""
|
||||||
|
|
||||||
|
require HtmlSanitizeEx.Scrubber.Meta
|
||||||
|
alias HtmlSanitizeEx.Scrubber.Meta
|
||||||
|
|
||||||
|
@valid_schemes ["http", "https"]
|
||||||
|
|
||||||
|
Meta.remove_cdata_sections_before_scrub()
|
||||||
|
Meta.strip_comments()
|
||||||
|
|
||||||
|
# links
|
||||||
|
Meta.allow_tag_with_uri_attributes("a", ["href"], @valid_schemes)
|
||||||
|
Meta.allow_tag_with_these_attributes("a", ["name", "title"])
|
||||||
|
|
||||||
|
# paragraphs and linebreaks
|
||||||
|
Meta.allow_tag_with_these_attributes("br", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("p", [])
|
||||||
|
|
||||||
|
# microformats
|
||||||
|
Meta.allow_tag_with_these_attributes("span", [])
|
||||||
|
|
||||||
|
# allow inline images for custom emoji
|
||||||
|
@markup Application.get_env(:pleroma, :markup)
|
||||||
|
@allow_inline_images Keyword.get(@markup, :allow_inline_images)
|
||||||
|
|
||||||
|
if @allow_inline_images do
|
||||||
|
Meta.allow_tag_with_uri_attributes("img", ["src"], @valid_schemes)
|
||||||
|
|
||||||
|
Meta.allow_tag_with_these_attributes("img", [
|
||||||
|
"width",
|
||||||
|
"height",
|
||||||
|
"title",
|
||||||
|
"alt"
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
Meta.strip_everything_not_covered()
|
||||||
|
end
|
||||||
|
|
||||||
|
defmodule Pleroma.HTML.Scrubber.Default do
|
||||||
|
@doc "The default HTML scrubbing policy: no "
|
||||||
|
|
||||||
|
require HtmlSanitizeEx.Scrubber.Meta
|
||||||
|
alias HtmlSanitizeEx.Scrubber.Meta
|
||||||
|
|
||||||
|
@valid_schemes ["http", "https"]
|
||||||
|
|
||||||
|
Meta.remove_cdata_sections_before_scrub()
|
||||||
|
Meta.strip_comments()
|
||||||
|
|
||||||
|
Meta.allow_tag_with_uri_attributes("a", ["href"], @valid_schemes)
|
||||||
|
Meta.allow_tag_with_these_attributes("a", ["name", "title"])
|
||||||
|
|
||||||
|
Meta.allow_tag_with_these_attributes("b", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("blockquote", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("br", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("code", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("del", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("em", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("i", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("li", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("ol", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("p", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("pre", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("span", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("strong", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("u", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("ul", [])
|
||||||
|
|
||||||
|
@markup Application.get_env(:pleroma, :markup)
|
||||||
|
@allow_inline_images Keyword.get(@markup, :allow_inline_images)
|
||||||
|
|
||||||
|
if @allow_inline_images do
|
||||||
|
Meta.allow_tag_with_uri_attributes("img", ["src"], @valid_schemes)
|
||||||
|
|
||||||
|
Meta.allow_tag_with_these_attributes("img", [
|
||||||
|
"width",
|
||||||
|
"height",
|
||||||
|
"title",
|
||||||
|
"alt"
|
||||||
|
])
|
||||||
|
end
|
||||||
|
|
||||||
|
@allow_tables Keyword.get(@markup, :allow_tables)
|
||||||
|
|
||||||
|
if @allow_tables do
|
||||||
|
Meta.allow_tag_with_these_attributes("table", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("tbody", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("td", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("th", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("thead", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("tr", [])
|
||||||
|
end
|
||||||
|
|
||||||
|
@allow_headings Keyword.get(@markup, :allow_headings)
|
||||||
|
|
||||||
|
if @allow_headings do
|
||||||
|
Meta.allow_tag_with_these_attributes("h1", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("h2", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("h3", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("h4", [])
|
||||||
|
Meta.allow_tag_with_these_attributes("h5", [])
|
||||||
|
end
|
||||||
|
|
||||||
|
@allow_fonts Keyword.get(@markup, :allow_fonts)
|
||||||
|
|
||||||
|
if @allow_fonts do
|
||||||
|
Meta.allow_tag_with_these_attributes("font", ["face"])
|
||||||
|
end
|
||||||
|
|
||||||
|
Meta.strip_everything_not_covered()
|
||||||
|
end
|
||||||
|
|
||||||
|
defmodule Pleroma.HTML.Transform.MediaProxy do
|
||||||
|
@moduledoc "Transforms inline image URIs to use MediaProxy."
|
||||||
|
|
||||||
|
alias Pleroma.Web.MediaProxy
|
||||||
|
|
||||||
|
def before_scrub(html), do: html
|
||||||
|
|
||||||
|
def scrub_attribute("img", {"src", "http" <> target}) do
|
||||||
|
media_url =
|
||||||
|
("http" <> target)
|
||||||
|
|> MediaProxy.url()
|
||||||
|
|
||||||
|
{"src", media_url}
|
||||||
|
end
|
||||||
|
|
||||||
|
def scrub_attribute(tag, attribute), do: attribute
|
||||||
|
|
||||||
|
def scrub({"img", attributes, children}) do
|
||||||
|
attributes =
|
||||||
|
attributes
|
||||||
|
|> Enum.map(fn attr -> scrub_attribute("img", attr) end)
|
||||||
|
|> Enum.reject(&is_nil(&1))
|
||||||
|
|
||||||
|
{"img", attributes, children}
|
||||||
|
end
|
||||||
|
|
||||||
|
def scrub({tag, attributes, children}), do: {tag, attributes, children}
|
||||||
|
def scrub({tag, children}), do: children
|
||||||
|
def scrub(text), do: text
|
||||||
|
end
|
||||||
|
|
@ -9,54 +9,34 @@ defmodule Pleroma.Plugs.AuthenticationPlug do
|
||||||
|
|
||||||
def call(%{assigns: %{user: %User{}}} = conn, _), do: conn
|
def call(%{assigns: %{user: %User{}}} = conn, _), do: conn
|
||||||
|
|
||||||
def call(conn, opts) do
|
def call(
|
||||||
with {:ok, username, password} <- decode_header(conn),
|
%{
|
||||||
{:ok, user} <- opts[:fetcher].(username),
|
assigns: %{
|
||||||
false <- !!user.info["deactivated"],
|
auth_user: %{password_hash: password_hash} = auth_user,
|
||||||
saved_user_id <- get_session(conn, :user_id),
|
auth_credentials: %{password: password}
|
||||||
{:ok, verified_user} <- verify(user, password, saved_user_id) do
|
}
|
||||||
|
} = conn,
|
||||||
|
_
|
||||||
|
) do
|
||||||
|
if Pbkdf2.checkpw(password, password_hash) do
|
||||||
conn
|
conn
|
||||||
|> assign(:user, verified_user)
|
|> assign(:user, auth_user)
|
||||||
|> put_session(:user_id, verified_user.id)
|
|
||||||
else
|
else
|
||||||
_ -> conn |> halt_or_continue(opts)
|
conn
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Short-circuit if we have a cookie with the id for the given user.
|
def call(
|
||||||
defp verify(%{id: id} = user, _password, id) do
|
%{
|
||||||
{:ok, user}
|
assigns: %{
|
||||||
end
|
auth_credentials: %{password: password}
|
||||||
|
}
|
||||||
defp verify(nil, _password, _user_id) do
|
} = conn,
|
||||||
|
_
|
||||||
|
) do
|
||||||
Pbkdf2.dummy_checkpw()
|
Pbkdf2.dummy_checkpw()
|
||||||
:error
|
|
||||||
end
|
|
||||||
|
|
||||||
defp verify(user, password, _user_id) do
|
|
||||||
if Pbkdf2.checkpw(password, user.password_hash) do
|
|
||||||
{:ok, user}
|
|
||||||
else
|
|
||||||
:error
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp decode_header(conn) do
|
|
||||||
with ["Basic " <> header] <- get_req_header(conn, "authorization"),
|
|
||||||
{:ok, userinfo} <- Base.decode64(header),
|
|
||||||
[username, password] <- String.split(userinfo, ":", parts: 2) do
|
|
||||||
{:ok, username, password}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp halt_or_continue(conn, %{optional: true}) do
|
|
||||||
conn |> assign(:user, nil)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp halt_or_continue(conn, _) do
|
|
||||||
conn
|
conn
|
||||||
|> put_resp_content_type("application/json")
|
|
||||||
|> send_resp(403, Jason.encode!(%{error: "Invalid credentials."}))
|
|
||||||
|> halt
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def call(conn, _), do: conn
|
||||||
end
|
end
|
||||||
|
|
|
||||||
21
lib/pleroma/plugs/basic_auth_decoder_plug.ex
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
defmodule Pleroma.Plugs.BasicAuthDecoderPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, opts) do
|
||||||
|
with ["Basic " <> header] <- get_req_header(conn, "authorization"),
|
||||||
|
{:ok, userinfo} <- Base.decode64(header),
|
||||||
|
[username, password] <- String.split(userinfo, ":", parts: 2) do
|
||||||
|
conn
|
||||||
|
|> assign(:auth_credentials, %{
|
||||||
|
username: username,
|
||||||
|
password: password
|
||||||
|
})
|
||||||
|
else
|
||||||
|
_ -> conn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
19
lib/pleroma/plugs/ensure_authenticated_plug.ex
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
defmodule Pleroma.Plugs.EnsureAuthenticatedPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(%{assigns: %{user: %User{}}} = conn, _) do
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, _) do
|
||||||
|
conn
|
||||||
|
|> put_resp_content_type("application/json")
|
||||||
|
|> send_resp(403, Jason.encode!(%{error: "Invalid credentials."}))
|
||||||
|
|> halt
|
||||||
|
end
|
||||||
|
end
|
||||||
14
lib/pleroma/plugs/ensure_user_key_plug.ex
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
defmodule Pleroma.Plugs.EnsureUserKeyPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
|
||||||
|
def init(opts) do
|
||||||
|
opts
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(%{assigns: %{user: _}} = conn, _), do: conn
|
||||||
|
|
||||||
|
def call(conn, _) do
|
||||||
|
conn
|
||||||
|
|> assign(:user, nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
35
lib/pleroma/plugs/legacy_authentication_plug.ex
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
defmodule Pleroma.Plugs.LegacyAuthenticationPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(%{assigns: %{user: %User{}}} = conn, _), do: conn
|
||||||
|
|
||||||
|
def call(
|
||||||
|
%{
|
||||||
|
assigns: %{
|
||||||
|
auth_user: %{password_hash: "$6$" <> _ = password_hash} = auth_user,
|
||||||
|
auth_credentials: %{password: password}
|
||||||
|
}
|
||||||
|
} = conn,
|
||||||
|
_
|
||||||
|
) do
|
||||||
|
with ^password_hash <- :crypt.crypt(password, password_hash),
|
||||||
|
{:ok, user} <-
|
||||||
|
User.reset_password(auth_user, %{password: password, password_confirmation: password}) do
|
||||||
|
conn
|
||||||
|
|> assign(:auth_user, user)
|
||||||
|
|> assign(:user, user)
|
||||||
|
else
|
||||||
|
_ ->
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, _) do
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
end
|
||||||
18
lib/pleroma/plugs/session_authentication_plug.ex
Normal file
|
|
@ -0,0 +1,18 @@
|
||||||
|
defmodule Pleroma.Plugs.SessionAuthenticationPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, _) do
|
||||||
|
with saved_user_id <- get_session(conn, :user_id),
|
||||||
|
%{auth_user: %{id: ^saved_user_id}} <- conn.assigns do
|
||||||
|
conn
|
||||||
|
|> assign(:user, conn.assigns.auth_user)
|
||||||
|
else
|
||||||
|
_ -> conn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
15
lib/pleroma/plugs/set_user_session_id_plug.ex
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
defmodule Pleroma.Plugs.SetUserSessionIdPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
def init(opts) do
|
||||||
|
opts
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(%{assigns: %{user: %User{id: id}}} = conn, _) do
|
||||||
|
conn
|
||||||
|
|> put_session(:user_id, id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, _), do: conn
|
||||||
|
end
|
||||||
17
lib/pleroma/plugs/user_enabled_plug.ex
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
defmodule Pleroma.Plugs.UserEnabledPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(%{assigns: %{user: %User{info: %{"deactivated" => true}}}} = conn, _) do
|
||||||
|
conn
|
||||||
|
|> assign(:user, nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, _) do
|
||||||
|
conn
|
||||||
|
end
|
||||||
|
end
|
||||||
34
lib/pleroma/plugs/user_fetcher_plug.ex
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
defmodule Pleroma.Plugs.UserFetcherPlug do
|
||||||
|
import Plug.Conn
|
||||||
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.User
|
||||||
|
|
||||||
|
def init(options) do
|
||||||
|
options
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(conn, options) do
|
||||||
|
with %{auth_credentials: %{username: username}} <- conn.assigns,
|
||||||
|
{:ok, %User{} = user} <- user_fetcher(username) do
|
||||||
|
conn
|
||||||
|
|> assign(:auth_user, user)
|
||||||
|
else
|
||||||
|
_ -> conn
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp user_fetcher(username_or_email) do
|
||||||
|
{
|
||||||
|
:ok,
|
||||||
|
cond do
|
||||||
|
# First, try logging in as if it was a name
|
||||||
|
user = Repo.get_by(User, %{nickname: username_or_email}) ->
|
||||||
|
user
|
||||||
|
|
||||||
|
# If we get nil, we try using it as an email
|
||||||
|
user = Repo.get_by(User, %{email: username_or_email}) ->
|
||||||
|
user
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -1,34 +1,19 @@
|
||||||
defmodule Pleroma.Upload do
|
defmodule Pleroma.Upload do
|
||||||
alias Ecto.UUID
|
alias Ecto.UUID
|
||||||
alias Pleroma.Web
|
|
||||||
|
@storage_backend Application.get_env(:pleroma, Pleroma.Upload)
|
||||||
|
|> Keyword.fetch!(:uploader)
|
||||||
|
|
||||||
def store(%Plug.Upload{} = file, should_dedupe) do
|
def store(%Plug.Upload{} = file, should_dedupe) do
|
||||||
settings = Application.get_env(:pleroma, Pleroma.Upload)
|
|
||||||
use_s3 = Keyword.fetch!(settings, :use_s3)
|
|
||||||
|
|
||||||
content_type = get_content_type(file.path)
|
content_type = get_content_type(file.path)
|
||||||
|
|
||||||
uuid = get_uuid(file, should_dedupe)
|
uuid = get_uuid(file, should_dedupe)
|
||||||
name = get_name(file, uuid, content_type, should_dedupe)
|
name = get_name(file, uuid, content_type, should_dedupe)
|
||||||
upload_folder = get_upload_path(uuid, should_dedupe)
|
|
||||||
url_path = get_url(name, uuid, should_dedupe)
|
|
||||||
|
|
||||||
strip_exif_data(content_type, file.path)
|
strip_exif_data(content_type, file.path)
|
||||||
|
|
||||||
File.mkdir_p!(upload_folder)
|
{:ok, url_path} =
|
||||||
result_file = Path.join(upload_folder, name)
|
@storage_backend.put_file(name, uuid, file.path, content_type, should_dedupe)
|
||||||
|
|
||||||
if File.exists?(result_file) do
|
|
||||||
File.rm!(file.path)
|
|
||||||
else
|
|
||||||
File.cp!(file.path, result_file)
|
|
||||||
end
|
|
||||||
|
|
||||||
url_path =
|
|
||||||
if use_s3 do
|
|
||||||
put_s3_file(name, uuid, result_file, content_type)
|
|
||||||
else
|
|
||||||
url_path
|
|
||||||
end
|
|
||||||
|
|
||||||
%{
|
%{
|
||||||
"type" => "Document",
|
"type" => "Document",
|
||||||
|
|
@ -43,22 +28,16 @@ defmodule Pleroma.Upload do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
# XXX: does this code actually work? i am skeptical. --kaniini
|
|
||||||
def store(%{"img" => "data:image/" <> image_data}, should_dedupe) do
|
def store(%{"img" => "data:image/" <> image_data}, should_dedupe) do
|
||||||
settings = Application.get_env(:pleroma, Pleroma.Upload)
|
|
||||||
use_s3 = Keyword.fetch!(settings, :use_s3)
|
|
||||||
|
|
||||||
parsed = Regex.named_captures(~r/(?<filetype>jpeg|png|gif);base64,(?<data>.*)/, image_data)
|
parsed = Regex.named_captures(~r/(?<filetype>jpeg|png|gif);base64,(?<data>.*)/, image_data)
|
||||||
data = Base.decode64!(parsed["data"], ignore: :whitespace)
|
data = Base.decode64!(parsed["data"], ignore: :whitespace)
|
||||||
uuid = UUID.generate()
|
|
||||||
uuidpath = Path.join(upload_path(), uuid)
|
tmp_path = tempfile_for_image(data)
|
||||||
|
|
||||||
uuid = UUID.generate()
|
uuid = UUID.generate()
|
||||||
|
|
||||||
File.mkdir_p!(upload_path())
|
content_type = get_content_type(tmp_path)
|
||||||
|
strip_exif_data(content_type, tmp_path)
|
||||||
File.write!(uuidpath, data)
|
|
||||||
|
|
||||||
content_type = get_content_type(uuidpath)
|
|
||||||
|
|
||||||
name =
|
name =
|
||||||
create_name(
|
create_name(
|
||||||
|
|
@ -67,30 +46,7 @@ defmodule Pleroma.Upload do
|
||||||
content_type
|
content_type
|
||||||
)
|
)
|
||||||
|
|
||||||
upload_folder = get_upload_path(uuid, should_dedupe)
|
{:ok, url_path} = @storage_backend.put_file(name, uuid, tmp_path, content_type, should_dedupe)
|
||||||
url_path = get_url(name, uuid, should_dedupe)
|
|
||||||
|
|
||||||
File.mkdir_p!(upload_folder)
|
|
||||||
result_file = Path.join(upload_folder, name)
|
|
||||||
|
|
||||||
if should_dedupe do
|
|
||||||
if !File.exists?(result_file) do
|
|
||||||
File.rename(uuidpath, result_file)
|
|
||||||
else
|
|
||||||
File.rm!(uuidpath)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
File.rename(uuidpath, result_file)
|
|
||||||
end
|
|
||||||
|
|
||||||
strip_exif_data(content_type, result_file)
|
|
||||||
|
|
||||||
url_path =
|
|
||||||
if use_s3 do
|
|
||||||
put_s3_file(name, uuid, result_file, content_type)
|
|
||||||
else
|
|
||||||
url_path
|
|
||||||
end
|
|
||||||
|
|
||||||
%{
|
%{
|
||||||
"type" => "Image",
|
"type" => "Image",
|
||||||
|
|
@ -105,21 +61,28 @@ defmodule Pleroma.Upload do
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Creates a tempfile using the Plug.Upload Genserver which cleans them up
|
||||||
|
automatically.
|
||||||
|
"""
|
||||||
|
def tempfile_for_image(data) do
|
||||||
|
{:ok, tmp_path} = Plug.Upload.random_file("profile_pics")
|
||||||
|
{:ok, tmp_file} = File.open(tmp_path, [:write, :raw, :binary])
|
||||||
|
IO.binwrite(tmp_file, data)
|
||||||
|
|
||||||
|
tmp_path
|
||||||
|
end
|
||||||
|
|
||||||
def strip_exif_data(content_type, file) do
|
def strip_exif_data(content_type, file) do
|
||||||
settings = Application.get_env(:pleroma, Pleroma.Upload)
|
settings = Application.get_env(:pleroma, Pleroma.Upload)
|
||||||
do_strip = Keyword.fetch!(settings, :strip_exif)
|
do_strip = Keyword.fetch!(settings, :strip_exif)
|
||||||
[filetype, ext] = String.split(content_type, "/")
|
[filetype, _ext] = String.split(content_type, "/")
|
||||||
|
|
||||||
if filetype == "image" and do_strip == true do
|
if filetype == "image" and do_strip == true do
|
||||||
Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true)
|
Mogrify.open(file) |> Mogrify.custom("strip") |> Mogrify.save(in_place: true)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def upload_path do
|
|
||||||
settings = Application.get_env(:pleroma, Pleroma.Upload)
|
|
||||||
Keyword.fetch!(settings, :uploads)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp create_name(uuid, ext, type) do
|
defp create_name(uuid, ext, type) do
|
||||||
case type do
|
case type do
|
||||||
"application/octet-stream" ->
|
"application/octet-stream" ->
|
||||||
|
|
@ -163,26 +126,6 @@ defmodule Pleroma.Upload do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp get_upload_path(uuid, should_dedupe) do
|
|
||||||
if should_dedupe do
|
|
||||||
upload_path()
|
|
||||||
else
|
|
||||||
Path.join(upload_path(), uuid)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp get_url(name, uuid, should_dedupe) do
|
|
||||||
if should_dedupe do
|
|
||||||
url_for(:cow_uri.urlencode(name))
|
|
||||||
else
|
|
||||||
url_for(Path.join(uuid, :cow_uri.urlencode(name)))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
defp url_for(file) do
|
|
||||||
"#{Web.base_url()}/media/#{file}"
|
|
||||||
end
|
|
||||||
|
|
||||||
def get_content_type(file) do
|
def get_content_type(file) do
|
||||||
match =
|
match =
|
||||||
File.open(file, [:read], fn f ->
|
File.open(file, [:read], fn f ->
|
||||||
|
|
@ -224,25 +167,4 @@ defmodule Pleroma.Upload do
|
||||||
_e -> "application/octet-stream"
|
_e -> "application/octet-stream"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
defp put_s3_file(name, uuid, path, content_type) do
|
|
||||||
settings = Application.get_env(:pleroma, Pleroma.Upload)
|
|
||||||
bucket = Keyword.fetch!(settings, :bucket)
|
|
||||||
public_endpoint = Keyword.fetch!(settings, :public_endpoint)
|
|
||||||
|
|
||||||
{:ok, file_data} = File.read(path)
|
|
||||||
|
|
||||||
File.rm!(path)
|
|
||||||
|
|
||||||
s3_name = "#{uuid}/#{name}"
|
|
||||||
|
|
||||||
{:ok, result} =
|
|
||||||
ExAws.S3.put_object(bucket, s3_name, file_data, [
|
|
||||||
{:acl, :public_read},
|
|
||||||
{:content_type, content_type}
|
|
||||||
])
|
|
||||||
|> ExAws.request()
|
|
||||||
|
|
||||||
"#{public_endpoint}/#{bucket}/#{s3_name}"
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
51
lib/pleroma/uploaders/local.ex
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
defmodule Pleroma.Uploaders.Local do
|
||||||
|
@behaviour Pleroma.Uploaders.Uploader
|
||||||
|
|
||||||
|
alias Pleroma.Web
|
||||||
|
|
||||||
|
def put_file(name, uuid, tmpfile, _content_type, should_dedupe) do
|
||||||
|
upload_folder = get_upload_path(uuid, should_dedupe)
|
||||||
|
url_path = get_url(name, uuid, should_dedupe)
|
||||||
|
|
||||||
|
File.mkdir_p!(upload_folder)
|
||||||
|
|
||||||
|
result_file = Path.join(upload_folder, name)
|
||||||
|
|
||||||
|
if File.exists?(result_file) do
|
||||||
|
File.rm!(tmpfile)
|
||||||
|
else
|
||||||
|
File.cp!(tmpfile, result_file)
|
||||||
|
end
|
||||||
|
|
||||||
|
{:ok, url_path}
|
||||||
|
end
|
||||||
|
|
||||||
|
def upload_path do
|
||||||
|
settings = Application.get_env(:pleroma, Pleroma.Uploaders.Local)
|
||||||
|
Keyword.fetch!(settings, :uploads)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_upload_path(uuid, should_dedupe) do
|
||||||
|
if should_dedupe do
|
||||||
|
upload_path()
|
||||||
|
else
|
||||||
|
Path.join(upload_path(), uuid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp get_url(name, uuid, should_dedupe) do
|
||||||
|
if should_dedupe do
|
||||||
|
url_for(:cow_uri.urlencode(name))
|
||||||
|
else
|
||||||
|
url_for(Path.join(uuid, :cow_uri.urlencode(name)))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
defp url_for(file) do
|
||||||
|
settings = Application.get_env(:pleroma, Pleroma.Uploaders.Local)
|
||||||
|
|
||||||
|
Keyword.get(settings, :uploads_url)
|
||||||
|
|> String.replace("{{file}}", file)
|
||||||
|
|> String.replace("{{base_url}}", Web.base_url())
|
||||||
|
end
|
||||||
|
end
|
||||||
28
lib/pleroma/uploaders/s3.ex
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
defmodule Pleroma.Uploaders.S3 do
|
||||||
|
@behaviour Pleroma.Uploaders.Uploader
|
||||||
|
|
||||||
|
def put_file(name, uuid, path, content_type, _should_dedupe) do
|
||||||
|
settings = Application.get_env(:pleroma, Pleroma.Uploaders.S3)
|
||||||
|
bucket = Keyword.fetch!(settings, :bucket)
|
||||||
|
public_endpoint = Keyword.fetch!(settings, :public_endpoint)
|
||||||
|
|
||||||
|
{:ok, file_data} = File.read(path)
|
||||||
|
|
||||||
|
File.rm!(path)
|
||||||
|
|
||||||
|
s3_name = "#{uuid}/#{encode(name)}"
|
||||||
|
|
||||||
|
{:ok, _} =
|
||||||
|
ExAws.S3.put_object(bucket, s3_name, file_data, [
|
||||||
|
{:acl, :public_read},
|
||||||
|
{:content_type, content_type}
|
||||||
|
])
|
||||||
|
|> ExAws.request()
|
||||||
|
|
||||||
|
{:ok, "#{public_endpoint}/#{bucket}/#{s3_name}"}
|
||||||
|
end
|
||||||
|
|
||||||
|
defp encode(name) do
|
||||||
|
String.replace(name, ~r/[^0-9a-zA-Z!.*'()_-]/, "-")
|
||||||
|
end
|
||||||
|
end
|
||||||
48
lib/pleroma/uploaders/swift/keystone.ex
Normal file
|
|
@ -0,0 +1,48 @@
|
||||||
|
defmodule Pleroma.Uploaders.Swift.Keystone do
|
||||||
|
use HTTPoison.Base
|
||||||
|
|
||||||
|
@settings Application.get_env(:pleroma, Pleroma.Uploaders.Swift)
|
||||||
|
|
||||||
|
def process_url(url) do
|
||||||
|
Enum.join(
|
||||||
|
[Keyword.fetch!(@settings, :auth_url), url],
|
||||||
|
"/"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def process_response_body(body) do
|
||||||
|
body
|
||||||
|
|> Poison.decode!()
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_token() do
|
||||||
|
username = Keyword.fetch!(@settings, :username)
|
||||||
|
password = Keyword.fetch!(@settings, :password)
|
||||||
|
tenant_id = Keyword.fetch!(@settings, :tenant_id)
|
||||||
|
|
||||||
|
case post(
|
||||||
|
"/tokens",
|
||||||
|
make_auth_body(username, password, tenant_id),
|
||||||
|
["Content-Type": "application/json"],
|
||||||
|
hackney: [:insecure]
|
||||||
|
) do
|
||||||
|
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
|
||||||
|
body["access"]["token"]["id"]
|
||||||
|
|
||||||
|
{:ok, %HTTPoison.Response{status_code: _}} ->
|
||||||
|
""
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def make_auth_body(username, password, tenant) do
|
||||||
|
Poison.encode!(%{
|
||||||
|
:auth => %{
|
||||||
|
:passwordCredentials => %{
|
||||||
|
:username => username,
|
||||||
|
:password => password
|
||||||
|
},
|
||||||
|
:tenantId => tenant
|
||||||
|
}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
28
lib/pleroma/uploaders/swift/swift.ex
Normal file
|
|
@ -0,0 +1,28 @@
|
||||||
|
defmodule Pleroma.Uploaders.Swift.Client do
|
||||||
|
use HTTPoison.Base
|
||||||
|
|
||||||
|
@settings Application.get_env(:pleroma, Pleroma.Uploaders.Swift)
|
||||||
|
|
||||||
|
def process_url(url) do
|
||||||
|
Enum.join(
|
||||||
|
[Keyword.fetch!(@settings, :storage_url), url],
|
||||||
|
"/"
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def upload_file(filename, body, content_type) do
|
||||||
|
object_url = Keyword.fetch!(@settings, :object_url)
|
||||||
|
token = Pleroma.Uploaders.Swift.Keystone.get_token()
|
||||||
|
|
||||||
|
case put("#{filename}", body, "X-Auth-Token": token, "Content-Type": content_type) do
|
||||||
|
{:ok, %HTTPoison.Response{status_code: 201}} ->
|
||||||
|
{:ok, "#{object_url}/#{filename}"}
|
||||||
|
|
||||||
|
{:ok, %HTTPoison.Response{status_code: 401}} ->
|
||||||
|
{:error, "Unauthorized, Bad Token"}
|
||||||
|
|
||||||
|
{:error, _} ->
|
||||||
|
{:error, "Swift Upload Error"}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
10
lib/pleroma/uploaders/swift/uploader.ex
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
defmodule Pleroma.Uploaders.Swift do
|
||||||
|
@behaviour Pleroma.Uploaders.Uploader
|
||||||
|
|
||||||
|
def put_file(name, uuid, tmp_path, content_type, _should_dedupe) do
|
||||||
|
{:ok, file_data} = File.read(tmp_path)
|
||||||
|
remote_name = "#{uuid}/#{name}"
|
||||||
|
|
||||||
|
Pleroma.Uploaders.Swift.Client.upload_file(remote_name, file_data, content_type)
|
||||||
|
end
|
||||||
|
end
|
||||||
20
lib/pleroma/uploaders/uploader.ex
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
defmodule Pleroma.Uploaders.Uploader do
|
||||||
|
@moduledoc """
|
||||||
|
Defines the contract to put an uploaded file to any backend.
|
||||||
|
"""
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Put a file to the backend.
|
||||||
|
|
||||||
|
Returns `{:ok, String.t } | {:error, String.t} containing the path of the
|
||||||
|
uploaded file, or error information if the file failed to be saved to the
|
||||||
|
respective backend.
|
||||||
|
"""
|
||||||
|
@callback put_file(
|
||||||
|
name :: String.t(),
|
||||||
|
uuid :: String.t(),
|
||||||
|
file :: File.t(),
|
||||||
|
content_type :: String.t(),
|
||||||
|
should_dedupe :: Boolean.t()
|
||||||
|
) :: {:ok, String.t()} | {:error, String.t()}
|
||||||
|
end
|
||||||
|
|
@ -22,6 +22,7 @@ defmodule Pleroma.User do
|
||||||
field(:info, :map, default: %{})
|
field(:info, :map, default: %{})
|
||||||
field(:follower_address, :string)
|
field(:follower_address, :string)
|
||||||
field(:search_distance, :float, virtual: true)
|
field(:search_distance, :float, virtual: true)
|
||||||
|
field(:last_refreshed_at, :naive_datetime)
|
||||||
has_many(:notifications, Notification)
|
has_many(:notifications, Notification)
|
||||||
|
|
||||||
timestamps()
|
timestamps()
|
||||||
|
|
@ -68,7 +69,8 @@ defmodule Pleroma.User do
|
||||||
following_count: length(user.following) - oneself,
|
following_count: length(user.following) - oneself,
|
||||||
note_count: user.info["note_count"] || 0,
|
note_count: user.info["note_count"] || 0,
|
||||||
follower_count: user.info["follower_count"] || 0,
|
follower_count: user.info["follower_count"] || 0,
|
||||||
locked: user.info["locked"] || false
|
locked: user.info["locked"] || false,
|
||||||
|
default_scope: user.info["default_scope"] || "public"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -111,8 +113,12 @@ defmodule Pleroma.User do
|
||||||
end
|
end
|
||||||
|
|
||||||
def upgrade_changeset(struct, params \\ %{}) do
|
def upgrade_changeset(struct, params \\ %{}) do
|
||||||
|
params =
|
||||||
|
params
|
||||||
|
|> Map.put(:last_refreshed_at, NaiveDateTime.utc_now())
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|> cast(params, [:bio, :name, :info, :follower_address, :avatar])
|
|> cast(params, [:bio, :name, :info, :follower_address, :avatar, :last_refreshed_at])
|
||||||
|> unique_constraint(:nickname)
|
|> unique_constraint(:nickname)
|
||||||
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
|
|> validate_format(:nickname, ~r/^[a-zA-Z\d]+$/)
|
||||||
|> validate_length(:bio, max: 5000)
|
|> validate_length(:bio, max: 5000)
|
||||||
|
|
@ -168,6 +174,16 @@ defmodule Pleroma.User do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def needs_update?(%User{local: true}), do: false
|
||||||
|
|
||||||
|
def needs_update?(%User{local: false, last_refreshed_at: nil}), do: true
|
||||||
|
|
||||||
|
def needs_update?(%User{local: false} = user) do
|
||||||
|
NaiveDateTime.diff(NaiveDateTime.utc_now(), user.last_refreshed_at) >= 86400
|
||||||
|
end
|
||||||
|
|
||||||
|
def needs_update?(_), do: true
|
||||||
|
|
||||||
def maybe_direct_follow(%User{} = follower, %User{info: info} = followed) do
|
def maybe_direct_follow(%User{} = follower, %User{info: info} = followed) do
|
||||||
user_config = Application.get_env(:pleroma, :user)
|
user_config = Application.get_env(:pleroma, :user)
|
||||||
deny_follow_blocked = Keyword.get(user_config, :deny_follow_blocked)
|
deny_follow_blocked = Keyword.get(user_config, :deny_follow_blocked)
|
||||||
|
|
@ -608,6 +624,14 @@ defmodule Pleroma.User do
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def moderator_user_query() do
|
||||||
|
from(
|
||||||
|
u in User,
|
||||||
|
where: u.local == true,
|
||||||
|
where: fragment("?->'is_moderator' @> 'true'", u.info)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
def deactivate(%User{} = user) do
|
def deactivate(%User{} = user) do
|
||||||
new_info = Map.put(user.info, "deactivated", true)
|
new_info = Map.put(user.info, "deactivated", true)
|
||||||
cs = User.info_changeset(user, %{info: new_info})
|
cs = User.info_changeset(user, %{info: new_info})
|
||||||
|
|
@ -645,8 +669,16 @@ defmodule Pleroma.User do
|
||||||
:ok
|
:ok
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def html_filter_policy(%User{info: %{"no_rich_text" => true}}) do
|
||||||
|
Pleroma.HTML.Scrubber.TwitterText
|
||||||
|
end
|
||||||
|
|
||||||
|
def html_filter_policy(_), do: nil
|
||||||
|
|
||||||
def get_or_fetch_by_ap_id(ap_id) do
|
def get_or_fetch_by_ap_id(ap_id) do
|
||||||
if user = get_by_ap_id(ap_id) do
|
user = get_by_ap_id(ap_id)
|
||||||
|
|
||||||
|
if !is_nil(user) and !User.needs_update?(user) do
|
||||||
user
|
user
|
||||||
else
|
else
|
||||||
ap_try = ActivityPub.make_user_from_ap_id(ap_id)
|
ap_try = ActivityPub.make_user_from_ap_id(ap_id)
|
||||||
|
|
|
||||||
|
|
@ -93,6 +93,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|
||||||
Pleroma.Web.Streamer.stream("public:local", activity)
|
Pleroma.Web.Streamer.stream("public:local", activity)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
activity.data["object"]
|
||||||
|
|> Map.get("tag", [])
|
||||||
|
|> Enum.filter(fn tag -> is_bitstring(tag) end)
|
||||||
|
|> Enum.map(fn tag -> Pleroma.Web.Streamer.stream("hashtag:" <> tag, activity) end)
|
||||||
|
|
||||||
if activity.data["object"]["attachment"] != [] do
|
if activity.data["object"]["attachment"] != [] do
|
||||||
Pleroma.Web.Streamer.stream("public:media", activity)
|
Pleroma.Web.Streamer.stream("public:media", activity)
|
||||||
|
|
||||||
|
|
@ -747,6 +752,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|
||||||
"actor" => data["attributedTo"],
|
"actor" => data["attributedTo"],
|
||||||
"object" => data
|
"object" => data
|
||||||
},
|
},
|
||||||
|
:ok <- Transmogrifier.contain_origin(id, params),
|
||||||
{:ok, activity} <- Transmogrifier.handle_incoming(params) do
|
{:ok, activity} <- Transmogrifier.handle_incoming(params) do
|
||||||
{:ok, Object.normalize(activity.data["object"])}
|
{:ok, Object.normalize(activity.data["object"])}
|
||||||
else
|
else
|
||||||
|
|
|
||||||
25
lib/pleroma/web/activity_pub/mrf/normalize_markup.ex
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
defmodule Pleroma.Web.ActivityPub.MRF.NormalizeMarkup do
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
|
@behaviour Pleroma.Web.ActivityPub.MRF
|
||||||
|
|
||||||
|
@mrf_normalize_markup Application.get_env(:pleroma, :mrf_normalize_markup)
|
||||||
|
|
||||||
|
def filter(%{"type" => activity_type} = object) when activity_type == "Create" do
|
||||||
|
scrub_policy = Keyword.get(@mrf_normalize_markup, :scrub_policy)
|
||||||
|
|
||||||
|
child = object["object"]
|
||||||
|
|
||||||
|
content =
|
||||||
|
child["content"]
|
||||||
|
|> HTML.filter_tags(scrub_policy)
|
||||||
|
|
||||||
|
child = Map.put(child, "content", content)
|
||||||
|
|
||||||
|
object = Map.put(object, "object", child)
|
||||||
|
|
||||||
|
{:ok, object}
|
||||||
|
end
|
||||||
|
|
||||||
|
def filter(object), do: {:ok, object}
|
||||||
|
end
|
||||||
|
|
@ -7,8 +7,7 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublic do
|
||||||
@allow_direct Keyword.get(@mrf_rejectnonpublic, :allow_direct)
|
@allow_direct Keyword.get(@mrf_rejectnonpublic, :allow_direct)
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def filter(object) do
|
def filter(%{"type" => "Create"} = object) do
|
||||||
if object["type"] == "Create" do
|
|
||||||
user = User.get_cached_by_ap_id(object["actor"])
|
user = User.get_cached_by_ap_id(object["actor"])
|
||||||
public = "https://www.w3.org/ns/activitystreams#Public"
|
public = "https://www.w3.org/ns/activitystreams#Public"
|
||||||
|
|
||||||
|
|
@ -42,8 +41,8 @@ defmodule Pleroma.Web.ActivityPub.MRF.RejectNonPublic do
|
||||||
_e -> {:reject, nil}
|
_e -> {:reject, nil}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
|
||||||
{:ok, object}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@impl true
|
||||||
|
def filter(object), do: {:ok, object}
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -5,53 +5,51 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
|
||||||
@mrf_policy Application.get_env(:pleroma, :mrf_simple)
|
@mrf_policy Application.get_env(:pleroma, :mrf_simple)
|
||||||
|
|
||||||
@accept Keyword.get(@mrf_policy, :accept)
|
@accept Keyword.get(@mrf_policy, :accept)
|
||||||
defp check_accept(actor_info, object) do
|
defp check_accept(%{host: actor_host} = actor_info, object)
|
||||||
if length(@accept) > 0 and not (actor_info.host in @accept) do
|
when length(@accept) > 0 and not (actor_host in @accept) do
|
||||||
{:reject, nil}
|
{:reject, nil}
|
||||||
else
|
|
||||||
{:ok, object}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp check_accept(actor_info, object), do: {:ok, object}
|
||||||
|
|
||||||
@reject Keyword.get(@mrf_policy, :reject)
|
@reject Keyword.get(@mrf_policy, :reject)
|
||||||
defp check_reject(actor_info, object) do
|
defp check_reject(%{host: actor_host} = actor_info, object) when actor_host in @reject do
|
||||||
if actor_info.host in @reject do
|
|
||||||
{:reject, nil}
|
{:reject, nil}
|
||||||
else
|
|
||||||
{:ok, object}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp check_reject(actor_info, object), do: {:ok, object}
|
||||||
|
|
||||||
@media_removal Keyword.get(@mrf_policy, :media_removal)
|
@media_removal Keyword.get(@mrf_policy, :media_removal)
|
||||||
defp check_media_removal(actor_info, object) do
|
defp check_media_removal(%{host: actor_host} = actor_info, %{"type" => "Create"} = object)
|
||||||
if actor_info.host in @media_removal do
|
when actor_host in @media_removal do
|
||||||
child_object = Map.delete(object["object"], "attachment")
|
child_object = Map.delete(object["object"], "attachment")
|
||||||
object = Map.put(object, "object", child_object)
|
object = Map.put(object, "object", child_object)
|
||||||
{:ok, object}
|
{:ok, object}
|
||||||
else
|
|
||||||
{:ok, object}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp check_media_removal(actor_info, object), do: {:ok, object}
|
||||||
|
|
||||||
@media_nsfw Keyword.get(@mrf_policy, :media_nsfw)
|
@media_nsfw Keyword.get(@mrf_policy, :media_nsfw)
|
||||||
defp check_media_nsfw(actor_info, object) do
|
defp check_media_nsfw(
|
||||||
child_object = object["object"]
|
%{host: actor_host} = actor_info,
|
||||||
|
%{
|
||||||
if actor_info.host in @media_nsfw and child_object["attachment"] != nil and
|
"type" => "Create",
|
||||||
length(child_object["attachment"]) > 0 do
|
"object" => %{"attachment" => child_attachment} = child_object
|
||||||
|
} = object
|
||||||
|
)
|
||||||
|
when actor_host in @media_nsfw and length(child_attachment) > 0 do
|
||||||
tags = (child_object["tag"] || []) ++ ["nsfw"]
|
tags = (child_object["tag"] || []) ++ ["nsfw"]
|
||||||
child_object = Map.put(child_object, "tags", tags)
|
child_object = Map.put(child_object, "tags", tags)
|
||||||
child_object = Map.put(child_object, "sensitive", true)
|
child_object = Map.put(child_object, "sensitive", true)
|
||||||
object = Map.put(object, "object", child_object)
|
object = Map.put(object, "object", child_object)
|
||||||
{:ok, object}
|
{:ok, object}
|
||||||
else
|
|
||||||
{:ok, object}
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp check_media_nsfw(actor_info, object), do: {:ok, object}
|
||||||
|
|
||||||
@ftl_removal Keyword.get(@mrf_policy, :federated_timeline_removal)
|
@ftl_removal Keyword.get(@mrf_policy, :federated_timeline_removal)
|
||||||
defp check_ftl_removal(actor_info, object) do
|
defp check_ftl_removal(%{host: actor_host} = actor_info, object)
|
||||||
if actor_info.host in @ftl_removal do
|
when actor_host in @ftl_removal do
|
||||||
user = User.get_by_ap_id(object["actor"])
|
user = User.get_by_ap_id(object["actor"])
|
||||||
|
|
||||||
# flip to/cc relationship to make the post unlisted
|
# flip to/cc relationship to make the post unlisted
|
||||||
|
|
@ -73,11 +71,10 @@ defmodule Pleroma.Web.ActivityPub.MRF.SimplePolicy do
|
||||||
object
|
object
|
||||||
end
|
end
|
||||||
|
|
||||||
{:ok, object}
|
|
||||||
else
|
|
||||||
{:ok, object}
|
{:ok, object}
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
defp check_ftl_removal(actor_info, object), do: {:ok, object}
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def filter(object) do
|
def filter(object) do
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,20 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
actor["id"]
|
actor["id"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
Checks that an imported AP object's actor matches the domain it came from.
|
||||||
|
"""
|
||||||
|
def contain_origin(id, %{"actor" => actor} = params) do
|
||||||
|
id_uri = URI.parse(id)
|
||||||
|
actor_uri = URI.parse(get_actor(params))
|
||||||
|
|
||||||
|
if id_uri.host == actor_uri.host do
|
||||||
|
:ok
|
||||||
|
else
|
||||||
|
:error
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Modifies an incoming AP object (mastodon format) to our internal format.
|
Modifies an incoming AP object (mastodon format) to our internal format.
|
||||||
"""
|
"""
|
||||||
|
|
@ -341,9 +355,10 @@ defmodule Pleroma.Web.ActivityPub.Transmogrifier do
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_incoming(
|
def handle_incoming(
|
||||||
%{"type" => "Update", "object" => %{"type" => "Person"} = object, "actor" => actor_id} =
|
%{"type" => "Update", "object" => %{"type" => object_type} = object, "actor" => actor_id} =
|
||||||
data
|
data
|
||||||
) do
|
)
|
||||||
|
when object_type in ["Person", "Application", "Service", "Organization"] do
|
||||||
with %User{ap_id: ^actor_id} = actor <- User.get_by_ap_id(object["id"]) do
|
with %User{ap_id: ^actor_id} = actor <- User.get_by_ap_id(object["id"]) do
|
||||||
{:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)
|
{:ok, new_user_data} = ActivityPub.user_data_from_user_object(object)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ defmodule Pleroma.Web.Endpoint do
|
||||||
#
|
#
|
||||||
# You should set gzip to true if you are running phoenix.digest
|
# You should set gzip to true if you are running phoenix.digest
|
||||||
# when deploying your static files in production.
|
# when deploying your static files in production.
|
||||||
plug(Plug.Static, at: "/media", from: Pleroma.Upload.upload_path(), gzip: false)
|
plug(Plug.Static, at: "/media", from: Pleroma.Uploaders.Local.upload_path(), gzip: false)
|
||||||
|
|
||||||
plug(
|
plug(
|
||||||
Plug.Static,
|
Plug.Static,
|
||||||
|
|
@ -49,7 +49,11 @@ defmodule Pleroma.Web.Endpoint do
|
||||||
Plug.Session,
|
Plug.Session,
|
||||||
store: :cookie,
|
store: :cookie,
|
||||||
key: "_pleroma_key",
|
key: "_pleroma_key",
|
||||||
signing_salt: "CqaoopA2"
|
signing_salt: "CqaoopA2",
|
||||||
|
http_only: true,
|
||||||
|
secure:
|
||||||
|
Application.get_env(:pleroma, Pleroma.Web.Endpoint) |> Keyword.get(:secure_cookie_flag),
|
||||||
|
extra: "SameSite=Strict"
|
||||||
)
|
)
|
||||||
|
|
||||||
plug(Pleroma.Web.Router)
|
plug(Pleroma.Web.Router)
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
use Pleroma.Web, :controller
|
use Pleroma.Web, :controller
|
||||||
alias Pleroma.{Repo, Object, Activity, User, Notification, Stats}
|
alias Pleroma.{Repo, Object, Activity, User, Notification, Stats}
|
||||||
alias Pleroma.Web
|
alias Pleroma.Web
|
||||||
alias Pleroma.Web.MastodonAPI.{StatusView, AccountView, MastodonView, ListView}
|
alias Pleroma.Web.MastodonAPI.{StatusView, AccountView, MastodonView, ListView, FilterView}
|
||||||
alias Pleroma.Web.ActivityPub.ActivityPub
|
alias Pleroma.Web.ActivityPub.ActivityPub
|
||||||
alias Pleroma.Web.ActivityPub.Utils
|
alias Pleroma.Web.ActivityPub.Utils
|
||||||
alias Pleroma.Web.CommonAPI
|
alias Pleroma.Web.CommonAPI
|
||||||
alias Pleroma.Web.OAuth.{Authorization, Token, App}
|
alias Pleroma.Web.OAuth.{Authorization, Token, App}
|
||||||
|
alias Pleroma.Web.MediaProxy
|
||||||
alias Comeonin.Pbkdf2
|
alias Comeonin.Pbkdf2
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
require Logger
|
require Logger
|
||||||
|
|
@ -97,7 +98,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
CommonAPI.update(user)
|
CommonAPI.update(user)
|
||||||
end
|
end
|
||||||
|
|
||||||
json(conn, AccountView.render("account.json", %{user: user}))
|
json(conn, AccountView.render("account.json", %{user: user, for: user}))
|
||||||
else
|
else
|
||||||
_e ->
|
_e ->
|
||||||
conn
|
conn
|
||||||
|
|
@ -107,13 +108,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
end
|
end
|
||||||
|
|
||||||
def verify_credentials(%{assigns: %{user: user}} = conn, _) do
|
def verify_credentials(%{assigns: %{user: user}} = conn, _) do
|
||||||
account = AccountView.render("account.json", %{user: user})
|
account = AccountView.render("account.json", %{user: user, for: user})
|
||||||
json(conn, account)
|
json(conn, account)
|
||||||
end
|
end
|
||||||
|
|
||||||
def user(conn, %{"id" => id}) do
|
def user(%{assigns: %{user: for_user}} = conn, %{"id" => id}) do
|
||||||
with %User{} = user <- Repo.get(User, id) do
|
with %User{} = user <- Repo.get(User, id) do
|
||||||
account = AccountView.render("account.json", %{user: user})
|
account = AccountView.render("account.json", %{user: user, for: for_user})
|
||||||
json(conn, account)
|
json(conn, account)
|
||||||
else
|
else
|
||||||
_e ->
|
_e ->
|
||||||
|
|
@ -124,7 +125,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
end
|
end
|
||||||
|
|
||||||
@instance Application.get_env(:pleroma, :instance)
|
@instance Application.get_env(:pleroma, :instance)
|
||||||
@mastodon_api_level "2.3.3"
|
@mastodon_api_level "2.5.0"
|
||||||
|
|
||||||
def masto_instance(conn, _params) do
|
def masto_instance(conn, _params) do
|
||||||
response = %{
|
response = %{
|
||||||
|
|
@ -440,7 +441,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
new_data = %{object.data | "name" => description}
|
new_data = %{object.data | "name" => description}
|
||||||
|
|
||||||
change = Object.change(object, %{data: new_data})
|
change = Object.change(object, %{data: new_data})
|
||||||
{:ok, media_obj} = Repo.update(change)
|
{:ok, _} = Repo.update(change)
|
||||||
|
|
||||||
data =
|
data =
|
||||||
new_data
|
new_data
|
||||||
|
|
@ -587,7 +588,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
with %User{} = followed <- Repo.get_by(User, nickname: uri),
|
with %User{} = followed <- Repo.get_by(User, nickname: uri),
|
||||||
{:ok, follower} <- User.maybe_direct_follow(follower, followed),
|
{:ok, follower} <- User.maybe_direct_follow(follower, followed),
|
||||||
{:ok, _activity} <- ActivityPub.follow(follower, followed) do
|
{:ok, _activity} <- ActivityPub.follow(follower, followed) do
|
||||||
render(conn, AccountView, "account.json", %{user: followed})
|
render(conn, AccountView, "account.json", %{user: followed, for: follower})
|
||||||
else
|
else
|
||||||
{:error, message} ->
|
{:error, message} ->
|
||||||
conn
|
conn
|
||||||
|
|
@ -653,9 +654,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
json(conn, %{})
|
json(conn, %{})
|
||||||
end
|
end
|
||||||
|
|
||||||
def search2(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
|
def status_search(query) do
|
||||||
accounts = User.search(query, params["resolve"] == "true")
|
|
||||||
|
|
||||||
fetched =
|
fetched =
|
||||||
if Regex.match?(~r/https?:/, query) do
|
if Regex.match?(~r/https?:/, query) do
|
||||||
with {:ok, object} <- ActivityPub.fetch_object_from_id(query) do
|
with {:ok, object} <- ActivityPub.fetch_object_from_id(query) do
|
||||||
|
|
@ -680,7 +679,13 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
order_by: [desc: :id]
|
order_by: [desc: :id]
|
||||||
)
|
)
|
||||||
|
|
||||||
statuses = Repo.all(q) ++ fetched
|
Repo.all(q) ++ fetched
|
||||||
|
end
|
||||||
|
|
||||||
|
def search2(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
|
||||||
|
accounts = User.search(query, params["resolve"] == "true")
|
||||||
|
|
||||||
|
statuses = status_search(query)
|
||||||
|
|
||||||
tags_path = Web.base_url() <> "/tag/"
|
tags_path = Web.base_url() <> "/tag/"
|
||||||
|
|
||||||
|
|
@ -704,31 +709,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
|
def search(%{assigns: %{user: user}} = conn, %{"q" => query} = params) do
|
||||||
accounts = User.search(query, params["resolve"] == "true")
|
accounts = User.search(query, params["resolve"] == "true")
|
||||||
|
|
||||||
fetched =
|
statuses = status_search(query)
|
||||||
if Regex.match?(~r/https?:/, query) do
|
|
||||||
with {:ok, object} <- ActivityPub.fetch_object_from_id(query) do
|
|
||||||
[Activity.get_create_activity_by_object_ap_id(object.data["id"])]
|
|
||||||
else
|
|
||||||
_e -> []
|
|
||||||
end
|
|
||||||
end || []
|
|
||||||
|
|
||||||
q =
|
|
||||||
from(
|
|
||||||
a in Activity,
|
|
||||||
where: fragment("?->>'type' = 'Create'", a.data),
|
|
||||||
where: "https://www.w3.org/ns/activitystreams#Public" in a.recipients,
|
|
||||||
where:
|
|
||||||
fragment(
|
|
||||||
"to_tsvector('english', ?->'object'->>'content') @@ plainto_tsquery('english', ?)",
|
|
||||||
a.data,
|
|
||||||
^query
|
|
||||||
),
|
|
||||||
limit: 20,
|
|
||||||
order_by: [desc: :id]
|
|
||||||
)
|
|
||||||
|
|
||||||
statuses = Repo.all(q) ++ fetched
|
|
||||||
|
|
||||||
tags =
|
tags =
|
||||||
String.split(query)
|
String.split(query)
|
||||||
|
|
@ -877,7 +858,9 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
|
|
||||||
if user && token do
|
if user && token do
|
||||||
mastodon_emoji = mastodonized_emoji()
|
mastodon_emoji = mastodonized_emoji()
|
||||||
accounts = Map.put(%{}, user.id, AccountView.render("account.json", %{user: user}))
|
|
||||||
|
accounts =
|
||||||
|
Map.put(%{}, user.id, AccountView.render("account.json", %{user: user, for: user}))
|
||||||
|
|
||||||
initial_state =
|
initial_state =
|
||||||
%{
|
%{
|
||||||
|
|
@ -1049,13 +1032,15 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
NaiveDateTime.to_iso8601(created_at)
|
NaiveDateTime.to_iso8601(created_at)
|
||||||
|> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
|
|> String.replace(~r/(\.\d+)?$/, ".000Z", global: false)
|
||||||
|
|
||||||
|
id = id |> to_string
|
||||||
|
|
||||||
case activity.data["type"] do
|
case activity.data["type"] do
|
||||||
"Create" ->
|
"Create" ->
|
||||||
%{
|
%{
|
||||||
id: id,
|
id: id,
|
||||||
type: "mention",
|
type: "mention",
|
||||||
created_at: created_at,
|
created_at: created_at,
|
||||||
account: AccountView.render("account.json", %{user: actor}),
|
account: AccountView.render("account.json", %{user: actor, for: user}),
|
||||||
status: StatusView.render("status.json", %{activity: activity, for: user})
|
status: StatusView.render("status.json", %{activity: activity, for: user})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1066,7 +1051,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
id: id,
|
id: id,
|
||||||
type: "favourite",
|
type: "favourite",
|
||||||
created_at: created_at,
|
created_at: created_at,
|
||||||
account: AccountView.render("account.json", %{user: actor}),
|
account: AccountView.render("account.json", %{user: actor, for: user}),
|
||||||
status: StatusView.render("status.json", %{activity: liked_activity, for: user})
|
status: StatusView.render("status.json", %{activity: liked_activity, for: user})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1077,7 +1062,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
id: id,
|
id: id,
|
||||||
type: "reblog",
|
type: "reblog",
|
||||||
created_at: created_at,
|
created_at: created_at,
|
||||||
account: AccountView.render("account.json", %{user: actor}),
|
account: AccountView.render("account.json", %{user: actor, for: user}),
|
||||||
status: StatusView.render("status.json", %{activity: announced_activity, for: user})
|
status: StatusView.render("status.json", %{activity: announced_activity, for: user})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1086,7 +1071,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
id: id,
|
id: id,
|
||||||
type: "follow",
|
type: "follow",
|
||||||
created_at: created_at,
|
created_at: created_at,
|
||||||
account: AccountView.render("account.json", %{user: actor})
|
account: AccountView.render("account.json", %{user: actor, for: user})
|
||||||
}
|
}
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
|
|
@ -1094,6 +1079,65 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def get_filters(%{assigns: %{user: user}} = conn, _) do
|
||||||
|
filters = Pleroma.Filter.get_filters(user)
|
||||||
|
res = FilterView.render("filters.json", filters: filters)
|
||||||
|
json(conn, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_filter(
|
||||||
|
%{assigns: %{user: user}} = conn,
|
||||||
|
%{"phrase" => phrase, "context" => context} = params
|
||||||
|
) do
|
||||||
|
query = %Pleroma.Filter{
|
||||||
|
user_id: user.id,
|
||||||
|
phrase: phrase,
|
||||||
|
context: context,
|
||||||
|
hide: Map.get(params, "irreversible", nil),
|
||||||
|
whole_word: Map.get(params, "boolean", true)
|
||||||
|
# expires_at
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, response} = Pleroma.Filter.create(query)
|
||||||
|
res = FilterView.render("filter.json", filter: response)
|
||||||
|
json(conn, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
def get_filter(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do
|
||||||
|
filter = Pleroma.Filter.get(filter_id, user)
|
||||||
|
res = FilterView.render("filter.json", filter: filter)
|
||||||
|
json(conn, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_filter(
|
||||||
|
%{assigns: %{user: user}} = conn,
|
||||||
|
%{"phrase" => phrase, "context" => context, "id" => filter_id} = params
|
||||||
|
) do
|
||||||
|
query = %Pleroma.Filter{
|
||||||
|
user_id: user.id,
|
||||||
|
filter_id: filter_id,
|
||||||
|
phrase: phrase,
|
||||||
|
context: context,
|
||||||
|
hide: Map.get(params, "irreversible", nil),
|
||||||
|
whole_word: Map.get(params, "boolean", true)
|
||||||
|
# expires_at
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, response} = Pleroma.Filter.update(query)
|
||||||
|
res = FilterView.render("filter.json", filter: response)
|
||||||
|
json(conn, res)
|
||||||
|
end
|
||||||
|
|
||||||
|
def delete_filter(%{assigns: %{user: user}} = conn, %{"id" => filter_id}) do
|
||||||
|
query = %Pleroma.Filter{
|
||||||
|
user_id: user.id,
|
||||||
|
filter_id: filter_id
|
||||||
|
}
|
||||||
|
|
||||||
|
{:ok, _} = Pleroma.Filter.delete(query)
|
||||||
|
json(conn, %{})
|
||||||
|
end
|
||||||
|
|
||||||
def errors(conn, _) do
|
def errors(conn, _) do
|
||||||
conn
|
conn
|
||||||
|> put_status(500)
|
|> put_status(500)
|
||||||
|
|
@ -1106,6 +1150,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
if Keyword.get(@suggestions, :enabled, false) do
|
if Keyword.get(@suggestions, :enabled, false) do
|
||||||
api = Keyword.get(@suggestions, :third_party_engine, "")
|
api = Keyword.get(@suggestions, :third_party_engine, "")
|
||||||
timeout = Keyword.get(@suggestions, :timeout, 5000)
|
timeout = Keyword.get(@suggestions, :timeout, 5000)
|
||||||
|
limit = Keyword.get(@suggestions, :limit, 23)
|
||||||
|
|
||||||
host =
|
host =
|
||||||
Application.get_env(:pleroma, Pleroma.Web.Endpoint)
|
Application.get_env(:pleroma, Pleroma.Web.Endpoint)
|
||||||
|
|
@ -1119,7 +1164,7 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
@httpoison.get(url, [], timeout: timeout, recv_timeout: timeout),
|
@httpoison.get(url, [], timeout: timeout, recv_timeout: timeout),
|
||||||
{:ok, data} <- Jason.decode(body) do
|
{:ok, data} <- Jason.decode(body) do
|
||||||
data2 =
|
data2 =
|
||||||
Enum.slice(data, 0, 40)
|
Enum.slice(data, 0, limit)
|
||||||
|> Enum.map(fn x ->
|
|> Enum.map(fn x ->
|
||||||
Map.put(
|
Map.put(
|
||||||
x,
|
x,
|
||||||
|
|
@ -1130,6 +1175,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
end)
|
end)
|
||||||
|
|> Enum.map(fn x ->
|
||||||
|
Map.put(x, "avatar", MediaProxy.url(x["avatar"]))
|
||||||
|
end)
|
||||||
|
|> Enum.map(fn x ->
|
||||||
|
Map.put(x, "avatar_static", MediaProxy.url(x["avatar_static"]))
|
||||||
|
end)
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|> json(data2)
|
|> json(data2)
|
||||||
|
|
|
||||||
|
|
@ -23,16 +23,18 @@ defmodule Pleroma.Web.MastodonAPI.MastodonSocket do
|
||||||
"public:local:media",
|
"public:local:media",
|
||||||
"user",
|
"user",
|
||||||
"direct",
|
"direct",
|
||||||
"list"
|
"list",
|
||||||
|
"hashtag"
|
||||||
] <- params["stream"] do
|
] <- params["stream"] do
|
||||||
topic = if stream == "list", do: "list:#{params["list"]}", else: stream
|
topic = if stream == "list", do: "list:#{params["list"]}", else: stream
|
||||||
|
socket_stream = if stream == "hashtag", do: "hashtag:#{params["tag"]}", else: stream
|
||||||
|
|
||||||
socket =
|
socket =
|
||||||
socket
|
socket
|
||||||
|> assign(:topic, topic)
|
|> assign(:topic, topic)
|
||||||
|> assign(:user, user)
|
|> assign(:user, user)
|
||||||
|
|
||||||
Pleroma.Web.Streamer.add_socket(params["stream"], socket)
|
Pleroma.Web.Streamer.add_socket(socket_stream, socket)
|
||||||
{:ok, socket}
|
{:ok, socket}
|
||||||
else
|
else
|
||||||
_e -> :error
|
_e -> :error
|
||||||
|
|
|
||||||
|
|
@ -4,15 +4,17 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
alias Pleroma.Web.MastodonAPI.AccountView
|
alias Pleroma.Web.MastodonAPI.AccountView
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
alias Pleroma.Web.MediaProxy
|
alias Pleroma.Web.MediaProxy
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
def render("accounts.json", %{users: users} = opts) do
|
def render("accounts.json", %{users: users} = opts) do
|
||||||
render_many(users, AccountView, "account.json", opts)
|
render_many(users, AccountView, "account.json", opts)
|
||||||
end
|
end
|
||||||
|
|
||||||
def render("account.json", %{user: user}) do
|
def render("account.json", %{user: user} = opts) do
|
||||||
image = User.avatar_url(user) |> MediaProxy.url()
|
image = User.avatar_url(user) |> MediaProxy.url()
|
||||||
header = User.banner_url(user) |> MediaProxy.url()
|
header = User.banner_url(user) |> MediaProxy.url()
|
||||||
user_info = User.user_info(user)
|
user_info = User.user_info(user)
|
||||||
|
bot = (user.info["source_data"]["type"] || "Person") in ["Application", "Service"]
|
||||||
|
|
||||||
emojis =
|
emojis =
|
||||||
(user.info["source_data"]["tag"] || [])
|
(user.info["source_data"]["tag"] || [])
|
||||||
|
|
@ -26,6 +28,13 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
}
|
}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
fields =
|
||||||
|
(user.info["source_data"]["attachment"] || [])
|
||||||
|
|> Enum.filter(fn %{"type" => t} -> t == "PropertyValue" end)
|
||||||
|
|> Enum.map(fn fields -> Map.take(fields, ["name", "value"]) end)
|
||||||
|
|
||||||
|
bio = HTML.filter_tags(user.bio, User.html_filter_policy(opts[:for]))
|
||||||
|
|
||||||
%{
|
%{
|
||||||
id: to_string(user.id),
|
id: to_string(user.id),
|
||||||
username: username_from_nickname(user.nickname),
|
username: username_from_nickname(user.nickname),
|
||||||
|
|
@ -36,18 +45,19 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
followers_count: user_info.follower_count,
|
followers_count: user_info.follower_count,
|
||||||
following_count: user_info.following_count,
|
following_count: user_info.following_count,
|
||||||
statuses_count: user_info.note_count,
|
statuses_count: user_info.note_count,
|
||||||
note: HtmlSanitizeEx.basic_html(user.bio) || "",
|
note: bio || "",
|
||||||
url: user.ap_id,
|
url: user.ap_id,
|
||||||
avatar: image,
|
avatar: image,
|
||||||
avatar_static: image,
|
avatar_static: image,
|
||||||
header: header,
|
header: header,
|
||||||
header_static: header,
|
header_static: header,
|
||||||
emojis: emojis,
|
emojis: emojis,
|
||||||
fields: [],
|
fields: fields,
|
||||||
|
bot: bot,
|
||||||
source: %{
|
source: %{
|
||||||
note: "",
|
note: "",
|
||||||
privacy: "public",
|
privacy: user_info.default_scope,
|
||||||
sensitive: "false"
|
sensitive: false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
@ -68,8 +78,11 @@ defmodule Pleroma.Web.MastodonAPI.AccountView do
|
||||||
followed_by: User.following?(target, user),
|
followed_by: User.following?(target, user),
|
||||||
blocking: User.blocks?(user, target),
|
blocking: User.blocks?(user, target),
|
||||||
muting: false,
|
muting: false,
|
||||||
|
muting_notifications: false,
|
||||||
requested: false,
|
requested: false,
|
||||||
domain_blocking: false
|
domain_blocking: false,
|
||||||
|
showing_reblogs: false,
|
||||||
|
endorsed: false
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
27
lib/pleroma/web/mastodon_api/views/filter_view.ex
Normal file
|
|
@ -0,0 +1,27 @@
|
||||||
|
defmodule Pleroma.Web.MastodonAPI.FilterView do
|
||||||
|
use Pleroma.Web, :view
|
||||||
|
alias Pleroma.Web.MastodonAPI.FilterView
|
||||||
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
|
|
||||||
|
def render("filters.json", %{filters: filters} = opts) do
|
||||||
|
render_many(filters, FilterView, "filter.json", opts)
|
||||||
|
end
|
||||||
|
|
||||||
|
def render("filter.json", %{filter: filter}) do
|
||||||
|
expires_at =
|
||||||
|
if filter.expires_at do
|
||||||
|
Utils.to_masto_date(filter.expires_at)
|
||||||
|
else
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
|
||||||
|
%{
|
||||||
|
id: to_string(filter.filter_id),
|
||||||
|
phrase: filter.phrase,
|
||||||
|
context: filter.context,
|
||||||
|
expires_at: expires_at,
|
||||||
|
irreversible: filter.hide,
|
||||||
|
whole_word: false
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -5,6 +5,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
alias Pleroma.Web.MediaProxy
|
alias Pleroma.Web.MediaProxy
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
# TODO: Add cached version.
|
# TODO: Add cached version.
|
||||||
defp get_replied_to_activities(activities) do
|
defp get_replied_to_activities(activities) do
|
||||||
|
|
@ -62,6 +63,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
|
||||||
content: reblogged[:content],
|
content: reblogged[:content],
|
||||||
created_at: created_at,
|
created_at: created_at,
|
||||||
reblogs_count: 0,
|
reblogs_count: 0,
|
||||||
|
replies_count: 0,
|
||||||
favourites_count: 0,
|
favourites_count: 0,
|
||||||
reblogged: false,
|
reblogged: false,
|
||||||
favourited: false,
|
favourited: false,
|
||||||
|
|
@ -111,15 +113,19 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
|
||||||
emojis =
|
emojis =
|
||||||
(activity.data["object"]["emoji"] || [])
|
(activity.data["object"]["emoji"] || [])
|
||||||
|> Enum.map(fn {name, url} ->
|
|> Enum.map(fn {name, url} ->
|
||||||
name = HtmlSanitizeEx.strip_tags(name)
|
name = HTML.strip_tags(name)
|
||||||
|
|
||||||
url =
|
url =
|
||||||
HtmlSanitizeEx.strip_tags(url)
|
HTML.strip_tags(url)
|
||||||
|> MediaProxy.url()
|
|> MediaProxy.url()
|
||||||
|
|
||||||
%{shortcode: name, url: url, static_url: url}
|
%{shortcode: name, url: url, static_url: url, visible_in_picker: false}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
content =
|
||||||
|
render_content(object)
|
||||||
|
|> HTML.filter_tags(User.html_filter_policy(opts[:for]))
|
||||||
|
|
||||||
%{
|
%{
|
||||||
id: to_string(activity.id),
|
id: to_string(activity.id),
|
||||||
uri: object["id"],
|
uri: object["id"],
|
||||||
|
|
@ -128,9 +134,10 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
|
||||||
in_reply_to_id: reply_to && to_string(reply_to.id),
|
in_reply_to_id: reply_to && to_string(reply_to.id),
|
||||||
in_reply_to_account_id: reply_to_user && to_string(reply_to_user.id),
|
in_reply_to_account_id: reply_to_user && to_string(reply_to_user.id),
|
||||||
reblog: nil,
|
reblog: nil,
|
||||||
content: render_content(object),
|
content: content,
|
||||||
created_at: created_at,
|
created_at: created_at,
|
||||||
reblogs_count: announcement_count,
|
reblogs_count: announcement_count,
|
||||||
|
replies_count: 0,
|
||||||
favourites_count: like_count,
|
favourites_count: like_count,
|
||||||
reblogged: !!repeated,
|
reblogged: !!repeated,
|
||||||
favourited: !!favorited,
|
favourited: !!favorited,
|
||||||
|
|
@ -153,7 +160,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
|
||||||
|
|
||||||
def render("attachment.json", %{attachment: attachment}) do
|
def render("attachment.json", %{attachment: attachment}) do
|
||||||
[attachment_url | _] = attachment["url"]
|
[attachment_url | _] = attachment["url"]
|
||||||
media_type = attachment_url["mediaType"] || attachment_url["mimeType"]
|
media_type = attachment_url["mediaType"] || attachment_url["mimeType"] || "image"
|
||||||
href = attachment_url["href"]
|
href = attachment_url["href"]
|
||||||
|
|
||||||
type =
|
type =
|
||||||
|
|
@ -221,7 +228,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
|
||||||
object["content"]
|
object["content"]
|
||||||
end
|
end
|
||||||
|
|
||||||
HtmlSanitizeEx.basic_html(content)
|
content
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_content(%{"type" => "Article"} = object) do
|
def render_content(%{"type" => "Article"} = object) do
|
||||||
|
|
@ -234,10 +241,8 @@ defmodule Pleroma.Web.MastodonAPI.StatusView do
|
||||||
object["content"]
|
object["content"]
|
||||||
end
|
end
|
||||||
|
|
||||||
HtmlSanitizeEx.basic_html(content)
|
content
|
||||||
end
|
end
|
||||||
|
|
||||||
def render_content(object) do
|
def render_content(object), do: object["content"]
|
||||||
HtmlSanitizeEx.basic_html(object["content"])
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
|
||||||
|
|
||||||
alias Pleroma.Stats
|
alias Pleroma.Stats
|
||||||
alias Pleroma.Web
|
alias Pleroma.Web
|
||||||
|
alias Pleroma.{User, Repo}
|
||||||
|
|
||||||
def schemas(conn, _params) do
|
def schemas(conn, _params) do
|
||||||
response = %{
|
response = %{
|
||||||
|
|
@ -22,8 +23,15 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
|
||||||
instance = Application.get_env(:pleroma, :instance)
|
instance = Application.get_env(:pleroma, :instance)
|
||||||
media_proxy = Application.get_env(:pleroma, :media_proxy)
|
media_proxy = Application.get_env(:pleroma, :media_proxy)
|
||||||
suggestions = Application.get_env(:pleroma, :suggestions)
|
suggestions = Application.get_env(:pleroma, :suggestions)
|
||||||
|
chat = Application.get_env(:pleroma, :chat)
|
||||||
|
gopher = Application.get_env(:pleroma, :gopher)
|
||||||
stats = Stats.get_stats()
|
stats = Stats.get_stats()
|
||||||
|
|
||||||
|
staff_accounts =
|
||||||
|
User.moderator_user_query()
|
||||||
|
|> Repo.all()
|
||||||
|
|> Enum.map(fn u -> u.ap_id end)
|
||||||
|
|
||||||
response = %{
|
response = %{
|
||||||
version: "2.0",
|
version: "2.0",
|
||||||
software: %{
|
software: %{
|
||||||
|
|
@ -51,8 +59,12 @@ defmodule Pleroma.Web.Nodeinfo.NodeinfoController do
|
||||||
enabled: Keyword.get(suggestions, :enabled, false),
|
enabled: Keyword.get(suggestions, :enabled, false),
|
||||||
thirdPartyEngine: Keyword.get(suggestions, :third_party_engine, ""),
|
thirdPartyEngine: Keyword.get(suggestions, :third_party_engine, ""),
|
||||||
timeout: Keyword.get(suggestions, :timeout, 5000),
|
timeout: Keyword.get(suggestions, :timeout, 5000),
|
||||||
|
limit: Keyword.get(suggestions, :limit, 23),
|
||||||
web: Keyword.get(suggestions, :web, "")
|
web: Keyword.get(suggestions, :web, "")
|
||||||
}
|
},
|
||||||
|
staffAccounts: staff_accounts,
|
||||||
|
chat: Keyword.get(chat, :enabled),
|
||||||
|
gopher: Keyword.get(gopher, :enabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,15 +39,18 @@ defmodule Pleroma.Web.OAuth.OAuthController do
|
||||||
})
|
})
|
||||||
else
|
else
|
||||||
connector = if String.contains?(redirect_uri, "?"), do: "&", else: "?"
|
connector = if String.contains?(redirect_uri, "?"), do: "&", else: "?"
|
||||||
url = "#{redirect_uri}#{connector}code=#{auth.token}"
|
url = "#{redirect_uri}#{connector}"
|
||||||
|
url_params = %{:code => auth.token}
|
||||||
|
|
||||||
url =
|
url_params =
|
||||||
if params["state"] do
|
if params["state"] do
|
||||||
url <> "&state=#{params["state"]}"
|
Map.put(url_params, :state, params["state"])
|
||||||
else
|
else
|
||||||
url
|
url_params
|
||||||
end
|
end
|
||||||
|
|
||||||
|
url = "#{url}#{Plug.Conn.Query.encode(url_params)}"
|
||||||
|
|
||||||
redirect(conn, external: url)
|
redirect(conn, external: url)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
@ -60,11 +63,13 @@ defmodule Pleroma.Web.OAuth.OAuthController do
|
||||||
fixed_token = fix_padding(params["code"]),
|
fixed_token = fix_padding(params["code"]),
|
||||||
%Authorization{} = auth <-
|
%Authorization{} = auth <-
|
||||||
Repo.get_by(Authorization, token: fixed_token, app_id: app.id),
|
Repo.get_by(Authorization, token: fixed_token, app_id: app.id),
|
||||||
{:ok, token} <- Token.exchange_token(app, auth) do
|
{:ok, token} <- Token.exchange_token(app, auth),
|
||||||
|
{:ok, inserted_at} <- DateTime.from_naive(token.inserted_at, "Etc/UTC") do
|
||||||
response = %{
|
response = %{
|
||||||
token_type: "Bearer",
|
token_type: "Bearer",
|
||||||
access_token: token.token,
|
access_token: token.token,
|
||||||
refresh_token: token.refresh_token,
|
refresh_token: token.refresh_token,
|
||||||
|
created_at: DateTime.to_unix(inserted_at),
|
||||||
expires_in: 60 * 10,
|
expires_in: 60 * 10,
|
||||||
scope: "read write follow"
|
scope: "read write follow"
|
||||||
}
|
}
|
||||||
|
|
@ -116,6 +121,18 @@ defmodule Pleroma.Web.OAuth.OAuthController do
|
||||||
token_exchange(conn, params)
|
token_exchange(conn, params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def token_revoke(conn, %{"token" => token} = params) do
|
||||||
|
with %App{} = app <- get_app_from_request(conn, params),
|
||||||
|
%Token{} = token <- Repo.get_by(Token, token: token, app_id: app.id),
|
||||||
|
{:ok, %Token{}} <- Repo.delete(token) do
|
||||||
|
json(conn, %{})
|
||||||
|
else
|
||||||
|
_error ->
|
||||||
|
# RFC 7009: invalid tokens [in the request] do not cause an error response
|
||||||
|
json(conn, %{})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
defp fix_padding(token) do
|
defp fix_padding(token) do
|
||||||
token
|
token
|
||||||
|> Base.url_decode64!(padding: false)
|
|> Base.url_decode64!(padding: false)
|
||||||
|
|
|
||||||
|
|
@ -9,47 +9,57 @@ defmodule Pleroma.Web.Router do
|
||||||
@public Keyword.get(@instance, :public)
|
@public Keyword.get(@instance, :public)
|
||||||
@registrations_open Keyword.get(@instance, :registrations_open)
|
@registrations_open Keyword.get(@instance, :registrations_open)
|
||||||
|
|
||||||
def user_fetcher(username_or_email) do
|
|
||||||
{
|
|
||||||
:ok,
|
|
||||||
cond do
|
|
||||||
# First, try logging in as if it was a name
|
|
||||||
user = Repo.get_by(User, %{nickname: username_or_email}) ->
|
|
||||||
user
|
|
||||||
|
|
||||||
# If we get nil, we try using it as an email
|
|
||||||
user = Repo.get_by(User, %{email: username_or_email}) ->
|
|
||||||
user
|
|
||||||
end
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
pipeline :api do
|
pipeline :api do
|
||||||
plug(:accepts, ["json"])
|
plug(:accepts, ["json"])
|
||||||
plug(:fetch_session)
|
plug(:fetch_session)
|
||||||
plug(Pleroma.Plugs.OAuthPlug)
|
plug(Pleroma.Plugs.OAuthPlug)
|
||||||
plug(Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true})
|
plug(Pleroma.Plugs.BasicAuthDecoderPlug)
|
||||||
|
plug(Pleroma.Plugs.UserFetcherPlug)
|
||||||
|
plug(Pleroma.Plugs.SessionAuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.LegacyAuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.AuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.UserEnabledPlug)
|
||||||
|
plug(Pleroma.Plugs.SetUserSessionIdPlug)
|
||||||
|
plug(Pleroma.Plugs.EnsureUserKeyPlug)
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline :authenticated_api do
|
pipeline :authenticated_api do
|
||||||
plug(:accepts, ["json"])
|
plug(:accepts, ["json"])
|
||||||
plug(:fetch_session)
|
plug(:fetch_session)
|
||||||
plug(Pleroma.Plugs.OAuthPlug)
|
plug(Pleroma.Plugs.OAuthPlug)
|
||||||
plug(Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1})
|
plug(Pleroma.Plugs.BasicAuthDecoderPlug)
|
||||||
|
plug(Pleroma.Plugs.UserFetcherPlug)
|
||||||
|
plug(Pleroma.Plugs.SessionAuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.LegacyAuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.AuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.UserEnabledPlug)
|
||||||
|
plug(Pleroma.Plugs.SetUserSessionIdPlug)
|
||||||
|
plug(Pleroma.Plugs.EnsureAuthenticatedPlug)
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline :mastodon_html do
|
pipeline :mastodon_html do
|
||||||
plug(:accepts, ["html"])
|
plug(:accepts, ["html"])
|
||||||
plug(:fetch_session)
|
plug(:fetch_session)
|
||||||
plug(Pleroma.Plugs.OAuthPlug)
|
plug(Pleroma.Plugs.OAuthPlug)
|
||||||
plug(Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true})
|
plug(Pleroma.Plugs.BasicAuthDecoderPlug)
|
||||||
|
plug(Pleroma.Plugs.UserFetcherPlug)
|
||||||
|
plug(Pleroma.Plugs.SessionAuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.LegacyAuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.AuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.UserEnabledPlug)
|
||||||
|
plug(Pleroma.Plugs.SetUserSessionIdPlug)
|
||||||
|
plug(Pleroma.Plugs.EnsureUserKeyPlug)
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline :pleroma_html do
|
pipeline :pleroma_html do
|
||||||
plug(:accepts, ["html"])
|
plug(:accepts, ["html"])
|
||||||
plug(:fetch_session)
|
plug(:fetch_session)
|
||||||
plug(Pleroma.Plugs.OAuthPlug)
|
plug(Pleroma.Plugs.OAuthPlug)
|
||||||
plug(Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Router.user_fetcher/1, optional: true})
|
plug(Pleroma.Plugs.BasicAuthDecoderPlug)
|
||||||
|
plug(Pleroma.Plugs.UserFetcherPlug)
|
||||||
|
plug(Pleroma.Plugs.SessionAuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.AuthenticationPlug)
|
||||||
|
plug(Pleroma.Plugs.EnsureUserKeyPlug)
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline :well_known do
|
pipeline :well_known do
|
||||||
|
|
@ -93,6 +103,7 @@ defmodule Pleroma.Web.Router do
|
||||||
get("/authorize", OAuthController, :authorize)
|
get("/authorize", OAuthController, :authorize)
|
||||||
post("/authorize", OAuthController, :create_authorization)
|
post("/authorize", OAuthController, :create_authorization)
|
||||||
post("/token", OAuthController, :token_exchange)
|
post("/token", OAuthController, :token_exchange)
|
||||||
|
post("/revoke", OAuthController, :token_revoke)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/api/v1", Pleroma.Web.MastodonAPI do
|
scope "/api/v1", Pleroma.Web.MastodonAPI do
|
||||||
|
|
@ -154,7 +165,15 @@ defmodule Pleroma.Web.Router do
|
||||||
post("/domain_blocks", MastodonAPIController, :block_domain)
|
post("/domain_blocks", MastodonAPIController, :block_domain)
|
||||||
delete("/domain_blocks", MastodonAPIController, :unblock_domain)
|
delete("/domain_blocks", MastodonAPIController, :unblock_domain)
|
||||||
|
|
||||||
|
get("/filters", MastodonAPIController, :get_filters)
|
||||||
|
post("/filters", MastodonAPIController, :create_filter)
|
||||||
|
get("/filters/:id", MastodonAPIController, :get_filter)
|
||||||
|
put("/filters/:id", MastodonAPIController, :update_filter)
|
||||||
|
delete("/filters/:id", MastodonAPIController, :delete_filter)
|
||||||
|
|
||||||
get("/suggestions", MastodonAPIController, :suggestions)
|
get("/suggestions", MastodonAPIController, :suggestions)
|
||||||
|
|
||||||
|
get("/endorsements", MastodonAPIController, :empty_array)
|
||||||
end
|
end
|
||||||
|
|
||||||
scope "/api/web", Pleroma.Web.MastodonAPI do
|
scope "/api/web", Pleroma.Web.MastodonAPI do
|
||||||
|
|
@ -381,6 +400,8 @@ defmodule Pleroma.Web.Router do
|
||||||
scope "/", Fallback do
|
scope "/", Fallback do
|
||||||
get("/registration/:token", RedirectController, :registration_page)
|
get("/registration/:token", RedirectController, :registration_page)
|
||||||
get("/*path", RedirectController, :redirector)
|
get("/*path", RedirectController, :redirector)
|
||||||
|
|
||||||
|
options("/*path", RedirectController, :empty)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -398,4 +419,10 @@ defmodule Fallback.RedirectController do
|
||||||
def registration_page(conn, params) do
|
def registration_page(conn, params) do
|
||||||
redirector(conn, params)
|
redirector(conn, params)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def empty(conn, _params) do
|
||||||
|
conn
|
||||||
|
|> put_status(204)
|
||||||
|
|> text("")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -156,28 +156,39 @@ defmodule Pleroma.Web.TwitterAPI.UtilController do
|
||||||
|> send_resp(200, response)
|
|> send_resp(200, response)
|
||||||
|
|
||||||
_ ->
|
_ ->
|
||||||
json(conn, %{
|
data = %{
|
||||||
site: %{
|
|
||||||
name: Keyword.get(@instance, :name),
|
name: Keyword.get(@instance, :name),
|
||||||
description: Keyword.get(@instance, :description),
|
description: Keyword.get(@instance, :description),
|
||||||
server: Web.base_url(),
|
server: Web.base_url(),
|
||||||
textlimit: to_string(Keyword.get(@instance, :limit)),
|
textlimit: to_string(Keyword.get(@instance, :limit)),
|
||||||
closed: if(Keyword.get(@instance, :registrations_open), do: "0", else: "1"),
|
closed: if(Keyword.get(@instance, :registrations_open), do: "0", else: "1"),
|
||||||
private: if(Keyword.get(@instance, :public, true), do: "0", else: "1"),
|
private: if(Keyword.get(@instance, :public, true), do: "0", else: "1")
|
||||||
pleromafe: %{
|
}
|
||||||
|
|
||||||
|
pleroma_fe = %{
|
||||||
theme: Keyword.get(@instance_fe, :theme),
|
theme: Keyword.get(@instance_fe, :theme),
|
||||||
background: Keyword.get(@instance_fe, :background),
|
background: Keyword.get(@instance_fe, :background),
|
||||||
logo: Keyword.get(@instance_fe, :logo),
|
logo: Keyword.get(@instance_fe, :logo),
|
||||||
|
logoMask: Keyword.get(@instance_fe, :logo_mask),
|
||||||
|
logoMargin: Keyword.get(@instance_fe, :logo_margin),
|
||||||
redirectRootNoLogin: Keyword.get(@instance_fe, :redirect_root_no_login),
|
redirectRootNoLogin: Keyword.get(@instance_fe, :redirect_root_no_login),
|
||||||
redirectRootLogin: Keyword.get(@instance_fe, :redirect_root_login),
|
redirectRootLogin: Keyword.get(@instance_fe, :redirect_root_login),
|
||||||
chatDisabled: !Keyword.get(@instance_chat, :enabled),
|
chatDisabled: !Keyword.get(@instance_chat, :enabled),
|
||||||
showInstanceSpecificPanel: Keyword.get(@instance_fe, :show_instance_panel),
|
showInstanceSpecificPanel: Keyword.get(@instance_fe, :show_instance_panel),
|
||||||
scopeOptionsEnabled: Keyword.get(@instance_fe, :scope_options_enabled),
|
scopeOptionsEnabled: Keyword.get(@instance_fe, :scope_options_enabled),
|
||||||
collapseMessageWithSubject:
|
collapseMessageWithSubject: Keyword.get(@instance_fe, :collapse_message_with_subject)
|
||||||
Keyword.get(@instance_fe, :collapse_message_with_subject)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
})
|
managed_config = Keyword.get(@instance, :managed_config)
|
||||||
|
|
||||||
|
data =
|
||||||
|
if managed_config do
|
||||||
|
data |> Map.put("pleromafe", pleroma_fe)
|
||||||
|
else
|
||||||
|
data
|
||||||
|
end
|
||||||
|
|
||||||
|
json(conn, %{site: data})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
|
||||||
alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, ActivityView}
|
alias Pleroma.Web.TwitterAPI.{TwitterAPI, UserView, ActivityView}
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
alias Pleroma.Formatter
|
alias Pleroma.Formatter
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
defp user_by_ap_id(user_list, ap_id) do
|
defp user_by_ap_id(user_list, ap_id) do
|
||||||
Enum.find(user_list, fn %{ap_id: user_id} -> ap_id == user_id end)
|
Enum.find(user_list, fn %{ap_id: user_id} -> ap_id == user_id end)
|
||||||
|
|
@ -167,7 +168,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
|
||||||
{summary, content} = ActivityView.render_content(object)
|
{summary, content} = ActivityView.render_content(object)
|
||||||
|
|
||||||
html =
|
html =
|
||||||
HtmlSanitizeEx.basic_html(content)
|
HTML.filter_tags(content, User.html_filter_policy(opts[:for]))
|
||||||
|> Formatter.emojify(object["emoji"])
|
|> Formatter.emojify(object["emoji"])
|
||||||
|
|
||||||
video =
|
video =
|
||||||
|
|
@ -184,7 +185,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ActivityRepresenter do
|
||||||
"uri" => activity.data["object"]["id"],
|
"uri" => activity.data["object"]["id"],
|
||||||
"user" => UserView.render("show.json", %{user: user, for: opts[:for]}),
|
"user" => UserView.render("show.json", %{user: user, for: opts[:for]}),
|
||||||
"statusnet_html" => html,
|
"statusnet_html" => html,
|
||||||
"text" => HtmlSanitizeEx.strip_tags(content),
|
"text" => HTML.strip_tags(content),
|
||||||
"is_local" => activity.local,
|
"is_local" => activity.local,
|
||||||
"is_post_verb" => true,
|
"is_post_verb" => true,
|
||||||
"created_at" => created_at,
|
"created_at" => created_at,
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ defmodule Pleroma.Web.TwitterAPI.Representers.ObjectRepresenter do
|
||||||
def to_map(%Object{data: %{"url" => url} = data}, _opts) when is_binary(url) do
|
def to_map(%Object{data: %{"url" => url} = data}, _opts) when is_binary(url) do
|
||||||
%{
|
%{
|
||||||
url: url |> Pleroma.Web.MediaProxy.url(),
|
url: url |> Pleroma.Web.MediaProxy.url(),
|
||||||
mimetype: data["mediaType"] || url["mimeType"],
|
mimetype: data["mediaType"] || data["mimeType"],
|
||||||
id: data["uuid"],
|
id: data["uuid"],
|
||||||
oembed: false,
|
oembed: false,
|
||||||
description: data["name"]
|
description: data["name"]
|
||||||
|
|
|
||||||
|
|
@ -443,6 +443,20 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
|
||||||
user
|
user
|
||||||
end
|
end
|
||||||
|
|
||||||
|
user =
|
||||||
|
if no_rich_text = params["no_rich_text"] do
|
||||||
|
with no_rich_text <- no_rich_text == "true",
|
||||||
|
new_info <- Map.put(user.info, "no_rich_text", no_rich_text),
|
||||||
|
change <- User.info_changeset(user, %{info: new_info}),
|
||||||
|
{:ok, user} <- User.update_and_set_cache(change) do
|
||||||
|
user
|
||||||
|
else
|
||||||
|
_e -> user
|
||||||
|
end
|
||||||
|
else
|
||||||
|
user
|
||||||
|
end
|
||||||
|
|
||||||
user =
|
user =
|
||||||
if default_scope = params["default_scope"] do
|
if default_scope = params["default_scope"] do
|
||||||
with new_info <- Map.put(user.info, "default_scope", default_scope),
|
with new_info <- Map.put(user.info, "default_scope", default_scope),
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.Formatter
|
alias Pleroma.Formatter
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
import Ecto.Query
|
import Ecto.Query
|
||||||
|
|
||||||
|
|
@ -181,6 +182,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
|
||||||
def render("activity.json", %{activity: %{data: %{"type" => "Like"}} = activity} = opts) do
|
def render("activity.json", %{activity: %{data: %{"type" => "Like"}} = activity} = opts) do
|
||||||
user = get_user(activity.data["actor"], opts)
|
user = get_user(activity.data["actor"], opts)
|
||||||
liked_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"])
|
liked_activity = Activity.get_create_activity_by_object_ap_id(activity.data["object"])
|
||||||
|
liked_activity_id = if liked_activity, do: liked_activity.id, else: nil
|
||||||
|
|
||||||
created_at =
|
created_at =
|
||||||
activity.data["published"]
|
activity.data["published"]
|
||||||
|
|
@ -197,7 +199,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
|
||||||
"is_post_verb" => false,
|
"is_post_verb" => false,
|
||||||
"uri" => "tag:#{activity.data["id"]}:objectType=Favourite",
|
"uri" => "tag:#{activity.data["id"]}:objectType=Favourite",
|
||||||
"created_at" => created_at,
|
"created_at" => created_at,
|
||||||
"in_reply_to_status_id" => liked_activity.id,
|
"in_reply_to_status_id" => liked_activity_id,
|
||||||
"external_url" => activity.data["id"],
|
"external_url" => activity.data["id"],
|
||||||
"activity_type" => "like"
|
"activity_type" => "like"
|
||||||
}
|
}
|
||||||
|
|
@ -231,7 +233,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
|
||||||
{summary, content} = render_content(object)
|
{summary, content} = render_content(object)
|
||||||
|
|
||||||
html =
|
html =
|
||||||
HtmlSanitizeEx.basic_html(content)
|
HTML.filter_tags(content, User.html_filter_policy(opts[:for]))
|
||||||
|> Formatter.emojify(object["emoji"])
|
|> Formatter.emojify(object["emoji"])
|
||||||
|
|
||||||
%{
|
%{
|
||||||
|
|
@ -239,7 +241,7 @@ defmodule Pleroma.Web.TwitterAPI.ActivityView do
|
||||||
"uri" => activity.data["object"]["id"],
|
"uri" => activity.data["object"]["id"],
|
||||||
"user" => UserView.render("show.json", %{user: user, for: opts[:for]}),
|
"user" => UserView.render("show.json", %{user: user, for: opts[:for]}),
|
||||||
"statusnet_html" => html,
|
"statusnet_html" => html,
|
||||||
"text" => HtmlSanitizeEx.strip_tags(content),
|
"text" => HTML.strip_tags(content),
|
||||||
"is_local" => activity.local,
|
"is_local" => activity.local,
|
||||||
"is_post_verb" => true,
|
"is_post_verb" => true,
|
||||||
"created_at" => created_at,
|
"created_at" => created_at,
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
|
||||||
alias Pleroma.Formatter
|
alias Pleroma.Formatter
|
||||||
alias Pleroma.Web.CommonAPI.Utils
|
alias Pleroma.Web.CommonAPI.Utils
|
||||||
alias Pleroma.Web.MediaProxy
|
alias Pleroma.Web.MediaProxy
|
||||||
|
alias Pleroma.HTML
|
||||||
|
|
||||||
def render("show.json", %{user: user = %User{}} = assigns) do
|
def render("show.json", %{user: user = %User{}} = assigns) do
|
||||||
render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns)
|
render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns)
|
||||||
|
|
@ -38,9 +39,8 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
|
||||||
|
|
||||||
data = %{
|
data = %{
|
||||||
"created_at" => user.inserted_at |> Utils.format_naive_asctime(),
|
"created_at" => user.inserted_at |> Utils.format_naive_asctime(),
|
||||||
"description" =>
|
"description" => HTML.strip_tags((user.bio || "") |> String.replace("<br>", "\n")),
|
||||||
HtmlSanitizeEx.strip_tags((user.bio || "") |> String.replace("<br>", "\n")),
|
"description_html" => HTML.filter_tags(user.bio, User.html_filter_policy(assigns[:for])),
|
||||||
"description_html" => HtmlSanitizeEx.basic_html(user.bio),
|
|
||||||
"favourites_count" => 0,
|
"favourites_count" => 0,
|
||||||
"followers_count" => user_info[:follower_count],
|
"followers_count" => user_info[:follower_count],
|
||||||
"following" => following,
|
"following" => following,
|
||||||
|
|
@ -49,7 +49,7 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
|
||||||
"friends_count" => user_info[:following_count],
|
"friends_count" => user_info[:following_count],
|
||||||
"id" => user.id,
|
"id" => user.id,
|
||||||
"name" => user.name,
|
"name" => user.name,
|
||||||
"name_html" => HtmlSanitizeEx.strip_tags(user.name) |> Formatter.emojify(emoji),
|
"name_html" => HTML.strip_tags(user.name) |> Formatter.emojify(emoji),
|
||||||
"profile_image_url" => image,
|
"profile_image_url" => image,
|
||||||
"profile_image_url_https" => image,
|
"profile_image_url_https" => image,
|
||||||
"profile_image_url_profile_size" => image,
|
"profile_image_url_profile_size" => image,
|
||||||
|
|
@ -64,7 +64,8 @@ defmodule Pleroma.Web.TwitterAPI.UserView do
|
||||||
"background_image" => image_url(user.info["background"]) |> MediaProxy.url(),
|
"background_image" => image_url(user.info["background"]) |> MediaProxy.url(),
|
||||||
"is_local" => user.local,
|
"is_local" => user.local,
|
||||||
"locked" => !!user.info["locked"],
|
"locked" => !!user.info["locked"],
|
||||||
"default_scope" => user.info["default_scope"] || "public"
|
"default_scope" => user.info["default_scope"] || "public",
|
||||||
|
"no_rich_text" => user.info["no_rich_text"] || false
|
||||||
}
|
}
|
||||||
|
|
||||||
if assigns[:token] do
|
if assigns[:token] do
|
||||||
|
|
|
||||||
4
mix.exs
|
|
@ -50,7 +50,9 @@ defmodule Pleroma.Mixfile do
|
||||||
{:ex_aws_s3, "~> 2.0"},
|
{:ex_aws_s3, "~> 2.0"},
|
||||||
{:ex_machina, "~> 2.2", only: :test},
|
{:ex_machina, "~> 2.2", only: :test},
|
||||||
{:credo, "~> 0.9.3", only: [:dev, :test]},
|
{:credo, "~> 0.9.3", only: [:dev, :test]},
|
||||||
{:mock, "~> 0.3.1", only: :test}
|
{:mock, "~> 0.3.1", only: :test},
|
||||||
|
{:crypt,
|
||||||
|
git: "https://github.com/msantos/crypt", ref: "1f2b58927ab57e72910191a7ebaeff984382a1d3"}
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
1
mix.lock
|
|
@ -8,6 +8,7 @@
|
||||||
"cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"},
|
"cowboy": {:hex, :cowboy, "1.1.2", "61ac29ea970389a88eca5a65601460162d370a70018afe6f949a29dca91f3bb0", [:rebar3], [{:cowlib, "~> 1.0.2", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.3.2", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm"},
|
||||||
"cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], [], "hexpm"},
|
"cowlib": {:hex, :cowlib, "1.0.2", "9d769a1d062c9c3ac753096f868ca121e2730b9a377de23dec0f7e08b1df84ee", [:make], [], "hexpm"},
|
||||||
"credo": {:hex, :credo, "0.9.3", "76fa3e9e497ab282e0cf64b98a624aa11da702854c52c82db1bf24e54ab7c97a", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:poison, ">= 0.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
|
"credo": {:hex, :credo, "0.9.3", "76fa3e9e497ab282e0cf64b98a624aa11da702854c52c82db1bf24e54ab7c97a", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:poison, ">= 0.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm"},
|
||||||
|
"crypt": {:git, "https://github.com/msantos/crypt", "1f2b58927ab57e72910191a7ebaeff984382a1d3", [ref: "1f2b58927ab57e72910191a7ebaeff984382a1d3"]},
|
||||||
"db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
|
"db_connection": {:hex, :db_connection, "1.1.3", "89b30ca1ef0a3b469b1c779579590688561d586694a3ce8792985d4d7e575a61", [:mix], [{:connection, "~> 1.0.2", [hex: :connection, repo: "hexpm", optional: false]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
|
||||||
"decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"},
|
"decimal": {:hex, :decimal, "1.5.0", "b0433a36d0e2430e3d50291b1c65f53c37d56f83665b43d79963684865beab68", [:mix], [], "hexpm"},
|
||||||
"ecto": {:hex, :ecto, "2.2.10", "e7366dc82f48f8dd78fcbf3ab50985ceeb11cb3dc93435147c6e13f2cda0992e", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
|
"ecto": {:hex, :ecto, "2.2.10", "e7366dc82f48f8dd78fcbf3ab50985ceeb11cb3dc93435147c6e13f2cda0992e", [:mix], [{:db_connection, "~> 1.1", [hex: :db_connection, repo: "hexpm", optional: true]}, {:decimal, "~> 1.2", [hex: :decimal, repo: "hexpm", optional: false]}, {:mariaex, "~> 0.8.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0", [hex: :poison, repo: "hexpm", optional: true]}, {:poolboy, "~> 1.5", [hex: :poolboy, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:sbroker, "~> 1.0", [hex: :sbroker, repo: "hexpm", optional: true]}], "hexpm"},
|
||||||
|
|
|
||||||
20
priv/repo/migrations/20180813003722_create_filters.exs
Normal file
|
|
@ -0,0 +1,20 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.CreateFilters do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
create table(:filters) do
|
||||||
|
add :user_id, references(:users, on_delete: :delete_all)
|
||||||
|
add :filter_id, :integer
|
||||||
|
add :hide, :boolean
|
||||||
|
add :phrase, :string
|
||||||
|
add :context, {:array, :string}
|
||||||
|
add :expires_at, :datetime
|
||||||
|
add :whole_word, :boolean
|
||||||
|
|
||||||
|
timestamps()
|
||||||
|
end
|
||||||
|
|
||||||
|
create index(:filters, [:user_id])
|
||||||
|
create index(:filters, [:phrase], where: "hide = true", name: :hided_phrases_index)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.UsersAddIsModeratorIndex do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
create index(:users, ["(info->'is_moderator')"], name: :users_is_moderator_index, using: :gin)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
defmodule Pleroma.Repo.Migrations.UsersAddLastRefreshedAt do
|
||||||
|
use Ecto.Migration
|
||||||
|
|
||||||
|
def change do
|
||||||
|
alter table(:users) do
|
||||||
|
add :last_refreshed_at, :naive_datetime
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,4)" id="g20"><path id="path22" style="fill:#e6e7e8;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -20,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 20,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(19.0029,23.5781)" id="g24"><path id="path26" style="fill:#be1931;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-6.163 c 0.728,0.087 1.435,0.179 2.119,0.265 1.326,0.178 2.286,0.286 2.879,0.332 0.048,0.11 0.103,0.232 0.168,0.363 0.199,0.641 0.463,1.645 0.798,3.015 0.264,1.084 0.393,1.769 0.393,2.057 0,0.353 -0.338,0.529 -1.024,0.529 C 4.292,0.398 2.637,0.277 0.36,0.035 0.232,0.035 0.107,0.022 0,0 m -7.259,-6.69 c 1.812,0.085 3.545,0.195 5.203,0.327 l 0,6.132 c -1.702,-0.199 -3.347,-0.464 -4.937,-0.796 -0.31,-0.111 -0.596,-0.187 -0.862,-0.232 0,-0.264 0.022,-0.529 0.067,-0.793 0.265,-2.012 0.441,-3.56 0.529,-4.638 m -3.346,7.221 c 0.53,0 0.995,-0.078 1.391,-0.233 0.244,-0.066 0.453,-0.143 0.63,-0.231 0.796,0.044 1.612,0.122 2.453,0.231 1.104,0.134 2.463,0.298 4.075,0.498 l 0,2.319 c 0,1.613 -0.188,2.948 -0.563,4.01 -0.155,0.332 -0.233,0.551 -0.233,0.662 0,0.331 0.133,0.497 0.398,0.497 0.707,0 1.36,-0.089 1.955,-0.266 C 0.187,7.82 0.528,7.565 0.528,7.257 0.528,7.146 0.486,6.915 0.395,6.561 0.13,5.876 0,4.606 0,2.751 L 0,1.028 c 1.299,0.132 2.723,0.276 4.271,0.43 0.706,0.045 1.38,0.166 2.022,0.366 0.463,0.088 0.739,0.132 0.83,0.132 0.264,0 0.837,-0.222 1.72,-0.662 C 9.771,0.741 10.236,0.309 10.236,0 c 0,-0.242 -0.12,-0.486 -0.362,-0.729 C 9.055,-1.61 8.466,-2.538 8.115,-3.512 L 7.317,-5.203 C 7.187,-5.532 7.041,-5.787 6.892,-5.963 6.934,-5.984 6.978,-6.009 7.02,-6.03 c 0.507,-0.311 0.76,-0.586 0.76,-0.828 0,-0.199 -0.182,-0.31 -0.559,-0.332 -1.7,0 -3.237,-0.088 -4.607,-0.266 L 0,-7.652 -0.034,-12.095 c 0,-2.009 -0.069,-3.62 -0.198,-4.838 -0.134,-1.368 -0.334,-2.34 -0.598,-2.914 -0.243,-0.486 -0.443,-0.731 -0.596,-0.731 -0.09,0 -0.232,0.266 -0.431,0.798 -0.133,0.617 -0.199,1.687 -0.199,3.214 l 0,8.749 -1.789,-0.167 c -1.194,-0.112 -2.111,-0.168 -2.75,-0.168 -0.266,0 -0.488,0.024 -0.664,0.069 -0.044,-0.2 -0.11,-0.376 -0.197,-0.533 -0.133,-0.287 -0.277,-0.43 -0.433,-0.43 -0.197,0 -0.385,0.154 -0.562,0.465 -0.287,0.438 -0.442,0.892 -0.464,1.358 l -0.397,2.584 c -0.155,1.349 -0.332,2.286 -0.531,2.818 -0.111,0.551 -0.409,1.081 -0.894,1.59 -0.177,0.11 -0.266,0.187 -0.266,0.231 0,0.354 0.133,0.531 0.398,0.531"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E6E7E8" d="M32 32c0 2.209-1.791 4-4 4H8c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h20c2.209 0 4 1.791 4 4v28z"/><path fill="#BE1931" d="M8.397 11.891c.53 0 .996.078 1.392.232.244.066.453.143.63.231.796-.044 1.612-.122 2.453-.231 1.104-.134 2.463-.297 4.076-.497V9.307c0-1.613-.188-2.948-.563-4.01-.155-.332-.233-.552-.233-.662 0-.331.133-.498.398-.498.706 0 1.359.089 1.954.266.686.198 1.028.453 1.028.761 0 .111-.042.342-.134.696-.265.685-.395 1.955-.395 3.811v1.723c1.299-.132 2.723-.276 4.271-.43.706-.045 1.381-.166 2.023-.366.463-.088.739-.132.83-.132.264 0 .837.222 1.72.662.928.553 1.394.984 1.394 1.293 0 .242-.12.486-.362.729-.819.881-1.408 1.809-1.759 2.782l-.798 1.691c-.13.329-.276.583-.426.76l.128.067c.508.311.761.586.761.829 0 .198-.183.309-.56.332-1.699 0-3.236.088-4.606.266l-2.614.196-.034 4.442c0 2.009-.069 3.62-.198 4.838-.133 1.368-.333 2.341-.598 2.914-.245.488-.445.733-.598.733-.089 0-.232-.266-.431-.798-.132-.617-.198-1.687-.198-3.214v-8.749l-1.789.167c-1.194.111-2.111.168-2.75.168-.266 0-.488-.024-.664-.069-.044.2-.11.376-.198.533-.133.287-.277.43-.432.43-.198 0-.385-.154-.562-.465-.287-.438-.442-.892-.464-1.358l-.398-2.585c-.155-1.348-.332-2.286-.531-2.818-.111-.551-.409-1.081-.894-1.59-.177-.11-.266-.186-.266-.23 0-.354.133-.531.397-.531zm3.347 7.221c1.812-.085 3.545-.196 5.203-.328v-6.132c-1.702.199-3.347.464-4.937.796-.31.111-.597.188-.862.232 0 .265.022.53.067.793.265 2.013.441 3.561.529 4.639zm7.259-6.69v6.163c.728-.087 1.435-.179 2.119-.265 1.326-.178 2.286-.286 2.879-.331.048-.11.103-.232.168-.363.199-.641.463-1.646.798-3.016.264-1.084.394-1.768.394-2.056 0-.353-.339-.529-1.024-.529-1.041 0-2.696.121-4.973.363-.13-.001-.254.012-.361.034z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 1.7 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,4)" id="g20"><path id="path22" style="fill:#e6e7e8;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -20,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 20,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(11,29)" id="g24"><path id="path26" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C -2.519,0 -4.583,-1.87 -4.929,-4.294 -4.198,-3.503 -3.161,-3 -2,-3 0.209,-3 2,-4.791 2,-7 2,-9 3.497,-9.198 2.706,-9.929 5.13,-9.583 5,-7.519 5,-5 5,-2.239 2.761,0 0,0"/></g><g transform="translate(23,22)" id="g28"><path id="path30" style="fill:#55acee;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,2.209 1.791,4 4,4 5.161,4 6.198,3.497 6.929,2.706 6.583,5.13 4.52,7 2,7 -0.762,7 -3,4.761 -3,2 -3,-0.519 -3.131,-2.583 -0.707,-2.929 -1.497,-2.198 0,-2 0,0"/></g><g transform="translate(14,24)" id="g32"><path id="path34" style="fill:#ffac33;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,4.971 4,9 4,9 4,9 8,4.971 8,0 8,-4.971 6.209,-9 4,-9 1.791,-9 0,-4.971 0,0"/></g><g transform="translate(11.7065,14.9287)" id="g36"><path id="path38" style="fill:#553788;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0.791,-0.73 1.294,-1.768 1.294,-2.929 0,-2.209 -1.791,-4 -4,-4 -1.162,0 -2.199,0.503 -2.929,1.293 0.345,-2.424 2.409,-4.293 4.929,-4.293 2.761,0 5,2.239 5,5 0,2.52 -1.87,4.583 -4.294,4.929"/></g><g transform="translate(27,8)" id="g40"><path id="path42" style="fill:#553788;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -2.209,0 -4,1.791 -4,4 0,1.161 0.503,2.198 1.293,2.929 C -5.131,6.583 -7,4.52 -7,2 c 0,-2.762 2.238,-5 5,-5 2.52,0 4.583,1.869 4.929,4.293 C 2.198,0.503 1.161,0 0,0"/></g><g transform="translate(14,12)" id="g44"><path id="path46" style="fill:#9266cc;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,-4.971 3,-9 4,-9 5,-9 8,-4.971 8,0 8,4.971 6.209,9 4,9 1.791,9 0,4.971 0,0"/></g><g transform="translate(13,19)" id="g48"><path id="path50" style="fill:#edbb9f;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,3.866 3,4 5,4 7,4 10,3.866 10,0 10,-3.865 7.762,-7 5,-7 2.239,-7 0,-3.865 0,0"/></g><g transform="translate(17.0005,19)" id="g52"><path id="path54" style="fill:#662113;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.552 -0.448,-1 -1,-1 -0.552,0 -1,0.448 -1,1 0,0.552 0.448,1 1,1 0.552,0 1,-0.448 1,-1"/></g><g transform="translate(21,19)" id="g56"><path id="path58" style="fill:#662113;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.552 -0.447,-1 -1,-1 -0.552,0 -1,0.448 -1,1 0,0.552 0.448,1 1,1 0.553,0 1,-0.448 1,-1"/></g><g transform="translate(18,14)" id="g60"><path id="path62" style="fill:#662113;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 1.105,0 2,0.896 2,2 L -2,2 C -2,0.896 -1.104,0 0,0"/></g><g transform="translate(7,25)" id="g64"><path id="path66" style="fill:#a0041e;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.552 -0.448,-1 -1,-1 -0.552,0 -1,0.448 -1,1 0,0.552 0.448,1 1,1 0.552,0 1,-0.448 1,-1"/></g><g transform="translate(29,25)" id="g68"><path id="path70" style="fill:#226699;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,-0.552 0.447,-1 1,-1 1.553,-1 2,-0.552 2,0 2,0.552 1.553,1 1,1 0.447,1 0,0.552 0,0"/></g><g transform="translate(17,33)" id="g72"><path id="path74" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,0.552 0.448,1 1,1 1.552,1 2,0.552 2,0 2,-0.552 1.552,-1 1,-1 0.448,-1 0,-0.552 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E6E7E8" d="M32 32c0 2.209-1.791 4-4 4H8c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h20c2.209 0 4 1.791 4 4v28z"/><path fill="#DD2E44" d="M11 7c-2.519 0-4.583 1.87-4.929 4.293C6.802 10.503 7.839 10 9 10c2.209 0 4 1.791 4 4 0 2 1.497 2.198.707 2.929C16.13 16.583 16 14.519 16 12c0-2.761-2.239-5-5-5z"/><path fill="#55ACEE" d="M23 14c0-2.209 1.791-4 4-4 1.161 0 2.198.503 2.929 1.293C29.583 8.87 27.52 7 25 7c-2.762 0-5 2.239-5 5 0 2.519-.131 4.583 2.293 4.929C21.503 16.198 23 16 23 14z"/><path fill="#FFAC33" d="M14 12c0-4.971 4-9 4-9s4 4.029 4 9-1.791 9-4 9-4-4.029-4-9z"/><path fill="#553788" d="M11.707 21.071C12.497 21.802 13 22.839 13 24c0 2.209-1.791 4-4 4-1.161 0-2.198-.503-2.929-1.293C6.417 29.131 8.481 31 11 31c2.761 0 5-2.238 5-5 0-2.52-1.87-4.583-4.293-4.929zM27 28c-2.209 0-4-1.791-4-4 0-1.161.503-2.198 1.293-2.929C21.869 21.417 20 23.48 20 26c0 2.762 2.238 5 5 5 2.52 0 4.583-1.869 4.929-4.293C29.198 27.497 28.161 28 27 28z"/><path fill="#9266CC" d="M14 24c0 4.971 3 9 4 9s4-4.029 4-9c0-.874-.055-1.719-.159-2.519C21.357 17.737 19.82 15 18 15c-1.82 0-3.357 2.737-3.841 6.481-.104.8-.159 1.645-.159 2.519z"/><path fill="#EDBB9F" d="M13 17c0-3.866 3-4 5-4s5 .134 5 4c0 3.865-2.238 7-5 7-2.761 0-5-3.135-5-7z"/><circle fill="#662113" cx="16" cy="17" r="1"/><circle fill="#662113" cx="20" cy="17" r="1"/><path fill="#662113" d="M18 22c1.104 0 2-.896 2-2h-4c0 1.104.896 2 2 2z"/><circle fill="#A0041E" cx="6" cy="11" r="1"/><circle fill="#269" cx="30" cy="11" r="1"/><circle fill="#DD2E44" cx="18" cy="3" r="1"/></svg>
|
||||||
|
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 1.6 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(15.0874,15.6191)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 5.891,0 3.008,8.992 2.946,8.992 0,0 Z m -0.341,11.256 c 0.527,1.426 1.736,2.573 3.318,2.573 1.643,0 2.791,-1.085 3.317,-2.573 l 6.078,-16.867 c 0.185,-0.496 0.248,-0.931 0.248,-1.148 0,-1.209 -0.993,-2.046 -2.139,-2.046 -1.303,0 -1.954,0.682 -2.264,1.612 l -0.93,2.915 -8.62,0 -0.93,-2.884 c -0.31,-0.961 -0.962,-1.643 -2.233,-1.643 -1.24,0 -2.294,0.93 -2.294,2.17 0,0.496 0.155,0.868 0.217,1.024 l 6.232,16.867 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#DD2E44" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M14.747 9.125c.527-1.426 1.736-2.573 3.317-2.573 1.643 0 2.792 1.085 3.318 2.573l6.077 16.867c.186.496.248.931.248 1.147 0 1.209-.992 2.046-2.139 2.046-1.303 0-1.954-.682-2.264-1.611l-.931-2.915h-8.62l-.93 2.884c-.31.961-.961 1.642-2.232 1.642-1.24 0-2.294-.93-2.294-2.17 0-.496.155-.868.217-1.023l6.233-16.867zm.34 11.256h5.891l-2.883-8.992h-.062l-2.946 8.992z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 576 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(15.1489,11.0928)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.659,0 c 1.675,0 2.915,0.961 2.915,2.697 0,1.458 -1.117,2.45 -3.287,2.45 L 0,5.147 0,0 Z m 0,9.24 2.419,0 c 1.519,0 2.511,0.899 2.511,2.449 0,1.457 -1.147,2.202 -2.511,2.202 L 0,13.891 0,9.24 Z m -4.65,6.418 c 0,1.488 1.023,2.325 2.449,2.325 l 5.953,0 c 3.224,0 5.83,-2.17 5.83,-5.457 0,-2.17 -0.901,-3.628 -2.885,-4.557 l 0,-0.063 c 2.637,-0.372 4.713,-2.573 4.713,-5.27 0,-4.372 -2.914,-6.729 -7.194,-6.729 l -6.386,0 c -1.427,0 -2.48,0.9 -2.48,2.357 l 0,17.394 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#DD2E44" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M10.498 9.249c0-1.488 1.023-2.325 2.449-2.325H18.9c3.224 0 5.83 2.17 5.83 5.457 0 2.17-.9 3.628-2.885 4.558v.062c2.637.372 4.713 2.573 4.713 5.271 0 4.372-2.914 6.729-7.193 6.729h-6.386c-1.427 0-2.481-.899-2.481-2.356V9.249zm4.651 6.418h2.419c1.519 0 2.511-.899 2.511-2.45 0-1.457-1.147-2.201-2.511-2.201h-2.419v4.651zm0 9.24h3.659c1.674 0 2.915-.961 2.915-2.697 0-1.458-1.117-2.45-3.287-2.45h-3.287v5.147z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 621 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(24.0156,17.999)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,3.872 -2.016,7.36 -6.016,7.36 -4,0 -6.015,-3.488 -6.015,-7.36 0,-3.903 1.951,-7.359 6.015,-7.359 C -1.951,-7.359 0,-3.903 0,0 m -17.023,0 c 0,6.656 4.48,11.776 11.007,11.776 6.432,0 11.008,-5.28 11.008,-11.776 0,-6.623 -4.449,-11.774 -11.008,-11.774 -6.495,0 -11.007,5.151 -11.007,11.774"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#DD2E44" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M6.993 18.001c0-6.656 4.48-11.776 11.007-11.776 6.432 0 11.008 5.28 11.008 11.776 0 6.623-4.449 11.774-11.008 11.774-6.496 0-11.007-5.151-11.007-11.774zm17.023 0c0-3.872-2.016-7.36-6.016-7.36s-6.015 3.488-6.015 7.36c0 3.903 1.952 7.359 6.015 7.359 4.065 0 6.016-3.456 6.016-7.359z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 495 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#226699;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(16,18)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.063,0 c 2.017,0 3.296,1.465 3.296,3.385 0,1.92 -1.279,3.391 -3.296,3.391 L 0,6.776 0,0 Z M -5,8.504 C -5,10.008 -4.104,11 -2.504,11 l 5.664,0 c 4.703,0 8.192,-2.944 8.192,-7.52 0,-4.67 -3.618,-7.48 -8,-7.48 L 0,-4 0,-9.479 c 0,-1.599 -1.024,-2.496 -2.4,-2.496 -1.376,0 -2.6,0.897 -2.6,2.496 l 0,17.983 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#269" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M11 9.496C11 7.992 11.896 7 13.496 7h5.665c4.703 0 8.191 2.944 8.191 7.52 0 4.67-3.617 7.48-8 7.48H16v5.479c0 1.6-1.024 2.496-2.4 2.496s-2.6-.897-2.6-2.496V9.496zM16 18h3.062c2.018 0 3.297-1.465 3.297-3.385 0-1.92-1.279-3.392-3.297-3.392H16V18z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 456 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(7.458,15.7646)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 5.32,0 2.716,8.119 2.66,8.119 0,0 Z m -0.308,10.163 c 0.476,1.288 1.568,2.324 2.996,2.324 1.484,0 2.52,-0.979 2.997,-2.324 l 5.488,-15.231 c 0.168,-0.449 0.223,-0.84 0.223,-1.036 0,-1.092 -0.896,-1.848 -1.931,-1.848 -1.177,0 -1.765,0.616 -2.044,1.456 l -0.879,2.731 -7.72,0 -0.866,-2.703 c -0.28,-0.868 -0.868,-1.484 -2.016,-1.484 -1.12,0 -2.072,0.84 -2.072,1.96 0,0.448 0.14,0.784 0.196,0.924 l 5.628,15.231 z"/></g><g transform="translate(24.2002,12)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.304,0 c 1.512,0 2.632,0.729 2.632,2.296 0,1.315 -1.008,2.112 -2.968,2.112 L 0,4.408 0,0 Z m 0,8 2.184,0 c 1.372,0 2.268,0.815 2.268,2.216 0,1.315 -1.036,2.088 -2.268,2.088 L 0,12.304 0,8 Z m -4.2,5.9 c 0,1.344 0.924,2.1 2.212,2.1 l 5.376,0 C 6.3,16 8.652,14.04 8.652,11.072 8.652,9.112 7.84,7.796 6.048,6.956 l 0,-0.056 C 8.428,6.564 10.304,4.477 10.304,2.041 10.304,-1.907 7.672,-4 3.808,-4 l -5.768,0 c -1.288,0 -2.24,0.876 -2.24,2.192 l 0,15.708 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#DD2E44" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M7.15 10.072c.476-1.288 1.567-2.324 2.996-2.324 1.483 0 2.52.979 2.996 2.324l5.488 15.231c.168.448.224.84.224 1.036 0 1.092-.896 1.848-1.932 1.848-1.177 0-1.765-.616-2.044-1.456L14 24H6.28l-.866 2.703c-.28.868-.868 1.484-2.016 1.484-1.12 0-2.072-.84-2.072-1.96 0-.448.14-.784.196-.924L7.15 10.072zm.308 10.163h5.32l-2.604-8.119h-.056l-2.66 8.119zM20 10.1c0-1.344.924-2.1 2.212-2.1h5.376c2.912 0 5.265 1.96 5.265 4.928 0 1.96-.812 3.276-2.605 4.116v.056c2.38.336 4.256 2.424 4.256 4.859 0 3.948-2.632 6.041-6.496 6.041H22.24c-1.288 0-2.24-.876-2.24-2.192V10.1zm4.2 5.9h2.184c1.372 0 2.268-.815 2.268-2.216 0-1.315-1.036-2.088-2.268-2.088H24.2V16zm0 8h3.304c1.513 0 2.632-.729 2.632-2.296 0-1.315-1.008-2.112-2.968-2.112H24.2V24z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 942 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(12.8101,29.4482)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 2.263,0 6.667,-0.744 6.667,-3.473 0,-1.116 -0.776,-2.077 -1.923,-2.077 -1.271,0 -2.14,1.085 -4.744,1.085 -3.845,0 -5.829,-3.256 -5.829,-7.038 0,-3.689 2.015,-6.852 5.829,-6.852 2.604,0 3.658,1.301 4.93,1.301 1.395,0 2.046,-1.394 2.046,-2.107 0,-2.977 -4.682,-3.659 -6.976,-3.659 -6.294,0 -10.666,4.992 -10.666,11.41 C -10.666,-4.961 -6.325,0 0,0"/></g><g transform="translate(21.332,26.8438)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,1.55 0.992,2.418 2.326,2.418 3.66,2.418 4.652,1.55 4.652,0 l 0,-15.564 5.518,0 c 1.582,0 2.264,-1.179 2.232,-2.233 -0.06,-1.023 -0.867,-2.047 -2.232,-2.047 l -7.75,0 C 0.9,-19.844 0,-18.852 0,-17.301 L 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#DD2E44" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M12.81 6.552c2.263 0 6.667.744 6.667 3.473 0 1.116-.776 2.077-1.923 2.077-1.271 0-2.139-1.085-4.744-1.085-3.845 0-5.829 3.256-5.829 7.038 0 3.689 2.015 6.852 5.829 6.852 2.605 0 3.658-1.302 4.93-1.302 1.395 0 2.046 1.395 2.046 2.107 0 2.977-4.682 3.659-6.976 3.659-6.294 0-10.666-4.992-10.666-11.41 0-6.448 4.341-11.409 10.666-11.409zm8.522 2.604c0-1.55.992-2.418 2.326-2.418s2.326.868 2.326 2.418V24.72h5.518c1.582 0 2.264 1.179 2.232 2.232-.06 1.025-.867 2.048-2.232 2.048h-7.75c-1.52 0-2.42-.992-2.42-2.543V9.156z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 731 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(5.9697,23.1416)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 1.022,0 3.012,-0.336 3.012,-1.569 0,-0.504 -0.35,-0.939 -0.869,-0.939 -0.574,0 -0.966,0.49 -2.143,0.49 -1.737,0 -2.633,-1.47 -2.633,-3.179 0,-1.667 0.91,-3.096 2.633,-3.096 1.177,0 1.653,0.589 2.227,0.589 0.63,0 0.925,-0.631 0.925,-0.953 0,-1.345 -2.115,-1.653 -3.152,-1.653 -2.843,0 -4.818,2.255 -4.818,5.155 C -4.818,-2.241 -2.857,0 0,0"/></g><g transform="translate(16.3169,17.9863)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,1.695 -0.882,3.222 -2.633,3.222 -1.751,0 -2.634,-1.527 -2.634,-3.222 0,-1.709 0.855,-3.222 2.634,-3.222 C -0.854,-3.222 0,-1.709 0,0 m -7.452,0 c 0,2.914 1.961,5.155 4.819,5.155 2.815,0 4.819,-2.311 4.819,-5.155 0,-2.899 -1.948,-5.154 -4.819,-5.154 -2.844,0 -4.819,2.255 -4.819,5.154"/></g><g transform="translate(26.4258,17.9863)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,1.695 -0.883,3.222 -2.635,3.222 -1.75,0 -2.633,-1.527 -2.633,-3.222 0,-1.709 0.855,-3.222 2.633,-3.222 C -0.855,-3.222 0,-1.709 0,0 m -7.453,0 c 0,2.914 1.961,5.155 4.818,5.155 2.817,0 4.819,-2.311 4.819,-5.155 0,-2.899 -1.946,-5.154 -4.819,-5.154 -2.843,0 -4.818,2.255 -4.818,5.154"/></g><g transform="translate(29.1934,21.9648)" id="g36"><path id="path38" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,0.7 0.447,1.093 1.051,1.093 1.652,1.093 2.102,0.7 2.102,0 l 0,-7.032 2.492,0 c 0.715,0 1.023,-0.532 1.01,-1.008 -0.03,-0.463 -0.393,-0.925 -1.01,-0.925 l -3.502,0 C 0.406,-8.965 0,-8.517 0,-7.816 L 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><g fill="#FFF"><path d="M5.97 12.858c1.022 0 3.012.336 3.012 1.569 0 .504-.35.939-.869.939-.574 0-.966-.49-2.143-.49-1.737 0-2.633 1.471-2.633 3.18 0 1.667.911 3.096 2.633 3.096 1.177 0 1.653-.589 2.227-.589.63 0 .925.631.925.953 0 1.345-2.115 1.652-3.152 1.652-2.843 0-4.818-2.255-4.818-5.154-.001-2.914 1.96-5.156 4.818-5.156z"/><path d="M8.865 18.014c0-2.914 1.961-5.155 4.818-5.155 2.815 0 4.819 2.311 4.819 5.155 0 2.899-1.947 5.154-4.819 5.154-2.843 0-4.818-2.255-4.818-5.154zm7.452 0c0-1.695-.882-3.222-2.633-3.222s-2.633 1.526-2.633 3.222c0 1.709.855 3.222 2.633 3.222s2.633-1.513 2.633-3.222zm2.656 0c0-2.914 1.96-5.155 4.818-5.155 2.816 0 4.818 2.311 4.818 5.155 0 2.899-1.945 5.154-4.818 5.154-2.843 0-4.818-2.255-4.818-5.154zm7.453 0c0-1.695-.883-3.222-2.635-3.222-1.75 0-2.633 1.526-2.633 3.222 0 1.709.854 3.222 2.633 3.222 1.779-.001 2.635-1.513 2.635-3.222zm2.767-3.979c0-.7.447-1.093 1.051-1.093.602 0 1.051.393 1.051 1.093v7.032h2.492c.715 0 1.023.532 1.01 1.008-.029.463-.393.925-1.01.925h-3.502c-.686 0-1.092-.448-1.092-1.148v-7.817z"/></g></svg>
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.2 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(1.8364,23.4155)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.738 0.504,1.404 1.405,1.404 l 4.609,0 C 6.806,1.404 7.22,0.792 7.22,0.162 7.22,-0.45 6.824,-1.08 6.014,-1.08 l -3.313,0 0,-2.629 2.791,0 c 0.864,0 1.296,-0.613 1.296,-1.224 0,-0.631 -0.432,-1.261 -1.296,-1.261 l -2.791,0 0,-3.925 c 0,-0.9 -0.576,-1.405 -1.35,-1.405 -0.775,0 -1.351,0.505 -1.351,1.405 L 0,0 Z"/></g><g transform="translate(12.5293,19.1484)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 1.855,0 c 0.99,0 1.674,0.594 1.674,1.603 0,1.025 -0.684,1.584 -1.674,1.584 L 0,3.187 0,0 Z m -2.701,4.267 c 0,0.864 0.486,1.404 1.387,1.404 l 3.169,0 c 2.772,0 4.483,-1.242 4.483,-4.068 0,-1.982 -1.495,-3.116 -3.331,-3.404 l 3.061,-3.277 c 0.252,-0.27 0.36,-0.54 0.36,-0.792 0,-0.702 -0.558,-1.387 -1.351,-1.387 -0.324,0 -0.756,0.126 -1.044,0.469 l -3.997,4.843 -0.036,0 0,-3.907 c 0,-0.9 -0.576,-1.405 -1.351,-1.405 -0.774,0 -1.35,0.505 -1.35,1.405 l 0,10.119 z"/></g><g transform="translate(19.4766,23.2534)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.9 0.449,1.566 1.404,1.566 l 4.465,0 c 0.865,0 1.279,-0.612 1.279,-1.242 0,-0.612 -0.433,-1.242 -1.279,-1.242 l -3.168,0 0,-2.629 2.952,0 c 0.882,0 1.314,-0.613 1.314,-1.243 0,-0.612 -0.45,-1.242 -1.314,-1.242 l -2.952,0 0,-2.737 3.33,0 c 0.865,0 1.279,-0.611 1.279,-1.242 0,-0.613 -0.433,-1.242 -1.279,-1.242 l -4.644,0 C 0.594,-11.253 0,-10.713 0,-9.903 L 0,0 Z"/></g><g transform="translate(27.4512,23.2534)" id="g36"><path id="path38" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.9 0.449,1.566 1.404,1.566 l 4.465,0 c 0.863,0 1.277,-0.612 1.277,-1.242 0,-0.612 -0.431,-1.242 -1.277,-1.242 l -3.17,0 0,-2.629 2.953,0 c 0.883,0 1.315,-0.613 1.315,-1.243 0,-0.612 -0.449,-1.242 -1.315,-1.242 l -2.953,0 0,-2.737 3.332,0 c 0.864,0 1.278,-0.611 1.278,-1.242 0,-0.613 -0.432,-1.242 -1.278,-1.242 l -4.646,0 C 0.594,-11.253 0,-10.713 0,-9.903 L 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M1.836 12.585c0-.738.504-1.404 1.405-1.404H7.85c.792 0 1.206.612 1.206 1.242 0 .612-.396 1.243-1.206 1.243H4.538v2.629h2.791c.864 0 1.296.612 1.296 1.224 0 .631-.432 1.261-1.296 1.261H4.538v3.925c0 .9-.576 1.405-1.351 1.405-.774 0-1.351-.505-1.351-1.405v-10.12zm7.992 0c0-.864.486-1.404 1.387-1.404h3.169c2.773 0 4.483 1.242 4.483 4.069 0 1.981-1.495 3.115-3.331 3.403l3.061 3.277c.252.269.36.54.36.792 0 .702-.558 1.387-1.351 1.387-.324 0-.756-.126-1.044-.469l-3.998-4.843h-.036v3.906c0 .9-.576 1.405-1.351 1.405-.774 0-1.351-.505-1.351-1.405V12.585zm2.701 4.267h1.854c.99 0 1.674-.594 1.674-1.603 0-1.026-.684-1.584-1.674-1.584h-1.854v3.187zm6.948-4.105c0-.9.449-1.566 1.404-1.566h4.465c.865 0 1.279.612 1.279 1.242 0 .612-.434 1.243-1.279 1.243h-3.168v2.629h2.952c.882 0 1.313.612 1.313 1.242 0 .612-.449 1.242-1.313 1.242h-2.952v2.737h3.33c.865 0 1.279.611 1.279 1.242 0 .612-.434 1.242-1.279 1.242h-4.644c-.793 0-1.387-.54-1.387-1.351v-9.902zm7.974 0c0-.9.449-1.566 1.404-1.566h4.465c.863 0 1.277.612 1.277 1.242 0 .612-.432 1.243-1.277 1.243h-3.17v2.629h2.953c.883 0 1.314.612 1.314 1.242 0 .612-.449 1.242-1.314 1.242H30.15v2.737h3.332c.863 0 1.277.611 1.277 1.242 0 .612-.432 1.242-1.277 1.242h-4.646c-.791 0-1.385-.54-1.385-1.351v-9.902z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 1.4 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#9266cc;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(5.7173,26.8438)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,1.55 0.992,2.418 2.325,2.418 3.658,2.418 4.65,1.55 4.65,0 l 0,-17.611 c 0,-1.551 -0.992,-2.418 -2.325,-2.418 -1.333,0 -2.325,0.867 -2.325,2.418 L 0,0 Z"/></g><g transform="translate(17.8071,11.2793)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 3.132,0 c 4,0 5.828,2.945 5.828,6.666 0,3.969 -1.859,6.852 -6.138,6.852 L 0,13.518 0,0 Z m -4.65,15.409 c 0,1.427 0.992,2.388 2.387,2.388 l 5.147,0 c 6.946,0 10.914,-4.465 10.914,-11.348 0,-6.511 -4.216,-10.728 -10.604,-10.728 l -5.395,0 c -1.024,0 -2.449,0.558 -2.449,2.325 l 0,17.363 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#9266CC" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M5.717 9.156c0-1.55.992-2.418 2.325-2.418s2.325.868 2.325 2.418v17.611c0 1.551-.992 2.418-2.325 2.418s-2.325-.867-2.325-2.418V9.156zm7.44.156c0-1.427.992-2.388 2.387-2.388h5.148c6.945 0 10.914 4.465 10.914 11.348C31.605 24.783 27.389 29 21.001 29h-5.395c-1.023 0-2.449-.559-2.449-2.325V9.312zm4.65 15.409h3.132c4 0 5.828-2.945 5.828-6.666 0-3.969-1.859-6.852-6.139-6.852h-2.822v13.518z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 600 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(1.5273,22.8789)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.85 0.544,1.326 1.275,1.326 0.323,0 0.85,-0.255 1.071,-0.561 l 5.388,-7.191 0.034,0 0,6.426 c 0,0.85 0.544,1.326 1.275,1.326 0.731,0 1.275,-0.476 1.275,-1.326 l 0,-9.655 c 0,-0.85 -0.544,-1.325 -1.275,-1.325 -0.323,0 -0.833,0.254 -1.071,0.56 l -5.389,7.106 -0.033,0 0,-6.341 c 0,-0.85 -0.544,-1.325 -1.275,-1.325 C 0.544,-10.98 0,-10.505 0,-9.655 L 0,0 Z"/></g><g transform="translate(12.5942,22.624)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.85 0.425,1.479 1.326,1.479 l 4.215,0 c 0.816,0 1.207,-0.578 1.207,-1.173 0,-0.578 -0.408,-1.173 -1.207,-1.173 l -2.992,0 0,-2.482 2.788,0 c 0.833,0 1.241,-0.578 1.241,-1.172 0,-0.579 -0.425,-1.173 -1.241,-1.173 l -2.788,0 0,-2.584 3.145,0 c 0.816,0 1.207,-0.578 1.207,-1.173 0,-0.578 -0.407,-1.173 -1.207,-1.173 l -4.385,0 C 0.561,-10.624 0,-10.114 0,-9.35 L 0,0 Z"/></g><g transform="translate(19.9043,22.5049)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -0.051,0.221 -0.068,0.34 -0.068,0.578 0,0.544 0.459,1.122 1.207,1.122 0.816,0 1.207,-0.476 1.359,-1.224 l 1.445,-7.224 0.035,0 2.209,7.445 C 6.375,1.309 6.885,1.7 7.514,1.7 8.143,1.7 8.652,1.309 8.84,0.697 l 2.209,-7.445 0.033,0 1.445,7.224 C 12.68,1.224 13.072,1.7 13.887,1.7 14.635,1.7 15.094,1.122 15.094,0.578 15.094,0.34 15.078,0.221 15.025,0 l -2.158,-9.281 c -0.17,-0.714 -0.73,-1.325 -1.681,-1.325 -0.834,0 -1.481,0.543 -1.684,1.24 l -1.973,6.561 -0.033,0 -1.972,-6.561 c -0.204,-0.697 -0.85,-1.24 -1.682,-1.24 -0.952,0 -1.514,0.611 -1.684,1.325 L 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M1.527 13.121c0-.85.544-1.326 1.275-1.326.323 0 .85.255 1.071.561l5.388 7.191h.034v-6.426c0-.85.544-1.326 1.275-1.326.731 0 1.275.476 1.275 1.326v9.655c0 .85-.544 1.325-1.275 1.325-.323 0-.833-.255-1.071-.561L4.11 16.434h-.033v6.341c0 .85-.544 1.325-1.275 1.325-.731 0-1.275-.476-1.275-1.325v-9.654zm11.067.255c0-.85.425-1.479 1.326-1.479h4.215c.816 0 1.207.578 1.207 1.173 0 .578-.407 1.173-1.207 1.173h-2.992v2.481h2.788c.833 0 1.24.578 1.24 1.173 0 .578-.424 1.173-1.24 1.173h-2.788v2.584h3.145c.816 0 1.206.578 1.206 1.173 0 .578-.407 1.173-1.206 1.173h-4.386c-.748 0-1.309-.51-1.309-1.274v-9.35zm7.31.119c-.051-.221-.068-.34-.068-.578 0-.544.459-1.122 1.207-1.122.816 0 1.207.476 1.359 1.224l1.445 7.224h.034l2.21-7.445c.188-.612.697-1.003 1.326-1.003.629 0 1.139.391 1.326 1.003l2.209 7.445h.033l1.445-7.224c.152-.748.545-1.224 1.359-1.224.748 0 1.207.578 1.207 1.122 0 .238-.016.357-.068.578l-2.158 9.281c-.17.714-.73 1.325-1.682 1.325-.834 0-1.48-.544-1.684-1.24l-1.97-6.561H27.4l-1.972 6.561c-.204.696-.851 1.24-1.683 1.24-.952 0-1.514-.611-1.684-1.325l-2.157-9.281z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.3 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(2.5083,25.3613)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,1.2 0.768,1.872 1.8,1.872 0.456,0 1.2,-0.36 1.513,-0.792 l 7.608,-10.153 0.048,0 0,9.073 c 0,1.2 0.768,1.872 1.8,1.872 1.032,0 1.8,-0.672 1.8,-1.872 l 0,-13.633 c 0,-1.2 -0.768,-1.872 -1.8,-1.872 -0.456,0 -1.176,0.36 -1.512,0.792 l -7.609,10.033 -0.047,0 0,-8.953 c 0,-1.2 -0.768,-1.872 -1.801,-1.872 -1.032,0 -1.8,0.672 -1.8,1.872 L 0,0 Z"/></g><g transform="translate(31.9102,20.1289)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 1.512,0 2.111,-0.768 2.111,-2.305 0,-4.632 -3.023,-8.112 -7.824,-8.112 -4.873,0 -8.257,3.864 -8.257,8.833 0,4.992 3.361,8.833 8.257,8.833 3.623,0 6.6,-1.705 6.6,-3.385 0,-1.032 -0.647,-1.68 -1.489,-1.68 -1.63,0 -1.966,1.752 -5.111,1.752 -3,0 -4.513,-2.616 -4.513,-5.52 0,-2.929 1.464,-5.521 4.513,-5.521 1.897,0 4.08,1.056 4.08,3.792 l -2.447,0 c -0.984,0 -1.682,0.697 -1.682,1.681 0,1.008 0.77,1.632 1.682,1.632 L 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M2.508 10.639c0-1.2.768-1.872 1.8-1.872.456 0 1.2.36 1.512.792l7.608 10.153h.048v-9.073c0-1.2.768-1.872 1.8-1.872s1.8.672 1.8 1.872v13.633c0 1.2-.768 1.872-1.8 1.872-.456 0-1.176-.359-1.512-.792L6.157 15.319h-.048v8.953c0 1.2-.768 1.872-1.8 1.872s-1.8-.672-1.8-1.872V10.639zm29.402 5.232c1.512 0 2.111.768 2.111 2.305 0 4.632-3.024 8.112-7.824 8.112-4.873 0-8.257-3.864-8.257-8.833 0-4.992 3.36-8.833 8.257-8.833 3.623 0 6.6 1.704 6.6 3.384 0 1.032-.647 1.68-1.488 1.68-1.631 0-1.967-1.752-5.111-1.752-3 0-4.513 2.616-4.513 5.52 0 2.929 1.464 5.521 4.513 5.521 1.896 0 4.08-1.056 4.08-3.792H27.83c-.984 0-1.682-.696-1.682-1.681 0-1.008.77-1.632 1.682-1.632h4.08z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 877 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(14.7017,18.5449)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,2.904 -1.512,5.52 -4.513,5.52 -3,0 -4.512,-2.616 -4.512,-5.52 0,-2.929 1.464,-5.521 4.512,-5.521 C -1.464,-5.521 0,-2.929 0,0 m -12.769,0 c 0,4.992 3.36,8.833 8.256,8.833 4.825,0 8.257,-3.961 8.257,-8.833 0,-4.969 -3.336,-8.833 -8.257,-8.833 -4.872,0 -8.256,3.864 -8.256,8.833"/></g><g transform="translate(19.9316,25.4575)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.984 0.721,1.776 1.801,1.776 1.031,0 1.8,-0.672 1.8,-1.776 l 0,-5.185 5.905,6.289 c 0.264,0.288 0.719,0.672 1.39,0.672 0.913,0 1.778,-0.696 1.778,-1.728 0,-0.624 -0.385,-1.128 -1.176,-1.92 l -4.537,-4.465 5.545,-5.785 c 0.576,-0.576 1.008,-1.103 1.008,-1.824 0,-1.128 -0.889,-1.655 -1.873,-1.655 -0.696,0 -1.151,0.407 -1.825,1.128 l -6.215,6.721 0,-6.122 c 0,-0.935 -0.72,-1.727 -1.8,-1.727 -1.032,0 -1.801,0.672 -1.801,1.727 L 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M1.933 17.455c0-4.992 3.36-8.833 8.256-8.833 4.825 0 8.257 3.96 8.257 8.833 0 4.969-3.336 8.833-8.257 8.833-4.872 0-8.256-3.864-8.256-8.833zm12.769 0c0-2.904-1.512-5.52-4.513-5.52-3 0-4.512 2.616-4.512 5.52 0 2.929 1.464 5.521 4.512 5.521 3.048 0 4.513-2.592 4.513-5.521zm5.23-6.913c0-.984.721-1.776 1.801-1.776 1.031 0 1.8.672 1.8 1.776v5.185l5.905-6.289c.264-.288.719-.672 1.391-.672.912 0 1.777.696 1.777 1.728 0 .624-.385 1.128-1.176 1.92l-4.537 4.464 5.545 5.785c.576.576 1.008 1.103 1.008 1.824 0 1.128-.889 1.655-1.873 1.655-.695 0-1.15-.407-1.824-1.128l-6.216-6.721v6.121c0 .936-.72 1.728-1.8 1.728-1.032 0-1.801-.672-1.801-1.728V10.542z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 860 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#dd2e44;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(9.7622,23.4824)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.78 -0.52,-1.48 -1.34,-1.48 -0.82,0 -1.46,0.6 -2.66,0.6 -0.861,0 -1.641,-0.46 -1.641,-1.3 0,-2.06 6.681,-0.74 6.681,-5.901 0,-2.861 -2.36,-4.642 -5.121,-4.642 -1.54,0 -4.861,0.361 -4.861,2.241 0,0.78 0.521,1.42 1.34,1.42 0.941,0 2.061,-0.78 3.361,-0.78 1.321,0 2.041,0.74 2.041,1.721 0,2.36 -6.682,0.939 -6.682,5.58 C -8.882,0.26 -6.581,2 -3.92,2 -2.8,2 0,1.581 0,0"/></g><g transform="translate(21.7627,18.1211)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,2.421 -1.261,4.602 -3.761,4.602 -2.5,0 -3.76,-2.181 -3.76,-4.602 0,-2.44 1.22,-4.601 3.76,-4.601 C -1.22,-4.601 0,-2.44 0,0 m -10.643,0 c 0,4.161 2.801,7.362 6.882,7.362 4.021,0 6.881,-3.3 6.881,-7.362 0,-4.141 -2.78,-7.361 -6.881,-7.361 -4.061,0 -6.882,3.22 -6.882,7.361"/></g><g transform="translate(34.1426,23.4824)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.78 -0.521,-1.48 -1.342,-1.48 -0.82,0 -1.459,0.6 -2.66,0.6 -0.859,0 -1.641,-0.46 -1.641,-1.3 0,-2.06 6.682,-0.74 6.682,-5.901 0,-2.861 -2.359,-4.642 -5.121,-4.642 -1.539,0 -4.861,0.361 -4.861,2.241 0,0.78 0.521,1.42 1.341,1.42 0.94,0 2.061,-0.78 3.36,-0.78 1.32,0 2.041,0.74 2.041,1.721 0,2.36 -6.682,0.939 -6.682,5.58 C -8.883,0.26 -6.582,2 -3.922,2 -2.801,2 0,1.581 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#DD2E44" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M9.762 12.518c0 .78-.52 1.48-1.34 1.48-.82 0-1.46-.6-2.661-.6-.86 0-1.641.46-1.641 1.3 0 2.06 6.682.74 6.682 5.901 0 2.861-2.361 4.642-5.121 4.642-1.541 0-4.861-.36-4.861-2.24 0-.78.521-1.421 1.34-1.421.94 0 2.061.78 3.361.78 1.32 0 2.041-.74 2.041-1.721 0-2.36-6.682-.94-6.682-5.581 0-2.801 2.301-4.541 4.961-4.541 1.121 0 3.921.42 3.921 2.001zm1.358 5.361c0-4.161 2.801-7.362 6.882-7.362 4.02 0 6.881 3.3 6.881 7.362 0 4.141-2.78 7.361-6.881 7.361-4.061 0-6.882-3.22-6.882-7.361zm10.643 0c0-2.421-1.261-4.602-3.761-4.602-2.501 0-3.761 2.181-3.761 4.602 0 2.44 1.22 4.601 3.761 4.601 2.541-.001 3.761-2.161 3.761-4.601zm12.38-5.361c0 .78-.521 1.48-1.342 1.48s-1.459-.6-2.66-.6c-.859 0-1.641.46-1.641 1.3 0 2.06 6.682.74 6.682 5.901 0 2.861-2.359 4.642-5.121 4.642-1.539 0-4.861-.36-4.861-2.24 0-.78.521-1.421 1.342-1.421.939 0 2.061.78 3.359.78 1.32 0 2.041-.74 2.041-1.721 0-2.36-6.682-.94-6.682-5.581 0-2.801 2.301-4.541 4.961-4.541 1.121 0 3.922.42 3.922 2.001z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.2 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(2.2812,24.4375)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,1.05 0.672,1.638 1.575,1.638 2.478,1.638 3.149,1.05 3.149,0 l 0,-7.328 c 0,-1.932 1.239,-3.464 3.234,-3.464 1.91,0 3.212,1.616 3.212,3.464 l 0,7.328 c 0,1.05 0.672,1.638 1.575,1.638 0.903,0 1.575,-0.588 1.575,-1.638 l 0,-7.496 c 0,-3.527 -2.898,-6.193 -6.362,-6.193 C 2.876,-13.689 0,-11.064 0,-7.496 L 0,0 Z"/></g><g transform="translate(19.9414,18.7266)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 2.142,0 c 1.323,0 2.163,0.966 2.163,2.225 0,1.26 -0.84,2.226 -2.163,2.226 L 0,4.451 0,0 Z m -3.149,5.585 c 0,0.987 0.587,1.638 1.637,1.638 l 3.717,0 c 3.086,0 5.375,-2.016 5.375,-5.018 0,-3.066 -2.373,-4.977 -5.25,-4.977 l -2.33,0 0,-3.443 c 0,-1.05 -0.672,-1.638 -1.575,-1.638 -0.903,0 -1.574,0.588 -1.574,1.638 l 0,11.8 z"/></g><g transform="translate(29.5176,24.7734)" id="g32"><path id="path34" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,0.882 0.65,1.428 1.512,1.428 2.352,1.428 3.023,0.861 3.023,0 l 0,-8.084 c 0,-0.86 -0.671,-1.428 -1.511,-1.428 C 0.65,-9.512 0,-8.965 0,-8.084 L 0,0 Z m -0.127,-12.388 c 0,0.904 0.736,1.638 1.639,1.638 0.902,0 1.636,-0.734 1.636,-1.638 0,-0.903 -0.734,-1.637 -1.636,-1.637 -0.903,0 -1.639,0.734 -1.639,1.637"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path d="M2.281 11.562c0-1.05.672-1.638 1.575-1.638s1.575.588 1.575 1.638v7.328c0 1.932 1.239 3.464 3.233 3.464 1.911 0 3.212-1.616 3.212-3.464v-7.328c0-1.05.672-1.638 1.575-1.638.903 0 1.575.588 1.575 1.638v7.496c0 3.527-2.898 6.193-6.362 6.193-3.506 0-6.383-2.625-6.383-6.193v-7.496zm14.511.127c0-.987.588-1.638 1.638-1.638h3.717c3.086 0 5.375 2.016 5.375 5.018 0 3.066-2.373 4.976-5.25 4.976h-2.33v3.443c0 1.05-.672 1.638-1.575 1.638-.903 0-1.575-.588-1.575-1.638V11.689zm3.149 5.584h2.142c1.323 0 2.163-.966 2.163-2.225 0-1.26-.84-2.226-2.163-2.226h-2.142v4.451zm9.45 6.341c0-.903.736-1.638 1.639-1.638s1.637.734 1.637 1.638c0 .903-.734 1.638-1.637 1.638s-1.639-.734-1.639-1.638zm.127-12.387c0-.882.65-1.428 1.512-1.428.84 0 1.512.567 1.512 1.428v8.084c0 .86-.672 1.428-1.512 1.428-.861 0-1.512-.547-1.512-1.428v-8.084z" fill="#FFF"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#f4900c;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-4 -4,-4 -4,-4 l -28,0 c -4,0 -4,4 -4,4 l 0,28 c 0,4 4,4 4,4 l 28,0 c 0,0 4,0 4,-4 L 0,0 Z"/></g><g transform="translate(1.5005,25.5898)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -0.15,0.39 -0.21,0.69 -0.21,1.11 0,1.26 1.109,2.16 2.311,2.16 C 3.12,3.27 3.75,2.61 4.14,1.8 L 8.79,-10.679 13.439,1.8 c 0.391,0.81 1.021,1.47 2.041,1.47 1.2,0 2.309,-0.9 2.309,-2.16 C 17.789,0.69 17.73,0.39 17.58,0 l -6.57,-16.71 c -0.39,-0.959 -0.9,-1.738 -2.22,-1.738 -1.32,0 -1.83,0.779 -2.221,1.738 L 0,0 Z"/></g><g transform="translate(33.1504,26.04)" id="g28"><path id="path30" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-1.17 -0.781,-2.22 -2.01,-2.22 -1.23,0 -2.191,0.9 -3.99,0.9 -1.291,0 -2.461,-0.69 -2.461,-1.95 0,-3.089 10.02,-1.11 10.02,-8.849 0,-4.291 -3.539,-6.961 -7.68,-6.961 -2.309,0 -7.289,0.541 -7.289,3.361 0,1.17 0.779,2.129 2.01,2.129 1.41,0 3.089,-1.17 5.041,-1.17 1.978,0 3.058,1.11 3.058,2.58 0,3.541 -10.019,1.41 -10.019,8.369 C -13.32,0.391 -9.871,3 -5.881,3 -4.201,3 0,2.37 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#F4900C" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M16.98 7.14c-1.02 0-1.649.66-2.04 1.47l-4.649 12.479L5.64 8.61c-.39-.81-1.019-1.47-2.039-1.47-1.201 0-2.311.9-2.311 2.16 0 .42.06.721.21 1.11l6.57 16.71c.391.959.9 1.738 2.221 1.738 1.32 0 1.83-.779 2.22-1.738l6.57-16.71c.15-.39.209-.69.209-1.11-.001-1.26-1.11-2.16-2.31-2.16zm7.71 6.089c0-1.26 1.17-1.949 2.461-1.949 1.799 0 2.76.899 3.99.899 1.228 0 2.01-1.05 2.01-2.22 0-2.37-4.201-3-5.881-3-3.99 0-7.439 2.609-7.439 6.811 0 6.959 10.02 4.828 10.02 8.369 0 1.471-1.08 2.58-3.059 2.58-1.951 0-3.631-1.17-5.041-1.17-1.231 0-2.01.959-2.01 2.129 0 2.82 4.981 3.361 7.289 3.361 4.141 0 7.68-2.67 7.68-6.961-.001-7.738-10.02-5.759-10.02-8.849z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 855 B |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 4.5 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,31)" id="g20"><path id="path22" style="fill:#068241;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -23,0 0,-9 27,0 0,5 C 4,-1.791 2.209,0 0,0"/></g><path id="path24" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 9,14 27,0 0,8 -27,0 0,-8 z"/><g transform="translate(9,5)" id="g26"><path id="path28" style="fill:#141414;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 23,0 c 2.209,0 4,1.791 4,4 L 27,9 0,9 0,0 Z"/></g><g transform="translate(4,31)" id="g30"><path id="path32" style="fill:#ec2028;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-18 c 0,-2.209 1.791,-4 4,-4 l 5,0 0,26 -5,0 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#068241" d="M32 5H9v9h27V9c0-2.209-1.791-4-4-4z"/><path fill="#EEE" d="M9 14h27v8H9z"/><path fill="#141414" d="M9 31h23c2.209 0 4-1.791 4-4v-5H9v9z"/><path fill="#EC2028" d="M4 5C1.791 5 0 6.791 0 9v18c0 2.209 1.791 4 4 4h5V5H4z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 309 B |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 24 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath20" clipPathUnits="userSpaceOnUse"><path id="path22" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g transform="translate(11.0769,15)" id="g12"><path id="path14" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 6.923,-10 13.846,0 0,0 Z"/></g><g id="g16"><g clip-path="url(#clipPath20)" id="g18"><g transform="translate(10.2787,21)" id="g24"><path id="path26" style="fill:#141414;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 -0.105,0.022 3.883,0.849 0.491,3.266 4.468,2.377 2.187,6.017 5.547,3.547 4.726,7.855 6.958,4.179 7.721,8.5 8.485,4.179 10.716,7.855 9.895,3.547 l 3.36,2.47 -2.28,-3.64 3.977,0.889 L 11.559,0.849 15.547,0.022 15.443,0 18.798,0 24.754,8.603 C 24.021,9.457 22.935,10 21.721,10 l -28,0 C -7.493,10 -8.578,9.457 -9.312,8.603 L -3.356,0 0,0 Z"/></g><g transform="translate(25.8261,21.0217)" id="g28"><path id="path30" style="fill:#fcd116;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -3.988,0.827 3.392,2.418 -3.976,-0.89 2.28,3.64 -3.36,-2.47 0.821,4.308 -2.232,-3.675 -0.763,4.32 -0.763,-4.32 -2.232,3.675 0.821,-4.308 -3.36,2.47 2.28,-3.64 -3.976,0.89 3.392,-2.418 -3.988,-0.827 0.105,-0.022 15.442,0 L 0,0 Z"/></g><g transform="translate(10.2787,21)" id="g32"><path id="path34" style="fill:#0072c6;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 -3.356,0 0.798,-6 14.644,-6 18.798,0 15.443,0 0,0 Z"/></g><g transform="translate(29.0769,21)" id="g36"><path id="path38" style="fill:#ce1126;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -4.154,-6 -6.923,-10 14,0 c 2.209,0 4,1.791 4,4 l 0,18 c 0,0.995 -0.366,1.903 -0.967,2.603 L 0,0 Z"/></g><g transform="translate(6.9231,21)" id="g40"><path id="path42" style="fill:#ce1126;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 -5.956,8.603 C -6.557,7.903 -6.923,6.995 -6.923,6 l 0,-18 c 0,-2.209 1.791,-4 4,-4 l 14,0 L 4.154,-6 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFF" d="M11.077 21L18 31l6.923-10z"/><path fill="#141414" d="M10.279 15l-.105-.022 3.988-.827-3.392-2.417 3.977.889-2.28-3.64 3.36 2.47-.821-4.308 2.232 3.675L18 6.5l.763 4.321 2.232-3.675-.821 4.308 3.36-2.47-2.28 3.64 3.977-.889-3.392 2.417 3.988.827-.106.021h3.356l5.956-8.603C34.299 5.543 33.214 5 32 5H4C2.786 5 1.701 5.543.967 6.397L6.923 15h3.356z"/><path fill="#FCD116" d="M25.826 14.978l-3.988-.827 3.392-2.417-3.976.889 2.28-3.64-3.36 2.47.821-4.308-2.232 3.676L18 6.5l-.763 4.321-2.232-3.676.821 4.308-3.36-2.47 2.28 3.64-3.976-.889 3.392 2.417-3.988.827.105.022h15.442z"/><path fill="#0072C6" d="M10.279 15H6.923l4.154 6h13.846l4.154-6h-3.356z"/><path fill="#CE1126" d="M29.077 15l-4.154 6L18 31h14c2.209 0 4-1.791 4-4V9c0-.995-.366-1.903-.967-2.603L29.077 15zM6.923 15L.967 6.397C.366 7.097 0 8.005 0 9v18c0 2.209 1.791 4 4 4h14l-6.923-10-4.154-6z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 942 B |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 12 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,31)" id="g20"><path id="path22" style="fill:#d90012;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-4 36,0 0,4 C 4,-1.791 2.209,0 0,0"/></g><g transform="translate(4,5)" id="g24"><path id="path26" style="fill:#f2a800;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 28,0 c 2.209,0 4,1.791 4,4 L 32,8 -4,8 -4,4 C -4,1.791 -2.209,0 0,0"/></g><path id="path28" style="fill:#0033a0;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,13 36,13 36,23 0,23 0,13 Z"/></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D90012" d="M32 5H4C1.791 5 0 6.791 0 9v4h36V9c0-2.209-1.791-4-4-4z"/><path fill="#F2A800" d="M4 31h28c2.209 0 4-1.791 4-4v-4H0v4c0 2.209 1.791 4 4 4z"/><path fill="#0033A0" d="M0 13h36v10H0z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 272 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(0,18)" id="g20"><path id="path22" style="fill:#141414;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-9 c 0,-2.209 1.791,-4 4,-4 l 28,0 c 2.209,0 4,1.791 4,4 L 36,0 0,0 Z"/></g><g transform="translate(36,18)" id="g24"><path id="path26" style="fill:#ce1b26;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,9 c 0,2.209 -1.791,4 -4,4 l -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-9 36,0 z"/></g><g transform="translate(17.4517,22.3545)" id="g28"><path id="path30" style="fill:#f9d616;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 0.602,-1.222 1.951,-1.418 0.975,-2.368 1.206,-3.711 0,-3.077 l -1.206,-0.634 0.23,1.343 -0.975,0.95 1.348,0.196 L 0,0 Z"/></g><g transform="translate(15.1563,18.8125)" id="g32"><path id="path34" style="fill:#f9d616;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0.344,-0.562 3.172,-3.516 5.922,-5.234 0.359,-0.235 1.344,-0.985 1.719,-1.25 -0.157,-0.203 -0.375,-0.5 -0.61,-0.75 -0.39,0.312 -3.968,2.515 -5.14,3.109 C 0.719,-3.531 -0.344,-2.5 -0.344,-1.516 -0.344,-0.531 0,0 0,0"/></g><g transform="translate(22.9844,12.2031)" id="g36"><path id="path38" style="fill:#f9d616;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C -0.172,-0.25 -0.437,-0.594 -0.594,-0.781 -0.281,-0.828 0.516,-1.219 0.922,-2.063 1.328,-2.906 2.063,-2.469 2,-2.016 1.937,-1.562 1.047,-0.578 0,0"/></g><g transform="translate(23.4375,11.5078)" id="g40"><path id="path42" style="fill:#292f33;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.1 -0.08,-0.18 -0.18,-0.18 -0.099,0 -0.179,0.08 -0.179,0.18 0,0.1 0.08,0.18 0.179,0.18 C -0.08,0.18 0,0.1 0,0"/></g><g transform="translate(24.4375,10.5078)" id="g44"><path id="path46" style="fill:#292f33;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.1 -0.08,-0.18 -0.18,-0.18 -0.099,0 -0.179,0.08 -0.179,0.18 0,0.1 0.08,0.18 0.179,0.18 C -0.08,0.18 0,0.1 0,0"/></g><g transform="translate(17.8906,15.2812)" id="g48"><path id="path50" style="fill:none;stroke:#292f33;stroke-width:0.30000001;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" d="M 0,0 4.656,-3.172"/></g><g transform="translate(24.8262,17.3521)" id="g52"><path id="path54" style="fill:#f9d616;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 0.008,1.295 -1.077,1.288 c -0.041,0.417 -0.126,0.82 -0.244,1.209 L -0.35,2.886 -0.787,4.105 -1.833,3.69 c -0.178,0.322 -0.384,0.625 -0.614,0.909 l 0.699,0.798 -0.994,0.832 -0.625,-0.71 c -0.31,0.25 -0.641,0.472 -0.994,0.66 L -3.907,7.146 -5.12,7.603 -5.562,6.668 C -5.919,6.771 -6.288,6.844 -6.667,6.882 L -6.805,5.535 c 2.495,-0.257 4.448,-2.341 4.448,-4.903 0,-1.508 -0.688,-2.842 -1.751,-3.751 l 0.552,-0.382 1.365,-1.015 0.532,0.578 -0.833,0.618 c 0.252,0.303 0.476,0.627 0.668,0.974 l 1.006,-0.408 0.5,1.195 -1.001,0.406 c 0.112,0.369 0.196,0.751 0.238,1.146 L 0,0 Z"/></g><g transform="translate(19.8965,12.2324)" id="g56"><path id="path58" style="fill:#f9d616;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -0.412,0.799 -0.51,0.243 C -1.386,0.898 -1.87,0.799 -2.381,0.799 c -1.198,0 -2.282,0.442 -3.139,1.15 L -6.352,0.971 c 0.308,-0.255 0.645,-0.473 0.999,-0.665 l -0.446,-0.959 1.195,-0.503 0.45,0.971 c 0.345,-0.103 0.701,-0.175 1.069,-0.218 l -0.008,-1.01 1.296,0.014 0.007,0.96 c 0.404,0.039 0.797,0.115 1.175,0.226 l 0.344,-0.994 0.687,0.203 -0.431,0.999 C -0.01,-0.003 -0.005,-0.002 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#141414" d="M0 18v9c0 2.209 1.791 4 4 4h28c2.209 0 4-1.791 4-4v-9H0z"/><path fill="#CE1B26" d="M36 18V9c0-2.209-1.791-4-4-4H4C1.791 5 0 6.791 0 9v9h36z"/><path fill="#F9D616" d="M17.452 13.646l.602 1.221 1.348.196-.975.951.231 1.343-1.206-.634-1.206.634.23-1.343-.976-.951 1.349-.196zm-2.296 3.542c.344.562 3.172 3.516 5.922 5.234.359.234 1.344.984 1.719 1.25-.156.203-.375.5-.609.75-.391-.312-3.969-2.516-5.141-3.109-1.172-.594-2.234-1.625-2.234-2.609-.001-.985.343-1.516.343-1.516zm7.828 6.609c-.172.25-.438.594-.594.781.312.047 1.109.438 1.516 1.281.406.844 1.141.406 1.078-.047s-.953-1.437-2-2.015z"/><circle fill="#292F33" cx="23.258" cy="24.492" r=".18"/><circle fill="#292F33" cx="24.258" cy="25.492" r=".18"/><path fill="#292F33" d="M22.547 24.041c-.029 0-.059-.009-.084-.026l-4.657-3.172c-.068-.047-.086-.14-.04-.208.047-.069.141-.087.208-.04l4.656 3.172c.069.047.087.14.04.208-.028.043-.075.066-.123.066z"/><path d="M24.826 18.648l.008-1.295-1.085.007c-.041-.417-.126-.82-.244-1.208l.972-.39-.438-1.219-1.046.416c-.178-.322-.384-.625-.614-.909l.699-.798-.994-.831-.625.71c-.31-.25-.641-.472-.994-.661l.454-.967-1.213-.457-.442.935c-.357-.103-.725-.176-1.104-.214l-.138 1.347c2.495.257 4.447 2.34 4.447 4.902 0 1.509-.688 2.842-1.751 3.751l.553.382 1.365 1.016.531-.578-.833-.618c.252-.303.476-.627.668-.974l1.006.408.5-1.195-1.001-.406c.112-.369.196-.751.238-1.146l1.081-.008zm-4.93 5.12l-.412-.799-.51-.243c-.464.144-.947.243-1.458.243-1.198 0-2.282-.442-3.139-1.15l-.832.979c.308.255.646.473.999.665l-.446.959 1.194.503.45-.972c.346.104.701.176 1.069.219l-.007 1.01 1.295-.014.007-.961c.404-.038.797-.114 1.175-.226l.344.994.688-.203-.431-.999.014-.005z" fill="#F9D616"/></svg>
|
||||||
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 1.7 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,9)" id="g20"><path id="path22" style="fill:#265fb5;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,18 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(27.5322,17.0674)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C -0.051,0.525 0.801,1.828 0.117,1.734 -0.72,1.62 -1.374,2.196 -1.657,2.183 -0.751,3.464 -1.424,3.79 -1.626,4.62 -1.982,6.078 -0.845,6.792 -2.876,7.105 -4.197,7.308 -5.108,7.17 -5.506,8.679 -6.089,8.27 -6.781,8.168 -7.437,8.455 c -0.42,0.183 -0.551,0.532 -0.947,0.701 -0.299,0.127 -0.925,0.126 -1.26,0.179 -0.923,0.146 -1.399,-0.264 -2.227,-0.127 0.079,-0.121 0.091,-0.275 0.146,-0.403 -0.51,-0.018 -0.821,-0.36 -0.876,-0.837 -0.747,0.075 -0.937,-0.898 -0.853,-1.512 -0.026,-0.007 -0.052,-0.016 -0.078,-0.023 l 0.031,-0.032 c -0.157,-1.625 -0.818,-2.438 -2.483,-2.693 -1.096,-0.168 -2.07,0.561 -3.017,1.147 -0.207,0.128 -0.571,0.408 -0.766,0.625 -0.28,0.31 -0.478,0.747 -0.75,0.968 -0.125,0.102 -0.39,0.188 -0.354,-0.02 -0.172,-1.078 0.616,-2.421 1.522,-2.94 -1.242,-0.573 0.315,-0.916 0.538,-1.111 0.004,-0.004 0.539,-0.74 0.543,-0.767 0.085,-0.526 -0.277,-0.466 -0.315,-0.887 -0.04,-0.436 -0.039,-0.787 0.107,-1.222 -0.011,-0.01 -0.021,-0.021 -0.031,-0.031 0.006,-0.35 -0.26,-0.225 -0.603,-0.147 0.047,-1.062 1.058,-1.154 1.228,-1.362 0.545,-0.669 0.357,-1.642 0.992,-2.265 1.564,-1.532 3.347,-0.628 5.117,-0.884 0.994,-0.145 1.846,-0.979 2.747,-0.038 1.059,-1.16 -0.815,-2.535 -0.357,-2.926 0.131,-0.113 0.269,-0.159 0.41,-0.167 -0.026,-0.072 -0.067,-0.136 -0.086,-0.211 1.273,-0.12 2.613,-0.424 3.802,0.202 -0.002,-0.191 0.126,-0.423 0.133,-0.525 0.292,0.349 0.52,0.33 0.892,0.515 0.465,0.233 1.286,0.511 1.594,0.976 0.368,0.553 -0.21,1.319 0.949,1.082 0.089,0.4 0.127,0.358 0.339,0.624 -0.319,0.8 0.629,1.34 0.914,1.912 0.057,0.116 0.062,0.652 0.137,0.854 0.145,0.385 0.556,0.599 0.67,1.081 C 0.581,-0.922 0.074,-0.769 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#265FB5" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#FFF" d="M27.532 18.933c-.051-.525.801-1.828.117-1.734-.837.114-1.491-.462-1.774-.448.906-1.281.233-1.607.031-2.438-.356-1.458.781-2.172-1.25-2.484-1.321-.203-2.233-.066-2.63-1.575-.583.409-1.275.511-1.932.224-.42-.183-.551-.532-.946-.701-.299-.127-.925-.126-1.26-.179-.923-.146-1.399.264-2.227.127.079.12.091.274.146.402-.511.018-.821.36-.876.837-.747-.075-.937.898-.853 1.512L14 12.5l.031.031c-.157 1.625-.818 2.438-2.483 2.693-1.096.168-2.07-.56-3.017-1.146-.208-.128-.571-.409-.766-.625-.28-.311-.478-.747-.75-.969-.125-.102-.391-.188-.354.021-.172 1.078.615 2.421 1.522 2.939-1.242.573.314.916.537 1.111.005.004.54.74.544.768.085.526-.278.466-.316.887-.039.437-.039.787.107 1.222l-.031.031c.006.35-.259.225-.603.146.047 1.062 1.059 1.154 1.228 1.362.545.669.357 1.642.993 2.265 1.564 1.532 3.346.628 5.117.885.994.145 1.846.979 2.747.037 1.059 1.16-.815 2.535-.357 2.927.131.112.269.159.41.167-.026.071-.067.136-.085.211 1.272.12 2.612.424 3.802-.202-.002.191.126.423.133.524.292-.349.52-.329.892-.515.466-.232 1.286-.511 1.595-.976.368-.554-.21-1.319.948-1.082.09-.4.127-.358.34-.624-.319-.8.629-1.34.914-1.912.057-.116.061-.652.137-.854.144-.385.556-.599.67-1.081.208-.887-.299-1.04-.373-1.808z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 1.4 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,9)" id="g20"><path id="path22" style="fill:#75aadb;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,18 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><path id="path24" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 36,13 0,13 0,23 36,23 36,13 Z"/><g transform="translate(17.5771,15.874)" id="g26"><path id="path28" style="fill:#fcbf49;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -1.236,-1.879 0.455,2.203 -1.862,-1.263 1.264,1.861 -2.203,-0.455 1.878,1.236 -2.209,0.423 2.21,0.423 L -3.582,3.785 -1.379,3.33 -2.643,5.191 -0.781,3.928 -1.236,6.131 0,4.252 0.423,6.461 0.846,4.253 2.082,6.131 1.627,3.928 3.488,5.191 2.225,3.33 4.428,3.785 2.549,2.549 4.758,2.126 2.549,1.703 4.428,0.467 2.225,0.922 3.487,-0.938 1.627,0.324 2.082,-1.879 0.846,0 0.423,-2.209 0,0 Z"/></g><g transform="translate(22.6191,20)" id="g30"><path id="path32" style="fill:#843511;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 0.005,0 0,0 Z m -1.084,2 0.005,0 -0.005,0 z M -2.705,3 -2.7,3 -2.705,3 Z m -1.914,0 -0.488,-2.548 -1.425,2.167 0.524,-2.54 -2.147,1.457 1.457,-2.147 -2.54,0.524 2.167,-1.425 -2.548,-0.488 2.548,-0.488 -2.167,-1.426 2.54,0.525 -1.457,-2.146 2.147,1.457 -0.524,-2.541 1.425,2.167 0.488,-2.548 0.488,2.548 1.426,-2.167 -0.525,2.541 2.146,-1.457 -1.457,2.146 L 0,-3.914 -2.167,-2.488 0.381,-2 -2.167,-1.512 0,-0.087 -2.541,-0.611 -1.084,1.536 -3.23,0.079 -2.705,2.619 -4.131,0.452 -4.619,3 Z m 0,-1.33 0.242,-1.265 0.116,-0.605 0.339,0.515 0.707,1.076 -0.26,-1.262 -0.125,-0.604 0.51,0.347 1.066,0.723 -0.724,-1.066 -0.346,-0.509 0.604,0.124 1.261,0.26 -1.076,-0.707 -0.514,-0.339 0.605,-0.116 1.266,-0.242 -1.266,-0.242 -0.604,-0.116 0.513,-0.339 1.076,-0.707 -1.261,0.26 -0.604,0.125 0.346,-0.51 0.724,-1.066 -1.066,0.724 -0.51,0.346 0.125,-0.604 0.26,-1.262 -0.707,1.077 -0.339,0.513 -0.116,-0.604 -0.242,-1.266 -0.242,1.266 -0.116,0.605 -0.339,-0.514 -0.707,-1.077 0.26,1.262 0.124,0.604 -0.509,-0.346 -1.066,-0.724 0.723,1.066 0.346,0.51 -0.603,-0.125 -1.262,-0.26 1.076,0.707 0.515,0.339 -0.605,0.116 -1.265,0.242 1.265,0.242 0.605,0.116 -0.515,0.339 -1.076,0.707 1.262,-0.26 0.603,-0.124 -0.346,0.509 -0.723,1.066 1.066,-0.723 0.509,-0.346 -0.124,0.603 -0.26,1.262 0.707,-1.076 0.339,-0.515 0.116,0.605 0.242,1.265 z"/></g><g transform="translate(16,18)" id="g34"><path id="path36" style="fill:#fcbf49;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,1.105 0.896,2 2,2 3.105,2 4,1.105 4,0 4,-1.104 3.105,-2 2,-2 0.896,-2 0,-1.104 0,0"/></g><g transform="translate(16,18)" id="g38"><path id="path40" style="fill:none;stroke:#843511;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-dasharray:none;stroke-opacity:1" d="M 0,0 C 0,1.105 0.896,2 2,2 3.105,2 4,1.105 4,0 4,-1.104 3.105,-2 2,-2 0.896,-2 0,-1.104 0,0 Z"/></g><g transform="translate(17.8013,18.2261)" id="g42"><path id="path44" style="fill:#c16540;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.155 -0.261,-0.28 -0.583,-0.28 -0.323,0 -0.584,0.125 -0.584,0.28 0,0.155 0.261,0.28 0.584,0.28 C -0.261,0.28 0,0.155 0,0"/></g><g transform="translate(19.3545,18.25)" id="g46"><path id="path48" style="fill:#c16540;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,0.161 -0.266,0.292 -0.594,0.292 -0.328,0 -0.593,-0.131 -0.593,-0.292 0,-0.161 0.265,-0.292 0.593,-0.292 C -0.266,-0.292 0,-0.161 0,0"/></g><g transform="translate(17.4629,17.126)" id="g50"><path id="path52" style="fill:#ed8662;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 C 0,0.126 0.246,0.229 0.548,0.229 0.851,0.229 1.097,0.126 1.097,0 1.097,-0.126 0.851,-0.229 0.548,-0.229 0.246,-0.229 0,-0.126 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#75AADB" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#EEE" d="M0 13h36v10H0z"/><path fill="#FCBF49" d="M18 13l.488 2.548 1.426-2.167-.525 2.54 2.146-1.457-1.457 2.147 2.541-.524-2.167 1.425L23 18l-2.548.488 2.167 1.426-2.541-.525 1.457 2.146-2.146-1.457.525 2.541-1.426-2.167L18 23l-.488-2.548-1.425 2.167.524-2.541-2.147 1.457 1.457-2.146-2.54.525 2.167-1.426L13 18l2.548-.488-2.167-1.425 2.54.524-1.457-2.147 2.147 1.457-.524-2.54 1.425 2.167z"/><path fill="#843511" d="M18 14.33l.242 1.265.116.605.339-.514.708-1.076-.261 1.261-.125.604.51-.346 1.066-.723-.723 1.066-.346.51.603-.125 1.262-.26-1.076.708-.515.337.605.116L21.67 18l-1.265.242-.605.116.514.339 1.076.708-1.262-.261-.604-.125.346.51.723 1.065-1.065-.723-.51-.346.125.604.261 1.262-.708-1.076-.338-.515-.116.605L18 21.67l-.242-1.265-.116-.605-.339.515-.708 1.076.26-1.262.125-.603-.51.346-1.066.723.723-1.066.346-.51-.604.125-1.261.261 1.076-.708.514-.339-.605-.116L14.33 18l1.265-.242.605-.116-.515-.339-1.076-.708 1.261.26.603.125-.346-.51-.724-1.066 1.066.724.51.346-.125-.603-.26-1.261.708 1.076.339.515.116-.605L18 14.33M18 13l-.488 2.548-1.425-2.167.524 2.541-2.147-1.457 1.457 2.147-2.54-.524 2.167 1.425L13 18l2.548.488-2.167 1.426 2.54-.525-1.457 2.146 2.147-1.457-.524 2.541 1.425-2.167L18 23l.488-2.548 1.426 2.167-.525-2.541 2.146 1.457-1.457-2.146 2.541.525-2.167-1.426L23 18l-2.548-.488 2.167-1.425-2.541.524 1.457-2.147-2.146 1.457.525-2.541-1.426 2.167L18 13zm1.914.381h.005-.005zm1.621 1.083h.005-.005zm1.084 1.623h.005-.005z"/><circle fill="#FCBF49" cx="18" cy="18" r="2"/><path fill="#843511" d="M18 20.125c-1.172 0-2.125-.953-2.125-2.125s.953-2.125 2.125-2.125 2.125.953 2.125 2.125-.953 2.125-2.125 2.125zm0-4c-1.034 0-1.875.841-1.875 1.875s.841 1.875 1.875 1.875 1.875-.841 1.875-1.875-.841-1.875-1.875-1.875z"/><path fill="#C16540" d="M17.801 17.774c0 .155-.261.28-.583.28-.323 0-.584-.125-.584-.28 0-.155.261-.28.584-.28.322 0 .583.125.583.28zm1.553-.024c0-.161-.266-.292-.594-.292-.328 0-.594.13-.594.292s.266.292.594.292c.329 0 .594-.131.594-.292z"/><path fill="#ED8662" d="M17.463 18.874c0-.126.246-.229.548-.229.303 0 .548.102.548.229 0 .126-.246.229-.548.229-.303 0-.548-.103-.548-.229z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 8.1 KiB After Width: | Height: | Size: 5.5 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath18" clipPathUnits="userSpaceOnUse"><path id="path20" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><path id="path12" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,13 36,0 0,10.001 -36,0 L 0,13 Z"/><g id="g14"><g clip-path="url(#clipPath18)" id="g16"><g transform="translate(32,31)" id="g22"><path id="path24" style="fill:#ed2939;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-4 36,0 0,4 C 4,-1.791 2.209,0 0,0"/></g><g transform="translate(4,5)" id="g26"><path id="path28" style="fill:#ed2939;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 28,0 c 2.209,0 4,1.791 4,4 L 32,8 -4,8 -4,4 C -4,1.791 -2.209,0 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#EEE" d="M0 13h36v10H0z"/><path fill="#ED2939" d="M32 5H4C1.791 5 0 6.791 0 9v4h36V9c0-2.209-1.791-4-4-4zM4 31h28c2.209 0 4-1.791 4-4v-4H0v4c0 2.209 1.791 4 4 4z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 242 B |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 1.6 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(6.2761,24.7239)" id="g20"><path id="path22" style="fill:#4189dd;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 -0.943,-3.057 -1.886,0 -4.943,0.943 -1.886,1.886 -0.943,4.943 0,1.886 3.057,0.943 0,0 Z m 25.724,6.276 -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-13.055 36,0 0,13.055 c 0,2.209 -1.791,4 -4,4"/></g><g transform="translate(4,5)" id="g24"><path id="path26" style="fill:#4189dd;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 28,0 c 1.872,0 3.431,1.291 3.867,3.028 l -35.734,0 C -3.431,1.291 -1.872,0 0,0"/></g><path id="path28" style="fill:#4189dd;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,10 36,0 0,1.972 -36,0 L 0,10 Z"/><g transform="translate(6.0596,24.9404)" id="g30"><path id="path32" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 -0.726,-2.355 -1.453,0 -3.808,0.726 -1.453,1.453 -0.726,3.808 0,1.453 2.355,0.726 0,0 Z m -0.726,4.726 -0.943,-3.057 -3.057,-0.943 3.057,-0.942 0.943,-3.058 0.942,3.058 3.058,0.942 -3.058,0.943 -0.942,3.057 z"/></g><g transform="translate(5.3333,28.7482)" id="g34"><path id="path36" style="fill:#d21034;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 -0.726,-2.355 -3.081,-3.081 -0.726,-3.808 0,-6.163 0.726,-3.808 3.082,-3.081 0.726,-2.355 0,0 Z"/></g><path id="path38" style="fill:#f9d616;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,11.972 36,0 0,1.972 -36,0 0,-1.972 z"/><g transform="translate(0,9)" id="g40"><path id="path42" style="fill:#f9d616;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-0.337 0.054,-0.659 0.133,-0.972 l 35.734,0 C 35.946,-0.659 36,-0.337 36,0 L 36,1 0,1 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#4189DD" d="M32 5H4C1.791 5 0 6.791 0 9v13.055h36V9c0-2.209-1.791-4-4-4zM6.276 11.276l-.943 3.057-.943-3.057-3.057-.943L4.39 9.39l.943-3.057.943 3.057 3.057.943-3.057.943zM4 31h28c1.872 0 3.431-1.291 3.867-3.028H.133C.569 29.709 2.128 31 4 31zm-4-6.972h36V26H0z"/><path fill="#FFF" d="M5.333 6.333l-.942 3.058-3.057.943 3.057.943.943 3.057.943-3.057 3.057-.943-3.058-.943-.943-3.058zm.727 4.727l-.726 2.355-.727-2.355-2.355-.726 2.355-.726.726-2.355.727 2.354 2.355.726-2.355.727z"/><path fill="#D21034" d="M5.333 7.252l-.726 2.355-2.355.726 2.355.727.726 2.355.727-2.355 2.355-.727-2.355-.726z"/><path fill="#F9D616" d="M0 22.055h36v1.972H0zM0 27c0 .337.054.659.133.972h35.734c.079-.313.133-.635.133-.972v-1H0v1z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 794 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath36" clipPathUnits="userSpaceOnUse"><path id="path38" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g transform="translate(16.0002,30.9996)" id="g12"><path id="path14" style="fill:#ffce00;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-9 0,-2 20,0 0,2 -18,0 0,9 -2,0 z"/></g><g transform="translate(16.0002,16.0002)" id="g16"><path id="path18" style="fill:#ffce00;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-2 0,-9 2,0 0,9 0.5,0 17.5,0 0,2 -20,0 z"/></g><g transform="translate(0,16.0002)" id="g20"><path id="path22" style="fill:#ffce00;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-2 11,0 0,-9 2,0 0,9 0,2 -13,0 z"/></g><g transform="translate(10.9998,30.9996)" id="g24"><path id="path26" style="fill:#ffce00;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-9 -11,0 0,-2 13,0 0,2 0,9 -2,0 z"/></g><g transform="translate(12.9996,30.9996)" id="g28"><path id="path30" style="fill:#d21034;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-11 -13,0 0,-3.999 13,0 0,-11 3.001,0 0,11 19.999,0 0,3.999 -19.999,0 0,11 L 0,0 Z"/></g><g id="g32"><g clip-path="url(#clipPath36)" id="g34"><g transform="translate(18,14)" id="g40"><path id="path42" style="fill:#0053a5;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-9 14,0 c 2.209,0 4,1.791 4,4 L 18,0 0,0 Z"/></g><g transform="translate(0,14)" id="g44"><path id="path46" style="fill:#0053a5;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0,-5 c 0,-2.209 1.791,-4 4,-4 l 7,0 0,9 -11,0 z"/></g><g transform="translate(11,31)" id="g48"><path id="path50" style="fill:#0053a5;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -7,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-5 11,0 0,9 z"/></g><g transform="translate(32,31)" id="g52"><path id="path54" style="fill:#0053a5;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -14,0 0,-9 18,0 0,5 C 4,-1.791 2.209,0 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFCE00" d="M18 5h-2v11h20v-2H18zm-2 17v9h2v-9h18v-2H16zm-3-2H0v2h11v9h2v-9zm0-6V5h-2v9H0v2h13z"/><path fill="#D21034" d="M16 5h-3v11H0v4h13v11h3V20h20v-4H16z"/><path fill="#0053A5" d="M18 22v9h14c2.209 0 4-1.791 4-4v-5H18zM0 22v5c0 2.209 1.791 4 4 4h7v-9H0zM11 5H4C1.791 5 0 6.791 0 9v5h11V5zm21 0H18v9h18V9c0-2.209-1.791-4-4-4z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 410 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath18" clipPathUnits="userSpaceOnUse"><path id="path20" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><path id="path12" style="fill:#e00034;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,13 36,0 0,10.001 -36,0 L 0,13 Z"/><g id="g14"><g clip-path="url(#clipPath18)" id="g16"><g transform="translate(32,31)" id="g22"><path id="path24" style="fill:#0098c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-4 36,0 0,4 C 4,-1.791 2.209,0 0,0"/></g><g transform="translate(17.8445,14.6667)" id="g26"><path id="path28" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -1.841,0 -3.333,1.492 -3.333,3.333 0,1.841 1.492,3.334 3.333,3.334 0.982,0 1.865,-0.425 2.475,-1.101 -0.718,1.066 -1.937,1.767 -3.319,1.767 -2.21,0 -4,-1.791 -4,-4 0,-2.209 1.79,-4 4,-4 1.382,0 2.601,0.702 3.319,1.768 C 1.865,0.425 0.982,0 0,0"/></g><g transform="translate(23.6667,18.0016)" id="g30"><path id="path32" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -1.196,0.424 0.544,1.147 -1.146,-0.546 -0.426,1.196 -0.424,-1.196 -0.003,0.001 -1.144,0.543 0.546,-1.146 -1.195,-0.426 1.196,-0.424 -0.544,-1.147 1.14,0.543 0.005,0.003 0.426,-1.196 0.425,1.196 1.146,-0.544 -0.545,1.146 L 0,0 Z"/></g><g transform="translate(4,5)" id="g34"><path id="path36" style="fill:#00ae65;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 28,0 c 2.209,0 4,1.791 4,4 L 32,8 -4,8 -4,4 C -4,1.791 -2.209,0 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E00034" d="M0 13h36v10H0z"/><path fill="#0098C3" d="M32 5H4C1.791 5 0 6.791 0 9v4h36V9c0-2.209-1.791-4-4-4z"/><g fill="#FFF"><path d="M17.844 21.333c-1.841 0-3.333-1.492-3.333-3.333 0-1.841 1.492-3.333 3.333-3.333.982 0 1.865.425 2.475 1.101C19.601 14.701 18.382 14 17 14c-2.209 0-4 1.791-4 4s1.791 4 4 4c1.382 0 2.601-.701 3.32-1.768-.61.676-1.493 1.101-2.476 1.101z"/><path d="M23.667 17.998l-1.196-.424.544-1.146-1.146.545-.426-1.195-.424 1.196-.003-.002-1.144-.542.546 1.146-1.196.426 1.196.424-.544 1.146 1.141-.543.005-.002.426 1.195.424-1.196 1.147.544-.546-1.146z"/></g><path fill="#00AE65" d="M4 31h28c2.209 0 4-1.791 4-4v-4H0v4c0 2.209 1.791 4 4 4z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 740 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,4)" id="g20"><path id="path22" style="fill:#3b88c3;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,28 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(15.0874,15.6191)" id="g24"><path id="path26" style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 5.891,0 3.008,8.992 2.946,8.992 0,0 Z m -0.341,11.256 c 0.527,1.426 1.736,2.573 3.318,2.573 1.643,0 2.791,-1.085 3.317,-2.573 l 6.078,-16.867 c 0.185,-0.496 0.248,-0.931 0.248,-1.148 0,-1.209 -0.993,-2.046 -2.139,-2.046 -1.303,0 -1.954,0.682 -2.264,1.612 l -0.93,2.915 -8.62,0 -0.93,-2.884 c -0.31,-0.961 -0.962,-1.643 -2.233,-1.643 -1.24,0 -2.294,0.93 -2.294,2.17 0,0.496 0.155,0.868 0.217,1.024 l 6.232,16.867 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3B88C3" d="M36 32c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V4c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v28z"/><path fill="#FFF" d="M14.747 9.125c.527-1.426 1.736-2.573 3.317-2.573 1.643 0 2.792 1.085 3.318 2.573l6.077 16.867c.186.496.248.931.248 1.147 0 1.209-.992 2.046-2.139 2.046-1.303 0-1.954-.682-2.264-1.611l-.931-2.915h-8.62l-.93 2.884c-.31.961-.961 1.642-2.232 1.642-1.24 0-2.294-.93-2.294-2.17 0-.496.155-.868.217-1.023l6.233-16.867zm.34 11.256h5.891l-2.883-8.992h-.062l-2.946 8.992z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 576 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,31)" id="g20"><path id="path22" style="fill:#2d3189;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -22.823,0 -0.665,-0.484 0.364,-1.123 -0.955,0.695 -0.956,-0.695 0.365,1.123 L -25.335,0 -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-18 c 0,-2.209 1.791,-4 4,-4 l 19.725,0 0.105,0.324 -0.955,0.695 1.181,0 0.365,1.122 0.365,-1.122 1.181,0 -0.956,-0.695 L -6.883,-26 0,-26 c 2.209,0 4,1.791 4,4 L 4,-4 C 4,-1.791 2.209,0 0,0"/></g><g transform="translate(6.9654,29.3931)" id="g24"><path id="path26" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 0.956,0.695 1.911,0 1.546,1.123 2.212,1.607 -0.301,1.607 0.365,1.123 0,0 Z"/></g><g transform="translate(25.9668,6.0186)" id="g28"><path id="path30" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 -1.181,0 -1.546,1.123 -1.911,0 l -1.181,0 0.955,-0.695 -0.105,-0.324 1.392,0 -0.105,0.324 L 0,0 Z"/></g><g transform="translate(9.9986,29.1846)" id="g32"><path id="path34" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.365,-1.123 1.181,0 L 0.591,-1.817 0.955,-2.94 0,-2.246 -0.956,-2.94 l 0.365,1.123 -0.955,0.694 1.181,0 L 0,0 Z"/></g><g transform="translate(12.0683,26.0352)" id="g36"><path id="path38" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.365,-1.123 1.181,0 L 0.591,-1.817 0.955,-2.94 0,-2.246 -0.956,-2.94 l 0.365,1.123 -0.955,0.694 1.181,0 L 0,0 Z"/></g><g transform="translate(14.1216,22.8867)" id="g40"><path id="path42" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.365,-1.123 1.181,0 L 0.591,-1.818 0.956,-2.941 0,-2.246 l -0.956,-0.695 0.365,1.123 -0.955,0.695 1.181,0 L 0,0 Z"/></g><g transform="translate(16.1831,19.7373)" id="g44"><path id="path46" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.365,-1.123 1.181,0 L 0.591,-1.817 0.956,-2.94 0,-2.246 -0.956,-2.94 l 0.365,1.123 -0.955,0.694 1.181,0 L 0,0 Z"/></g><g transform="translate(18.2444,16.5884)" id="g48"><path id="path50" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.365,-1.124 1.181,0 L 0.591,-1.817 0.956,-2.941 0,-2.246 l -0.955,-0.695 0.364,1.124 -0.955,0.693 1.181,0 L 0,0 Z"/></g><g transform="translate(20.3059,13.4395)" id="g52"><path id="path54" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.365,-1.123 1.181,0 L 0.591,-1.818 0.956,-2.94 0,-2.246 -0.955,-2.94 l 0.364,1.122 -0.955,0.695 1.181,0 L 0,0 Z"/></g><g transform="translate(22.3594,10.2906)" id="g56"><path id="path58" style="fill:#e1e8ed;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.365,-1.124 1.181,0 L 0.591,-1.818 0.956,-2.941 0,-2.247 l -0.956,-0.694 0.365,1.123 -0.955,0.694 1.181,0 L 0,0 Z"/></g><g transform="translate(28,5)" id="g60"><path id="path62" style="fill:#fbd116;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 0,26 -17,26 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#2D3189" d="M32 5H9.177l-.665.484.365 1.123-.956-.695-.956.695.365-1.123L6.665 5H4C1.791 5 0 6.791 0 9v18c0 2.209 1.791 4 4 4h19.725l.105-.324-.955-.695h1.181l.365-1.123.365 1.123h1.181l-.955.695.105.324H32c2.209 0 4-1.791 4-4V9c0-2.209-1.791-4-4-4z"/><path fill="#E1E8ED" d="M6.965 6.607l.956-.695.955.695-.364-1.123L9.177 5H6.665l.665.484zm19.002 23.374h-1.181l-.365-1.122-.365 1.122h-1.181l.955.695-.105.324h1.392l-.106-.324zM9.999 6.815l.364 1.123h1.182l-.956.695.365 1.123-.955-.695-.956.695.365-1.123-.955-.695h1.18zm2.069 3.15l.365 1.122h1.182l-.956.695.365 1.123-.956-.694-.955.694.365-1.123-.956-.695h1.181zm2.054 3.148l.365 1.123h1.181l-.956.695.365 1.123-.955-.695-.956.695.365-1.123-.955-.695h1.181zm2.061 3.15l.365 1.123h1.181l-.955.694.365 1.123-.956-.694-.955.694.365-1.123-.956-.694h1.181zm2.061 3.149l.365 1.123h1.182l-.956.694.365 1.124-.956-.695-.955.695.365-1.124-.955-.694h1.181zm2.062 3.149l.365 1.123h1.181l-.955.694.364 1.123-.955-.694-.955.694.364-1.123-.955-.694h1.181zm2.053 3.148l.365 1.124h1.182l-.956.694.365 1.123-.956-.694-.955.694.365-1.123-.956-.694h1.181z"/><path fill="#FBD116" d="M28 31V5H11z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 1.2 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,9)" id="g20"><path id="path22" style="fill:#00267f;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,18 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(4,31)" id="g24"><path id="path26" style="fill:#00267f;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-18 c 0,-2.209 1.791,-4 4,-4 l 8,0 0,26 -8,0 z"/></g><path id="path28" style="fill:#ffc726;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 24,5 12,5 12,31 24,31 24,5 Z"/><g transform="translate(22.8301,22.4844)" id="g30"><path id="path32" style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -1.406,0 -2.5,-1.031 -2.859,-1.437 0.421,0.093 0.515,-0.235 0.453,-0.438 -0.444,-1.477 -0.819,-3.215 -0.931,-4.15 l -0.903,0 0,5.185 1.09,0.226 -1.366,0.274 -0.283,1.377 -0.283,-1.377 -1.368,-0.274 1.1,-0.228 0,-5.183 -0.946,0 c -0.112,0.935 -0.487,2.673 -0.932,4.15 -0.062,0.203 0.032,0.531 0.454,0.438 C -7.134,-1.031 -8.228,0 -9.634,0 c 0.614,-0.906 2.245,-3.432 2.458,-6.403 l 0,-0.622 1.826,0 0,-2.414 1.11,0 0,2.414 1.756,0 0,0.231 C -2.399,-3.653 -0.64,-0.945 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#00267F" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#00267F" d="M4 5C1.791 5 0 6.791 0 9v18c0 2.209 1.791 4 4 4h8V5H4z"/><path fill="#FFC726" d="M12 5h12v26H12z"/><path d="M22.83 13.516c-1.406 0-2.5 1.031-2.859 1.438.422-.094.516.234.453.438-.444 1.477-.819 3.215-.931 4.15h-.903v-5.186l1.09-.226-1.366-.273-.283-1.377-.283 1.377-1.367.273 1.1.228v5.184h-.947c-.112-.936-.487-2.674-.931-4.15-.062-.203.031-.531.453-.438-.359-.406-1.453-1.438-2.859-1.438.613.906 2.245 3.432 2.458 6.403v.622h1.826v2.414h1.109v-2.414h1.756v-.232c.085-3.14 1.844-5.848 2.484-6.793z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 2 KiB After Width: | Height: | Size: 716 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(36,9)" id="g20"><path id="path22" style="fill:#006a4d;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 -1.791,-4 -4,-4 l -28,0 c -2.209,0 -4,1.791 -4,4 l 0,18 c 0,2.209 1.791,4 4,4 l 28,0 c 2.209,0 4,-1.791 4,-4 L 0,0 Z"/></g><g transform="translate(23,18.5)" id="g24"><path id="path26" style="fill:#f42a41;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-3.866 -3.134,-7 -7,-7 -3.866,0 -7,3.134 -7,7 0,3.866 3.134,7 7,7 3.866,0 7,-3.134 7,-7"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#006A4D" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><circle fill="#F42A41" cx="16" cy="17.5" r="7"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 239 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(4,31)" id="g20"><path id="path22" style="fill:#141414;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-18 c 0,-2.209 1.791,-4 4,-4 l 8,0 0,26 -8,0 z"/></g><path id="path24" style="fill:#fee833;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 12,5 24,5 24,31 12,31 12,5 Z"/><g transform="translate(32,31)" id="g26"><path id="path28" style="fill:#ee232c;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -8,0 0,-26 8,0 c 2.209,0 4,1.791 4,4 L 4,-4 C 4,-1.791 2.209,0 0,0"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#141414" d="M4 5C1.791 5 0 6.791 0 9v18c0 2.209 1.791 4 4 4h8V5H4z"/><path fill="#FEE833" d="M12 5h12v26H12z"/><path fill="#EE232C" d="M32 5h-8v26h8c2.209 0 4-1.791 4-4V9c0-2.209-1.791-4-4-4z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 272 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(19.6023,17.0582)" id="g20"><path id="path22" style="fill:#009e49;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 0.99,-3.048 -2.592,1.884 -2.593,-1.884 0.99,3.048 -1.296,0.942 -15.101,0 0,-9 c 0,-2.209 1.791,-4 4,-4 l 28,0 c 2.209,0 4,1.791 4,4 l 0,9 -15.102,0 L 0,0 Z"/></g><g transform="translate(32,31)" id="g24"><path id="path26" style="fill:#ef2b2d;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-9 15.101,0 -1.296,0.942 3.205,0 0.99,3.048 0.99,-3.048 3.205,0 L -11.101,-13 4,-13 4,-4 C 4,-1.791 2.209,0 0,0"/></g><g transform="translate(15.4075,14.0104)" id="g28"><path id="path30" style="fill:#fcd116;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 2.593,1.884 5.185,0 4.195,3.048 5.491,3.99 l 1.296,0.941 -3.204,0 -0.99,3.048 -0.991,-3.048 -3.204,0 L -0.306,3.99 0.99,3.048 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#009E49" d="M19.602 18.942l.99 3.048L18 20.106l-2.593 1.884.99-3.048L15.101 18H0v9c0 2.209 1.791 4 4 4h28c2.209 0 4-1.791 4-4v-9H20.899l-1.297.942z"/><path fill="#EF2B2D" d="M32 5H4C1.791 5 0 6.791 0 9v9h15.101l-1.296-.942h3.205L18 14.01l.99 3.048h3.205L20.899 18H36V9c0-2.209-1.791-4-4-4z"/><path fill="#FCD116" d="M15.407 21.99L18 20.106l2.593 1.884-.991-3.048L20.899 18l1.296-.942H18.99L18 14.01l-.99 3.048h-3.205l1.296.942 1.297.942z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 518 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,31)" id="g20"><path id="path22" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -28,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-5 36,0 0,5 C 4,-1.791 2.209,0 0,0"/></g><g transform="translate(0,9)" id="g24"><path id="path26" style="fill:#d62612;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 c 0,-2.209 1.791,-4 4,-4 l 28,0 c 2.209,0 4,1.791 4,4 L 36,5 0,5 0,0 Z"/></g><path id="path28" style="fill:#00966e;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 36,14 -36,0 0,8 36,0 0,-8 z"/></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#EEE" d="M32 5H4C1.791 5 0 6.791 0 9v5h36V9c0-2.209-1.791-4-4-4z"/><path fill="#D62612" d="M0 27c0 2.209 1.791 4 4 4h28c2.209 0 4-1.791 4-4v-5H0v5z"/><path fill="#00966E" d="M0 14h36v8H0z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 268 B |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 4,31 C 1.791,31 0,29.209 0,27 L 0,27 0,9 C 0,6.791 1.791,5 4,5 l 0,0 28,0 c 2.209,0 4,1.791 4,4 l 0,0 0,18 c 0,2.209 -1.791,4 -4,4 l 0,0 -28,0 z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(8,10.2001)" id="g20"><path id="path22" style="fill:#eeeeee;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 6.081,2.6 0,5.2 6.081,7.8 0,10.4 6.081,13 0,15.6 6.081,18.2 0,20.8 l -8,0 0,-26 8,0 6.081,2.6 L 0,0 Z"/></g><g transform="translate(8,31)" id="g24"><path id="path26" style="fill:#ce1126;fill-opacity:1;fill-rule:nonzero;stroke:none" d="M 0,0 6.081,-2.6 0,-5.2 6.081,-7.8 0,-10.4 6.081,-13 0,-15.6 6.081,-18.2 0,-20.8 6.081,-23.4 0,-26 28,-26 28,0 0,0 Z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#EEE" d="M15 6L8 5H4C1.791 5 0 6.791 0 9v18c0 2.209 1.791 4 4 4h4l7-1V6z"/><path fill="#CE1126" d="M32 5H8l6.081 2.6L8 10.2l6.081 2.6L8 15.4l6.081 2.6L8 20.6l6.081 2.6L8 25.8l6.081 2.6L8 31h24c2.209 0 4-1.791 4-4V9c0-2.209-1.791-4-4-4z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 316 B |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 1.9 KiB |
|
|
@ -1 +1 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 45 45" style="enable-background:new 0 0 45 45;" xml:space="preserve" version="1.1" id="svg2"><metadata id="metadata8"><rdf:RDF><cc:Work rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/></cc:Work></rdf:RDF></metadata><defs id="defs6"><clipPath id="clipPath16" clipPathUnits="userSpaceOnUse"><path id="path18" d="M 0,36 36,36 36,0 0,0 0,36 Z"/></clipPath></defs><g transform="matrix(1.25,0,0,-1.25,0,45)" id="g10"><g id="g12"><g clip-path="url(#clipPath16)" id="g14"><g transform="translate(32,31)" id="g20"><path id="path22" style="fill:#fcd116;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -18,0 0,-13 22,0 0,9 C 4,-1.791 2.209,0 0,0"/></g><g transform="translate(14,5)" id="g24"><path id="path26" style="fill:#e8112d;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 18,0 c 2.209,0 4,1.791 4,4 L 22,13 0,13 0,0 Z"/></g><g transform="translate(14,31)" id="g28"><path id="path30" style="fill:#008751;fill-opacity:1;fill-rule:nonzero;stroke:none" d="m 0,0 -10,0 c -2.209,0 -4,-1.791 -4,-4 l 0,-9 0,-9 c 0,-2.209 1.791,-4 4,-4 l 10,0 0,13 0,13 z"/></g></g></g></g></svg>
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FCD116" d="M32 5H14v13h22V9c0-2.209-1.791-4-4-4z"/><path fill="#E8112D" d="M14 31h18c2.209 0 4-1.791 4-4v-9H14v13z"/><path fill="#008751" d="M14 5H4C1.791 5 0 6.791 0 9v18c0 2.209 1.791 4 4 4h10V5z"/></svg>
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 279 B |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 3 KiB |