gordonchan commited on
Commit
07353b2
·
verified ·
1 Parent(s): 567891a

Update crazy_functional.py

Browse files
Files changed (1) hide show
  1. crazy_functional.py +0 -434
crazy_functional.py CHANGED
@@ -3,7 +3,6 @@ from toolbox import trimmed_format_exc
3
 
4
 
5
  def get_crazy_functions():
6
- from crazy_functions.读文章写摘要 import 读文章写摘要
7
  from crazy_functions.生成函数注释 import 批量生成函数注释
8
  from crazy_functions.解析项目源代码 import 解析项目本身
9
  from crazy_functions.解析项目源代码 import 解析一个Python项目
@@ -14,37 +13,15 @@ def get_crazy_functions():
14
  from crazy_functions.解析项目源代码 import 解析一个Rust项目
15
  from crazy_functions.解析项目源代码 import 解析一个Java项目
16
  from crazy_functions.解析项目源代码 import 解析一个前端项目
17
- from crazy_functions.高级功能函数模板 import 高阶功能模板函数
18
- from crazy_functions.Latex全文润色 import Latex英文润色
19
- from crazy_functions.询问多个大语言模型 import 同时问询
20
  from crazy_functions.解析项目源代码 import 解析一个Lua项目
21
  from crazy_functions.解析项目源代码 import 解析一个CSharp项目
22
- from crazy_functions.总结word文档 import 总结word文档
23
  from crazy_functions.解析JupyterNotebook import 解析ipynb文件
24
  from crazy_functions.对话历史存档 import 对话历史存档
25
  from crazy_functions.对话历史存档 import 载入对话历史存档
26
  from crazy_functions.对话历史存档 import 删除所有本地对话历史记录
27
  from crazy_functions.辅助功能 import 清除缓存
28
- from crazy_functions.批量Markdown翻译 import Markdown英译中
29
- from crazy_functions.批量总结PDF文档 import 批量总结PDF文档
30
- from crazy_functions.批量翻译PDF文档_多线程 import 批量翻译PDF文档
31
- from crazy_functions.谷歌检索小助手 import 谷歌检索小助手
32
- from crazy_functions.理解PDF文档内容 import 理解PDF文档内容标准文件输入
33
- from crazy_functions.Latex全文润色 import Latex中文润色
34
- from crazy_functions.Latex全文润色 import Latex英文纠错
35
- from crazy_functions.Latex全文翻译 import Latex中译英
36
- from crazy_functions.Latex全文翻译 import Latex英译中
37
- from crazy_functions.批量Markdown翻译 import Markdown中译英
38
- from crazy_functions.虚空终端 import 虚空终端
39
-
40
 
