foo666 commited on
Commit
7c14be7
1 Parent(s): 430d9ee

init of cloudflare kv

Browse files
Files changed (6) hide show
  1. .gitignore +2 -0
  2. app.py +132 -51
  3. bg.jpg +0 -0
  4. pdm.lock +272 -1
  5. project.drawio +199 -0
  6. pyproject.toml +3 -0
.gitignore CHANGED
@@ -160,3 +160,5 @@ cython_debug/
160
  # and can be added to the global gitignore or merged into this file. For a more nuclear
161
  # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162
  #.idea/
 
 
 
160
  # and can be added to the global gitignore or merged into this file. For a more nuclear
161
  # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162
  #.idea/
163
+ demo.py
164
+ .vscode/settings.json
app.py CHANGED
@@ -1,81 +1,162 @@
1
  import gradio as gr
2
  import pandas as pd
3
  from datetime import datetime
 
 
 
 
 
 
 
 
4
 
5
 
6
- def load_msg(fp='prompts.csv'):
7
- return pd.read_csv(fp, delimiter='|').sort_values(by='时间(UTC)', ascending=False)
8
 
9
- def write_msg(msg='', fp='prompts.csv'):
10
- with open(fp, 'a') as fw:
11
- if msg:
12
- fw.write(msg.lstrip().rstrip() + '\n')
13
- return True
14
 
15
- def does_record_exist(wallet, msg):
16
- df_msg = load_msg()
17
- existent = df_msg.query("钱包 == @wallet & 寄语 == @msg")
18
- if existent.empty:
19
- return False
20
- return True
21
 
22
- def are_records_lt_6(wallet, msg):
23
- df_msg = load_msg()
24
- existent = df_msg.query("钱包==@wallet")
25
- if len(existent) > 6:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  return True
27
- return False
28
-
29
- def handle_input(wallet, msg):
30
- msg = msg.lstrip().rstrip().replace('|', '')
31
- msg = msg[:200] # read the first 200bytes ONLY
32
- if not msg:
33
- gr.Warning('说点什么吧')
34
- df_msg = load_msg()
35
- return df_msg
36
-
37
- import re
38
- re_wallet = re.compile(r'[\da-z]{62}', re.IGNORECASE)
39
- if not re_wallet.search(wallet):
40
- gr.Warning('看起来不是一个63位钱包地址,请重新输入')
41
- return load_msg()
42
-
43
- if does_record_exist(wallet, msg):
44
- gr.Info('看起来您登记过一模一样的寄语!')
45
- return
46
 
47
- if are_records_lt_6(wallet, msg):
48
- gr.Info('看起来您已登记过六条寄语了,把机会留给其他群众吧')
49
- return
 
 
 
 
 
 
50
 
51
- ts = datetime.utcnow().__str__()
52
- if write_msg('|'.join((wallet, msg, ts))):
53
- gr.Info('已记录您的寄语, 预祝龙年大吉!')
54
- return load_msg()
 
 
 
 
 
 
 
 
 
55
 
56
- with gr.Blocks(title='龙年吉祥') as demo:
57
  header = gr.Markdown('# 龙年消灾')
58
  sub_header = gr.Markdown('''### 龙年佳节之际,举行一次送灾活动。将gb2312的灾字打入黑洞地址,寓意消灾。留下你的钱包地址、写下寄语吧。所有信息汇总取sha256值后,会随UTXO信息寄送到黑洞地址。愿您龙年少灾多福!''')
59
  footer = gr.Markdown('''
60
- > Note:
61
  > 1. **务必** 不要贴钱包私钥地址或者助记词
62
- > 2. 寄语和地址信息 **公开可见**
63
  > 3. 截断读取前200个字
64
  > 4. 本活动属于公益性质,不对提交者钱包地址设限且免费
65
- > 5. 为减少不必要的澄清,提交时不需要签名,输入自己的钱包地址即可
 
 
 
66
  ''')
67
- df_msg = load_msg()
 
68
  with gr.Column():
69
  wallet = gr.Textbox(max_lines=1, label='钱包地址', placeholder='务必不要输入私钥或助记词')
70
  msg = gr.TextArea(label='写点什么吧', placeholder='少于200个字')
71
  submit = gr.Button('点一下, 少灾多福!', elem_id='submit', elem_classes='button')
72
- df = gr.Dataframe(df_msg)
73
 
74
- submit.click(handle_input, inputs=[wallet,msg], outputs=df)
75
 
76
  # demo = gr.Interface(handle_input, inputs=[wallet, msg], outputs=df)
77
 
78
 
79
  if __name__ == '__main__':
80
  demo.queue(max_size=5)
81
- demo.launch(share=True)
 
1
  import gradio as gr
2
  import pandas as pd
3
  from datetime import datetime
4
+ from cfkv import KVStore
5
+ from dotenv import load_dotenv
6
+ import os
7
+ from os.path import join, dirname
8
+ import json
9
+ import re
10
+ import json
11
+ re_wallet = re.compile(r'[\da-z]{62}', re.IGNORECASE)
12
 
