├── static ├── .gitkeep ├── favicon.ico └── data │ ├── readme.txt │ ├── index2QQ_id.json │ ├── atCount.json │ ├── similarityMatrix.json │ ├── data.json │ └── dayVectors.json ├── config ├── prod.env.js ├── test.env.js ├── dev.env.js └── index.js ├── IM_analyze ├── src │ ├── func.pyc │ ├── user.pyc │ ├── file_reader.pyc │ ├── func.py │ ├── user.py │ ├── file_reader.py │ └── main.py ├── .settings │ └── org.eclipse.core.resources.prefs ├── .project └── .pydevproject ├── .babelrc ├── .gitignore ├── test └── unit │ ├── .eslintrc │ ├── specs │ └── header.spec.js │ ├── index.js │ └── karma.conf.js ├── .editorconfig ├── src ├── store │ ├── store.js │ ├── user.js │ └── login.js ├── components │ ├── mask.vue │ ├── foot.vue │ ├── nav.vue │ ├── graduate.vue │ ├── single.vue │ ├── bedroom.vue │ ├── eat.vue │ ├── header.vue │ ├── cloud.vue │ ├── login.vue │ ├── selfstudy.vue │ ├── canteen.vue │ ├── building.vue │ ├── gotobed.vue │ ├── getup.vue │ ├── interest.vue │ ├── onlyme.vue │ ├── difficult.vue │ ├── chat.vue │ └── amuse.vue ├── App.vue └── main.js ├── index.html ├── README.md └── package.json /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | NODE_ENV: '"production"' 3 | } 4 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hieeyh/tong2-family/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /IM_analyze/src/func.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hieeyh/tong2-family/HEAD/IM_analyze/src/func.pyc -------------------------------------------------------------------------------- /IM_analyze/src/user.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hieeyh/tong2-family/HEAD/IM_analyze/src/user.pyc -------------------------------------------------------------------------------- /static/data/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hieeyh/tong2-family/HEAD/static/data/readme.txt -------------------------------------------------------------------------------- /IM_analyze/src/file_reader.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hieeyh/tong2-family/HEAD/IM_analyze/src/file_reader.pyc -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015", "stage-2"], 3 | "plugins": ["transform-runtime"], 4 | "comments": false 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | dist/ 4 | npm-debug.log 5 | test/unit/coverage 6 | test/e2e/reports 7 | selenium-debug.log 8 | -------------------------------------------------------------------------------- /test/unit/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "mocha": true 4 | }, 5 | "globals": { 6 | "expect": true, 7 | "sinon": true 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /config/test.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var devEnv = require('./dev.env') 3 | 4 | module.exports = merge(devEnv, { 5 | NODE_ENV: '"testing"' 6 | }) 7 | -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | var merge = require('webpack-merge') 2 | var prodEnv = require('./prod.env') 3 | 4 | module.exports = merge(prodEnv, { 5 | NODE_ENV: '"development"' 6 | }) 7 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /IM_analyze/.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/file_reader.py=utf-8 3 | encoding//src/func.py=utf-8 4 | encoding//src/main.py=utf-8 5 | encoding//src/user.py=utf-8 6 | encoding/=UTF-8 7 | -------------------------------------------------------------------------------- /src/store/store.js: -------------------------------------------------------------------------------- 1 | import 'babel-polyfill' 2 | import Vue from 'vue' 3 | import Vuex from 'vuex' 4 | import user from './user' 5 | import login from './login' 6 | 7 | Vue.use(Vuex) 8 | 9 | export default new Vuex.Store({ 10 | strict: process.env.NODE_ENV !== 'production', //在非生产环境下,使用严格模式 11 | modules: { 12 | user, 13 | login 14 | } 15 | }) -------------------------------------------------------------------------------- /IM_analyze/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | IM_analyze 4 | 5 | 6 | 7 | 8 | 9 | org.python.pydev.PyDevBuilder 10 | 11 | 12 | 13 | 14 | 15 | org.python.pydev.pythonNature 16 | 17 | 18 | -------------------------------------------------------------------------------- /test/unit/specs/header.spec.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import Header from 'src/components/header' 4 | 5 | describe('header.vue test', () => { 6 | // 检查原始组件选项 7 | it('has data as function', () => { 8 | expect(Header.data).to.be.a('function') 9 | }) 10 | it('has computed as object', () => { 11 | expect(Header.computed).to.be.an('object') 12 | }) 13 | it('has methods as object', () => { 14 | expect(Header.methods).to.be.an('object') 15 | }) 16 | }) -------------------------------------------------------------------------------- /IM_analyze/.pydevproject: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | /${PROJECT_DIR_NAME} 5 | /${PROJECT_DIR_NAME}/src 6 | 7 | python 2.7 8 | Default 9 | 10 | -------------------------------------------------------------------------------- /src/components/mask.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | -------------------------------------------------------------------------------- /test/unit/index.js: -------------------------------------------------------------------------------- 1 | // Polyfill fn.bind() for PhantomJS 2 | /* eslint-disable no-extend-native */ 3 | Function.prototype.bind = require('function-bind') 4 | 5 | // require all test files (files that ends with .spec.js) 6 | const testsContext = require.context('./specs', true, /\.spec$/) 7 | testsContext.keys().forEach(testsContext) 8 | 9 | // require all src files except main.js for coverage. 10 | // you can also change this to match only the subset of files that 11 | // you want coverage for. 12 | const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/) 13 | srcContext.keys().forEach(srcContext) 14 | -------------------------------------------------------------------------------- /src/components/foot.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | -------------------------------------------------------------------------------- /static/data/index2QQ_id.json: -------------------------------------------------------------------------------- 1 | {"0": 118596889, 2 | "1": 126058202, 3 | "2": 136594433, 4 | "3": 150564507, 5 | "4": 272615169, 6 | "5": 321294675, 7 | "6": 255679362, 8 | "7": 33725737, 9 | "8": 49360297, 10 | "9": 197681859, 11 | "10": 147837289, 12 | "11": 39072797, 13 | "12": 141559798, 14 | "13": 235123, 15 | "14": 321249731, 16 | "15": 117162411, 17 | "16": 93603615, 18 | "17": 166628089, 19 | "18": 190311638, 20 | "19": 157000864, 21 | "20": 145722899, 22 | "21": 175772521, 23 | "22": 118430095, 24 | "23": 151561334, 25 | "24": 107120469, 26 | "25": 135781321, 27 | "26": 175829539, 28 | "27": 50255294, 29 | "28": 67526432, 30 | "29": 115853490 31 | } 32 | -------------------------------------------------------------------------------- /src/store/user.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export default { 4 | // JSON.parse方法将一个字符串解析成一个JSON对象 5 | state: JSON.parse(sessionStorage.getItem('user')) || {}, 6 | mutations: { 7 | logIn(state, user) { 8 | // 从一个对象中解析出字符串 9 | sessionStorage.setItem('user', JSON.stringify(user)) 10 | // ES6语法,从一个对象复制所有的属性到另一个对象,返回state对象 11 | Object.assign(state, user) 12 | }, 13 | logOut(state) { 14 | sessionStorage.removeItem('user') 15 | Object.keys(state).forEach(k => Vue.delete(state, k)) 16 | Object.assign(state, {}) 17 | } 18 | }, 19 | actions: { 20 | logIn({commit}, user) { 21 | commit('logIn', user) 22 | }, 23 | logOut({commit}) { 24 | commit('logOut') 25 | } 26 | } 27 | } -------------------------------------------------------------------------------- /src/store/login.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | export default { 4 | state: { 5 | islogin: false, 6 | hasLogin: false 7 | }, 8 | mutations: { 9 | enableLogin(state) { 10 | state.islogin = true 11 | }, 12 | disableLogin(state) { 13 | state.islogin = false 14 | }, 15 | loginSuccess(state) { 16 | state.hasLogin = true 17 | }, 18 | loginFail(state) { 19 | state.hasLogin = false 20 | } 21 | }, 22 | actions: { 23 | enableLogin({commit}) { 24 | commit('enableLogin') 25 | }, 26 | disableLogin({commit}) { 27 | commit('disableLogin') 28 | }, 29 | loginSuccess({commit}) { 30 | commit('loginSuccess') 31 | }, 32 | loginFail({commit}) { 33 | commit('loginFail') 34 | }, 35 | } 36 | } -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | tong2-family 9 | 10 | 11 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | // see http://vuejs-templates.github.io/webpack for documentation. 2 | var path = require('path') 3 | 4 | module.exports = { 5 | build: { 6 | env: require('./prod.env'), 7 | index: path.resolve(__dirname, '../dist/index.html'), 8 | assetsRoot: path.resolve(__dirname, '../dist'), 9 | assetsSubDirectory: 'static', 10 | assetsPublicPath: '/', 11 | productionSourceMap: true, 12 | // Gzip off by default as many popular static hosts such as 13 | // Surge or Netlify already gzip all static assets for you. 14 | // Before setting to `true`, make sure to: 15 | // npm install --save-dev compression-webpack-plugin 16 | productionGzip: false, 17 | productionGzipExtensions: ['js', 'css'] 18 | }, 19 | dev: { 20 | env: require('./dev.env'), 21 | port: 8080, 22 | assetsSubDirectory: 'static', 23 | assetsPublicPath: '/', 24 | proxyTable: {}, 25 | // CSS Sourcemaps off by default because relative paths are "buggy" 26 | // with this option, according to the CSS-Loader README 27 | // (https://github.com/webpack/css-loader#sourcemaps) 28 | // In our experience, they generally work as expected, 29 | // just be aware of this issue when enabling this option. 30 | cssSourceMap: false 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /IM_analyze/src/func.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | ''' 3 | Created on 2016.10.14 4 | 5 | @author: xiaoq 6 | ''' 7 | import math 8 | # 该模块提供对正则表达式的支持 9 | import re 10 | 11 | def getSimilarity(user1, user2): 12 | ''' 13 | 计算两个用户之间的亲密度 14 | 15 | 通过将用户的发言密度向量化,以向量内积的方式计算用户亲密度 16 | ''' 17 | similarity = 0 18 | vectorLen1 = 0 19 | vectorLen2 = 0 20 | for i in range(len(user1.featureVector)): 21 | similarity = similarity + user1.featureVector[i] * user2.featureVector[i] 22 | vectorLen1 = vectorLen1 + user1.featureVector[i] * user1.featureVector[i] 23 | vectorLen2 = vectorLen2 + user2.featureVector[i] * user2.featureVector[i] 24 | 25 | return similarity / math.sqrt(vectorLen1) / math.sqrt(vectorLen2) 26 | 27 | def getAtInfo(QQ_id2index, name2QQ_id, users): 28 | ''' 29 | 获取用户之间互相@的计数 30 | ''' 31 | atCount = [([0] * len(users)) for i in range(len(users))] #用户@计数 32 | for user in users.values(): 33 | for friendName in user.aRecords: 34 | for name in name2QQ_id.keys(): 35 | result = re.search(friendName, name) 36 | if result: 37 | print friendName 38 | print name 39 | atCount[QQ_id2index[name2QQ_id[user.name]]][QQ_id2index[name2QQ_id[name]]] = atCount[QQ_id2index[name2QQ_id[user.name]]][QQ_id2index[name2QQ_id[name]]] + 1 40 | break 41 | return atCount 42 | 43 | def store(obj, objName): 44 | import json 45 | 46 | with open(objName + '.json', 'w') as f: 47 | f.write(json.dumps(obj)) 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # tong2-family 2 | 3 | > 使用vue2.0、vuex、vue-router2.0、echarts等搭建的一个数据展示平台 4 | > 不支持IE8及其以下版本,单页面应用 5 | > 对华科电信大二学生的做了一些调查,对调查结果进行可视化展示,同时分析了通信1502班的群聊记录,得到班级群聊活跃度等信息 6 | > 基于vuex实现了简单的登录功能 7 | 8 | ## 运行步骤 9 | 10 | ``` bash 11 | # 安装依赖 12 | npm install 13 | 14 | # 在本地启动服务,并且通过localhost:8080地址进行访问 15 | npm run dev 16 | 17 | # 编译并压缩代码便于发布 18 | npm run build 19 | 20 | # 运行单元测试 21 | npm run unit 22 | ``` 23 | 24 | ## 在线访问 25 | [http://119.29.57.165:8080/family](http://119.29.57.165:8080/family) 26 | **注意**:只有用通信1502班同学的qq号登陆才能看到我的群聊活跃时间 27 | 28 | ## 源码说明 29 | ``` 30 | . 31 | |-- IM_analyze // 用python进行群聊数据分析的相关代码 32 | |-- build // 项目构建相关代码 33 | |-- config // 项目开发环境配置 34 | |-- src // 源码目录 35 | | |-- components // vue公共组件 36 | | |-- store // vuex的状态管理 37 | | |-- store.js // 加载各种store模块 38 | | |-- login.js // 登录状态相关store 39 | | |-- user.js // 用户相关store 40 | | |-- App.vue // 页面入口文件 41 | | |-- main.js // 程序入口文件,加载各种公共组件 42 | |-- static 43 | | |-- data // 群聊分析得到的数据用于数据可视化 44 | |-- .babelrc // ES6语法编译配置 45 | |-- .editorconfig // 定义代码格式 46 | |-- .gitignore // git上传需要忽略的文件格式 47 | |-- README.md // 项目说明 48 | |-- favicon.ico 49 | |-- index.html // 入口页面 50 | |-- package.json // 项目配置相关信息 51 | . 52 | ``` 53 | 54 | ## 教程 55 | 我的博客:[http://hyuhan.com/2016/11/17/A-data-display-platform/](http://hyuhan.com/2016/11/17/A-data-display-platform/) 56 | 57 | ## 联系作者 58 | - [Hieeyh's Personal Website](http://hyuhan.com/) 59 | - Email: yuhanhou_enna@126.com 60 | - [微博](http://weibo.com/5204306789/profile?topnav=1&wvr=6&is_all=1) 61 | 62 | -------------------------------------------------------------------------------- /IM_analyze/src/user.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | ''' 3 | Created on 2016.10.14. 4 | 5 | @author: xiaoq 6 | ''' 7 | 8 | import re 9 | 10 | class User(object): 11 | ''' 12 | classdocs 13 | ''' 14 | #用户描述类 15 | 16 | #储存用户的特性 17 | ''' 18 | ''' 19 | statisticUnit = 6 #统计单元(分钟) 20 | 21 | 22 | def __init__(self, QQ_id_, name_): 23 | ''' 24 | Constructor 25 | ''' 26 | self.QQ_id = QQ_id_ #QQ号 27 | self.name = name_ #昵称 28 | self.names = set() 29 | self.records = [] #该用户的所有原始聊天记录 30 | self.aRecords = [] #该用户@的行为记录 31 | self.words = "" #该用户的所有发言 32 | self.recordCount = 0 #该用户的发言总次数 33 | self.featureVector = [0] * (141 * 24 * 60 / self.statisticUnit) #该用户的发言密度描述向量,最小统计单元为6分钟 34 | self.dayVector = [0] * (24 * 60 / self.statisticUnit) #该用户平均每天的聊天密度,最小统计单元为6分钟 35 | 36 | def addRecord(self, record): 37 | ''' 38 | #记录一条发言 39 | ''' 40 | self.names.add(record["name"]) 41 | self.records.append(record) 42 | self.getAfriend(record["words"]) 43 | self.words = self.words + record["words"] 44 | self.recordCount = self.recordCount + 1 45 | timeInSec = record["timeInSec"] 46 | #计算发言密度 47 | self.featureVector[timeInSec / (self.statisticUnit * 60)] = self.featureVector[timeInSec / (self.statisticUnit * 60)] + 1 48 | timeInSecInTheDay = timeInSec % (24 * 3600) 49 | self.dayVector[timeInSecInTheDay / (self.statisticUnit * 60)] = self.dayVector[timeInSecInTheDay / (self.statisticUnit * 60)] + 1 50 | 51 | def getAfriend(self, words): 52 | friend = re.search("(@\S*\s)|(@\S*$)", words) 53 | if friend and len(friend.group()) < 3: 54 | friend = re.search("(@\s*\S*\s)|(@\s*\S*$)", words) 55 | if friend: 56 | print words 57 | name = friend.group()[1:-1] 58 | self.aRecords.append(name) 59 | print name 60 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 64 | 65 | 89 | -------------------------------------------------------------------------------- /IM_analyze/src/file_reader.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | ''' 3 | Created on 2016.10.14 4 | 5 | @author: xiaoq, houge 6 | ''' 7 | import re 8 | import datetime, time 9 | 10 | def read_file(filepath): 11 | ''' 12 | #读取文件,用list来储存聊天记录 13 | ''' 14 | records = [] 15 | f = open(filepath, "r") 16 | lines = f.readlines() 17 | flag = False 18 | record = {} 19 | startTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") 20 | for line in lines: 21 | #解析文本 22 | line = line.decode('utf-8') 23 | timestamp = re.search("^\d*-\d*-\d*\s\d*:\d*:\d*", line) 24 | if timestamp: 25 | if flag and len(record) == 5 and str(record["QQ_id"]).find("0000") < 0: 26 | #剔除系统消息 27 | records.append(record) 28 | nowTime = time.strptime(timestamp.group(),"%Y-%m-%d %H:%M:%S") #格式化时间戳 29 | record = {"timestamp": nowTime} 30 | if not flag: 31 | #记录第一条发言的日期,并以当天的零点作为左右发言时间的起点 32 | startTime = time.strptime(timestamp.group()[0:11] + "00:00:00", "%Y-%m-%d %H:%M:%S") 33 | record["timeInSec"] = getTimeInSec(nowTime, startTime) #获取发言的时间,以第一条发言当天的零点开始计秒 34 | 35 | #利用正则表达式来解析出QQ号、昵称、时间戳等信息 36 | name = re.search(":\d\d\s[\s\S]*\(", line) 37 | if name: 38 | record["name"] = name.group()[4:-1] 39 | QQ_id = re.search("\(\S*\)", line) 40 | if QQ_id: 41 | record["QQ_id"] = int(QQ_id.group()[1:-1]) 42 | flag = True 43 | elif flag: 44 | if record.has_key("words"): 45 | record["words"] = record["words"] + line 46 | else: 47 | record["words"] = line 48 | print len(records) 49 | return records 50 | 51 | def getTimeInSec(timestamp, start): 52 | #将时间转换为从2016.5.24开始的秒数 53 | return int(time.mktime(timestamp)) - int(time.mktime(start)) 54 | 55 | def getWeek(timeInSec): 56 | #根据以秒计数的时间戳获取星期 57 | timeInSec = timeInSec % (7 * 24 * 3600) 58 | timeInSec = timeInSec / (24 * 3600) 59 | return 2 + timeInSec 60 | 61 | -------------------------------------------------------------------------------- /src/components/nav.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 37 | 38 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import App from './App'; 3 | import VueRouter from 'vue-router'; 4 | import store from './store/store'; 5 | 6 | Vue.use(VueRouter); 7 | 8 | // 定义路由组件 9 | const Worldcloud = require('components/cloud.vue'); 10 | const Building = require('components/building.vue'); 11 | const Canteen = require('components/canteen.vue'); 12 | const Selfstudy = require('components/selfstudy.vue'); 13 | const Difficult = require('components/difficult.vue'); 14 | const Interest = require('components/interest.vue'); 15 | const Bedroom = require('components/bedroom.vue'); 16 | const Graduate = require('components/graduate.vue'); 17 | const Getup = require('components/getup.vue'); 18 | const Gotobed = require('components/gotobed.vue'); 19 | const Eat = require('components/eat.vue'); 20 | const Amuse = require('components/amuse.vue'); 21 | const Single = require('components/single.vue'); 22 | const Chat = require('components/chat.vue'); 23 | const Onlyme = require('components/onlyme.vue'); 24 | 25 | // 定义路由 26 | const routes = [ 27 | { path: '/', redirect: '/wordcloud' }, 28 | { path: '/wordcloud', component: Worldcloud }, 29 | { path: '/building', component: Building }, 30 | { path: '/canteen', component: Canteen }, 31 | { path: '/selfstudy', component: Selfstudy }, 32 | { path: '/difficult', component: Difficult }, 33 | { path: '/interest', component: Interest }, 34 | { path: '/bedroom', component: Bedroom }, 35 | { path: '/graduate', component: Graduate }, 36 | { path: '/getup', component: Getup }, 37 | { path: '/gotobed', component: Gotobed }, 38 | { path: '/eat', component: Eat }, 39 | { path: '/amuse', component: Amuse }, 40 | { path: '/single', component: Single }, 41 | { path: '/chat', component: Chat }, 42 | { path: '/onlyme', component: Onlyme } 43 | ]; 44 | 45 | // 创建router实例 46 | const router = new VueRouter({ 47 | routes 48 | }); 49 | 50 | // const store = new Vuex.Store({ 51 | // state: { 52 | // islogin: false 53 | // }, 54 | // mutations: { 55 | // enableLogin(state) { 56 | // state.islogin = true 57 | // }, 58 | // disableLogin(state) { 59 | // state.islogin = false 60 | // } 61 | // } 62 | // }) 63 | 64 | /* eslint-disable no-new */ 65 | new Vue({ 66 | el: '#app', 67 | template: '', 68 | components: { App }, 69 | router, 70 | store 71 | }); 72 | 73 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /test/unit/karma.conf.js: -------------------------------------------------------------------------------- 1 | // This is a karma config file. For more details see 2 | // http://karma-runner.github.io/0.13/config/configuration-file.html 3 | // we are also using it with karma-webpack 4 | // https://github.com/webpack/karma-webpack 5 | 6 | var path = require('path') 7 | var merge = require('webpack-merge') 8 | var baseConfig = require('../../build/webpack.base.conf') 9 | var utils = require('../../build/utils') 10 | var webpack = require('webpack') 11 | var projectRoot = path.resolve(__dirname, '../../') 12 | 13 | var webpackConfig = merge(baseConfig, { 14 | // use inline sourcemap for karma-sourcemap-loader 15 | module: { 16 | loaders: utils.styleLoaders() 17 | }, 18 | devtool: '#inline-source-map', 19 | vue: { 20 | loaders: { 21 | js: 'isparta' 22 | } 23 | }, 24 | plugins: [ 25 | new webpack.DefinePlugin({ 26 | 'process.env': require('../../config/test.env') 27 | }) 28 | ] 29 | }) 30 | 31 | // no need for app entry during tests 32 | delete webpackConfig.entry 33 | 34 | // make sure isparta loader is applied before eslint 35 | webpackConfig.module.preLoaders = webpackConfig.module.preLoaders || [] 36 | webpackConfig.module.preLoaders.unshift({ 37 | test: /\.js$/, 38 | loader: 'isparta', 39 | include: path.resolve(projectRoot, 'src') 40 | }) 41 | 42 | // only apply babel for test files when using isparta 43 | webpackConfig.module.loaders.some(function (loader, i) { 44 | if (loader.loader === 'babel') { 45 | loader.include = path.resolve(projectRoot, 'test/unit') 46 | return true 47 | } 48 | }) 49 | 50 | module.exports = function (config) { 51 | config.set({ 52 | // to run in additional browsers: 53 | // 1. install corresponding karma launcher 54 | // http://karma-runner.github.io/0.13/config/browsers.html 55 | // 2. add it to the `browsers` array below. 56 | browsers: ['PhantomJS', 'Chrome', 'Firefox'], 57 | // mocha本身不包含断言库 58 | frameworks: ['mocha', 'sinon-chai'], 59 | reporters: ['spec', 'coverage'], 60 | files: ['./index.js'], 61 | preprocessors: { 62 | './index.js': ['webpack', 'sourcemap'] 63 | }, 64 | webpack: webpackConfig, 65 | webpackMiddleware: { 66 | noInfo: true 67 | }, 68 | coverageReporter: { 69 | dir: './coverage', 70 | reporters: [ 71 | { type: 'lcov', subdir: '.' }, 72 | { type: 'text-summary' } 73 | ] 74 | } 75 | }) 76 | } 77 | -------------------------------------------------------------------------------- /IM_analyze/src/main.py: -------------------------------------------------------------------------------- 1 | #coding=utf-8 2 | ''' 3 | Created on 2016.10.13 4 | 5 | @author: xiaoq 6 | ''' 7 | 8 | import json 9 | from file_reader import read_file 10 | from user import * 11 | from func import * 12 | 13 | 14 | if __name__ == '__main__': 15 | records = read_file("data.txt") 16 | name2QQ_id = {} 17 | users = {} 18 | for record in records: 19 | #循环处理聊天记录 20 | #record是一个字典,包括QQ_id,name,timestamp,words等keys 21 | QQ_id = record["QQ_id"] 22 | #生成新用户,并不断更新用户name 23 | if not users.has_key(QQ_id): 24 | newUser = User(QQ_id, record["name"]) 25 | name2QQ_id[record["name"]] = QQ_id 26 | newUser.addRecord(record) 27 | users[QQ_id] = newUser 28 | else: 29 | users[QQ_id].name = record["name"] 30 | name2QQ_id[record["name"]] = QQ_id 31 | users[QQ_id].addRecord(record) 32 | #建立QQ号和昵称之间的映射,以及index与QQ号之间的映射 33 | index2QQ_id = {} 34 | QQ_id2index = {} 35 | index2name = {} 36 | index = 0 37 | for userID in users.keys(): 38 | index2QQ_id[index] = userID 39 | index2name[index] = users[userID].name 40 | QQ_id2index[userID] = index 41 | index = index + 1 42 | 43 | similarityMatrix = [([0] * len(users)) for i in range(len(users))] #用户相似度矩阵 44 | 45 | maxSimilarity = 0 46 | #计算用户之间的亲密度 47 | for user1 in users.keys(): 48 | for user2 in users.keys(): 49 | if user1 != user2: 50 | similarity = getSimilarity(users[user1], users[user2]) #计算亲密度 51 | if similarity > maxSimilarity: 52 | maxSimilarity = similarity #记录相似度的最大值,用于归一化 53 | similarityMatrix[QQ_id2index[user1]][QQ_id2index[user2]] = similarity 54 | similarityMatrix[QQ_id2index[user2]][QQ_id2index[user1]] = similarity 55 | #归一化处理 56 | for i in range(len(users)): 57 | for j in range(len(users)): 58 | similarityMatrix[i][j] = int(float(similarityMatrix[i][j]) / maxSimilarity * 100) 59 | 60 | atCount = getAtInfo(QQ_id2index, name2QQ_id, users) #用户互相@计数 61 | 62 | dayVectors = [] 63 | for i in range(len(users)): 64 | dayVectors.append(users[index2QQ_id[i]].dayVector) 65 | 66 | 67 | print index2name 68 | store(index2QQ_id, 'index2QQ_id') 69 | store(dayVectors, 'dayVectors') 70 | store(similarityMatrix, 'similarityMatrix') 71 | store(atCount, 'atCount') 72 | print "!!!!" 73 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "family", 3 | "version": "1.0.0", 4 | "description": "the statistics about tong2 family", 5 | "author": "yuhanhou", 6 | "private": true, 7 | "scripts": { 8 | "dev": "node build/dev-server.js", 9 | "build": "node build/build.js", 10 | "unit": "karma start test/unit/karma.conf.js --single-run", 11 | "test": "npm run unit" 12 | }, 13 | "dependencies": { 14 | "bootstrap": "^3.3.7", 15 | "echarts": "^3.3.0", 16 | "echarts-wordcloud": "^1.0.2", 17 | "vue": "^2.0.1", 18 | "vue-resource": "^1.0.3", 19 | "vue-router": "^2.0.1", 20 | "vuex": "^2.0.0" 21 | }, 22 | "devDependencies": { 23 | "autoprefixer": "^6.4.0", 24 | "babel-core": "^6.0.0", 25 | "babel-loader": "^6.0.0", 26 | "babel-plugin-transform-runtime": "^6.0.0", 27 | "babel-polyfill": "^6.16.0", 28 | "babel-preset-es2015": "^6.0.0", 29 | "babel-preset-stage-2": "^6.0.0", 30 | "babel-register": "^6.0.0", 31 | "chai": "^3.5.0", 32 | "chalk": "^1.1.3", 33 | "chromedriver": "^2.21.2", 34 | "connect-history-api-fallback": "^1.1.0", 35 | "cross-spawn": "^4.0.2", 36 | "css-loader": "^0.25.0", 37 | "eventsource-polyfill": "^0.9.6", 38 | "express": "^4.13.3", 39 | "extract-text-webpack-plugin": "^1.0.1", 40 | "file-loader": "^0.9.0", 41 | "function-bind": "^1.0.2", 42 | "html-webpack-plugin": "^2.8.1", 43 | "http-proxy-middleware": "^0.17.2", 44 | "inject-loader": "^2.0.1", 45 | "isparta-loader": "^2.0.0", 46 | "json-loader": "^0.5.4", 47 | "karma": "^1.3.0", 48 | "karma-chrome-launcher": "^2.0.0", 49 | "karma-coverage": "^1.1.1", 50 | "karma-firefox-launcher": "^1.0.0", 51 | "karma-mocha": "^1.2.0", 52 | "karma-phantomjs-launcher": "^1.0.0", 53 | "karma-sinon-chai": "^1.2.0", 54 | "karma-sourcemap-loader": "^0.3.7", 55 | "karma-spec-reporter": "0.0.26", 56 | "karma-webpack": "^1.7.0", 57 | "lolex": "^1.4.0", 58 | "mocha": "^3.1.0", 59 | "nightwatch": "^0.9.8", 60 | "opn": "^4.0.2", 61 | "ora": "^0.3.0", 62 | "phantomjs-prebuilt": "^2.1.3", 63 | "selenium-server": "2.53.1", 64 | "semver": "^5.3.0", 65 | "shelljs": "^0.7.4", 66 | "sinon": "^1.17.3", 67 | "sinon-chai": "^2.8.0", 68 | "url-loader": "^0.5.7", 69 | "vue-loader": "^9.4.0", 70 | "vue-style-loader": "^1.0.0", 71 | "webpack": "^1.13.2", 72 | "webpack-dev-middleware": "^1.8.3", 73 | "webpack-hot-middleware": "^2.12.2", 74 | "webpack-merge": "^0.14.1" 75 | }, 76 | "engines": { 77 | "node": ">= 4.0.0", 78 | "npm": ">= 3.0.0" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /src/components/graduate.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 79 | 80 | -------------------------------------------------------------------------------- /src/components/single.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 83 | 84 | -------------------------------------------------------------------------------- /static/data/atCount.json: -------------------------------------------------------------------------------- 1 | [[0, 2, 1, 0, 1, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0], [1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 1, 2, 7, 1, 0, 7, 1, 0, 5, 0, 0, 0, 1, 0, 3, 0, 0, 2, 1, 1, 1, 0, 4, 6, 1, 0, 0, 0], [0, 0, 1, 0, 4, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [10, 4, 7, 1, 0, 0, 0, 6, 0, 3, 17, 1, 0, 0, 2, 0, 4, 0, 0, 0, 0, 1, 0, 0, 4, 3, 4, 3, 3, 0], [0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [1, 2, 3, 4, 3, 0, 4, 1, 0, 3, 3, 0, 3, 0, 0, 3, 3, 0, 0, 1, 4, 8, 1, 1, 6, 1, 0, 0, 4, 1], [0, 1, 2, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [21, 2, 8, 3, 9, 5, 0, 2, 1, 0, 0, 9, 1, 0, 1, 1, 9, 0, 1, 1, 2, 0, 0, 8, 19, 2, 0, 5, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 1, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 2, 0, 0, 2, 1, 0, 4, 0, 1, 6, 1, 0, 0, 1, 1, 2, 0, 0, 0, 1, 1, 0, 0, 0, 4, 1, 0, 1, 0], [0, 0, 3, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 1, 2, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 2, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0], [0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] -------------------------------------------------------------------------------- /src/components/bedroom.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 88 | 89 | -------------------------------------------------------------------------------- /src/components/eat.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 97 | 98 | -------------------------------------------------------------------------------- /src/components/header.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 55 | 56 | 117 | -------------------------------------------------------------------------------- /src/components/cloud.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 87 | 104 | 105 | -------------------------------------------------------------------------------- /src/components/login.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 58 | 59 | -------------------------------------------------------------------------------- /static/data/similarityMatrix.json: -------------------------------------------------------------------------------- 1 | [ 2 | [0, 12, 11, 27, 32, 15, 9, 45, 0, 7, 71, 10, 3, 0, 47, 31, 39, 4, 26, 27, 31, 23, 16, 20, 19, 22, 15, 16, 1, 0], 3 | [12, 0, 32, 4, 86, 11, 0, 39, 11, 32, 53, 6, 71, 1, 4, 1, 30, 1, 1, 6, 51, 31, 4, 0, 56, 59, 14, 1, 7, 0], 4 | [11, 32, 0, 23, 44, 46, 17, 64, 13, 50, 55, 27, 10, 0, 14, 12, 50, 2, 28, 17, 28, 45, 13, 24, 75, 100, 21, 5, 61, 6], 5 | [27, 4, 23, 0, 34, 17, 49, 45, 8, 2, 26, 12, 14, 0, 2, 12, 19, 2, 9, 11, 12, 15, 13, 1, 24, 26, 24, 5, 17, 0], 6 | [32, 86, 44, 34, 0, 22, 13, 49, 23, 22, 86, 16, 46, 0, 36, 10, 73, 7, 22, 30, 22, 34, 8, 18, 62, 46, 38, 40, 41, 0], 7 | [15, 11, 46, 17, 22, 0, 7, 23, 2, 15, 43, 14, 1, 0, 4, 13, 26, 1, 12, 42, 8, 10, 37, 28, 12, 10, 17, 13, 23, 0], 8 | [9, 0, 17, 49, 13, 7, 0, 24, 15, 0, 8, 4, 30, 0, 3, 9, 8, 2, 8, 7, 25, 19, 9, 8, 36, 34, 7, 2, 10, 0], 9 | [45, 39, 64, 45, 49, 23, 24, 0, 20, 46, 51, 17, 31, 0, 22, 25, 62, 6, 25, 21, 33, 82, 17, 8, 64, 61, 34, 26, 42, 17], 10 | [0, 11, 13, 8, 23, 2, 15, 20, 0, 11, 39, 29, 15, 0, 0, 4, 15, 0, 9, 8, 29, 5, 11, 34, 25, 23, 15, 1, 0, 0], 11 | [7, 32, 50, 2, 22, 15, 0, 46, 11, 0, 23, 5, 5, 0, 2, 21, 29, 4, 10, 12, 2, 25, 9, 1, 48, 53, 11, 3, 18, 0], 12 | [71, 53, 55, 26, 86, 43, 8, 51, 39, 23, 0, 42, 31, 8, 36, 29, 58, 0, 28, 47, 43, 38, 29, 51, 70, 36, 22, 33, 29, 13], 13 | [10, 6, 27, 12, 16, 14, 4, 17, 29, 5, 42, 0, 1, 0, 11, 14, 40, 0, 12, 11, 15, 11, 81, 45, 14, 26, 2, 3, 0, 0], 14 | [3, 71, 10, 14, 46, 1, 30, 31, 15, 5, 31, 1, 0, 0, 1, 3, 13, 7, 3, 10, 38, 12, 2, 2, 44, 22, 5, 3, 13, 0], 15 | [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 16 | [47, 4, 14, 2, 36, 4, 3, 22, 0, 2, 36, 11, 1, 0, 0, 18, 13, 3, 37, 2, 16, 25, 2, 5, 15, 8, 6, 26, 0, 0], 17 | [31, 1, 12, 12, 10, 13, 9, 25, 4, 21, 29, 14, 3, 0, 18, 0, 27, 0, 17, 21, 18, 35, 6, 4, 38, 12, 11, 1, 1, 0], 18 | [39, 30, 50, 19, 73, 26, 8, 62, 15, 29, 58, 40, 13, 0, 13, 27, 0, 1, 35, 26, 21, 43, 10, 9, 49, 69, 23, 13, 23, 0], 19 | [4, 1, 2, 2, 7, 1, 2, 6, 0, 4, 0, 0, 7, 0, 3, 0, 1, 0, 5, 67, 1, 8, 16, 0, 2, 3, 6, 3, 1, 0], 20 | [26, 1, 28, 9, 22, 12, 8, 25, 9, 10, 28, 12, 3, 0, 37, 17, 35, 5, 0, 8, 16, 17, 10, 12, 10, 16, 13, 18, 2, 0], 21 | [27, 6, 17, 11, 30, 42, 7, 21, 8, 12, 47, 11, 10, 0, 2, 21, 26, 67, 8, 0, 9, 12, 16, 14, 15, 21, 10, 11, 7, 0], 22 | [31, 51, 28, 12, 22, 8, 25, 33, 29, 2, 43, 15, 38, 0, 16, 18, 21, 1, 16, 9, 0, 17, 30, 1, 52, 33, 9, 4, 2, 0], 23 | [23, 31, 45, 15, 34, 10, 19, 82, 5, 25, 38, 11, 12, 0, 25, 35, 43, 8, 17, 12, 17, 0, 13, 8, 38, 51, 21, 23, 6, 0], 24 | [16, 4, 13, 13, 8, 37, 9, 17, 11, 9, 29, 81, 2, 0, 2, 6, 10, 16, 10, 16, 30, 13, 0, 6, 16, 10, 25, 4, 0, 0], 25 | [20, 0, 24, 1, 18, 28, 8, 8, 34, 1, 51, 45, 2, 0, 5, 4, 9, 0, 12, 14, 1, 8, 6, 0, 9, 11, 1, 15, 2, 0], 26 | [19, 56, 75, 24, 62, 12, 36, 64, 25, 48, 70, 14, 44, 0, 15, 38, 49, 2, 10, 15, 52, 38, 16, 9, 0, 72, 42, 10, 30, 3], 27 | [22, 59, 100, 26, 46, 10, 34, 61, 23, 53, 36, 26, 22, 0, 8, 12, 69, 3, 16, 21, 33, 51, 10, 11, 72, 0, 66, 6, 14, 0], 28 | [15, 14, 21, 24, 38, 17, 7, 34, 15, 11, 22, 2, 5, 0, 6, 11, 23, 6, 13, 10, 9, 21, 25, 1, 42, 66, 0, 6, 5, 56], 29 | [16, 1, 5, 5, 40, 13, 2, 26, 1, 3, 33, 3, 3, 0, 26, 1, 13, 3, 18, 11, 4, 23, 4, 15, 10, 6, 6, 0, 7, 0], 30 | [1, 7, 61, 17, 41, 23, 10, 42, 0, 18, 29, 0, 13, 0, 0, 1, 23, 1, 2, 7, 2, 6, 0, 2, 30, 14, 5, 7, 0, 0], 31 | [0, 0, 6, 0, 0, 0, 0, 17, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 56, 0, 0, 0] 32 | ] 33 | 34 | -------------------------------------------------------------------------------- /src/components/selfstudy.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 129 | 130 | -------------------------------------------------------------------------------- /src/components/canteen.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 130 | 131 | -------------------------------------------------------------------------------- /src/components/building.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 131 | 132 | -------------------------------------------------------------------------------- /src/components/gotobed.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 135 | 136 | -------------------------------------------------------------------------------- /src/components/getup.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 144 | 145 | -------------------------------------------------------------------------------- /src/components/interest.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 146 | 147 | -------------------------------------------------------------------------------- /src/components/onlyme.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 157 | 158 | -------------------------------------------------------------------------------- /src/components/difficult.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 197 | 198 | -------------------------------------------------------------------------------- /src/components/chat.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 221 | 222 | -------------------------------------------------------------------------------- /src/components/amuse.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 229 | 230 | -------------------------------------------------------------------------------- /static/data/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "cloud": { 3 | "title": "通信1502班群聊记录关键词", 4 | "wordContent": [ 5 | { "name": "通信1502班", "value": 80 }, 6 | { "name": "阳阳", "value": 50 }, 7 | { "name": "超东", "value": 50 }, 8 | { "name": "秀秀", "value": 50 }, 9 | { "name": "东哥", "value": 40 }, 10 | { "name": "鑫鑫", "value": 40 }, 11 | { "name": "路远", "value": 40 }, 12 | { "name": "越越", "value": 40 }, 13 | { "name": "小金", "value": 35 }, 14 | { "name": "班班", "value": 35 }, 15 | { "name": "邓鸡蛋", "value": 35 }, 16 | { "name": "启迪", "value": 35 }, 17 | { "name": "星星", "value": 35 }, 18 | { "name": "佳佳", "value": 35 }, 19 | { "name": "洲哥", "value": 35 }, 20 | { "name": "露露", "value": 35 }, 21 | { "name": "帅殷", "value": 35 }, 22 | { "name": "小灰灰", "value": 30 }, 23 | { "name": "嘉成", "value": 30 }, 24 | { "name": "良良", "value": 30 }, 25 | { "name": "宇航", "value": 30 }, 26 | { "name": "莘然", "value": 30 }, 27 | { "name": "若非", "value": 30 }, 28 | { "name": "年年", "value": 30 }, 29 | { "name": "大黄", "value": 30 }, 30 | { "name": "翔渣", "value": 30 }, 31 | { "name": "高谭", "value": 30 }, 32 | { "name": "弱鸡", "value": 30 }, 33 | { "name": "楠神", "value": 30 }, 34 | { "name": "千赫", "value": 30 }, 35 | { "name": "金晖", "value": 30 }, 36 | { "name": "啦啦啦", "value": 50 }, 37 | { "name": "寝室", "value": 40 }, 38 | { "name": "红包", "value": 40 }, 39 | { "name": "学渣", "value": 40 }, 40 | { "name": "选课", "value": 40 }, 41 | { "name": "厉害勒", "value": 30 }, 42 | { "name": "有毒", "value": 30 }, 43 | { "name": "实验", "value": 30 }, 44 | { "name": "生日快乐", "value": 30 }, 45 | { "name": "优秀", "value": 20 }, 46 | { "name": "微积分", "value": 20 }, 47 | { "name": "电路", "value": 20 }, 48 | { "name": "选修", "value": 20 }, 49 | { "name": "物理", "value": 20 }, 50 | { "name": "自习", "value": 20 }, 51 | { "name": "秋游", "value": 20 }, 52 | { "name": "宝宝", "value": 20 }, 53 | { "name": "好困哇", "value": 16 }, 54 | { "name": "上课", "value": 16 }, 55 | { "name": "嘿嘿嘿", "value": 16 }, 56 | { "name": "投票", "value": 16 }, 57 | { "name": "义工", "value": 16 }, 58 | { "name": "可怕", "value": 16 }, 59 | { "name": "请吃饭", "value": 16 }, 60 | { "name": "英语", "value": 16 }, 61 | { "name": "妹子", "value": 16 }, 62 | { "name": "加油", "value": 12 }, 63 | { "name": "羡慕", "value": 12 }, 64 | { "name": "我去", "value": 12 }, 65 | { "name": "啧啧啧", "value": 12 } 66 | ] 67 | }, 68 | "building": { 69 | "buildContent": [ 70 | { "name": "爱因斯坦广场", "value": 1 }, 71 | { "name": "校史馆", "value": 1 }, 72 | { "name": "亮胜楼", "value": 1 }, 73 | { "name": "醉晚亭", "value": 1 }, 74 | { "name": "光谷体育馆", "value": 2 }, 75 | { "name": "机械大楼", "value": 2 }, 76 | { "name": "东园", "value": 2 }, 77 | { "name": "青年园", "value": 2 }, 78 | { "name": "管理学院", "value": 2 }, 79 | { "name": "大学四年顶个球", "value": 3 }, 80 | { "name": "西十二教学楼", "value": 3 }, 81 | { "name": "毛爷爷像", "value": 3 }, 82 | { "name": "东九教学楼", "value": 8 }, 83 | { "name": "图书馆", "value": 9 } 84 | ], 85 | "geoCoordMap": { 86 | "爱因斯坦广场": [114.442057, 30.519878], 87 | "校史馆": [114.420044, 30.517681], 88 | "亮胜楼": [114.43721, 30.515064], 89 | "醉晚亭": [114.422819, 30.516359], 90 | "光谷体育馆": [114.4248, 30.513827], 91 | "机械大楼": [114.424104, 30.518836], 92 | "东园": [114.442479, 30.519365], 93 | "青年园": [114.415718, 30.518307], 94 | "管理学院": [114.422712, 30.520671], 95 | "大学四年顶个球": [114.416015, 30.519217], 96 | "西十二教学楼": [114.413697, 30.514749], 97 | "毛爷爷像": [114.420017, 30.514725], 98 | "东九教学楼": [114.433451, 30.519458], 99 | "图书馆": [114.418508, 30.518443] 100 | } 101 | }, 102 | "canteen": { 103 | "canteenContent": [ 104 | { "name": "喻园", "value": 1 }, 105 | { "name": "西边小吃城", "value": 1 }, 106 | { "name": "百景园", "value": 2 }, 107 | { "name": "东教工", "value": 3 }, 108 | { "name": "韵苑", "value": 7 }, 109 | { "name": "学一", "value": 7 }, 110 | { "name": "学二", "value": 7 }, 111 | { "name": "东一", "value": 8 }, 112 | { "name": "西一", "value": 10 }, 113 | { "name": "东园", "value": 22 } 114 | ], 115 | "geoCoordMap": { 116 | "喻园" :[114.421391, 30.521893], 117 | "西边小吃城" :[114.413288, 30.520419], 118 | "百景园" :[114.414703, 30.521854], 119 | "东教工" :[114.438279, 30.512687], 120 | "韵苑" :[114.43845, 30.520026], 121 | "学一" :[114.438459, 30.517035], 122 | "学二" :[114.438203, 30.517693], 123 | "东一" :[114.425905, 30.516678], 124 | "西一" :[114.412439, 30.520045], 125 | "东园" :[114.442483, 30.519353] 126 | } 127 | }, 128 | "selfstudy": { 129 | "studyContent": [ 130 | { "name": "西五", "value": 3 }, 131 | { "name": "图书馆", "value": 14 }, 132 | { "name": "东十二", "value": 35 }, 133 | { "name": "东九", "value": 43 } 134 | ], 135 | "geoCoordMap": { 136 | "西五": [114.416517, 30.51651], 137 | "图书馆": [114.418508, 30.518443], 138 | "东十二": [114.440574, 30.517961], 139 | "东九": [114.433451, 30.519458] 140 | } 141 | }, 142 | "difficult": { 143 | "course": ["模电", "都很难", "全不难", "数电", "复变", "电路实验", "大物"], 144 | "courseDiff": [ 145 | { "value": 13, "name": "模电" }, 146 | { "value": 5, "name": "都很难" }, 147 | { "value": 5, "name": "全不难" }, 148 | { "value": 3, "name": "数电" }, 149 | { "value": 2, "name": "复变" }, 150 | { "value": 2, "name": "电路实验" }, 151 | { "value": 1, "name": "大物" } 152 | ], 153 | "courseData": [13, 5, 5, 3, 2, 2, 1] 154 | }, 155 | "interest": { 156 | "course": ["数电", "模电", "全没兴趣", "体育", "人文选修", "复变", "数据结构", "大物", "电路实验"], 157 | "courseInter": [ 158 | { "value": 18, "name": "数电" }, 159 | { "value": 17, "name": "模电" }, 160 | { "value": 10, "name": "全没兴趣" }, 161 | { "value": 6, "name": "体育" }, 162 | { "value": 4, "name": "人文选修" }, 163 | { "value": 4, "name": "复变" }, 164 | { "value": 3, "name": "数据结构" }, 165 | { "value": 3, "name": "大物" }, 166 | { "value": 2, "name": "电路实验" } 167 | ], 168 | "courseData": [18, 17, 10, 6, 4, 4, 3, 3, 2] 169 | }, 170 | "bedroom": { 171 | "opinion": ["学习氛围差", "学习氛围一般", "学习氛围很好"], 172 | "opinionData": [ 173 | { "value": 26, "name": "学习氛围差" }, 174 | { "value": 31, "name": "学习氛围一般" }, 175 | { "value": 8, "name": "学习氛围很好" } 176 | ] 177 | }, 178 | "graduate": { 179 | "opinion": ["国内读研", "工作", "出国深造", "创业"], 180 | "opinionData": [ 181 | { "value": 58, "name": "国内读研", "selected": true }, 182 | { "value": 26, "name": "工作" }, 183 | { "value": 10, "name": "出国深造" }, 184 | { "value": 1, "name": "创业" } 185 | ] 186 | }, 187 | "getup": { 188 | "time": ["6点", "6点半", "7点", "7点15", "7点半", "8点", "8点半及以后"], 189 | "number": [2, 5, 18, 11, 17, 1, 3], 190 | "numberData": [ 191 | { "value": 2, "name": "6点" }, 192 | { "value": 5, "name": "6点半" }, 193 | { "value": 18, "name": "7点" }, 194 | { "value": 11, "name": "7点15" }, 195 | { "value": 17, "name": "7点半" }, 196 | { "value": 1, "name": "8点" }, 197 | { "value": 3, "name": "8点半及以后" } 198 | ] 199 | }, 200 | "gotobed": { 201 | "time": ["11点", "11点半", "12点", "12点半", "1点半及以后"], 202 | "number": [4, 9, 32, 14, 4], 203 | "numberData": [ 204 | { "value": 4, "name": "11点" }, 205 | { "value": 9, "name": "11点半" }, 206 | { "value": 32, "name": "12点" }, 207 | { "value": 14, "name": "12点半" }, 208 | { "value": 4, "name": "1点半及以后" } 209 | ] 210 | }, 211 | "eat": { 212 | "money": ["10元", "15元", "20元", "25元", "30元", "35元", "40元"], 213 | "number": [2, 11, 30, 30, 16, 2, 4] 214 | }, 215 | "amuse": { 216 | "amuse": ["打游戏", "刷微博朋友圈", "看剧", "运动", "听歌", "看小说"], 217 | "amuseData": [ 218 | { "value": 26, "name": "打游戏"}, 219 | { "value": 16, "name": "刷微博朋友圈"}, 220 | { "value": 12, "name": "看剧"}, 221 | { "value": 10, "name": "运动"}, 222 | { "value": 2, "name": "听歌"}, 223 | { "value": 2, "name": "看小说"} 224 | ] 225 | }, 226 | "single": { 227 | "course": ["是", "否"], 228 | "courseDiff": [ 229 | { "value": 72, "name": "是" }, 230 | { "value": 23, "name": "否" } 231 | ] 232 | }, 233 | "chat": { 234 | "names": ["lxx", "lx", "pn", "xrf", "lxd", "zrj", "wsr", "lcd", "gt", "zsx", "wly", "yyz", "zn", "zls", "hrh", "dp", "yjw", "ljh", "ryh", "zsh", "mqd", "prj", "gyc", "xzl", "qy", "zxz", "hy", "hb", "zly"] 235 | } 236 | } -------------------------------------------------------------------------------- /static/data/dayVectors.json: -------------------------------------------------------------------------------- 1 | [[0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0, 0, 3, 0, 0, 4, 5, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 14, 2, 6, 0, 3, 11, 6, 5, 4, 8, 3, 0, 2, 0, 4, 9, 2, 0, 7, 1, 3, 1, 0, 0, 1, 7, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 3, 2, 0, 10, 8, 0, 6, 1, 4, 5, 0, 10, 4, 0, 1, 0, 5, 1, 2, 0, 1, 0, 1, 2, 0, 0, 0, 1, 9, 4, 2, 1, 0, 1, 3, 3, 0, 1, 0, 1, 8, 17, 9, 5, 4, 7, 16, 13, 1, 12, 11, 1, 8, 4, 0, 3, 4, 10, 0, 5, 5, 5, 3, 3, 0, 3, 4, 1, 5, 7, 12, 0, 5, 2, 1, 2, 3, 2, 2, 2, 18, 7, 16, 6, 5, 1, 10, 0, 4, 0, 10, 3, 8, 14, 0, 0, 0, 1, 0, 9, 8, 5, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 3, 0, 0, 1, 9, 3, 0, 1, 0, 0, 0, 0, 0, 0, 12, 10, 0, 0, 0, 0, 1, 0, 3, 5, 4, 2, 0, 6, 8, 11, 8, 0, 4, 4, 0, 2, 4, 2, 2, 0, 0, 2, 3, 5, 1, 1, 18, 20, 11, 13, 7, 14, 1, 10, 2, 10, 2, 10, 26, 1, 3, 19, 0, 11, 12, 1, 0, 2, 0, 1, 2, 2, 2, 0, 0, 9, 8, 0, 2, 2, 1, 14, 22, 5, 2, 1, 0, 3, 6, 18, 2, 6, 0, 14, 9, 2, 0, 0, 4, 6, 25, 14, 9, 12, 4, 4, 4, 8, 0, 6, 6, 3, 10, 2, 2, 0, 1, 12, 14, 2, 13, 9, 0, 14, 1, 0, 1, 0, 0, 6, 0, 3, 10, 1, 4, 15, 7, 0, 14, 1, 7, 0, 0, 3, 3, 4, 9, 0, 0, 4, 0, 0, 2, 0, 0, 2, 9, 3, 0, 5, 4, 0, 0, 0, 0, 0, 6, 3, 0, 0], [2, 0, 0, 0, 0, 3, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 4, 3, 2, 5, 2, 0, 0, 3, 3, 3, 3, 1, 10, 2, 2, 3, 2, 1, 3, 9, 6, 6, 8, 7, 5, 10, 5, 5, 23, 4, 2, 5, 1, 5, 2, 6, 24, 16, 4, 5, 13, 25, 10, 3, 22, 16, 20, 13, 1, 4, 20, 11, 19, 15, 8, 9, 9, 7, 15, 11, 11, 15, 6, 2, 8, 14, 9, 8, 8, 7, 5, 9, 4, 1, 3, 11, 10, 0, 0, 3, 3, 0, 0, 13, 0, 17, 14, 15, 6, 8, 1, 2, 10, 9, 11, 4, 8, 12, 8, 18, 8, 1, 13, 15, 10, 5, 10, 23, 9, 20, 10, 9, 8, 17, 15, 3, 34, 12, 6, 3, 6, 4, 1, 13, 8, 7, 7, 14, 3, 11, 19, 23, 31, 23, 21, 2, 16, 8, 5, 13, 4, 19, 17, 15, 4, 7, 4, 11, 6, 2, 4, 6, 15, 8, 6, 3, 9, 8, 0, 14, 7, 3, 13], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 1, 3, 2, 0, 2, 16, 6, 8, 10, 4, 1, 5, 0, 0, 3, 0, 0, 1, 1, 0, 0, 0, 0, 6, 0, 0, 0, 0, 1, 1, 5, 4, 2, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 3, 5, 0, 0, 2, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 3, 7, 0, 0, 2, 4, 3, 0, 9, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 4, 4, 0, 3, 0, 0, 1, 0, 3, 2, 0, 0, 0, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 3, 2, 0, 0, 1, 0, 8, 9, 6, 0, 0, 2, 3, 8, 1, 2, 10, 3, 12, 17, 15, 3, 11, 4, 16, 4, 1, 1, 0, 1, 1], [1, 4, 2, 0, 0, 5, 7, 2, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 0, 1, 2, 3, 1, 0, 0, 0, 4, 12, 3, 2, 2, 2, 13, 1, 13, 9, 7, 0, 7, 13, 11, 13, 6, 24, 1, 19, 3, 4, 10, 0, 2, 18, 34, 16, 7, 7, 12, 6, 14, 14, 7, 13, 25, 21, 27, 16, 16, 8, 3, 3, 8, 3, 0, 4, 0, 3, 8, 0, 7, 4, 3, 3, 3, 4, 1, 7, 18, 20, 12, 13, 7, 4, 0, 6, 18, 10, 7, 16, 6, 13, 2, 0, 5, 7, 12, 1, 0, 11, 5, 16, 2, 11, 12, 7, 9, 8, 9, 8, 4, 11, 9, 5, 8, 8, 12, 6, 5, 5, 12, 2, 6, 10, 8, 19, 3, 13, 8, 2, 11, 11, 10, 4, 4, 8, 7, 5, 6, 6, 18, 7, 14, 26, 11, 4, 7, 12, 1, 7, 18, 4, 1, 3, 1, 4, 3, 7, 16, 2, 3, 6, 5, 13, 1, 6, 7], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 5, 0, 0, 1, 0, 0, 0, 1, 2, 1, 7, 2, 1, 2, 3, 0, 3, 2, 0, 4, 1, 1, 1, 0, 1, 1, 8, 1, 1, 0, 1, 1, 0, 0, 0, 0, 2, 1, 3, 3, 9, 6, 7, 8, 16, 0, 6, 6, 3, 1, 0, 4, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 3, 1, 0, 0, 4, 3, 3, 0, 3, 6, 1, 1, 0, 0, 0, 0, 7, 0, 4, 11, 9, 2, 1, 0, 0, 0, 0, 0, 2, 2, 3, 0, 4, 14, 6, 3, 2, 3, 1, 2, 5, 0, 3, 6, 3, 0, 1, 2, 1, 0, 3, 8, 0, 0, 4, 1, 0, 7, 5, 10, 5, 4, 5, 1, 4, 0, 0, 3, 3, 3, 3, 0, 2, 0, 0, 0, 1, 0, 0, 1, 0, 2, 7, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 3, 1, 0, 0, 1, 0, 3, 3, 1, 0, 3, 1, 0, 1, 5, 4, 0, 4, 0, 0, 0, 0, 0, 1, 0, 0, 0, 6, 2, 1, 0, 1, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 6, 1, 0, 0, 0, 1, 2, 1, 4, 0, 1, 2, 0, 0, 0, 3, 0, 0, 1, 2, 3, 4, 6, 4, 0, 1, 2, 4, 1, 0, 1, 0, 2, 3, 2, 0, 0, 1, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 1, 0, 2, 0, 0, 0, 0, 1, 1, 3, 9, 2, 0, 1, 0, 1, 2, 1, 0, 0, 2, 1], [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 2, 1, 0, 2, 1, 1, 2, 1, 3, 3, 4, 0, 2, 5, 5, 2, 10, 12, 8, 13, 11, 15, 9, 5, 11, 6, 4, 2, 4, 5, 8, 13, 8, 4, 15, 8, 11, 14, 8, 10, 8, 17, 11, 11, 16, 10, 8, 17, 15, 5, 4, 13, 9, 8, 2, 1, 1, 0, 2, 0, 0, 3, 3, 2, 0, 4, 19, 5, 6, 5, 8, 13, 7, 8, 1, 3, 2, 2, 4, 6, 4, 2, 0, 5, 5, 4, 5, 8, 11, 7, 5, 5, 9, 7, 6, 13, 13, 15, 5, 10, 7, 6, 3, 4, 13, 17, 13, 18, 20, 10, 10, 8, 11, 20, 7, 23, 13, 5, 12, 14, 10, 7, 3, 7, 1, 6, 14, 17, 13, 21, 14, 5, 3, 6, 3, 12, 30, 23, 8, 11, 21, 10, 5, 5, 12, 10, 4, 9, 10, 7, 9, 6, 5, 9, 3, 9, 5, 1, 5, 3], [1, 2, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 0, 0, 0, 0, 1, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 11, 4, 0, 0, 0, 0, 5, 0, 9, 3, 2, 0, 5, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 8, 0, 0, 3, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 4, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 11, 8, 5, 0, 0, 0, 0, 2, 0, 0, 1, 0, 0, 2, 0, 3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 2, 3, 5, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 8, 7, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 2, 0, 0, 0, 4, 4, 4, 0, 0, 3, 2], [5, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 8, 3, 3, 0, 3, 1, 2, 4, 2, 2, 5, 2, 0, 5, 2, 1, 3, 0, 1, 2, 7, 4, 3, 4, 0, 1, 6, 9, 0, 5, 7, 3, 1, 6, 4, 0, 4, 0, 0, 0, 0, 2, 6, 9, 2, 1, 1, 2, 12, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 3, 0, 12, 3, 1, 2, 7, 4, 12, 3, 1, 0, 0, 1, 2, 0, 2, 0, 0, 3, 11, 3, 0, 0, 5, 0, 2, 3, 0, 9, 0, 0, 0, 9, 1, 2, 2, 16, 1, 3, 2, 8, 19, 11, 3, 9, 9, 2, 3, 4, 7, 4, 2, 2, 1, 0, 0, 0, 0, 0, 2, 2, 1, 1, 3, 5, 1, 1, 2, 0, 0, 0, 0, 6], [0, 0, 4, 7, 0, 0, 1, 1, 0, 0, 4, 0, 0, 0, 1, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 2, 1, 0, 0, 0, 5, 2, 0, 0, 2, 6, 1, 13, 0, 4, 15, 4, 9, 14, 20, 7, 10, 6, 15, 14, 12, 14, 8, 10, 10, 11, 8, 6, 14, 9, 8, 7, 15, 13, 21, 12, 17, 13, 1, 2, 2, 9, 3, 13, 2, 8, 2, 15, 5, 42, 26, 14, 10, 4, 11, 19, 21, 12, 18, 18, 3, 1, 1, 2, 8, 20, 33, 18, 9, 11, 4, 12, 13, 8, 8, 3, 4, 10, 15, 22, 21, 2, 27, 32, 14, 3, 10, 8, 12, 11, 3, 7, 11, 13, 3, 26, 10, 12, 18, 34, 16, 24, 16, 14, 21, 17, 6, 12, 8, 4, 2, 5, 14, 21, 3, 2, 13, 17, 17, 1, 7, 0, 2, 10, 16, 17, 19, 16, 8, 6, 9, 10, 7, 8, 4, 0, 6, 12, 5, 8, 7, 6, 1, 10, 5, 10, 6, 13, 15, 4, 10, 5, 8, 7, 9, 7, 1, 0, 3, 3], [1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 3, 17, 10, 2, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 2, 8, 2, 0, 1, 0, 1, 2, 0, 1, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 3, 5, 6, 0, 3, 2, 0, 0, 0, 0, 0, 0, 7, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 3, 2, 2, 1, 6, 3, 5, 3, 0, 0, 0, 0, 0, 0, 3, 1, 0, 1, 3, 4, 2, 3, 2, 1, 3, 0, 2, 1, 0, 2, 2, 0, 1, 2, 5, 5, 1, 6, 0, 0, 0, 9, 0, 2, 8, 1, 2, 0, 2, 3, 0, 1, 2, 0, 0, 0, 0, 0, 5, 0, 1, 3, 1, 0, 6, 1, 0, 0, 0, 0, 4, 0, 3, 15, 5, 2, 6], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 1, 0, 1, 4, 3, 0, 0, 0, 4, 4, 2, 0, 0, 1, 1, 1, 3, 5, 2, 1, 2, 1, 1, 4, 0, 0, 1, 2, 3, 3, 2, 3, 2, 4, 1, 2, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 7, 1, 5, 9, 1, 0, 0, 0, 1, 1, 0, 0, 2, 0, 0, 1, 1, 0, 0, 0, 0, 8, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 5, 0, 2, 5, 0, 2, 3, 6, 3, 0, 0, 0, 1, 2, 1, 0, 6, 1, 0, 0, 2, 0, 0, 2, 1, 4, 9, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 4, 6, 0, 0, 0, 2, 0, 1, 0, 0, 2, 0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 1, 7, 7, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 3, 3, 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 3, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1, 0, 2, 0, 0, 6, 1, 0, 0, 0, 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [8, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 3, 3, 7, 0, 0, 0, 2, 4, 0, 0, 0, 0, 0, 17, 10, 1, 1, 0, 0, 0, 8, 7, 0, 0, 1, 8, 0, 0, 9, 1, 1, 0, 4, 3, 2, 0, 1, 6, 1, 3, 2, 0, 2, 7, 3, 6, 0, 0, 8, 0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 3, 3, 2, 0, 0, 0, 3, 4, 4, 3, 1, 2, 4, 0, 0, 2, 1, 0, 4, 0, 0, 0, 0, 5, 5, 7, 2, 2, 1, 9, 2, 0, 0, 13, 13, 4, 2, 6, 3, 5, 1, 0, 2, 4, 2, 4, 9, 1, 15, 3, 5, 9, 2, 2, 1, 1, 3, 0, 2, 2, 5, 6, 0, 0, 9, 9, 7, 14, 5, 4, 4, 3, 3, 9, 14, 11, 9, 8, 0, 1, 1, 0, 0, 0], [0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 5, 2, 11, 0, 3, 1, 0, 4, 5, 2, 1, 3, 2, 0, 2, 7, 1, 0, 0, 0, 3, 3, 1, 6, 0, 4, 7, 2, 1, 4, 2, 8, 4, 0, 1, 6, 4, 5, 9, 5, 5, 0, 1, 6, 0, 0, 3, 5, 2, 1, 0, 2, 0, 0, 0, 0, 2, 4, 1, 2, 1, 2, 0, 1, 1, 2, 3, 2, 2, 3, 7, 5, 4, 4, 1, 5, 6, 1, 3, 3, 3, 1, 0, 0, 3, 0, 4, 1, 2, 0, 1, 1, 4, 10, 4, 14, 5, 1, 5, 11, 5, 5, 1, 3, 5, 4, 6, 6, 12, 1, 1, 7, 5, 9, 3, 1, 2, 3, 0, 0, 2, 0, 0, 6, 4, 4, 4, 2, 1, 2, 5, 13, 5, 5, 1, 1, 6, 8, 3, 1, 0, 7, 2, 3, 5, 0, 2, 3], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 2, 1, 4, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 2, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 2, 1, 5, 2, 0, 0, 0, 1, 0, 1, 3, 2, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 1, 1, 0, 0, 3, 2, 0, 2, 1, 1, 0, 1, 0, 0, 0, 0, 6, 0, 1, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 2, 0, 1, 3, 0, 0, 2, 1, 0, 1, 2, 0], [1, 0, 0, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 6, 0, 1, 0, 0, 0, 0, 0, 2, 0, 3, 2, 0, 0, 2, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 0, 4, 3, 2, 1, 1, 2, 0, 3, 0, 1, 4, 0, 0, 0, 0, 1, 0, 0, 1, 4, 0, 6, 8, 2, 3, 6, 1, 0, 0, 2, 3, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 9, 4, 0, 0, 6, 2, 2, 0, 1, 2, 0, 0, 0, 0, 3, 0, 0, 0, 1, 1, 0, 0, 2, 0, 1, 11, 1, 1, 0, 0, 8, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 5, 7, 0, 1, 0, 0, 0, 0, 5, 3, 0, 4, 7, 2, 0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 5, 4, 0, 3, 2, 2, 0, 0, 3, 1, 3, 0, 0, 0, 2, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 4, 1, 0, 1, 1, 0, 0, 0, 0, 1, 2, 0, 5, 6, 6, 3, 0, 2, 1, 1, 0, 0, 0, 3, 5, 4, 0, 1, 2, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 2, 0, 0, 0, 3, 8, 5, 0, 1, 5, 2, 3, 0, 1, 0, 6, 0, 0, 1, 0, 0, 0, 0, 1, 15, 4, 12, 6, 3, 4, 0, 0, 0, 0, 0, 2, 6, 12, 6, 1, 0, 1, 0, 5, 12, 3, 5, 13, 3, 17, 12, 19, 5, 7, 2, 0, 2, 0, 9, 0, 1, 0, 0, 0, 0, 2, 1, 1, 0, 4, 1, 7, 3, 4, 0, 0, 4, 3, 0, 0, 1, 4, 0, 3, 6, 0, 1, 5, 1, 3, 2, 0, 1, 2, 0, 3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 1, 3, 1, 1, 1, 1, 3, 2, 0, 0, 1, 0, 0, 0, 4, 1, 2, 2, 2, 6, 1, 3, 2, 0, 2, 9, 0, 2, 2, 2, 1, 4, 2, 1, 9, 2, 15, 9, 2, 5, 0, 4, 6, 3, 7, 3, 3, 1, 1, 2, 3, 1, 2, 2, 0, 1, 4, 10, 8, 1, 3, 2, 2, 0, 0, 0, 4, 1, 1, 15, 4, 5, 1, 1, 0, 5, 6, 0, 3, 3, 5, 13, 4, 2, 8, 6, 8, 5, 4, 0, 1, 2, 1, 0, 4, 3, 4, 0, 5, 0, 6, 2, 1, 1, 3, 10, 9, 8, 26, 9, 2, 13, 9, 2, 1, 9, 4, 8, 3, 17, 2, 2, 2, 10, 18, 21, 9, 13, 8, 1, 3, 5, 3, 7, 9, 9, 2, 2, 10, 1, 0, 3, 9, 0, 4, 2, 3, 3, 1, 2, 2, 2, 0, 0, 1, 1, 2, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 10, 7, 3, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 0, 0, 0, 1, 1, 3, 5, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 4, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 1, 1, 0, 0, 2, 0, 0, 1, 3, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 1, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 8, 2, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 1, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 3, 0, 14, 1, 1, 0, 0, 3, 0, 2, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 2, 0, 1, 0, 4, 4, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, 4, 0, 1, 2, 3, 5, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 0, 0, 0, 0, 0, 0, 6, 9, 0, 0, 0, 1, 0, 1, 1, 5, 3, 1, 1, 0, 0, 0, 0, 0, 0, 3, 0, 0, 2, 0, 4, 0, 1, 0, 0, 0, 4, 1, 0, 0, 0, 0, 0], [0, 2, 0, 3, 1, 1, 0, 0, 0, 2, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2, 0, 4, 0, 0, 1, 6, 0, 0, 1, 1, 1, 3, 0, 3, 3, 16, 11, 3, 1, 3, 1, 5, 5, 12, 16, 15, 11, 10, 9, 6, 20, 11, 10, 11, 5, 12, 20, 4, 2, 4, 10, 9, 11, 15, 11, 9, 8, 29, 41, 12, 4, 3, 17, 13, 15, 22, 7, 20, 21, 8, 11, 4, 2, 1, 5, 2, 5, 2, 6, 5, 5, 5, 4, 9, 1, 1, 13, 17, 15, 21, 4, 12, 8, 5, 0, 6, 3, 3, 5, 8, 9, 4, 9, 13, 11, 19, 19, 16, 2, 18, 13, 24, 9, 9, 7, 8, 18, 3, 3, 3, 18, 22, 19, 5, 16, 21, 30, 17, 24, 7, 4, 15, 6, 6, 8, 0, 3, 11, 12, 12, 8, 15, 8, 5, 12, 18, 14, 21, 21, 23, 34, 7, 4, 5, 3, 10, 14, 17, 3, 6, 26, 9, 14, 17, 19, 10, 5, 2, 9, 18, 9, 14, 3, 13, 7, 5, 5, 4, 0, 5, 0], [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 5, 0, 0, 0, 0, 0, 0, 3, 2, 3, 1, 3, 9, 8, 8, 20, 7, 6, 2, 7, 2, 2, 13, 0, 3, 4, 7, 6, 2, 6, 7, 4, 4, 15, 8, 9, 19, 12, 6, 5, 12, 0, 15, 17, 11, 5, 10, 2, 4, 4, 2, 2, 8, 6, 11, 2, 7, 12, 11, 6, 4, 5, 5, 4, 3, 7, 2, 8, 9, 4, 2, 3, 1, 5, 4, 5, 4, 31, 18, 17, 15, 9, 0, 0, 2, 2, 12, 8, 6, 3, 0, 7, 3, 3, 13, 13, 17, 4, 21, 35, 30, 48, 21, 17, 8, 13, 13, 19, 12, 7, 5, 9, 4, 3, 9, 7, 9, 7, 10, 0, 10, 21, 18, 17, 29, 10, 1, 2, 6, 0, 6, 14, 13, 3, 10, 6, 6, 15, 6, 4, 0, 0, 1, 17, 13, 3, 6, 4, 16, 10, 6, 28, 9, 2, 10], [0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 0, 0, 0, 0, 8, 3, 1, 0, 0, 0, 2, 0, 0, 1, 1, 1, 2, 12, 10, 4, 4, 5, 1, 3, 3, 11, 3, 3, 5, 2, 4, 5, 5, 0, 7, 10, 5, 2, 1, 3, 5, 2, 5, 4, 4, 2, 5, 10, 3, 5, 1, 13, 0, 4, 1, 5, 1, 6, 2, 3, 4, 0, 0, 4, 19, 9, 1, 1, 0, 0, 9, 19, 0, 0, 0, 0, 1, 0, 1, 1, 19, 0, 4, 6, 5, 1, 0, 2, 3, 2, 1, 1, 1, 0, 2, 0, 3, 7, 1, 4, 1, 2, 7, 8, 9, 11, 1, 4, 9, 6, 0, 0, 1, 0, 3, 0, 2, 6, 13, 2, 3, 0, 15, 1, 3, 1, 2, 4, 5, 4, 0, 1, 0, 4, 26, 3, 0, 5, 2, 3, 6, 14, 5, 2, 1, 1, 1, 3, 1, 0, 2, 1, 2, 1, 6, 4, 0, 8], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 2, 0, 1, 2, 6, 7, 0, 0, 1, 0, 1, 1, 1, 2, 3, 1, 1, 0, 0, 0, 0, 0, 2, 0, 5, 8, 3, 2, 1, 3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 6, 4, 0, 6, 0, 2, 3, 0, 2, 4, 1, 3, 3, 2, 0, 1, 0, 0, 0, 0, 8, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 12, 4, 10, 6, 6, 3, 1, 0, 1, 4, 1, 1, 2, 0, 3, 3, 0, 0, 1, 0, 0, 2, 0, 0, 1, 4, 0, 3, 1, 2, 0, 0, 1, 0, 4, 5, 2, 1, 0, 4, 16, 7, 0, 0, 0, 0, 0, 0, 2, 0, 1, 3, 11, 8, 6, 12, 7, 1, 8, 6, 1, 2, 0, 0, 0, 0, 1, 1, 0, 2, 3, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 4, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 6, 0, 1, 0, 0, 4, 7, 4, 0, 2, 0, 0, 0, 8, 2, 1, 2, 16, 6, 0, 0, 3, 0, 0, 3, 0, 0, 9, 0, 2, 3, 0, 0, 2, 4, 0, 0, 1, 0, 0, 0, 1, 0, 2, 0, 0, 5, 3, 4, 2, 0, 0, 1, 0, 0, 0, 4, 0, 3, 7, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 2, 2, 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 3, 1, 0, 1, 0, 0, 0, 0, 0, 1, 5, 4, 0, 2, 20, 9, 0, 1, 0, 3, 2, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 1, 1, 0, 0, 1, 0, 7, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] --------------------------------------------------------------------------------