41
  function_plugins = {
42
- "虚空终端": {
43
- "Group": "对话|编程|学术|智能体",
44
- "Color": "stop",
45
- "AsButton": True,
46
- "Function": HotReload(虚空终端)
47
- },
48
  "解析整个Python项目": {
49
  "Group": "编程",
50
  "Color": "stop",
@@ -72,13 +49,6 @@ def get_crazy_functions():
72
  "Info": "清除所有缓存文件,谨慎操作 | 不需要输入参数",
73
  "Function": HotReload(清除缓存)
74
  },
75
- "批量总结Word文档": {
76
- "Group": "学术",
77
- "Color": "stop",
78
- "AsButton": True,
79
- "Info": "批量总结word文档 | 输入参数为路径",
80
- "Function": HotReload(总结word文档)
81
- },
82
  "解析整个Matlab项目": {
83
  "Group": "编程",
84
  "Color": "stop",
@@ -151,27 +121,6 @@ def get_crazy_functions():
151
  "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
152
  "ArgsReminder": "若输入0,则不解析notebook中的Markdown块", # 高级参数输入区的显示提示
153
  },
154
- "读Tex论文写摘要": {
155
- "Group": "学术",
156
- "Color": "stop",
157
- "AsButton": False,
158
- "Info": "读取Tex论文并写摘要 | 输入参数为路径",
159
- "Function": HotReload(读文章写摘要)
160
- },
161
- "翻译README或MD": {
162
- "Group": "编程",
163
- "Color": "stop",
164
- "AsButton": True,
165
- "Info": "将Markdown翻译为中文 | 输入参数为路径或URL",
166
- "Function": HotReload(Markdown英译中)
167
- },
168
- "翻译Markdown或README(支持Github链接)": {
169
- "Group": "编程",
170
- "Color": "stop",
171
- "AsButton": False,
172
- "Info": "将Markdown或README翻译为中文 | 输入参数为路径或URL",
173
- "Function": HotReload(Markdown英译中)
174
- },
175
  "批量生成函数注释": {
176
  "Group": "编程",
177
  "Color": "stop",
@@ -191,110 +140,8 @@ def get_crazy_functions():
191
  "Info": "多线程解析并翻译此项目的源码 | 不需要输入参数",
192
  "Function": HotReload(解析项目本身)
193
  },
194
- "历史上的今天": {
195
- "Group": "对话",
196
- "AsButton": True,
197
- "Info": "查看历史上的今天事件 (这是一个面向开发者的插件Demo) | 不需要输入参数",
198
- "Function": HotReload(高阶功能模板函数)
199
- },
200
- "精准翻译PDF论文": {
201
- "Group": "学术",
202
- "Color": "stop",
203
- "AsButton": True,
204
- "Info": "精准翻译PDF论文为中文 | ��入参数为路径",
205
- "Function": HotReload(批量翻译PDF文档)
206
- },
207
- "询问多个GPT模型": {
208
- "Group": "对话",
209
- "Color": "stop",
210
- "AsButton": True,
211
- "Function": HotReload(同时问询)
212
- },
213
- "批量总结PDF文档": {
214
- "Group": "学术",
215
- "Color": "stop",
216
- "AsButton": False, # 加入下拉菜单中
217
- "Info": "批量总结PDF文档的内容 | 输入参数为路径",
218
- "Function": HotReload(批量总结PDF文档)
219
- },
220
- "谷歌学术检索助手(输入谷歌学术搜索页url)": {
221
- "Group": "学术",
222
- "Color": "stop",
223
- "AsButton": False, # 加入下拉菜单中
224
- "Info": "使用谷歌学术检索助手搜索指定URL的结果 | 输入参数为谷歌学术搜索页的URL",
225
- "Function": HotReload(谷歌检索小助手)
226
- },
227
- "理解PDF文档内容 (模仿ChatPDF)": {
228
- "Group": "学术",
229
- "Color": "stop",
230
- "AsButton": False, # 加入下拉菜单中
231
- "Info": "理解PDF文档的内容并进行回答 | 输入参数为路径",
232
- "Function": HotReload(理解PDF文档内容标准文件输入)
233
- },
234
- "英文Latex项目全文润色(输入路径或上传压缩包)": {
235
- "Group": "学术",
236
- "Color": "stop",
237
- "AsButton": False, # 加入下拉菜单中
238
- "Info": "对英文Latex项目全文进行润色处理 | 输入参数为路径或上传压缩包",
239
- "Function": HotReload(Latex英文润色)
240
- },
241
- "英文Latex项目全文纠错(输入路径或上传压缩包)": {
242
- "Group": "学术",
243
- "Color": "stop",
244
- "AsButton": False, # 加入下拉菜单中
245
- "Info": "对英文Latex项目全文进行纠错处理 | 输入参数为路径或上传压缩包",
246
- "Function": HotReload(Latex英文纠错)
247
- },
248
- "中文Latex项目全文润色(输入路径或上传压缩包)": {
249
- "Group": "学术",
250
- "Color": "stop",
251
- "AsButton": False, # 加入下拉菜单中
252
- "Info": "对中文Latex项目全文进行润色处理 | 输入参数为路径或上传压缩包",
253
- "Function": HotReload(Latex中文润色)
254
- },
255
-
256
- # 已经被新插件取代
257
- # "Latex项目全文中译英(输入路径或上传压缩包)": {
258
- # "Group": "学术",
259
- # "Color": "stop",
260
- # "AsButton": False, # 加入下拉菜单中
261
- # "Info": "对Latex项目全文进行中译英处理 | 输入参数为路径或上传压缩包",
262
- # "Function": HotReload(Latex中译英)
263
- # },
264
-
265
- # 已经被新插件取代
266
- # "Latex项目全文英译中(输入路径或上传压缩包)": {
267
- # "Group": "学术",
268
- # "Color": "stop",
269
- # "AsButton": False, # 加入下拉菜单中
270
- # "Info": "对Latex项目全文进行英译中处理 | 输入参数为路径或上传压缩包",
271
- # "Function": HotReload(Latex英译中)
272
- # },
273
-
274
- "批量Markdown中译英(输入路径或上传压缩包)": {
275
- "Group": "编程",
276
- "Color": "stop",
277
- "AsButton": False, # 加入下拉菜单中
278
- "Info": "批量将Markdown文件中文翻译为英文 | 输入参数为路径或上传压缩包",
279
- "Function": HotReload(Markdown中译英)
280
- },
281
  }
