Release -> Output Inspection, Session Management, General Bug Fixing and UI Improvements (#2104)

This commit is contained in:
Gabriel Luiz Freitas Almeida 2024-06-11 09:08:24 -07:00 committed by GitHub
commit aa94e42e0d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
443 changed files with 20610 additions and 11379 deletions

View file

@ -86,6 +86,10 @@ def update_frontend_node_with_template_values(frontend_node, raw_frontend_node):
update_template_values(frontend_node["template"], raw_frontend_node["template"])
old_code = raw_frontend_node["template"]["code"]["value"]
new_code = frontend_node["template"]["code"]["value"]
frontend_node["edited"] = old_code != new_code
return frontend_node
@ -204,16 +208,18 @@ def format_elapsed_time(elapsed_time: float) -> str:
return f"{minutes} {minutes_unit}, {seconds} {seconds_unit}"
async def build_and_cache_graph_from_db(
flow_id: str,
session: Session,
chat_service: "ChatService",
):
async def build_and_cache_graph_from_db(flow_id: str, session: Session, chat_service: "ChatService"):
"""Build and cache the graph."""
flow: Optional[Flow] = session.get(Flow, flow_id)
if not flow or not flow.data:
raise ValueError("Invalid flow ID")
graph = Graph.from_payload(flow.data, flow_id)
for vertex_id in graph._has_session_id_vertices:
vertex = graph.get_vertex(vertex_id)
if vertex is None:
raise ValueError(f"Vertex {vertex_id} not found")
if not vertex._raw_params.get("session_id"):
vertex.update_raw_params({"session_id": flow_id}, overwrite=True)
await chat_service.set_cache(flow_id, graph)
return graph
@ -317,3 +323,4 @@ def parse_exception(exc):
if hasattr(exc, "body"):
return exc.body["message"]
return str(exc)
return str(exc)

View file

@ -22,6 +22,7 @@ from langflow.api.v1.schemas import (
VertexBuildResponse,
VerticesOrderResponse,
)
from langflow.schema.schema import Log
from langflow.services.auth.utils import get_current_active_user
from langflow.services.chat.service import ChatService
from langflow.services.deps import get_chat_service, get_session, get_session_service
@ -123,6 +124,7 @@ async def build_vertex(
vertex_id: str,
background_tasks: BackgroundTasks,
inputs: Annotated[Optional[InputValueRequest], Body(embed=True)] = None,
files: Optional[list[str]] = None,
chat_service: "ChatService" = Depends(get_chat_service),
current_user=Depends(get_current_active_user),
):
@ -159,6 +161,7 @@ async def build_vertex(
else:
graph = cache.get("result")
vertex = graph.get_vertex(vertex_id)
try:
lock = chat_service._cache_locks[flow_id_str]
(
@ -175,19 +178,25 @@ async def build_vertex(
vertex_id=vertex_id,
user_id=current_user.id,
inputs_dict=inputs.model_dump() if inputs else {},
files=files,
)
log_obj = Log(message=vertex.artifacts_raw, type=vertex.artifacts_type)
result_data_response = ResultDataResponse(**result_dict.model_dump())
except Exception as exc:
logger.exception(f"Error building vertex: {exc}")
params = format_exception_message(exc)
valid = False
log_obj = Log(message=params, type="error")
result_data_response = ResultDataResponse(results={})
artifacts = {}
# If there's an error building the vertex
# we need to clear the cache
await chat_service.clear_cache(flow_id_str)
result_data_response.message = artifacts
result_data_response.logs.append(log_obj)
# Log the vertex build
if not vertex.will_stream:
background_tasks.add_task(

View file

@ -2,6 +2,7 @@ import hashlib
from http import HTTPStatus
from io import BytesIO
from uuid import UUID
from pathlib import Path
from fastapi import APIRouter, Depends, HTTPException, UploadFile
from fastapi.responses import StreamingResponse
@ -99,6 +100,46 @@ async def download_image(file_name: str, flow_id: UUID, storage_service: Storage
raise HTTPException(status_code=500, detail=str(e))
@router.get("/profile_pictures/{folder_name}/{file_name}")
async def download_profile_picture(
folder_name: str,
file_name: str,
storage_service: StorageService = Depends(get_storage_service),
):
try:
extension = file_name.split(".")[-1]
config_dir = get_storage_service().settings_service.settings.config_dir
config_path = Path(config_dir)
folder_path = config_path / "profile_pictures" / folder_name
content_type = build_content_type_from_extension(extension)
file_content = await storage_service.get_file(flow_id=folder_path, file_name=file_name)
return StreamingResponse(BytesIO(file_content), media_type=content_type)
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/profile_pictures/list")
async def list_profile_pictures(storage_service: StorageService = Depends(get_storage_service)):
try:
config_dir = get_storage_service().settings_service.settings.config_dir
config_path = Path(config_dir)
people_path = config_path / "profile_pictures/People"
space_path = config_path / "profile_pictures/Space"
people = await storage_service.list_files(flow_id=people_path)
space = await storage_service.list_files(flow_id=space_path)
files = [Path("People") / i for i in people]
files += [Path("Space") / i for i in space]
return {"files": files}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/list/{flow_id}")
async def list_files(
flow_id: UUID = Depends(get_flow_id), storage_service: StorageService = Depends(get_storage_service)

View file

@ -31,25 +31,60 @@ def create_flow(
flow: FlowCreate,
current_user: User = Depends(get_current_active_user),
):
"""Create a new flow."""
if flow.user_id is None:
flow.user_id = current_user.id
try:
"""Create a new flow."""
if flow.user_id is None:
flow.user_id = current_user.id
db_flow = Flow.model_validate(flow, from_attributes=True)
db_flow.updated_at = datetime.now(timezone.utc)
# First check if the flow.name is unique
# there might be flows with name like: "MyFlow", "MyFlow (1)", "MyFlow (2)"
# so we need to check if the name is unique with `like` operator
# if we find a flow with the same name, we add a number to the end of the name
# based on the highest number found
if session.exec(select(Flow).where(Flow.name == flow.name).where(Flow.user_id == current_user.id)).first():
flows = session.exec(
select(Flow).where(Flow.name.like(f"{flow.name} (%")).where(Flow.user_id == current_user.id)
).all()
if flows:
numbers = [int(flow.name.split("(")[1].split(")")[0]) for flow in flows]
flow.name = f"{flow.name} ({max(numbers) + 1})"
else:
flow.name = f"{flow.name} (1)"
if db_flow.folder_id is None:
# Make sure flows always have a folder
default_folder = session.exec(
select(Folder).where(Folder.name == DEFAULT_FOLDER_NAME, Folder.user_id == current_user.id)
).first()
if default_folder:
db_flow.folder_id = default_folder.id
db_flow = Flow.model_validate(flow, from_attributes=True)
db_flow.updated_at = datetime.now(timezone.utc)
session.add(db_flow)
session.commit()
session.refresh(db_flow)
return db_flow
if db_flow.folder_id is None:
# Make sure flows always have a folder
default_folder = session.exec(
select(Folder).where(Folder.name == DEFAULT_FOLDER_NAME, Folder.user_id == current_user.id)
).first()
if default_folder:
db_flow.folder_id = default_folder.id
session.add(db_flow)
session.commit()
session.refresh(db_flow)
return db_flow
except Exception as e:
# If it is a validation error, return the error message
if hasattr(e, "errors"):
raise HTTPException(status_code=400, detail=str(e)) from e
elif "UNIQUE constraint failed" in str(e):
# Get the name of the column that failed
columns = str(e).split("UNIQUE constraint failed: ")[1].split(".")[1].split("\n")[0]
# UNIQUE constraint failed: flow.user_id, flow.name
# or UNIQUE constraint failed: flow.name
# if the column has id in it, we want the other column
column = columns.split(",")[1] if "id" in columns.split(",")[0] else columns.split(",")[0]
raise HTTPException(
status_code=400, detail=f"{column.capitalize().replace('_', ' ')} must be unique"
) from e
elif isinstance(e, HTTPException):
raise e
else:
raise HTTPException(status_code=500, detail=str(e)) from e
@router.get("/", response_model=list[FlowRead], status_code=200)

View file

@ -7,6 +7,8 @@ from sqlmodel import Session, select
from langflow.api.v1.flows import create_flows
from langflow.api.v1.schemas import FlowListCreate, FlowListReadWithFolderName
from langflow.helpers.flow import generate_unique_flow_name
from langflow.helpers.folders import generate_unique_folder_name
from langflow.services.auth.utils import get_current_active_user
from langflow.services.database.models.flow.model import Flow, FlowCreate, FlowRead
from langflow.services.database.models.folder.constants import DEFAULT_FOLDER_NAME
@ -33,17 +35,27 @@ def create_folder(
try:
new_folder = Folder.model_validate(folder, from_attributes=True)
new_folder.user_id = current_user.id
folder_results = session.exec(
select(Folder).where(
Folder.name.like(f"{new_folder.name}%"), # type: ignore
Folder.user_id == current_user.id,
# First check if the folder.name is unique
# there might be flows with name like: "MyFlow", "MyFlow (1)", "MyFlow (2)"
# so we need to check if the name is unique with `like` operator
# if we find a flow with the same name, we add a number to the end of the name
# based on the highest number found
if session.exec(
statement=select(Folder).where(Folder.name == new_folder.name).where(Folder.user_id == current_user.id)
).first():
folder_results = session.exec(
select(Folder).where(
Folder.name.like(f"{new_folder.name}%"), # type: ignore
Folder.user_id == current_user.id,
)
)
)
existing_folder_names = [folder.name for folder in folder_results]
if existing_folder_names:
new_folder.name = f"{new_folder.name} ({len(existing_folder_names) + 1})"
if folder_results:
folder_names = [folder.name for folder in folder_results]
folder_numbers = [int(name.split("(")[-1].split(")")[0]) for name in folder_names if "(" in name]
if folder_numbers:
new_folder.name = f"{new_folder.name} ({max(folder_numbers) + 1})"
else:
new_folder.name = f"{new_folder.name} (1)"
session.add(new_folder)
session.commit()
@ -203,16 +215,9 @@ async def upload_file(
if not data:
raise HTTPException(status_code=400, detail="No flows found in the file")
folder_results = session.exec(
select(Folder).where(
Folder.name == data["folder_name"],
Folder.user_id == current_user.id,
)
)
existing_folder_names = [folder.name for folder in folder_results]
folder_name = generate_unique_folder_name(data["folder_name"], current_user.id, session)
if existing_folder_names:
data["folder_name"] = f"{data['folder_name']} ({len(existing_folder_names) + 1})"
data["folder_name"] = folder_name
folder = FolderCreate(name=data["folder_name"], description=data["folder_description"])
@ -232,6 +237,8 @@ async def upload_file(
raise HTTPException(status_code=400, detail="No flows found in the data")
# Now we set the user_id for all flows
for flow in flow_list.flows:
flow_name = generate_unique_flow_name(flow.name, current_user.id, session)
flow.name = flow_name
flow.user_id = current_user.id
flow.folder_id = new_folder.id

View file

@ -1,4 +1,5 @@
from typing import List, Optional
from fastapi import APIRouter, Depends, HTTPException, Query
from langflow.services.deps import get_monitor_service
@ -79,7 +80,7 @@ async def delete_messages(
@router.post("/messages/{message_id}", response_model=MessageModelResponse)
async def update_message(
message_id: str,
message_id: int,
message: MessageModelRequest,
monitor_service: MonitorService = Depends(get_monitor_service),
):
@ -117,6 +118,22 @@ async def get_transactions(
dicts = monitor_service.get_transactions(
source=source, target=target, status=status, order_by=order_by, flow_id=flow_id
)
return [TransactionModelResponse(**d) for d in dicts]
result = []
for d in dicts:
d = TransactionModelResponse(
index=d["index"],
timestamp=d["timestamp"],
vertex_id=d["vertex_id"],
inputs=d["inputs"],
outputs=d["outputs"],
status=d["status"],
error=d["error"],
flow_id=d["flow_id"],
source=d["vertex_id"],
target=d["target_id"],
)
result.append(d)
return result
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
raise HTTPException(status_code=500, detail=str(e))

View file

@ -9,7 +9,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_serial
from langflow.graph.schema import RunOutputs
from langflow.schema import dotdict
from langflow.schema.graph import Tweaks
from langflow.schema.schema import InputType, OutputType
from langflow.schema.schema import InputType, Log, OutputType
from langflow.services.database.models.api_key.model import ApiKeyRead
from langflow.services.database.models.base import orjson_dumps
from langflow.services.database.models.flow import FlowCreate, FlowRead
@ -245,6 +245,8 @@ class VerticesOrderResponse(BaseModel):
class ResultDataResponse(BaseModel):
results: Optional[Any] = Field(default_factory=dict)
logs: List[Log | None] = Field(default_factory=list)
message: Optional[Any] = Field(default_factory=dict)
artifacts: Optional[Any] = Field(default_factory=dict)
timedelta: Optional[float] = None
duration: Optional[str] = None

View file

@ -7,7 +7,7 @@ from langchain_core.runnables import Runnable
from langflow.base.agents.utils import get_agents_list, records_to_messages
from langflow.custom import CustomComponent
from langflow.field_typing import Text, Tool
from langflow.schema.schema import Record
from langflow.schema import Record
class LCAgentComponent(CustomComponent):

View file

@ -13,7 +13,7 @@ from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate
from langchain_core.tools import BaseTool
from pydantic import BaseModel
from langflow.schema.schema import Record
from langflow.schema import Record
from .default_prompts import XML_AGENT_PROMPT

View file

@ -7,9 +7,11 @@ Constants:
- FIELD_FORMAT_ATTRIBUTES: A list of attributes used for formatting fields.
"""
import orjson
STREAM_INFO_TEXT = "Stream the response from the model. Streaming works only in Chat."
NODE_FORMAT_ATTRIBUTES = ["beta", "icon", "display_name", "description"]
NODE_FORMAT_ATTRIBUTES = ["beta", "icon", "display_name", "description", "output_types"]
FIELD_FORMAT_ATTRIBUTES = [
@ -27,3 +29,5 @@ FIELD_FORMAT_ATTRIBUTES = [
"refresh_button_text",
"options",
]
ORJSON_OPTIONS = orjson.OPT_INDENT_2 | orjson.OPT_SORT_KEYS | orjson.OPT_OMIT_MICROSECONDS

View file

@ -1,13 +1,14 @@
import json
import unicodedata
import xml.etree.ElementTree as ET
from concurrent import futures
from pathlib import Path
from typing import Callable, List, Optional, Text
import chardet
import orjson
import yaml
from langflow.schema.schema import Record
from langflow.schema import Record
# Types of files that can be read simply by file.read()
# and have 100% to be completely readable
@ -32,6 +33,17 @@ TEXT_FILE_TYPES = [
"tsx",
]
IMG_FILE_TYPES = [
"jpg",
"jpeg",
"png",
"bmp",
]
def normalize_text(text):
return unicodedata.normalize("NFKD", text)
def is_hidden(path: Path) -> bool:
return path.name.startswith(".")
@ -125,9 +137,15 @@ def parse_text_file_to_record(file_path: str, silent_errors: bool) -> Optional[R
text = read_docx_file(file_path)
else:
text = read_text_file(file_path)
# if file is json, yaml, or xml, we can parse it
if file_path.endswith(".json"):
text = json.loads(text)
text = orjson.loads(text)
if isinstance(text, dict):
text = {k: normalize_text(v) if isinstance(v, str) else v for k, v in text.items()}
elif isinstance(text, list):
text = [normalize_text(item) if isinstance(item, str) else item for item in text]
elif file_path.endswith(".yaml") or file_path.endswith(".yml"):
text = yaml.safe_load(text)
elif file_path.endswith(".xml"):

View file

@ -1,7 +1,7 @@
from typing import List
from langflow.graph.schema import ResultData, RunOutputs
from langflow.schema.schema import Record
from langflow.schema import Record
def build_records_from_run_outputs(run_outputs: RunOutputs) -> List[Record]:

View file

@ -1,10 +1,10 @@
from typing import Optional, Union
from langflow.base.data.utils import IMG_FILE_TYPES, TEXT_FILE_TYPES
from langflow.custom import CustomComponent
from langflow.field_typing import Text
from langflow.helpers.record import records_to_text
from langflow.memory import store_message
from langflow.schema import Record
from langflow.schema.message import Message
class ChatComponent(CustomComponent):
@ -15,7 +15,7 @@ class ChatComponent(CustomComponent):
return {
"input_value": {
"input_types": ["Text"],
"display_name": "Message",
"display_name": "Text",
"multiline": True,
},
"sender": {
@ -23,7 +23,7 @@ class ChatComponent(CustomComponent):
"display_name": "Sender Type",
"advanced": True,
},
"sender_name": {"display_name": "Sender Name"},
"sender_name": {"display_name": "Sender Name", "advanced": True},
"session_id": {
"display_name": "Session ID",
"info": "If provided, the message will be stored in the memory.",
@ -40,98 +40,45 @@ class ChatComponent(CustomComponent):
"info": "In case of Message being a Record, this template will be used to convert it to text.",
"advanced": True,
},
"files": {
"field_type": "file",
"display_name": "Files",
"file_types": TEXT_FILE_TYPES + IMG_FILE_TYPES,
"info": "Files to be sent with the message.",
"advanced": True,
},
}
def store_message(
self,
message: Union[str, Text, Record],
session_id: Optional[str] = None,
sender: Optional[str] = None,
sender_name: Optional[str] = None,
) -> list[Record]:
records = store_message(
message: Message,
) -> list[Message]:
messages = store_message(
message,
session_id=session_id,
sender=sender,
sender_name=sender_name,
flow_id=self.graph.flow_id,
)
self.status = records
return records
self.status = messages
return messages
def build_with_record(
self,
sender: Optional[str] = "User",
sender_name: Optional[str] = "User",
input_value: Optional[Union[str, Record]] = None,
input_value: Optional[Union[str, Record, Message]] = None,
files: Optional[list[str]] = None,
session_id: Optional[str] = None,
return_record: Optional[bool] = False,
record_template: str = "Text: {text}\nData: {data}",
) -> Union[Text, Record]:
input_value_record: Optional[Record] = None
if return_record:
if isinstance(input_value, Record):
# Update the data of the record
input_value.data["sender"] = sender
input_value.data["sender_name"] = sender_name
input_value.data["session_id"] = session_id
else:
input_value_record = Record(
text=input_value,
data={
"sender": sender,
"sender_name": sender_name,
"session_id": session_id,
},
)
elif isinstance(input_value, Record):
input_value = records_to_text(template=record_template, records=input_value)
if not input_value:
input_value = ""
if return_record and input_value_record:
result: Union[Text, Record] = input_value_record
else:
result = input_value
self.status = result
if session_id and isinstance(result, (Record, str)):
self.store_message(result, session_id, sender, sender_name)
return result
) -> Message:
message: Message | None = None
def build_no_record(
self,
sender: Optional[str] = "User",
sender_name: Optional[str] = "User",
input_value: Optional[str] = None,
session_id: Optional[str] = None,
return_record: Optional[bool] = False,
record_template: str = "Text: {text}\nData: {data}",
) -> Union[Text, Record]:
input_value_record: Optional[Record] = None
if return_record:
if isinstance(input_value, Record):
# Update the data of the record
input_value.data["sender"] = sender
input_value.data["sender_name"] = sender_name
input_value.data["session_id"] = session_id
else:
input_value_record = Record(
text=input_value,
data={
"sender": sender,
"sender_name": sender_name,
"session_id": session_id,
},
)
elif isinstance(input_value, Record):
input_value = records_to_text(template=record_template, records=input_value)
if not input_value:
input_value = ""
if return_record and input_value_record:
result: Union[Text, Record] = input_value_record
if isinstance(input_value, Record):
# Update the data of the record
message = Message.from_record(input_value)
else:
result = input_value
self.status = result
if session_id and isinstance(result, (Record, str)):
self.store_message(result, session_id, sender, sender_name)
return result
message = Message(
text=input_value, sender=sender, sender_name=sender_name, files=files, session_id=session_id
)
self.status = message
if session_id and isinstance(message, Message) and isinstance(message.text, str):
self.store_message(message)
return message

View file

@ -3,7 +3,7 @@ from typing import Optional
from langflow.custom import CustomComponent
from langflow.field_typing import Text
from langflow.helpers.record import records_to_text
from langflow.schema.schema import Record
from langflow.schema import Record
class TextComponent(CustomComponent):

View file

@ -1,7 +1,7 @@
from typing import Optional
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
class BaseMemoryComponent(CustomComponent):

View file

@ -1,3 +1,4 @@
import warnings
from typing import Optional, Union
from langchain_core.language_models.chat_models import BaseChatModel
@ -5,6 +6,7 @@ from langchain_core.language_models.llms import LLM
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langflow.custom import CustomComponent
from langflow.field_typing.prompt import Prompt
class LCModelComponent(CustomComponent):
@ -53,19 +55,28 @@ class LCModelComponent(CustomComponent):
key in response_metadata["token_usage"] for key in inner_openai_keys
):
token_usage = response_metadata["token_usage"]
completion_tokens = token_usage["completion_tokens"]
prompt_tokens = token_usage["prompt_tokens"]
total_tokens = token_usage["total_tokens"]
finish_reason = response_metadata["finish_reason"]
status_message = f"Tokens:\nInput: {prompt_tokens}\nOutput: {completion_tokens}\nTotal Tokens: {total_tokens}\nStop Reason: {finish_reason}\nResponse: {content}"
status_message = {
"tokens": {
"input": token_usage["prompt_tokens"],
"output": token_usage["completion_tokens"],
"total": token_usage["total_tokens"],
"stop_reason": response_metadata["finish_reason"],
"response": content,
}
}
elif all(key in response_metadata for key in anthropic_keys) and all(
key in response_metadata["usage"] for key in inner_anthropic_keys
):
usage = response_metadata["usage"]
input_tokens = usage["input_tokens"]
output_tokens = usage["output_tokens"]
stop_reason = response_metadata["stop_reason"]
status_message = f"Tokens:\nInput: {input_tokens}\nOutput: {output_tokens}\nStop Reason: {stop_reason}\nResponse: {content}"
status_message = {
"tokens": {
"input": usage["input_tokens"],
"output": usage["output_tokens"],
"stop_reason": response_metadata["stop_reason"],
"response": content,
}
}
else:
status_message = f"Response: {content}"
else:
@ -73,7 +84,7 @@ class LCModelComponent(CustomComponent):
return status_message
def get_chat_result(
self, runnable: BaseChatModel, stream: bool, input_value: str, system_message: Optional[str] = None
self, runnable: BaseChatModel, stream: bool, input_value: str | Prompt, system_message: Optional[str] = None
):
messages: list[Union[HumanMessage, SystemMessage]] = []
if not input_value and not system_message:
@ -81,11 +92,21 @@ class LCModelComponent(CustomComponent):
if system_message:
messages.append(SystemMessage(content=system_message))
if input_value:
messages.append(HumanMessage(content=input_value))
if isinstance(input_value, Prompt):
with warnings.catch_warnings():
warnings.simplefilter("ignore")
if "prompt" in input_value:
prompt = input_value.load_lc_prompt()
runnable = prompt | runnable
else:
messages.append(input_value.to_lc_message())
else:
messages.append(HumanMessage(content=input_value))
inputs = messages or {}
if stream:
return runnable.stream(messages)
return runnable.stream(inputs)
else:
message = runnable.invoke(messages)
message = runnable.invoke(inputs)
result = message.content
if isinstance(message, AIMessage):
status_message = self.build_status_message(message)

View file

@ -1,9 +1,9 @@
from copy import deepcopy
from langchain_core.documents import Document
from langflow.schema import Record
from langflow.schema.message import Message
def record_to_string(record: Record) -> str:
@ -35,10 +35,14 @@ def dict_values_to_string(d: dict) -> dict:
# it could be a list of records or documents or strings
if isinstance(value, list):
for i, item in enumerate(value):
if isinstance(item, Record):
if isinstance(item, Message):
d_copy[key][i] = item.text
elif isinstance(item, Record):
d_copy[key][i] = record_to_string(item)
elif isinstance(item, Document):
d_copy[key][i] = document_to_string(item)
elif isinstance(value, Message):
d_copy[key] = value.text
elif isinstance(value, Record):
d_copy[key] = record_to_string(value)
elif isinstance(value, Document):

View file

@ -0,0 +1,24 @@
from langflow.schema import Record
def chroma_collection_to_records(collection_dict: dict):
"""
Converts a collection of chroma vectors into a list of records.
Args:
collection_dict (dict): A dictionary containing the collection of chroma vectors.
Returns:
list: A list of records, where each record represents a document in the collection.
"""
records = []
for i, doc in enumerate(collection_dict["documents"]):
record_dict = {
"id": collection_dict["ids"][i],
"text": doc,
}
if "metadatas" in collection_dict:
for key, value in collection_dict["metadatas"][i].items():
record_dict[key] = value
records.append(Record(**record_dict))
return records

View file

@ -5,7 +5,7 @@ from langchain_core.prompts import ChatPromptTemplate
from langflow.base.agents.agent import LCAgentComponent
from langflow.field_typing import BaseLanguageModel, Text, Tool
from langflow.schema.schema import Record
from langflow.schema import Record
class ToolCallingAgentComponent(LCAgentComponent):

View file

@ -3,10 +3,9 @@ from typing import List, Optional
from langchain.agents import create_xml_agent
from langchain_core.prompts import ChatPromptTemplate
from langflow.base.agents.agent import LCAgentComponent
from langflow.field_typing import BaseLanguageModel, Text, Tool
from langflow.schema.schema import Record
from langflow.schema import Record
class XMLAgentComponent(LCAgentComponent):

View file

@ -5,7 +5,7 @@ from langchain_core.documents import Document
from langflow.custom import CustomComponent
from langflow.field_typing import BaseLanguageModel, BaseMemory, BaseRetriever, Text
from langflow.schema.schema import Record
from langflow.schema import Record
class RetrievalQAComponent(CustomComponent):

View file

@ -20,7 +20,7 @@ class URLComponent(CustomComponent):
self,
urls: list[str],
) -> list[Record]:
loader = WebBaseLoader(web_paths=urls)
loader = WebBaseLoader(web_paths=[url for url in urls if url])
docs = loader.load()
records = self.to_records(docs)
self.status = records

View file

@ -3,8 +3,8 @@ import uuid
from typing import Any, Optional
from langflow.custom import CustomComponent
from langflow.schema import Record
from langflow.schema.dotdict import dotdict
from langflow.schema.schema import Record
class WebhookComponent(CustomComponent):

View file

@ -6,8 +6,8 @@ from langchain_core.prompts.chat import HumanMessagePromptTemplate, SystemMessag
from langflow.base.agents.agent import LCAgentComponent
from langflow.base.agents.utils import AGENTS, AgentSpec, get_agents_list
from langflow.field_typing import BaseLanguageModel, Text, Tool
from langflow.schema import Record
from langflow.schema.dotdict import dotdict
from langflow.schema.schema import Record
class AgentComponent(LCAgentComponent):

View file

@ -0,0 +1,15 @@
from langflow.custom import CustomComponent
from langflow.schema import Record
from langflow.field_typing import Embeddings
class EmbedComponent(CustomComponent):
display_name = "Embed Texts"
def build_config(self):
return {"texts": {"display_name": "Texts"}, "embbedings": {"display_name": "Embeddings"}}
def build(self, texts: list[str], embbedings: Embeddings) -> Embeddings:
vectors = Record(vector=embbedings.embed_documents(texts))
self.status = vectors
return vectors

View file

@ -7,8 +7,8 @@ from langflow.custom import CustomComponent
from langflow.field_typing import Tool
from langflow.graph.graph.base import Graph
from langflow.helpers.flow import get_flow_inputs
from langflow.schema import Record
from langflow.schema.dotdict import dotdict
from langflow.schema.schema import Record
class FlowToolComponent(CustomComponent):

View file

@ -0,0 +1,38 @@
from typing import Optional
from langflow.custom import CustomComponent
from langflow.schema.message import Message
class MessageComponent(CustomComponent):
display_name = "Message"
description = "Creates a Message object given a Session ID."
def build_config(self):
return {
"sender": {
"options": ["Machine", "User"],
"display_name": "Sender Type",
},
"sender_name": {"display_name": "Sender Name"},
"text": {"display_name": "Text"},
"session_id": {
"display_name": "Session ID",
"info": "Session ID of the chat history.",
"input_types": ["Text"],
},
}
def build(
self,
sender: str = "User",
sender_name: Optional[str] = None,
session_id: Optional[str] = None,
text: str = "",
) -> Message:
message = Message(
text=text, sender=sender, sender_name=sender_name, flow_id=self.graph.flow_id, session_id=session_id
)
self.status = message
return message

View file

@ -1,43 +1,22 @@
from typing import List, Optional
from langflow.custom import CustomComponent
from langflow.memory import get_messages, store_message
from langflow.schema import Record
from langflow.schema.message import Message
class StoreMessageComponent(CustomComponent):
display_name = "Store Message"
description = "Stores a chat message given a Session ID."
beta: bool = True
description = "Stores a chat message."
def build_config(self):
return {
"sender": {
"options": ["Machine", "User"],
"display_name": "Sender Type",
},
"sender_name": {"display_name": "Sender Name"},
"message": {"display_name": "Message"},
"session_id": {
"display_name": "Session ID",
"info": "Session ID of the chat history.",
"input_types": ["Text"],
},
}
def build(
self,
sender: str = "User",
sender_name: Optional[str] = None,
session_id: Optional[str] = None,
message: str = "",
) -> List[Record]:
store_message(
sender=sender,
sender_name=sender_name,
session_id=session_id,
message=message,
)
message: Message,
) -> Message:
store_message(message, flow_id=self.graph.flow_id)
self.status = get_messages()
self.status = get_messages(session_id=session_id)
return get_messages(session_id=session_id)
return message

View file

@ -2,9 +2,9 @@ from typing import Optional
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.field_typing import Text
from langflow.helpers.record import records_to_text
from langflow.helpers.record import messages_to_text
from langflow.memory import get_messages
from langflow.schema.schema import Record
from langflow.schema.message import Message
class MemoryComponent(BaseMemoryComponent):
@ -43,7 +43,7 @@ class MemoryComponent(BaseMemoryComponent):
},
}
def get_messages(self, **kwargs) -> list[Record]:
def get_messages(self, **kwargs) -> list[Message]:
# Validate kwargs by checking if it contains the correct keys
if "sender" not in kwargs:
kwargs["sender"] = None
@ -77,6 +77,6 @@ class MemoryComponent(BaseMemoryComponent):
limit=n_messages,
order=order,
)
messages_str = records_to_text(template=record_template or "", records=messages)
messages_str = messages_to_text(template=record_template or "", messages=messages)
self.status = messages_str
return messages_str

View file

@ -6,25 +6,27 @@ from langflow.schema import Record
class MessageHistoryComponent(CustomComponent):
display_name = "Message History"
description = "Retrieves stored chat messages given a specific Session ID."
beta: bool = True
display_name = "Memory"
description = "Retrieves stored chat messages."
def build_config(self):
return {
"sender": {
"options": ["Machine", "User", "Machine and User"],
"display_name": "Sender Type",
"advanced": True,
},
"sender_name": {"display_name": "Sender Name", "advanced": True},
"n_messages": {
"display_name": "Number of Messages",
"info": "Number of messages to retrieve.",
"advanced": True,
},
"session_id": {
"display_name": "Session ID",
"info": "Session ID of the chat history.",
"input_types": ["Text"],
"advanced": True,
},
"order": {
"options": ["Ascending", "Descending"],
@ -39,7 +41,7 @@ class MessageHistoryComponent(CustomComponent):
sender: Optional[str] = "Machine and User",
sender_name: Optional[str] = None,
session_id: Optional[str] = None,
n_messages: int = 5,
n_messages: int = 100,
order: Optional[str] = "Descending",
) -> List[Record]:
order = "DESC" if order == "Descending" else "ASC"

View file

@ -17,6 +17,7 @@ class RecordsToTextComponent(CustomComponent):
"template": {
"display_name": "Template",
"info": "The template to use for formatting the records. It can contain the keys {text}, {data} or any other key in the Record.",
"multiline": True,
},
}

View file

@ -1,8 +1,7 @@
from typing import Optional, Union
from typing import Optional
from langflow.base.io.chat import ChatComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langflow.schema.message import Message
class ChatInput(ChatComponent):
@ -14,7 +13,7 @@ class ChatInput(ChatComponent):
build_config = super().build_config()
build_config["input_value"] = {
"input_types": [],
"display_name": "Message",
"display_name": "Text",
"multiline": True,
}
@ -25,13 +24,13 @@ class ChatInput(ChatComponent):
sender: Optional[str] = "User",
sender_name: Optional[str] = "User",
input_value: Optional[str] = None,
files: Optional[list[str]] = None,
session_id: Optional[str] = None,
return_record: Optional[bool] = False,
) -> Union[Text, Record]:
return super().build_no_record(
) -> Message:
return super().build_with_record(
sender=sender,
sender_name=sender_name,
input_value=input_value,
files=files,
session_id=session_id,
return_record=return_record,
)

View file

@ -1,7 +1,6 @@
from langchain_core.prompts import PromptTemplate
from langflow.custom import CustomComponent
from langflow.field_typing import Prompt, TemplateField, Text
from langflow.field_typing import TemplateField
from langflow.field_typing.prompt import Prompt
class PromptComponent(CustomComponent):
@ -15,19 +14,11 @@ class PromptComponent(CustomComponent):
"code": TemplateField(advanced=True),
}
def build(
async def build(
self,
template: Prompt,
**kwargs,
) -> Text:
from langflow.base.prompts.utils import dict_values_to_string
prompt_template = PromptTemplate.from_template(Text(template))
kwargs = dict_values_to_string(kwargs)
kwargs = {k: "\n".join(v) if isinstance(v, list) else v for k, v in kwargs.items()}
try:
formated_prompt = prompt_template.format(**kwargs)
except Exception as exc:
raise ValueError(f"Error formatting prompt: {exc}") from exc
self.status = f'Prompt:\n"{formated_prompt}"'
return formated_prompt
) -> Prompt:
prompt = await Prompt.from_template_and_variables(template, kwargs)
self.status = prompt.format_text()
return prompt

View file

@ -12,7 +12,7 @@ class TextInput(TextComponent):
def build_config(self):
return {
"input_value": {
"display_name": "Value",
"display_name": "Text",
"input_types": ["Record", "Text"],
"info": "Text or Record to be passed as input.",
},

View file

@ -3,7 +3,7 @@ from typing import Optional
from langchain_community.utilities.searchapi import SearchApiAPIWrapper
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
from langflow.services.database.models.base import orjson_dumps

View file

@ -1,8 +1,7 @@
from typing import Optional, cast
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.schema.schema import Record
from langflow.schema.record import Record
class AstraDBMessageReaderComponent(BaseMemoryComponent):

View file

@ -1,10 +1,10 @@
from typing import Optional
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.schema.schema import Record
from langchain_core.messages import BaseMessage
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.schema.record import Record
class AstraDBMessageWriterComponent(BaseMemoryComponent):
display_name = "Astra DB Message Writer"

View file

@ -3,7 +3,7 @@ from typing import Optional, cast
from langchain_community.chat_message_histories import CassandraChatMessageHistory
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.schema.schema import Record
from langflow.schema.record import Record
class CassandraMessageReaderComponent(BaseMemoryComponent):

View file

@ -1,10 +1,10 @@
from typing import Optional
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.schema.schema import Record
from langchain_core.messages import BaseMessage
from langchain_community.chat_message_histories import CassandraChatMessageHistory
from langchain_core.messages import BaseMessage
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.schema.record import Record
class CassandraMessageWriterComponent(BaseMemoryComponent):

View file

@ -4,7 +4,7 @@ from langchain_community.chat_message_histories.zep import SearchScope, SearchTy
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.field_typing import Text
from langflow.schema.schema import Record
from langflow.schema import Record
class ZepMessageReaderComponent(BaseMemoryComponent):

View file

@ -2,7 +2,7 @@ from typing import TYPE_CHECKING, Optional
from langflow.base.memory.memory import BaseMemoryComponent
from langflow.field_typing import Text
from langflow.schema.schema import Record
from langflow.schema import Record
if TYPE_CHECKING:
from zep_python.langchain import ZepChatMessageHistory

View file

@ -58,7 +58,7 @@ class AmazonBedrockComponent(LCModelComponent):
"advanced": True,
},
"cache": {"display_name": "Cache"},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"system_message": {
"display_name": "System Message",
"info": "System message to pass to the model.",

View file

@ -63,7 +63,7 @@ class AnthropicLLM(LCModelComponent):
"info": "Endpoint of the Anthropic API. Defaults to 'https://api.anthropic.com' if not specified.",
},
"code": {"show": False},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"advanced": True,

View file

@ -78,7 +78,7 @@ class AzureChatOpenAIComponent(LCModelComponent):
"info": "The maximum number of tokens to generate. Set to 0 for unlimited tokens.",
},
"code": {"show": False},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"info": STREAM_INFO_TEXT,

View file

@ -81,7 +81,7 @@ class QianfanChatEndpointComponent(LCModelComponent):
"info": "Endpoint of the Qianfan LLM, required if custom model used.",
},
"code": {"show": False},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"info": STREAM_INFO_TEXT,

View file

@ -111,7 +111,7 @@ class ChatLiteLLMModelComponent(LCModelComponent):
"required": False,
"default": False,
},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"info": STREAM_INFO_TEXT,

View file

@ -1,10 +1,11 @@
from typing import Optional
from langchain_cohere import ChatCohere
from pydantic.v1 import SecretStr
from langflow.field_typing import Text
from langflow.base.constants import STREAM_INFO_TEXT
from langflow.base.models.model import LCModelComponent
from langchain_cohere import ChatCohere
from langflow.field_typing import Text
class CohereComponent(LCModelComponent):
@ -42,7 +43,7 @@ class CohereComponent(LCModelComponent):
"type": "float",
"show": True,
},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"info": STREAM_INFO_TEXT,
@ -69,3 +70,4 @@ class CohereComponent(LCModelComponent):
temperature=temperature,
)
return self.get_chat_result(output, stream, input_value, system_message)
return self.get_chat_result(output, stream, input_value, system_message)

View file

@ -2,9 +2,10 @@ from typing import Optional
from langchain_community.chat_models.huggingface import ChatHuggingFace
from langchain_community.llms.huggingface_endpoint import HuggingFaceEndpoint
from langflow.field_typing import Text
from langflow.base.constants import STREAM_INFO_TEXT
from langflow.base.models.model import LCModelComponent
from langflow.field_typing import Text
class HuggingFaceEndpointsComponent(LCModelComponent):
@ -36,7 +37,7 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
"advanced": True,
},
"code": {"show": False},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"info": STREAM_INFO_TEXT,
@ -72,3 +73,4 @@ class HuggingFaceEndpointsComponent(LCModelComponent):
raise ValueError("Could not connect to HuggingFace Endpoints API.") from e
output = ChatHuggingFace(llm=llm)
return self.get_chat_result(output, stream, input_value, system_message)
return self.get_chat_result(output, stream, input_value, system_message)

View file

@ -27,7 +27,7 @@ class MistralAIModelComponent(LCModelComponent):
def build_config(self):
return {
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"max_tokens": {
"display_name": "Max Tokens",
"advanced": True,

View file

@ -194,7 +194,7 @@ class ChatOllamaComponent(LCModelComponent):
"info": "Template to use for generating text.",
"advanced": True,
},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"info": STREAM_INFO_TEXT,

View file

@ -28,7 +28,7 @@ class OpenAIModelComponent(LCModelComponent):
def build_config(self):
return {
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"max_tokens": {
"display_name": "Max Tokens",
"advanced": True,
@ -79,7 +79,7 @@ class OpenAIModelComponent(LCModelComponent):
input_value: Text,
openai_api_key: str,
temperature: float = 0.1,
model_name: str = "gpt-4o",
model_name: str = "gpt-3.5-turbo",
max_tokens: Optional[int] = 256,
model_kwargs: NestedDict = {},
openai_api_base: Optional[str] = None,

View file

@ -1,6 +1,5 @@
from typing import Optional
from langflow.base.constants import STREAM_INFO_TEXT
from langflow.base.models.model import LCModelComponent
from langflow.field_typing import Text
@ -74,7 +73,7 @@ class ChatVertexAIComponent(LCModelComponent):
"value": False,
"advanced": True,
},
"input_value": {"display_name": "Input"},
"input_value": {"display_name": "Input", "input_types": ["Text", "Record", "Prompt"]},
"stream": {
"display_name": "Stream",
"info": STREAM_INFO_TEXT,

View file

@ -1,8 +1,7 @@
from typing import Optional, Union
from typing import Optional
from langflow.base.io.chat import ChatComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langflow.schema.message import Message
class ChatOutput(ChatComponent):
@ -16,14 +15,12 @@ class ChatOutput(ChatComponent):
sender_name: Optional[str] = "AI",
input_value: Optional[str] = None,
session_id: Optional[str] = None,
return_record: Optional[bool] = False,
record_template: Optional[str] = "{text}",
) -> Union[Text, Record]:
files: Optional[list[str]] = None,
) -> Message:
return super().build_with_record(
sender=sender,
sender_name=sender_name,
input_value=input_value,
session_id=session_id,
return_record=return_record,
record_template=record_template or "",
files=files,
)

View file

@ -2,9 +2,19 @@ from langflow.custom import CustomComponent
from langflow.schema import Record
class RecordsOutput(CustomComponent):
class RecordOutput(CustomComponent):
display_name = "Records Output"
description = "Display Records as a Table"
def build_config(self):
return {
"input_value": {
"display_name": "Records",
"input_types": ["Record"],
"info": "Record or Record list to be passed as input.",
},
}
def build(self, input_value: Record) -> Record:
self.status = input_value
return input_value

View file

@ -12,7 +12,7 @@ class TextOutput(TextComponent):
def build_config(self):
return {
"input_value": {
"display_name": "Value",
"display_name": "Text",
"input_types": ["Record", "Text"],
"info": "Text or Record to be passed as output.",
},

View file

@ -0,0 +1,24 @@
from langflow.custom import CustomComponent
from langflow.field_typing import TemplateField
from langflow.field_typing.prompt import Prompt
class PromptComponent(CustomComponent):
display_name: str = "Empty Prompt"
description: str = "Create a prompt template with dynamic variables."
icon = "prompts"
def build_config(self):
return {
"template": TemplateField(display_name="Template"),
"code": TemplateField(advanced=True),
}
async def build(
self,
template: Prompt,
**kwargs,
) -> Prompt:
prompt = await Prompt.from_template_and_variables(template, kwargs) # type: ignore
self.status = prompt.format_text()
return prompt

View file

@ -0,0 +1,68 @@
# from langflow.field_typing import Data
from langchain.chains.query_constructor.base import AttributeInfo
from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.field_typing import BaseLanguageModel, Text
from langflow.schema import Record
from langflow.schema.message import Message
class SelfQueryRetrieverComponent(CustomComponent):
display_name: str = "Self Query Retriever"
description: str = "Retriever that uses a vector store and an LLM to generate the vector store queries."
icon = "LangChain"
def build_config(self):
return {
"query": {
"display_name": "Query",
"input_types": ["Message", "Text"],
"info": "Query to be passed as input.",
},
"vectorstore": {
"display_name": "Vector Store",
"info": "Vector Store to be passed as input.",
},
"attribute_infos": {
"display_name": "Metadata Field Info",
"info": "Metadata Field Info to be passed as input.",
},
"document_content_description": {
"display_name": "Document Content Description",
"info": "Document Content Description to be passed as input.",
},
"llm": {
"display_name": "LLM",
"info": "LLM to be passed as input.",
},
}
def build(
self,
query: Message,
vectorstore: VectorStore,
attribute_infos: list[Record],
document_content_description: Text,
llm: BaseLanguageModel,
) -> Record:
metadata_field_infos = [AttributeInfo(**record.data) for record in attribute_infos]
self_query_retriever = SelfQueryRetriever.from_llm(
llm=llm,
vectorstore=vectorstore,
document_contents=document_content_description,
metadata_field_info=metadata_field_infos,
enable_limit=True,
)
if isinstance(query, Message):
input_text = query.text
elif isinstance(query, str):
input_text = query
else:
raise ValueError(f"Query type {type(query)} not supported.")
documents = self_query_retriever.invoke(input=input_text)
records = [Record.from_document(document) for document in documents]
self.status = records
return records

View file

@ -3,7 +3,7 @@ from typing import List
from langchain_text_splitters import CharacterTextSplitter
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
from langflow.utils.util import unescape_string

View file

@ -3,7 +3,7 @@ from typing import List, Optional
from langchain_text_splitters import Language, RecursiveCharacterTextSplitter
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
class LanguageRecursiveTextSplitterComponent(CustomComponent):

View file

@ -91,4 +91,4 @@ class PythonCodeStructuredTool(CustomComponent):
tool = StructuredTool.from_function(
func=func, args_schema=_class, name=name, description=description, return_direct=return_direct
)
return tool
return tool # type: ignore

View file

@ -3,7 +3,7 @@ from typing import Optional
from langchain_community.utilities.searchapi import SearchApiAPIWrapper
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
from langflow.services.database.models.base import orjson_dumps

View file

@ -1,10 +1,11 @@
from typing import List, Optional
from langchain_core.embeddings import Embeddings
from langflow.components.vectorstores.base.model import LCVectorStoreComponent
from langflow.components.vectorstores.Redis import RedisComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langchain_core.embeddings import Embeddings
class RedisSearchComponent(RedisComponent, LCVectorStoreComponent):

View file

@ -1,10 +1,11 @@
from typing import List, Optional
from langchain_core.embeddings import Embeddings
from langflow.components.vectorstores.base.model import LCVectorStoreComponent
from langflow.components.vectorstores.Weaviate import WeaviateVectorStoreComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langchain_core.embeddings import Embeddings
class WeaviateSearchVectorStore(WeaviateVectorStoreComponent, LCVectorStoreComponent):

View file

@ -1,10 +1,11 @@
from typing import List
from langchain_core.embeddings import Embeddings
from langflow.components.vectorstores.base.model import LCVectorStoreComponent
from langflow.components.vectorstores.pgvector import PGVectorComponent
from langflow.field_typing import Text
from langflow.schema import Record
from langchain_core.embeddings import Embeddings
class PGVectorSearchComponent(PGVectorComponent, LCVectorStoreComponent):

View file

@ -163,3 +163,4 @@ class AstraDBVectorStoreComponent(CustomComponent):
)
return vector_store
return vector_store

View file

@ -1,3 +1,4 @@
from copy import deepcopy
from typing import List, Optional, Union
import chromadb
@ -7,8 +8,9 @@ from langchain_core.embeddings import Embeddings
from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
from langflow.base.vectorstores.utils import chroma_collection_to_records
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
class ChromaComponent(CustomComponent):
@ -48,6 +50,11 @@ class ChromaComponent(CustomComponent):
"display_name": "Server SSL Enabled",
"advanced": True,
},
"allow_duplicates": {
"display_name": "Allow Duplicates",
"advanced": True,
"info": "If false, will not add documents that are already in the Vector Store.",
},
}
def build(
@ -61,6 +68,7 @@ class ChromaComponent(CustomComponent):
chroma_server_host: Optional[str] = None,
chroma_server_http_port: Optional[int] = None,
chroma_server_grpc_port: Optional[int] = None,
allow_duplicates: bool = False,
) -> Union[VectorStore, BaseRetriever]:
"""
Builds the Vector Store or BaseRetriever object.
@ -75,6 +83,7 @@ class ChromaComponent(CustomComponent):
- chroma_server_host (Optional[str]): The host for the Chroma server.
- chroma_server_http_port (Optional[int]): The HTTP port for the Chroma server.
- chroma_server_grpc_port (Optional[int]): The gRPC port for the Chroma server.
- allow_duplicates (bool): Whether to allow duplicates in the Vector Store.
Returns:
- Union[VectorStore, BaseRetriever]: The Vector Store or BaseRetriever object.
@ -93,32 +102,34 @@ class ChromaComponent(CustomComponent):
)
client = chromadb.HttpClient(settings=chroma_settings)
# If documents, then we need to create a Chroma instance using .from_documents
# Check index_directory and expand it if it is a relative path
if index_directory is not None:
index_directory = self.resolve_path(index_directory)
chroma = Chroma(
persist_directory=index_directory,
client=client,
embedding_function=embedding,
collection_name=collection_name,
)
if allow_duplicates:
stored_records = []
else:
stored_records = chroma_collection_to_records(chroma.get())
_stored_documents_without_id = []
for record in deepcopy(stored_records):
del record.id
_stored_documents_without_id.append(record)
documents = []
for _input in inputs or []:
if isinstance(_input, Record):
documents.append(_input.to_lc_document())
if _input not in _stored_documents_without_id:
documents.append(_input.to_lc_document())
else:
documents.append(_input)
if documents is not None and embedding is not None:
if len(documents) == 0:
raise ValueError("If documents are provided, there must be at least one document.")
chroma = Chroma.from_documents(
documents=documents, # type: ignore
persist_directory=index_directory,
collection_name=collection_name,
embedding=embedding,
client=client,
)
else:
chroma = Chroma(
persist_directory=index_directory,
client=client,
embedding_function=embedding,
)
raise ValueError("Inputs must be a Record objects.")
if documents and embedding is not None:
chroma.add_documents(documents)
self.status = stored_records
return chroma

View file

@ -6,7 +6,7 @@ from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.field_typing import Embeddings
from langflow.schema.schema import Record
from langflow.schema import Record
class FAISSComponent(CustomComponent):

View file

@ -4,7 +4,7 @@ from langchain_community.vectorstores.mongodb_atlas import MongoDBAtlasVectorSea
from langflow.custom import CustomComponent
from langflow.field_typing import Embeddings
from langflow.schema.schema import Record
from langflow.schema import Record
class MongoDBAtlasComponent(CustomComponent):

View file

@ -8,7 +8,7 @@ from langchain_pinecone.vectorstores import PineconeVectorStore
from langflow.custom import CustomComponent
from langflow.field_typing import Embeddings
from langflow.schema.schema import Record
from langflow.schema import Record
class PineconeComponent(CustomComponent):

View file

@ -6,7 +6,7 @@ from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.field_typing import Embeddings
from langflow.schema.schema import Record
from langflow.schema import Record
class QdrantComponent(CustomComponent):

View file

@ -6,7 +6,7 @@ from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
class RedisComponent(CustomComponent):

View file

@ -7,7 +7,7 @@ from supabase.client import Client, create_client
from langflow.custom import CustomComponent
from langflow.field_typing import Embeddings
from langflow.schema.schema import Record
from langflow.schema import Record
class SupabaseComponent(CustomComponent):

View file

@ -6,7 +6,7 @@ from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
class UpstashVectorStoreComponent(CustomComponent):

View file

@ -9,7 +9,7 @@ from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.field_typing import BaseRetriever
from langflow.schema.schema import Record
from langflow.schema import Record
class VectaraComponent(CustomComponent):

View file

@ -8,7 +8,7 @@ from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
class WeaviateVectorStoreComponent(CustomComponent):

View file

@ -6,7 +6,7 @@ from langchain_core.retrievers import BaseRetriever
from langchain_core.vectorstores import VectorStore
from langflow.custom import CustomComponent
from langflow.schema.schema import Record
from langflow.schema import Record
class PGVectorComponent(CustomComponent):

View file

@ -7,6 +7,7 @@ import yaml
from cachetools import TTLCache, cachedmethod
from langchain_core.documents import Document
from pydantic import BaseModel
from langflow.custom.code_parser.utils import (
extract_inner_type_from_generic_alias,
extract_union_types_from_generic_alias,
@ -125,8 +126,11 @@ class CustomComponent(Component):
@staticmethod
def resolve_path(path: str) -> str:
"""Resolves the path to an absolute path."""
if not path:
return path
path_object = Path(path)
if path_object.parts[0] == "~":
if path_object.parts and path_object.parts[0] == "~":
path_object = path_object.expanduser()
elif path_object.is_relative_to("."):
path_object = path_object.resolve()
@ -378,13 +382,14 @@ class CustomComponent(Component):
The variable for the current user with the specified name.
"""
def get_variable(name: str):
def get_variable(name: str, field: str):
if hasattr(self, "_user_id") and not self._user_id:
raise ValueError(f"User id is not set for {self.__class__.__name__}")
variable_service = get_variable_service() # Get service instance
# Retrieve and decrypt the variable by name for the current user
with session_scope() as session:
return variable_service.get_variable(user_id=self._user_id or "", name=name, session=session)
user_id = self._user_id or ""
return variable_service.get_variable(user_id=user_id, name=name, field=field, session=session)
return get_variable

View file

@ -19,13 +19,13 @@ from .constants import (
Embeddings,
NestedDict,
Object,
Prompt,
PromptTemplate,
Text,
TextSplitter,
Tool,
VectorStore,
)
from .prompt import Prompt
from .range_spec import RangeSpec

View file

@ -6,7 +6,7 @@ from langchain.memory.chat_memory import BaseChatMemory
from langchain_core.document_loaders import BaseLoader
from langchain_core.documents import Document
from langchain_core.embeddings import Embeddings
from langchain_core.language_models import BaseLLM, BaseLanguageModel
from langchain_core.language_models import BaseLanguageModel, BaseLLM
from langchain_core.memory import BaseMemory
from langchain_core.output_parsers import BaseOutputParser
from langchain_core.prompts import BasePromptTemplate, ChatPromptTemplate, PromptTemplate
@ -15,6 +15,8 @@ from langchain_core.tools import Tool
from langchain_core.vectorstores import VectorStore
from langchain_text_splitters import TextSplitter
from langflow.field_typing.prompt import Prompt
# Type alias for more complex dicts
NestedDict = Dict[str, Union[str, Dict]]
@ -27,10 +29,6 @@ class Data:
pass
class Prompt:
pass
class Code:
pass

View file

@ -0,0 +1,42 @@
from langchain_core.load import load
from langchain_core.messages import HumanMessage
from langchain_core.prompts import BaseChatPromptTemplate, ChatPromptTemplate, PromptTemplate
from langflow.base.prompts.utils import dict_values_to_string
from langflow.schema.message import Message
from langflow.schema.record import Record
class Prompt(Record):
def load_lc_prompt(self):
if "prompt" not in self:
raise ValueError("Prompt is required.")
return load(self.prompt)
@classmethod
def from_lc_prompt(
cls,
prompt: BaseChatPromptTemplate,
):
prompt_json = prompt.to_json()
return cls(prompt=prompt_json)
def format_text(self):
prompt_template = PromptTemplate.from_template(self.template)
variables_with_str_values = dict_values_to_string(self.variables)
formatted_prompt = prompt_template.format(**variables_with_str_values)
self.text = formatted_prompt
return formatted_prompt
@classmethod
async def from_template_and_variables(cls, template: str, variables: dict):
instance = cls(template=template, variables=variables)
contents = [{"type": "text", "text": instance.format_text()}]
# Get all Message instances from the kwargs
for value in variables.values():
if isinstance(value, Message):
content_dicts = await value.get_file_content_dicts()
contents.extend(content_dicts)
prompt_template = ChatPromptTemplate.from_messages([HumanMessage(content=contents)])
instance.prompt = prompt_template.to_json()
return instance

View file

@ -710,6 +710,7 @@ class Graph:
chat_service: ChatService,
vertex_id: str,
inputs_dict: Optional[Dict[str, str]] = None,
files: Optional[list[str]] = None,
user_id: Optional[str] = None,
fallback_to_env_vars: bool = False,
):
@ -737,7 +738,9 @@ class Graph:
# Check the cache for the vertex
cached_result = await chat_service.get_cache(key=vertex.id)
if isinstance(cached_result, CacheMiss):
await vertex.build(user_id=user_id, inputs=inputs_dict, fallback_to_env_vars=fallback_to_env_vars)
await vertex.build(
user_id=user_id, inputs=inputs_dict, fallback_to_env_vars=fallback_to_env_vars, files=files
)
await chat_service.set_cache(key=vertex.id, data=vertex)
else:
cached_vertex = cached_result["result"]
@ -751,7 +754,10 @@ class Graph:
vertex.result.used_frozen_result = True
else:
await vertex.build(user_id=user_id, inputs=inputs_dict, fallback_to_env_vars=fallback_to_env_vars)
await vertex.build(
user_id=user_id, inputs=inputs_dict, fallback_to_env_vars=fallback_to_env_vars, files=files
)
await chat_service.set_cache(key=vertex.id, data=vertex)
if vertex.result is not None:
params = f"{vertex._built_object_repr()}{params}"
@ -764,11 +770,13 @@ class Graph:
next_runnable_vertices, top_level_vertices = await self.get_next_and_top_level_vertices(
lock, set_cache_coro, vertex
)
log_transaction(vertex, status="success")
flow_id = self.flow_id
log_transaction(flow_id, vertex, status="success")
return next_runnable_vertices, top_level_vertices, result_dict, params, valid, artifacts, vertex
except Exception as exc:
logger.exception(f"Error building vertex: {exc}")
log_transaction(vertex, status="failure", error=str(exc))
flow_id = self.flow_id
log_transaction(flow_id, vertex, status="failure", error=str(exc))
raise exc
async def get_next_and_top_level_vertices(

View file

@ -1,15 +1,17 @@
from enum import Enum
from typing import Any, List, Optional
from pydantic import BaseModel, Field, field_serializer
from pydantic import BaseModel, Field, field_serializer, model_validator
from langflow.graph.utils import serialize_field
from langflow.schema.schema import Log, StreamURL
from langflow.utils.schemas import ChatOutputResponse, ContainsEnumMeta
class ResultData(BaseModel):
results: Optional[Any] = Field(default_factory=dict)
artifacts: Optional[Any] = Field(default_factory=dict)
logs: Optional[List[dict]] = Field(default_factory=list)
messages: Optional[list[ChatOutputResponse]] = Field(default_factory=list)
timedelta: Optional[float] = None
duration: Optional[str] = None
@ -23,6 +25,24 @@ class ResultData(BaseModel):
return {key: serialize_field(val) for key, val in value.items()}
return serialize_field(value)
@model_validator(mode="before")
@classmethod
def validate_model(cls, values):
if not values.get("logs") and values.get("artifacts"):
# Build the log from the artifacts
message = values["artifacts"]
# ! Temporary fix
if not isinstance(message, dict):
message = {"message": message}
if "stream_url" in message and "type" in message:
stream_url = StreamURL(location=message["stream_url"])
values["logs"] = [Log(message=stream_url, type=message["type"])]
elif "type" in message:
values["logs"] = [Log(message=message, type=message["type"])]
return values
class InterfaceComponentTypes(str, Enum, metaclass=ContainsEnumMeta):
# ChatInput and ChatOutput are the only ones that are

View file

@ -1,9 +1,12 @@
from typing import Any, Union
from enum import Enum
from typing import Any, Generator, Union
from langchain_core.documents import Document
from pydantic import BaseModel
from langflow.interface.utils import extract_input_variables_from_prompt
from langflow.schema import Record
from langflow.schema.message import Message
class UnbuiltObject:
@ -14,6 +17,16 @@ class UnbuiltResult:
pass
class ArtifactType(str, Enum):
TEXT = "text"
RECORD = "record"
OBJECT = "object"
ARRAY = "array"
STREAM = "stream"
UNKNOWN = "unknown"
MESSAGE = "message"
def validate_prompt(prompt: str):
"""Validate prompt."""
if extract_input_variables_from_prompt(prompt):
@ -50,3 +63,38 @@ def serialize_field(value):
elif isinstance(value, str):
return {"result": value}
return value
def get_artifact_type(custom_component, build_result) -> str:
result = ArtifactType.UNKNOWN
value = custom_component.repr_value
match value:
case Record():
result = ArtifactType.RECORD
case str():
result = ArtifactType.TEXT
case dict():
result = ArtifactType.OBJECT
case list():
result = ArtifactType.ARRAY
case Message():
result = ArtifactType.MESSAGE
if result == ArtifactType.UNKNOWN:
if isinstance(build_result, Generator):
result = ArtifactType.STREAM
elif isinstance(value, Message) and isinstance(value.text, Generator):
result = ArtifactType.STREAM
return result.value
def post_process_raw(raw, artifact_type: str):
if artifact_type == ArtifactType.STREAM.value:
raw = ""
return raw

View file

@ -4,17 +4,17 @@ import inspect
import os
import types
from enum import Enum
from typing import TYPE_CHECKING, Any, AsyncIterator, Callable, Dict, Iterator, List, Optional
from typing import TYPE_CHECKING, Any, AsyncIterator, Callable, Dict, Iterator, List, Mapping, Optional
from loguru import logger
from langflow.graph.schema import INPUT_COMPONENTS, OUTPUT_COMPONENTS, InterfaceComponentTypes, ResultData
from langflow.graph.utils import UnbuiltObject, UnbuiltResult
from langflow.graph.vertex.utils import log_transaction
from langflow.graph.utils import ArtifactType, UnbuiltObject, UnbuiltResult
from langflow.interface.initialize import loading
from langflow.interface.listing import lazy_load_dict
from langflow.schema.schema import INPUT_FIELD_NAME
from langflow.services.deps import get_storage_service
from langflow.services.monitor.utils import log_transaction
from langflow.utils.constants import DIRECT_TYPES
from langflow.utils.schemas import ChatOutputResponse
from langflow.utils.util import sync_to_async, unescape_string
@ -63,6 +63,8 @@ class Vertex:
self._built_result = None
self._built = False
self.artifacts: Dict[str, Any] = {}
self.artifacts_raw: Any = None
self.artifacts_type: Optional[str] = None
self.steps: List[Callable] = [self._build]
self.steps_ran: List[Callable] = []
self.task_id: Optional[str] = None
@ -371,7 +373,7 @@ class Vertex:
self.load_from_db_fields = load_from_db_fields
self._raw_params = params.copy()
def update_raw_params(self, new_params: Dict[str, str], overwrite: bool = False):
def update_raw_params(self, new_params: Mapping[str, str | list[str]], overwrite: bool = False):
"""
Update the raw parameters of the vertex with the given new parameters.
@ -422,11 +424,14 @@ class Vertex:
try:
messages = [
ChatOutputResponse(
message=artifacts["message"],
message=artifacts["text"],
sender=artifacts.get("sender"),
sender_name=artifacts.get("sender_name"),
session_id=artifacts.get("session_id"),
stream_url=artifacts.get("stream_url"),
files=[{"path": file} if isinstance(file, str) else file for file in artifacts.get("files", [])],
component_id=self.id,
type=self.artifacts_type,
).model_dump(exclude_none=True)
]
except KeyError:
@ -439,12 +444,11 @@ class Vertex:
# We need to set the artifacts to pass information
# to the frontend
self.set_artifacts()
artifacts = self.artifacts
artifacts = self.artifacts_raw
if isinstance(artifacts, dict):
messages = self.extract_messages_from_artifacts(artifacts)
else:
messages = []
result_dict = ResultData(
results=result_dict,
artifacts=artifacts,
@ -525,12 +529,13 @@ class Vertex:
Returns:
The built result if use_result is True, else the built object.
"""
flow_id = self.graph.flow_id
if not self._built:
log_transaction(source=self, target=requester, flow_id=self.graph.flow_id, status="error")
log_transaction(flow_id, vertex=self, target=requester, status="error")
raise ValueError(f"Component {self.display_name} has not been built yet")
result = self._built_result if self.use_result else self._built_object
log_transaction(source=self, target=requester, flow_id=self.graph.flow_id, status="success")
log_transaction(flow_id, vertex=self, target=requester, status="success")
return result
async def _build_vertex_and_update_params(self, key, vertex: "Vertex"):
@ -624,6 +629,8 @@ class Vertex:
self._built_object, self.artifacts = result
elif len(result) == 3:
self._custom_component, self._built_object, self.artifacts = result
self.artifacts_raw = self.artifacts.get("raw", None)
self.artifacts_type = self.artifacts.get("type", None) or ArtifactType.UNKNOWN.value
else:
self._built_object = result
@ -664,6 +671,7 @@ class Vertex:
self,
user_id=None,
inputs: Optional[Dict[str, Any]] = None,
files: Optional[list[str]] = None,
requester: Optional["Vertex"] = None,
**kwargs,
) -> Any:
@ -681,9 +689,14 @@ class Vertex:
return await self.get_requester_result(requester)
self._reset()
if self._is_chat_input() and inputs:
inputs = {"input_value": inputs.get(INPUT_FIELD_NAME, "")}
self.update_raw_params(inputs, overwrite=True)
if self._is_chat_input() and (inputs or files):
chat_input = {}
if inputs:
chat_input.update({"input_value": inputs.get(INPUT_FIELD_NAME, "")})
if files:
chat_input.update({"files": files})
self.update_raw_params(chat_input, overwrite=True)
# Run steps
for step in self.steps:

View file

@ -2,13 +2,14 @@ import json
from typing import AsyncIterator, Dict, Iterator, List
import yaml
from langchain_core.messages import AIMessage
from langchain_core.messages import AIMessage, AIMessageChunk
from loguru import logger
from langflow.graph.schema import CHAT_COMPONENTS, RECORDS_COMPONENTS, InterfaceComponentTypes
from langflow.graph.utils import UnbuiltObject, serialize_field
from langflow.graph.utils import ArtifactType, UnbuiltObject, serialize_field
from langflow.graph.vertex.base import Vertex
from langflow.schema import Record
from langflow.schema.message import Message
from langflow.schema.schema import INPUT_FIELD_NAME
from langflow.services.monitor.utils import log_vertex_build
from langflow.utils.schemas import ChatOutputResponse, RecordOutputResponse
@ -83,10 +84,11 @@ class InterfaceVertex(Vertex):
sender = self.params.get("sender", None)
sender_name = self.params.get("sender_name", None)
message = self.params.get(INPUT_FIELD_NAME, None)
files = [{"path": file} if isinstance(file, str) else file for file in self.params.get("files", [])]
if isinstance(message, str):
message = unescape_string(message)
stream_url = None
if isinstance(self._built_object, AIMessage):
if isinstance(self._built_object, (AIMessage, AIMessageChunk)):
artifacts = ChatOutputResponse.from_message(
self._built_object,
sender=sender,
@ -97,23 +99,27 @@ class InterfaceVertex(Vertex):
# Turn the dict into a pleasing to
# read JSON inside a code block
message = dict_to_codeblock(self._built_object)
elif isinstance(self._built_object, Record):
message = self._built_object.text
elif isinstance(message, (AsyncIterator, Iterator)):
stream_url = self.build_stream_url()
message = ""
elif isinstance(self._built_object, Message):
if isinstance(message, (AsyncIterator, Iterator)):
stream_url = self.build_stream_url()
message = ""
self._built_object.text = message
else:
message = self._built_object.text
elif not isinstance(self._built_object, str):
message = str(self._built_object)
# if the message is a generator or iterator
# it means that it is a stream of messages
else:
message = self._built_object
artifact_type = ArtifactType.STREAM if stream_url is not None else ArtifactType.OBJECT
artifacts = ChatOutputResponse(
message=message,
sender=sender,
sender_name=sender_name,
stream_url=stream_url,
files=files,
type=artifact_type,
)
self.will_stream = stream_url is not None
@ -195,6 +201,8 @@ class InterfaceVertex(Vertex):
message=complete_message,
sender=self.params.get("sender", ""),
sender_name=self.params.get("sender_name", ""),
files=[{"path": file} if isinstance(file, str) else file for file in self.params.get("files", [])],
type=ArtifactType.OBJECT.value,
).model_dump()
self.params[INPUT_FIELD_NAME] = complete_message
self._built_object = Record(text=complete_message, data=self.artifacts)

View file

@ -1,9 +1,5 @@
from typing import TYPE_CHECKING
from loguru import logger
from langflow.services.deps import get_monitor_service
if TYPE_CHECKING:
from langflow.graph.vertex.base import Vertex
@ -21,34 +17,3 @@ def build_clean_params(target: "Vertex") -> dict:
if isinstance(value, list):
params[key] = [item for item in value if isinstance(item, (str, int, bool, float, list, dict))]
return params
def log_transaction(source: "Vertex", target: "Vertex", flow_id, status, error=None):
"""
Logs a transaction between two vertices.
Args:
source (Vertex): The source vertex of the transaction.
target (Vertex): The target vertex of the transaction.
status: The status of the transaction.
error (Optional): Any error associated with the transaction.
Raises:
Exception: If there is an error while logging the transaction.
"""
try:
monitor_service = get_monitor_service()
clean_params = build_clean_params(target)
data = {
"source": source.vertex_type,
"target": target.vertex_type,
"target_args": clean_params,
"timestamp": monitor_service.get_timestamp(),
"status": status,
"error": error,
"flow_id": flow_id,
}
monitor_service.add_row(table_name="transactions", data=data)
except Exception as e:
logger.error(f"Error logging transaction: {e}")

View file

@ -1,3 +1,3 @@
from .record import docs_to_records, records_to_text
from .record import docs_to_records, records_to_text, messages_to_text
__all__ = ["docs_to_records", "records_to_text"]
__all__ = ["docs_to_records", "records_to_text", "messages_to_text"]

View file

@ -6,7 +6,8 @@ from pydantic.v1 import BaseModel, Field, create_model
from sqlmodel import Session, select
from langflow.graph.schema import RunOutputs
from langflow.schema.schema import INPUT_FIELD_NAME, Record
from langflow.schema import Record
from langflow.schema.schema import INPUT_FIELD_NAME
from langflow.services.database.models.flow import Flow
from langflow.services.deps import get_session, get_settings_service, session_scope
@ -259,3 +260,24 @@ def get_flow_by_id_or_endpoint_name(
raise HTTPException(status_code=404, detail=f"Flow identifier {flow_id_or_name} not found")
return flow
def generate_unique_flow_name(flow_name, user_id, session):
original_name = flow_name
n = 1
while True:
# Check if a flow with the given name exists
existing_flow = session.exec(
select(Flow).where(
Flow.name == flow_name,
Flow.user_id == user_id,
)
).first()
# If no flow with the given name exists, return the name
if not existing_flow:
return flow_name
# If a flow with the name already exists, append (n) to the name and increment n
flow_name = f"{original_name} ({n})"
n += 1

View file

@ -0,0 +1,23 @@
from langflow.services.database.models.folder.model import Folder
from sqlalchemy import select
def generate_unique_folder_name(folder_name, user_id, session):
original_name = folder_name
n = 1
while True:
# Check if a folder with the given name exists
existing_folder = session.exec(
select(Folder).where(
Folder.name == folder_name,
Folder.user_id == user_id,
)
).first()
# If no folder with the given name exists, return the name
if not existing_folder:
return folder_name
# If a folder with the name already exists, append (n) to the name and increment n
folder_name = f"{original_name} ({n})"
n += 1

View file

@ -1,7 +1,9 @@
from typing import Union
from langchain_core.documents import Document
from langflow.schema import Record
from langflow.schema.message import Message
def docs_to_records(documents: list[Document]) -> list[Record]:
@ -27,7 +29,7 @@ def records_to_text(template: str, records: Union[Record, list[Record]]) -> str:
Returns:
list[str]: The converted list of texts.
"""
if isinstance(records, Record):
if isinstance(records, (Record)):
records = [records]
# Check if there are any format strings in the template
_records = []
@ -39,3 +41,27 @@ def records_to_text(template: str, records: Union[Record, list[Record]]) -> str:
formated_records = [template.format(data=record.data, **record.data) for record in _records]
return "\n".join(formated_records)
def messages_to_text(template: str, messages: Union[Message, list[Message]]) -> str:
"""
Converts a list of Messages to a list of texts.
Args:
messages (list[Message]): The list of Messages to convert.
Returns:
list[str]: The converted list of texts.
"""
if isinstance(messages, (Message)):
messages = [messages]
# Check if there are any format strings in the template
_messages = []
for message in messages:
# If it is not a message, create one with the key "text"
if not isinstance(message, Message):
raise ValueError("All elements in the list must be of type Message.")
_messages.append(message)
formated_messages = [template.format(data=message.model_dump(), **message.model_dump()) for message in _messages]
return "\n".join(formated_messages)

View file

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.07" style="enable-background:new 0 0 345.07 345.07;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5338)" class="st5" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<path class="st3" d="M307.57,279.87c-6.39-21.62-26.38-37.4-50.06-37.4H91.2c-24.91,0-45.74,17.45-50.94,40.8
c31.65,37.77,79.15,61.8,132.28,61.8C227.24,345.07,275.96,319.58,307.57,279.87z"/>
<g>
<path d="M220.32,213.48c-32.08,0-58.18-26.1-58.18-58.18c0-32.08,26.1-58.18,58.18-58.18c32.08,0,58.18,26.1,58.18,58.18
C278.5,187.38,252.4,213.48,220.32,213.48z M220.32,101.39c-29.72,0-53.91,24.18-53.91,53.91c0,29.72,24.18,53.91,53.91,53.91
c29.72,0,53.91-24.18,53.91-53.91C274.22,125.58,250.04,101.39,220.32,101.39z"/>
</g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -53.7618 202.9503)" class="st3" cx="218.1" cy="166.37" rx="56.04" ry="56.04"/>
<g>
<path class="st2" d="M185.36,278.29h-45.31c-11.01,0-19.93-8.92-19.93-19.93V125.96c0-11.01,8.92-19.93,19.93-19.93h45.31
c11.01,0,19.93,8.92,19.93,19.93v132.39C205.29,269.36,196.37,278.29,185.36,278.29z"/>
<path d="M162.7,280.42c-24.66,0-44.72-20.06-44.72-44.72v-87.08c0-24.66,20.06-44.72,44.72-44.72s44.72,20.06,44.72,44.72v87.08
C207.43,260.36,187.37,280.42,162.7,280.42z M162.7,108.17c-22.3,0-40.45,18.15-40.45,40.45v87.08
c0,22.3,18.15,40.45,40.45,40.45s40.45-18.15,40.45-40.45v-87.08C203.16,126.32,185.01,108.17,162.7,108.17z"/>
</g>
<g>
<path class="st2" d="M175.49,217.3c-9.52,4.84-20.54,6.99-31.94,5.57l0,0c-30.39-3.78-51.97-31.48-48.19-61.88l7.35-59.07
c3.78-30.39,31.48-51.97,61.88-48.19h0c30.39,3.78,51.97,31.48,48.19,61.88L175.49,217.3z"/>
<path d="M150.47,225.44c-2.39,0-4.78-0.15-7.18-0.45c-31.51-3.92-53.96-32.75-50.04-64.26l7.35-59.07
c3.92-31.51,32.74-53.98,64.26-50.04c15.27,1.9,28.88,9.63,38.33,21.76c9.45,12.14,13.61,27.23,11.71,42.5
c-0.15,1.17-1.22,2-2.38,1.86c-1.17-0.15-2-1.21-1.86-2.38c3.63-29.17-17.16-55.86-46.33-59.49
c-29.17-3.63-55.86,17.16-59.49,46.33l-7.35,59.07c-3.63,29.17,17.16,55.86,46.33,59.49c10.6,1.32,21.22-0.53,30.71-5.36
c1.05-0.53,2.34-0.11,2.87,0.94c0.53,1.05,0.11,2.34-0.94,2.87C168.36,223.32,159.49,225.44,150.47,225.44z"/>
</g>
<path class="st3" d="M102.71,101.93l-0.42,3.39c24.1-0.59,43.46-20.27,43.46-44.51c0-2.05-0.19-4.05-0.45-6.02
C123.25,59.87,105.66,78.17,102.71,101.93z"/>
<path class="st3" d="M164.59,53.74c-9.59-1.19-18.9,0.15-27.29,3.48c-3.61,7.4-5.69,15.69-5.69,24.47
c0,30.95,25.09,56.05,56.04,56.05c7.79,0,15.21-1.6,21.95-4.47l3.17-17.66C216.55,85.22,194.98,57.52,164.59,53.74z"/>
<g>
<path class="st2" d="M188.07,152.4c1.92-10.84,12.26-18.06,23.09-16.15c10.84,1.92,18.06,12.26,16.15,23.09
c-1.92,10.84-12.26,18.06-23.09,16.15L188.07,152.4z"/>
<path d="M207.7,177.94c-1.27,0-2.56-0.11-3.86-0.34c-1.16-0.21-1.94-1.31-1.73-2.48c0.21-1.16,1.31-1.93,2.48-1.73
c9.66,1.71,18.91-4.76,20.62-14.41c1.71-9.66-4.76-18.91-14.41-20.62c-9.66-1.71-18.91,4.76-20.62,14.41
c-0.21,1.16-1.31,1.94-2.48,1.73c-1.16-0.21-1.94-1.31-1.73-2.48c2.12-11.98,13.59-19.99,25.57-17.88
c11.98,2.12,20,13.59,17.88,25.57C227.52,170.4,218.19,177.94,207.7,177.94z"/>
</g>
<g>
<path d="M127.3,179.52c-1.13,0-2.08-0.89-2.13-2.03c-0.06-1.18,0.85-2.18,2.03-2.24c4.38-0.21,8.57-2.42,11.23-5.9
c0.71-0.94,2.05-1.12,3-0.4c0.94,0.72,1.12,2.06,0.4,3c-3.41,4.47-8.8,7.31-14.43,7.58C127.37,179.52,127.33,179.52,127.3,179.52
z"/>
</g>
<g>
<path d="M126.56,161.68c-0.12,0-0.24-0.01-0.36-0.03c-1.16-0.2-1.94-1.3-1.74-2.47l3.57-20.78c0.2-1.16,1.3-1.96,2.47-1.74
c1.16,0.2,1.94,1.3,1.75,2.47l-3.57,20.78C128.49,160.94,127.58,161.68,126.56,161.68z"/>
</g>
<g>
<path d="M106.87,142.25c-0.62,0-1.24-0.27-1.67-0.8c-0.74-0.92-0.59-2.26,0.32-3c3.97-3.2,7.62-3.76,12.59-1.93
c1.11,0.41,1.68,1.63,1.27,2.74c-0.41,1.11-1.63,1.68-2.74,1.27c-4-1.47-5.98-0.73-8.44,1.24
C107.82,142.1,107.34,142.25,106.87,142.25z"/>
</g>
<g>
<path d="M156.9,149.05c-0.74,0-1.45-0.38-1.85-1.06c-1.73-2.97-5.67-4.56-8.96-3.61c-1.14,0.33-2.32-0.33-2.64-1.47
c-0.32-1.14,0.33-2.32,1.47-2.64c5.18-1.48,11.13,0.92,13.83,5.58c0.59,1.02,0.25,2.33-0.78,2.92
C157.63,148.95,157.26,149.05,156.9,149.05z"/>
</g>
<g>
<path d="M196.73,161.48c-0.26,0-0.52-0.05-0.77-0.15c-1.1-0.43-1.65-1.66-1.22-2.76l0.08-0.22c1.11-2.87,2.25-5.83,4.3-8.37
c3.23-4,8.59-4.5,12.22-3.72c3.03,0.66,5.13,2.19,5.62,4.1c0.29,1.14-0.4,2.31-1.54,2.6c-1.14,0.29-2.31-0.4-2.6-1.54
c-0.17-0.22-1.64-1.07-3.98-1.19c-1.28-0.07-4.46,0.04-6.39,2.44c-1.63,2.02-2.61,4.55-3.64,7.22l-0.08,0.22
C198.4,160.96,197.59,161.48,196.73,161.48z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

View file

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.07" style="enable-background:new 0 0 345.07 345.07;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5338)" class="st0" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<g>
<path class="st1" d="M114.97,138.81c-8.59-6.56-16.78-1.86-16.86-1.81l-0.45-0.76c0.09-0.05,8.78-5.07,17.85,1.87L114.97,138.81z
"/>
</g>
<path d="M107.69,144.35c0,1.82-1.47,3.29-3.29,3.29c-1.82,0-3.29-1.47-3.29-3.29c0-1.82,1.47-3.29,3.29-3.29
C106.22,141.07,107.69,142.54,107.69,144.35z"/>
<g>
<path d="M202.91,192.2c0,0,16.44-7.4,18.08-16.44c1.64-9.04-0.82-18.08,3.29-25.48c4.11-7.4,27.53-10.68-10.68-47.66
C175.38,65.64,110.87,3.6,107.59,37.7c-3.29,34.1,6.16,47.66,6.57,53.01c0.41,5.34-16.44,43.55-23.83,60.81
c-7.4,17.26-6.41,25.52-2.05,36.98c7.44,19.59,29.17,32.87,50.13,42.32C159.36,240.27,197.98,214.8,202.91,192.2z"/>
<g>
<path class="st2" d="M91.56,147c0,0,13.15-4.93,24.65,3.29c11.5,8.22,20.96,20.96,36.57,20.96c15.61,0,17.67-22.94,17.67-43.55
c0-12.33-18.08-21.76-18.08-37.39c0-0.82-3.29,4.93-18.08-3.29c-14.79-8.22-25.48-18.9-25.48-18.9s-6.57,37.8-10.68,45.2
c-4.11,7.4-13.15,18.08-13.15,18.08S83.34,139.61,91.56,147z"/>
<path d="M152.78,173.38c-12.37,0-20.98-7.37-29.31-14.49c-2.76-2.36-5.61-4.8-8.5-6.86c-10.4-7.43-22.54-3.07-22.67-3.02
c-0.75,0.28-1.59,0.12-2.18-0.41c-9.02-8.12-7.32-17.24-7.24-17.62c0.07-0.35,0.23-0.68,0.46-0.96
c0.09-0.11,8.95-10.61,12.91-17.74c3.23-5.81,8.63-34.11,10.45-44.53c0.14-0.79,0.7-1.43,1.46-1.67
c0.76-0.24,1.59-0.04,2.16,0.52c0.1,0.11,10.66,10.58,25,18.55c4.13,2.29,11.64,5.78,15.57,3.4c0.33-0.2,1.36-0.82,2.49-0.19
c0.67,0.38,1.12,1.17,1.12,1.94c0,7.55,4.78,13.71,9.4,19.67c4.47,5.76,8.68,11.2,8.68,17.73
C172.59,148.96,170.34,173.38,152.78,173.38z M100.91,143.38c4.87,0,10.86,1.11,16.55,5.17c3.05,2.18,5.97,4.68,8.8,7.1
c8.1,6.92,15.74,13.46,26.53,13.46c13.77,0,15.53-22.13,15.53-41.42c0-5.07-3.78-9.94-7.79-15.11
c-4.28-5.52-9.07-11.69-10.09-19.31c-4.32,1.04-10.06-0.44-17.18-4.4c-10.47-5.82-18.84-12.76-23.03-16.52
c-1.81,9.94-6.75,35.74-10.23,41.99c-3.71,6.68-11.15,15.74-12.98,17.94c-0.15,1.62-0.17,7.02,5.1,12.3
C93.81,144.1,96.99,143.38,100.91,143.38z"/>
</g>
<g>
<path class="st3" d="M110.29,73.09c-0.73,0-1.45-0.38-1.84-1.05c-7.35-12.52-10.08-27.88-7.47-42.16
c0.21-1.16,1.33-1.92,2.49-1.72c1.16,0.21,1.93,1.33,1.72,2.49c-2.43,13.28,0.11,27.58,6.95,39.23c0.6,1.02,0.26,2.33-0.76,2.93
C111.03,72.99,110.66,73.09,110.29,73.09z"/>
</g>
<g>
<path class="st2" d="M114.67,178.11c-2.9,0-5.79-0.63-8.39-1.92c-1.06-0.52-1.49-1.81-0.97-2.86c0.52-1.06,1.81-1.49,2.86-0.97
c5.24,2.6,11.99,1.74,16.41-2.1c0.89-0.78,2.24-0.68,3.01,0.21c0.77,0.89,0.68,2.24-0.21,3.01
C123.9,176.52,119.28,178.11,114.67,178.11z"/>
</g>
<g>
<path class="st3" d="M198.08,146.4c-1.14,0-2.09-0.9-2.13-2.05c-0.28-6.75,2.61-13.4,7.72-17.8c0.9-0.77,2.25-0.67,3.01,0.23
c0.77,0.89,0.67,2.24-0.23,3.01c-4.07,3.5-6.46,9.01-6.24,14.38c0.05,1.18-0.87,2.17-2.05,2.22
C198.14,146.4,198.11,146.4,198.08,146.4z"/>
</g>
<g>
<path class="st3" d="M130.09,126.71c-0.91,0-1.75-0.58-2.04-1.49c-0.56-1.76-1.99-3.26-3.91-4.11c-1.93-0.85-4-0.9-5.67-0.13
c-1.07,0.49-2.34,0.02-2.83-1.05c-0.49-1.07-0.02-2.34,1.05-2.83c2.79-1.28,6.14-1.25,9.19,0.1c3.05,1.35,5.33,3.8,6.26,6.72
c0.36,1.12-0.26,2.33-1.39,2.68C130.52,126.67,130.31,126.71,130.09,126.71z"/>
</g>
<g>
<path class="st3" d="M131.82,106.99c-0.2,0-0.4-0.03-0.59-0.09c-2.81-0.81-5.72-1.17-8.64-1.07c-1.2,0.04-2.17-0.88-2.21-2.06
c-0.04-1.18,0.88-2.17,2.06-2.21c3.38-0.11,6.73,0.3,9.97,1.24c1.13,0.33,1.79,1.51,1.46,2.65
C133.6,106.38,132.75,106.99,131.82,106.99z"/>
</g>
<g>
<path class="st2" d="M221.25,210.5c-11.76-18.72-17.17-45.44-17.17-45.44s14.9-38.09,9.11-47.19
c-5.8-9.11-28.15,13.25-28.15,13.25s12.42,54.64,1.66,72.86c-10.76,18.22-52.99,20.7-52.99,20.7s3.63,7.25,8.02,19.68
L221.25,210.5z"/>
<path d="M141.72,246.49c-0.88,0-1.7-0.55-2.01-1.43c-4.29-12.14-7.88-19.37-7.92-19.44c-0.32-0.64-0.3-1.4,0.06-2.02
c0.36-0.62,1.01-1.02,1.72-1.06c0.41-0.02,41.22-2.63,51.28-19.65c10.21-17.28-1.78-70.76-1.9-71.3
c-0.16-0.72,0.05-1.47,0.57-1.98c1.74-1.74,17.33-16.98,26.42-16.01c2.15,0.24,3.89,1.32,5.04,3.12
c5.96,9.37-6.34,42.43-8.69,48.52c0.88,4.04,6.31,27.5,16.76,44.13c0.63,1,0.33,2.32-0.67,2.95c-1,0.63-2.32,0.33-2.95-0.67
c-11.83-18.83-17.23-45.05-17.46-46.15c-0.08-0.4-0.05-0.82,0.1-1.2c5.61-14.34,13.09-39.3,9.29-45.27
c-0.45-0.71-1.04-1.07-1.9-1.17c-5.09-0.57-15.9,7.95-22.11,13.96c1.8,8.29,11.46,55.81,1.15,73.25
c-9.57,16.2-41.38,20.51-51.58,21.49c1.46,3.22,3.96,9.07,6.79,17.09c0.39,1.11-0.19,2.33-1.3,2.73
C142.2,246.45,141.96,246.49,141.72,246.49z"/>
</g>
</g>
<g>
<path d="M105.22,333.58c-0.23,0-0.47-0.04-0.7-0.12c-1.12-0.39-1.71-1.6-1.32-2.72l28.68-83.02c0.2-0.57,0.62-1.02,1.17-1.26
l92.59-40.13c0.91-0.39,1.98-0.11,2.57,0.69l11.35,15.3c5.21-1.26,23.1-4.78,36.79,2.61c7.87,4.24,26.99,17.89,34.54,52.92
c0.25,1.15-0.49,2.29-1.64,2.54c-1.16,0.24-2.29-0.49-2.54-1.64c-7.17-33.29-25.04-46.1-32.39-50.06
c-14.29-7.71-34.82-1.95-35.02-1.89c-0.86,0.25-1.78-0.06-2.31-0.78l-11.2-15.1l-90.17,39.08l-28.37,82.13
C106.93,333.02,106.1,333.58,105.22,333.58z"/>
</g>
<g>
<path d="M150.72,283.54c-0.23,0-0.46-0.04-0.69-0.11c-0.63-0.21-1.13-0.71-1.34-1.34l-8.42-24.99l-12.85,18.23
c-0.68,0.96-2.01,1.19-2.98,0.52c-0.96-0.68-1.2-2.01-0.52-2.98l15.28-21.67c0.46-0.66,1.26-1,2.05-0.88
c0.8,0.12,1.46,0.67,1.72,1.43l8.87,26.33l67.83-45.7c0.98-0.66,2.31-0.4,2.97,0.58c0.66,0.98,0.4,2.31-0.58,2.97l-70.16,47.26
C151.56,283.42,151.14,283.54,150.72,283.54z"/>
</g>
<g>
<path d="M216.63,340.89c-0.13,0-0.26-0.01-0.39-0.04c-1.16-0.22-1.93-1.33-1.71-2.49l3.89-20.9c0.22-1.16,1.32-1.93,2.49-1.71
c1.16,0.22,1.92,1.33,1.71,2.49l-3.89,20.9C218.54,340.17,217.64,340.89,216.63,340.89z"/>
</g>
<g>
<path d="M132.3,296.96c-3.01,0-5.46-2.45-5.46-5.46c0-3.01,2.45-5.46,5.46-5.46c3.01,0,5.46,2.45,5.46,5.46
C137.76,294.51,135.31,296.96,132.3,296.96z M132.3,290.31c-0.65,0-1.19,0.53-1.19,1.19c0,0.65,0.53,1.19,1.19,1.19
c0.65,0,1.19-0.53,1.19-1.19C133.49,290.85,132.95,290.31,132.3,290.31z"/>
</g>
<g>
<path d="M122.35,330.36c-3.01,0-5.46-2.45-5.46-5.46c0-3.01,2.45-5.46,5.46-5.46c3.01,0,5.46,2.45,5.46,5.46
C127.81,327.91,125.36,330.36,122.35,330.36z M122.35,323.71c-0.65,0-1.19,0.53-1.19,1.19c0,0.65,0.53,1.19,1.19,1.19
c0.65,0,1.19-0.53,1.19-1.19C123.54,324.24,123.01,323.71,122.35,323.71z"/>
</g>
<g>
<path d="M105.19,333.57c-0.17,0-0.34-0.02-0.51-0.06c-1.15-0.28-1.85-1.44-1.56-2.59l14.35-58.42c0.28-1.15,1.43-1.85,2.59-1.57
c1.15,0.28,1.85,1.44,1.57,2.59l-14.35,58.42C107.03,332.92,106.15,333.57,105.19,333.57z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View file

@ -0,0 +1,126 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.07" style="enable-background:new 0 0 345.07 345.07;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5339)" class="st17" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<path class="st3" d="M297.49,285.69c0-15.71-12.74-28.45-28.45-28.45H77.39c-15.71,0-28.45,12.74-28.45,28.45v7.17
c29.28,30.06,69.4,49.5,114.07,51.93h19.05c45.37-2.47,86.05-22.49,115.44-53.37V285.69z"/>
<path class="st3" d="M140.94,276.01H88.73c0,0-32.82-55.2,2.98-79.07C127.52,173.07,140.94,276.01,140.94,276.01z"/>
<g>
<path class="st2" d="M159.7,270.15h-12.83c-4.66,0-33.17-27.53-29.99-30.71v-99.67c0-23.65,19.17-42.82,42.82-42.82l0,0
c23.65,0,42.82,19.17,42.82,42.82v87.55C202.52,250.97,183.35,270.15,159.7,270.15z"/>
<path d="M159.71,272.28h-12.83c-5.56,0-28.95-22.95-31.9-30.06c-0.63-1.52-0.56-2.61-0.23-3.38v-99.08
c0-24.79,20.17-44.96,44.96-44.96c24.79,0,44.96,20.17,44.96,44.96v87.55C204.66,252.11,184.49,272.28,159.71,272.28z
M118.82,240.35c1.2,4.71,23.64,26.85,28.16,27.67l12.73-0.01c22.43,0,40.68-18.25,40.68-40.68v-87.55
c0-22.43-18.25-40.68-40.68-40.68c-22.43,0-40.68,18.25-40.68,40.68v99.67C119.02,239.76,118.95,240.07,118.82,240.35z"/>
</g>
<g>
<path class="st2" d="M169.7,199.8c-17.34,13.1-41.52,15.35-61.52,3.8h0c-26.67-15.4-35.81-49.5-20.41-76.17l29.92-51.83
c15.4-26.67,49.5-35.81,76.17-20.41v0c26.67,15.4,35.81,49.5,20.41,76.17L169.7,199.8z"/>
<path d="M136.08,213.23c-9.96,0-19.95-2.57-28.97-7.78c-13.39-7.73-22.97-20.22-26.97-35.15c-4-14.94-1.95-30.54,5.78-43.93
l29.92-51.83c7.73-13.39,20.22-22.97,35.15-26.97c14.94-4,30.54-1.95,43.93,5.78c13.39,7.73,22.97,20.22,26.97,35.15
c4,14.94,1.95,30.54-5.78,43.93c-0.59,1.02-1.9,1.37-2.92,0.78c-1.02-0.59-1.37-1.9-0.78-2.92c7.16-12.4,9.06-26.85,5.36-40.69
c-3.71-13.83-12.58-25.4-24.98-32.56c-12.4-7.16-26.85-9.06-40.69-5.36c-13.83,3.71-25.4,12.58-32.56,24.98l-29.92,51.83
c-7.16,12.4-9.06,26.85-5.36,40.69c3.71,13.83,12.58,25.4,24.98,32.56c18.7,10.8,41.93,9.36,59.16-3.66
c0.94-0.71,2.28-0.52,2.99,0.42c0.71,0.94,0.52,2.28-0.42,2.99C160.69,209.28,148.42,213.23,136.08,213.23z"/>
</g>
<path class="st3" d="M235.62,139.76c6.3-14.3,7.68-29.73,4.79-44.26c-4.26-7.46-10.9-13.15-18.83-15.61
c2.43-4.9,3.81-10.5,3.89-16.44c-5.59-6.95-12.48-13.05-20.67-17.78c-35.5-20.5-80.89-8.33-101.38,27.16l-1.79,3.09
c4.04,1.94,8.49,3.03,13.19,3.03c9.71,0,18.4-4.63,24.41-11.94c5.89,6.16,13.87,9.96,22.67,9.96c0.2,0,0.4-0.03,0.6-0.03
c3.85,9.85,11.65,17.41,21.22,20.37c-2.5,5.05-3.92,10.82-3.92,16.96c0,19.76,14.69,35.78,32.81,35.78
C221.57,150.05,229.7,146.12,235.62,139.76z"/>
<g>
<path class="st2" d="M187.69,146.69c0-17.62,14.28-31.9,31.9-31.9c17.62,0,31.9,14.28,31.9,31.9c0,17.62-14.28,31.9-31.9,31.9
c-7.34,0-14.1-2.48-19.49-6.64L187.69,146.69z"/>
<path d="M219.59,180.74c-7.6,0-14.79-2.45-20.79-7.09c-0.93-0.72-1.11-2.06-0.39-3c0.72-0.93,2.07-1.1,3-0.38
c5.25,4.05,11.53,6.2,18.18,6.2c16.41,0,29.77-13.35,29.77-29.77c0-16.41-13.35-29.77-29.77-29.77
c-16.41,0-29.77,13.35-29.77,29.77c0,1.18-0.96,2.14-2.14,2.14c-1.18,0-2.14-0.96-2.14-2.14c0-18.77,15.27-34.04,34.04-34.04
c18.77,0,34.04,15.27,34.04,34.04C253.63,165.46,238.36,180.74,219.59,180.74z"/>
</g>
<path d="M115.39,115c-1.58,3.45-4.88,5.33-7.37,4.19c-2.49-1.14-3.22-4.86-1.63-8.32c1.58-3.45,4.88-5.33,7.37-4.19
C116.25,107.82,116.98,111.55,115.39,115z"/>
<path d="M147.48,132.62c-1.58,3.45-4.88,5.33-7.37,4.19c-2.49-1.14-3.22-4.86-1.63-8.32c1.58-3.45,4.88-5.33,7.37-4.19
C148.33,125.44,149.07,129.17,147.48,132.62z"/>
<g>
<path d="M116.84,158.29c-2.26,0-4.51-0.39-6.64-1.17c-1.11-0.41-1.68-1.63-1.27-2.74c0.41-1.11,1.64-1.68,2.74-1.27
c4.13,1.52,8.89,1.12,12.72-1.07c1.03-0.58,2.33-0.23,2.92,0.79c0.59,1.02,0.23,2.33-0.79,2.92
C123.57,157.43,120.21,158.29,116.84,158.29z"/>
</g>
<g>
<path d="M114.15,139.13c-0.39,0-0.79-0.11-1.15-0.34c-0.99-0.64-1.28-1.96-0.65-2.95L123.79,118c0.64-0.99,1.96-1.28,2.95-0.65
c0.99,0.64,1.28,1.96,0.65,2.95l-11.43,17.85C115.54,138.79,114.85,139.13,114.15,139.13z"/>
</g>
<g>
<path d="M121.71,99.68c-0.21,0-0.42-0.03-0.63-0.09c-3.17-0.97-6.58-1.24-9.87-0.77c-1.17,0.15-2.25-0.65-2.42-1.81
c-0.17-1.17,0.65-2.25,1.81-2.42c3.9-0.55,7.96-0.24,11.73,0.92c1.13,0.35,1.76,1.54,1.42,2.67
C123.47,99.09,122.62,99.68,121.71,99.68z"/>
</g>
<g>
<path d="M157.65,123.44c-1.06,0-1.98-0.79-2.12-1.87c-0.44-3.43-3.47-6.45-6.9-6.87c-1.17-0.14-2.01-1.21-1.86-2.38
c0.14-1.17,1.21-2,2.38-1.86c5.37,0.66,9.94,5.2,10.62,10.57c0.15,1.17-0.68,2.24-1.85,2.39
C157.83,123.44,157.74,123.44,157.65,123.44z"/>
</g>
<g>
<path d="M200.01,155.29c-0.08,0-0.16,0-0.24-0.01c-1.17-0.13-2.02-1.19-1.89-2.36c0.71-6.4,3.19-12.45,7.17-17.5
c0.73-0.93,2.07-1.09,3-0.36c0.93,0.73,1.09,2.07,0.36,3c-3.44,4.37-5.67,9.81-6.28,15.33
C202,154.48,201.08,155.29,200.01,155.29z"/>
</g>
<g>
<path d="M236.68,84.17c-0.17,0-0.35-0.02-0.53-0.07l-0.94-0.24c-4.98-1.27-10.62-2.71-14.99-1.26c-1.06,0.35-2.22-0.17-2.65-1.21
c-0.43-1.03,0.01-2.23,1.01-2.73c4.84-2.44,9.08-6.32,11.93-10.92c0.62-1,1.94-1.32,2.94-0.69c1,0.62,1.32,1.94,0.69,2.94
c-1.84,2.98-4.13,5.65-6.76,7.91c3.1,0.34,6.16,1.12,8.88,1.82l0.93,0.24c1.14,0.29,1.84,1.45,1.55,2.6
C238.51,83.53,237.64,84.17,236.68,84.17z"/>
</g>
<path class="st3" d="M132.78,275.67c0,0,69.65-77.77,109.12-73.13c26.54,3.12,39.47,25.54,39.47,53.4
C281.37,283.8,134.52,273.93,132.78,275.67z"/>
<g>
<path class="st2" d="M278.95,263.09H209.2c-1.18,0-2.14-0.96-2.14-2.14c0-1.18,0.96-2.14,2.14-2.14h69.74
c1.18,0,2.14,0.96,2.14,2.14C281.08,262.13,280.13,263.09,278.95,263.09z"/>
</g>
<g>
<path class="st2" d="M159.71,313.54c-1.18,0-2.14-0.96-2.14-2.14v-41.26c0-1.18,0.96-2.14,2.14-2.14c1.18,0,2.14,0.96,2.14,2.14
v41.26C161.84,312.59,160.89,313.54,159.71,313.54z"/>
</g>
<g>
<path class="st2" d="M123.14,312.06c-1.18,0-2.14-0.96-2.14-2.14v-43.03c0-1.18,0.96-2.14,2.14-2.14c1.18,0,2.14,0.96,2.14,2.14
v43.03C125.27,311.1,124.32,312.06,123.14,312.06z"/>
</g>
<g>
<path class="st2" d="M110.52,276.45c-0.34,0-0.69-0.08-1.01-0.26l-28.94-15.58c-1.04-0.56-1.43-1.86-0.87-2.89
c0.56-1.04,1.86-1.43,2.89-0.87l28.94,15.58c1.04,0.56,1.43,1.85,0.87,2.89C112.02,276.04,111.28,276.45,110.52,276.45z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.2 KiB

View file

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.15" style="enable-background:new 0 0 345.07 345.15;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5337)" class="st7" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<path class="st2" d="M137.52,228.5l-1.12-35.06c-17.26,7.88-29.2,10.91-35.56,9.01c-1-0.3-1.88-0.72-2.61-1.26
c-2.21-1.61-2.72-4.1-2.49-5.76c-0.29-11.05-2.95-32.48-11.03-34.98c-7.53-2.33-10.71-4.74-12.06-6.35l-1.39-1.67l1.41-1.66
c1.9-2.24,8.38-10.2,11.73-18.47c2.96-7.29,3.34-16.73,3.77-27.66c0.22-5.37,0.44-10.88,0.97-16.79
c0.66-7.45,4.31-13.04,10.55-16.19l0.17-0.09l0.18-0.06c2.44-0.8,4.89-1.58,6.69-2.12l0.16-0.05l0.16-0.03
c0.46-0.07,0.88-0.14,1.29-0.18l2.85-0.32l0.03,2.86c0.35,31.85,20.1,49.79,32.47,53.62c5.43,1.62,9.78-1.79,14.38-5.4
c4.81-3.77,9.77-7.67,16.14-5.77c2,0.6,3.95,1.72,5.98,3.42c3.2,2.69,4.54,7.03,3.78,12.21c-1.22,8.18-8.06,18.83-20.58,24.18
c-3.8,1.62-4.28,2.79-4.31,3.22c-0.12,1.65,4.07,4.22,7.76,6.49c4.68,2.88,9.98,6.13,12.74,10.38c4.07,6.25,0.1,12.17-4.5,19.03
c-3.88,5.78-8.7,12.96-9.95,22.25c-1,7.49,1.76,14.42,8.21,20.61L137.52,228.5z"/>
<g>
<path class="st2" d="M173.44,233.03c-15.97,6.49-41.43-7.99-41.43-7.99L173.44,233.03z"/>
<path d="M163.91,236.84c-15.26,0-32.08-9.44-32.95-9.94c-1.03-0.58-1.38-1.89-0.8-2.91c0.58-1.02,1.89-1.38,2.91-0.8
c0.24,0.14,24.75,13.88,39.57,7.87c1.1-0.45,2.34,0.08,2.78,1.17c0.44,1.09-0.08,2.34-1.17,2.78
C171.04,236.31,167.52,236.84,163.91,236.84z"/>
</g>
<g>
<path d="M102.15,332.19c-0.07,0-0.14,0-0.21-0.01c-1.17-0.11-2.04-1.16-1.92-2.33c2.61-27.08,6.56-53.17,7.45-58.14
c4.8-26.92,19.14-48.85,24.48-56.29c-3.75,0.03-11.59,1.09-23.36,3.21c-13.28,2.39-25.02,9.13-33.07,18.97
c-3.96,4.84-6.59,9.86-7.82,14.91c-2.84,11.66-7.19,31.98-10.34,46.97c-0.24,1.15-1.37,1.89-2.53,1.65
c-1.16-0.24-1.89-1.38-1.65-2.53c3.15-15.02,7.52-35.39,10.37-47.11c1.38-5.68,4.3-11.26,8.67-16.6
c8.69-10.63,21.34-17.9,35.62-20.47c22.01-3.97,27.1-3.78,29.19-1.99c0.87,0.75,1,2.05,0.28,2.95c-0.2,0.25-20,25.55-25.62,57.08
c-0.88,4.93-4.8,30.85-7.4,57.8C104.17,331.36,103.24,332.19,102.15,332.19z"/>
</g>
<g>
<path d="M144.74,344.94c-1.09,0-2.02-0.83-2.13-1.94c-1.02-11.1-1.1-21.3-0.25-30.3c6.5-68.54,45.13-98.13,46.77-99.35
c0.5-0.37,1.14-0.51,1.75-0.37c67.36,15.1,68.43,16,68.95,16.44c10.38,8.79,34.51,32.97,34.4,67.45c0,1.18-0.96,2.13-2.14,2.13
c0,0,0,0-0.01,0c-1.18,0-2.13-0.96-2.13-2.14c0.1-32.43-22.6-55.41-32.65-63.98c-3.8-1.31-41.1-9.84-66.35-15.51
c-5.41,4.49-38.51,34.35-44.33,95.73c-0.83,8.75-0.74,18.68,0.25,29.51c0.11,1.18-0.76,2.22-1.93,2.32
C144.87,344.94,144.8,344.94,144.74,344.94z"/>
</g>
<g>
<path class="st3" d="M159.58,141.55c-0.99,0-1.87-0.69-2.09-1.69c-1.24-5.8,2.79-10.86,6.89-15.05
c1.45-1.48,5.87-5.97,10.58-3.91c1.08,0.47,1.58,1.73,1.1,2.81c-0.47,1.08-1.74,1.57-2.81,1.1c-1.35-0.59-3.3,0.42-5.82,2.99
c-3.47,3.54-6.57,7.35-5.76,11.16c0.25,1.15-0.49,2.29-1.64,2.54C159.87,141.53,159.72,141.55,159.58,141.55z"/>
</g>
<g>
<path class="st8" d="M79.44,135.99c-0.05,0-0.1,0-0.15,0c-5.37-0.18-7.49-9.88-7.19-18.82c0.16-4.62,0.93-8.97,2.19-12.25
c1.96-5.1,4.46-6.09,6.24-6.05c5.37,0.18,7.49,9.88,7.19,18.82c-0.16,4.62-0.93,8.97-2.19,12.25
C83.64,134.91,81.2,135.99,79.44,135.99z M80.38,103.14c-0.94,0.21-3.69,4.89-4,14.17c-0.31,9.28,2.11,14.13,3.08,14.41
c0.94-0.21,3.69-4.89,4-14.17C83.77,108.27,81.35,103.42,80.38,103.14z"/>
</g>
<g>
<path d="M105.07,203.78c-3.19,0-5.66-0.65-7.41-1.95c-2.62-1.96-2.99-4.85-2.78-6.44c-0.33-12.13-3.44-31.97-10.43-34.13
c-11.38-3.52-13.19-7.34-13.47-8.43c-0.18-0.69,0-1.43,0.47-1.96c0.08-0.09,8.31-9.41,12.16-18.9c2.9-7.15,3.28-16.53,3.71-27.38
c0.21-5.35,0.44-10.88,0.97-16.82c1.44-16.1,15.85-19.87,23.24-19.64c1.18,0.04,2.1,1.03,2.06,2.21
c-0.04,1.18-0.98,2.12-2.2,2.06c-0.73-0.02-17.41-0.32-18.84,15.75c-0.52,5.84-0.74,11.32-0.95,16.62
c-0.45,11.25-0.84,20.98-4.02,28.82c-3.3,8.12-9.33,15.84-11.82,18.84c1.06,0.96,3.73,2.83,9.96,4.75
c12.24,3.79,13.36,34.78,13.45,38.3c0,0.15-0.01,0.31-0.04,0.46c-0.02,0.12-0.2,1.55,1.14,2.51c2.52,1.81,12.36,3.93,49.29-15.28
c1.05-0.55,2.34-0.14,2.88,0.91c0.54,1.05,0.14,2.34-0.91,2.88C130,198.15,114.44,203.78,105.07,203.78z"/>
</g>
<g>
<path class="st8" d="M102,143.64c-0.05,0-0.11,0-0.16,0c-2.04-0.07-4.89-1.47-6.82-7.73c-1.29-4.17-1.89-9.64-1.7-15.39
c0.38-11.24,3.89-22.5,9.89-22.5c0.05,0,0.11,0,0.16,0c6.1,0.21,8.9,11.79,8.52,23.13C111.52,132.37,108,143.64,102,143.64z
M103.21,102.28c-1.51,0-5.21,6.19-5.62,18.37c-0.18,5.29,0.36,10.26,1.51,13.99c1.05,3.4,2.32,4.7,2.88,4.72
c0.01,0,0.01,0,0.02,0c1.51,0,5.21-6.19,5.62-18.37c0.41-12.23-2.89-18.66-4.39-18.71C103.23,102.28,103.22,102.28,103.21,102.28
z"/>
</g>
<path d="M185.31,245.52c0,0-24.2-10.01-21.47-30.37c2.73-20.35,21.45-29.95,14.65-40.4c-6.8-10.45-31.17-15.35-15.62-21.99
c17.76-7.58,24.91-27.12,16.48-34.2c-15.04-12.65-22.33,12.24-36.05,7.99c-27.32-8.46-33.77-44.69-33.37-56.58
c0.01-0.38-10.46,3.1-10.46,3.1s-0.41-21.87,10.66-20.73c11.08,1.14,6.62,8.27,28.71,1.35c22.08-6.92,48.57-10.46,62.75,3.64
c26.34,26.19-3.97,61.2,24.16,68.28c28.13,7.08,41.23-6.28,39.25,18.57c-1.99,24.85,20.69,34.43,33.09,30.63
C310.49,171.01,185.31,245.52,185.31,245.52z"/>
<g>
<path class="st8" d="M94.93,119.52c-0.12,0-0.24-0.01-0.36-0.03l-9.53-1.6c-1.16-0.2-1.95-1.3-1.75-2.46
c0.2-1.16,1.29-1.95,2.46-1.75l9.53,1.6c1.16,0.2,1.95,1.3,1.75,2.46C96.86,118.78,95.96,119.52,94.93,119.52z"/>
</g>
<g>
<path class="st3" d="M122.8,168.43c-0.76,0-1.5-0.41-1.88-1.12c-0.56-1.04-0.17-2.34,0.87-2.89c3.06-1.65,5.01-5.21,4.74-8.68
c-0.09-1.18,0.79-2.2,1.96-2.3c1.16-0.09,2.2,0.79,2.3,1.96c0.4,5.18-2.4,10.31-6.97,12.77
C123.48,168.35,123.14,168.43,122.8,168.43z"/>
</g>
<g>
<path class="st2" d="M137.73,224.58l-0.04-32L137.73,224.58z"/>
<path d="M137.73,226.72c-1.18,0-2.14-0.95-2.14-2.13l-0.04-32c0-1.18,0.95-2.14,2.13-2.14c0,0,0,0,0,0
c1.18,0,2.14,0.95,2.14,2.13l0.04,32C139.86,225.76,138.91,226.72,137.73,226.72C137.73,226.72,137.73,226.72,137.73,226.72z"/>
</g>
<g>
<path d="M158.36,345.15c-0.1,0-0.21-0.01-0.31-0.02c-1.17-0.17-1.98-1.26-1.81-2.42c2.78-19.04,12.54-40.82,15.14-46.4l-7.64-8.3
c-0.48-0.52-0.67-1.24-0.51-1.93c0.16-0.69,0.65-1.25,1.31-1.51l13.87-5.34l33.07-60.22c0.57-1.04,1.86-1.41,2.9-0.84
c1.03,0.57,1.41,1.87,0.84,2.9l-33.45,60.9c-0.24,0.44-0.63,0.78-1.11,0.96l-11.67,4.49l6.48,7.05c0.59,0.65,0.73,1.59,0.35,2.38
c-0.12,0.25-12.33,25.56-15.38,46.46C160.32,344.39,159.41,345.15,158.36,345.15z"/>
</g>
<g>
<path d="M211.42,341.96c-0.01,0-0.01,0-0.02,0c-1.18-0.01-2.13-0.98-2.12-2.16l0.31-32.44c0.01-1.17,0.97-2.12,2.14-2.12
c0.01,0,0.01,0,0.02,0c1.18,0.01,2.13,0.98,2.12,2.16l-0.31,32.44C213.54,341.01,212.59,341.96,211.42,341.96z"/>
</g>
<g>
<path d="M90.86,323.48c-0.97,0-1.85-0.66-2.08-1.65c-2.04-8.66-3.55-21.35-4.45-28.93c-0.35-2.91-0.7-5.93-0.84-6.47
c-0.4-1.21-1.16-3.46,10.53-10.66l-11.3-6.22c-0.96-0.53-1.36-1.69-0.94-2.69c5.84-14.02,31.12-50.71,32.19-52.26
c0.67-0.97,2-1.21,2.97-0.55c0.97,0.67,1.22,2,0.55,2.97c-0.25,0.36-24.06,34.92-30.99,49.73l12.84,7.07
c0.68,0.37,1.1,1.08,1.11,1.85c0.01,0.77-0.4,1.49-1.06,1.87c-4.88,2.84-10.5,6.68-11.67,8.25c0.19,0.98,0.41,2.86,0.86,6.6
c0.89,7.49,2.38,20.02,4.36,28.45c0.27,1.15-0.44,2.3-1.59,2.57C91.18,323.46,91.02,323.48,90.86,323.48z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.2 KiB

View file

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.07" style="enable-background:new 0 0 345.07 345.07;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5337)" class="st9" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5337)" class="st10" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<g>
<path d="M287.82,303c-0.81,0-1.58-0.46-1.94-1.24c-4.73-10.2-9.58-16.56-15.89-23.52c-6.89-7.6-25.94-14.5-53.65-19.43
c-0.86-0.16-1.71-0.3-2.54-0.44c-0.44,0.39-0.9,0.76-1.37,1.12c-0.42,0.32-0.82,0.63-1.24,0.92c-2.78,2.03-5.8,3.77-8.72,5.46
c-9,5.19-16.49,8.19-23.76,9.57c-15.85,3.02-32.44-0.35-45.51-9.23c-2.89-1.95-5.46-4.1-7.63-6.39
c-0.73-0.77-1.37-1.52-1.96-2.25c-6.95,0.41-45.73,2.89-63.12,7.04c-7.31,1.75-14.69,7.08-21.93,15.86
c-0.75,0.91-2.1,1.04-3.01,0.29c-0.91-0.75-1.04-2.1-0.29-3.01c7.85-9.51,16-15.33,24.23-17.29c19.87-4.75,64.63-7.21,65.04-7.22
c0.69-0.03,1.37,0.3,1.79,0.86c0.68,0.91,1.45,1.82,2.35,2.79c1.95,2.05,4.28,4,6.92,5.78c12.15,8.25,27.57,11.37,42.32,8.56
c6.78-1.28,13.85-4.13,22.24-8.97c3-1.74,5.91-3.42,8.53-5.33c0.39-0.28,0.76-0.56,1.12-0.84c0.63-0.49,1.25-1.01,1.84-1.57
c0.49-0.46,1.16-0.67,1.82-0.56c1.16,0.19,2.38,0.4,3.61,0.62c20.25,3.61,46.43,10.14,56.06,20.77
c6.57,7.25,11.64,13.9,16.6,24.59c0.5,1.07,0.03,2.34-1.04,2.84C288.43,302.94,288.13,303,287.82,303z"/>
</g>
<g>
<path d="M278.87,131.15c0.88-4.97-0.24-9.99-3.13-14.12c-2.28-3.26-5.47-5.62-9.15-6.92c0.63-0.67,1.26-1.34,1.8-2.1
c2.9-4.14,4.01-9.15,3.13-14.12c-1.6-9.05-9.42-15.62-18.6-15.62c-0.04,0-0.09,0.01-0.13,0.01c2.27-5.29,2.17-11.53-0.92-16.9
c-3.37-5.83-9.64-9.45-16.38-9.45c-2.24,0-4.45,0.44-6.55,1.21c0.05-0.91,0.11-1.83,0.03-2.75c-0.44-5.03-2.81-9.59-6.68-12.83
c-3.4-2.85-7.71-4.42-12.14-4.42c-4.54,0-8.82,1.68-12.21,4.57c-1.65-5.55-5.75-10.29-11.6-12.42c-2.09-0.76-4.26-1.15-6.47-1.15
c-6.84,0-13.09,3.75-16.41,9.56c-3.45-4.62-8.91-7.66-15.1-7.66c-9.34,0-17.06,6.82-18.58,15.73c-3.02-2-6.61-3.16-10.38-3.16
c-2.2,0-4.38,0.39-6.46,1.14c-4.74,1.73-8.53,5.2-10.67,9.77c-1.67,3.59-2.13,7.52-1.43,11.33c-1.42-0.33-2.87-0.53-4.36-0.53
c-4.43,0-8.74,1.57-12.14,4.42c-3.87,3.25-6.24,7.8-6.68,12.83c-0.35,3.94,0.57,7.79,2.52,11.13c-5.88,0.7-11.18,4.12-14.17,9.3
c-2.52,4.37-3.2,9.47-1.89,14.34c1.03,3.84,3.21,7.14,6.21,9.62c-5.2,2.61-9.09,7.5-10.16,13.57c-0.88,4.97,0.24,9.99,3.13,14.12
c2.28,3.26,5.47,5.62,9.15,6.92c-3.96,4.2-6.01,10.11-4.93,16.22c1.6,9.05,9.41,15.62,18.59,15.62c0.04,0,0.09-0.01,0.13-0.01
c-2.27,5.29-2.17,11.53,0.92,16.9c3.37,5.83,9.65,9.45,16.38,9.45c2.24,0,4.45-0.43,6.55-1.21c-0.05,0.91-0.11,1.83-0.03,2.75
c0.44,5.03,2.81,9.59,6.68,12.83c3.4,2.85,7.71,4.42,12.14,4.42c4.54,0,8.82-1.68,12.21-4.57c1.65,5.55,5.75,10.29,11.6,12.42
c2.08,0.76,4.26,1.14,6.46,1.14c6.84,0,13.09-3.75,16.41-9.56c3.45,4.62,8.91,7.66,15.1,7.66c9.34,0,17.06-6.82,18.58-15.73
c3.02,2,6.61,3.16,10.38,3.16c2.21,0,4.38-0.38,6.47-1.14c4.74-1.73,8.53-5.2,10.66-9.77c1.67-3.59,2.13-7.52,1.43-11.33
c1.42,0.34,2.87,0.53,4.36,0.53c4.43,0,8.74-1.57,12.14-4.42c7.14-5.99,8.68-16.16,4.14-23.96c5.88-0.69,11.19-4.11,14.18-9.31
c2.53-4.37,3.2-9.46,1.89-14.34c-1.03-3.84-3.21-7.14-6.22-9.62C273.9,142.11,277.8,137.22,278.87,131.15z"/>
<g>
<g>
<path class="st2" d="M186.51,254.74c0.16-1.14,0.28-2.29,0.28-3.47v-88.51c0-13.43-10.87-24.32-24.3-24.35
c-13.42,0.03-24.3,10.92-24.3,24.35v88.51c0,0.95-0.05,2.98,0.06,3.91c-7.81,0.6-14.11,1.03-15.89,1.58
c-0.25,0.08-0.33,0.37-0.17,0.57c1.43,1.79,6.81,7.25,9.2,9.16c12.7,10.17,28.88,13.87,43.92,10.49
c8.17-1.83,15.74-6.01,22.9-10.88c2.95-2.02,5.96-4.06,8.72-6.43c0.4-0.33,0.78-0.68,1.16-1.03c0.25-0.23,0.47-0.48,0.71-0.71
C201.93,256.59,194.43,255.53,186.51,254.74z"/>
<path d="M164.19,280.34c-12.18,0-24.18-4.21-34.15-12.2c-2.46-1.96-7.95-7.5-9.54-9.49c-0.52-0.65-0.68-1.51-0.44-2.3
c0.24-0.79,0.86-1.4,1.65-1.64c1.73-0.53,5.93-0.87,13.81-1.47l0.5-0.04c0-0.38,0-0.79,0.01-1.21l0.01-0.72v-88.51
c0-14.57,11.86-26.45,26.43-26.49c14.58,0.03,26.44,11.92,26.44,26.49v88.51c0,0.51-0.02,1.03-0.06,1.57
c7.24,0.77,14.08,1.77,20.34,2.99c0.78,0.15,1.41,0.72,1.64,1.48c0.23,0.76,0.02,1.59-0.55,2.14l-0.25,0.25
c-0.16,0.17-0.33,0.34-0.5,0.5c-0.42,0.38-0.82,0.74-1.23,1.09c-2.79,2.4-5.82,4.47-8.74,6.46
c-8.99,6.12-16.51,9.67-23.8,11.31C171.93,279.92,168.05,280.34,164.19,280.34z M125.96,258.33c2.13,2.24,5.14,5.19,6.75,6.47
c12.11,9.7,27.46,13.37,42.12,10.08c6.75-1.51,13.8-4.87,22.17-10.56c2.45-1.67,4.86-3.31,7.09-5.09
c-5.56-0.95-11.53-1.75-17.79-2.36c-0.58-0.06-1.11-0.35-1.47-0.81c-0.36-0.46-0.52-1.04-0.43-1.62
c0.17-1.22,0.25-2.22,0.25-3.17v-88.51c0-12.22-9.94-22.19-22.17-22.21c-12.21,0.03-22.16,9.99-22.16,22.21l-0.01,89.28
c-0.01,0.86-0.02,2.3,0.05,2.9c0.07,0.58-0.11,1.16-0.47,1.6c-0.37,0.45-0.91,0.73-1.48,0.77l-2.55,0.2
C132.1,257.79,128.46,258.06,125.96,258.33z"/>
</g>
<g>
<path class="st2" d="M162.43,138.4c0.02,0,0.04,0,0.06,0c0.02,0,0.04,0,0.06,0H162.43z"/>
<path d="M162.54,140.54c-0.07-0.03-0.25,0-0.32-0.01c-1.18,0-2.03-0.95-2.03-2.13c0-1.18,1.06-2.13,2.24-2.13h0.11
c1.18,0,2.14,0.96,2.14,2.14C164.68,139.58,163.72,140.54,162.54,140.54z"/>
</g>
</g>
<g>
<path class="st2" d="M124.37,151.59c3.03,11.15,0.74,21.48-5.11,23.07c-5.85,1.59-13.05-6.17-16.08-17.32
c-3.03-11.15-0.74-21.48,5.11-23.07C114.15,132.68,121.35,140.44,124.37,151.59z"/>
<path d="M117.72,177c-6.55,0-13.54-7.83-16.6-19.1c-1.55-5.72-1.84-11.46-0.8-16.15c1.15-5.17,3.78-8.56,7.41-9.55
c3.64-0.98,7.62,0.61,11.22,4.49c3.27,3.52,5.92,8.61,7.48,14.33l0,0c3.39,12.48,0.48,23.77-6.62,25.69
C119.13,176.91,118.43,177,117.72,177z M109.84,136.21c-0.34,0-0.67,0.04-0.99,0.13c-2,0.54-3.59,2.86-4.36,6.35
c-0.89,4.03-0.63,9.03,0.75,14.1c2.9,10.69,9.42,16.91,13.46,15.82c4.04-1.1,6.51-9.76,3.61-20.45l0,0
c-1.38-5.07-3.68-9.52-6.48-12.54C113.78,137.4,111.66,136.21,109.84,136.21z"/>
</g>
<g>
<path class="st2" d="M198.2,151.59c-3.03,11.15-0.74,21.48,5.11,23.07c5.85,1.59,13.05-6.17,16.08-17.32
c3.03-11.15,0.74-21.48-5.11-23.07C208.42,132.68,201.23,140.44,198.2,151.59z"/>
<path d="M204.85,177c-0.71,0-1.41-0.09-2.1-0.28c-7.1-1.93-10.01-13.21-6.62-25.7l0,0c1.55-5.72,4.21-10.81,7.48-14.33
c3.6-3.88,7.59-5.48,11.22-4.49c3.63,0.99,6.27,4.38,7.41,9.55c1.04,4.69,0.76,10.42-0.8,16.15
C218.39,169.17,211.4,177,204.85,177z M200.26,152.15c-2.9,10.69-0.42,19.35,3.61,20.45c4.04,1.09,10.56-5.13,13.46-15.82
c1.38-5.07,1.64-10.07,0.75-14.1c-0.77-3.49-2.36-5.81-4.36-6.35c-2-0.55-4.54,0.65-6.97,3.27
C203.94,142.63,201.64,147.08,200.26,152.15L200.26,152.15z"/>
</g>
<g>
<path class="st2" d="M161.42,234.44L161.42,234.44c-25.27,0-45.75-29.68-45.75-54.94v-54.3c0-25.27,29-11.01,45.75-45.75h0
c7.7,25.58,45.75,20.48,45.75,45.75v54.3C207.17,204.76,186.69,234.44,161.42,234.44z"/>
<path d="M161.42,236.57c-12.45,0-24.54-6.68-34.03-18.82c-8.68-11.08-13.85-25.39-13.85-38.26v-54.3
c0-13.76,8-17.13,17.26-21.02c9.13-3.84,20.49-8.61,28.7-25.66c0.38-0.79,1.23-1.27,2.09-1.2c0.88,0.07,1.62,0.67,1.88,1.51
c3.44,11.42,13.64,16.36,23.5,21.13c10.98,5.31,22.34,10.81,22.34,25.24v54.3c0,12.88-5.18,27.18-13.85,38.26
C185.96,229.89,173.87,236.57,161.42,236.57z M161.15,84.55c-8.65,15.13-19.69,19.77-28.7,23.56
c-8.82,3.71-14.65,6.16-14.65,17.08v54.3c0,23.92,19.46,52.81,43.62,52.81c24.16,0,43.62-28.89,43.62-52.81v-54.3
c0-11.75-9.23-16.22-19.93-21.39C176.15,99.47,166.14,94.63,161.15,84.55z"/>
</g>
<path d="M131.83,153.43c1.2,3.06,3.96,4.85,6.17,3.99c2.21-0.86,3.02-4.05,1.82-7.11c-1.2-3.06-3.96-4.85-6.17-3.99
C131.44,147.18,130.63,150.37,131.83,153.43z"/>
<g>
<path d="M146.93,143.82c-0.46,0-0.92-0.15-1.31-0.45c-2.05-1.58-4.89-2.58-8-2.8c-3.78-0.27-7.37,0.67-9.59,2.52
c-0.91,0.75-2.26,0.63-3.01-0.28c-0.75-0.91-0.63-2.26,0.28-3.01c3.05-2.53,7.77-3.84,12.62-3.49
c3.95,0.28,7.61,1.59,10.32,3.68c0.93,0.72,1.1,2.06,0.38,3C148.2,143.54,147.56,143.82,146.93,143.82z"/>
</g>
<path d="M180.84,153.43c1.2,3.06,3.96,4.85,6.17,3.99c2.21-0.86,3.02-4.05,1.82-7.11c-1.2-3.06-3.96-4.85-6.17-3.99
C180.46,147.18,179.64,150.37,180.84,153.43z"/>
<g>
<path d="M195.94,143.82c-0.46,0-0.92-0.15-1.31-0.45c-2.05-1.58-4.89-2.58-8-2.8c-3.78-0.27-7.37,0.67-9.59,2.52
c-0.91,0.75-2.25,0.63-3.01-0.28c-0.75-0.91-0.63-2.26,0.28-3.01c3.05-2.53,7.78-3.84,12.62-3.49
c3.95,0.28,7.61,1.59,10.32,3.68c0.93,0.72,1.1,2.06,0.38,3C197.21,143.54,196.57,143.82,195.94,143.82z"/>
</g>
<g>
<path d="M159.01,174.49c-1.32,0-2.64-0.55-3.47-1.53c-1.63-1.92-1.46-4.45-1.36-5.96c0.56-8.52,1.33-17.14,2.28-25.63
c0.13-1.17,1.2-2.01,2.36-1.88c1.17,0.13,2.02,1.19,1.88,2.36c-0.95,8.42-1.71,16.98-2.27,25.43c-0.07,1.12-0.11,2.36,0.36,2.91
c0.01,0,0.03,0.01,0.06,0.01c0.38-0.86,1.3-1.39,2.27-1.26c1.17,0.17,1.98,1.26,1.81,2.42c-0.21,1.42-1.21,2.52-2.67,2.94
C159.86,174.44,159.43,174.49,159.01,174.49z"/>
</g>
<g>
<path d="M168.22,189.02c-1.55,0-3.07-0.27-4.5-0.82c-1.1-0.42-1.65-1.66-1.23-2.76c0.42-1.1,1.66-1.65,2.76-1.23
c2.3,0.88,5.04,0.66,7.52-0.6c2.48-1.27,4.27-3.36,4.9-5.75c0.3-1.14,1.47-1.82,2.61-1.52c1.14,0.3,1.82,1.47,1.52,2.61
c-0.94,3.56-3.52,6.64-7.09,8.46C172.64,188.48,170.41,189.02,168.22,189.02z"/>
</g>
<path d="M117.87,135.24c0,0,3.63-29.72,12.95-25.64c9.32,4.08,9.67,12.57,24.17,13.58c14.5,1.02,23.82-4.08,29,1.02
c5.18,5.09,14.5,16.3,26.93,8.15c12.43-8.15,13.64-27.68-6.04-37.87c-19.68-10.19-49.2-11.72-65.77-12.74
C122.53,80.73,105.44,110.79,117.87,135.24z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

View file

@ -0,0 +1,132 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.07" style="enable-background:new 0 0 345.07 345.07;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5338)" class="st18" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<g>
<path d="M176.18,215.26c0,0,33.49,16.43,57.4,10.38c23.92-6.05,66.17-27.67,27.11-89.05c-39.07-61.39-57.4-56.2-78.93-64.84
c-21.53-8.65-61.39-36.31-67.77-18.16c-6.38,18.16,4.78,39.77,9.57,48.42C128.34,110.65,176.18,215.26,176.18,215.26z"/>
<g>
<path class="st2" d="M209.16,247.05c-1.06-0.37-2.12-0.71-3.18-1.05c-2.11-4.49-4.16-9.09-5.88-13.45
c-7.18-18.16-10.37-57.06-10.37-57.06s19.67-9.51,26.84-19.02c7.18-9.51,7.28-32.18-6.11-32.86
c-11.43-0.58-18.86,15.8-19.93,15.56c-13.29-2.88-6.91-41.5-41.46-44.09c-23.91-1.8-34.28-17.29-34.28-17.29
s-23.92,83-23.92,102.89c0,19.89,18.34,22.48,18.34,22.48l6.57,39.16c-4.12,0.62-8.39,1.27-12.34,1.87
c-0.06,0.84-0.09,1.69-0.09,2.54c0,26.55,28.94,48.08,64.65,48.08c30.84,0,56.62-16.07,63.07-37.55
C225.12,253.64,217.88,250.06,209.16,247.05z"/>
<path d="M167.99,296.94c-36.82,0-66.78-22.53-66.78-50.21c0-0.9,0.03-1.8,0.1-2.69c0.07-1,0.82-1.81,1.81-1.96
c3.27-0.5,6.76-1.03,10.2-1.54l-5.97-35.6c-4.75-1.23-18.61-6.35-18.61-24.25c0-19.96,23.02-100.08,24-103.48
c0.23-0.8,0.9-1.39,1.72-1.52c0.82-0.13,1.64,0.23,2.1,0.92c0.1,0.14,10.16,14.66,32.67,16.35c22.93,1.72,29,18.58,33.43,30.88
c2.17,6.03,4.07,11.31,7.26,12.88c0.23-0.32,0.49-0.7,0.74-1.06c3.27-4.76,10.04-14.7,19.91-14.17
c4.79,0.24,8.65,2.97,10.85,7.69c3.75,8.04,2.29,21.39-3.14,28.58c-6.38,8.45-21.66,16.64-26.29,19
c0.66,7.17,3.89,39.31,10.1,55.02c1.46,3.7,3.29,7.89,5.43,12.48c0.78,0.25,1.56,0.51,2.34,0.78
c8.02,2.77,15.52,6.27,22.31,10.39c0.83,0.5,1.22,1.51,0.94,2.44C226.2,280.87,199.42,296.94,167.99,296.94z M105.48,246.03
c-0.01,0.23-0.01,0.46-0.01,0.69c0,25.33,28.04,45.94,62.51,45.94c28.36,0,53.46-14.4,60.51-34.46
c-6.14-3.59-12.87-6.66-20.03-9.14l0,0c-1.04-0.36-2.09-0.7-3.13-1.03c-0.57-0.18-1.04-0.59-1.29-1.13
c-2.35-5-4.35-9.57-5.94-13.57c-7.21-18.24-10.37-56.07-10.51-57.67c-0.07-0.88,0.4-1.71,1.2-2.1
c0.19-0.09,19.29-9.4,26.07-18.38c4.52-5.99,5.8-17.53,2.68-24.2c-1.55-3.31-3.97-5.07-7.19-5.23
c-7.48-0.37-13.34,8.2-16.17,12.33c-1.63,2.37-2.44,3.55-4.11,3.19c-6.16-1.34-8.6-8.12-11.43-15.98
c-4.48-12.45-9.57-26.56-29.73-28.07c-17.97-1.35-28.57-10.05-33.18-14.94c-4.7,16.62-22.73,81.48-22.73,98.4
c0,17.73,15.83,20.27,16.51,20.36c0.92,0.13,1.65,0.85,1.8,1.76l6.56,39.16c0.09,0.57-0.04,1.15-0.38,1.61
c-0.34,0.46-0.85,0.77-1.41,0.86C112.57,244.96,108.93,245.51,105.48,246.03z"/>
</g>
<g>
<path class="st3" d="M191.53,160.77c-1.14,0-2.09-0.9-2.13-2.06c-0.28-7.36,6.34-14.8,8.37-16.91c2.05-2.12,4.17-4.32,6.5-5.58
c1.04-0.57,2.33-0.18,2.9,0.86c0.56,1.04,0.18,2.33-0.86,2.9c-1.75,0.95-3.63,2.9-5.46,4.79c-3.58,3.71-7.35,9.28-7.17,13.78
c0.04,1.18-0.88,2.17-2.06,2.22C191.58,160.77,191.56,160.77,191.53,160.77z"/>
</g>
<g>
<path class="st3" d="M144.66,142.77c-5.23,0-10.47-1.97-14.44-5.68c-0.86-0.81-0.91-2.16-0.1-3.02c0.81-0.86,2.16-0.91,3.02-0.1
c4.83,4.52,12.03,5.8,17.91,3.19c1.08-0.48,2.34,0.01,2.82,1.09c0.48,1.08-0.01,2.34-1.09,2.82
C150.21,142.21,147.44,142.77,144.66,142.77z"/>
</g>
<g>
<path class="st3" d="M112.02,128.17c-4.58,0-9.17-2.24-12.05-6.07c-0.71-0.94-0.52-2.28,0.42-2.99
c0.95-0.71,2.29-0.52,2.99,0.42c2.51,3.34,6.8,5.01,10.65,4.15c1.16-0.25,2.29,0.47,2.55,1.62c0.25,1.15-0.47,2.29-1.62,2.55
C113.99,128.07,113.01,128.17,112.02,128.17z"/>
</g>
<g>
<path class="st3" d="M149.61,118.25c-0.42,0-0.84-0.12-1.21-0.38c-2.55-1.76-5.48-2.78-8.48-2.95
c-1.18-0.07-2.08-1.08-2.01-2.26c0.07-1.18,1.1-2.06,2.26-2.01c3.79,0.22,7.48,1.5,10.67,3.71c0.97,0.67,1.21,2,0.54,2.97
C150.95,117.93,150.28,118.25,149.61,118.25z"/>
</g>
<g>
<path class="st3" d="M120.89,109.64c-0.49,0-0.97-0.16-1.38-0.5c-1.47-1.23-6.38-2.94-8.65-2.46c-1.16,0.25-2.29-0.48-2.54-1.63
c-0.25-1.15,0.48-2.29,1.63-2.54c3.83-0.84,10.02,1.43,12.32,3.36c0.9,0.76,1.02,2.11,0.26,3.01
C122.1,109.38,121.5,109.64,120.89,109.64z"/>
</g>
<g>
<path class="st3" d="M115.05,160.94c-0.14,0-0.29-0.01-0.44-0.05c-3.65-0.77-6.97-2.88-9.34-5.96
c-0.56-0.73-0.59-1.73-0.08-2.49c2.11-3.17,6.84-10.81,9.73-16.03c0.57-1.03,1.87-1.4,2.9-0.83c1.03,0.57,1.41,1.87,0.83,2.9
c-2.59,4.67-6.62,11.25-9.02,14.96c1.63,1.65,3.7,2.81,5.85,3.27c1.16,0.24,1.9,1.37,1.65,2.53
C116.93,160.25,116.04,160.94,115.05,160.94z"/>
</g>
<g>
<path class="st3" d="M125.95,188.07c-1.58,0-3.17-0.27-4.7-0.83c-1.11-0.41-1.68-1.63-1.27-2.74c0.41-1.11,1.64-1.68,2.74-1.27
c4.97,1.83,11.12-1.01,13.43-6.2c0.48-1.08,1.75-1.56,2.82-1.09c1.08,0.48,1.56,1.74,1.09,2.82
C137.51,184.49,131.75,188.07,125.95,188.07z"/>
</g>
<g>
<path class="st3" d="M120.69,206.71c-4.85,0-9.54-0.63-13.72-1.95c-1.12-0.35-1.75-1.55-1.39-2.68
c0.35-1.13,1.56-1.75,2.68-1.39c12.16,3.83,29.11,1.31,40.31-6c0.99-0.65,2.31-0.37,2.96,0.62c0.64,0.99,0.37,2.31-0.62,2.96
C142.56,203.71,131.26,206.71,120.69,206.71z"/>
</g>
<g>
<path class="st3" d="M180.96,146.5c-0.43,0-0.87-0.13-1.25-0.4c-3.27-2.36-6.51-5.98-8.17-16.34
c-1.46-9.16-6.05-16.66-13.64-22.29c-1.95-1.45-4.86-2.08-7.94-2.75c-5.68-1.23-12.75-2.76-13.38-11.05
c-0.09-1.18,0.79-2.2,1.97-2.29c1.19-0.08,2.2,0.79,2.29,1.97c0.37,4.87,3.87,5.86,10.02,7.19c3.39,0.73,6.89,1.49,9.58,3.49
c8.52,6.32,13.67,14.75,15.32,25.05c1.33,8.34,3.54,11.45,6.46,13.55c0.96,0.69,1.17,2.03,0.48,2.98
C182.28,146.19,181.63,146.5,180.96,146.5z"/>
</g>
<g>
<path class="st6" d="M194.21,197.8c-3.02,0-5.98-0.97-8.53-2.83c-6.84-5.01-8.67-15.1-4.07-22.49
c2.52-4.05,6.56-6.66,11.08-7.16c1.15-0.13,2.23,0.72,2.36,1.89c0.13,1.17-0.72,2.23-1.89,2.36c-3.21,0.35-6.1,2.23-7.92,5.17
c-3.45,5.54-2.11,13.07,2.96,16.78c2.34,1.71,5.16,2.36,7.92,1.83c2.91-0.56,5.44-2.35,7.11-5.04
c3.45-5.54,2.11-13.07-2.96-16.78c-0.95-0.7-1.16-2.03-0.46-2.99c0.7-0.95,2.04-1.16,2.99-0.46c6.84,5.01,8.67,15.1,4.07,22.49
c-2.31,3.71-5.83,6.19-9.93,6.98C196.03,197.71,195.12,197.8,194.21,197.8z"/>
</g>
</g>
<g>
<path class="st3" d="M24.78,265.22c-0.68,0-1.35-0.33-1.77-0.93c-0.67-0.97-0.42-2.3,0.56-2.97
c27.23-18.63,77.71-19.25,79.84-19.27c0.01,0,0.01,0,0.02,0c1.17,0,2.13,0.95,2.14,2.12c0.01,1.18-0.94,2.14-2.12,2.15
c-0.51,0-51.32,0.63-77.47,18.52C25.61,265.1,25.19,265.22,24.78,265.22z"/>
</g>
<g>
<path class="st3" d="M296.92,292.22c-0.38,0-0.77-0.1-1.11-0.32c-43.18-26.46-65.08-32.53-65.3-32.59
c-1.14-0.31-1.81-1.48-1.51-2.62c0.31-1.14,1.48-1.82,2.61-1.51c0.9,0.24,22.61,6.22,66.42,33.07c1.01,0.62,1.32,1.93,0.71,2.94
C298.34,291.86,297.64,292.22,296.92,292.22z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.7 KiB

View file

@ -0,0 +1,138 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 347.64" style="enable-background:new 0 0 345.07 347.64;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5338)" class="st13" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<g>
<path d="M270.22,121.61c-4.93-2.3-10.02-3.81-15.14-4.61c-2.93-1.92-25.96-2.57-37.24-5.63c-7.57-2.06-12.89-9.31-16.58-15.33
c-1.24-2.83-2.86-5.5-4.85-7.91c-4.72-6.29-11.64-9.01-11.64-9.01c-16.74-7.83-36.66-0.6-44.49,16.15
c-7.83,16.75-0.6,36.66,16.15,44.49c2.6,1.22,5.28,2.07,7.98,2.58c14.57,4.61,16.84,7.18,20.73,15.04
c3.05,6.17,4.91,16.2,5.61,20.53c1.91,19,13.47,36.54,32.02,45.21c28.03,13.1,61.37,1,74.47-27.03
C310.36,168.05,298.25,134.71,270.22,121.61z"/>
<g>
<path class="st2" d="M273.18,221.64c-0.39,0-0.78-0.1-1.13-0.32c-1-0.62-1.31-1.94-0.68-2.94l0.58-0.92
c15.2-25.52,7.48-58.42-17.22-73.33c-4.23-2.55-8.8-4.47-13.61-5.71c-0.3-0.08-0.59-0.22-0.83-0.42
c-1.09-0.75-7.69-2.09-12.98-3.16c-7.62-1.55-16.25-3.3-21.93-5.47c-7.99-3.06-12.71-11.62-15.56-17.8
c-0.04-0.09-0.08-0.18-0.11-0.28c-0.84-2.76-2.04-5.36-3.57-7.74c-3.58-6.14-9.43-9.22-9.49-9.25
c-10.06-6.07-24.33-9.6-34.57-1.5c-0.93,0.73-2.27,0.58-3-0.35c-0.73-0.93-0.58-2.27,0.35-3c11.95-9.45,28.14-5.62,39.31,1.13
c0.16,0.08,6.9,3.63,11.04,10.75c1.67,2.59,3.03,5.5,3.98,8.59c2.54,5.49,6.66,12.98,13.15,15.47
c5.34,2.05,13.79,3.76,21.25,5.27c8.15,1.65,12.49,2.57,14.39,3.73c5.08,1.34,9.91,3.39,14.39,6.1
c26.7,16.12,35.08,51.64,18.68,79.18c-0.13,0.22-0.27,0.43-0.4,0.64l-0.22,0.34C274.59,221.28,273.89,221.64,273.18,221.64z"/>
</g>
<g>
<path class="st3" d="M318.95,189.99c-0.23,0-0.47-0.04-0.7-0.12c-1.12-0.38-1.71-1.6-1.32-2.72c5.8-16.79,5.34-34.61-1.29-50.17
c-6.6-15.49-18.54-26.88-33.6-32.09c-5.32-1.84-10.91-2.83-16.62-2.96c-0.34-0.01-0.66-0.09-0.96-0.25
c-1.39-0.6-9.16-0.34-15.41-0.14c-8.93,0.3-19.05,0.63-25.91-0.35c-9.62-1.38-16.71-10.13-21.2-16.6
c-0.06-0.08-0.11-0.17-0.15-0.26c-1.54-3.05-3.45-5.81-5.7-8.2c-5.32-6.24-12.66-8.3-12.73-8.32
c-18.32-6.32-38.79,5.01-45.77,25.22c-0.39,1.12-1.6,1.71-2.72,1.32c-1.12-0.39-1.71-1.6-1.32-2.72
c7.75-22.44,30.66-34.96,51.07-27.91c0.21,0.05,8.52,2.35,14.66,9.56c2.43,2.58,4.56,5.63,6.26,8.99
c4.04,5.8,10.3,13.55,18.21,14.69c6.48,0.93,16.4,0.6,25.16,0.31c9.58-0.32,14.66-0.44,17.01,0.39
c6.01,0.17,11.91,1.24,17.52,3.18c16.22,5.6,29.06,17.84,36.14,34.45c7.05,16.54,7.55,35.45,1.4,53.24
C320.66,189.43,319.83,189.99,318.95,189.99z"/>
</g>
<ellipse transform="matrix(0.2312 -0.9729 0.9729 0.2312 -62.1945 216.4094)" cx="105.84" cy="147.56" rx="64.44" ry="64.44"/>
<path class="st2" d="M138.7,274.53c-1.18,3.23-42.47-51.51-43.41-52.15l45.44-48.22c0,0,32.75,51.12,41.8,53.38
C182.52,227.55,151.31,239.99,138.7,274.53z"/>
<g>
<path d="M138.7,276.67c-0.67,0-1.33-0.31-1.75-0.9c-5.89-8.35-40.74-49.48-43.04-51.75c-0.42-0.35-0.69-0.85-0.75-1.4
c-0.07-0.62,0.14-1.25,0.57-1.7l45.44-48.22c0.45-0.48,1.11-0.72,1.75-0.66c0.66,0.06,1.25,0.42,1.6,0.97
c12.49,19.49,34.53,50.97,40.52,52.46c1.14,0.29,1.84,1.45,1.55,2.59c-0.29,1.14-1.45,1.84-2.59,1.55
c-8.73-2.18-33.69-39.79-41.59-52l-42.2,44.78c7.77,8.6,38.08,45.01,42.23,50.9c0.68,0.96,0.45,2.3-0.51,2.98
C139.56,276.54,139.13,276.67,138.7,276.67z"/>
</g>
<path class="st3" d="M140.57,203.37c0.89,0.92,0.4,2.53-0.77,4.05c-8.12,10.68-16.91,21.15-26.31,31.36
c-1.07,1.14-2.15,2.35-3.34,3.41c-2.73-4.11-5.4-8.22-7.89-11.87c-0.74-1.17-1.49-2.3-2.22-3.31c0.27-0.17,0.59-0.35,0.86-0.53
c1.32-0.82,2.39-1,3.22-0.82c0.7-0.44,1.41-0.85,2.12-1.34c3.27-2.23,6.51-4.51,9.77-6.76c6.71-4.63,13.42-9.25,20.12-13.9
C137.78,202.52,139.78,202.57,140.57,203.37z"/>
<g>
<path class="st2" d="M143.38,171.03c3.14-9.52,3.5-20.06,0.26-30.35c-8.22-26.18-36.11-40.73-62.29-32.51
c-20.44,6.42-33.73,24.83-34.69,45.05c-7.6,11.94-10.09,27.02-5.52,41.58c8.22,26.18,36.11,40.73,62.29,32.51
c13.83-4.34,24.37-14.19,30.05-26.36c4.75,6.28,13.08,9.23,21.02,6.74c10.1-3.17,15.71-13.93,12.54-24.03
C163.91,173.69,153.37,168.11,143.38,171.03z"/>
<path d="M88.48,231.76c-8.24,0-16.4-1.99-23.91-5.91c-12.27-6.4-21.31-17.2-25.46-30.41c-4.53-14.43-2.54-30.03,5.45-42.89
c1.25-21.39,15.72-40,36.15-46.43c13.2-4.15,27.24-2.91,39.51,3.5c12.27,6.41,21.31,17.2,25.46,30.41
c2.89,9.19,3.13,18.88,0.74,28.21c9.88-1.08,19.59,4.99,22.66,14.77c1.71,5.43,1.19,11.2-1.44,16.24
c-2.63,5.05-7.07,8.76-12.5,10.47c-7.5,2.35-15.62,0.34-21.17-5.01c-6.39,11.73-17.13,20.62-29.9,24.63
C98.95,230.97,93.7,231.76,88.48,231.76z M96.3,108c-4.79,0-9.61,0.73-14.31,2.21c-18.91,5.94-32.25,23.27-33.2,43.12
c-0.02,0.37-0.13,0.73-0.33,1.05c-7.57,11.89-9.49,26.39-5.28,39.8c3.81,12.12,12.1,22.02,23.36,27.9
c11.26,5.88,24.13,7.01,36.25,3.21c12.65-3.97,23.13-13.17,28.75-25.22c0.32-0.68,0.97-1.14,1.71-1.22
c0.75-0.07,1.48,0.24,1.93,0.84c4.33,5.73,11.84,8.14,18.67,5.99c4.34-1.36,7.89-4.34,9.99-8.37c2.1-4.03,2.51-8.64,1.15-12.98
c-2.76-8.78-12.19-13.81-21.02-11.22c-0.76,0.22-1.58,0.01-2.14-0.57c-0.55-0.57-0.74-1.4-0.49-2.15
c3.14-9.53,3.23-19.57,0.25-29.04c-3.81-12.12-12.1-22.03-23.36-27.9C111.35,109.82,103.86,108,96.3,108z"/>
</g>
<g>
<path d="M138.15,190.59c-0.5,0-1.01-0.18-1.42-0.54c-0.88-0.79-0.96-2.14-0.18-3.02c4.69-5.26,12.16-7.69,19.05-6.18
c1.15,0.25,1.88,1.39,1.63,2.54c-0.25,1.15-1.39,1.89-2.54,1.63c-5.32-1.17-11.32,0.78-14.94,4.85
C139.32,190.35,138.74,190.59,138.15,190.59z"/>
</g>
<g>
<path d="M64.19,189.57c-0.1,0-0.2,0-0.3,0c-5.34-0.09-10.28-2.44-13.2-6.29c-0.71-0.94-0.53-2.28,0.41-2.99
c0.94-0.72,2.28-0.53,2.99,0.41c2.14,2.82,5.83,4.53,9.87,4.6c4.05,0.05,7.78-1.53,10.01-4.28c0.75-0.91,2.09-1.05,3.01-0.31
c0.92,0.74,1.06,2.09,0.31,3.01C74.29,187.39,69.42,189.57,64.19,189.57z"/>
</g>
<g>
<path d="M100.39,147.11c-0.86,0-1.67-0.52-1.99-1.37c-2.73-7.12-8.29-5.87-13.28-4.15l-0.52,0.18
c-1.12,0.38-2.33-0.23-2.71-1.34c-0.38-1.12,0.23-2.33,1.34-2.71l0.49-0.17c3.52-1.22,14.22-4.91,18.67,6.65
c0.42,1.1-0.13,2.34-1.23,2.76C100.9,147.06,100.64,147.11,100.39,147.11z"/>
</g>
<g>
<path d="M56.31,164.96c-0.7,0-1.39-0.35-1.8-0.98c-0.64-0.99-0.35-2.31,0.64-2.95c6.54-4.2,10.06-10.19,11.12-13.07
c1.13-3.07,0.59-6.78-1.47-10.18c-2.13-3.52-5.53-5.97-8.87-6.4c-1.17-0.15-2-1.22-1.84-2.39c0.15-1.17,1.24-2,2.39-1.84
c4.67,0.6,9.15,3.75,11.98,8.42c2.74,4.51,3.4,9.56,1.83,13.86c-1.54,4.2-5.82,10.7-12.82,15.19
C57.11,164.85,56.71,164.96,56.31,164.96z"/>
</g>
<path d="M54.47,150.14c-0.14,3.38,1.72,6.19,4.15,6.29c2.43,0.1,4.51-2.55,4.65-5.93c0.14-3.38-1.72-6.19-4.15-6.29
C56.7,144.11,54.61,146.76,54.47,150.14z"/>
<path d="M82.65,156.09c-0.14,3.38,1.72,6.19,4.15,6.29c2.43,0.1,4.51-2.55,4.65-5.93c0.14-3.38-1.72-6.19-4.15-6.29
C84.88,150.05,82.79,152.71,82.65,156.09z"/>
<path class="st3" d="M156.69,147.01c1.01,8.17,1.53,16.39,1.79,24.59c0.02,0.7-0.42,1.48-1.21,1.5
c-7.15,0.17-14.27-0.95-21.04-3.27c-12.39-4.26-23.32-12.54-30.46-23.57c-7.79-12.07-11.12-26.84-9.14-41.08
c0.21-1.62,2.53-1.33,2.66,0.1c4.92-3.98,12.2-3.99,18.16-2.52c6.62,1.63,12.6,5.04,18.29,8.71c6.17,3.95,11.73,8.13,15.24,14.75
C154.38,132.63,155.79,139.88,156.69,147.01z"/>
</g>
<g>
<path class="st3" d="M169.91,347.64c-0.62,0-1.23-0.27-1.66-0.78l-16.08-19.68c-20.3-24.84-19.14-59.96,2.75-83.49
c18.55-19.95,47.3-26.71,73.23-17.23l90.82,33.2c1.11,0.4,1.68,1.63,1.27,2.74c-0.41,1.11-1.63,1.68-2.74,1.27l-90.82-33.2
c-24.31-8.89-51.25-2.56-68.63,16.13c-20.42,21.96-21.5,54.71-2.57,77.88l16.08,19.68c0.75,0.91,0.61,2.26-0.3,3.01
C170.86,347.48,170.39,347.64,169.91,347.64z"/>
</g>
<g>
<path class="st3" d="M102.82,328.77c-1.05,0-1.97-0.78-2.11-1.85l-3.44-25.18c-2.66-19.49,3.58-38.7,17.12-52.69
c0.82-0.85,2.17-0.87,3.02-0.05c0.85,0.82,0.87,2.17,0.05,3.02c-12.63,13.05-18.44,30.96-15.96,49.14l3.44,25.18
c0.16,1.17-0.66,2.25-1.83,2.41C103.02,328.76,102.92,328.77,102.82,328.77z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.8 KiB

View file

@ -0,0 +1,125 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.07" style="enable-background:new 0 0 345.07 345.07;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5338)" class="st16" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<g>
<path d="M52.49,294.35c-0.64,0-1.28-0.29-1.7-0.84c-0.72-0.94-0.54-2.28,0.4-2.99c0.98-0.75,24.48-18.51,67.33-28.63
c39.45-9.31,103.3-13.43,183.48,19.82c1.09,0.45,1.61,1.7,1.15,2.79c-0.45,1.09-1.7,1.6-2.79,1.15
c-79.01-32.77-141.83-28.78-180.63-19.67c-42.04,9.88-65.72,27.74-65.95,27.92C53.4,294.21,52.94,294.35,52.49,294.35z"/>
</g>
<g>
<g>
<circle cx="154.04" cy="125.45" r="73.94"/>
<g>
<path class="st2" d="M124.6,176.17c0,0,3.6,84.33,4.71,85.18c67.42,51.23,61.68,14.68,61.68,14.68l-13.08-86.06L124.6,176.17z"
/>
<path d="M181.01,290.77c-10.96,0-28.72-9.28-52.99-27.72c-1.03-0.78-1.92-1.46-5.56-86.79c-0.03-0.68,0.26-1.33,0.79-1.75
c0.53-0.43,1.22-0.58,1.88-0.41l53.31,13.8c0.83,0.21,1.45,0.9,1.58,1.75l13.08,86.06c0.06,0.37,1.4,9.41-5.27,13.39
C185.97,290.21,183.69,290.77,181.01,290.77z M131.2,260.1c37.14,28.12,50.04,27.95,54.44,25.33c4.22-2.52,3.25-9.01,3.24-9.07
l-12.87-84.68l-49.15-12.72C128.19,209.94,130.32,254.1,131.2,260.1z"/>
</g>
<g>
<path class="st2" d="M224.87,92.54l8.37,53.31c3.46,21.26,1.34,43.05-6.16,63.23l-9.06,24.4c0,0-53.23,2.71-92.21-39.48
C86.84,151.8,106.18,43.89,224.87,92.54z"/>
<path d="M216.43,235.64c-9.54,0-56.9-2.01-92.18-40.19c-21.92-23.72-25.09-65.86-6.93-92.01
c11.57-16.65,41.02-40.48,108.36-12.87c0.69,0.28,1.18,0.91,1.3,1.65l8.38,53.31c3.51,21.57,1.35,43.81-6.26,64.31l-9.06,24.4
c-0.3,0.8-1.04,1.35-1.89,1.39C218.08,235.61,217.49,235.64,216.43,235.64z M170.68,82.23c-27.97,0-42.66,13.28-49.85,23.64
c-17.1,24.63-14.1,64.32,6.56,86.67c34.11,36.92,79.93,38.82,88.96,38.82c0.07,0,0.13,0,0.19,0l8.55-23.03
c7.36-19.8,9.45-41.3,6.05-62.15l-8.19-52.13C201.76,85.51,184.58,82.23,170.68,82.23z"/>
</g>
<g>
<path d="M245.73,129.34c-0.79,0-1.55-0.44-1.92-1.2c-1.07-2.19-5.1-4.83-9.99-5.47c-2.87-0.37-8.28-0.3-12.36,4.4
c-0.77,0.89-2.12,0.99-3.01,0.22c-0.89-0.77-0.99-2.12-0.22-3.01c3.99-4.61,9.73-6.69,16.14-5.84c5.94,0.78,11.4,4,13.28,7.83
c0.52,1.06,0.08,2.34-0.98,2.86C246.36,129.27,246.04,129.34,245.73,129.34z"/>
</g>
<g>
<path d="M192.95,126.11c-0.79,0-1.55-0.44-1.92-1.2c-1.07-2.19-5.1-4.83-9.99-5.47c-2.87-0.37-8.28-0.3-12.36,4.4
c-0.77,0.89-2.12,0.99-3.01,0.22c-0.89-0.77-0.99-2.12-0.22-3.01c3.99-4.61,9.73-6.68,16.14-5.84c5.94,0.78,11.4,4,13.27,7.83
c0.52,1.06,0.08,2.34-0.98,2.86C193.58,126.04,193.26,126.11,192.95,126.11z"/>
</g>
<path d="M189.95,146.6c-0.08,2.75-1.74,4.92-3.72,4.87c-1.98-0.06-3.51-2.33-3.44-5.07c0.08-2.75,1.74-4.93,3.72-4.87
C188.49,141.58,190.03,143.85,189.95,146.6z"/>
<path d="M233.61,148.54c-0.08,2.75-1.74,4.93-3.72,4.87c-1.98-0.06-3.51-2.33-3.44-5.07c0.08-2.75,1.74-4.93,3.72-4.87
C232.15,143.53,233.69,145.8,233.61,148.54z"/>
<g>
<path class="st6" d="M233.53,173.29c-11.32,0-20.74-8.99-21.16-20.4c-0.44-11.67,8.71-21.53,20.38-21.96h0
c5.65-0.2,11.05,1.79,15.2,5.64c4.15,3.85,6.55,9.08,6.76,14.74c0.21,5.65-1.79,11.05-5.64,15.2
c-3.85,4.15-9.08,6.55-14.74,6.76C234.06,173.29,233.8,173.29,233.53,173.29z M232.91,135.21L232.91,135.21
c-9.32,0.35-16.62,8.21-16.27,17.53c0.17,4.51,2.08,8.69,5.4,11.77c3.31,3.07,7.61,4.69,12.13,4.5
c4.51-0.17,8.69-2.08,11.76-5.4c3.07-3.31,4.67-7.62,4.5-12.13c-0.17-4.52-2.08-8.69-5.4-11.77
C241.73,136.64,237.41,135.04,232.91,135.21z"/>
</g>
<g>
<path d="M211.05,185.27c-0.08,0-0.16,0-0.24-0.01l-16.72-1.9c-1.17-0.13-2.02-1.19-1.88-2.36c0.13-1.17,1.21-2.02,2.36-1.88
l14.11,1.6l-5.01-54.12c-0.11-1.17,0.76-2.22,1.93-2.32c1.18-0.1,2.22,0.76,2.32,1.93l5.25,56.73
c0.06,0.64-0.17,1.27-0.63,1.72C212.14,185.05,211.61,185.27,211.05,185.27z"/>
</g>
<g>
<path class="st6" d="M214.78,153.18c-0.1,0-0.21-0.01-0.32-0.02l-12.69-1.87c-1.17-0.17-1.97-1.26-1.8-2.43
c0.17-1.17,1.28-1.97,2.43-1.8l12.69,1.87c1.17,0.17,1.97,1.26,1.8,2.43C216.73,152.41,215.82,153.18,214.78,153.18z"/>
</g>
<path d="M146.67,104.06l3.75,53.97l-32.4-2.76l6.47,38.73c0,0-46.59-18.75-36.84-70.6c26.53-141.12,165.9-26.76,132.83-25.45
C187.4,99.25,146.67,104.06,146.67,104.06z"/>
<g>
<path class="st2" d="M139.18,155.2c1.79-9.93-4.81-19.43-14.74-21.23c-9.93-1.79-19.43,4.81-21.23,14.74
c-1.79,9.93,4.81,19.43,14.74,21.23L139.18,155.2z"/>
<path d="M117.96,172.07c-0.13,0-0.25-0.01-0.38-0.03c-11.08-2-18.46-12.63-16.46-23.71c0.97-5.36,3.97-10.03,8.44-13.14
c4.48-3.11,9.9-4.29,15.26-3.32c11.08,2,18.46,12.63,16.46,23.71c-0.21,1.16-1.31,1.94-2.48,1.72
c-1.16-0.21-1.93-1.32-1.72-2.48c1.58-8.76-4.26-17.16-13.02-18.74c-4.25-0.77-8.53,0.17-12.07,2.63
c-3.54,2.46-5.91,6.15-6.68,10.39c-0.77,4.24,0.17,8.53,2.63,12.07c2.46,3.54,6.15,5.91,10.39,6.68
c1.16,0.21,1.93,1.32,1.72,2.48C119.87,171.35,118.97,172.07,117.96,172.07z"/>
</g>
<g>
<path class="st6" d="M181.13,170.46c-0.4,0-0.8-0.01-1.21-0.03c-5.65-0.31-10.84-2.81-14.61-7.03
c-3.77-4.22-5.68-9.65-5.36-15.3c0.31-5.65,2.81-10.84,7.03-14.61c4.22-3.77,9.66-5.66,15.3-5.36
c5.65,0.31,10.84,2.81,14.61,7.03c3.77,4.22,5.68,9.65,5.36,15.3c-0.31,5.65-2.81,10.84-7.03,14.61
C191.31,168.57,186.34,170.46,181.13,170.46z M181.07,132.36c-4.16,0-8.13,1.51-11.25,4.31c-3.37,3.01-5.36,7.15-5.61,11.67
c-0.25,4.51,1.27,8.85,4.28,12.22c3.01,3.37,7.16,5.36,11.67,5.61c4.51,0.24,8.85-1.27,12.21-4.28
c3.37-3.01,5.36-7.15,5.61-11.67c0.25-4.51-1.27-8.85-4.28-12.21c-3.01-3.37-7.15-5.36-11.67-5.61
C181.71,132.37,181.39,132.36,181.07,132.36z"/>
</g>
<g>
<path d="M199.3,209.05c-7.24,0-16.47-2.01-25.57-9.58c-0.91-0.75-1.03-2.1-0.28-3.01c0.76-0.91,2.1-1.03,3.01-0.28
c16.9,14.06,34.19,6.71,34.92,6.39c1.08-0.48,2.34,0.01,2.82,1.09c0.48,1.08-0.01,2.34-1.08,2.82
C212.69,206.67,207.17,209.05,199.3,209.05z"/>
</g>
<ellipse cx="217.11" cy="60.57" rx="32.92" ry="37.65"/>
<ellipse cx="180.66" cy="60.42" rx="23.64" ry="27.04"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7 KiB

View file

@ -0,0 +1,137 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 345.07 345.07" style="enable-background:new 0 0 345.07 345.07;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F6E1DC;}
.st1{fill:#F0AF9B;}
.st2{fill:#FFFFFF;}
.st3{fill:#080717;}
.st4{fill:none;stroke:#85BAC6;stroke-width:0.4121;stroke-miterlimit:10;}
.st5{fill:#F2ECDE;}
.st6{fill:#85BAC6;}
.st7{fill:#FCDEDE;}
.st8{fill:#AAD2DC;}
.st9{fill:#F5F5F5;}
.st10{fill:#E8EDC5;}
.st11{fill:#B9D2D7;}
.st12{fill:#FFFFFF;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st13{fill:#CEE1E7;}
.st14{fill:#EDE6E4;}
.st15{fill:#FDE3EC;}
.st16{fill:#FDEDE0;}
.st17{fill:#C7E1E0;}
.st18{fill:#EFCBBF;}
.st19{fill:#23285C;}
.st20{fill:#010101;}
.st21{fill:#C6E0F5;}
.st22{fill:#DDD6CC;}
.st23{fill:#E0E0E0;}
.st24{fill:#F3F3F3;}
</style>
<g id="Layer_3">
</g>
<g id="_x3C_Layer_x3E_">
<g>
<ellipse transform="matrix(0.7071 -0.7071 0.7071 0.7071 -71.4658 172.5338)" class="st11" cx="172.53" cy="172.53" rx="172.53" ry="172.53"/>
<path d="M172.53,345.07c59.82,0,112.52-30.46,143.47-76.7c-23.7-17.16-26.94-79.1-21.26-112.4c5.97-35.09-13.63-67.23-58.02-88.62
C192.38,45.97,213.67,93.9,135.1,55.46c-78.55-38.43-91.28,85.4-67.02,130.73c31.38,58.61,11.11,101.68-2.89,121.37
C94.66,331.02,131.94,345.07,172.53,345.07z"/>
<path class="st2" d="M254.3,251.43c-45.52-13.8-161.62,17.32-210.71,35.69c31.6,35.54,77.64,57.94,128.94,57.94
c51.26,0,97.27-22.37,128.87-57.86C293.73,274.06,279.73,259.14,254.3,251.43z"/>
<g>
<path d="M301.41,289.34c-0.73,0-1.45-0.38-1.85-1.06c-9.84-16.85-25.28-28.56-45.87-34.81c-24.78-7.51-69.67-0.97-102.97,5.83
c-43.42,8.88-84.44,21.61-106.37,29.81c-1.1,0.42-2.34-0.15-2.75-1.25c-0.41-1.11,0.15-2.34,1.25-2.75
c51.5-19.27,166.57-49.53,212.08-35.73c21.36,6.47,38.07,19.18,48.32,36.74c0.59,1.02,0.25,2.33-0.77,2.92
C302.14,289.25,301.77,289.34,301.41,289.34z"/>
</g>
<g>
<g>
<path class="st2" d="M188.88,250.67c-0.35-3.78-0.65-7.19-0.66-9.99c-0.42-62.12-25.88-119.93-44.53-41.94
c-0.4,1.68-0.51,3.42-0.35,5.13c0.88,9.59,2.57,44.43-17.38,58.76c-9.02,2.16-17.89,4.45-26.43,6.79
c14.65,14.24,34.66,23.02,56.73,23.02c31.65,0,59.06-18.05,72.5-44.38C216.87,247.82,203.3,248.8,188.88,250.67z"/>
<path d="M156.26,294.59c-21.86,0-42.54-8.39-58.22-23.63c-0.55-0.53-0.77-1.32-0.58-2.07c0.19-0.74,0.76-1.33,1.5-1.53
c8.76-2.4,17.53-4.66,26.08-6.71c18.56-13.74,17.08-46.75,16.17-56.58c-0.18-1.99-0.05-3.95,0.4-5.83
c6.47-27.06,14.34-40.28,23.45-39.21c11.91,1.36,24.96,32.96,25.29,81.63c0.02,2.21,0.21,4.83,0.45,7.6
c14.36-1.78,27.16-2.57,37.99-2.35c0.74,0.02,1.41,0.41,1.79,1.04c0.38,0.63,0.4,1.41,0.07,2.07
C216.32,277.13,187.81,294.59,156.26,294.59z M103.81,270.48c14.5,12.82,32.98,19.83,52.45,19.83
c28.77,0,54.88-15.3,68.94-40.15c-0.04,0-0.07,0-0.11,0c-10.41,0-22.48,0.88-35.93,2.63c-0.57,0.08-1.16-0.09-1.61-0.45
c-0.45-0.36-0.74-0.89-0.79-1.47c-0.34-3.67-0.65-7.21-0.67-10.17c-0.28-42.25-11.79-76.31-21.5-77.42
c-3-0.32-10.81,2.48-18.81,35.96c-0.34,1.42-0.44,2.92-0.3,4.44c0.96,10.47,2.49,45.78-18.27,60.69
c-0.23,0.16-0.48,0.28-0.75,0.34C119.03,266.49,111.43,268.43,103.81,270.48z"/>
</g>
<g>
<path class="st3" d="M144.93,220.77c8.81,0.22,17.36-0.06,25.53-0.82c-9.12,6.44-19,11.98-29.53,16.39
c1.29-1.82,2.27-3.75,2.86-5.84C144.73,227.17,145.02,223.91,144.93,220.77z"/>
<g>
<path class="st2" d="M230.68,159.98c-0.66-0.86-1.53-1.3-2.6-1.38c-7.1-2.75-16.03,1.44-20.52,9.93
c-0.2,0.37-0.36,0.74-0.53,1.11c-4.96,0.29-6.76-6.05-6.56-17.76c0.28-17.1,17.12-20.03-15.86-22.67
c-32.98-2.64-44.12-15.3-29.95-39.85c0,0-99.96,134.2,1.45,131.74c41.02-1,45.7-17.74,51.05-29.09
c0.54-1.15,1.16-1.96,1.83-2.54c0.9,0.93,1.92,1.74,3.09,2.36c7.28,3.86,17.06-0.32,21.84-9.33
C238.41,174.04,236.9,164.33,230.68,159.98z"/>
<path d="M153.44,223.27c-21.01,0-34.83-6.13-41.09-18.25c-7.99-15.44-3.51-39.89,13.29-72.67
c12.35-24.09,27.17-44.07,27.32-44.27c0.67-0.91,1.94-1.13,2.89-0.51c0.95,0.62,1.24,1.87,0.68,2.85
c-5.79,10.03-7.2,18-4.2,23.72c3.76,7.16,14.69,11.52,32.47,12.94c15.03,1.21,19.89,2.42,21.7,5.43
c1.43,2.38,0.33,4.93-0.95,7.89c-1.27,2.93-2.84,6.58-2.92,11.52c-0.17,10.19,1.29,13.78,2.55,14.98
c0.19,0.19,0.4,0.33,0.62,0.43c4.97-9.18,14.69-13.78,22.8-10.83c1.43,0.18,2.65,0.84,3.57,1.91
c6.99,5.11,8.57,15.84,3.66,25.1c-2.54,4.79-6.46,8.5-11.03,10.46c-4.73,2.02-9.59,1.94-13.7-0.24
c-0.63-0.33-1.24-0.72-1.82-1.16c-0.06,0.11-0.12,0.23-0.17,0.35c-0.35,0.75-0.71,1.53-1.06,2.32
c-5.18,11.41-12.26,27.04-51.87,28C155.24,223.26,154.33,223.27,153.44,223.27z M146.68,104.79
c-15.67,24.14-43.56,73.09-30.54,98.27c5.72,11.06,19.2,16.38,39.92,15.9c36.93-0.9,43.11-14.54,48.09-25.49
c0.37-0.81,0.73-1.6,1.09-2.37c0.64-1.36,1.42-2.43,2.38-3.25c0.86-0.73,2.15-0.67,2.93,0.14c0.78,0.82,1.64,1.47,2.55,1.96
c2.94,1.56,6.5,1.59,10.02,0.08c3.68-1.57,6.85-4.6,8.93-8.53c3.9-7.35,2.76-16.03-2.58-19.77c-0.18-0.13-0.34-0.28-0.47-0.45
c-0.27-0.36-0.58-0.52-1.06-0.55c-0.21-0.02-0.42-0.06-0.61-0.14c-6.1-2.37-13.96,1.56-17.86,8.94
c-0.14,0.27-0.27,0.56-0.4,0.84c-0.33,0.72-1.1,1.36-1.89,1.41c-1.9,0.11-3.62-0.51-4.95-1.79c-2.84-2.73-4.03-8.32-3.87-18.14
c0.1-5.78,1.93-10.03,3.27-13.14c0.67-1.56,1.51-3.5,1.21-4c-1.2-1.99-14.13-3.03-18.38-3.37
c-19.61-1.57-31.36-6.55-35.91-15.21C146.8,112.83,146.18,109.04,146.68,104.79z"/>
</g>
</g>
<g>
<path d="M185.24,160.2c-0.78,0-1.53-0.43-1.91-1.17c-0.01-0.01-1.69-3.09-6.75-5.48c-6.09-2.88-9.65,1.35-10.03,1.85
c-0.73,0.93-2.06,1.09-2.99,0.38c-0.93-0.72-1.11-2.04-0.4-2.98c2-2.63,7.76-6.66,15.26-3.11c6.48,3.07,8.65,7.24,8.73,7.42
c0.53,1.05,0.11,2.34-0.95,2.87C185.89,160.13,185.56,160.2,185.24,160.2z"/>
</g>
<path d="M176.84,156.99c-0.22,3.49-2.43,6.2-4.94,6.04c-2.51-0.16-4.38-3.11-4.16-6.61c0.22-3.49,2.43-6.2,4.94-6.04
C175.2,150.54,177.06,153.5,176.84,156.99z"/>
<g>
<path d="M149.3,153.09c-0.78,0-1.53-0.43-1.91-1.17c-0.01-0.01-1.69-3.08-6.75-5.48c-6.08-2.88-9.65,1.35-10.03,1.85
c-0.72,0.93-2.06,1.1-2.99,0.38c-0.93-0.72-1.11-2.04-0.4-2.98c2-2.63,7.75-6.66,15.26-3.11c6.48,3.07,8.65,7.24,8.73,7.42
c0.53,1.05,0.11,2.34-0.95,2.87C149.95,153.01,149.62,153.09,149.3,153.09z"/>
</g>
<path d="M139.25,150.32c-0.22,3.49-2.43,6.2-4.94,6.04c-2.51-0.16-4.38-3.11-4.16-6.61c0.22-3.49,2.43-6.2,4.95-6.04
C137.6,143.87,139.47,146.83,139.25,150.32z"/>
<g>
<path d="M157.2,203.55c-5.2,0-10.61-4.93-12.87-8.15c-0.68-0.97-0.45-2.3,0.52-2.98c0.97-0.68,2.3-0.45,2.98,0.52
c1.86,2.64,6.2,6.33,9.37,6.33c0.08,0,0.16,0,0.24-0.01c2.49-0.15,6.13-4.52,7.5-6.61c0.65-0.99,1.98-1.26,2.96-0.61
c0.99,0.65,1.26,1.97,0.61,2.96c-0.55,0.84-5.54,8.21-10.81,8.53C157.53,203.55,157.36,203.55,157.2,203.55z"/>
</g>
<g>
<path class="st6" d="M176.57,182.2c-1.09,0-2.2-0.08-3.31-0.25c-5.86-0.88-11.03-3.99-14.55-8.75
c-3.52-4.76-4.97-10.62-4.1-16.48c1.82-12.1,13.15-20.46,25.23-18.64l0,0c12.1,1.82,20.46,13.13,18.65,25.23
C196.84,174.29,187.35,182.2,176.57,182.2z M176.54,142.1c-8.71,0-16.37,6.38-17.7,15.25c-0.71,4.73,0.46,9.45,3.31,13.3
c2.84,3.85,7.02,6.36,11.75,7.07c4.73,0.71,9.46-0.46,13.3-3.31c3.85-2.84,6.36-7.01,7.07-11.74
c1.46-9.77-5.29-18.9-15.05-20.37l0,0C178.31,142.16,177.42,142.1,176.54,142.1z"/>
</g>
<g>
<path class="st6" d="M126.05,169.74c-1.75,0-3.53-0.21-5.31-0.65c-5.75-1.42-10.61-4.99-13.67-10.07
c-3.06-5.07-3.97-11.03-2.55-16.79c1.42-5.75,4.99-10.61,10.07-13.67c5.07-3.06,11.04-3.97,16.79-2.55
c11.88,2.93,19.15,14.98,16.22,26.85C145.1,162.96,136.01,169.73,126.05,169.74z M126.02,129.63c-3.23,0-6.4,0.88-9.23,2.59
c-4.1,2.47-6.98,6.39-8.13,11.04l0,0c-1.15,4.64-0.42,9.46,2.06,13.55c2.47,4.09,6.39,6.98,11.04,8.13
c9.58,2.37,19.31-3.51,21.68-13.1c2.37-9.59-3.51-19.31-13.1-21.68C128.91,129.81,127.46,129.63,126.02,129.63z M106.59,142.75
h0.02H106.59z"/>
</g>
<g>
<path d="M140.59,179.69c-0.34,0-0.69-0.08-1.01-0.25c-0.8-0.43-7.84-4.35-8.16-9.68c-0.11-1.74,0.48-4.32,3.85-6.69
c8.09-5.69,14.49-15.23,14.55-15.33c0.65-0.98,1.98-1.25,2.96-0.6c0.98,0.65,1.25,1.98,0.6,2.96
c-0.28,0.42-6.91,10.31-15.65,16.46c-1.41,0.99-2.1,1.98-2.04,2.93c0.14,2.33,4.05,5.17,5.92,6.18
c1.04,0.56,1.43,1.85,0.87,2.89C142.09,179.28,141.35,179.69,140.59,179.69z"/>
</g>
<g>
<path class="st6" d="M157.36,157.39c-0.23,0-0.47-0.04-0.7-0.12l-12.76-4.41c-1.11-0.39-1.71-1.6-1.32-2.72
c0.39-1.12,1.6-1.7,2.72-1.32l12.76,4.41c1.11,0.39,1.71,1.6,1.32,2.72C159.07,156.83,158.24,157.39,157.36,157.39z"/>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

Some files were not shown because too many files have changed in this diff Show more