13
 
14
+ dotenv_path = join(dirname(__file__), '.env')
15
+ load_dotenv(dotenv_path)
16
 
17
+ store = KVStore(namespace_id=os.environ.get("CFKV_NAMESPACE_ID"),
18
+ account_id=os.environ.get("CFKV_ACCOUNT_ID"),
19
+ api_key=os.environ.get("CFKV_API_KEY"))
 
 
20
 
 
 
 
 
 
 
21
 
22
+
23
+ def get_cfkv_messages(wallet):
24
+ '''
25
+ cloudflare kv structure:
26
+ key = wallet
27
+ value = messages
28
+ messages = [{message}...]
29
+ message = {"ts": datetime str, "message" str}
30
+
31
+ return value (messages)
32
+ '''
33
+ # get the existing msg
34
+
35
+ if the_existing:=store.get(wallet):
36
+ the_existing = json.loads(the_existing)
37
+ # return pd.DataFrame(the_existing, coumns=["时间(UTC)", "寄语"])
38
+ return the_existing
39
+
40
+
41
+
42
+ def handler_records_exist():
43
+ '''the record already exist'''
44
+ def decorator(func):
45
+ def wrapper(wallet, msg, the_existing, *args, **kwargs):
46
+ if the_existing:
47
+ messages = [item['message'] for item in the_existing]
48
+ if msg in messages:
49
+ gr.Info('这条寄语已经存在了')
50
+ return
51
+ return func(wallet, msg, the_existing)
52
+ return wrapper
53
+ return decorator
54
+
55
+ def handler_records_lt_6():
56
+ def decorator(func):
57
+ def wrapper(wallet, msg, the_existing, *args, **kwargs):
58
+ if the_existing:
59
+ messages = [item['message'] for item in the_existing]
60
+ if len(messages) >= 6:
61
+ gr.Info('看起来您已登记过六条寄语了,把机会留给其他群众吧')
62
+ return
63
+ return func(wallet, msg, the_existing)
64
+ return wrapper
65
+ return decorator
66
+
67
+ def handler_clean_msg():
68
+ def decorator(func):
69
+ def wrapper(wallet, msg, the_existing, *args, **kwargs):
70
+ msg = msg.lstrip().rstrip().replace('|', '')
71
+
72
+ if not msg:
73
+ gr.Warning('说点什么吧')
74
+ return
75
+ msg = msg[:200] # read the first 200bytes ONLY
76
+ return func(wallet, msg, the_existing)
77
+ return wrapper
78
+ return decorator
79
+
80
+
81
+ def handler_validate_wallet():
82
+ def decorator(func):
83
+ def wrapper(wallet, msg, the_existing, *args, **kwargs):
84
+ if not re_wallet.search(wallet):
85
+ gr.Warning('看起来不是一个63位钱包地址,请重新输入')
86
+ return
87
+ return func(wallet, msg, the_existing)
88
+ return wrapper
89
+ return decorator
90
+
91
+ @handler_validate_wallet()
92
+ @handler_clean_msg()
93
+ @handler_records_exist()
94
+ @handler_records_lt_6()
95
+ def write_msg(wallet, msg, the_existing):
96
+ # get the existing msg
97
+ message = dict(ts = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'),
98
+ message = msg)
99
+ if the_existing := get_cfkv_messages(wallet):
100
+ the_existing.append(message)
101
+ messages = the_existing
102
+ else:
103
+ messages = [message]
104
+
105
+ if store.set(wallet, json.dumps(messages)):
106
+ gr.Info('已记录您的寄语, 预祝龙年大吉!')
107
  return True
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
+
110
+ def fn(wallet, msg):
111
+ the_existing = get_cfkv_messages(wallet)
112
+ # the_existing_msg = json.dumps(the_existing, indent=2)
113
+
114
+ try:
115
+ write_msg(wallet, msg, the_existing)
116
+ except Exception as e:
117
+ return f"```markdown\r\n{e}\r\n```"
118
 
119
+ # update the the_existing, not query cfkv to save query times
120
+
121
+ the_existing = get_cfkv_messages(wallet)
122
+ return f"```markdown\r\n{json.dumps(the_existing, ensure_ascii=False, indent=2)}\r\n```"
123
+
124
+ css = """
125
+ .gradio_container {
126
+ background: url('file=bg.png');
127
+ background-position: center; /* Center the image */
128
+ background-repeat: no-repeat; /* Do not repeat the image */
129
+ background-size: cover; /* Resize the background image to cover the entire container */
130
+ }
131
+ """
132
 
133
+ with gr.Blocks(title='龙年吉祥', css=".gradio-container {background: url('https://huggingface.co/spaces/foobar999/bestwishgb2312/blob/main/bg.png)}") as demo:
134
  header = gr.Markdown('# 龙年消灾')