282
 
283
- # -=--=- 尚未充分测试的实验性插件 & 需要额外依赖的插件 -=--=-
284
- try:
285
- from crazy_functions.下载arxiv论文翻译摘要 import 下载arxiv论文并翻译摘要
286
- function_plugins.update({
287
- "一键下载arxiv论文并翻译摘要(先在input输入编号,如1812.10695)": {
288
- "Group": "学术",
289
- "Color": "stop",
290
- "AsButton": False, # 加入下拉菜单中
291
- # "Info": "下载arxiv论文并翻译摘要 | 输入参数为arxiv编号如1812.10695",
292
- "Function": HotReload(下载arxiv论文并翻译摘要)
293
- }
294
- })
295
- except:
296
- print(trimmed_format_exc())
297
- print('Load function plugin failed')
298
 
299
  try:
300
  from crazy_functions.联网的ChatGPT import 连接网络回答问题
@@ -337,287 +184,6 @@ def get_crazy_functions():
337
  print(trimmed_format_exc())
338
  print('Load function plugin failed')
339
 
340
- try:
341
- from crazy_functions.询问多个大语言模型 import 同时问询_指定模型
342
- function_plugins.update({
343
- "询问多个GPT模型(手动指定询问哪些模型)": {
344
- "Group": "对话",
345
- "Color": "stop",
346
- "AsButton": False,
347
- "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
348
- "ArgsReminder": "支持任意数量的llm接口,用&符号分隔。例如chatglm&gpt-3.5-turbo&gpt-4", # 高级参数输入区的显示提示
349
- "Function": HotReload(同时问询_指定模型)
350
- },
351
- })
352
- except:
353
- print(trimmed_format_exc())
354
- print('Load function plugin failed')
355
-
356
- try:
357
- from crazy_functions.图片生成 import 图片生成_DALLE2, 图片生成_DALLE3, 图片修改_DALLE2
358
- function_plugins.update({
359
- "图片生成_DALLE2 (先切换模型到gpt-*)": {
360
- "Group": "对话",
361
- "Color": "stop",
362
- "AsButton": False,
363
- "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
364
- "ArgsReminder": "在这里输入分辨率, 如1024x1024(默认),支持 256x256, 512x512, 1024x1024", # 高级参数输入区的显示提示
365
- "Info": "使用DALLE2生成图片 | 输入参数字符串,提供图像的内容",
366
- "Function": HotReload(图片生成_DALLE2)
367
- },
368
- })
369
- function_plugins.update({
370
- "图片生成_DALLE3 (先切换模型到gpt-*)": {
371
- "Group": "对话",
372
- "Color": "stop",
373
- "AsButton": False,
374
- "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
375
- "ArgsReminder": "在这里输入自定义参数「分辨率-质量(可选)-风格(可选)」, 参数示例「1024x1024-hd-vivid」 || 分辨率支持 「1024x1024」(默认) /「1792x1024」/「1024x1792」 || 质量支持 「-standard」(默认) /「-hd」 || 风格支持 「-vivid」(默认) /「-natural」", # 高级参数输入区的显示提示
376
- "Info": "使用DALLE3生成图片 | 输入参数字符串,提供图像的内容",
377
- "Function": HotReload(图片生成_DALLE3)
378
- },
379
- })
380
- function_plugins.update({
381
- "图片修改_DALLE2 (先切换模型到gpt-*)": {
382
- "Group": "对话",
383
- "Color": "stop",
384
- "AsButton": False,
385
- "AdvancedArgs": False, # 调用时,唤起高级参数输入区(默认False)
386
- # "Info": "使用DALLE2修改图片 | 输入参数字符串,提供图像的内容",
387
- "Function": HotReload(图片修改_DALLE2)
388
- },
389
- })
390
- except:
391
- print(trimmed_format_exc())
392
- print('Load function plugin failed')
393
-
394
- try:
395
- from crazy_functions.总结音视频 import 总结音视频
396
- function_plugins.update({
397
- "批量总结音视频(输入路径或上传压缩包)": {
398
- "Group": "对话",
399
- "Color": "stop",
400
- "AsButton": False,
401
- "AdvancedArgs": True,
402
- "ArgsReminder": "调用openai api 使用whisper-1模型, 目前支持的格式:mp4, m4a, wav, mpga, mpeg, mp3。此处可以输入解析提示,例如:解析为简体中文(默认)。",
403
- "Info": "批量总结音频或视频 | 输入参数为路径",
404
- "Function": HotReload(总结音视频)
405
- }
406
- })
407
- except:
408
- print(trimmed_format_exc())
409
- print('Load function plugin failed')
410
-
411
- try:
412
- from crazy_functions.数学动画生成manim import 动画生成
413
- function_plugins.update({
414
- "数学动画生成(Manim)": {
415
- "Group": "对话",
416
- "Color": "stop",
417
- "AsButton": False,
418
- "Info": "按照自然语言描述生成一个动画 | 输入参数是一段话",
419
- "Function": HotReload(动画生成)
420
- }
421
- })
422
- except:
423
- print(trimmed_format_exc())
424
- print('Load function plugin failed')
425
-
426
- try:
427
- from crazy_functions.批量Markdown翻译 import Markdown翻译指定语言
428
- function_plugins.update({
429
- "Markdown翻译(指定翻译成何种语言)": {
430
- "Group": "编程",
431
- "Color": "stop",
432
- "AsButton": False,
433
- "AdvancedArgs": True,
434
- "ArgsReminder": "请输入要翻译成哪种语言,默认为Chinese。",
435
- "Function": HotReload(Markdown翻译指定语言)
436
- }
437
- })
438
- except:
439
- print(trimmed_format_exc())
440
- print('Load function plugin failed')
441
-
442
- try:
443
- from crazy_functions.知识库问答 import 知识库文件注入
444
- function_plugins.update({
445
- "构建知识库(先上传文件素材,再运行此插件)": {
446
- "Group": "对话",
447
- "Color": "stop",
448
- "AsButton": False,
449
- "AdvancedArgs": True,
450
- "ArgsReminder": "此处待注入的知识库名称id, 默认为default。文件进入知识库后可长期保存。可以通过再次调用本插件的方式,向知识库追加更多文档。",
451
- "Function": HotReload(知识库文件注入)
452
- }
453
- })
454
- except:
455
- print(trimmed_format_exc())
456
- print('Load function plugin failed')
457
-
458
- try:
459
- from crazy_functions.知识库问答 import 读取知识库作答
460
- function_plugins.update({
461
- "知识库文件注入(构建知识库后,再运行此插件)": {
462
- "Group": "对话",
463
- "Color": "stop",
464
- "AsButton": False,
465
- "AdvancedArgs": True,
466
- "ArgsReminder": "待提取的知识库名称id, 默认为default, 您需要构建知识库后再运行此插件。",
467
- "Function": HotReload(读取知识库作答)
468
- }
469
- })
470
- except:
471
- print(trimmed_format_exc())
472
- print('Load function plugin failed')
473
-
474
- try:
475
- from crazy_functions.交互功能函数模板 import 交互功能模板函数
476
- function_plugins.update({
477
- "交互功能模板Demo函数(查找wallhaven.cc的壁纸)": {
478
- "Group": "对话",
479
- "Color": "stop",
480
- "AsButton": False,
481
- "Function": HotReload(交互功能模板函数)
482
- }
483
- })
484
- except:
485
- print(trimmed_format_exc())
486
- print('Load function plugin failed')
487
-
488
- try:
489
- from crazy_functions.Latex输出PDF结果 import Latex英文纠错加PDF对比
490
- function_plugins.update({
491
- "Latex英文纠错+高亮修正位置 [需Latex]": {
492
- "Group": "学术",
493
- "Color": "stop",
494
- "AsButton": False,
495
- "AdvancedArgs": True,
496
- "ArgsReminder": "如果有必要, 请在此处追加更细致的矫错指令(使用英文)。",
497
- "Function": HotReload(Latex英文纠错加PDF对比)
498
- }
499
- })
500
- from crazy_functions.Latex输出PDF结果 import Latex翻译中文并重新编译PDF
501
- function_plugins.update({
502
- "Arxiv论文精细翻译(输入arxivID)[需Latex]": {
503
- "Group": "学术",
504
- "Color": "stop",
505
- "AsButton": False,
506
- "AdvancedArgs": True,
507
- "ArgsReminder":
508
- "如果有必要, 请在此处给出自定义翻译命令, 解决部分词汇翻译不准确的问题。 " +
509
- "例如当单词'agent'翻译不准确时, 请尝试把以下指令复制到高级参数区: " +
510
- 'If the term "agent" is used in this section, it should be translated to "智能体". ',
511
- "Info": "Arixv论文精细翻译 | 输入参数arxiv论文的ID,比如1812.10695",
512
- "Function": HotReload(Latex翻译中文并重新编译PDF)
513
- }
514
- })
515
- function_plugins.update({
516
- "本地Latex论文精细翻译(上传Latex项目)[需Latex]": {
517
- "Group": "学术",
518
- "Color": "stop",
519
- "AsButton": False,
520
- "AdvancedArgs": True,
521
- "ArgsReminder":
522
- "如果有必要, 请在此处给出自定义翻译命令, 解决部分词汇翻译不准确的问题。 " +
523
- "例如当单词'agent'翻译不准确时, 请尝试把以下指令复制到高级参数区: " +
524
- 'If the term "agent" is used in this section, it should be translated to "智能体". ',
525
- "Info": "本地Latex论文精细翻译 | 输入参数是路径",
526
- "Function": HotReload(Latex翻译中文并重新编译PDF)
527
- }
528
- })
529
- except:
530
- print(trimmed_format_exc())
531
- print('Load function plugin failed')
532
-
533
- try:
534
- from toolbox import get_conf
535
- ENABLE_AUDIO = get_conf('ENABLE_AUDIO')
536
- if ENABLE_AUDIO:
537
- from crazy_functions.语音助手 import 语音助手
538
- function_plugins.update({
539
- "实时语音对话": {
540
- "Group": "对话",
541
- "Color": "stop",
542
- "AsButton": True,
543
- "Info": "这是一个时刻聆听着的语音对话助手 | 没有输入参数",
544
- "Function": HotReload(语音助手)
545
- }
546
- })
547
- except:
548
- print(trimmed_format_exc())
549
- print('Load function plugin failed')
550
-
551
- try:
552
- from crazy_functions.批量翻译PDF文档_NOUGAT import 批量翻译PDF文档
553
- function_plugins.update({
554
- "精准翻译PDF文档(NOUGAT)": {
555
- "Group": "学术",
556
- "Color": "stop",
557
- "AsButton": False,
558
- "Function": HotReload(批量翻译PDF文档)
559
- }
560
- })
561
- except:
562
- print(trimmed_format_exc())
563
- print('Load function plugin failed')
564
-
565
- try:
566
- from crazy_functions.函数动态生成 import 函数动态生成
567
- function_plugins.update({
568
- "动态代码解释器(CodeInterpreter)": {
569
- "Group": "智能体",
570
- "Color": "stop",
571
- "AsButton": False,
572
- "Function": HotReload(函数动态生成)
573
- }
574
- })
575
- except:
576
- print(trimmed_format_exc())
577
- print('Load function plugin failed')
578
-
579
- try:
580
- from crazy_functions.多智能体 import 多智能体终端
581
- function_plugins.update({
582
- "AutoGen多智能体终端(仅供测试)": {
583
- "Group": "智能体",
584
- "Color": "stop",
585
- "AsButton": False,
586
- "Function": HotReload(多智能体终端)
587
- }
588
- })
589
- except:
590
- print(trimmed_format_exc())
591
- print('Load function plugin failed')
592
-
593
- try:
594
- from crazy_functions.互动小游戏 import 随机小游戏
595
- function_plugins.update({
596
- "随机互动小游戏(仅供测试)": {
597
- "Group": "智能体",
598
- "Color": "stop",
599
- "AsButton": False,
600
- "Function": HotReload(随机小游戏)
601
- }
602
- })
603
- except:
604
- print(trimmed_format_exc())
605
- print('Load function plugin failed')
606
-
607
- # try:
608
- # from crazy_functions.chatglm微调工具 import 微调数据集生成
609
- # function_plugins.update({
610
- # "黑盒模型学习: 微调数据集生成 (先上传数据集)": {
611
- # "Color": "stop",
612
- # "AsButton": False,
613
- # "AdvancedArgs": True,
614
- # "ArgsReminder": "针对数据集输入(如 绿帽子*深蓝色衬衫*黑色运动裤)给出指令,例如您可以将以下命令复制到下方: --llm_to_learn=azure-gpt-3.5 --prompt_prefix='根据下面的服装类型提示,想象一个穿着者,对这个人外貌、身处的环境、内心世界、过去经历进行描写。要求:100字以内,用第二人称。' --system_prompt=''",
615
- # "Function": HotReload(微调数据集生成)
616
- # }
617
- # })
618
- # except:
619
- # print('Load function plugin failed')
620
-
621
 
