Release -> Output Inspection, Session Management, General Bug Fixing and UI Improvements (#2104)
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"):
|
||||
|
|
|
|||
|
|
@ -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]:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
0
src/backend/base/langflow/base/vectorstores/__init__.py
Normal file
24
src/backend/base/langflow/base/vectorstores/utils.py
Normal 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
|
||||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
15
src/backend/base/langflow/components/experimental/Embed.py
Normal 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
|
||||
|
|
@ -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):
|
||||
|
|
|
|||
38
src/backend/base/langflow/components/experimental/Message.py
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.",
|
||||
},
|
||||
|
|
|
|||
24
src/backend/base/langflow/components/prompts/Prompt.py
Normal 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
|
||||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -163,3 +163,4 @@ class AstraDBVectorStoreComponent(CustomComponent):
|
|||
)
|
||||
|
||||
return vector_store
|
||||
return vector_store
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
42
src/backend/base/langflow/field_typing/prompt.py
Normal 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
|
||||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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}")
|
||||
|
|
|
|||
|
|
@ -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"]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
23
src/backend/base/langflow/helpers/folders.py
Normal 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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |
|
|
@ -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 |