135
  sub_header = gr.Markdown('''### 龙年佳节之际,举行一次送灾活动。将gb2312的灾字打入黑洞地址,寓意消灾。留下你的钱包地址、写下寄语吧。所有信息汇总取sha256值后,会随UTXO信息寄送到黑洞地址。愿您龙年少灾多福!''')
136
  footer = gr.Markdown('''
137
+ > **Note:**
138
  > 1. **务必** 不要贴钱包私钥地址或者助记词
139
+ > 2. 地址信息 **公开可见**,寄语信息打入黑洞前仅自己钱包可见,打入黑洞后销毁写入hash值所有人不可见
140
  > 3. 截断读取前200个字
141
  > 4. 本活动属于公益性质,不对提交者钱包地址设限且免费
142
+ > 5. 提交无需任何授权和签名,输入自己的钱包地址即可
143
+
144
+ > **免责和法律声明: **
145
+ > 本活动不对任何提交者的钱包地址、资产丢失和寄语信息等任何负面影响负责,提交即视为同意本条款,请遵守当地、本国法律法规,如有违反,后果自负。
146
  ''')
147
+
148
+ # df_msg = load_msg()
149
  with gr.Column():
150
  wallet = gr.Textbox(max_lines=1, label='钱包地址', placeholder='务必不要输入私钥或助记词')
151
  msg = gr.TextArea(label='写点什么吧', placeholder='少于200个字')
152
  submit = gr.Button('点一下, 少灾多福!', elem_id='submit', elem_classes='button')
153
+ # df = gr.Dataframe()
154
 
155
+ submit.click(fn, inputs=[wallet,msg], outputs=gr.Markdown())
156
 
157
  # demo = gr.Interface(handle_input, inputs=[wallet, msg], outputs=df)
158
 
159
 
160
  if __name__ == '__main__':
161
  demo.queue(max_size=5)
162
+ demo.launch()
bg.jpg ADDED
pdm.lock CHANGED
@@ -5,7 +5,7 @@
5
  groups = ["default"]
6
  strategy = ["cross_platform"]
7
  lock_version = "4.4"
8
- content_hash = "sha256:a7a11b7b0f24746ebd08778099d95912c654a60b14c4cdfaf6e85483573acc1b"
9
 
10
  [[package]]
11
  name = "aiofiles"