622
 
623
  """
 
3
 
4
 
5
  def get_crazy_functions():
 
6
  from crazy_functions.生成函数注释 import 批量生成函数注释
7
  from crazy_functions.解析项目源代码 import 解析项目本身
8
  from crazy_functions.解析项目源代码 import 解析一个Python项目
 
13
  from crazy_functions.解析项目源代码 import 解析一个Rust项目
14
  from crazy_functions.解析项目源代码 import 解析一个Java项目
15
  from crazy_functions.解析项目源代码 import 解析一个前端项目
 
 
 
16
  from crazy_functions.解析项目源代码 import 解析一个Lua项目
17
  from crazy_functions.解析项目源代码 import 解析一个CSharp项目
 
18
  from crazy_functions.解析JupyterNotebook import 解析ipynb文件
19
  from crazy_functions.对话历史存档 import 对话历史存档
20
  from crazy_functions.对话历史存档 import 载入对话历史存档
21
  from crazy_functions.对话历史存档 import 删除所有本地对话历史记录
22
  from crazy_functions.辅助功能 import 清除缓存
 
 
 
 
 
 
 
 
 
 
 
 
23
 
24
  function_plugins = {
 
 
 
 
 
 
25
  "解析整个Python项目": {
26
  "Group": "编程",
27
  "Color": "stop",
 
49
  "Info": "清除所有缓存文件,谨慎操作 | 不需要输入参数",
50
  "Function": HotReload(清除缓存)
51
  },
 
 
 
 
 
 
 
52
  "解析整个Matlab项目": {
53
  "Group": "编程",
54
  "Color": "stop",
 
121
  "AdvancedArgs": True, # 调用时,唤起高级参数输入区(默认False)
122
  "ArgsReminder": "若输入0,则不解析notebook中的Markdown块", # 高级参数输入区的显示提示
123
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
124
  "批量生成函数注释": {
125
  "Group": "编程",
126
  "Color": "stop",
 
140
  "Info": "多线程解析并翻译此项目的源码 | 不需要输入参数",
141
  "Function": HotReload(解析项目本身)
142
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  }
144
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
145
 
146
  try:
147
  from crazy_functions.联网的ChatGPT import 连接网络回答问题
 
184
  print(trimmed_format_exc())
185
  print('Load function plugin failed')
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
 
188
 
189
  """