├── .gitignore
├── .idea
├── FuckFakeGitHubStars.iml
├── inspectionProfiles
│ └── Project_Default.xml
├── misc.xml
├── modules.xml
├── vcs.xml
└── workspace.xml
├── LICENSE
├── README.md
├── RepoBlackValue.md
├── data
├── BLACK_LIST.json
├── REPOSITORY_STARGAZERS.json
└── USER_STAR_REPOSITORIES.json
├── datapersistence.py
├── fetchdata.py
└── processingdata.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | *.egg-info/
24 | .installed.cfg
25 | *.egg
26 | MANIFEST
27 |
28 | # PyInstaller
29 | # Usually these files are written by a python script from a template
30 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
31 | *.manifest
32 | *.spec
33 |
34 | # Installer logs
35 | pip-log.txt
36 | pip-delete-this-directory.txt
37 |
38 | # Unit test / coverage reports
39 | htmlcov/
40 | .tox/
41 | .coverage
42 | .coverage.*
43 | .cache
44 | nosetests.xml
45 | coverage.xml
46 | *.cover
47 | .hypothesis/
48 | .pytest_cache/
49 |
50 | # Translations
51 | *.mo
52 | *.pot
53 |
54 | # Django stuff:
55 | *.log
56 | local_settings.py
57 | db.sqlite3
58 |
59 | # Flask stuff:
60 | instance/
61 | .webassets-cache
62 |
63 | # Scrapy stuff:
64 | .scrapy
65 |
66 | # Sphinx documentation
67 | docs/_build/
68 |
69 | # PyBuilder
70 | target/
71 |
72 | # Jupyter Notebook
73 | .ipynb_checkpoints
74 |
75 | # pyenv
76 | .python-version
77 |
78 | # celery beat schedule file
79 | celerybeat-schedule
80 |
81 | # SageMath parsed files
82 | *.sage.py
83 |
84 | # Environments
85 | .env
86 | .venv
87 | env/
88 | venv/
89 | ENV/
90 | env.bak/
91 | venv.bak/
92 |
93 | # Spyder project settings
94 | .spyderproject
95 | .spyproject
96 |
97 | # Rope project settings
98 | .ropeproject
99 |
100 | # mkdocs documentation
101 | /site
102 |
103 | # mypy
104 | .mypy_cache/
105 |
106 | token
107 |
--------------------------------------------------------------------------------
/.idea/FuckFakeGitHubStars.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
131 |
132 |
133 |
134 | data
135 | save
136 | load_d
137 | REPOSITORY_STARGAZERS
138 | USER_STAR_REPOSITORIES
139 | save_data
140 | get_node_content
141 | NODE_ID_CONTENT
142 | level:
143 | level
144 | n_clusters
145 | arpack
146 | spectral
147 | algorithm
148 | level:2
149 | level:3
150 | current_level_node_count_left
151 | fd.
152 | for
153 | affinity
154 | list
155 | ,
156 | SEARCH_NODE_ID
157 | None
158 | print
159 | level:1
160 | readli
161 | get_repo_stargazers
162 | dp.
163 | cluster_data
164 |
165 |
166 | dp.USER_STAR_REPOSITORIES
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 | true
187 | DEFINITION_ORDER
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
267 |
268 |
269 |
270 |
271 |
272 |
273 |
274 |
275 |
276 |
277 |
278 |
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 |
300 |
301 |
302 |
303 |
304 |
305 |
306 |
307 |
308 |
309 |
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 |
325 |
326 |
327 |
328 |
329 |
330 |
331 |
332 |
333 |
334 | 1536328126092
335 |
336 |
337 | 1536328126092
338 |
339 |
340 |
341 |
342 |
343 |
344 |
345 |
346 |
347 |
348 |
349 |
350 |
351 |
352 |
353 |
354 |
355 |
356 |
357 |
358 |
359 |
360 |
361 |
362 |
363 |
364 |
365 |
366 |
367 |
368 |
369 |
370 |
371 |
372 |
373 |
374 |
375 |
376 |
377 |
378 | file://$PROJECT_DIR$/processingdata.py
379 | 93
380 |
381 |
382 |
383 | file://$PROJECT_DIR$/processingdata.py
384 | 58
385 |
386 |
387 |
388 |
389 |
390 |
391 |
392 |
393 |
394 |
395 |
396 |
397 |
398 |
399 |
400 | current_level_node_count_left == 797
401 | Python
402 | CODE_FRAGMENT
403 |
404 |
405 | current_node == 'MDQ6VXNlcjQ2ODgzMTU='
406 | Python
407 | EXPRESSION
408 |
409 |
410 | node == 'MDQ6VXNlcjMyOTc5NzQw'
411 | Python
412 | EXPRESSION
413 |
414 |
415 | node == 'MDQ6VXNlcjMyOTc5NzQw'
416 | Python
417 | CODE_FRAGMENT
418 |
419 |
420 |
421 |
422 | nodes.index(node)
423 | Python
424 | EXPRESSION
425 |
426 |
427 | dp.NODE_ID_CONTENT[node]['similarity']
428 | Python
429 | EXPRESSION
430 |
431 |
432 | dp.NODE_ID_CONTENT['MDQ6VXNlcjQwNTUyMTc3']
433 | Python
434 | EXPRESSION
435 |
436 |
437 | dp.NODE_ID_CONTENT['MDQ6VXNlcjE1Nzk1MzQ5']
438 | Python
439 | EXPRESSION
440 |
441 |
442 | dp.NODE_ID_CONTENT['MDQ6VXNlcjE0ODM3NjE2']
443 | Python
444 | EXPRESSION
445 |
446 |
447 | dp.NODE_ID_CONTENT['MDQ6VXNlcjI1ODA4OTM4']
448 | Python
449 | EXPRESSION
450 |
451 |
452 | dp.NODE_ID_CONTENT['MDQ6VXNlcjM3ODE5ODYz']
453 | Python
454 | EXPRESSION
455 |
456 |
457 | dp.NODE_ID_CONTENT['MDQ6VXNlcjMzNzQwODk2']
458 | Python
459 | EXPRESSION
460 |
461 |
462 | dp.NODE_ID_CONTENT['MDQ6VXNlcjI4OTQxMjcx']
463 | Python
464 | EXPRESSION
465 |
466 |
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
494 |
495 |
496 |
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 |
506 |
507 |
508 |
509 |
510 |
511 |
512 |
513 |
514 |
515 |
516 |
517 |
518 |
519 |
520 |
521 |
522 |
523 |
524 |
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 |
539 |
540 |
541 |
542 |
543 |
544 |
545 |
546 |
547 |
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
562 |
563 |
564 |
565 |
566 |
567 |
568 |
569 |
570 |
571 |
572 |
573 |
574 |
575 |
576 |
577 |
578 |
579 |
580 |
581 |
582 |
583 |
584 |
585 |
586 |
587 |
588 |
589 |
590 |
591 |
592 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 杨萧玉
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # FuckFakeGitHubStars
2 |
3 | **NOTICE:** The results are for your reference only.
4 |
5 | ## Usage
6 |
7 | 1. Fill your GitHub secret token in `fetchdata.py`
8 | 2. Set `SEARCH_NODE_ID` in `fetchdata.py`
9 | 3. Run `fetchdata.py`
10 | 4. Run `processingdata.py`
11 | 5. See log files in `data` folder
12 |
13 | You can get repo or user's node ID via GitHub GraphQL API.
14 |
15 | [GraphiQL](https://developer.github.com/v4/explorer/) example:
16 |
17 | ```
18 | query {
19 | repository(owner: "CocoaDebug", name: "CocoaDebug") {
20 | id
21 | }
22 | }
23 | ```
24 |
25 | Result is `MDEwOlJlcG9zaXRvcnkxMTc1MTM4NTI=`
26 |
27 | ```
28 | {
29 | "data": {
30 | "repository": {
31 | "id": "MDEwOlJlcG9zaXRvcnkxMTc1MTM4NTI="
32 | }
33 | }
34 | }
35 | ```
36 |
37 | ## Disclaimer
38 |
39 | This is just some messy code. I really don't know what it is. Don't ask me!
--------------------------------------------------------------------------------
/RepoBlackValue.md:
--------------------------------------------------------------------------------
1 | - wuwm/VCRunningLocationLogger; stargazer num: 46; black percent:0.6086956521739131
2 | - baoleiji/QilinBaoleiji; stargazer num: 1447; black percent:0.5770559778852798
3 | - 3348375016/ITSecrets; stargazer num: 1589; black percent:0.5173064820641913
4 | - jiaruncao/Readers; stargazer num: 247; black percent:0.5182186234817814
5 | - terryjiao/BitcoinWallet; stargazer num: 161; black percent:0.515527950310559
6 | - jianhaod/Kaggle; stargazer num: 37; black percent:0.5945945945945946
7 | - funnyzhou/Adaptive_Feeding; stargazer num: 175; black percent:0.5828571428571429
8 | - eryuechanghe/iTeach; stargazer num: 244; black percent:0.569672131147541
9 | - whsgzcy/DEMOS_TO_MySelf_Android; stargazer num: 63; black percent:0.4603174603174603
10 | - DeuroIO/erc20-ico-onchain-technical-analysis; stargazer num: 512; black percent:0.427734375
11 | - suijunqiang/rnset; stargazer num: 284; black percent:0.46830985915492956
12 | - loveRandy/vue-cli3.0-vueadmin; stargazer num: 170; black percent:0.4411764705882353
13 | - Android500/AwesomeDrawer; stargazer num: 693; black percent:0.4704184704184704
14 | - yqh231/CoinQuantitave; stargazer num: 150; black percent:0.41333333333333333
15 | - vf2e/vue-travel; stargazer num: 27; black percent:0.4444444444444444
16 | - whsgzcy/Tools_To_MySelf_Java; stargazer num: 55; black percent:0.4727272727272727
17 | - xwenyuan/jtopo_topology; stargazer num: 27; black percent:0.48148148148148145
18 | - CocoaDebug/CocoaDebug; stargazer num: 2875; black percent:0.3133913043478261
19 | - jser-club/rc-bmap; stargazer num: 889; black percent:0.3813273340832396
20 | - jianxiaoBai/douban; stargazer num: 288; black percent:0.3715277777777778
21 | - cris001/Uchat-master; stargazer num: 106; black percent:0.32075471698113206
22 | - whsgzcy/Data_From_GaoDe; stargazer num: 60; black percent:0.38333333333333336
23 | - whsgzcy/ROS_TO_MySelf_Test; stargazer num: 55; black percent:0.3090909090909091
24 | - UCodeUStory/S-MVP; stargazer num: 1103; black percent:0.28014505893019037
25 | - baoleiji/QilinBaoleiji; stargazer num: 1447; black percent:0.5770559778852798
26 | - 3348375016/ITSecrets; stargazer num: 1589; black percent:0.5173064820641913
27 | - zhupingqi/RuiJi.Net; stargazer num: 180; black percent:0.21666666666666667
28 | - Broadroad/gpool; stargazer num: 397; black percent:0.2619647355163728
29 | - xcg340122/PHP300Framework2x; stargazer num: 165; black percent:0.21818181818181817
30 | - MelonRice/zhihudaily_flutter; stargazer num: 163; black percent:0.2085889570552147
31 | - L-hualong/L-hualong.github.io; stargazer num: 61; black percent:0.2459016393442623
32 | - sunzsh/markdown-doc-server; stargazer num: 4; black percent:0.25
33 | - Jinxiansen/SwiftServerSide-Vapor; stargazer num: 583; black percent:0.18010291595197256
34 | - BestDingSheng/resources; stargazer num: 1810; black percent:0.16906077348066298
35 | - TuanDai-MPD/HLAppMonitor; stargazer num: 68; black percent:0.1323529411764706
36 | - xixinjiejie/awesome-lover; stargazer num: 133; black percent:0.15789473684210525
37 | - zhegexiaohuozi/SeimiCrawler; stargazer num: 1139; black percent:0.11676909569798069
38 | - m358807551/mysqlsmom; stargazer num: 135; black percent:0.13333333333333333
39 | - wujunze/nginx-http-echo-module; stargazer num: 181; black percent:0.17679558011049723
40 | - unseim/WYIDCardOCR; stargazer num: 225; black percent:0.15555555555555556
41 | - chenyongci/Android-Week-Calendar; stargazer num: 167; black percent:0.12574850299401197
42 |
--------------------------------------------------------------------------------
/data/BLACK_LIST.json:
--------------------------------------------------------------------------------
1 | ["MDQ6VXNlcjM3ODE5ODYz", "MDQ6VXNlcjI1ODA4OTM4", "MDQ6VXNlcjM4Mzc5MTQ0", "MDQ6VXNlcjcwNzk2MTQ=", "MDQ6VXNlcjYwMTg1MjI=", "MDQ6VXNlcjE1ODUwNTM1", "MDQ6VXNlcjQyNTE2NDI=", "MDQ6VXNlcjE1NjY3NTk2", "MDQ6VXNlcjUyODMzNjk=", "MDQ6VXNlcjIwMTQxNjM4", "MDQ6VXNlcjE2ODk2MzIw", "MDQ6VXNlcjEwODAzMTM2", "MDQ6VXNlcjU4MzE3MzE=", "MDQ6VXNlcjE2MjM2ODc0", "MDQ6VXNlcjE5NzAwMjg3", "MDQ6VXNlcjQ4NDc0OTI=", "MDQ6VXNlcjM0NzM0OTcy", "MDQ6VXNlcjYwNzYzNTM=", "MDQ6VXNlcjE5NTU1NTUw", "MDQ6VXNlcjEyMTkzOTc5", "MDQ6VXNlcjM5NjE0MjA4", "MDQ6VXNlcjI0NTY2NTI5", "MDQ6VXNlcjU5NTM4ODM=", "MDQ6VXNlcjI3MDY1MTYw", "MDQ6VXNlcjMzMjkwNDA3", "MDQ6VXNlcjMzMjAxMjk5", "MDQ6VXNlcjI5MDk2NDkw", "MDQ6VXNlcjM4ODAwOTIz", "MDQ6VXNlcjM4MDY4ODMy", "MDQ6VXNlcjIxMTY0MjA0", "MDQ6VXNlcjI1NTc5NjQ4", "MDQ6VXNlcjEwNTkxNDQ4", "MDQ6VXNlcjM5NzM0NzYx", "MDQ6VXNlcjEzNzk0OTkw", "MDQ6VXNlcjI4Mzc5MTEw", "MDQ6VXNlcjE3OTgxMzYw", "MDQ6VXNlcjI0MjM5NjMx", "MDQ6VXNlcjM0MjMzNzc4", "MDQ6VXNlcjMzNTk0NjUx", "MDQ6VXNlcjE4MzAzMjU3", "MDQ6VXNlcjI5OTk4NTgw", "MDQ6VXNlcjEyMDI3NjI2", "MDQ6VXNlcjE3ODkxNzk2", "MDQ6VXNlcjY3MDA4Mjg=", "MDQ6VXNlcjM3MjYwNDA4", "MDQ6VXNlcjI1NTczNjQw", "MDQ6VXNlcjk3OTg1MzI=", "MDQ6VXNlcjIwMzUwMjUw", "MDQ6VXNlcjI0ODYwMTg1", "MDQ6VXNlcjczMTQ4ODI=", "MDQ6VXNlcjIzMDkzNjE5", "MDQ6VXNlcjEyNzA4NzU4", "MDQ6VXNlcjE2OTMwNDcx", "MDQ6VXNlcjIxMzAzMzM5", "MDQ6VXNlcjE0Mjg2NzQ3", "MDQ6VXNlcjUxODk2Njk=", "MDQ6VXNlcjI0NDIzNzY2", "MDQ6VXNlcjE3Nzc1MDQ2", "MDQ6VXNlcjIyMTg2MjIy", "MDQ6VXNlcjE2MjQ5ODQ0", "MDQ6VXNlcjE2Mzc4OTA2", "MDQ6VXNlcjIyODI5MjI0", "MDQ6VXNlcjIzNjM1Mjg5", "MDQ6VXNlcjE1ODUzOTkx", "MDQ6VXNlcjI5OTczNzg1", "MDQ6VXNlcjI2MDc5NDI4", "MDQ6VXNlcjI3MTc2NjY4", "MDQ6VXNlcjIyMDAyNTk4", "MDQ6VXNlcjEyNTgwMDQ4", "MDQ6VXNlcjMzMTczNDk0", "MDQ6VXNlcjI1ODMzODk4", "MDQ6VXNlcjI3Mjc4NDI1", "MDQ6VXNlcjEzMzQ0OTM2", "MDQ6VXNlcjIwODc2OTQx", "MDQ6VXNlcjE1ODI3OTc5", "MDQ6VXNlcjI0OTM0OTA1", "MDQ6VXNlcjIxMjg4NDM0", "MDQ6VXNlcjMxMDMzNjk=", "MDQ6VXNlcjE1MTcyNjQ1", "MDQ6VXNlcjEyOTg4OTg5", "MDQ6VXNlcjE3MjE5NTk=", "MDQ6VXNlcjIyODgyNTA1", "MDQ6VXNlcjMwNzg2OTQ=", "MDQ6VXNlcjMwMjA5NTU=", "MDQ6VXNlcjE2MzE0NzM2", "MDQ6VXNlcjI2ODg5Njc2", "MDQ6VXNlcjUxMTMwODg=", "MDQ6VXNlcjMzNDcwNjEz", "MDQ6VXNlcjczOTEwMjA=", "MDQ6VXNlcjg3MDY5MDk=", "MDQ6VXNlcjI0MjUwNjA0", "MDQ6VXNlcjIyMjQ5ODE=", "MDQ6VXNlcjIxOTY1NTQ2", "MDQ6VXNlcjIzMTUyODQw", "MDQ6VXNlcjI5NDQ1NTY3", "MDQ6VXNlcjMwOTQ2MDcy", "MDQ6VXNlcjM4NTI1MTI0", "MDQ6VXNlcjIyMzg0Mjc1", "MDQ6VXNlcjE4NDUzOTM2", "MDQ6VXNlcjE0MjY3MDAy", "MDQ6VXNlcjIyOTk0NjAy", "MDQ6VXNlcjEwNDUxNTA2", "MDQ6VXNlcjU2MDAzNzk=", "MDQ6VXNlcjM1NDUwMTI3", "MDQ6VXNlcjI4NzAxMzE5", "MDQ6VXNlcjM5MTExNDUx", "MDQ6VXNlcjIxNzEwOTc4", "MDQ6VXNlcjM1MTYyMDg4", "MDQ6VXNlcjI5NDg0MTgy", "MDQ6VXNlcjI4MzA2ODQz", "MDQ6VXNlcjMwODIxODI4", "MDQ6VXNlcjMxOTUxNTU3", "MDQ6VXNlcjg4MzA0Mjk=", "MDQ6VXNlcjMxNzUxMzUy", "MDQ6VXNlcjMyMzIyMTYz", "MDQ6VXNlcjE3NjMwNjI0", "MDQ6VXNlcjIzNjMwOTE5", "MDQ6VXNlcjM0NzExMzg5", "MDQ6VXNlcjEwODA1NDcy", "MDQ6VXNlcjIwMjc0MDUw", "MDQ6VXNlcjEwMDU1ODM2", "MDQ6VXNlcjIyMDUxODI5", "MDQ6VXNlcjI1MDIwOTMx", "MDQ6VXNlcjEyNjYwNDg3", "MDQ6VXNlcjIzMDEyNzU3", "MDQ6VXNlcjE4MDI0ODU5", "MDQ6VXNlcjg0NzQ5NTE=", "MDQ6VXNlcjEzNDYwMjQx", "MDQ6VXNlcjIwNzgzODkw", "MDQ6VXNlcjI2Njk5MDA0", "MDQ6VXNlcjM5NDc0OTM0", "MDQ6VXNlcjI0NTE2MzM0", "MDQ6VXNlcjI0NDcxMDQ4", "MDQ6VXNlcjk5NDUxODE=", "MDQ6VXNlcjI0Nzg1OTc2", "MDQ6VXNlcjI0NDcwNzM1", "MDQ6VXNlcjM2MjcwNjYy", "MDQ6VXNlcjMxNTMyMzA1", "MDQ6VXNlcjIyNzQzMjcw", "MDQ6VXNlcjI0Nzg1Mzk4", "MDQ6VXNlcjMxMTc5OTA0", "MDQ6VXNlcjI2ODA2NDQ5", "MDQ6VXNlcjIyMDQ3MDQz", "MDQ6VXNlcjI5NTkxNDQx", "MDQ6VXNlcjEyNDg4OTQ3", "MDQ6VXNlcjI2NTM4Mjcw", "MDQ6VXNlcjk2MzY0MDY=", "MDQ6VXNlcjM1MDcyNzQx", "MDQ6VXNlcjIwNjU1NDU0", "MDQ6VXNlcjE5MzU5MTg4", "MDQ6VXNlcjE2MTcyNTUy", "MDQ6VXNlcjEzOTQ1Nzc5", "MDQ6VXNlcjEwNDQ1Mzk5", "MDQ6VXNlcjI1ODc4MTQy", "MDQ6VXNlcjEzODk4OTEy", "MDQ6VXNlcjIzMTYyMzQ2", "MDQ6VXNlcjIwNjM1Mzg5", "MDQ6VXNlcjIzNjEzMDg2", "MDQ6VXNlcjMzMjQxNDY3", "MDQ6VXNlcjI5MDA5NzU5", "MDQ6VXNlcjMwNTE5Nzg4", "MDQ6VXNlcjYwOTExNzg=", "MDQ6VXNlcjI2ODMwMzc2", "MDQ6VXNlcjE2MDc3MTYw", "MDQ6VXNlcjEzNjk1NzE4", "MDQ6VXNlcjIwNDUxMDEw", "MDQ6VXNlcjI4NTUyNDI0", "MDQ6VXNlcjE0MjkzMDMx", "MDQ6VXNlcjEwMjAyMzM4", "MDQ6VXNlcjM0ODg0NDI3", "MDQ6VXNlcjE3MjMwNTQw", "MDQ6VXNlcjMwODU5ODgz", "MDQ6VXNlcjI5Mjc5MTk4", "MDQ6VXNlcjM5Mjk3MDc3", "MDQ6VXNlcjI3OTk0MDMy", "MDQ6VXNlcjMzNDU3OTky", "MDQ6VXNlcjI4NjQyODkw", "MDQ6VXNlcjE3MzA5ODIx", "MDQ6VXNlcjc3MDg3Njc=", "MDQ6VXNlcjI2Mjk2MDU5", "MDQ6VXNlcjUzMzUxNjE=", "MDQ6VXNlcjMwNjEyNzYx", "MDQ6VXNlcjE3MzMwMTE3", "MDQ6VXNlcjE2NDk1OTQz", "MDQ6VXNlcjEzODY3Njky", "MDQ6VXNlcjEzNDc4Nzcy", "MDQ6VXNlcjcyMjc3Njk=", "MDQ6VXNlcjI1OTIzNjgz", "MDQ6VXNlcjMzOTMyNTY5", "MDQ6VXNlcjMwMzAzNTM5", "MDQ6VXNlcjE1MzQxMjMw", "MDQ6VXNlcjE1Nzg4MTQ3", "MDQ6VXNlcjExNjI3OTMw", "MDQ6VXNlcjY0OTAwMzQ=", "MDQ6VXNlcjk0NDA3ODI=", "MDQ6VXNlcjMxNDY3Nzc=", "MDQ6VXNlcjg1MDM5NTA=", "MDQ6VXNlcjY4NTgxNDk=", "MDQ6VXNlcjI4ODAyODQw", "MDQ6VXNlcjEzNDEyNDY4", "MDQ6VXNlcjIxMjcyMTEy", "MDQ6VXNlcjMyODk5MjE4", "MDQ6VXNlcjMwMTE1ODQz", "MDQ6VXNlcjIyNzc0MDc4", "MDQ6VXNlcjE5Mzg1OTcx", "MDQ6VXNlcjIxOTk0MDU1", "MDQ6VXNlcjEzNDMzMTg=", "MDQ6VXNlcjIwNzU2ODM2", "MDQ6VXNlcjMxNTI1ODQ0", "MDQ6VXNlcjIwMzUyMjk2", "MDQ6VXNlcjI3Nzc0MTUx", "MDQ6VXNlcjE4NDU3ODMy", "MDQ6VXNlcjI1NzkwNjM4", "MDQ6VXNlcjE2OTEzNjg1", "MDQ6VXNlcjIzNjI3NjQ4", "MDQ6VXNlcjI1MTY3NDYw", "MDQ6VXNlcjIwNDMxNTk1", "MDQ6VXNlcjEyNTU0MDMw", "MDQ6VXNlcjExOTE5Nzgw", "MDQ6VXNlcjI2MzAyOTY1", "MDQ6VXNlcjI1ODE0OTgy", "MDQ6VXNlcjk2OTE0MzE=", "MDQ6VXNlcjEyMzgxMDUz", "MDQ6VXNlcjMzMTczNDkz", "MDQ6VXNlcjEzNTA3NzYx", "MDQ6VXNlcjQwNzQzODQ=", "MDQ6VXNlcjMwNjE4ODU0", "MDQ6VXNlcjMyMDE1MzAy", "MDQ6VXNlcjI1ODU4MzYz", "MDQ6VXNlcjIyNDI4MjI0", "MDQ6VXNlcjE1MjUwNjAx", "MDQ6VXNlcjE3OTYyMjA2", "MDQ6VXNlcjI2MjI2MzUy", "MDQ6VXNlcjQwNjIwMDU3", "MDQ6VXNlcjMwNzQwMDAz", "MDQ6VXNlcjI4NjAwMjE1", "MDQ6VXNlcjM5NDI2MDI5", "MDQ6VXNlcjQwNzc5NTAx", "MDQ6VXNlcjIxMjExODI4", "MDQ6VXNlcjM1NDgyOTYy", "MDQ6VXNlcjI4MzU1MDM5", "MDQ6VXNlcjQwNzE5OTg5", "MDQ6VXNlcjk3MTk1ODQ=", "MDQ6VXNlcjEyMTY0NjA4", "MDQ6VXNlcjExODE2MDUy", "MDQ6VXNlcjE0ODM3NjE2", "MDQ6VXNlcjE1Nzk1MzQ5", "MDQ6VXNlcjQwNTUyMTc3", "MDQ6VXNlcjM1NzIyMjEz", "MDQ6VXNlcjE0MDg3OTA1", "MDQ6VXNlcjE1NzEwNjM4", "MDQ6VXNlcjQwNTE1MzM3", "MDQ6VXNlcjQwNjQ5MjMx", "MDQ6VXNlcjMzNTcwMjcz", "MDQ6VXNlcjM3ODk4MjI4", "MDQ6VXNlcjQwODc1NjI3", "MDQ6VXNlcjEzNTE2MDMx", "MDQ6VXNlcjMxNzE1Mjgz", "MDQ6VXNlcjI3Nzc1ODg1", "MDQ6VXNlcjMwNDU0NzY3", "MDQ6VXNlcjcwMTk1MDI=", "MDQ6VXNlcjM3NzkxNjg3", "MDQ6VXNlcjEwNDc3OTEy", "MDQ6VXNlcjkzMTY3NzA=", "MDQ6VXNlcjk3Mzg1MDc=", "MDQ6VXNlcjM5NTg0MDM4", "MDQ6VXNlcjI0ODI0Njg2", "MDQ6VXNlcjE5MjgyNjkx", "MDQ6VXNlcjMxOTEwMjEy", "MDQ6VXNlcjE3NTI0OTEy", "MDQ6VXNlcjE1OTU0MzI2", "MDQ6VXNlcjIyMDE4MDE0", "MDQ6VXNlcjI1NzMyODg=", "MDQ6VXNlcjM0MTQ3NzMz", "MDQ6VXNlcjE1MzU3MzYy", "MDQ6VXNlcjI4NTA3OTAx", "MDQ6VXNlcjMwMTM2NzMz", "MDQ6VXNlcjIwMzEwOTc3", "MDQ6VXNlcjU1NTYyNTU=", "MDQ6VXNlcjE2NTcxMTkz", "MDQ6VXNlcjIwNjE2Mjc4", "MDQ6VXNlcjExODI4NjU2", "MDQ6VXNlcjE2MjQxMjQw", "MDQ6VXNlcjI4NzU0OTEz", "MDQ6VXNlcjE5NTgxMTQw", "MDQ6VXNlcjIzNzM2MTkz", "MDQ6VXNlcjU4NDgwMTY=", "MDQ6VXNlcjcxMDEyNzI=", "MDQ6VXNlcjIwNjg0NzM5", "MDQ6VXNlcjE1NjY3ODc3", "MDQ6VXNlcjIwMzMxODQ5", "MDQ6VXNlcjIxMDc0OTAy", "MDQ6VXNlcjIzMjc4OTg3", "MDQ6VXNlcjE3MzMwNTY5", "MDQ6VXNlcjIwODUxNTEw", "MDQ6VXNlcjE1MDg4MTA3", "MDQ6VXNlcjE1NTE5OTMw", "MDQ6VXNlcjgyODU2MDY=", "MDQ6VXNlcjU3MDU1MzM=", "MDQ6VXNlcjE1MDI3ODA2", "MDQ6VXNlcjgxNjAyMDU=", "MDQ6VXNlcjI0NDcyNjYy", "MDQ6VXNlcjMwMTcyMzM5", "MDQ6VXNlcjI5NjcxNTU1", "MDQ6VXNlcjEzNDEwNjI4", "MDQ6VXNlcjEzMzI3ODQ0", "MDQ6VXNlcjMwNDI4MDY2", "MDQ6VXNlcjE5Mjk2ODcy", "MDQ6VXNlcjE0MTkyMDgy", "MDQ6VXNlcjIyOTI0NzQz", "MDQ6VXNlcjE0MzYwNzQx", "MDQ6VXNlcjMwMTc3Nzgz", "MDQ6VXNlcjEzNDg0MDg2", "MDQ6VXNlcjYxMDEwMjk=", "MDQ6VXNlcjE5NzQ2ODI0", "MDQ6VXNlcjIyMTYxNDA3", "MDQ6VXNlcjMwNjE2MDI4", "MDQ6VXNlcjMwMTkwMTA5", "MDQ6VXNlcjE5ODY4Njgz", "MDQ6VXNlcjMwMTcwMzE0", "MDQ6VXNlcjI5NzI4ODU4", "MDQ6VXNlcjYzNDY5NDU=", "MDQ6VXNlcjEyNDg0Mjk4", "MDQ6VXNlcjI3OTgzNzc1", "MDQ6VXNlcjI3OTIxOTIw", "MDQ6VXNlcjIxNjUzNTA4", "MDQ6VXNlcjI4MjA1MzUx", "MDQ6VXNlcjIwNDcyMDYy", "MDQ6VXNlcjEwNzE5MDY4", "MDQ6VXNlcjE4NTkxNDkx", "MDQ6VXNlcjI3MTg1Njg1", "MDQ6VXNlcjIyOTMxNDE5", "MDQ6VXNlcjIwMTc2ODEz", "MDQ6VXNlcjYwOTMzODY=", "MDQ6VXNlcjEzMTI4MjI0", "MDQ6VXNlcjIxOTk5MDM0", "MDQ6VXNlcjIzNjA4MzI0", "MDQ6VXNlcjU5ODgxNzk=", "MDQ6VXNlcjI2NDI4OTk1", "MDQ6VXNlcjI2MDgyMjI0", "MDQ6VXNlcjIxMjY0MDc4", "MDQ6VXNlcjI1MjE3MTA0", "MDQ6VXNlcjE4NTcwNzQ3", "MDQ6VXNlcjE4NjUxNjc1", "MDQ6VXNlcjE4Mzg2NTIz", "MDQ6VXNlcjYyODM2NDE=", "MDQ6VXNlcjIzNzE0MjM0", "MDQ6VXNlcjExNjA3NzAx", "MDQ6VXNlcjIyNzI2Mjg5", "MDQ6VXNlcjIwNzkyMjM3", "MDQ6VXNlcjEyNjU2MzQ3", "MDQ6VXNlcjI0OTM4MDMy", "MDQ6VXNlcjI2Mzc2NzI5", "MDQ6VXNlcjM4MDQzNjM1", "MDQ6VXNlcjEyODQxMjc2", "MDQ6VXNlcjM1MzY0NTA2", "MDQ6VXNlcjM4OTMwMDU4", "MDQ6VXNlcjI0ODExMTM4", "MDQ6VXNlcjM5NDA2OTUz", "MDQ6VXNlcjEwODMwOTE=", "MDQ6VXNlcjg2NTM0NzQ=", "MDQ6VXNlcjIyNzY1MzUx", "MDQ6VXNlcjMxNjU5MjEy", "MDQ6VXNlcjEwNTM1MTQ=", "MDQ6VXNlcjI1NTQxNjc2", "MDQ6VXNlcjI1MzU2MDcx", "MDQ6VXNlcjMwMzExNzg=", "MDQ6VXNlcjQ0ODU2Mjg=", "MDQ6VXNlcjEwMzk2MTE4", "MDQ6VXNlcjM4Mzc0NDA=", "MDQ6VXNlcjMxNjUwMTgz", "MDQ6VXNlcjM2OTIzNjMz", "MDQ6VXNlcjI5MTk0ODEy", "MDQ6VXNlcjI5MjY4MjIy", "MDQ6VXNlcjEzOTEyNTIw", "MDQ6VXNlcjM0MzY2NDUx", "MDQ6VXNlcjkyODM1MTg=", "MDQ6VXNlcjM1Nzk2MzEx", "MDQ6VXNlcjMyMzQ4OTMw", "MDQ6VXNlcjM3MzY3NTAy", "MDQ6VXNlcjI1ODM2MDUx", "MDQ6VXNlcjM1MTkzNDg0", "MDQ6VXNlcjI5NDc3Njgz", "MDQ6VXNlcjQwNDQ2MzE5", "MDQ6VXNlcjEwMjk5Njk5", "MDQ6VXNlcjM1MTY4NzE2", "MDQ6VXNlcjE0MTIyNjg0", "MDQ6VXNlcjEyNzQyNzA1", "MDQ6VXNlcjE2OTIyMjEw", "MDQ6VXNlcjI0NjY3MjY4", "MDQ6VXNlcjMzMzY1MzQ0", "MDQ6VXNlcjIwODI3NzI5", "MDQ6VXNlcjI0OTUzMTc0", "MDQ6VXNlcjE5MjI0NDky", "MDQ6VXNlcjU0NTIzNTE=", "MDQ6VXNlcjEzNzc1MzM0", "MDQ6VXNlcjM5NTc0OTQx", "MDQ6VXNlcjE3Nzk1OTU1", "MDQ6VXNlcjEzNjk5NjI0", "MDQ6VXNlcjIwOTE2NDgx", "MDQ6VXNlcjIwNzkzNTI4", "MDQ6VXNlcjM4MTM3NTgx", "MDQ6VXNlcjI5OTA1OTAw", "MDQ6VXNlcjM4NzI2NTI5", "MDQ6VXNlcjE3OTc2Nzkz", "MDQ6VXNlcjc0NjY2Mjk=", "MDQ6VXNlcjM5NDA5OTQx", "MDQ6VXNlcjMxNDcyNDAz", "MDQ6VXNlcjM3OTg5OTEz", "MDQ6VXNlcjIwMDQ2MTQ3", "MDQ6VXNlcjEyNjk0MTgw", "MDQ6VXNlcjMxMDMwMDky", "MDQ6VXNlcjI1Nzg4Mzg3", "MDQ6VXNlcjI1OTcwNjA1", "MDQ6VXNlcjQwOTc1Njg3", "MDQ6VXNlcjMwMTg5Mzc2", "MDQ6VXNlcjE1MjA2NzY2", "MDQ6VXNlcjQxMjgyMDg3", "MDQ6VXNlcjEzNTE4NjQ2", "MDQ6VXNlcjMwMTg5MzUz", "MDQ6VXNlcjE2MTczMjUz", "MDQ6VXNlcjI0NjY4ODA1", "MDQ6VXNlcjM4NDU2NzU1", "MDQ6VXNlcjQxMTc1NjM1", "MDQ6VXNlcjMyMTk2NTgy", "MDQ6VXNlcjI0Njk4NDk3", "MDQ6VXNlcjM0NzcxMDU1", "MDQ6VXNlcjU1OTA5MDE=", "MDQ6VXNlcjM5NzY2MjA4", "MDQ6VXNlcjExNTM3MzIz", "MDQ6VXNlcjMxMzU2NDI4", "MDQ6VXNlcjE0MzY4MTE0", "MDQ6VXNlcjM0NjE4MjY0", "MDQ6VXNlcjM2MDE5ODM2", "MDQ6VXNlcjgzMTQyMjY=", "MDQ6VXNlcjY2MDU1MDk=", "MDQ6VXNlcjM5OTc4ODc0", "MDQ6VXNlcjM5MDcyNzA5", "MDQ6VXNlcjU2MjEwNDM=", "MDQ6VXNlcjE4NDA5MTM=", "MDQ6VXNlcjQwMTY3NTg0", "MDQ6VXNlcjI0NjYzMDk0", "MDQ6VXNlcjM4NzExMjgy", "MDQ6VXNlcjM5NzMxMjY=", "MDQ6VXNlcjEyODQ3NjQ0", "MDQ6VXNlcjQwNDIwMzQ5", "MDQ6VXNlcjEwMzc3NjA=", "MDQ6VXNlcjk3NDc0ODE=", "MDQ6VXNlcjQwNDQ4MTAx", "MDQ6VXNlcjM0NTkwNzc0", "MDQ6VXNlcjIxOTg2MDgy", "MDQ6VXNlcjQwNDc4NDM4", "MDQ6VXNlcjE4NzAxNzQ0", "MDQ6VXNlcjI4NzIxNjA3", "MDQ6VXNlcjIzNTEyMTA0", "MDQ6VXNlcjI0ODIyOTgw", "MDQ6VXNlcjMwNzQ3NDQ=", "MDQ6VXNlcjIwMTA3MjEz", "MDQ6VXNlcjQ2NjU3OTI=", "MDQ6VXNlcjMyODM2OTk3", "MDQ6VXNlcjIwMTgzMjg0", "MDQ6VXNlcjM0NjQzOTkw", "MDQ6VXNlcjI5MzI5MTIw", "MDQ6VXNlcjIwMjczMTc5", "MDQ6VXNlcjI4NzIzMDQ3", "MDQ6VXNlcjE4NDYyNTA2", "MDQ6VXNlcjE4NTY0NjQ5", "MDQ6VXNlcjI2MzU3OTcz", "MDQ6VXNlcjMxMDg2NzUy", "MDQ6VXNlcjI5NzU2MzAz", "MDQ6VXNlcjI3ODM1NTQ3", "MDQ6VXNlcjE3NzU3MzEz", "MDQ6VXNlcjM5NzIyMDk3", "MDQ6VXNlcjM0ODkwMjMz", "MDQ6VXNlcjM3MDM1NTA5", "MDQ6VXNlcjE5NDE5NDgy", "MDQ6VXNlcjEzNzAyNDUz", "MDQ6VXNlcjI5NDQ1NzU4", "MDQ6VXNlcjM1MDY5MDcx", "MDQ6VXNlcjI4ODYyNzY1", "MDQ6VXNlcjY2Mjc3NDI=", "MDQ6VXNlcjMwNTYzMjY0", "MDQ6VXNlcjM4OTcwMjY5", "MDQ6VXNlcjM0MTg2NTg5", "MDQ6VXNlcjEzNTMwMjU0", "MDQ6VXNlcjE5NDczMjY2", "MDQ6VXNlcjIyMDY2MDQ2", "MDQ6VXNlcjMwNzE2NjEx", "MDQ6VXNlcjE5Njg5NjA2", "MDQ6VXNlcjExOTQ0NDE0", "MDQ6VXNlcjE2NDAzMTAy", "MDQ6VXNlcjI3ODkxNTQ4", "MDQ6VXNlcjE3NjExMzg4", "MDQ6VXNlcjM4NjE1NTE=", "MDQ6VXNlcjcyNDY5ODU=", "MDQ6VXNlcjMxOTYwMTE1", "MDQ6VXNlcjI5NjE3MzE2", "MDQ6VXNlcjMzMzAyNjcw", "MDQ6VXNlcjM4NTk5ODA0", "MDQ6VXNlcjM4NjE0NTE3", "MDQ6VXNlcjM4NjE4MzM5", "MDQ6VXNlcjM4NjE4NDg5", "MDQ6VXNlcjM4NjE4Njc5", "MDQ6VXNlcjM4NjE5MDMx", "MDQ6VXNlcjM4NjQ1OTcz", "MDQ6VXNlcjM4NjQ5NTM1", "MDQ6VXNlcjM4Njk3Nzcw", "MDQ6VXNlcjM4NzYzNDMw", "MDQ6VXNlcjM4NzYyODQx", "MDQ6VXNlcjM4NzYzNjUz", "MDQ6VXNlcjE2MTI5NTk5", "MDQ6VXNlcjMwODM1OTYy", "MDQ6VXNlcjEwMDQyNjQy", "MDQ6VXNlcjE5NjAwODU4", "MDQ6VXNlcjI5MzQ2MDEw", "MDQ6VXNlcjM1MzY2NTg3", "MDQ6VXNlcjE5NDA2ODcz", "MDQ6VXNlcjMyODA3MTQ5", "MDQ6VXNlcjQwODQ1MTUy", "MDQ6VXNlcjM3NzkxMjc2", "MDQ6VXNlcjI2NDc4NzAz", "MDQ6VXNlcjIwNTQ4NTUw", "MDQ6VXNlcjE5MTc4MzE3", "MDQ6VXNlcjMwMTQ0OTM4", "MDQ6VXNlcjI5NDE3MTgz", "MDQ6VXNlcjI4OTQ2ODg5", "MDQ6VXNlcjM0NjUxNDA4", "MDQ6VXNlcjc3OTE5MzI=", "MDQ6VXNlcjIxMjkyNDky", "MDQ6VXNlcjk2NzcxMjA=", "MDQ6VXNlcjI0NTExNjk0", "MDQ6VXNlcjIxMzI0NjYy", "MDQ6VXNlcjM4NDg0MjU1", "MDQ6VXNlcjE3ODE5NzU1", "MDQ6VXNlcjM2NjU0Njg4", "MDQ6VXNlcjI0OTE0NjU5", "MDQ6VXNlcjMyMzU2NDc1", "MDQ6VXNlcjE2MTMwOTEy", "MDQ6VXNlcjE2NTc2NjUw", "MDQ6VXNlcjMzNzQzOTEx", "MDQ6VXNlcjMyMDMxNzYw", "MDQ6VXNlcjEwMzA4NjQz", "MDQ6VXNlcjMxNzc1NDM=", "MDQ6VXNlcjIzNTU0NDU4", "MDQ6VXNlcjQxODUyNTM3", "MDQ6VXNlcjMzNjI4MDg5", "MDQ6VXNlcjY5NzM0Mzk=", "MDQ6VXNlcjI2NTMzNjg1", "MDQ6VXNlcjE2MzI5NzM2", "MDQ6VXNlcjMwMjYwNDI3", "MDQ6VXNlcjIwNzY1Njc5", "MDQ6VXNlcjI1ODU4MDI5", "MDQ6VXNlcjI1MzE4MTY2", "MDQ6VXNlcjMyNTY0OTA3", "MDQ6VXNlcjIzNzMzOTAz", "MDQ6VXNlcjI2MjQ4Mzg1", "MDQ6VXNlcjI1OTk5ODI3", "MDQ6VXNlcjE1NzU2OTAx", "MDQ6VXNlcjI1NTg2NDk3", "MDQ6VXNlcjEyNjA2ODky", "MDQ6VXNlcjE1NjQ2OTYz", "MDQ6VXNlcjM2MjkwNDA3", "MDQ6VXNlcjEwMjk0NDQ3", "MDQ6VXNlcjEwNzIwMzY1", "MDQ6VXNlcjQ5MTU0NTA=", "MDQ6VXNlcjIwNDcwMjMy", "MDQ6VXNlcjI1NzA0Mjg4", "MDQ6VXNlcjQwNTU0Mzc0", "MDQ6VXNlcjgwNTY0NjA=", "MDQ6VXNlcjM0NzYxOTkz", "MDQ6VXNlcjIwNDA5OTg2", "MDQ6VXNlcjI5MzkwMTM3", "MDQ6VXNlcjU0NDk3NjM=", "MDQ6VXNlcjMyOTI4MTU2", "MDQ6VXNlcjE1NjA4MTIy", "MDQ6VXNlcjIzMDk1NjAy", "MDQ6VXNlcjIzMjAzMzQ0", "MDQ6VXNlcjE5NzEwNTc1", "MDQ6VXNlcjE2NjA3NDAw", "MDQ6VXNlcjI2NDA1MDMw", "MDQ6VXNlcjIwMjU1MTc5", "MDQ6VXNlcjE4MDk3NDY4", "MDQ6VXNlcjM3MjU2ODkw", "MDQ6VXNlcjk4NTk0Nzk=", "MDQ6VXNlcjE3MzcyMjY4", "MDQ6VXNlcjMzNDQxNjUy", "MDQ6VXNlcjExODk1NzY4", "MDQ6VXNlcjMyNDkxODgw", "MDQ6VXNlcjMxNjExMTE4", "MDQ6VXNlcjI0NDI0ODA4", "MDQ6VXNlcjIxOTU4MjEz", "MDQ6VXNlcjE2NjQwMTAx", "MDQ6VXNlcjEyNTE4MjEz", "MDQ6VXNlcjM4NTk2MTk4", "MDQ6VXNlcjMyOTc5NzQw", "MDQ6VXNlcjI2MDU4MjQy", "MDQ6VXNlcjI4NDMxODE4", "MDQ6VXNlcjE5NzAyNjQ2", "MDQ6VXNlcjg0NTYzMzk=", "MDQ6VXNlcjIzNDc0ODk0", "MDQ6VXNlcjE5NTg2NjE2", "MDQ6VXNlcjE1OTgzOTk3", "MDQ6VXNlcjI2NzkwMzAw", "MDQ6VXNlcjM5ODg0MTQ2", "MDQ6VXNlcjM4OTMyMjA5", "MDQ6VXNlcjI1NjY1NzU4", "MDQ6VXNlcjQ4MzAxMjU=", "MDQ6VXNlcjIzNDgxODk5", "MDQ6VXNlcjM1MDYwMTI5", "MDQ6VXNlcjM0NTIyNzY0", "MDQ6VXNlcjI1MjQyOTEz", "MDQ6VXNlcjMyMzE2OTU5", "MDQ6VXNlcjEwMzc5Nzg=", "MDQ6VXNlcjExNzY4NzYw", "MDQ6VXNlcjI5OTAzMTE1", "MDQ6VXNlcjc5NjQ3NzU=", "MDQ6VXNlcjE2NTYwODg1", "MDQ6VXNlcjE3OTgwMDM3", "MDQ6VXNlcjMxMTIwODIw", "MDQ6VXNlcjI2NDAyMDU0", "MDQ6VXNlcjM3NzY4NzMz", "MDQ6VXNlcjE5OTAzMzcx", "MDQ6VXNlcjE4MDQ0MjI1", "MDQ6VXNlcjI2MDk3OTA0", "MDQ6VXNlcjIyNDk5NzQ4", "MDQ6VXNlcjEwNDU4NTU3", "MDQ6VXNlcjE1NjY3NzQ4", "MDQ6VXNlcjMzNDcyMzk3", "MDQ6VXNlcjI1NzA3MDUz", "MDQ6VXNlcjIyODU0MzAx", "MDQ6VXNlcjE5NDI0NDUz", "MDQ6VXNlcjE4MDY2ODMx", "MDQ6VXNlcjIxMzU0Mzc3", "MDQ6VXNlcjIzMDg5ODcx", "MDQ6VXNlcjM0OTAxODY3", "MDQ6VXNlcjM4Mjc2MTg0", "MDQ6VXNlcjEyNzkyMTE0", "MDQ6VXNlcjI0OTMxMzk0", "MDQ6VXNlcjEzOTAwODkw", "MDQ6VXNlcjM5ODk4MzA5", "MDQ6VXNlcjM1NzU2ODg3", "MDQ6VXNlcjI5NjcwNjAw", "MDQ6VXNlcjIzNDY2ODI2", "MDQ6VXNlcjMwMDQwNzk4", "MDQ6VXNlcjEyODIyNDIx", "MDQ6VXNlcjQxOTk2MDA1", "MDQ6VXNlcjM5MjYxNzgx", "MDQ6VXNlcjEwMDEwNTMw", "MDQ6VXNlcjQxMTM3MDEx", "MDQ6VXNlcjI0NDUwODEz", "MDQ6VXNlcjQyMTAzNjAw", "MDQ6VXNlcjM3ODY5MTYy", "MDQ6VXNlcjMyNjY2MTYy", "MDQ6VXNlcjU0MDEyNTg=", "MDQ6VXNlcjQyNTEyOTEz", "MDQ6VXNlcjM2NDAxOTQz", "MDQ6VXNlcjE5NDA2NjEz", "MDQ6VXNlcjE5NDA2NjM1", "MDQ6VXNlcjE5NDA5ODU0", "MDQ6VXNlcjEyMjQ3MjYx", "MDQ6VXNlcjIwNTczMTky", "MDQ6VXNlcjMwNTE5Njc3", "MDQ6VXNlcjE0MDU2NjM5", "MDQ6VXNlcjk0MTEzMzc=", "MDQ6VXNlcjMwMDQzNzky", "MDQ6VXNlcjE2MjgyODQ1", "MDQ6VXNlcjE2NTUyNzc0", "MDQ6VXNlcjE4MzQ0OTU2", "MDQ6VXNlcjMzOTM0MjM5", "MDQ6VXNlcjE5ODExNTE1", "MDQ6VXNlcjI0ODA0NTc1", "MDQ6VXNlcjQyNTM3NTY1", "MDQ6VXNlcjI5NTc1NDk4", "MDQ6VXNlcjI5NjU1MTgw", "MDQ6VXNlcjg1NzQ4MTA=", "MDQ6VXNlcjEyNDQyNzQ=", "MDQ6VXNlcjMzOTgxODE2", "MDQ6VXNlcjM2Mjg3MDE4", "MDQ6VXNlcjIyMTg2NzIy", "MDQ6VXNlcjM2ODI5MjMy", "MDQ6VXNlcjE3OTYzODEz", "MDQ6VXNlcjIyNDc0ODEx", "MDQ6VXNlcjExMDIyODky", "MDQ6VXNlcjM1NzYxNjcx", "MDQ6VXNlcjg5MTgxMTg=", "MDQ6VXNlcjM0MzM5MDY3", "MDQ6VXNlcjM1OTkzMjc0", "MDQ6VXNlcjMxMDMwMTM3", "MDQ6VXNlcjEyMDI5NzQ2", "MDQ6VXNlcjI5NDcxOTEw", "MDQ6VXNlcjQyMzM4NzQy", "MDQ6VXNlcjMwNDg0NjQy", "MDQ6VXNlcjE0MDkxMDkw", "MDQ6VXNlcjM5MDA5MzU5", "MDQ6VXNlcjMzNzczNzYw", "MDQ6VXNlcjE2NzEzNzU4", "MDQ6VXNlcjI5MzM5MzYz", "MDQ6VXNlcjI2ODI4ODc1", "MDQ6VXNlcjQxNjE1MzQx", "MDQ6VXNlcjM5MTI2NDM2", "MDQ6VXNlcjM4Njc4OTcz", "MDQ6VXNlcjMzOTAxMDA=", "MDQ6VXNlcjM0OTMzMDkx", "MDQ6VXNlcjIyMTc5Nzc1", "MDQ6VXNlcjMyODA0NDcz", "MDQ6VXNlcjM0NDc3ODc2", "MDQ6VXNlcjQ0MzAzNjA=", "MDQ6VXNlcjE4MjI3MjQ4", "MDQ6VXNlcjM5Nzg1MDAw", "MDQ6VXNlcjEwNjgzOTYw", "MDQ6VXNlcjM3MTQ4NTc5", "MDQ6VXNlcjQwNjQ4OTI3", "MDQ6VXNlcjczMTA5OTY=", "MDQ6VXNlcjMzNzQyMDY4", "MDQ6VXNlcjIxMDcyODcw", "MDQ6VXNlcjM4Njg1NTAz", "MDQ6VXNlcjE5NDYyNjk2", "MDQ6VXNlcjE2MjQzMTAx", "MDQ6VXNlcjM2OTUyMDA1", "MDQ6VXNlcjM5NzcwNjUx", "MDQ6VXNlcjI2MTE2NDg5", "MDQ6VXNlcjQwMjgzMDg3", "MDQ6VXNlcjM4NDE1NDQ5", "MDQ6VXNlcjM2NjE5Mzk3", "MDQ6VXNlcjM0NTM0NDM2", "MDQ6VXNlcjM0MTUzMDAz", "MDQ6VXNlcjMxMjYyODUz", "MDQ6VXNlcjI0NDg3NDgw", "MDQ6VXNlcjE1MTAwMTc5", "MDQ6VXNlcjE3MDUwMzI2", "MDQ6VXNlcjE5OTY1Mjk1", "MDQ6VXNlcjM5MTQ2MzA1", "MDQ6VXNlcjM0MDU0MTg5", "MDQ6VXNlcjI3ODk0NDcy", "MDQ6VXNlcjM3NDMzMzA4", "MDQ6VXNlcjM3ODk0ODcx", "MDQ6VXNlcjIyNTczODkx", "MDQ6VXNlcjEwMTYzNzcw", "MDQ6VXNlcjMwMTA5NTE5", "MDQ6VXNlcjM0ODI3NDA4", "MDQ6VXNlcjM5Mzk5NDE2", "MDQ6VXNlcjIyMDQ2OTUx", "MDQ6VXNlcjM4MTk4NzM2", "MDQ6VXNlcjI2NjE3MDMy", "MDQ6VXNlcjM0NDY0MDAy", "MDQ6VXNlcjM5NjY5MzY=", "MDQ6VXNlcjMyNzYwNjE0", "MDQ6VXNlcjI4NzcwMzgy", "MDQ6VXNlcjEyNTgwMzYy", "MDQ6VXNlcjEzMTE3ODYw", "MDQ6VXNlcjE5NzgyNjEy", "MDQ6VXNlcjQyNzIyMDY=", "MDQ6VXNlcjE1ODQ2Mzgw", "MDQ6VXNlcjIyMjc1NzI0", "MDQ6VXNlcjkzMDUxODQ=", "MDQ6VXNlcjI5NTMxOTcx", "MDQ6VXNlcjM0OTAxNTY5", "MDQ6VXNlcjE3ODA5MjM0", "MDQ6VXNlcjI4NjI0MDA3", "MDQ6VXNlcjIwMzUwMzgz", "MDQ6VXNlcjM4NzQxMzUx", "MDQ6VXNlcjI0MjgzMzkx", "MDQ6VXNlcjEyNjk1NTE4", "MDQ6VXNlcjEzOTE2Nzc5", "MDQ6VXNlcjM1ODI0MjMx", "MDQ6VXNlcjE3Njk4NjAx", "MDQ6VXNlcjIzMDQ4NjQy", "MDQ6VXNlcjM2MTU1NTc=", "MDQ6VXNlcjM3NjIxMjQw", "MDQ6VXNlcjM0NjgzNTU3", "MDQ6VXNlcjE1OTM2NjIy", "MDQ6VXNlcjM2MTQ1MzQ2", "MDQ6VXNlcjE5Nzc0NzM3", "MDQ6VXNlcjE2NDA3OTg2", "MDQ6VXNlcjMwNjY0Nzgy", "MDQ6VXNlcjMwNzk5NzQ4", "MDQ6VXNlcjM2NzE5MTc1", "MDQ6VXNlcjI2MTU0OTI3", "MDQ6VXNlcjM2MDY1NDk5", "MDQ6VXNlcjI5OTE2NDcy", "MDQ6VXNlcjI3ODU3MjI5", "MDQ6VXNlcjM5MzIzOTM1", "MDQ6VXNlcjMxNzY5MjA2", "MDQ6VXNlcjM0ODU2NzY1", "MDQ6VXNlcjEzMzk0MzQw", "MDQ6VXNlcjIyMTA5MjQ2", "MDQ6VXNlcjMyMzE3MDc4", "MDQ6VXNlcjEzMTg1MTgx", "MDQ6VXNlcjI2MTk3ODAy", "MDQ6VXNlcjI0OTk2OTI5", "MDQ6VXNlcjIzMTY0Mzc2", "MDQ6VXNlcjI5OTc1NjU4", "MDQ6VXNlcjI1ODYxNjQw", "MDQ6VXNlcjI0NjQzMTIx", "MDQ6VXNlcjE5NzMyMjA1", "MDQ6VXNlcjMzNzQyNzg4", "MDQ6VXNlcjIxMDM0OTIx", "MDQ6VXNlcjMwODkzMjUy", "MDQ6VXNlcjM0NzUyMjM1", "MDQ6VXNlcjMxMTUyMzY1", "MDQ6VXNlcjI5OTE2OTU4", "MDQ6VXNlcjI2ODA1ODI1", "MDQ6VXNlcjI5ODg3MDUz", "MDQ6VXNlcjMzMTg5MjIz", "MDQ6VXNlcjE2MjQ2NTU0", "MDQ6VXNlcjk2NTI2MDk=", "MDQ6VXNlcjI4OTExMTcx", "MDQ6VXNlcjM2Mjk0MzE4", "MDQ6VXNlcjE1MTI4NzIy", "MDQ6VXNlcjMyOTA1Mjk0", "MDQ6VXNlcjIzMjU0MjUx", "MDQ6VXNlcjM3NTc2NzE1", "MDQ6VXNlcjIxMjU2OTQx", "MDQ6VXNlcjM5MTQ5OTAy", "MDQ6VXNlcjIzMjUxODYx", "MDQ6VXNlcjI4MzUzMDU0", "MDQ6VXNlcjM1OTkwMjQ0", "MDQ6VXNlcjIzMzM4NTA5", "MDQ6VXNlcjE0MjEwNjY3", "MDQ6VXNlcjczMDkyMzc=", "MDQ6VXNlcjI1MTY4OTgw", "MDQ6VXNlcjEzODUwNTgy", "MDQ6VXNlcjEyNjM2OTI0", "MDQ6VXNlcjI4NjE1NzMz", "MDQ6VXNlcjEwMzk3OTU0", "MDQ6VXNlcjM3ODg5NTA3", "MDQ6VXNlcjE5NjMxNDM2", "MDQ6VXNlcjM4OTc0NjUx", "MDQ6VXNlcjEzNTU0NzEz", "MDQ6VXNlcjMxMzQwMTMy", "MDQ6VXNlcjI1OTIxNTU2", "MDQ6VXNlcjEzNzgwMzMz", "MDQ6VXNlcjI2OTI2NDY5", "MDQ6VXNlcjExNDM0Mzk3", "MDQ6VXNlcjM0MjYzMDA5", "MDQ6VXNlcjE2MTM5MDQ2", "MDQ6VXNlcjE1NjgyMDU2", "MDQ6VXNlcjEwNTkwMTQ2", "MDQ6VXNlcjI1ODkwODk5", "MDQ6VXNlcjI2NTc2NTMy", "MDQ6VXNlcjM0NzQ0MTQz", "MDQ6VXNlcjE3Njk1ODYz", "MDQ6VXNlcjM1MTMyNTY2", "MDQ6VXNlcjE1MTkzMzQy", "MDQ6VXNlcjE2NzkwMjMw", "MDQ6VXNlcjIwMTM2MjQ3", "MDQ6VXNlcjY4MjI1NjI=", "MDQ6VXNlcjI2MDg1NzM1", "MDQ6VXNlcjYyNDQwMzg=", "MDQ6VXNlcjI1MDAxMjA3", "MDQ6VXNlcjI5MDU5NTIy", "MDQ6VXNlcjU2Nzk3MDU=", "MDQ6VXNlcjI4OTE0MDUw", "MDQ6VXNlcjM2Mzg4NTk3", "MDQ6VXNlcjI5ODMwOTQ0", "MDQ6VXNlcjUyOTUzMjA=", "MDQ6VXNlcjM4MzEwODAy", "MDQ6VXNlcjE4NDExMDg2", "MDQ6VXNlcjcwMzcyOTI=", "MDQ6VXNlcjI2MzE3Njg1", "MDQ6VXNlcjgzMjg0NDM=", "MDQ6VXNlcjI2OTk1MDQw", "MDQ6VXNlcjE5OTk0ODcw", "MDQ6VXNlcjMyMDg0MjEw", "MDQ6VXNlcjMxMDEyMzk4", "MDQ6VXNlcjkzMDcyOTg=", "MDQ6VXNlcjE5MTgyMzk0", "MDQ6VXNlcjU0MDQ3NDM=", "MDQ6VXNlcjE4MTM3ODAx", "MDQ6VXNlcjI0ODM5NjE0", "MDQ6VXNlcjE4MzQ1NzQ3", "MDQ6VXNlcjM2MDIxNjE0", "MDQ6VXNlcjIwMjg1NTUx", "MDQ6VXNlcjE2Nzk3MTM5", "MDQ6VXNlcjM5NTYyMzcw", "MDQ6VXNlcjczNTE0NDQ=", "MDQ6VXNlcjM4NjI1MTI2", "MDQ6VXNlcjY4OTY2NDY=", "MDQ6VXNlcjM5NzIyMDE2", "MDQ6VXNlcjM2ODgwNjU5", "MDQ6VXNlcjc0MDM3MDE=", "MDQ6VXNlcjM1NzQxMjAx", "MDQ6VXNlcjE4Njk5ODAy", "MDQ6VXNlcjczNDQ4MDk=", "MDQ6VXNlcjU1MDczODY=", "MDQ6VXNlcjMwNjk3MzQz", "MDQ6VXNlcjMwMjk5MTkw", "MDQ6VXNlcjIwMDYwNTk2", "MDQ6VXNlcjIzNTQ4ODE0", "MDQ6VXNlcjMzNzk2NzU4", "MDQ6VXNlcjM4OTY3MzAz", "MDQ6VXNlcjIzMDU3MDgx", "MDQ6VXNlcjE2NTA2NjMy", "MDQ6VXNlcjExOTU0ODA5", "MDQ6VXNlcjM0MjkyODU0", "MDQ6VXNlcjMwNTMxODEz", "MDQ6VXNlcjM1MjA2Mjg2", "MDQ6VXNlcjM1NDQ0NzE1", "MDQ6VXNlcjI5OTA0ODg5", "MDQ6VXNlcjM2ODc3MDY2", "MDQ6VXNlcjkyNzY4MjQ=", "MDQ6VXNlcjI1ODYxNTk3", "MDQ6VXNlcjM0NTY3MTYy", "MDQ6VXNlcjE3OTQ5NzY1", "MDQ6VXNlcjM1NDE5OTQ4", "MDQ6VXNlcjE4MDk5NTUx", "MDQ6VXNlcjI1NzU4NTcz", "MDQ6VXNlcjMyNzA4MjQ5", "MDQ6VXNlcjExMTg5MjIw", "MDQ6VXNlcjExOTU1MTg3", "MDQ6VXNlcjIwMjc0NzIy", "MDQ6VXNlcjMwMDQ4OTg5", "MDQ6VXNlcjI4MzQyMzIx", "MDQ6VXNlcjE4MTU1NDQx", "MDQ6VXNlcjI5NDc0MjQz", "MDQ6VXNlcjEzNzQ2Mjc5", "MDQ6VXNlcjI4OTgzMzk5", "MDQ6VXNlcjM3ODM0MDQ2", "MDQ6VXNlcjE4MzM1Njgz", "MDQ6VXNlcjEzNzQ3NTM3", "MDQ6VXNlcjMwNTY0NTM1", "MDQ6VXNlcjMzMjIyODEx", "MDQ6VXNlcjE4NjI4ODM0", "MDQ6VXNlcjE3NDY5MDg3", "MDQ6VXNlcjIzMDcwNDgx", "MDQ6VXNlcjMxNTQzNjMw", "MDQ6VXNlcjYzMDc3ODE=", "MDQ6VXNlcjM1NDAxNzA0", "MDQ6VXNlcjM2ODI0MzEy", "MDQ6VXNlcjMyMDA2NDQz", "MDQ6VXNlcjEyOTMyNTQx", "MDQ6VXNlcjM4Mjc1ODI1", "MDQ6VXNlcjU5OTkyMDc=", "MDQ6VXNlcjIyNjE2MjE0"]
--------------------------------------------------------------------------------
/datapersistence.py:
--------------------------------------------------------------------------------
1 | import os.path
2 | import json
3 |
4 | global REPOSITORY_STARGAZERS
5 | REPOSITORY_STARGAZERS = {}
6 | global USER_STAR_REPOSITORIES
7 | USER_STAR_REPOSITORIES = {}
8 | global NODE_ID_CONTENT
9 | NODE_ID_CONTENT = {}
10 | global BLACK_LIST
11 | BLACK_LIST = []
12 |
13 |
14 | def create_file_if_not_exist(dir_path, file_name):
15 | file_path = dir_path + file_name
16 | if not os.path.exists(dir_path):
17 | os.makedirs(dir_path)
18 | if not os.path.exists(file_path):
19 | with open(file_path, 'w'):
20 | print('create file:' + file_path)
21 |
22 |
23 | def init_data_file():
24 | dir_path = 'data/'
25 | create_file_if_not_exist(dir_path, 'REPOSITORY_STARGAZERS.json')
26 | create_file_if_not_exist(dir_path, 'USER_STAR_REPOSITORIES.json')
27 | create_file_if_not_exist(dir_path, 'NODE_ID_CONTENT.json')
28 | create_file_if_not_exist(dir_path, 'BLACK_LIST.json')
29 |
30 |
31 | def save_data():
32 | init_data_file()
33 | dir_path = 'data/'
34 | with open(dir_path + 'REPOSITORY_STARGAZERS.json', 'w') as f:
35 | json.dump(REPOSITORY_STARGAZERS, f)
36 | with open(dir_path + 'USER_STAR_REPOSITORIES.json', 'w') as f:
37 | json.dump(USER_STAR_REPOSITORIES, f)
38 | with open(dir_path + 'NODE_ID_CONTENT.json', 'w') as f:
39 | json.dump(NODE_ID_CONTENT, f)
40 | with open(dir_path + 'BLACK_LIST.json', 'w') as f:
41 | json.dump(BLACK_LIST, f)
42 |
43 |
44 | def load_data():
45 | dir_path = 'data/'
46 | global REPOSITORY_STARGAZERS
47 | global USER_STAR_REPOSITORIES
48 | global NODE_ID_CONTENT
49 | global BLACK_LIST
50 | if os.path.exists(dir_path + 'REPOSITORY_STARGAZERS.json'):
51 | with open(dir_path + 'REPOSITORY_STARGAZERS.json', 'r') as f:
52 | REPOSITORY_STARGAZERS = json.load(f)
53 | if os.path.exists(dir_path + 'USER_STAR_REPOSITORIES.json'):
54 | with open(dir_path + 'USER_STAR_REPOSITORIES.json', 'r') as f:
55 | USER_STAR_REPOSITORIES = json.load(f)
56 | if os.path.exists(dir_path + 'NODE_ID_CONTENT.json'):
57 | with open(dir_path + 'NODE_ID_CONTENT.json', 'r') as f:
58 | NODE_ID_CONTENT = json.load(f)
59 | if os.path.exists(dir_path + 'BLACK_LIST.json'):
60 | with open(dir_path + 'BLACK_LIST.json', 'r') as f:
61 | BLACK_LIST = json.load(f)
62 |
--------------------------------------------------------------------------------
/fetchdata.py:
--------------------------------------------------------------------------------
1 | import requests
2 | import queue
3 | import time
4 | import datapersistence as dp
5 |
6 | GITHUB_API_URL = 'https://api.github.com/graphql'
7 | TOKEN = 'use your own token'
8 | global SEARCH_NODE_ID
9 | SEARCH_NODE_ID = 'MDEwOlJlcG9zaXRvcnk2MzE0ODcxNQ=='
10 |
11 |
12 | def load_token():
13 | global TOKEN
14 | with open('token', 'r') as f:
15 | TOKEN = f.readline()
16 |
17 |
18 | def run_query(query):
19 | request = requests.post(GITHUB_API_URL, json={'query': query}, headers={'Authorization': TOKEN})
20 |
21 | if request.status_code == 200:
22 | return request.json()
23 | else:
24 | raise Exception("Query failed to run by returning code of {}. {}".format(request.status_code, query))
25 |
26 |
27 | def get_user_stars(node_id):
28 |
29 | if node_id in dp.USER_STAR_REPOSITORIES:
30 | return dp.USER_STAR_REPOSITORIES[node_id]
31 |
32 | if node_id not in dp.NODE_ID_CONTENT:
33 | get_node_content(node_id)
34 | if node_id not in dp.NODE_ID_CONTENT:
35 | return None
36 |
37 | node_content = dp.NODE_ID_CONTENT[node_id]
38 | if 'login' not in node_content:
39 | return None
40 |
41 | next_cursor = ''
42 | has_next = True
43 | all_star_repos = []
44 |
45 | def fetch_id_from_edge(edge):
46 | if edge is None:
47 | return None
48 | node = edge['node']
49 | dp.NODE_ID_CONTENT[node['id']] = {'owner': node['owner']['login'], 'name': node['name']}
50 | return node['id']
51 |
52 | while has_next:
53 | query_ql = '''
54 | query {
55 | user(login: \"''' + node_content['login'] + '''\") {
56 | starredRepositories(first: 100''' + next_cursor + ''') {
57 | edges {
58 | node {
59 | id
60 | owner {
61 | login
62 | }
63 | name
64 | }
65 | }
66 | pageInfo {
67 | endCursor
68 | hasNextPage
69 | }
70 | }
71 | }
72 | }
73 | '''
74 | response = run_query(query_ql)
75 | if response['data']['user'] is not None:
76 | repos = response['data']['user']['starredRepositories']
77 | edges = repos['edges']
78 | if len(edges) > 0:
79 | nodes = list(map(fetch_id_from_edge, edges))
80 | all_star_repos += nodes
81 | page_info = repos['pageInfo']
82 | next_cursor = ', after: \"' + page_info['endCursor'] + '\"'
83 | has_next = page_info['hasNextPage']
84 | else:
85 | get_node_content(node_id)
86 | node_content = dp.NODE_ID_CONTENT[node_id]
87 | has_next = False
88 |
89 | dp.USER_STAR_REPOSITORIES[node_id] = all_star_repos
90 | dp.save_data()
91 | return all_star_repos
92 |
93 |
94 | def get_repo_stargazers(node_id):
95 |
96 | if node_id in dp.REPOSITORY_STARGAZERS:
97 | return dp.REPOSITORY_STARGAZERS[node_id]
98 |
99 | if node_id not in dp.NODE_ID_CONTENT:
100 | get_node_content(node_id)
101 | if node_id not in dp.NODE_ID_CONTENT:
102 | return None
103 |
104 | node_content = dp.NODE_ID_CONTENT[node_id]
105 | if 'owner' not in node_content:
106 | return None
107 |
108 | next_cursor = ''
109 | has_next = True
110 | all_stargazers = []
111 |
112 | def fetch_id_from_edge(edge):
113 | if edge is None:
114 | return None
115 | node = edge['node']
116 | dp.NODE_ID_CONTENT[node['id']] = {'login': node['login']}
117 | return node['id']
118 |
119 | while has_next:
120 | query_ql = '''
121 | query {
122 | repository(owner: \"''' + node_content['owner'] + '''\", name: \"''' + node_content['name'] + '''\") {
123 | stargazers(first: 100''' + next_cursor + ''') {
124 | edges {
125 | node {
126 | id
127 | login
128 | }
129 | }
130 | pageInfo {
131 | endCursor
132 | hasNextPage
133 | }
134 | }
135 | }
136 | }
137 | '''
138 | response = run_query(query_ql)
139 | if response['data']['repository'] is not None:
140 | stargazers = response['data']['repository']['stargazers']
141 | edges = stargazers['edges']
142 | if len(edges) > 0:
143 | nodes = list(map(fetch_id_from_edge, edges))
144 | all_stargazers += nodes
145 | page_info = stargazers['pageInfo']
146 | next_cursor = ', after: \"' + page_info['endCursor'] + '\"'
147 | has_next = page_info['hasNextPage']
148 | else:
149 | get_node_content(node_id)
150 | node_content = dp.NODE_ID_CONTENT[node_id]
151 | has_next = False
152 |
153 | dp.REPOSITORY_STARGAZERS[node_id] = all_stargazers
154 | dp.save_data()
155 | return all_stargazers
156 |
157 |
158 | def get_node_content(node_id):
159 | query_ql = '''
160 | query {
161 | node(id: \"''' + node_id + '''\") {
162 | ... on Repository {
163 | owner {
164 | login
165 | }
166 | name
167 | }
168 | ... on User {
169 | login
170 | }
171 | }
172 | }
173 | '''
174 | response = run_query(query_ql)
175 | node = response['data']['node']
176 | if node is None:
177 | return
178 | if 'owner' in node and 'name' in node:
179 | dp.NODE_ID_CONTENT[node_id] = {'owner': node['owner']['login'], 'name': node['name']}
180 | elif 'login' in node:
181 | dp.NODE_ID_CONTENT[node_id] = {'login': node['login']}
182 | else:
183 | print('node id: ' + node_id + ' not found')
184 |
185 |
186 | def bfs_users_star_repos(node_id, max_level):
187 | visited = [node_id]
188 | q = queue.Queue()
189 | q.put(node_id)
190 | level = 1
191 | current_level_node_count_left = 1
192 | next_level_node_count = 0
193 | while not q.empty():
194 | current_node = q.get()
195 | print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
196 | + ' bfs current level:' + format(level)
197 | + ' current node:' + current_node
198 | + ' ' + format(current_level_node_count_left) + ' nodes left')
199 | result = get_user_stars(current_node)
200 | if result is None:
201 | result = get_repo_stargazers(current_node)
202 | if result is not None:
203 | for sub_node_id in result:
204 | if sub_node_id is not None and sub_node_id not in visited:
205 | visited.append(sub_node_id)
206 | q.put(sub_node_id)
207 | next_level_node_count += 1
208 |
209 | current_level_node_count_left -= 1
210 | if current_level_node_count_left == 0:
211 | level += 1
212 | if level > max_level:
213 | return
214 | current_level_node_count_left = next_level_node_count
215 | next_level_node_count = 0
216 |
217 |
218 | if __name__ == '__main__':
219 | load_token()
220 | dp.load_data()
221 | bfs_users_star_repos(SEARCH_NODE_ID, 2)
222 | dp.save_data()
223 |
--------------------------------------------------------------------------------
/processingdata.py:
--------------------------------------------------------------------------------
1 | import datapersistence as dp
2 | import fetchdata as fd
3 | import time
4 |
5 | CLUSTER_SIMILARITY = 0.5
6 |
7 |
8 | def calculate_similarity(list_a, list_b):
9 | set_a = set(list_a)
10 | set_b = set(list_b)
11 | return len(set_a.intersection(set_b)) / len(set_a.union(set_b))
12 |
13 |
14 | def cluster_data(data):
15 | nodes = list(data.keys())
16 | nodes_need_remove = []
17 | for node in nodes:
18 | if node not in dp.NODE_ID_CONTENT:
19 | fd.get_node_content(node)
20 | dp.save_data()
21 | if node not in dp.NODE_ID_CONTENT:
22 | nodes_need_remove.append(node)
23 | else:
24 | dp.NODE_ID_CONTENT[node]['cluster'] = node
25 | for node_remove in nodes_need_remove:
26 | nodes.remove(node_remove)
27 |
28 | for i, node_a in enumerate(nodes):
29 | for j, node_b in enumerate(nodes):
30 | if j <= i:
31 | continue
32 | if 'similarity' not in dp.NODE_ID_CONTENT[node_a]:
33 | dp.NODE_ID_CONTENT[node_a]['similarity'] = {}
34 | if 'similarity' not in dp.NODE_ID_CONTENT[node_b]:
35 | dp.NODE_ID_CONTENT[node_b]['similarity'] = {}
36 | if node_b not in dp.NODE_ID_CONTENT[node_a]['similarity']:
37 | similarity = calculate_similarity(data[node_a], data[node_b])
38 | dp.NODE_ID_CONTENT[node_a]['similarity'][node_b] = similarity
39 | dp.NODE_ID_CONTENT[node_b]['similarity'][node_a] = similarity
40 | else:
41 | similarity = dp.NODE_ID_CONTENT[node_a]['similarity'][node_b]
42 | if similarity >= CLUSTER_SIMILARITY:
43 | dp.NODE_ID_CONTENT[node_b]['cluster'] = dp.NODE_ID_CONTENT[node_a]['cluster']
44 |
45 |
46 | def generate_blacklist():
47 | clusters = {}
48 | for node, content in dp.NODE_ID_CONTENT.items():
49 | if 'cluster' in content:
50 | if content['cluster'] not in clusters:
51 | clusters[content['cluster']] = []
52 | clusters[content['cluster']].append(node)
53 |
54 | log = ''
55 | for cluster_id, cluster_content in clusters.items():
56 | cluster_description = ''
57 | if 'login' in dp.NODE_ID_CONTENT[cluster_id]:
58 | if len(cluster_content) > 50:
59 | for node in cluster_content:
60 | cluster_content_list = dp.USER_STAR_REPOSITORIES[node]
61 | if len(cluster_content_list) < 100:
62 | if node not in dp.BLACK_LIST:
63 | dp.BLACK_LIST.append(node)
64 | cluster_description += 'user login name: ' + \
65 | dp.NODE_ID_CONTENT[node]['login'] + \
66 | '; star num: ' + \
67 | format(len(cluster_content_list)) + \
68 | '\n'
69 | if len(cluster_description) > 0:
70 | cluster_description += '===============================\n\n'
71 | log += cluster_description
72 | blacklist_set = set(dp.BLACK_LIST)
73 | for cluster_id, cluster_content in clusters.items():
74 | cluster_description = ''
75 | if 'owner' in dp.NODE_ID_CONTENT[cluster_id]:
76 | for node in cluster_content:
77 | cluster_content_list = dp.REPOSITORY_STARGAZERS[node]
78 | black_match_count = len(blacklist_set.intersection(set(cluster_content_list)))
79 | if black_match_count > 0:
80 | black_percent = black_match_count / len(cluster_content_list)
81 | dp.NODE_ID_CONTENT[node]['black_percent'] = black_percent
82 | cluster_description += 'repo owner/name: ' + \
83 | dp.NODE_ID_CONTENT[node]['owner'] + \
84 | '/' + \
85 | dp.NODE_ID_CONTENT[node]['name'] + \
86 | '; stargazer num: ' + \
87 | format(len(cluster_content_list)) +\
88 | '; black percent:' + \
89 | format(black_percent) + \
90 | '\n'
91 | if len(cluster_description) > 0:
92 | cluster_description += '===============================\n\n'
93 | log += cluster_description
94 | dir_path = 'data/'
95 | with open(dir_path + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '_blacklist.log', 'wt') as f:
96 | f.write(log)
97 |
98 |
99 | def search_blacklist():
100 | for index, user in enumerate(dp.BLACK_LIST):
101 | print('search_blacklist, index: ' + format(index) + ', user: ' + user)
102 | fd.bfs_users_star_repos(user, 2)
103 |
104 |
105 | if __name__ == '__main__':
106 | fd.load_token()
107 | dp.load_data()
108 | cluster_data(dp.USER_STAR_REPOSITORIES)
109 | cluster_data(dp.REPOSITORY_STARGAZERS)
110 | generate_blacklist()
111 | search_blacklist()
112 | dp.save_data()
113 |
--------------------------------------------------------------------------------