diff --git a/.gitignore b/.gitignore index 237c565..51d1903 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ scripts/*.ts audio images logs -*.sklearn \ No newline at end of file +*.sklearn +config/*.story.yml \ No newline at end of file diff --git a/config/story.yml b/config/story.yml deleted file mode 100644 index 61a02a5..0000000 --- a/config/story.yml +++ /dev/null @@ -1,50 +0,0 @@ -schema: - root: - name: root - children: - - name: usage - description: 使用查询 - children: - - name: bug - description: bug 查询 - children: - - name: command - description: 指令 - children: - - name: others - description: 其他 - children: - -stories: - - message: 请问 property.json 如何配置? - intent: usage - - message: 我的自动补全无法使用,是不是有bug? - intent: bug - - message: 帮我上传一下这份数据 - intent: command - - message: surface了解一下? - intent: others - - message: 大佬们,为啥我的digital ide启动之后所有功能都没启动捏?我配置了property文件,然后插件的vivado路经和modelsim路经都加上了 - intent: usage - - message: 这群要被chisel夺舍了吗 - intent: others - - message: Metals一开直接报错 - intent: others - - message: 话说digital-ide打开大的verilog卡死了 - intent: bug - - message: 请问一下,第一次点击对文件仿真可以出波形文件,再次点击的时候就会提示unknown module type了。是哪个配置没配置好? - intent: usage - - message: 怎么调整是哪个版本的vivado来构建工程呢 - intent: usage - - message: 咱们这个插件win7的vscode是不是只能用很早之前的版本 - intent: usage - - message: 帮我将这份数据保存到服务器上 - intent: command - - message: 他这个意思是 单个功耗很低 但是功耗低那肯定性能就寄 频率肯定不高 靠人多 - intent: others - - -rejects: - - metal - - metals - - idea \ No newline at end of file diff --git a/github-issue.story.yml b/github-issue.story.yml new file mode 100644 index 0000000..4baf2e9 --- /dev/null +++ b/github-issue.story.yml @@ -0,0 +1,131 @@ +stories: +- intent: advice + message: 关于波形显示的一些建议 +- intent: bug + message: 采用iverilog生成的VCD貌似无法解析仿真数据 +- intent: bug + message: 【v0.3.2】模块调用后netlist生成错误,且仿真报错 +- intent: advice + message: 网表优化与插入文档 +- intent: bug + message: 插件文档导出问题 +- intent: bug + message: 【v0.3.2】testbench修改之后再次仿真会报错 +- intent: bug + message: '[0.3.2] [问题] 含参数的 Verilog 模块自动例化,代码格式不正确' +- intent: bug + message: '【报错】RuntimeError: null function or function signature mismatch' +- intent: bug + message: 报错:verilog解析器无法解析以下代码 +- intent: bug + message: 报错:verilog解析器的bug +- intent: advice + message: 功能建议-能增加点类似Verilog-Mode的功能么 +- intent: bug + message: '报错:RuntimeError: null function or function signature mismatch、无法识别HDL文件' +- intent: bug + message: 例化模块自动生成tb文件报错Unknown module type +- intent: bug + message: 'Errors happen when parsing d:/danpj/fpga/modelsim/mod1/user/src/count4.v. + Error: "RuntimeError: null function or function signature mismatch". Just propose + a valuable issue in our github repo ' +- intent: bug + message: 自动例化报错 +- intent: bug + message: '【问题】【0.3.2】重复提示 Error: "RuntimeError: null function or function signature + mismatch"' +- intent: bug + message: 【0.3.2】【问题】1无法解析localparam 2 带参数模块例化 +- intent: bug + message: 基础教程太少 +- intent: bug + message: .v源文件未被正确识别 +- intent: bug + message: 重复仿真时报错 +- intent: bug + message: 插件不能使用 +- intent: bug + message: 关于netlist的生成错误 +- intent: bug + message: '[0.3.2] 支持对verilator 的dpi-c机制的支持 ' +- intent: bug + message: '[0.3.2] 离线支持+SV支持' +- intent: bug + message: Bad webstie connection on README +- intent: bug + message: 在声明数据位宽时使用宏定义会报错 +- intent: bug + message: 0.3.2 无verilog语法检查,且提示RuntimeError +- intent: bug + message: '[0.3.2] 模块定义跳转偶尔会出现问题' +- intent: bug + message: '[0.3.2] 代码补全有多个内容完全相同的选项' +- intent: bug + message: '[0.3.2] 例化模块的类型,模块名称的代码高亮不变色' +- intent: bug + message: 文档中的params和ports数反了 +- intent: advice + message: '[建议]:优化Formatter与文档生成' +- intent: bug + message: '[0.3.2] Linter(vivado) 启用无效 (还是说我用的vivado2023太新了?)' +- intent: bug + message: '[0.3.2]module的#后的parameter能悬停显示数值, 但内部parameter的不能' +- intent: bug + message: '[0.3.2]param语法错误会弹右下角报错弹窗, TreeView刷新按钮无效' +- intent: bug + message: 0.3.0版本后存在bug,构建项目后仿真无法运行 +- intent: advice + message: 建议:模块例化可以基于文件夹来检索,当文件比较多时更整洁一点。 +- intent: bug + message: Add Questa-Sim into the linter option +- intent: bug + message: 悬停提示对 /**/ 型的注释有误 +- intent: bug + message: 仿真时因为文件夹名字存在空格产生错误 +- intent: bug + message: filetype from json to jsonc (support comments) +- intent: bug + message: 语法识别错误 +- intent: bug + message: code to doc +- intent: bug + message: WSL环境点击“显示当前文件的FSM图”时会发生扩展远程主机终止的错误 +- intent: bug + message: 在架构里不能解析include后的模块 +- intent: bug + message: treeview在文件移动时遇到问题 +- intent: bug + message: treeview在文件变动时产生错误 +- intent: bug + message: '[0.3.0 beta] iverilog指令错误' +- intent: bug + message: Will verilator be supported? +- intent: bug + message: '[0.3.0 beta] 高亮颜色错误' +- intent: bug + message: 状态机显示有问题 +- intent: bug + message: xdc文件无法高亮显示 +- intent: bug + message: Ubuntu环境下,digital ide对配置环境有问题。 +- intent: bug + message: '[0.3.0 beta] "定义跳转"定义位置出错' +- intent: bug + message: '[0.3.0 beta] "library导入文件"模块解析报错' +- intent: bug + message: '[0.3.0 beta] "对当前文件进行仿真"功能报错' +- intent: bug + message: '[0.3.0 beta] 由于插件不能分析出使用了"include"语法, 从而导致Sim失败' +- intent: bug + message: '[0.3.0 beta] 文件跳转功能失效' +- intent: bug + message: '[0.3.0 beta] 例化中的[xx:xx]连线会导致后续颜色错误' +- intent: bug + message: '[0.3.0 beta]"显示当前文件的netlist"无法正确显示出网表' +- intent: bug + message: '[0.3.0 beta] Bitwidth of 1-bit signal is incorrectly recognized as "Unknown" + in auto instantiation and auto document' +- intent: bug + message: '[0.3.3 beta] 含参数模型的例化存在问题以及拓展快捷键失效的问题' +- intent: bug + message: '[0.3.2]数值悬停提示不支持''_''语法' diff --git a/notebook/experiment.ipynb b/notebook/experiment.ipynb index ab995f0..e99d162 100644 --- a/notebook/experiment.ipynb +++ b/notebook/experiment.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 10, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -43,7 +43,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -52,7 +52,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -70,17 +70,192 @@ " '怎么调整是哪个版本的vivado来构建工程呢',\n", " '咱们这个插件win7的vscode是不是只能用很早之前的版本',\n", " '帮我将这份数据保存到服务器上',\n", - " '他这个意思是 单个功耗很低 但是功耗低那肯定性能就寄 频率肯定不高 靠人多'],\n", - " [1, 2, 3, 4, 1, 4, 4, 2, 1, 1, 1, 3, 4])" + " '他这个意思是 单个功耗很低 但是功耗低那肯定性能就寄 频率肯定不高 靠人多',\n", + " '我平时写代码就喜欢喝茶',\n", + " '感觉现在啥都在往AI靠',\n", + " '请问你们自动对齐插件用的啥?',\n", + " '不得不放一下我的咖啡笔记了',\n", + " 'stm32有什么好玩的应用不',\n", + " '别人设置的肯定有点不合适自己的',\n", + " 'http://hehezhou.cn/register2024/AArch64-regindex.html',\n", + " '因为他们py本领不是很强,需要这些东西辅助',\n", + " '写C写多了,顺手在pycharm写了个main.c',\n", + " '好流畅的にほんじんです',\n", + " '有没有接触过UI开发的,想做一款寄存器管理的工具,想把界面做的好看一点',\n", + " '现在嘉立创也在做FPGA了?',\n", + " '大佬们,更新0.3.3之后,用iverilog仿真,testbench中还是例化模块出错:unknown module type,这是什么原因啊?',\n", + " '查了一下记录,2017年买的静电容',\n", + " '我小时候电脑刚买回来一星期就被我玩坏了',\n", + " 'command not found: python',\n", + " 'path top.v is not a hdlFile 请问报这个错误大概是啥原因啊',\n", + " '咖啡喝不了,喝了胃不舒服',\n", + " '关于波形显示的一些建议',\n", + " '采用iverilog生成的VCD貌似无法解析仿真数据',\n", + " '【v0.3.2】模块调用后netlist生成错误,且仿真报错',\n", + " '网表优化与插入文档',\n", + " '插件文档导出问题',\n", + " '【v0.3.2】testbench修改之后再次仿真会报错',\n", + " '[0.3.2] [问题] 含参数的 Verilog 模块自动例化,代码格式不正确',\n", + " '【报错】RuntimeError: null function or function signature mismatch',\n", + " '报错:verilog解析器无法解析以下代码',\n", + " '报错:verilog解析器的bug',\n", + " '功能建议-能增加点类似Verilog-Mode的功能么',\n", + " '报错:RuntimeError: null function or function signature mismatch、无法识别HDL文件',\n", + " '例化模块自动生成tb文件报错Unknown module type',\n", + " 'Errors happen when parsing d:/danpj/fpga/modelsim/mod1/user/src/count4.v. Error: \"RuntimeError: null function or function signature mismatch\". Just propose a valuable issue in our github repo ',\n", + " '自动例化报错',\n", + " '【问题】【0.3.2】重复提示 Error: \"RuntimeError: null function or function signature mismatch\"',\n", + " '【0.3.2】【问题】1无法解析localparam 2 带参数模块例化',\n", + " '基础教程太少',\n", + " '.v源文件未被正确识别',\n", + " '重复仿真时报错',\n", + " '插件不能使用',\n", + " '关于netlist的生成错误',\n", + " '[0.3.2] 支持对verilator 的dpi-c机制的支持 ',\n", + " '[0.3.2] 离线支持+SV支持',\n", + " 'Bad webstie connection on README',\n", + " '在声明数据位宽时使用宏定义会报错',\n", + " '0.3.2 无verilog语法检查,且提示RuntimeError',\n", + " '[0.3.2] 模块定义跳转偶尔会出现问题',\n", + " '[0.3.2] 代码补全有多个内容完全相同的选项',\n", + " '[0.3.2] 例化模块的类型,模块名称的代码高亮不变色',\n", + " '文档中的params和ports数反了',\n", + " '[建议]:优化Formatter与文档生成',\n", + " '[0.3.2] Linter(vivado) 启用无效 (还是说我用的vivado2023太新了?)',\n", + " '[0.3.2]module的#后的parameter能悬停显示数值, 但内部parameter的不能',\n", + " '[0.3.2]param语法错误会弹右下角报错弹窗, TreeView刷新按钮无效',\n", + " '0.3.0版本后存在bug,构建项目后仿真无法运行',\n", + " '建议:模块例化可以基于文件夹来检索,当文件比较多时更整洁一点。',\n", + " 'Add Questa-Sim into the linter option',\n", + " '悬停提示对 /**/ 型的注释有误',\n", + " '仿真时因为文件夹名字存在空格产生错误',\n", + " 'filetype from json to jsonc (support comments)',\n", + " '语法识别错误',\n", + " 'code to doc',\n", + " 'WSL环境点击“显示当前文件的FSM图”时会发生扩展远程主机终止的错误',\n", + " '在架构里不能解析include后的模块',\n", + " 'treeview在文件移动时遇到问题',\n", + " 'treeview在文件变动时产生错误',\n", + " '[0.3.0 beta] iverilog指令错误',\n", + " 'Will verilator be supported?',\n", + " '[0.3.0 beta] 高亮颜色错误',\n", + " '状态机显示有问题',\n", + " 'xdc文件无法高亮显示',\n", + " 'Ubuntu环境下,digital ide对配置环境有问题。',\n", + " '[0.3.0 beta] \"定义跳转\"定义位置出错',\n", + " '[0.3.0 beta] \"library导入文件\"模块解析报错',\n", + " '[0.3.0 beta] \"对当前文件进行仿真\"功能报错',\n", + " '[0.3.0 beta] 由于插件不能分析出使用了\"include\"语法, 从而导致Sim失败',\n", + " '[0.3.0 beta] 文件跳转功能失效',\n", + " '[0.3.0 beta] 例化中的[xx:xx]连线会导致后续颜色错误',\n", + " '[0.3.0 beta]\"显示当前文件的netlist\"无法正确显示出网表',\n", + " '[0.3.0 beta] Bitwidth of 1-bit signal is incorrectly recognized as \"Unknown\" in auto instantiation and auto document',\n", + " '[0.3.3 beta] 含参数模型的例化存在问题以及拓展快捷键失效的问题',\n", + " \"[0.3.2]数值悬停提示不支持'_'语法\"],\n", + " [1,\n", + " 2,\n", + " 3,\n", + " 5,\n", + " 1,\n", + " 5,\n", + " 5,\n", + " 2,\n", + " 1,\n", + " 1,\n", + " 1,\n", + " 3,\n", + " 5,\n", + " 1,\n", + " 5,\n", + " 1,\n", + " 5,\n", + " 1,\n", + " 5,\n", + " 5,\n", + " 5,\n", + " 5,\n", + " 5,\n", + " 1,\n", + " 1,\n", + " 2,\n", + " 5,\n", + " 5,\n", + " 5,\n", + " 1,\n", + " 5,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 4,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2,\n", + " 2])" ] }, - "execution_count": 13, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "engine = PromptEngine('../config/story.yml')\n", + "engine.merge_stories_from_yml('../config/github-issue.story.yml')\n", "\n", "sentences = []\n", "labels = []\n", @@ -92,16 +267,16 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(13, 768)" + "(94, 768)" ] }, - "execution_count": 14, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -114,32 +289,32 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ - "tsne = TSNE(n_components=2, perplexity=3)\n", + "tsne = TSNE(n_components=2)\n", "plots = tsne.fit_transform(embedding)" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 16, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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NWqUOHz4sNi4cWPEe7/Wmj9/vrjjjjtE165dRVZWlli/fr2orKz0H79ef/11cfz4cZGdnS1uvfVWsWXLFrFly5aI9x3iingDra7ly5c3eg178ODBArh0e1djjh075l/Hk08+KQ4dOiRcLpeoqqoSf//730V2dnbE9+1a9x2AuPHGG8XatWuF0+kUlZWVYv78+UKW5YD1DB48WOzYsUPU19eLw4cPi4kTJ0Z83662PvjggyafIzBhwgSxZ88ecfHiRXHhwgVRWloacGtftNaPfvQjUVJSIs6fPy9cLpfYs2ePePrpp/1nzRqqT58+YtOmTaKurk6cOnVKzJ49O+K9X0tNnDixyTkssf6dN9Rjjz0mjh8/Lurr60Vpaam4/fbbI95TsKspDf+e+v73vy82btwoqqqqRF1dnTh48KDIz8+PieeofPTRR6K8vFzU19eLU6dOiY8++ihg3o3FYhGvvfaaOHfunLh48aL49NNPA4J6LFbc//0fIiIiIsNpM89RISIioujDoEJERESGxaBCREREhsWgQkRERIbFoEJERESGxaBCREREhsWgQkRERIbFoEJERESGxaBCREREhsWgQkRERIbFoEJERESGxaBCREREhvX/AxNJWBoOZD3PAAAAAElFTkSuQmCC", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiIAAAGdCAYAAAAvwBgXAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABq4ElEQVR4nO3deXhTZdoG8DtnSdqEgDqICKNVsbbSKnzSsigoiNq6sLhQRkZwbVE/q6CiMuqAqIO4gaOM0MKgdnAUnBEoahG1CB+yFRQEStmUVlCwbI1Nm+Qs3x+lkZZuaZOcLPfvus51QXKS82ZpznPe5XlMAHQQERERGUAwugFEREQUvRiIEBERkWEYiBAREZFhGIgQERGRYRiIEBERkWEYiBAREZFhGIgQERGRYRiIEBERkWEkoxvQnC5dusDhcBjdDCIiIvKB3W7HgQMHmt0vpAORLl26YP/+/UY3g4iIiFqha9euzQYjIR2I1PaEdO3alb0iREREYcJut2P//v0tOneHdCBSy+FwMBAhIiKKQJysSkRERIZhIEJERESGYSBCREREhgmLOSJNMZlMOO2002C322EymYxuDrWRrutwOBw4duwYdF03ujlERBRgYR2InHnmmcjMzERiYqLRTSE/27FjB3Jzc/Hrr78a3RQiIgogE4CQvey02+2oqKhA+/btT1k1I0kS/vGPf+C3337DggULcOjQIaiqalBLyV9EUUSnTp2QkZGBdu3a4cEHH4SiKEY3i4iIfNDU+bu+sO0ROfvssxETE4NXX30VO3fuNLo55Ed79+7FkSNH8Mwzz6Bz58746aefjG4SEREFSNhOVhWEmqa7XC6DW0KBUPu5iqJocEso1EmyGdb2p0OSzUY3hYhaIWx7RIgounWNT0ZK2m1I6D0QgihBUxWUrF+BDQULcWD3NqObR0QtxECEiMJOj0FDkX7vBIiSBE1ToakqBElCUv80JPYdjIK5L2NzYb7RzSSiFgjboRkiik5d45O9QYirqhIeVzVUxQOPqxquqkqIkoT0e59AlwuTjG4qEbUAA5ETJLMZttNPg2TmODNRKEtJu80bhDSkNhhJSbstyC0jotaI+qGZc5K7o9+IYUgaOACCJEJTVGxbsQprFixC2bZio5tHRCeRZDMSeg+EpjW9VF/TVCT2GYRPc6ZC8biD1Doiao2o7hFJGXoDsmZNR8+0ayBIEnRVgyBJ6Jl2DbJmz0CvIdcH5Lg//PADHnnkkTq3ffvtt5g0aRIAYNKkSdi3bx+qq6uxf/9+vPHGG9797rjjDmzYsAEVFRX4+eefMX/+fJx55pl1nmvIkCHYuXMnqqqq8NVXX2HMmDHQdR0dOnTw7nPFFVdg5cqVcDqdKC0txRtvvAGr1RqQ10vkL+ZY24mJqc0EIqoGQZRgjrUFqWVE1FpRG4ick9wdw554BIIkorqyEp7qaigeDzzV1aiurIQgiRj+5Dick3RxUNt16623Yvz48Rg7dizi4+MxfPhwfP/99977ZVnGs88+ix49emD48OE477zz8M4773jvP++88/DRRx9h0aJF6NGjB2bPno0XX3yxzjEuuOACFBQU4D//+Q8uvfRSjBw5Ev3798dbb70VrJdJ1CruqkpoqgKhmWXdgihAUxW4qyq5vJcoxEXt0Ey/EcMgShKqKxsZZ650IsZmQ98Rw4M6RHPuuefil19+wRdffAFFUVBWVoYNGzZ47583b5733z/88AMefvhhFBUVwWazobKyEmPHjkVJSQmeeOIJAMDOnTuRnJyMZ555xvu4iRMnYv78+d6elt27d+Phhx/G119/jQceeIC5WShkKR43StavQFL/tCb3EwQRP+4owo1j/8LlvUQhLip7RCSzGUkDBzSbEl5VVSQPGhDUCawLFy5EbGws9u7di5ycHAwfPrxOUq/LLrsMS5Yswb59+1BRUYGvv/4aQE0AAwAJCQl1AhcAWL9+fZ3/9+jRA3fddRccDod3W7ZsGURRxPnnnx/gV0jUNkXLPoKqKLA0MuxiibXBZDLh/OTeSOqfBuHEEt/a5b2jJ89Cj0FD2twOTnAn8o+o7BGx2KwQJBF6M4GIrqkQJBEWmxWK238T3jRNO6VSsCzLAICffvoJCQkJuOaaa3DttdfiH//4ByZMmICrrroKZrMZy5Ytw7Jly/DnP/8Zv/76K84991x8/vnnMPvwY9iuXTvMnj0bf//730+5r7S0tG0vjijA9u/aioK5LyP93idgibWdyCOiQRAFCIJ4omqzCSbBVGdljap4ANQEKun3PoFfy/a2qmeEE9yJ/CsqAxFXpROaUnOFBI+n0f1MgghNUeCqdPr1+L/++ivOPvts7//tdnudnojq6mosXboUS5cuxcyZM1FSUoJLLrkEJpMJHTt2xFNPPeWtv5KSklLnuUtKSnDDDTfUuS01NbXO/zdt2oTu3btjz549fn1dRMGyuTAfv5btRUrabUjsM6hm6EVRsH3dctg6nIHzL+3d5PJeS6wNKWm3YYmPgUjK0Bsw7IlHIEoSVFWFfiKRWs+0a3DJ4IFYNG0GNuZ/5o+XSBQ1ojIQUdxubFuxCj3TrkHjYUhNnZMtywv92hsCAF999RXuuusu5Ofn49ixY5gyZYp3mOjOO++EKIpYt24dnE4n7rjjDjidTuzbtw+CIMDlciE7OxuzZs1CcnIynn322TrPPXv2bDz66KN46aWXMHfuXPTs2RN33XUXAJy4UgSmTZuGtWvX4s0338ScOXNQWVmJ7t2749prr0V2drZfXytRoBzYvQ1Ldm/DpzlTYY61wX0i8Hh07ucBWd5bf4K7l8cDD2p6Woc/OQ6H9v7InhEiH0TlHBEAWLNwcc04s63hJasWmxWqomDtwkV+P/bUqVPx9ddfY+nSpfjkk0+waNEib+/EsWPHkJmZidWrV2PLli245pprMGTIEBw5cgTl5eW46667MGLECGzfvh1PPfUUHn/88TrP/eOPP+K2227DLbfcgi1btuCBBx7wrpqpnYT6/fff46qrrsJFF12EVatW4dtvv8WUKVNw4MABv79WokBTPG44K45C8bgDury3doJ7Yz2krkonRElC3xHDfWk+UdSLyh4RACjbuh2Lps3A8CfHIcZmq+lm1VSYBBGiKEJVFCyaNiMgVzYOhwO33357ndvee+89778XL17c6GM/+OADfPDBB3Vuqz/fJD8/H/n5v9fZ+Mtf/oKysrI6q2GKioqQltb0ygOicONd3itJ3jkhDRFEAZqieHtRmuPrBPeP//aa33tSiSJV1AYiALAx/zMc2vsj+o4YjuRBtRPPFGxZXoi1C8N34tkDDzyADRs24PDhw7jiiiswYcIE5gihqODL8t7t65a3eFjG6AnuRJEsqgMRACjbVoyybcX4+G+vwWKzwlXpDPsfkPj4eDzzzDM444wzUFpaitdeew1Tp041ullEQVG07CMk9h0MS6ytwQmrllgbVEVB0bKPWvycRk9wJ4pkUTtHpD7F7Ubl0WNhH4QAwKOPPoquXbsiNjYWCQkJeOGFF5rtUiaKFLXLe2tzjciWGIiSGbIlxhuEFMx92aelu7UT3MVmMrqKooithasi4neEKFiivkeEiCJPU8t7i5Z91Kr8IWsWLsYlgwd6e07rC+QEd6JIxkCEiCJSQ8t721KJ18gJ7kSRjIEIEUU0xeNuUwByskid4E5kJAYiREQ+iMQJ7kRGYiBCRNQKitvNAITIDwK6akYQBEyZMgV79+6F0+nE7t2765Sjj1aFhYWYPn260c0gIiIyXEB7RJ588kk88MADuPPOO7Ft2zakpKRg3rx5OH78ON58881AHtpnFosMuz0WDkcVXK6mKtAQERGRvwQ0ELn88suxePFifPrppwCAffv24fbbb0fv3r0DeVifpKbGI2tsOoYO6QNJFqF4VCzJX4fZswpQVLTL6OYRERFFtIAOzXzzzTcYPHgw4uPjAQCXXnop+vfvj88+a7hMttlsht1ur7MF0pgxV+OzgueQkTEAslmEpmmQzSIyMgagYNlzGD16UMCOLUkS3nzzTRw7dgy//vorpkyZ4r1P13UMGzaszv5Hjx7FnXfe6f1/v3798O2336KqqgobNmzAsGHDoOs6evToEbA2ExER+VtAe0ReeukltG/fHjt27ICqqhBFEU8//TTef//9BvefOHEiJk+eHMgmeaWmxuP16fdBlkU4HKcmJ7LbYzF9RiaKi38KSM/InXfeiblz56J3795ISUlBTk4OSktLMWfOnGYfa7fbkZ+fj08//RSjRo1CXFwcZsyY4fc2ElFkkmSzX3KrEPlDQAORjIwM/PnPf8aoUaOwbds29OzZEzNmzMCBAwfqVJutNXXqVLz++uve/9vtduzfvz8gbcsamw5ZlhoMQgDA4aiC3W5FVlZaQAKRsrIyjB8/HgCwc+dOXHLJJRg/fnyLApFRo0ZB13VkZmbC5XKhuLgYr7zySoseS9QSPFFFpq7xyUhJuw0JvQfWZJtVFZSsX4ENBQtblW22tSSzmUufySuggcgrr7yCl156CR9++CEAYOvWrYiLi8PEiRMbDETcbjfcQfhSWiwyhg7p06KS3kOH9UV29my/T2Bdu3Ztnf+vWbMGjz32GASh+dGyhIQEbNmyBS6Xy3vb+vXr/do+ik6hcqIi/+sxaCjS750AUZKgaSo0taaIX1L/NCT2HYyCuS9jc2F+QNtwTnJ39BsxDEkDa5PBqdi2YhXWLGAyuGgW0EDEarVC07Q6t6mq2qKTbSDZ7bGQZBGqqjW5n6pqkGURdntsUFfSaJoGk8lU5zZZloN2fIpOoXCiosDoGp/s/WxPrkisKjW/a5ZYG9LvfQK/lu0NWMCZMvQGDHviEYiSVJMe/8T3q2faNbhk8EAsmjYDG/Mbnj9IkS2gEUF+fj6efvpp3HDDDYiLi8Pw4cPx6KOP4uOPPw7kYZvlcFRB8agQxaZfvigK8HhUOBxVfm9Dnz596vy/b9++2LVrFzRNw6+//oqzzz7be9+FF14Im83m/X9JSQkuueQSmM1m722pqal+byNFj/onKo+rGqrigcdVDVdVJURJQvq9T6DLhUlGN5VaISXttlOCkJPVfsYpabcF5PjnJHfHsCcegSCJqK6shKe6GorHA091NaorKyFIIoY/OQ7nJF0ckONTaAtoIJKdnY2PPvoI//jHP1BcXIxXX30Vs2fPxrPPPhvIwzbL5fJgSf66FpX0XrJ4bUB6Q84991y89tpruOiii/CnP/0J2dnZeOONNwAAX331FR566CH07NkTvXr1wqxZs+oMWb3//vsQBAE5OTlITEzEddddh8cffxxAzYobIl8ZfaKiwJFkMxJ6D4SmNT0UrWkqEvsMgiSbm9yvNfqNGFbz/WqgajEAuCqdECUJfUcM9/uxKfQFNBD57bffMH78eJx33nmwWq248MIL8eyzz8LjMT5hWM7sAng8Cuz22Abvt9tj4fEoyMlZFpDjv/fee4iNjcX69esxc+ZMvPHGG8jJyQEAPPbYYygrK8OqVavw/vvv49VXX4XT+fsfsMPhwJAhQ9CzZ0989913ePHFF73Lf6urqwPSXopcoXCiosAxx9pOzPdp5vNVNQiiBHOsrcn9fCWZzUgaOKBFc/KSBw2AZOb3K9pEba2ZDRt2Yfy4XEyfkQm73QpVVaGqGkRRgCiK8HgUjB+XG5AVM4MG/Z6f5MEHHzzl/p9//hnp6el1bjv99NPr/H/NmjXo2bOn9/+jRo2C2+1GaWmpfxtLEa81JyqupAkf7qpKaKoCQZK8c0IaIogCNEWBu5Fesday2KwQJBF6M98vXVMhSCIsNitX0kSZqA1EACAvrxDFxT8hKysNQ4f1hSyLcLtVLFm8Gjk5y0I6s+ro0aOxd+9e7N+/Hz169MC0adOwYMEC9oiQz4w+UVFgKR43StavQFL/tCb3EwQR29ct93uQ6ap0QlNqJqaiid5wkyBCU5RGh28ockV1IAIARUW7UFS0C9nZs8Oq1kznzp0xZcoUdO7cGT///DMWLlyIp59+2uhmURgy+kRFgXFyLpiiZR8hse9gWGJtDc4DssTaoCoKipZ95Pd2KG43tq1YhZ5p16CpX1ZRFLFleSF7Q6JQ1AcitVwuT1gEILVeeeUVvPLKK0Y3gyKEkSeqQIjmhGyN5YJZt3Q++tz0Z1hibSeWZ2sQRAGCIEJVFBTMfTlgS3fXLFyMSwYP9CYxq89is0JVFKxduCggx6fQxkCEiLB/11YUzH0Z6fc+YciJyl+iPSFbU7lgVEXB2vz56NDxLCT2GVTz/igKtq9bjqJlHwX0/Snbuh2Lps3A8CfHIcZmq8kjoqkwCSJEseb7tWjaDCY1i1IMRIgIALC5MB+/lu1FStptQT9R+UO0J2RrSdKyvkP+jLzJ9+PTnKlB7zHamP8ZDu39EX1HDEfyoNrMqgq2LC/E2oXMrBrNGIgQkdeB3duwZPc2Q05UbREKmUON1pJcMJZYG1LSbsOSmc8Z8rmWbStG2bZifPy311hrhryMzbVORCFJ8bjhrDgaFkEIwIRs4ZYLRnG7UXn0GIMQAsBAhIjCXLidhAPB6KRlRG3BQISIwhpPwiflgmmmbIUgCtBU5oKh0MJAhFrMZDJBEiVIknRKdWBfXHXVVdB1HR06dPBj6yha8ST8ey4YQWjmPRBE7FhXGDZDbhQdOFn1BFk2w2q1wemshId/pHXEWGJxxh/OhM3azhuA6LqOSudvOHz4V7hc/q9OTNRSTMhWI9JywVD0iPpAJDHhEgy58U+4vN/VNevZVRXfrPkKS5Z+gJKd3xvdPMO1t5+GTmedDcFUt/PMZDKhnc0Oq9WGQwcPoMJx3KAWEvEkDEROLhiKPlE9NJN27XBM+9scDBx4fU3uAV2DKEkYOPB6vDx1Dq67ZlhAjmsymTBhwgTs2rUL1dXV2LdvH/7yl78AAJKTk/Hll1/C6XSivLwcs2fPhs32+5j2vHnz8PHHH2PixIn45ZdfcPToUTz77LMQRREvv/wyDh8+jLKyMtx1113ex8TFxUHXdYwYMQIrV66E0+nE+vXrER8fj5SUFGzYsAEOhwOffvopOnbs6H3cFZf3x6effoL161ejaOMa5P1rHrp3v7jOa9m1azv+96FsLFq0GJWVldi5cyeGDBlSZ5/rr78eJSUlcDqd+Oqrr3Deeef5/02lqFZ7ElYVBZZYG2RLDETJDNkS4w1CouEkvLkwH3mT78fWVQXQFAWCUFMfaOuqAuRNvj+i86hQ+IraHpHEhEvw4P0TIUkynM6Tr6Bq8g5YY2343wf+gn2le/3eMzJ16lRkZmZi/Pjx+L//+z+cffbZSExMhNVqxbJly7BmzRqkpqaiU6dOmDNnDt566y3cfffd3sdfffXV+Omnn3DllVfiiiuuwD//+U9cfvnlWLlyJfr06YORI0di9uzZWL58Ofbv3+993HPPPYdx48ahtLQU//znP/H+++/D4XDgkUcegdPpxIIFCzBlyhRvReCzOp+NjxctxgsvTAVMJtxzz53IyX0badfdgMqT0jRnZz+I5557Ho899iiys7Mxf/58xMXF4ejRo/jjH/+I//73v5g5cyZycnKQkpKC1157za/vJxEQ/gnZ/CVcc8FQdNNDdbPb7bqu67rdbj/lvri4OP29997T4+LiWvXcEx59Uf9kySZ94QerGt0+WbJJf2z88359Te3atdOrqqr0e++995T77rvvPv3w4cO61Wr13nb99dfriqLonTp10gHo8+bN03/44QfdZDJ59ykuLta//vpr7/8FQdAdDoc+cuRI73ul67p+zz33ePcZOXKkruu6PmjQIO9tTz75pF5cXKwD0E0mk97tgkT9ovgk75ZwUbLucDj0rMwHvbfpuq7PfOttvdsFibrJZNKtVquu67qelpamA9BffPFFfevWrXVe59SpU3Vd1/UOHTo0+j619fPlFh6bJJt1a/vTdUk2h8XzcuPGrWVbU+fv+ltU9ojIshmX97saajPL/VRVRf/LB+Pvbz3vtwmsF198MWJiYvDll182eN/mzZvhdP7e27B69WqIooiEhAQcOnQIALBt2zbouu7d5+DBg9i6dav3/5qm4fDhw+jUqVOd59+yZUudxwDA999/X+e22scIgoCOHTvi0cceQe/eqfjDH86AIIiIjY1Bly6d6zxvSclOmEwmCIIAp9OJ48ePe5/n4osvxrp16+rsv2bNmha8UxTJAl0TRvG42QtAbRbNxRODKSoDEavVBlEUW5AASYMoSrBabTh+3D9fwqqqtq8w8XjqVgnWdb3B2wSh7hSgk/epDWTq31b7GE3T8PIrf8Ppp5+OF198CQf2H4Db7caHC+ZDluW6z6so0HUdmqY1emyiWtFeE4ZCX7QXTwy2qDxbOJ2VUFW1BWvuBaiqUm8O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P7/RY27ZsgU9e/asc5yTbdq0CQkJCdizZ88pW0PLACm8SGYzkgYOaNGKhuRBA6J2AmtK2m2nBCEnc1VVBiUpmD8YlRE0L68Q6WmT8OEHK+F2qxCEmjkhH36wEulpk5CXVxjU9lB4CGggcsEFF+CBBx7Arl27kJaWhrfffht///vfMWbMmAb3nzhxIioqKrzb/v37A9Iul6JiackeSELTL18SBCzZsRsupekfcF/UrpTJyspCt27dMGjQILz++uve+99//33ouo7c3FxcfPHFuP766/H444+f8jz79u3DN998g7lz59aMuy5Z0ugx//3vf+OXX37BokWLcPnll+P888/HLbfc4g1wpkyZgjFjxuCvf/0runfvjsTERIwcORLPP/+83143Gcdis0KQROjNBCK6pkKQRFhs1iC1LHTUJgXTtKbfo0AnBYsERUW7kJX1FuLOvRsJF41F3Ll3IyvrLfaEUKMCGogIgoBNmzbh6aefxnfffYfc3Fzk5uaesvS01tSpU9G+fXvv1rVr14C1LbdoM9yqCrul4R8Uu8UMt6piTtEWvx5X13X86U9/Qq9evbB161ZMnz4dEyZM8N5fWVmJIUOG4JJLLsG3336LF198EU8++WSDzzV//nz07NkTH3/8cZNDKB6PB9dddx0OHTqETz/9FN9//z2eeuop7xXy559/jptuugnXXXcdNmzYgLVr12L8+PHYt2+fX187GcNV6YSmqDA1sxzbJNSsonFVOoPUstDRUFKwhgQ6KVgkcbk8KC+v4MRUalZA54j8/PPP2L59e53biouLceuttza4v9vthtuPwyBNKdr/Cx4vKMSr6YPQ3mKGomlQNR2iYIIkCHCrKh4vKAxIUrMvv/wSSUl1i0+ZTL8PE61bt65O7pD699eaNWtWndU0Te1fWlqKESNGNNqmzz//HJ9//nmzbafwo7jd2LZiFXqmXYOmTgmiKGLL8kIoQfobDCWhkBSMKFoFtEdk9erVSEhIqHPbRRddFDJX2v/avB035v0HH27dAY+mQRBM8GgaPty6Azfm/Qf/2ry9+SchCgNrFi6GqiiNDrtYbFaoioK1CxcFt2EhIhSSghFFq4D2iEyfPh3ffPMNJk6ciAULFqB3797IyspCVlZWIA/rk40HfsHGJb9g3Kdfwm42w+F2+3VOCFEoKNu6HYumzcDwJ8chxmarySOiqTAJIkSxJs/EomkzonbFDGB8UjCiaBXQHpGioiLcfPPNuP3227F161Y8++yzGDduHN5///1AHrZVXIqKcmcVgxCKWBvzP0PO2HH4tuALaIoC04k8E98WfIGcseOiPplZbVIwVVFgibVBtsRAlMyQLTHeICSQScGIolXAM6t+8skn+OSTTwJ9GCJqgbJtxSjbVoyP//YaLDYrXJXOqJwT0pjNhfn4tWwvUtJuQ2KfQTUTWBUF29ctR9GyjxiEEAVA1NaaIYpmitvNAKQRRiYFI4pGDESIiBqgeNwMQIiCIKBzRIiIiIiawkCEiIiIDMNAhIgoglksMjp2bA+LRTa6KUQNYiASJgoLCzF9+nSjm0FEYSI1NR65c7JRWjoPJTtno7R0HnLnZCMlJd7opoUtyWyG7fTTorYwZKBwsuoJkmwOiRnyV111FVasWIHTTjsNx48fN6wdRBS+xoy5Gq9Pvw+yLEFVVaiqBtksIiNjAG6+uR/Gj8tlJVwfnJPcHf1GDEPSwAEQpJqaTNtWrMKaBYuiOgmgv0R9INI1PhkpabchoffAE0WvFJSsX4ENBQsjPmeALMvweFiQiiiSpKbGnwhCRDgcpxYwtNtjMX1GJoqLf2JF3BZIGXoDhj3xCESpJqjTVRWCJKFn2jW4ZPBALJo2I+qTAbZVVA/N9Bg0FHdMehtJ/dMgSBI0reYLltQ/DaMnz0KPQUMCclyz2Yw33ngDBw8eRFVVFVatWoWUlBTExcVhxYoVAIBjx45B13XMmzfP+zhBEDBt2jQcPnwYP//8MyZNmlTneTt06IDc3FwcOnQIx48fx5dffolLL73Ue/+kSZPw7bff4t5778XevXu9FXtvvfVWbNmyBU6nE+Xl5Vi+fDms1ugrBU/BJclmWNufDklmN7c/ZY1NhyxLcDiqGrzf4aiCLEvIykoLcsvCzznJ3THsiUcgSCKqKyvhqa6G4vHAU12N6spKCJKI4U+OwzlJFxvd1LAWtYFI1/hkpN87AaIkwVVVCY+rGqrigcdVDVdVJURJQvq9T6DLhUnNP5mPXn75Zdx666248847cdlll2H37t1YtmwZHA4HbrnlFgA1xQE7d+6MRx55xPu4O++8E5WVlejTpw+eeOIJ/PWvf8U111zjvX/hwoXo1KkTrr/+evTq1QubNm3Cl19+idNPP927z4UXXohbb70Vt9xyC3r27InOnTvj3//+N/75z3/i4osvxsCBA/Hf//63wWq/RP7QNT4Zwx6ajEfnfo6H387Ho3M/x7CHJgfkby3aWCwyhg7pA1VtulSFqqoYOqwvJ7A2o9+IYTXniMpTe5YAwFXphChJ6DtieHAbFmGiNhBJSbvNG4Q0pDYYSUm7za/HtVqteOCBBzBhwgQUFBSguLgYmZmZqKqqwj333IMjR44AAA4dOoSDBw+ioqLC+9gtW7ZgypQp2L17N/Ly8lBUVITBgwcDAK644gr07t0bI0aMwMaNG7F7925MmDABx44dw223/f4azGYzxowZg++++w7ff/89zj77bMiyjP/+97/Yt28ftm7dirfffhuVlSxzTv5nVC9ktLDbYyHJIlRVa3I/VdUgyyLs9tggtSz8SGYzkgYOaFFQlzxoACewtkFUBiKSbEZC74HQtKa/YJqmIrHPIL92HXfr1g1msxmrV6/23qYoCtavX4+LL266e2/Lli11/v/zzz+jU6dOAIAePXqgXbt2OHz4MBwOh3c7//zz0a1bN+9j9u3bh/Lycu//N2/ejC+++ALff/89FixYgPvuuw+nnXaaH14pUV1G9kJGC4ejCopHhSg2/dMuigI8HrXR4RsCLDYrBEmE3kwgomsqBEmExcbh7NaKykDEHGs7MTG1mUBE1SCIEsyxtiC1rGn1J5bqug5BqPkI27Vrh59//hk9e/assyUkJOCVV17xPqZ+T4emabj22mtx/fXXY/v27cjOzkZJSQnOO++8gL8eii5G9UJGE5fLgyX56yCKYpP7iaKIJYvXwuXiZPXGuCqd0BQVpmbeS5NQs4qmseEbal5UBiLuqkpoqgKhmS+YIArQVAXuRn44W2PPnj1wuVy44oorvLdJkoTU1FRs374d7hOFyJr7Ialv06ZN6Ny5MxRFwZ49e+pshw8fbvbx33zzDSZPnoz/+Z//gdvtxs033+zbCyNqgpG9kNEmZ3YBPB6l0WEXuz0WHo+CnJxlQW5ZeFHcbmxbsapFQd3WwlUsItkGURmIKB43StavgCA0E4gIInasK/RrXhGn04m3334br7zyCtLS0nDxxRcjNzcXVqsVc+fOxb59+6BpGm666SZ07NgRNlvLemO++OILrFmzBosWLcK1116LuLg49OvXDy+88AJ69erV6ON69+6NiRMnolevXjjnnHNwyy234Mwzz0RxMdfGk/+Eay9kONqwYRfGj8uFx6PCbrfCarXAYpFhtVpgt1vh8agYPy6XS3dbYM3CxVAVpdFhF4vNClVRsHbhouA2LMJEZSACAEXLPqr5gjXyg2eJtUFVFBQt+8jvx37qqafwn//8B3l5edi0aRMuvPBCpKWl4dixYzhw4AAmTZqEl156CQcPHsRbb73V4ue94YYbsHLlSsybNw87d+7EBx98gLi4OBw8eLDRx1RUVODKK6/Ep59+ip07d+KFF17AY489hoKCAn+8VCIAxvZCtlY4p0bPyytEetokfPjBSrjdKgRBgNut4sMPViI9bRKTmbVQ2dbtWDRtBjRFRYzNBjkmBpJZhhwTgxibDZqiYtG0GUxq1kYmALrRjWiM3W5HRUUF2rdvD4fDUee+uLg4PP/883j22Wexb9++Vj1/j0FDkH7vExBPzN6vuRoTIAgiVEVBwdyXsbkw3x8vhXzkj8+XQsuwhyYjqX9ao3NEgJoLgK2rCrBk5nNBbFldqanxyBqbjqFD+kCSRSgeFUvy12H2rIKw7EWwWGTY7bFwOKo4J6SVzkm6GH1HDEfyoN8zq24tXIW1C5lZtTFNnb/ri+rMqpsL8/Fr2V6kpN2GxD6DarqOFQXb1y1H0bKPIj6zKlEwFS37CIl9B8MSa2swGAlkL2RLRWJqdJfLwwCkjcq2FaNsWzE+/ttrsNiscFU6OSfEj6I6EAGAA7u3Ycnubfg0Z2pI1JohilT7d21FwdyXkX7vE7DE2hrthTTqAoCp0ak5itvNACQAoj4QqaV43AxAiAIslHshf0+N3vAyTIejCna7FVlZaQxEiPyIgQgRBVUo9kL6mho9O3s2hzuI/ISBCBEZIpR6IVuTGp2BCJF/hO3yXV2vWewjSYylIlHt51r7ORMFElOjG4/VmKNX2J7Fa7OFJiYmYs+ePQa3hvwtMTERAOrUxSEKlNrU6BkZA5rcryY1+mr2hvhR1/hkpKTdhoTeA08kvVNQsn4FNhQs5MrFKBG2gUhlZSVWrFiBjIwMAMCOHTugKIrBraK2kiQJiYmJyMjIwIoVK+B0sn4DBUfO7ALcfHM/b86N+pga3f96DBrqLYRYs4rq92rMiX0HM5dTlAjbQAQA5s2bBwAYOXKkwS0hf1uxYoX38yUKhtrU6NNnZMJut3rziIiiAFEU4fEoTI3uR/WrMddSlZreJkusDen3PoFfy/ayZyTChW1m1ZNZrVZ07NgRJpMpiK2jQNB1HeXl5ewJIcOkpMQjKysNQ4f1hSyL8HhULFm8Fjk5yxiE+FG4ZNql1vEls2pEBCJERC3V0pTnTI0eOJJsxqNzP4cgSfC4qhvdT7bEQFMUvH7vdSGzwopahineiYjq8bWGDFOjB05rqjEzEAkMyWw2PG09AxEiiniRWEMmnHmrMUuSd05IQwRRgKaERjXmSHNOcnf0GzEMSQN/L+S3bcUqrFkQ/EJ+YZtHhIioJerXkHE6XXC5PHA6XXA4nJBlEdNnZCIlJd7opkYNxeNGyfoVEASxyf0EQcSOdYXsDfGzlKE3IGvWdPRMuwaCJEFXNQiShJ5p1yBr9gz0GnJ9UNvDQITCgsUio2PH9rBYZKObQmHm9xoyDSchcziqIMsSsrLS/HI8yWyG7fTTIJmZmKspRcs+gqoosMTaGrw/2NWYo+VzOye5O4Y98QgESUR1ZSU81dVQPB54qqtRXVkJQRIx/MlxOCfp4qC1iUMzFNJ8HdcnOlkwa8iEUld3OAiVaszR9rn1GzEMoiShurLh4S5XpRMxNhv6jhgetNfPVTMUshoa16+f04Hj+tSUjh3bo2TnbGia1uwKGUEQkHDRWJSXV/h8nJShN2DYE49AlGq+q7qqwiSKEMWaE+qiaTOwMf+ztryUiNXlwqS61ZhVBTvWFQalGnO0fW6S2Yxnly+qWa1U3cRqpZia1UrPXzu81RNYuWqGwt7J4/q/OapgEkzQNR36ibjZbo/F9BmZKC7+iT0jbWSRRNjNZjjcbriUpnsOwk1tDRnZ3PRcBFEU4Ha3roZM/a5uL48HHgAWmxXDnxyHQ3t/jMgr7LYyqhpzNH5uFpsVgiRCb6aHUNdUCJIIi80alJU0DEQoJGWNTUdMjBm6rqPTWafBZAJ0Haiudp+YZFgFu92KrKw0BiKtlNK1MzJTeuCmhG6QBAGKpmFpyR7kbNiMjQd+Mbp5fhGMGjKh2NUdjoJdjTkaPzdXpROaUpNGH57Gv+smQYSmKHBVBiexZNAmqz755JPQdR3Tp08P1iEpTFksMkaM6I+YGBmxsRbUJsw1mYDYWAv+8Ac7YmMt3nF9TmD13egeSVh6x60YkZQAWRCgaTpkQcCIpAR8MvpW3NGju9FN9Juc2QXweBTY7bEN3t+WGjKS2YykgQNaNAcledCAiJ8IGS6i9XNT3G5sW7EKothcD6GIrYWrgpZXJCiBSEpKCsaOHYvNmzcH43AU5q68Mgnt2tWcNHRdh67jpK1maKZDBysAE2RZbPQEQw1L6doZr6QPhCyKqHC54fQocKkqnB4FFS43ZFHEq+mD0KtLZ6Ob6he1NWQ8HhV2uxVWqwUWiwyr1QK73QqPR211DZnWdHWT8aL5c1uzcHHNaqVGXpPFZoWqKFi7cFHQ2hTwQMRms2H+/PnIzMzE0aNHA304igC3j7qqyftrYhETYmPN8HhaN64fzTJTesAsinC4Gr7acbjcMIsi7ku5NMgtC5y8vEKkp03Chx+shNutQhBq5oR8+MFKpKdNavWk59qublMzV5g1Xd1q0Lq6qWnR/LmVbd2ORdNmQFNUxNhskGNiIJllyDExiLHZoCkqFk2bEdThqIDPEZk5cyY++eQTfPnll3jmmWea3NdsNsNisXj/b7fbA908CjEWi4wbb0iFx6NAliU0vqhLhyxL+GTpeqbh9oFFEnFTQjcomtbkfoqmYWjihRj36ZcRM4G1qGgXiop2ITt7tt9qyNR2dfdMuwZNPZMoitiyvNCwFNpUV7R/bhvzP8OhvT+i74jhSB5Uu2xZwZblhVi7MPjLlgMaiIwcORKXXXYZUlNTW7T/xIkTMXny5EA2iUKc3R4LSRZRXe2CLIswmUze4ZiT1dwO/PvfKw1oZfiym82QBAGq1vSqfVXTIQkC7GYzXEpk9Tj5u4bMmoWLccnggd56HfUZ0dVNzYv2z61sWzHKthXj47+9ZnitmYANzfzxj3/EG2+8gT//+c9wuVwteszUqVPRvn1779a1a9dANY9CVO1yS10Hjh+vBKDDZDLVmbBaG4T89lsVVq0KbJ6BSONwu6FoGkTB1OR+omCComlwRNiVYCCEYlc3NY+fWw3F7Ubl0WOG9voErEekV69eOOuss7Bp06bfDyZJuPLKK/HQQw/BYrFAq9c97Ha74eYPX1Q7ebmlw+GEoqiwWmMQE2M+aQlvTWC74MNVHJbxkUtRsbRkD0YkJTS5nyQI+M/2nREzLBNoodbV3ZRQqLYaKsLpc4tkAcus2q5dO8TFxdW5bd68edixYwemTZuGbduav5JlZtXolJoaj88KnjtRpOz3YQFBMEHT9BPLLVWkp01iDpFWSOnaGUvvuBVyIxNW7RYzPKqKG/P+EzH5RIIpVE/00ZbK3Feh+rmFK1/O30FN8V5YWIjvvvsO48ePb9H+DESi1+jRgzB9RibTuwfIHT2649X0QTCLIhRNg6rpEAUTJEGAW1XxeEEh/rV5u9HNJD+JtlTmZDymeKewl5dXiOLin5CVlYahw/pClkW43SqWLF6NnJxl7Alpo39t3o7iX4/gvpRLMTTxQkiCAI+m4T/bd2JO0Rb2hESQ1qQyZ+8ABROL3lHIs1hkvy23pFNFcq0ZAjKem4ieadc0msocAGJsNnxb8AXWfrSYwzfkFyE7NOMrBiJERK3nS7VVQRCgqSqHb8gvfDl/B63WDBERBVdLU5mbTIDFGgtRrikC56muhuLxwFNdjerKSgiSiOFPjsM5SRcHqeUUTRiIEBFFqJamMpctFsBkajSVuavSCVGS0HfE8AC0kqIdAxEiogjV4mqrkgzVozSYxbhWpFWipdDBQISIKIK1pNoqoMNT3XQG7EisREuhgYEIEVEEa0kqc5ezCnoz6xYisRIthQYGIkREEW5j/mfIGTsO3xZ8AU1RYBIEaIqCbwu+QM7Ycdj8+ZfND9+IIrYWrmJeEfI7JjQjIooCTVZbXWiK6kq0ZCz2iBARRZGGqq2yEi0ZiT0iRETESrRkGGZWJSLyk0hJl89aM9RWLHpHRBREKV07IzOlB25K6AZJEKBoGpaW7EHOhs1hWUBQcbsZgFDQcI4IEVEbjO6RhKV33IoRSQmQBQGapkMWBIxISsAno2/FHT26G91EopDGQISIQobFIqNjx/awWGSjm9IiKV0745X0gZBFERUuN5weBS5VhdOjoMLlhiyKeDV9EHp16Wx0U4lCFgMRIjJcamo8cudko7R0Hkp2zkZp6TzkzslGSkq80U1rUmZKD5hFEQ5Xw8MYDpcbZlHEfSmXBrllROGDgQgRGWrMmKvxWcFzyMgYANksQtM0yGYRGRkDULDsOYwePcjoJjbIIom4KaEbFE1rcj9F0zA08UJYpKYThhFFKwYiRGSY1NR4vD79PsiyCIfDCafTBZfLA6fTBYfDCVkWMX1GZkj2jNjNZkiCAFVreuGhqumQBAF2FosjahADESIyTNbYdMiyBIejqsH7HY4qyLKErKy0ILeseQ63G4qmQRRMTe4nCiYomgYHV6EQNYiBCBEZwmKRMXRIH6hq0/k2VFXF0GF9Q24Cq0tRsbRkDySh6Z9RSRCwZMfusM4rQhRIDESIyBB2eywkWYSqNj3HQlU1yLIIuz02SC1rudyizXCrKuyWhodd7BYz3KqKOUVbgtamcFt55KtIf33RiAnNiMgQDkcVFI8K2dxc1VcBbrfa6PCNkYr2/4LHCwrxavogtLeYoWgaVE2HKJggCQLcqorHCwqDktQsNTUeWWPTMXRIH0iyCMWjYkn+OsyeVYCiol0BP36gRfrri2bsESEiQ7hcHizJX9ei8vNLFq+Fy+UJUst886/N23Fj3n/w4dYd8GgaBMEEj6bhw607cGPef/CvzdsD3oZwXXnUUpH++qIda80QkWFSU+PxWcFzJ1bNnNrjYbfHwuNRkZ42KSyueo2oNRNp72F9kf76IpUv52/2iBCRYTZs2IXx43Lh8aiw262wWi2wWGRYrRbY7VZ4PCrGj8sNmxOMS1FR7qwK6sTUcF551BKR/vqIPSJEFAJSUuKRlZWGocP6QpZFeDwqlixei5ycZWEThBjBYpFRWjoPslmE0+lqdD+r1QK3W0XcuXeH7BBXQyL99UUyVt8lorBSVLQLRUW7kJ09G3Z7LByOKp5QWqA1K4/C6X2N9NdHNRiIEFHIcLk8PJH4IBJWHjUl0l8f1eAcESKiMBUpK48aE+mvj2owECEiCmM5swvg8SiNJnyrWVWiICdnWauPYWQSsWC8PjIWAxEiojAWyJVHqanxyJ2TjdLSeSjZORulpfOQOyc7qEUII21lFZ2Kq2aIiCKAv1cejRlz9YnKyBJUVYWqahBFAaIowuNRMH5cLvLyCgPwShrGlVXhxZfzNwMRCiqLReaqCKIA8sffWCgnEeNvSHjg8l0KOawT0Tb88aWW8sfKo9+TiDkbvN/hqILdbkVWVlrQ/365sqp54fZ7wR4RCrhQ6+INFxaLjCuvTMLto67CjTekMoCjoGASsfAVShd8HJqhkBHKXbyhqvbHZMSI/mjXrmalgMejoKqq5qQQjAAu3K6oyH86dmyPkp2zoWlak5+9xSJDEAQkXDQW5eUVLX5+frcCI9Qu+Dg0QyEjlLt4Q1Htj0lMjBkxMTJqrxNkWYIsizh+vBIOhxN2eyymz8hEcfFPfn3fQumKiowRqCRi/G4FTmpq/IkgRGzwtzZQvxf+EtDlu0899RTWr1+PiooKHDx4EB9//DEuuuiiQB6SQojFImPokD5Q1aYLgKmqiqHD+hqSoyCUnPxjous6ABN0HSe2mv936GDz9i75u9AXS60TEJgkYvxuBVa4FwYMaCBy1VVXYebMmejbty+uvfZayLKMzz//HFarNZCHpRDRmjoR0az2x+Q3RzViYsyoP2paG4xYrTEA/BvA1b+icjpdcLk8cDpdcDickGUR02dkBjV/BBnHn0nE+N0KrEi44AtoIHL99dfj3Xffxfbt27FlyxbcddddiIuLQ69evQJ5WAoRtV28otj010wUBXg80V0n4uQfE5NggsnU2J76iSDFvwFcuF9RkX/5M4kYv1uBFQkXfEHNrNqhQwcAwJEjRxq832w2w26319kofLFORMud/GOiazr0RqaQ6zpgMuHEJDT/BHCRcEVF/peXV4j0tEn48IOVcLtVCELNnJAPP1iJ9LRJLZr4yO9W4EXCBV/QAhGTyYQZM2bg//7v/7Bt27YG95k4cSIqKiq82/79+4PVPAoQ1olomZN/THToqK52o2ZRW12CYILJZMKZZ3ZA+/Y2HD3iwCWXnNemY0fCFRUFRlHRLmRlvYW4c+9GwkVjEXfu3cjKeqvFEx753Qq8SLjgC1ogMnPmTCQnJ+NPf/pTo/tMnToV7du3925du3YNVvMoQFgnomXq/5jU5G/QvUM0JlNNEALgpN4SHeece2abJ/tFwhUVBZbL5UF5eYXPJzF+t4Ij3C/4ghKIvPnmm7jpppswaNCgJns53G43HA5HnY3Cnz+6eKPByT8mHo+C48drluGZTDW9IPUdP+7EsWO/tXmyXyRcUVFo4ncrOML9gi/gCc3efPNN3HzzzRg4cCB2797t02OZ0CzyMJlR00aPHoTpMzK9SYkAE+z22JN6Q3RUVbnhdLrg8Sjex9ntVnz4wUpkZb3VquMy8RwFCr9bwRNKhQFDJrPqzJkzMWrUKAwbNgwlJSXe248fP47q6upmH89AhKJR/R+TDh1qrmh++60KbpcCvYE/WX+k264fBBmdmZEiB79bwRUKF3whE4jojUz9v+uuu/Duu+82+3gGIhTNLBYZ553XCd+seTVg6bbrC6UrKoos/G5Fl5AJRNqKgQhFO6MKkIXCFRVFJn63ooMv5++g5hGhxlksMjp2bM919FSHUZP9WrtKgqg5/G5RfQxEDJaaGo/cOdkoLZ2Hkp2zUVo6D7lzspnumLzCfWkeEVFTGIgYiIWgqCXCfWkeEVFTOEfEIFzSRr7iZD8iChe+nL+lILWJ6vm9EJSzwfsdjirY7VZkZaXxJEMAatJtFxXtQnb2bE72MwAnWRIFBodmDMBCUNQWnOwXXJzHRRRYDEQMwEJQzZNkM6ztT4ckm41uCkUxzuMiCjwOzRigthCUbG5uSWZNTZZoKgTVNT4ZKWm3IaH3QAiiBE1VULJ+BTYULMSB3Q1XbSZqSmuHVFJT4/H69PtOzOM6dQjVbo/F9BmZKC7+icOnRG3AHhEDsBBUw3oMGoo7Jr2NpP5pECQJmqZCkCQk9U/D6Mmz0GPQEKObSGGkrUMqv8/javhCwOGogixLyMpK82eziaIOAxGDMDdEXV3jk5F+7wSIkgRXVSU8rmqoigceVzVcVZUQJQnp9z6BLhcmGd1UCgNtHVLhPC6i4GEgYhDmhqgrJe02bxDSkNpgJCXttiC3jMJN/SEVp9MFl8sDp9MFh8MJWRYxfUZmkz0jnMdFFDwMRAyUl1eI9LRJ+PCDlXC7VQhCzZyQDz9YifS0SVFTjVKSzUjoPRCa1vTVp6apSOwziBNYqUn+GFKpncclik3/RIqiAI8nuuZxEfkbJ6sajLkhAHOs7cTE1GYCEVWDIEowx9qgeNxBah2FE1+HVLKzZzf491Y7jysjY0CTz1Mzj2t11P3NEvkTe0RCRDTnhnBXVUJTFQjNTN4VRAGaqsDdyPANkT+HVDiPiyg4GIiQ4RSPGyXrV0AQmglEBBE71hWyNyTCSWYzbKefBsns+xCcP4dUOI+LKDg4NBNlQjVNddGyj5DYdzAssbYGJ6xaYm1QFQVFyz5q03FC9fUTcE5yd/QbMQxJAwdAkERoioptK1ZhzYJFKNtW3KLn8PeQSl5eIYqLf6pT48ftVrFk8WrW+CHyExa9ixKpqfHIGpuOoUP6QJJFKB4VS/LXYfasgpD5Me0xaAjS730C4okcIjVzQgQIgghVUVAw92VsLsxv1XOHw+uPZilDb8CwJx6BKElQVRW6qsIkihDFms9+0bQZ2Jj/WYueK1AFJRnEErWcL+dvBiJRYMyYq08sZ6z5kVdVDaIoQBRFeDwKxo/LDZkVOl0uTEJK2m1I7DPIm1l1x7pCFC37qNWZVcPp9Uejc5K7I2vWdAiSCFflqRlMLTYrNEVFzthxLe4ZGT16EKbPyORnTiEhGoNYBiLkFairw0CTZDPMsTa4qyrbNCckXF9/NMl4biJ6pl2D6srGJyHH2Gz4tuALLJw8tcXPm5ISX2dIxeNRsWTxWg6pUNBEc08sAxHyyp2TjYyMAd5aGYJggqbV/cjtdis+/GAlsrLeMqKJAVX/9Tckkl9/qJPMZjy7fBEESYKnurrR/eSYGGiKguevHQ7F7VtgGo1Xo2S8aO+J9eX8zVUzEaw2pwKgo0MHG84663R06nQazjrrdHToYIMs16xSidQ01UzT3TSLRUbHju0Nfd0WmxWCJEJv5jPSNRWCJMJis/p8jGheGt+QUPjcI50/svtGE66aiWB2eyysNgtiY82o7fzSdcBkAmJja24/fryyTk6FSPqxbk1OiUh4/c31AIRSd7Gr0glNqSluCE/j771JEKEpSoNzSKhlQulzj3S/Z/dt+PvqcFTBbrciKyuN7z3YIxLREhK6IjbWDJPJBF2vCUIAQNcBXdcBmNChgw1msxSRaaqjLU13S6rNtrUYnL8pbje2rVjVokrUWwtX+TwsQzVC7XNviXDtuWFPrO8YiESwu+6+BqqqeQOQ+mqDEYvFjCWL10ZEb8DJanNKtOQkF+6vvyUnmlDtLl6zcDFURWl02MVis0JVFKxduCio7YoUofq5N6YlAXUoY8FE3zEQiVC1UXl1tRuADpOpsT11SJKAd975MoitC55oSNPd0hPNX57OaHMxuEAo27odi6bNgKaoiLHZIMfEQDLLkGNiEGOzQVNULJo2o8VLdyOBP3sD/FEEMFjCseemvmjrifUHBiIRqjYqd7sVHD9eM05pMplgMuGkrSY6qapyY+fO/UY2N2CiIU13S0801113Wch2F2/M/ww5Y8fh24IvoCkKTIIATVHwbcEXyBk7rsXJzMKdv3sDwmmYINx6bhoTTT2x/sLJqhGqNiqXzSKcThcURYXVakFMjBkmU808kepqFzRNQ1WVJ6Kj8khO093SE42mqbBYLHA6G18iCxg7cbdsWzHKthXj47+9BovNClelM6rmhDS03LO2N+Dmm/u1arlnOE3YjqQJnjmzC3Dzzf28k8bri4SeWH9iIBKh6tfc8HgUHD+uoOK4EybBBF3ToUOH3W6Niqi8qGgXiop2ITt7dkTllGjpiUZRau6XJLHJ1y2KAtxuY7uLFbc7qgIQ4NTegPrs9lhMn5GJ4uKffDoJn3xB0hSjP3dfe26ys2eH9N9vbU/s9BmZsNutjeYRCfWAKlg4NBPBGpofoUOHpmkngpDoi8ojLaeEL+PRLpfSgv3YXWyEQM3jaMswQTBXrUTiBM+8vEKkp03Chx+shNutQhBqgr0PP1iJ9LRJEZ3MzFcMRCJYNMyPiHa+nGg+X7YJbndkT9wNR4Gex+HrhG0jVq1E6gTPoqJdyMp6C3Hn3o2Ei8Yi7ty7kZX1Fn9z62EgEuEYlUe+lp5oXnxxAQPTEBTo3gBfLkiMWrUS6RM8I60n1t9YayaKsOZG5PKl2iyLwQVfU397FouM0tJ53onljbFaLXC7VcSde3er/n6b+9yNLhBp9PHJv1j0jigK+RpghFNgGk5tPVlL06oHszhjY+9lKBSI9CWgptDGQIQoioXrSbsh4VwfxZfqq0b3BgSrV6Yl2GMXGRiIEFHYC+cy6q0JLIzsDejYsT1Kds6GpmlNBhgWiwxBEJBw0ViUl1cEpC0nHytSAupo5Mv5m5NViSjkhHuWzdYsxzVyYnkorlrhBM/oEZRA5MEHH8QPP/yAqqoqrF27FqmpqcE4LBGFqXCqj1JfW5bjGrXcM9JXrVBoC3ggkpGRgddffx3PPfccLrvsMmzevBnLli3DmWeeGehDE1EYCqf6KA3xx3JcI3oDoqFAJIWmgAcijz76KHJzc/HOO++guLgY999/P5xOJ+65555AH5qIwlC4Z9kMxWGOlmACRDJKQAMRWZbRq1cvfPHFF97bdF3HF198gX79+p2yv9lsht1ur7MRUXQJ1xN5rXAe5mACRDJCQIvedezYEZIk4eDBg3VuP3jwIBITE0/Zf+LEiZg8eXIgm0REIa5+wcbG1JzIV4fUibxWOFdfjdQCkRS6QmrVzNSpU9G+fXvv1rVrV6ObREQ+8kextHCfrxCuwxwnf3ZctULBEtAekfLyciiKgrPOOqvO7WeddRZ++eWXU/Z3u91wR1n5bwovvuY2iKZcCP5MPhYJZdTz8gpRXPxTneRcbreKJYtXh1xyrnBOHEfhL+AJzdauXYv169fj4YcfrjmgyYTS0lK89dZbmDZtWpOPZUIzChW+/lBH2w97oJKPRUqWzVAOSMM5cRyFrpDKrJqRkYF3330XY8eOxfr16zFu3DhkZGQgMTERhw4davKxDEQoFPj6Qx1tP+zBSE8eyifycGZ0anmKXL6cvwM6NAMACxYswJlnnokpU6agc+fO+O6775Cent5sEELkb605mdXP8Fmf3R6L6TMyUVz8k7eCqS/7R4Lfk481XCzN4aiC3W5FVlZaq1+zy+VhABIAwfjsiJoTlMmqM2fOxHnnnYeYmBj07dsX69evD8ZhiQDUBBO5c7JRWjoPJTtno7R0HnLnZLcoPbivGT7DOSNoa4R78rFoxs+OQkVIrZoh8rcxY67GZwXPISNjAGSzCE3TIJtFZGQMQMGy5zB69KBGH+vrD3X79tao+2EP9+Rj0YyfHYUKBiIUsdpaOM3XH+qzzz496n7Ywz35WDSLtM/OH8vGyRgMRChitXWYxNcf6p9/PhpRP+wtEc5ZRKNdpHx2bRl6pdAQtYGIJJthbX86JNlsdFMoAPwx/u3rD3VFhTMifth9Fe7Jx6JZuH92bRl6pdARdYFI1/hkDHtoMh6d+zkefjsfj879HMMemowuFyYZ3TTyI3+Nf/v6Qx3uP+ytEa5ZRCm8P7u2Dr1S6IiqQKTHoKG4Y9LbSOqfBkGSoGkqBElCUv80jJ48Cz0GDTG6ieQn/hr/9vWHOpx/2NuCxdKM09a5EeH62UXbCrVIFvCEZm3hz4RmXeOTccektyFKElxVlafcb4m1QVUU5E2+Hwd2b2vTsSg05M7JRkbGgEZzJACA3W7Fhx+sRFbWW00+l68ZPiMlI2hrMPlYcAQie2+4fHYWi4zS0nmQzSKcTlej+1mtFrjdKuLOvTukX08kCqnMqm3hz0Bk2EOTkdQ/rcEgpJYl1oatqwqwZOZzbToWhYZAZI0M11ozgWxHqLzGaBJt2Xvr69ixPUp2zoamaU1+5ywWGYIgIOGisSgvrwhiC8mX83dUDM1IshkJvQdC05qeuKhpKhL7DOIE1ggRiGESXyuSGl3BNJArCrhawXf+WGLKuRGRt/Q42kVFIGKOtUEQJWjNrKDQVA2CKMEcawtSyyjQwnX82x8CuaKAqxV848+gjXMjImfpMdWIiqEZSTbj0bmfQ5AkeFzVje4nW2KgKQpev/c6KB53q49HNSSzGRabFa5KJxS38e9nNA0hBLKYGQul+cafwyicG/E7fg9DG4dm6lE8bpSsXwFBaDp6FgQRO9YVMghpo3OSuyPjuYl4dvkiPLX0Qzy7fBEynpuIc5IuNrRdRg+TBFMgr5p5Rd5y/h5GYVr230XrCrVIFBWBCAAULfsIqqLA0siwS+2qmaJlHwW5ZZElZegNyJo1HT3TroEgSdBVDYIkoWfaNciaPQO9hlxvdBMjXiCLmbFQmm/8HbRxbkRd0Tz0GkmiJhDZv2srCua+7A1GZEsMRMkM2RLjDUIK5r7MpbttcE5ydwx74hEIkojqykp4qquheDzwVFejurISgiRi+JPjDO8ZiXSBvGrmFXnLBSJo49yIUxUV7UJW1luIO/duJFw0FnHn3o2srLfYExJGoiYQAYDNhfnIm3w/tq4qgKYoEAQBmqJg66oC5E2+H5sL841uYtiyWGRcd+etMMsiXJUN5+1wVTohShL6jhge3MZFmUBeNUfzFbmvK14CFbRFY/beloimoddIIxndgGA7sHsbluzehk9zpsIca4O7qpJzQtrAm1RpaB+0O60DNFSh5FegaD9woIH5SaqqInnQAHz8t9dCYgJrJKq9as7IGNDkfjVXzat9+uEO5HO3VLAnHbc2cVht0Cabm+u9qBlOaGnQVjs3YvqMTNjt1kYnwLJHgMJFVPWInEzxuOGsOMogpA3qLOGUJegARABJnYDRPYEenU99jK6pECQRFps1yK2NLoG8ajbqityIvCVtWaYcyGEUzo2gSBIVy3fJ/05dOmeC/Q9nnPhG6TCLgKYDed/V7RmRY2qWSD9/7XD2iATY6NGDMH1GZkCybwbyuRtiRCZRfywPDcYS02halh6pIvEz5PJdCrhTVwPo8LjdqIlEALcKCCagV9e6jxNFEVsLVzEICYJAXjUH84rcqEyi/ljxEowlpqE+N8If2WQjFbMT12CPCPmssaRKoiTDelr7mv/oOmQBUHVg+jeAogEWmxWaoiJn7DiUbSs2qPXRKZxrzfizeGFL+TtxWDQWQQxEUb5IEun1glj0jgKqqYJTsiUGMXYbABNEkw6TCZi1yQyXLkFVFCyaNgMb8z8zpuEUdozKJBqoomqR2AXfkEg/ybZVNGSF9eX8HXWrZqjtmloN4HFVQ1NVyLExkGPMUHWgyqVg81crsHbhIvaEtFC0nLCa05olsP54vwK14sXl8kT851l/KK0+uz0W02dkorj4p7A9ybbV78N+DffyORxVsNutyMpKi4r3iHNEyGfNrQZQFQ+qHQ4orios/PcKTL7mZiycPJVBSAtwzLguo/KWGJk4LNznVLAEQNOYnfhUDESoVVqyhNPtVvCPN5dwYmoLsaLtqYwMCIK9TDkSglCeZJvH7MSnYiBCrcKCU/5l1MqQcGBU3pJgfscjJQjlSbZ50ZyduDEMRKjVmFTJf9id3Tgjg95gfMcjKQjlSbZ5rBd0Kq6aIb/g5MrWM2plSLgxeglsoL7jRixPDqRIez2BwFUzdTEQITJYoJaKRqpICnojMQiNhpOsPwQ7O3GwMbMqURhhd7ZvQj2TqC8icU4F54+1DIe2f8c8IkQGC4WKtmSMQOUrMVpeXiGKi3+qM5TmdqtYsnh1RGeT9VVR0S4UFe1CdvbsiOnlaw0GIhQRwr27Pmd2AW6+uZ/3NdQXqJUhZKxIDkJ5km25aEh01xQOzVBYi4TcCwC7s6OZUcuTgyWShtIoMDhZlcJWJNazMHplCBkj0icuUvThqhmKeJE+Mz/ch5rIdwxCKZKw6B1FvEgvGhXtY8bRiHMqKFpxjgiFHdazoEjGORUUbQIWiMTFxWHOnDnYu3cvnE4ndu/ejcmTJ0OWeVKgtonE3AtERNEqYEMziYmJEAQBY8eOxe7du5GcnIzc3FzYbDZMmDAhUIelKBCpuReIiKJRwHpEli1bhnvuuQfLly/HDz/8gPz8fLz66qu45ZZbAnVIihIsGkVEFDmCOkekQ4cOOHLkSKP3m81m2O32Ols0sVhkdOzYnnMaWiDScy9Q8/j3QhQZghaIdOvWDdnZ2Zg9e3aj+0ycOBEVFRXebf/+/cFqnqEiJSlXMDEBWPTi3wtRZPE5j8jUqVPx1FNPNblPYmIiSkpKvP/v0qULvv76a6xYsQKZmZmNPs5sNsNisXj/b7fbsX///ojOIxKJSbmCibkXogv/XojCQ0ATmnXs2BF/+MMfmtxn79698HhqxuXPPvtsrFixAmvXrsVdd90FXW/54SI9oVmkJ+UKJiYAa71wee/49xLaLJIIu9kMh9sNl9L00nqKfAFNaFZeXo7y8vIW7dulSxcUFhZi48aNuPvuu30KQqJBpCflCiYmAPNdamo8ssamY+iQPpBkEYpHxZL8dZg9qyAkv2/8ewlNKV07IzOlB25K6AZJEKBoGpaW7EHOhs3YeOAXo5tHYSBgKd67dOmCFStWYN++fbjzzjvrJJ86ePBgi54jkntELBYZpaXzIJtFOJ2uRvezWi1wu1XEnXs3T7TkN+E2xMG/l9A0ukcSXkkfCLMoQtE0qJoOUTBBEgS4VRWPFxTiX5u3G91MMkBIpHi/9tprER8fj/j4+FMmnZpMpkAdNmy0JikXf1jJH1JT408EIWKDvQt2eyymz8hEcfFPIdOzwL+X0JPStTNeSR8IWRRR4XL/fseJa067xYxX0weh+Ncj7BmhJgVs1cy7774Lk8nU4Ea/J+USxaY/AlEU4PEwKRf5z+9DHA1/pxyOKsiyhKystCC3rHH8ewk9mSk9YBZFOE4OQk7icLlhFkXcl3JpkFtG4Ya1ZgzCpFxkhHCt08O/l9BikUTclNANitZ0D5WiaRiaeCEsUtOfG0U3BiIGYlIuCrZwrtPDv5fQYTebIQkCVK3pKYaqpkMSBNjN5iC1jMIRAxEDMSkXBVs4D3Hw7yV0ONxuKJoGUWh6qF0UTFA0DQ53w8M3RAADEcPl5RUiPW0SPvxgJdxuFYJQU6jtww9WIj1tUkitXKDwF+5DHPx7CQ0uRcXSkj2QhKZPIZIgYMmO3cwrQk0K2PJdf4jk5bsNCZfEUhTeIiUxGP9ejJXStTOW3nEr5EYmrNotZnhUFTfm/YerZqKQL+dv9oiEEJfLg/LyCv6oUkBFyhAH/16MVbT/FzxeUAiPqqK9xQyrLMEiirDKEtqfCEIeLyhkEELNYo8IUQTxpZeAdXrIH3p16Yz7Ui7F0MQLvZlVl+zYjTlFWxiERLGA1poJJgYiRC3TlnTtHOIgf2CtGToZAxGiKBJu6dqJKPJxjghRlKifrr262g2XywOn0wWHwwlZFjF9RiZSUuKNbioRUYMYiBCFsayx6bBYZAiCgLPOOh2dOp2Gs846HR062LyrYkItXTsR0ckYiFBQWSwyOnZsHzKpw8OZxSJjxIj+iI21IDbWApMJ0HXAZAJiYy34wx/aIzbWHHLp2kMNv5NExgpY9V2ik7VlMiU17Mork9CuXSxMJkA7KdW2rgOADpPJhA4dbKiocLIibQP4nSQKDewRoYCyWGT87//eiM8KnkNGxgDIZhGapkE2i8jIGICCZc9h9OhBRjczLN1++1UAAF1veL55ze0mxMZaQi5du9HGjLna799J9qwQtQ57RCggaq82b7n5cnQ4zQYAqKpyobpahcejePez22MxfUYmiot/4lWoDywWGTfemAqPR4EsS2h88ZsOWZbwydL17A05of4E3/p8/U6yZ4WobdgjQn538tWm1VYzdwHQT8xbsCM21uLdl5MpW6e2im5VlRs1wzBN7//vf68MSrvCQdbYdMiy1GgPkS/fyUD0rBBFGwYi5Ff1rzYlSYSu69D134cQOnSwnriKr8HJlL6rraIL6Dh+vOaq3mQywWTCSVtNdPLbb1VYtWqbga0NHRaLjKFD+kBVm0641ZLvZP3vutPp4tJpolZgIEJ+dfLVpiCYvCs5atX82wSr9fdeEVXVvJMpqWVOrqJbVeXC4cMOVFW5vO+1rtcOhXmw4MNVHJY5obYnSVW1JvdryXfSnz0rRNGMgQj5Tf2rTU3TvctJ69IRE2OGCTV3iKLAyZStkDO7AB6PcqJaroLjxytx6OAxHDp0HIcOHoOmaaiudiMnZ5nRTQ0ZtT1Jotj0T19z30l/9qwQRTsGIuQ3DV1tVle7AZw6gcFkAkxCbSAiYsnitbxq91FDVXTNFgkxMTLa2WPDpopuMJ3ck9SU5r6T/uxZIYp2DETIbxq62nQ6XajNaXEyXQd0TfdezfOqvXXy8gqRnjYJH36wEm63CkEQ4Har+PCDlUhPm8QaMw04uSepIS35TvqrZ4WIGIiQHzV0tVk7ZFAbjNTEIyYoisqrdj8pKtqFrKy3EHfu3Ui4aCzizr0bWVlv8T1tREM9SRaLDKvVArvd2qLvpL96VoiIgQj5WUNXm1VVbhw+XIGqKhdqh2mcThev2v3M5fKgvLyCJ70W8EdPkj96Voio5qzQWCYkw/lSRphCx+jRgzB9RmajZen/+uy/MHfucp4wKSRYLDLs9lg4HFU+fyeb+66PH5fLQNvP2vJ5UfD4cv5mIEIBkZISj6ysNAwd1heyLMLjUbFk8Vrk5CzjkAFFFH7Xg4MZbMMLAxEKGbx6oWjB73rgjBlz9Ynkcex5Che+nL9Za4YCyuXy8EeZogK/64Hh79pAFHo4WZWIiEIWM9hGPgYiREQUkpjBNjowECEiopDEDLbRgYEIERGFJGawjQ4MRIiIKCQxg210YCBCREQhixlsIx8DESIiCln+qA1EoY15RIiIKKTl5RWiuPinOhls3W4VSxavZgbbCMDMqkQhjNk6ieri30R48OX8HZShGbPZjG+//Ra6rqNHjx7BOCRRWEtNjUfunGyUls5Dyc7ZKC2dh9w52UhJiTe6aUSGYpXpyBOUQOTll1/GgQMHgnEoorA3ZszV+KzgOWRkDIBsFqFpGmSziIyMAShY9hxGjx5kdBOJiPwm4IFIeno6rrvuOjz++OOBPhRR2KtfV8PpdMHl8sDpdMHhcEKWRUyfkcmeESKKGAENRDp16oTc3FyMHj0aTuepxYrqM5vNsNvtdTaiaMK6GkQUbQIaiLzzzjuYNWsWNm7c2KL9J06ciIqKCu+2f//+QDaPKKSwrgYRRSOfA5GpU6dC1/Umt4SEBGRnZ8Nut2Pq1Kk+PXf79u29W9euXX1tHlHYYl0NIopGPucRee211/DOO+80uc/evXtx9dVXo1+/fnC5XHXuKyoqwvz583HXXXed8ji32w232+1rk4giQm1dDdncXDprAW4362oQUWTwORApLy9HeXl5s/s9/PDDeOaZZ7z/79KlCz7//HOMHDkS69at8/WwRBGvtq5GRsaAJverqauxmssXiSgiBCyzallZWZ3///bbbwCAPXv2cO4HUSNyZhfg5pv7eRM21ce6GkQUaVhrhiiEsK4GEUWboNWa2bdvH0wmU7AORxS2WFeDiKIJa80QhTDW1SCicOTL+ZvVd4lCmMvlYQBCRBGNc0SIiIjIMAxEiIiIyDAMRIiIiMgwDESIiIjIMAxEiIiIyDAMRIiIiMgwDESIiIjIMAxEiIiIyDAMRIiIiMgwDESIiIjIMAxEiIiIyDAMRIiIiMgwDESIiIjIMAxEiIiIyDAMRIiIiMgwDESIiIjIMAxEiIiIyDAMRIiIiMgwktENICLyhUUSYTeb4XC7AcD7b5eiGtwyImoNBiJEFBZSunZGZkoP3JTQDRZRhCyKAACPpsKlqFhasgc5GzZj44FfDG4pEfmCgQgRhbzRPZLwSvpAmEURJhMQK8swAdABWHQRkknBiKQEDEu8EI8XFOJfm7cb3WQiaiHOESGikJbStTNeSR8IWRRR5VEQK8kAAE3Xoes6YAJiJAlVigJZFPFq+iD06tLZ4FYTUUsxECGikJaZ0gNmUYTD5YbVLAMm1AQgJ9QGI1ZZhsPlhlkUcV/KpQa2mIh8wUCEiEKWRRJxU0I3KJoGAIiRROCkIORkMVLNsI2iaRiaeCEskhjMphJRKzEQIaKQZTebIQkCVE2HYAJMMKHBMEQHTCYTTDBB1XRIggC72Rzs5hJRKzAQIaKQ5XC7oWgaRMEETQd06DA1tOOJ4RodOkTBBEXTvMt7iSi0MRAhopBVuyxXEmp+qqoVFTA1GIqgWlGh64AkCFiyYzfzihCFCQYiRBTScos2w62qsFvMcLo93mGYWiaTCdABp8cDu8UMt6piTtEWA1tMRL5gIEJEIa1o/y94vKAQHlVFrCyhSvEAAASTyRuEVCsKYiUJHlXF4wWFTGpGFEaY0IyIQt6/Nm9H8a9HcF/KpRiaeCFUTT8ls+qSHbsxp2gLgxCiMFObnDAk2e12VFRUoH379nA4HEY3h4hCAGvNEIU+X87f7BEhorDiUlS4lKqT/l/VxN5EFOo4R4SIiIgMw0CEiIiIDBPQQOSGG27A2rVr4XQ6ceTIEXz88ceBPBwRERGFmYDNEbnllluQm5uLv/zlL/jqq68gSRKSk5MDdTgiIiIKU7q/N1EU9bKyMv2ee+5p0/PY7XZd13Xdbrf7vY3cuHHjxo0bt8Bsvpy/AzI0c9lll+GPf/wjNE3Dpk2bcODAAXz66adISkpq8nFmsxl2u73ORkRERJErIIHIBRdcAACYPHkyXnjhBdx00004evQoVqxYgdNPP73Rx02cOBEVFRXebf/+/YFoHhEREYWQFne1TJ06VW9OQkKCfvvtt+u6ruuZmZnex5rNZv3QoUN6VlZWo89vNpt1u93u3bp06cKhGW7cuHHjxi3MNl+GZnyarPraa6/hnXfeaXKfvXv34uyzzwYAbN++3Xu72+3G3r17ce655zb6WLfbDXcDpbs5RENERBQ+fDlv+xSIlJeXo7y8vNn9Nm7ciOrqaiQkJGD16tU1B5IknHfeedi3b1+Lj1f7QjhEQ0REFH7sdrsxKd4dDgdmzZqF5557DmVlZdi3bx8mTJgAAFi4cGGLn+fAgQPo2rVrRNSZsdvt2L9/f8S8nmDj+9d2fA/bju9h2/E9bJtwev/sdjsOHDjQ7H4ByyMyYcIEKIqCvLw8xMbGYt26dbj66qtx7Ngxn56nJS8inDgcjpD/8oQyvn9tx/ew7fgeth3fw7YJh/evpe0LWCCiKAomTJjg7QkhIiIiqo+1ZoiIiMgwDESCxOVyYfLkyXC5XEY3JSzx/Ws7vodtx/ew7fgetk0kvn8m1KzjJSIiIgo69ogQERGRYRiIEBERkWEYiBAREZFhGIgQERGRYRiIBFlcXBzmzJmDvXv3wul0Yvfu3Zg8eTJkWTa6aSHtwQcfxA8//ICqqiqsXbsWqampRjcpbDz11FNYv349KioqcPDgQXz88ce46KKLjG5W2HryySeh6zqmT59udFPCSpcuXZCXl4fy8nI4nU5s2bIFvXr1MrpZYUMQBEyZMqXOueOZZ54xull+Y3iVvmja0tLS9H/+85/6tddeq59//vn6kCFD9F9++UV/5ZVXDG9bqG4ZGRl6dXW1ftddd+kXX3yxPnv2bP3IkSP6mWeeaXjbwmH77LPP9DvvvFPv3r27fumll+pLly7Vf/zxR91qtRretnDbUlJS9L179+rfffedPn36dMPbEy7baaedpv/www/6P//5Tz01NVU/77zz9GuvvVa/4IILDG9buGwTJ07Uf/31V/2GG27Q4+Li9FtvvVWvqKjQs7OzDW+bHzbDGxD12+OPP67v2bPH8HaE6rZ27Vr9zTff9P7fZDLpP/30k/7kk08a3rZw3Dp27Kjruq4PGDDA8LaE02az2fSSkhJ98ODBemFhIQMRH7apU6fqK1euNLwd4bzl5+frc+bMqXPbRx99pOfl5RnetrZuHJoJAR06dMCRI0eMbkZIkmUZvXr1whdffOG9Tdd1fPHFF+jXr5+BLQtfHTp0AAB+53w0c+ZMfPLJJ/jyyy+NbkrYGTp0KIqKirBgwQIcPHgQmzZtwn333Wd0s8LKN998g8GDByM+Ph4AcOmll6J///747LPPDG6ZfxgeDUXz1q1bN/3YsWP6fffdZ3hbQnE7++yzdV3X9b59+9a5fdq0afratWsNb1+4bSaTSc/Pz9dXrVpleFvCaRs5cqS+ZcsW3WKx6ADYI+LjVlVVpVdVVekvvvii3rNnTz0zM1N3Op36mDFjDG9buGwmk0mfOnWqrqqq7na7dVVV9aeeesrwdvlpM7wBEbFNnTpVb05CQkKdx3Tp0kXftWuXnpuba3j7Q3VjIOLf7R//+If+ww8/6F27djW8LeGy/fGPf9R/+eUX/ZJLLvHexkDEt83lcumrV6+uc9sbb7yhf/PNN4a3LVy2kSNH6qWlpfrIkSP15ORk/Y477tDLy8sjJZgzvAERsXXs2FFPSEhocpNl2bv/2WefrZeUlOjvvvuubjKZDG9/qG6yLOsej0cfNmxYndvfeecdfdGiRYa3L5y2N998Uy8tLdXPO+88w9sSTtuwYcN0Xdd1j8fj3XRd11VV1T0ejy4IguFtDPXtxx9/POWC6/7779d/+uknw9sWLltpaan+4IMP1rnt6aef1ouLiw1vW1s3CeQX5eXlKC8vb9G+Xbp0QWFhITZu3Ii7774buq4HuHXhy+PxYOPGjRg8eDAWL14MADCZTBg8eDDeeustg1sXPt58803cfPPNGDhwIH788UejmxNWvvzySyQnJ9e5bd68edixYwemTZsGTdMMaln4WL16NRISEurcdtFFF2Hfvn0GtSj8WK3WU75rqqpCECJjqqfh0VA0bV26dNF37typL1++XO/SpYt+1llneTej2xaqW0ZGhl5VVaWPGTNGT0xM1GfNmqUfOXJE79Spk+FtC4dt5syZ+tGjR/Urr7yyzvctJibG8LaF68ahGd+2lJQU3e126xMnTtS7deum33777fpvv/2mjxo1yvC2hcs2b948vayszLt8d/jw4fqhQ4f0l156yfC2+WEzvAFRtd15552NziExum2hvP3v//6v/uOPP+rV1dX62rVr9d69exvepnDZGnPnnXca3rZw3RiI+L7deOON+pYtW/Sqqip9+/btnKDv49auXTt9+vTp+o8//qg7nU599+7d+vPPP19nyD9cN9OJfxAREREFXWQMLhEREVFYYiBCREREhmEgQkRERIZhIEJERESGYSBCREREhmEgQkRERIZhIEJERESGYSBCREREhmEgQkRERIZhIEJERESGYSBCREREhmEgQkRERIb5fxEtE228BYovAAAAAElFTkSuQmCC", "text/plain": [ "
" ] @@ -153,13 +328,13 @@ "for label in set(labels):\n", " mask = labels == label\n", " cor_plots = plots[mask]\n", - " plt.scatter(cor_plots[:, 0], cor_plots[:, 1], s=50, alpha=0.9, label=label)\n", + " plt.scatter(cor_plots[:, 0], cor_plots[:, 1], s=50, alpha=0.9, label=engine.id2intent[label])\n", "plt.legend()" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -171,7 +346,7 @@ "LogisticRegression()" ] }, - "execution_count": 17, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -184,16 +359,16 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([4])" + "array([5])" ] }, - "execution_count": 18, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -206,28 +381,28 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "['../embedding_mapping.sklearn']" + "['../model/embedding_mapping.sklearn']" ] }, - "execution_count": 19, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import joblib\n", - "joblib.dump(log_model, '../embedding_mapping.sklearn')" + "joblib.dump(log_model, '../model/embedding_mapping.sklearn')" ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 11, "metadata": {}, "outputs": [], "source": [ @@ -236,16 +411,16 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([4])" + "array([5])" ] }, - "execution_count": 21, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -255,6 +430,55 @@ "test_embedding = model.embed_documents(test_sentence)\n", "log_model.predict(test_embedding)" ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
SVC()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" + ], + "text/plain": [ + "SVC()" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from sklearn.svm import SVC\n", + "\n", + "svm = SVC()\n", + "svm.fit(embedding, labels)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['../model/embedding_mapping.sklearn']" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# test_sentence = ['咖啡喝不了,喝了胃不舒服']\n", + "# test_embedding = model.embed_documents(test_sentence)\n", + "# svm.predict(test_embedding)\n", + "# joblib.dump(log_model, '../model/embedding_mapping.sklearn')" + ] } ], "metadata": { diff --git a/notebook/github-issue.ipynb b/notebook/github-issue.ipynb index ebf3a33..d52b114 100644 --- a/notebook/github-issue.ipynb +++ b/notebook/github-issue.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -16,7 +16,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -29,17 +29,26 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ + "titles = []\n", + "fail_ids = []\n", + "\n", "def crawler_issue(issue_id: str):\n", " folder = 'issue-' + str(issue_id)\n", " os.makedirs('../docs/digital-issue/' + folder, exist_ok=True)\n", - " res = r.get('https://github.com/Digital-EDA/Digital-IDE/issues/' + str(issue_id))\n", + " res = r.get('https://github.com/Digital-EDA/Digital-IDE/issues/' + str(issue_id), timeout=10)\n", " soup = BeautifulSoup(res.text, 'html.parser')\n", "\n", " texts = []\n", + " el = soup.find('bdi')\n", + " if isinstance(el, Tag):\n", + " title = el.text\n", + " titles.append(title)\n", + " texts.append('问题标题 '+ title)\n", + " \n", " for td in soup.find_all('td', attrs={ 'class': 'js-comment-body' }):\n", " if isinstance(td, Tag):\n", " for p in td.find_all('p'):\n", @@ -79,7 +88,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ @@ -98,13 +107,17 @@ " issue_ids.append(int(id))\n", " \n", " for issue_id in issue_ids:\n", - " print('爬取 issue-{} 中 ...'.format(issue_id))\n", - " crawler_issue(issue_id)" + " try:\n", + " print('爬取 issue-{} 中 ...'.format(issue_id))\n", + " crawler_issue(issue_id)\n", + " except Exception as e:\n", + " fail_ids.append(issue_id)\n", + " print('爬取 {} 失败'.format(issue_id))" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -116,61 +129,61 @@ "爬取 issue-69 中 ...\n", "爬取 issue-68 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-69/331220146-9deeccbf-cc0e-4810-bdd9-80e11d083c15.png\n", - "爬取 issue-67 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-69/331220242-9abe8b7b-5985-4c1a-ac0f-30aba75ef8d2.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-69/331219978-d22a5a5d-da00-430c-b966-68517ab264c0.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-69/331220080-b0c5f0af-e38c-4819-9efa-7491650ddb92.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-69/331220203-3bb8aefd-e04a-4eb7-ae87-ca48f1daa120.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-69/331220080-b0c5f0af-e38c-4819-9efa-7491650ddb92.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-69/331219978-d22a5a5d-da00-430c-b966-68517ab264c0.png\n", + "爬取 issue-67 中 ...\n", "爬取 issue-66 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-67/331660157-920d7143-f262-42d5-af57-a817bf3aee01.png\n", + "爬取 66 失败\n", "爬取 issue-65 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-67/331660157-920d7143-f262-42d5-af57-a817bf3aee01.png\n", "爬取 issue-64 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-66/330112198-fb783018-b217-4cab-afef-32d339c4047a.png\n", - "爬取 issue-63 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-65/328184842-2e13483e-4ece-4eb6-8c8a-3d9c92a97651.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-65/328185054-e08c66b2-7e87-4238-88cb-e0672b2de530.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-65/328184842-2e13483e-4ece-4eb6-8c8a-3d9c92a97651.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-65/328185191-305e8b86-a9de-434b-a1cf-80c441c51df2.png\n", + "爬取 issue-63 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-64/327033289-dc79968e-8279-43aa-b6a1-a6f1acd4155f.png\n", - "爬取 issue-62 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-64/327033187-1b9134e0-387e-491d-a478-3ea6438728a4.png\n", + "爬取 issue-62 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-63/326496750-53a0c779-8a4b-418d-b21c-4ea2151edd92.png\n", "爬取 issue-61 中 ...\n", "爬取 issue-60 中 ...\n", - "爬取 issue-55 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-61/325593801-bd5c4229-f47a-4d6e-99a1-0cc912378f0e.png\n", + "爬取 issue-55 中 ...\n", "爬取 issue-54 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-55/316435757-14c497a5-6ecc-4f97-850b-7e13988ec7aa.png\n", + "爬取 54 失败\n", "爬取 issue-53 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-54/306546248-83a57abe-63ff-43ae-8140-5e2b284193f0.png\n", "爬取 issue-52 中 ...\n", "爬取 issue-51 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-53/305870587-69d44e21-edfc-4fc0-9ad7-daaec393caac.png\n", "爬取 issue-50 中 ...\n", + "爬取 50 失败\n", "爬取 issue-49 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-51/302262263-3e5581e0-4e36-463b-9379-43d1f9e366b8.png\n", "爬取 issue-48 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-49/300495384-94077fee-624f-48cc-98fd-d6e6fe16251b.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-49/300495541-23556932-5526-4428-b1c2-25c840352422.png\n", "爬取 issue-47 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-49/300495384-94077fee-624f-48cc-98fd-d6e6fe16251b.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-49/300495316-f8c98f42-a320-4c4e-84f7-2aaab4fb39f1.png\n", "爬取 issue-46 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-49/300495541-23556932-5526-4428-b1c2-25c840352422.png\n", "爬取 issue-45 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-46/294358431-92b4f252-91a9-4326-ae14-9d21037d3478.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-46/294358432-2bbec170-1400-49c3-a30e-a0acc4bf3f66.png\n", "爬取 issue-44 中 ...\n", "爬取 issue-43 中 ...\n", + "爬取 issue-42 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/292665566-dc8dd944-f464-4606-8900-4562cdf404c7.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/292665655-3341f355-0ca4-4757-9814-5702515922e7.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/335602119-bd06d356-3356-45a8-8556-b9b60fdb337b.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/292665721-e4730448-1588-424c-9a98-c661dfb5237d.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/292665609-f6bf03cd-857b-4156-8795-6e41416d96e4.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/335599172-7ea754a3-1dea-428f-baf4-e04c400e2744.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/292665655-3341f355-0ca4-4757-9814-5702515922e7.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/292665566-dc8dd944-f464-4606-8900-4562cdf404c7.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/335601886-3731689f-7ddb-4d4b-9e73-9e1a631e403f.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/335602049-bade0794-1653-42f7-8816-d3f3484009e3.png\n", - "爬取 issue-42 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/335601886-3731689f-7ddb-4d4b-9e73-9e1a631e403f.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/335599172-7ea754a3-1dea-428f-baf4-e04c400e2744.png\n", "爬取 issue-41 中 ...\n", - "爬取 issue-40 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-43/292665609-f6bf03cd-857b-4156-8795-6e41416d96e4.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-42/292425880-bc7f4792-6c68-45e0-862f-23b7b1232dce.png\n", + "爬取 issue-40 中 ...\n", "爬取 issue-39 中 ...\n", "爬取 issue-38 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-39/291777353-268ce49b-78c4-46a8-b543-542db0ef6dcc.png\n", @@ -178,62 +191,63 @@ "爬取 issue-36 中 ...\n", "爬取 issue-35 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-37/291228777-6d65928c-5ffd-4aab-af19-03291f31473a.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291267690-67d01501-ab54-4274-8425-e876b7035391.png\n", - "爬取 issue-34 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291267797-b00bdf44-c648-47d3-9bd9-eb1e68b12193.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268221-1c380a09-76b5-45a6-aff3-d8a873868402.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268654-d8a5686c-c109-461b-b68a-ff00bcd9f462.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268318-27f79c67-8e8d-419a-a0b7-e744b416b704.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268113-20044b19-d508-47ea-9f07-f675bc72a2cb.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291267929-d697e859-8ad0-4cc3-aa15-e50d0a26dc53.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268011-69f0a3ef-d509-47c9-b949-36d280edc4f8.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268429-e0517629-7b5a-4751-a431-330f04d8c1ee.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268509-e9c687a4-2b28-46f1-8670-827359df792e.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268221-1c380a09-76b5-45a6-aff3-d8a873868402.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268429-e0517629-7b5a-4751-a431-330f04d8c1ee.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268113-20044b19-d508-47ea-9f07-f675bc72a2cb.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268011-69f0a3ef-d509-47c9-b949-36d280edc4f8.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291267929-d697e859-8ad0-4cc3-aa15-e50d0a26dc53.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268654-d8a5686c-c109-461b-b68a-ff00bcd9f462.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291225163-78241e4c-400a-4d75-a008-3c34ca26ae4a.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291225347-63167ad5-6896-4afe-a6d7-197532a23f8f.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291268318-27f79c67-8e8d-419a-a0b7-e744b416b704.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291267797-b00bdf44-c648-47d3-9bd9-eb1e68b12193.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-36/291267690-67d01501-ab54-4274-8425-e876b7035391.png\n", + "爬取 issue-34 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-35/291224673-a3f70f16-271c-4905-b1f0-1c011b56d3bf.png\n", "爬取 issue-33 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-34/291140726-cba47a2d-dd99-49e5-b302-733e266d0c44.png\n", - "爬取 issue-32 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-34/291310957-8b8f17a0-ec66-4009-9657-2433d51319c8.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-34/291140726-cba47a2d-dd99-49e5-b302-733e266d0c44.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-34/291310957-8b8f17a0-ec66-4009-9657-2433d51319c8.png\n", + "爬取 issue-32 中 ...\n", "爬取 issue-31 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-32/290024353-47c9297c-6160-402a-b3bf-e08bd9c923ea.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-32/290024305-41e868d5-e737-4f1d-93af-558db2abba91.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-32/290024353-47c9297c-6160-402a-b3bf-e08bd9c923ea.png\n", + "爬取 31 失败\n", "爬取 issue-30 中 ...\n", "爬取 issue-29 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-31/290022938-62774f96-82ac-46f4-9599-818a6a430cd9.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-30/290022151-dc253b33-fbfe-4f9c-8023-e00e180015d6.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-30/290022070-0e449a39-5360-474e-bc18-1c1729071f66.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-30/290022151-dc253b33-fbfe-4f9c-8023-e00e180015d6.png\n", "爬取 issue-28 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-29/290020867-53b8d764-f8f8-41ab-8262-0ac17702fa42.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-29/290018445-3d43470c-5b8b-4466-b8c2-800694771143.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-29/290018445-3d43470c-5b8b-4466-b8c2-800694771143.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-29/290020867-53b8d764-f8f8-41ab-8262-0ac17702fa42.png\n", "爬取 issue-27 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-29/290020867-53b8d764-f8f8-41ab-8262-0ac17702fa42.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-29/290018445-3d43470c-5b8b-4466-b8c2-800694771143.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-28/288112763-1dfaa7f2-f52b-42b5-ba40-c47c16205265.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-28/288112141-a1c08800-b6dd-4215-9ecf-288759cc0174.png\n", "爬取 issue-26 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-27/287923928-5e817c41-c54d-409c-be36-576efb0a299a.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-27/287924096-490bef45-fc31-4ffc-a3a5-d077c350ff88.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-27/287923928-5e817c41-c54d-409c-be36-576efb0a299a.png\n", "爬取 issue-25 中 ...\n", "爬取 issue-24 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-25/282802849-27fc9f7a-f7f5-4b8d-84e5-1060166b0ad7.png\n", - "爬取 issue-23 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-25/282800215-946fad7c-54ae-46c9-be9a-d5a69b4fbf7b.png\n", + "爬取 issue-23 中 ...\n", "爬取 issue-22 中 ...\n", "爬取 issue-21 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-22/275505102-406e3256-7a3e-4deb-9456-2a49b41ca85d.png\n", "爬取 issue-20 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-21/275300475-444cf824-5489-461d-9678-440901554f68.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-21/279390992-4a04af63-c176-49a8-a60e-5c3e95c07f8b.png\n", "爬取 issue-19 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-21/275300475-444cf824-5489-461d-9678-440901554f68.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-20/268173022-80623e60-fba6-4f4c-85eb-5fb542ba8170.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-20/268173043-927f355a-37b5-45f5-bd88-78317549bf54.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-20/268173050-b186e855-4ad3-44c0-8708-59b11c5506a7.png\n", + "爬取 19 失败\n", "爬取 issue-17 中 ...\n", - "爬取 issue-16 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-17/264944498-f609f333-53a1-40f3-8bd5-a320b21398df.png\n", + "爬取 issue-16 中 ...\n", "爬取 issue-15 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-16/264304291-1fbb69c3-02fa-4d50-9dec-cc6da46c1dd2.png\n", "爬取 issue-14 中 ...\n", @@ -241,57 +255,55 @@ "[crawler] 图像已经保存至 ../docs/digital-issue/issue-15/264302196-e355b398-1ba7-4b7e-aa0b-b1d67646182a.png\n", "爬取 issue-13 中 ...\n", "爬取 issue-12 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-14/263748729-d0d2d005-019b-404f-a720-8f75b19a52ba.png\n", "爬取 issue-11 中 ...\n", + "爬取 issue-10 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-12/263475138-92d989d2-2b5e-432c-bfde-8bd8f3524b6e.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-12/263475180-595e8d91-2645-47bf-a4db-24aad89d12ae.png\n", - "爬取 issue-10 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-12/289706401-d79d32f8-5738-4088-bc92-74e19da24885.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-14/263748729-d0d2d005-019b-404f-a720-8f75b19a52ba.png\n", "爬取 issue-9 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-11/263142498-1af4cb41-c431-4de0-9d26-65729d3dfe65.png\n", "爬取 issue-8 中 ...\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-9/261163571-1caa7264-3702-4467-9986-49e0557b0edc.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-10/263140095-8d3beafa-ad35-405d-bcf7-3964853174b2.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-9/261163518-42173b79-b7b3-41c3-8860-1007f140fe86.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-9/261163571-1caa7264-3702-4467-9986-49e0557b0edc.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-9/261163490-45ab4e0e-7175-4a65-9a70-4e51b4c1366a.png\n", "爬取 issue-7 中 ...\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-8/260685640-0c9db5e7-ae1e-4558-b3f7-72ebb4f67043.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-9/261163490-45ab4e0e-7175-4a65-9a70-4e51b4c1366a.png\n", "爬取 issue-6 中 ...\n", "爬取 issue-5 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-7/260630437-8d34c4a0-cc48-44b5-bbb8-94742c2e0776.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-7/260630481-0cbc73cf-f516-4b3d-92f5-17598f089297.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/256976429-8ad21695-2397-4a79-8fab-43fa01da5e24.png\n", "爬取 issue-4 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/260248721-a56ad686-d1ac-4fa4-9fe7-fb9007f7a1e3.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/256976463-9b61e743-536e-4d53-af74-f8015b104a36.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/256976410-22019e06-df93-48b1-93a6-05901197b277.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/260716833-f3d89a67-7b4f-4daa-9a0a-8313dcf9caaa.png\n", "爬取 issue-3 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-5/255643011-49b2efa2-09f4-463e-908b-4510d2110429.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-5/260307745-b545d146-a49b-4ebf-af88-ce3982a2e0ff.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-5/255646125-b5035137-6df5-4189-95c2-199970dfbe8d.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386114-73e4b52e-3eee-4652-971e-4bf123d6c9aa.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386123-e5e990fa-af1f-439b-bb74-aa20af50366c.png\n", "爬取 issue-2 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386053-b536d9d7-fe3b-4c83-a581-0884e3cf04f6.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386339-56413f1c-bb32-49c0-aa85-dceeceb8594a.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-3/255608587-cd487ee5-95be-47a5-90d4-5f02e0a94cc2.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/260248721-a56ad686-d1ac-4fa4-9fe7-fb9007f7a1e3.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-3/255603702-8379ccc3-4d7a-407f-8777-aba9666e7c58.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386123-e5e990fa-af1f-439b-bb74-aa20af50366c.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/256976429-8ad21695-2397-4a79-8fab-43fa01da5e24.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-5/260307745-b545d146-a49b-4ebf-af88-ce3982a2e0ff.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-3/260107703-9e01db47-6c15-4d41-b823-a1896be68af7.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-3/260107481-5c0127b4-2273-4a14-b996-2d109a947a5e.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386114-73e4b52e-3eee-4652-971e-4bf123d6c9aa.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-5/255646125-b5035137-6df5-4189-95c2-199970dfbe8d.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/256976410-22019e06-df93-48b1-93a6-05901197b277.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/256976463-9b61e743-536e-4d53-af74-f8015b104a36.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386053-b536d9d7-fe3b-4c83-a581-0884e3cf04f6.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-7/260630437-8d34c4a0-cc48-44b5-bbb8-94742c2e0776.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-5/255643011-49b2efa2-09f4-463e-908b-4510d2110429.png\n", "爬取 issue-1 中 ...\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-3/255342825-dae63d0c-05b8-4965-b2e0-19df84778a5e.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-2/253884964-cbaf42fa-fa7d-48ed-8353-184dd0895a12.png\n" + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-3/255342825-dae63d0c-05b8-4965-b2e0-19df84778a5e.png\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-7/260630481-0cbc73cf-f516-4b3d-92f5-17598f089297.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-4/255386339-56413f1c-bb32-49c0-aa85-dceeceb8594a.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-6/260716833-f3d89a67-7b4f-4daa-9a0a-8313dcf9caaa.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-2/253884964-cbaf42fa-fa7d-48ed-8353-184dd0895a12.png\n", + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-2/256974788-7c2e9bf0-d239-4022-9aac-f8f160afad6f.png\n", "[crawler] 图像已经保存至 ../docs/digital-issue/issue-2/255247553-45d154cc-37d1-459d-80d3-adad6324de4c.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-2/256974788-7c2e9bf0-d239-4022-9aac-f8f160afad6f.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-2/256974788-7c2e9bf0-d239-4022-9aac-f8f160afad6f.png\n", - "[crawler] 图像已经保存至 ../docs/digital-issue/issue-1/253879145-d8f82699-aca6-44aa-bb1c-57066cf39f66.png\n" + "[crawler] 图像已经保存至 ../docs/digital-issue/issue-2/256974788-7c2e9bf0-d239-4022-9aac-f8f160afad6f.png\n" ] } ], @@ -302,9 +314,144 @@ " 'https://github.com/Digital-EDA/Digital-IDE/issues?page=3&q='\n", "]\n", "\n", + "titles.clear()\n", + "fail_ids.clear()\n", "for url in page_urls:\n", " crawler_issue_page(url)" ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "66\n", + "54\n", + "50\n", + "31\n", + "19\n" + ] + } + ], + "source": [ + "for issue_id in fail_ids:\n", + " print(issue_id)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Exception in thread Thread-66 (download_worker):\n", + "Traceback (most recent call last):\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connectionpool.py\", line 467, in _make_request\n", + " self._validate_conn(conn)\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connectionpool.py\", line 1099, in _validate_conn\n", + " conn.connect()\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connection.py\", line 653, in connect\n", + " sock_and_verified = _ssl_wrap_socket_and_match_hostname(\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connection.py\", line 806, in _ssl_wrap_socket_and_match_hostname\n", + " ssl_sock = ssl_wrap_socket(\n", + " ^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/util/ssl_.py\", line 465, in ssl_wrap_socket\n", + " ssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls, server_hostname)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/util/ssl_.py\", line 509, in _ssl_wrap_socket_impl\n", + " return ssl_context.wrap_socket(sock, server_hostname=server_hostname)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/ssl.py\", line 517, in wrap_socket\n", + " return self.sslsocket_class._create(\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/ssl.py\", line 1108, in _create\n", + " self.do_handshake()\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/ssl.py\", line 1379, in do_handshake\n", + " self._sslobj.do_handshake()\n", + "TimeoutError: [Errno 110] Connection timed out\n", + "\n", + "The above exception was the direct cause of the following exception:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/requests/adapters.py\", line 486, in send\n", + " resp = conn.urlopen(\n", + " ^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connectionpool.py\", line 847, in urlopen\n", + " retries = retries.increment(\n", + " ^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/util/retry.py\", line 470, in increment\n", + " raise reraise(type(error), error, _stacktrace)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/util/util.py\", line 39, in reraise\n", + " raise value\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connectionpool.py\", line 793, in urlopen\n", + " response = self._make_request(\n", + " ^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connectionpool.py\", line 491, in _make_request\n", + " raise new_e\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connectionpool.py\", line 469, in _make_request\n", + " self._raise_timeout(err=e, url=url, timeout_value=conn.timeout)\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/urllib3/connectionpool.py\", line 370, in _raise_timeout\n", + " raise ReadTimeoutError(\n", + "urllib3.exceptions.ReadTimeoutError: HTTPSConnectionPool(host='private-user-images.githubusercontent.com', port=443): Read timed out. (read timeout=None)\n", + "\n", + "During handling of the above exception, another exception occurred:\n", + "\n", + "Traceback (most recent call last):\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/threading.py\", line 1038, in _bootstrap_inner\n", + " self.run()\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/threading.py\", line 975, in run\n", + " self._target(*self._args, **self._kwargs)\n", + " File \"/tmp/ipykernel_1083457/2148945449.py\", line 2, in download_worker\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/requests/api.py\", line 73, in get\n", + " return request(\"get\", url, params=params, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/requests/api.py\", line 59, in request\n", + " return session.request(method=method, url=url, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/requests/sessions.py\", line 589, in request\n", + " resp = self.send(prep, **send_kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/requests/sessions.py\", line 703, in send\n", + " r = adapter.send(request, **kwargs)\n", + " ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", + " File \"/data/zhelonghuang/miniconda3/lib/python3.11/site-packages/requests/adapters.py\", line 532, in send\n", + " raise ReadTimeout(e, request=request)\n", + "requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='private-user-images.githubusercontent.com', port=443): Read timed out. (read timeout=None)\n" + ] + } + ], + "source": [ + "import yaml\n", + "target_yml = '../config/github-issue.story.yml'\n", + "\n", + "story_config = {\n", + " 'stories': []\n", + "}\n", + "\n", + "for title in titles:\n", + " story_config['stories'].append({\n", + " 'message': title,\n", + " 'intent': 'bug'\n", + " })\n", + "with open(target_yml, 'w', encoding='utf-8') as fp:\n", + " yaml.dump(story_config, fp, Dumper=yaml.Dumper, indent=2, allow_unicode=True)" + ] } ], "metadata": { diff --git a/prompt/core.py b/prompt/core.py index b517dfb..e4f3d9f 100644 --- a/prompt/core.py +++ b/prompt/core.py @@ -51,7 +51,7 @@ class PromptEngine: self.schema = self.handle_schema(self.config['schema']) self.stories = self.handle_stories(self.config['stories']) self.rejects = self.handle_rejects(self.config['rejects']) - + def handle_schema(self, raw_schema: dict) -> IntentNode: raw_root = raw_schema.get('root', None) if raw_root is None: @@ -105,6 +105,15 @@ class PromptEngine: stories.append(story) return stories + def merge_stories_from_yml(self, path: str): + config = yaml.load(open(path, 'r', encoding='utf-8'), Loader=yaml.Loader) + stories = config.get('stories', []) + self.merge_stories(stories) + + def merge_stories(self, raw_stories: list[dict]): + stories = self.handle_stories(raw_stories) + self.stories.extend(stories) + def handle_rejects(self, raw_rejects: list[str]) -> list[str]: rejects = [] for reject in raw_rejects: @@ -256,6 +265,6 @@ class TreeIntent(ABC): return results if __name__ == '__main__': - prompt_engine = PromptEngine('./story.yml') - msg = prompt_engine.generate_llm_message('如何解决 digital ide 无法载入配置文件的问题?') - print(msg) \ No newline at end of file + prompt_engine = PromptEngine('./config/story.yml') + prompt_engine.merge_stories_from_yml('./config/github-issue.story.yml') + print(len(prompt_engine.stories)) \ No newline at end of file diff --git a/rag/configs.py b/rag/configs.py index da4f928..caeaede 100644 --- a/rag/configs.py +++ b/rag/configs.py @@ -2,6 +2,7 @@ necessary_files = { 'vecdb-config': './config/vecdb.yml', 'intent-story': './config/story.yml', + 'issue-story': './config/github-issue.story.yml', 'blog-vecdb-data': './blog-vecdb/index.faiss', 'blog-vecdb-model': './blog-vecdb/index.pkl', 'intent-classifier': './model/embedding_mapping.sklearn' diff --git a/rag/intent.py b/rag/intent.py index 938e586..26328dc 100644 --- a/rag/intent.py +++ b/rag/intent.py @@ -31,10 +31,31 @@ class IntentRecogition: intent_recogition = IntentRecogition() +@app.route('/intent/reload-embedding-mapping', methods=['post']) +def reload_embedding_mapping(): + try: + intent_recogition.embed_intent_classificator = joblib.load(necessary_files['intent-classifier']) + except Exception as e: + response = jsonify({ + 'code': StatusCode.process_error.value, + 'data': str(e), + 'msg': MsgCode.query_not_empty.value + }) + response.status_code = StatusCode.success.value + return response + + response = jsonify({ + 'code': StatusCode.success.value, + 'data': 'load model from ' + necessary_files['intent-classifier'], + 'msg': StatusCode.success.value + }) + response.status_code = StatusCode.success.value + return response @app.route('/intent/retrain-embedding-mapping', methods=['post']) def retrain_embedding_mapping(): engine = PromptEngine(necessary_files['intent-story']) + engine.merge_stories_from_yml(necessary_files['issue-story']) model = LogisticRegression() sentences = [] labels = [] diff --git a/story.yml b/story.yml new file mode 100644 index 0000000..00c3915 --- /dev/null +++ b/story.yml @@ -0,0 +1,148 @@ +schema: + root: + name: root + children: + - name: usage + description: 使用查询 + children: + - name: bug + description: bug 查询 + children: + - name: command + description: 指令 + children: + - name: advice + description: 建议 + children: + - name: expression + description: 情绪表达 + children: + - name: joke + description: 玩尬 + children: + - name: others + description: 其他 + children: + +stories: + - message: 请问 property.json 如何配置? + intent: usage + - message: 我的自动补全无法使用,是不是有bug? + intent: bug + - message: 帮我上传一下这份数据 + intent: command + - message: surface了解一下? + intent: others + - message: 大佬们,为啥我的digital ide启动之后所有功能都没启动捏?我配置了property文件,然后插件的vivado路经和modelsim路经都加上了 + intent: usage + - message: 这群要被chisel夺舍了吗 + intent: others + - message: Metals一开直接报错 + intent: others + - message: 话说digital-ide打开大的verilog卡死了 + intent: bug + - message: 请问一下,第一次点击对文件仿真可以出波形文件,再次点击的时候就会提示unknown module type了。是哪个配置没配置好? + intent: usage + - message: 怎么调整是哪个版本的vivado来构建工程呢 + intent: usage + - message: 咱们这个插件win7的vscode是不是只能用很早之前的版本 + intent: usage + - message: 帮我将这份数据保存到服务器上 + intent: command + - message: 他这个意思是 单个功耗很低 但是功耗低那肯定性能就寄 频率肯定不高 靠人多 + intent: others + - message: 我平时写代码就喜欢喝茶 + intent: usage + - message: 感觉现在啥都在往AI靠 + intent: others + - message: 请问你们自动对齐插件用的啥? + intent: usage + - message: 不得不放一下我的咖啡笔记了 + intent: others + - message: stm32有什么好玩的应用不 + intent: usage + - message: 别人设置的肯定有点不合适自己的 + intent: others + - message: http://hehezhou.cn/register2024/AArch64-regindex.html + intent: others + - message: 因为他们py本领不是很强,需要这些东西辅助 + intent: others + - message: 写C写多了,顺手在pycharm写了个main.c + intent: others + - message: 好流畅的にほんじんです + intent: others + - message: 有没有接触过UI开发的,想做一款寄存器管理的工具,想把界面做的好看一点 + intent: usage + - message: 现在嘉立创也在做FPGA了? + intent: usage + - message: 大佬们,更新0.3.3之后,用iverilog仿真,testbench中还是例化模块出错:unknown module type,这是什么原因啊? + intent: bug + - message: 查了一下记录,2017年买的静电容 + intent: others + - message: 我小时候电脑刚买回来一星期就被我玩坏了 + intent: others + - message: "command not found: python" + intent: others + - message: path top.v is not a hdlFile 请问报这个错误大概是啥原因啊 + intent: usage + - message: 咖啡喝不了,喝了胃不舒服 + intent: others + - message: 兄弟们有没有C语言绘图库推荐 + intent: usage + - message: 在企业里面最大的问题是碰见傻逼怎么办? + intent: others + - message: 如何使用 digital ide 这个插件? + intent: usage + - message: 我早上开着机去打论文 回来发现我电脑切换到Linux了 + intent: others + - message: 我在Windows下遇到的只要问题就是对于C程序,包管理和编译管理器偶尔会不认识彼此但除此之外,都很安稳(win11除外) + intent: others + - message: 不能理解在生产环境用arch的人。。 + intent: others + - message: 请问一下xilinx fpga开发在win和linux平台哪个好? + intent: usage + - message: 好羡慕你们可以开发自己喜欢的东西 + intent: others + - message: ??? + intent: expression + - message: ??? + intent: expression + - message: 我人麻了 + intent: expression + - message: 艹 + intent: expression + - message: 我人傻了 + intent: expression + - message: 我tm + intent: expression + - message: tnnd + intent: expression + - message: funny mud goup + intent: expression + - message: 衣服混起来洗,有一件深色的掉色了,现在我一盆白T恤全变成泥土色了 + intent: expression + - message: 这可是陪伴了我六七年的衣服啊 + intent: expression + - message: 唉神金 + intent: expression + - message: 为啥要用手机号码啊 + intent: others + - message: 本人于今日12时点了4瓶500ml无糖可乐,收到四瓶888ml + intent: joke + - message: 我是小趴菜 + intent: joke + - message: 我也想组乐队 www + intent: expression + - message: 这个乐队谱,我看哭了 + intent: expression + - message: 我的手机最大的用处就是当一个麦克风+相机 + intent: others + - message: 那你可能更适合iPhone,不过稍微贵点,入门级别5-6k,好一点的得8k-1w + intent: others + - message: + + +rejects: + - metal + - metals + - idea \ No newline at end of file diff --git a/test/suite/rag.test.js b/test/suite/rag.test.js index 979ecc4..a27a3ef 100644 --- a/test/suite/rag.test.js +++ b/test/suite/rag.test.js @@ -7,6 +7,8 @@ const vecdbBuffer = fs.readFileSync('./config/vecdb.yml', 'utf-8'); const vecdbConfig = yaml.parse(vecdbBuffer); const vecdbBaseURL = `http://${vecdbConfig['addr']}:${vecdbConfig['port']}`; +console.log(vecdbBaseURL); + const vecdbRequests = axios.create({ baseURL: vecdbBaseURL, timeout: 5000 @@ -19,7 +21,7 @@ const apiGetIntentRecogition = (req) => vecdbRequests({ suite('test intent recogition', () => { - + // 也可以事先写好测试集,写在测试程序里或者从静态文件中读入 const intent_suites = [ { input: '如何使用 digital ide 这个插件?', expect: 'usage' }, @@ -27,6 +29,19 @@ suite('test intent recogition', () => { { input: 'path top.v is not a hdlFile 请问报这个错误大概是啥原因啊', expect: 'usage,bug' }, { input: '我同学在学习强国看到小麦收割了,然后就买相应的股就赚了', expect: 'others' }, { input: '我平时写代码就喜欢喝茶', expect: 'others' }, + { input: '请问报这个错误大概是啥原因啊', expect: 'usage,bug' }, + { input: '感觉现在啥都在往AI靠', expect: 'others' }, + { input: '别人设置的肯定有点不合适自己的', expect: 'others' }, + { input: '在企业里面最大的问题是碰见傻逼怎么办?', expect: 'others' }, + { input: '几乎完全不喝牛奶2333', expect: 'others' }, + { input: 'command not found: python', expect: 'usage,bug,others' }, + { input: '兄弟们有没有C语言绘图库推荐', expect: 'usage' }, + { input: '我早上开着机去打论文 回来发现我电脑切换到Linux了', expect: 'usage,bug,others' }, + { input: '我在Windows下遇到的只要问题就是对于C程序,包管理和编译管理器偶尔会不认识彼此但除此之外,都很安稳(win11除外)', expect: 'usage,others' }, + { input: '我的反撤回还能用', expect: 'others' }, + { input: '因为这是养蛊的虚拟机,放了些国产垃圾软件,得用国产流氓之王才能镇得住他们', expect: 'others' }, + { input: '你咋装了个360', expect: 'others' }, + { input: '???', expect: 'others' }, ]; for (const s of intent_suites) {