@@ -17,6 +17,81 @@ files = [
17
  {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"},
18
  ]
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  [[package]]
21
  name = "altair"
22
  version = "5.2.0"
@@ -62,6 +137,16 @@ files = [
62
  {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"},
63
  ]
64
 
 
 
 
 
 
 
 
 
 
 
65
  [[package]]
66
  name = "attrs"
67
  version = "23.2.0"
@@ -82,6 +167,14 @@ files = [
82
  {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"},
83
  ]
84
 
 
 
 
 
 
 
 
 
85
  [[package]]
86
  name = "charset-normalizer"
87
  version = "3.3.2"
@@ -292,6 +385,61 @@ files = [
292
  {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"},
293
  ]
294
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295
  [[package]]
296
  name = "fsspec"
297
  version = "2023.12.2"
@@ -652,6 +800,45 @@ files = [
652
  {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
653
  ]
654
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
655
  [[package]]
656
  name = "numpy"
657
  version = "1.26.3"
@@ -966,6 +1153,16 @@ files = [
966
  {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
967
  ]
968
 
 
 
 
 
 
 
 
 
 
 
969
  [[package]]
970
  name = "python-multipart"
971
  version = "0.0.6"
@@ -1375,3 +1572,77 @@ files = [
1375
  {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"},
1376
  {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
1377
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  groups = ["default"]
6
  strategy = ["cross_platform"]
7
  lock_version = "4.4"
8
+ content_hash = "sha256:ada6d1697c526fcfb95d924f78359bc4469c63027875b0c8392f40fe65bad100"
9
 
10
  [[package]]
11
  name = "aiofiles"
 
17
  {file = "aiofiles-23.2.1.tar.gz", hash = "sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a"},
18
  ]
19
 
20
+ [[package]]
21
+ name = "aiohttp"
22
+ version = "3.9.1"
23
+ requires_python = ">=3.8"
24
+ summary = "Async http client/server framework (asyncio)"
25
+ dependencies = [
26
+ "aiosignal>=1.1.2",
27
+ "async-timeout<5.0,>=4.0; python_version < \"3.11\"",
28
+ "attrs>=17.3.0",
29
+ "frozenlist>=1.1.1",
30
+ "multidict<7.0,>=4.5",
31
+ "yarl<2.0,>=1.0",
32
+ ]
33
+ files = [
34
+ {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590"},
35
+ {file = "aiohttp-3.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0"},
36
+ {file = "aiohttp-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83"},
37
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5"},
38
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4"},
39
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f"},
40
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f"},
41
+ {file = "aiohttp-3.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6"},
42
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f"},
43
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26"},
44
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4"},
45
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d"},
46
+ {file = "aiohttp-3.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501"},
47
+ {file = "aiohttp-3.9.1-cp310-cp310-win32.whl", hash = "sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489"},
48
+ {file = "aiohttp-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23"},
49
+ {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d"},
50
+ {file = "aiohttp-3.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e"},
51
+ {file = "aiohttp-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0"},
52
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35"},
53
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff"},
54
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87"},
55
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d"},
56
+ {file = "aiohttp-3.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01"},
57
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3"},
58
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449"},
59
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2"},
60
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd"},
61
+ {file = "aiohttp-3.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a"},
62
+ {file = "aiohttp-3.9.1-cp311-cp311-win32.whl", hash = "sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544"},
63
+ {file = "aiohttp-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587"},
64
+ {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065"},
65
+ {file = "aiohttp-3.9.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821"},
66
+ {file = "aiohttp-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af"},
67
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57"},
68
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5"},
69
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb"},
70
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c"},
71
+ {file = "aiohttp-3.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66"},
72
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe"},
73
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183"},
74
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b"},
75
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f"},
76
+ {file = "aiohttp-3.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f"},
77
+ {file = "aiohttp-3.9.1-cp312-cp312-win32.whl", hash = "sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed"},
78
+ {file = "aiohttp-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213"},
79
+ {file = "aiohttp-3.9.1.tar.gz", hash = "sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d"},
80
+ ]
81
+
82
+ [[package]]
83
+ name = "aiosignal"
84
+ version = "1.3.1"
85
+ requires_python = ">=3.7"
86
+ summary = "aiosignal: a list of registered asynchronous callbacks"
87
+ dependencies = [
88
+ "frozenlist>=1.1.0",
89
+ ]
90
+ files = [
91
+ {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"},
92
+ {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"},
93
+ ]
94
+
95
  [[package]]
96
  name = "altair"
97
  version = "5.2.0"
 
137
  {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"},
138
  ]
139
 
140
+ [[package]]
141
+ name = "async-timeout"
142
+ version = "4.0.3"
143
+ requires_python = ">=3.7"
144
+ summary = "Timeout context manager for asyncio programs"
145
+ files = [
146
+ {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"},
147
+ {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"},
148
+ ]
149
+
150
  [[package]]
151
  name = "attrs"
152
  version = "23.2.0"
 
167
  {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"},
168
  ]
169
 
170
+ [[package]]
171
+ name = "cfkv"
172
+ version = "1.1.2"
173
+ summary = "A Python wrapper for the Cloudflare KV Store API"
174
+ files = [
175
+ {file = "cfkv-1.1.2.tar.gz", hash = "sha256:bc53f40c0b74aaebf07a07ed49ea467477bfc772c92dabc794a159be71731e0a"},
176
+ ]
177
+
178
  [[package]]
179
  name = "charset-normalizer"
180
  version = "3.3.2"
 
385
  {file = "fonttools-4.47.2.tar.gz", hash = "sha256:7df26dd3650e98ca45f1e29883c96a0b9f5bb6af8d632a6a108bc744fa0bd9b3"},
386
  ]
387
 
388
+ [[package]]
389
+ name = "frozenlist"
390
+ version = "1.4.1"
391
+ requires_python = ">=3.8"
392
+ summary = "A list-like structure which implements collections.abc.MutableSequence"
393
+ files = [
394
+ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"},
395
+ {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"},
396
+ {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"},
397
+ {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"},
398
+ {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"},
399
+ {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"},
400
+ {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"},
401
+ {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"},
402
+ {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"},
403
+ {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"},
404
+ {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"},
405
+ {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"},
406
+ {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"},
407
+ {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"},
408
+ {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"},
409
+ {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"},
410
+ {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"},
411
+ {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"},
412
+ {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"},
413
+ {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"},
414
+ {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"},
415
+ {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"},
416
+ {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"},
417
+ {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"},
418
+ {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"},
419
+ {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"},
420
+ {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"},
421
+ {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"},
422
+ {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"},
423
+ {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"},
424
+ {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"},
425
+ {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"},
426
+ {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"},
427
+ {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"},
428
+ {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"},
429
+ {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"},
430
+ {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"},
431
+ {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"},
432
+ {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"},
433
+ {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"},
434
+ {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"},
435
+ {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"},
436
+ {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"},
437
+ {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"},
438
+ {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"},
439
+ {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"},
440
+ {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"},
441
+ ]
442
+
443
  [[package]]
444
  name = "fsspec"
445
  version = "2023.12.2"
 
800
  {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"},
801
  ]
802
 
803
+ [[package]]
804
+ name = "multidict"
805
+ version = "6.0.4"
806
+ requires_python = ">=3.7"
807
+ summary = "multidict implementation"
808
+ files = [
809
+ {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"},
810
+ {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"},
811
+ {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"},
812
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"},
813
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"},
814
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"},
815
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"},
816
+ {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"},
817
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"},
818
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"},
819
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"},
820
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"},
821
+ {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"},
822
+ {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"},
823
+ {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"},
824
+ {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"},
825
+ {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"},
826
+ {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"},
827
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"},
828
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"},
829
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"},
830
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"},
831
+ {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"},
832
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"},
833
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"},
834
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"},
835
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"},
836
+ {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"},
837
+ {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"},
838
+ {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"},
839
+ {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"},
840
+ ]
841
+
842
  [[package]]
843
  name = "numpy"
844
  version = "1.26.3"
 
1153
  {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"},
1154
  ]
1155
 
1156
+ [[package]]
1157
+ name = "python-dotenv"
1158
+ version = "1.0.1"
1159
+ requires_python = ">=3.8"
1160
+ summary = "Read key-value pairs from a .env file and set them as environment variables"
1161
+ files = [
1162
+ {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
1163
+ {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
1164
+ ]
1165
+
1166
  [[package]]
1167
  name = "python-multipart"
1168
  version = "0.0.6"
 
1572
  {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"},
1573
  {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"},
1574
  ]
1575
+
1576
+ [[package]]
1577
+ name = "workers-kv-py"
1578
+ version = "1.2.2"
1579
+ requires_python = ">=3.8"
1580
+ summary = "An api wrapper of Cloudflare Workers KV for Python"
1581
+ dependencies = [
1582
+ "aiohttp>=3.8.1",
1583
+ "requests>=2.25.1",
1584
+ ]
1585
+ files = [
1586
+ {file = "workers-kv.py-1.2.2.tar.gz", hash = "sha256:f2f4df0719ef77262066a5bfb93960ede11a2d390218adb7692b23209915de3d"},
1587
+ {file = "workers_kv.py-1.2.2-py2.py3-none-any.whl", hash = "sha256:e13a34c9d0d6960bb99083dc6b76a12a7876c5755dbd04b44b8456b23a3edbda"},
1588
+ {file = "workers_kv.py-1.2.2-py3-none-any.whl", hash = "sha256:e351e80e3c1afa9bb3d3fa9d194ef55fdb5bdc25e794771bc22d1081580a3fde"},
1589
+ ]
1590
+
1591
+ [[package]]
1592
+ name = "yarl"
1593
+ version = "1.9.4"
1594
+ requires_python = ">=3.7"
1595
+ summary = "Yet another URL library"
1596
+ dependencies = [
1597
+ "idna>=2.0",
1598
+ "multidict>=4.0",
1599
+ ]
1600
+ files = [
1601
+ {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"},
1602
+ {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"},
1603
+ {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"},
1604
+ {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"},
1605
+ {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"},
1606
+ {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"},
1607
+ {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"},
1608
+ {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"},
1609
+ {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"},
1610
+ {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"},
1611
+ {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"},
1612
+ {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"},
1613
+ {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"},
1614
+ {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"},
1615
+ {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"},
1616
+ {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"},
1617
+ {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"},
1618
+ {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"},
1619
+ {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"},
1620
+ {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"},
1621
+ {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"},
1622
+ {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"},
1623
+ {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"},
1624
+ {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"},
1625
+ {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"},
1626
+ {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"},
1627
+ {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"},
1628
+ {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"},
1629
+ {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"},
1630
+ {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"},
1631
+ {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"},
1632
+ {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"},
1633
+ {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"},
1634
+ {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"},
1635
+ {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"},
1636
+ {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"},
1637
+ {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"},
1638
+ {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"},
1639
+ {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"},
1640
+ {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"},
1641
+ {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"},
1642
+ {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"},
1643
+ {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"},
1644
+ {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"},
1645
+ {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"},
1646
+ {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"},
1647
+ {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"},
1648
+ ]
project.drawio ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <mxfile host="65bd71144e">
2
+ <diagram id="7aHxPFRqXuhLCqDjbLiV" name="Page-1">
3
+ <mxGraphModel dx="1737" dy="620" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
4
+ <root>
5
+ <mxCell id="0"/>
6
+ <mxCell id="1" parent="0"/>
7
+ <mxCell id="18" value="Some Notes" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
8
+ <mxGeometry x="-610" y="140" width="490" height="70" as="geometry"/>
9
+ </mxCell>
10
+ <mxCell id="19" value="Some notes" style="html=1;shadow=0;dashed=0;shape=mxgraph.bootstrap.rrect;rSize=5;html=1;strokeColor=#C8C8C8;fillColor=#ffffff;whiteSpace=wrap;verticalAlign=top;align=left;fontSize=18;spacing=15;spacingTop=-5;rounded=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
11
+ <mxGeometry x="-640" y="70" width="550" height="590" as="geometry"/>
12
+ </mxCell>
13
+ <mxCell id="20" value="" style="shape=line;strokeColor=#dddddd;resizeWidth=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
14
+ <mxGeometry width="550" height="10" relative="1" as="geometry">
15
+ <mxPoint y="50" as="offset"/>
16
+ </mxGeometry>
17
+ </mxCell>
18
+ <mxCell id="21" value="" style="html=1;shadow=0;dashed=0;shape=mxgraph.bootstrap.x;strokeColor=#868686;strokeWidth=2;rounded=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
19
+ <mxGeometry x="1" width="8" height="8" relative="1" as="geometry">
20
+ <mxPoint x="-24" y="20" as="offset"/>
21
+ </mxGeometry>
22
+ </mxCell>
23
+ <mxCell id="22" value="Wallet" style="strokeColor=none;fillColor=none;resizeWidth=1;align=left;verticalAlign=top;spacing=10;fontSize=14;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
24
+ <mxGeometry width="550" height="40" relative="1" as="geometry">
25
+ <mxPoint y="60" as="offset"/>
26
+ </mxGeometry>
27
+ </mxCell>
28
+ <mxCell id="23" value="@mdo" style="html=1;shadow=0;dashed=0;shape=mxgraph.bootstrap.rrect;rSize=5;strokeColor=#CED4DA;fillColor=none;align=left;verticalAlign=middle;spacing=10;fontSize=14;whiteSpace=wrap;html=1;rounded=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
29
+ <mxGeometry width="530" height="40" relative="1" as="geometry">
30
+ <mxPoint x="10" y="100" as="offset"/>
31
+ </mxGeometry>
32
+ </mxCell>
33
+ <mxCell id="24" value="Message:" style="strokeColor=none;fillColor=none;resizeWidth=1;align=left;verticalAlign=top;spacing=10;fontSize=14;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
34
+ <mxGeometry width="550" height="40" relative="1" as="geometry">
35
+ <mxPoint y="160" as="offset"/>
36
+ </mxGeometry>
37
+ </mxCell>
38
+ <mxCell id="25" value="" style="html=1;shadow=0;dashed=0;shape=mxgraph.bootstrap.rrect;rSize=5;strokeColor=#CED4DA;fillColor=none;align=left;verticalAlign=middle;spacing=10;fontSize=14;whiteSpace=wrap;html=1;rounded=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
39
+ <mxGeometry width="530" height="110" relative="1" as="geometry">
40
+ <mxPoint x="10" y="200" as="offset"/>
41
+ </mxGeometry>
42
+ </mxCell>
43
+ <mxCell id="26" value="" style="shape=line;strokeColor=#dddddd;resizeWidth=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
44
+ <mxGeometry width="550" height="10" relative="1" as="geometry">
45
+ <mxPoint y="320" as="offset"/>
46
+ </mxGeometry>
47
+ </mxCell>
48
+ <mxCell id="27" value="点击送出祝福" style="html=1;shadow=0;dashed=0;shape=mxgraph.bootstrap.rrect;rSize=5;fillColor=#0085FC;strokeColor=none;fontColor=#FFFFFF;fontSize=14;rounded=0;labelBorderColor=none;sketch=0;" parent="19" vertex="1">
49
+ <mxGeometry x="1" y="1" width="199" height="39" relative="1" as="geometry">
50
+ <mxPoint x="-374" y="-250" as="offset"/>
51
+ </mxGeometry>
52
+ </mxCell>
53
+ <mxCell id="29" value="Assets" style="childLayout=tableLayout;recursiveResize=0;strokeColor=#98bf21;fillColor=#A7C942;shadow=1;rounded=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
54
+ <mxGeometry x="-610" y="480" width="480" height="160" as="geometry"/>
55
+ </mxCell>
56
+ <mxCell id="30" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;top=0;left=0;bottom=0;right=0;dropTarget=0;collapsible=0;recursiveResize=0;expand=0;fontStyle=0;strokeColor=inherit;fillColor=#ffffff;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="29" vertex="1">
57
+ <mxGeometry width="480" height="33" as="geometry"/>
58
+ </mxCell>
59
+ <mxCell id="31" value="wallet&lt;span style=&quot;white-space: pre;&quot;&gt;&#9;&lt;/span&gt;" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=#A7C942;align=center;fontStyle=1;fontColor=#FFFFFF;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="30" vertex="1">
60
+ <mxGeometry width="159" height="33" as="geometry">
61
+ <mxRectangle width="159" height="33" as="alternateBounds"/>
62
+ </mxGeometry>
63
+ </mxCell>
64
+ <mxCell id="32" value="Message" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=#A7C942;align=center;fontStyle=1;fontColor=#FFFFFF;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="30" vertex="1">
65
+ <mxGeometry x="159" width="162" height="33" as="geometry">
66
+ <mxRectangle width="162" height="33" as="alternateBounds"/>
67
+ </mxGeometry>
68
+ </mxCell>
69
+ <mxCell id="33" value="Datetime" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=#A7C942;align=center;fontStyle=1;fontColor=#FFFFFF;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="30" vertex="1">
70
+ <mxGeometry x="321" width="159" height="33" as="geometry">
71
+ <mxRectangle width="159" height="33" as="alternateBounds"/>
72
+ </mxGeometry>
73
+ </mxCell>
74
+ <mxCell id="34" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;top=0;left=0;bottom=0;right=0;dropTarget=0;collapsible=0;recursiveResize=0;expand=0;fontStyle=0;strokeColor=inherit;fillColor=#ffffff;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="29" vertex="1">
75
+ <mxGeometry y="33" width="480" height="32" as="geometry"/>
76
+ </mxCell>
77
+ <mxCell id="35" value="Value 1" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;align=center;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="34" vertex="1">
78
+ <mxGeometry width="159" height="32" as="geometry">
79
+ <mxRectangle width="159" height="32" as="alternateBounds"/>
80
+ </mxGeometry>
81
+ </mxCell>
82
+ <mxCell id="36" value="Value 2" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;align=center;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="34" vertex="1">
83
+ <mxGeometry x="159" width="162" height="32" as="geometry">
84
+ <mxRectangle width="162" height="32" as="alternateBounds"/>
85
+ </mxGeometry>
86
+ </mxCell>
87
+ <mxCell id="37" value="Value 3" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;align=center;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="34" vertex="1">
88
+ <mxGeometry x="321" width="159" height="32" as="geometry">
89
+ <mxRectangle width="159" height="32" as="alternateBounds"/>
90
+ </mxGeometry>
91
+ </mxCell>
92
+ <mxCell id="38" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;top=0;left=0;bottom=0;right=0;dropTarget=0;collapsible=0;recursiveResize=0;expand=0;fontStyle=1;strokeColor=inherit;fillColor=#EAF2D3;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="29" vertex="1">
93
+ <mxGeometry y="65" width="480" height="31" as="geometry"/>
94
+ </mxCell>
95
+ <mxCell id="39" value="Value 4" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="38" vertex="1">
96
+ <mxGeometry width="159" height="31" as="geometry">
97
+ <mxRectangle width="159" height="31" as="alternateBounds"/>
98
+ </mxGeometry>
99
+ </mxCell>
100
+ <mxCell id="40" value="Value 5" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="38" vertex="1">
101
+ <mxGeometry x="159" width="162" height="31" as="geometry">
102
+ <mxRectangle width="162" height="31" as="alternateBounds"/>
103
+ </mxGeometry>
104
+ </mxCell>
105
+ <mxCell id="41" value="Value 6" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="38" vertex="1">
106
+ <mxGeometry x="321" width="159" height="31" as="geometry">
107
+ <mxRectangle width="159" height="31" as="alternateBounds"/>
108
+ </mxGeometry>
109
+ </mxCell>
110
+ <mxCell id="42" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;top=0;left=0;bottom=0;right=0;dropTarget=0;collapsible=0;recursiveResize=0;expand=0;fontStyle=0;strokeColor=inherit;fillColor=#ffffff;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="29" vertex="1">
111
+ <mxGeometry y="96" width="480" height="33" as="geometry"/>
112
+ </mxCell>
113
+ <mxCell id="43" value="Value 7" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;fontStyle=0;align=center;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="42" vertex="1">
114
+ <mxGeometry width="159" height="33" as="geometry">
115
+ <mxRectangle width="159" height="33" as="alternateBounds"/>
116
+ </mxGeometry>
117
+ </mxCell>
118
+ <mxCell id="44" value="Value 8" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;fontStyle=0;align=center;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="42" vertex="1">
119
+ <mxGeometry x="159" width="162" height="33" as="geometry">
120
+ <mxRectangle width="162" height="33" as="alternateBounds"/>
121
+ </mxGeometry>
122
+ </mxCell>
123
+ <mxCell id="45" value="Value 9" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;fontStyle=0;align=center;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="42" vertex="1">
124
+ <mxGeometry x="321" width="159" height="33" as="geometry">
125
+ <mxRectangle width="159" height="33" as="alternateBounds"/>
126
+ </mxGeometry>
127
+ </mxCell>
128
+ <mxCell id="46" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;top=0;left=0;bottom=0;right=0;dropTarget=0;collapsible=0;recursiveResize=0;expand=0;fontStyle=1;strokeColor=inherit;fillColor=#EAF2D3;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="29" vertex="1">
129
+ <mxGeometry y="129" width="480" height="31" as="geometry"/>
130
+ </mxCell>
131
+ <mxCell id="47" value="Value 10" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="46" vertex="1">
132
+ <mxGeometry width="159" height="31" as="geometry">
133
+ <mxRectangle width="159" height="31" as="alternateBounds"/>
134
+ </mxGeometry>
135
+ </mxCell>
136
+ <mxCell id="48" value="Value 11" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="46" vertex="1">
137
+ <mxGeometry x="159" width="162" height="31" as="geometry">
138
+ <mxRectangle width="162" height="31" as="alternateBounds"/>
139
+ </mxGeometry>
140
+ </mxCell>
141
+ <mxCell id="49" value="Value 12" style="connectable=0;recursiveResize=0;strokeColor=inherit;fillColor=inherit;whiteSpace=wrap;html=1;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="46" vertex="1">
142
+ <mxGeometry x="321" width="159" height="31" as="geometry">
143
+ <mxRectangle width="159" height="31" as="alternateBounds"/>
144
+ </mxGeometry>
145
+ </mxCell>
146
+ <mxCell id="53" style="edgeStyle=none;html=1;entryX=0.998;entryY=0.475;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="50" target="51" edge="1">
147
+ <mxGeometry relative="1" as="geometry"/>
148
+ </mxCell>
149
+ <mxCell id="50" value="Actor" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
150
+ <mxGeometry x="-150" y="820" width="30" height="60" as="geometry"/>
151
+ </mxCell>
152
+ <mxCell id="54" style="edgeStyle=none;html=1;" parent="1" source="51" target="52" edge="1">
153
+ <mxGeometry relative="1" as="geometry"/>
154
+ </mxCell>
155
+ <mxCell id="51" value="" style="points=[];aspect=fixed;html=1;align=center;shadow=0;dashed=0;image;image=img/lib/allied_telesis/computer_and_terminals/Server_Desktop.svg;rounded=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
156
+ <mxGeometry x="-400" y="810" width="63.11" height="80" as="geometry"/>
157
+ </mxCell>
158
+ <mxCell id="52" value="" style="points=[];aspect=fixed;html=1;align=center;shadow=0;dashed=0;image;image=img/lib/allied_telesis/storage/Datacenter_Server_Storage_Unit_Large.svg;rounded=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
159
+ <mxGeometry x="-620" y="810" width="76.8" height="79.2" as="geometry"/>
160
+ </mxCell>
161
+ <mxCell id="55" value="User" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
162
+ <mxGeometry x="-170" y="770" width="60" height="30" as="geometry"/>
163
+ </mxCell>
164
+ <mxCell id="56" value="huggingface&lt;br&gt;gradio framework&lt;br&gt;open source&lt;br&gt;.env witth secret environment" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
165
+ <mxGeometry x="-480" y="770" width="220" height="30" as="geometry"/>
166
+ </mxCell>
167
+ <mxCell id="57" value="cloudflare KV storage" style="text;strokeColor=none;align=center;fillColor=none;html=1;verticalAlign=middle;whiteSpace=wrap;rounded=0;shadow=0;labelBorderColor=none;sketch=0;" parent="1" vertex="1">
168
+ <mxGeometry x="-640" y="770" width="60" height="30" as="geometry"/>
169
+ </mxCell>
170
+ <mxCell id="65" value="bestwishesgb2312" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;rounded=0;shadow=0;labelBorderColor=none;swimlaneFillColor=none;" parent="1" vertex="1">
171
+ <mxGeometry x="-770" y="890" width="140" height="78" as="geometry">
172
+ <mxRectangle x="290" y="320" width="140" height="30" as="alternateBounds"/>
173
+ </mxGeometry>
174
+ </mxCell>
175
+ <mxCell id="66" value="+ wallet: str,63" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;labelBorderColor=none;swimlaneFillColor=none;" parent="65" vertex="1">
176
+ <mxGeometry y="26" width="140" height="26" as="geometry"/>
177
+ </mxCell>
178
+ <mxCell id="67" value="+ messages: list of" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rounded=0;shadow=0;labelBorderColor=none;swimlaneFillColor=none;" parent="65" vertex="1">
179
+ <mxGeometry y="52" width="140" height="26" as="geometry"/>
180
+ </mxCell>
181
+ <mxCell id="68" style="edgeStyle=none;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="67" target="69" edge="1">
182
+ <mxGeometry relative="1" as="geometry">
183
+ <mxPoint x="-510" y="1138" as="targetPoint"/>
184
+ <mxPoint x="-510" y="1153" as="sourcePoint"/>
185
+ </mxGeometry>
186
+ </mxCell>
187
+ <mxCell id="69" value="message" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=none;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;" parent="1" vertex="1">
188
+ <mxGeometry x="-550" y="988" width="140" height="78" as="geometry"/>
189
+ </mxCell>
190
+ <mxCell id="70" value="+ ts: datetime.utcnow()" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="69" vertex="1">
191
+ <mxGeometry y="26" width="140" height="26" as="geometry"/>
192
+ </mxCell>
193
+ <mxCell id="71" value="+ message: str,200" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;" parent="69" vertex="1">
194
+ <mxGeometry y="52" width="140" height="26" as="geometry"/>
195
+ </mxCell>
196
+ </root>
197
+ </mxGraphModel>
198
+ </diagram>
199
+ </mxfile>
pyproject.toml CHANGED
@@ -8,6 +8,9 @@ authors = [
8
  dependencies = [
9
  "gradio>=4.15.0",
10
  "pandas>=2.2.0",
 
 
 
11
  ]
12
  requires-python = ">=3.10"
13
  readme = "README.md"
 
8
  dependencies = [
9
  "gradio>=4.15.0",
10
  "pandas>=2.2.0",
11
+ "workers-kv-py>=1.2.2",
12
+ "cfkv>=1.1.2",
13
+ "python-dotenv>=1.0.1",
14
  ]
15
  requires-python = ">=3.10"
16
  readme = "README.md"