This repository has been archived by the owner on Mar 21, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Abnormality_Check.py
590 lines (566 loc) · 41.8 KB
/
Abnormality_Check.py
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
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
335
336
337
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
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
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
import os
import pickle
import webbrowser
from multiprocessing import Process
from multiprocessing import freeze_support
import PySimpleGUI as sg
import fitz
import pandas as pd
ROOT = './img/'
class GUI:
def __init__(self):
self.version = 'V0.1.1'
self.ICO = b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\xc8\x00\x00\x00\xc8\x08\x06\x00\x00\x00\xadX\xae' \
b'\x9e\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00 \x00IDATx^\xed\x9d{' \
b'|\x1cU\xd9\xc7\x7f\xcfl\x92\xee\xa6\x08\x05\x14\x01\x0b%\x1b\n\x08\x88(' \
b'"\x82miv\xdb\x02"x\x05\x05\xac\xb4I\xc5W^\x91\x8b\xbcr\xe9nY\xba\xdb\x82\x88(' \
b'\xe0\x05K\x93\x82\xdc\xde\xbe\xad\x80"\x82\xd0\x9dD@P\xa4*\x17+ ' \
b'\xd9`AAP\xe4"\xd94\xcd\xce\xf3~f\x93\xb6\xe9}\xceefgw\xcf|>\xfd\xf0\x07\xe7\xb9\x9c\xdf9\xdf\xcc' \
b'\xce\xcc9\xcf!\x98\xcb(`\x14\xd8\xaa\x02d\xb41\n\x18\x05\xb6\xae\x80\x01\xc4\xcc\x0e\xa3\xc06' \
b'\x140\x80\x98\xe9a\x140\x80\x989`\x14\x90S\xc0\xdcA\xe4t3Vu\xa2\x80\x01\xa4N\x06\xdatSN\x01\x03' \
b'\x88\x9cn\xc6\xaaN\x140\x80\xd4\xc9@\x9bn\xca)`\x00\x91\xd3\xcdX\xd5\x89\x02\x06\x90:\x19h\xd3M9' \
b'\x05\x0c r\xba\x19\xab:Q\xc0\x00\xa2i\xa0\']\xc8;[' \
b'\r\x18\xd7D\x18\xc7\xee?`\x1c3v\xb6\x80q\x0ec\xac\x05\xbc\xe9\x10\xfe\r\xc6\xeb4\xf2o-\xe1\xdf' \
b'\xa5\xb5x\xfd\xd7W\xd0[\x9a\xd20n4+`\x00\xf1(\xe8\xe4\x8b\xf8]\r\r\x88[' \
b'@\x0b\x808\x0f\xff\xb7\x85\x18q&\xecE@\x83GW\x9b5c`\x80\x18}\x0c\xf4\x81P ' \
b'\xf7\xbf\x8c\x82C\xe8\x1b\\\x83\x82\x01HVYu;\x03\xc8V4\x9c\x91\xe1\xdd\x86\xd6\xe2\x18\x10\xa6' \
b'\x130\r\x84=\xd4\xe5\x96\xf3\xc0\xc0\xd3\x04\xdc\x07\xc6\xfd\x91\x01t\xdfw%\xbd-\xe7\xc9X\x89' \
b'*`\x00\x19Q\xec\xc8s9\xd6<\x16G\xbb@\x00\xe5\x7f\xef\x13\x153\x88\xf6\xccX\x0b\xe0\x11\x10\xee' \
b'\x87\x83\xfb\xecF<\x86\x0c9A\xc4\xae\xc7\x18u\r\xc8\x81\x19nz\xb7\x83\xe3\x88q*\x18\'\x10!V\x85' \
b'\x93\xe0\x15f,e\xc2-\xddY\xfam\x15\xe6\x1f\xea\x94\xeb\x10\x10\xa6i)\x1c\xed\x00\xa7\x02\xf8,' \
b'\x11v\x0e\xf5\x08\t$\xc7\x8c^\x10n\xa3\x08n\xcag\xe8Y\x01S\xd3t+\n\xd4\r \x93/\xe6=\x9a,' \
b'\x9c\x0b\xe0\x0b\x95|\x9e\x08l&2\xfe\x08\xc2\x92R\x04\x8bz24\x10X\xdc\x1a\x0bT\xf3\x80L\xbb\x84' \
b'\xf7f\x07s\x01\xcc\x02\xd0Tc\xe3\xe7\xa5;\xeeO\xb0\xab\x1a\x06\xf0=\xf3p\xefE\xae\x8d\xdb\xd4, ' \
b'm)\xde\x9f\x80\xb9 \x9c\xa2\xf2\nV\\\xd2pZ0\xe3\xdf\x00\xaev\x1apuO\x86^\x0fg\x96\xe1\xcb\xaa' \
b'\xe6\x00iK\xf3A\x16p)\x80\xcf\x84O\xeePd\xd4\xcf\x8c\x1f\x16\x1b\xb0\xf0\x91\x0c\xbd\x16\x8a' \
b'\x8cB\x9cD\xcd\x00R~M\xbb\x032\x0c\x9cg\xee\x18\xdb\x9fq\xccx\x95\t\xe7tg\xe9\xd6\xed\xb7\xae' \
b'\xdf\x165\x01Hr\x1eOg\x07\xd7\x13aB\xfd\x0e\xa5\\\xcf\x19\xe8\xb6,' \
b'\xccZq)\xad\x96\xf3P\xdbVU\rH\xf9k\xf7\x10\xbeK\x84Sj{' \
b'\x98\xfc\xed\x1d3\x8aD\xc8\xec\xf24\xbe\xbdl\x19\x95\xfc\x8dV]\xde\xab\x16\x90D\x9a\xe7\x80qE' \
b'-}\xc7\xa8\xf4\xd4a\xc6SL\x98\xd5\x9d\xa5\x95\x95\xce%,' \
b'\xf1\xab\x0e\x90#3\xbcK\xf3\x10n\x01\xe1\xd8\xb0\x88XKy00\x04F\xc6n\xc0ef\t\x0bPU\x80$\xd3<\x19' \
b'\xc0r\x00\xbb\xd5\xd2\xa4\x0ce_\x18\x0f\x95\x1apJO\x86^\x0ce~\x01%U5\x80$S|\x05\x08\xff\x13\x90' \
b'.2a\n\xccx\x9e\x80~&\xf4\x83\xf16\x03\xfd\x16\xd0\x0fB\x91\x19c\x014\x13\xd0\x0c`,' \
b'\x0f\xffw\x07\x02&\x86\xf8\xcb\xfe\x9b\x0ecvw\x8en\x97\x11\xa4\x16lB\x0fH\xf9\x83\x1fa)\x01\xef' \
b'\x0f\x83\xe0\xee\xebQ"<\x0c\xc6*\x10Vq\t\xab\xec\x85\xf4{' \
b'\x95\xdc\xa6]\xc0;\x95\x9ap01\x0e\x04p\x10\x01\x07\x81p\x94\x0b\x94\x8a_m\xb6\x8c\xce\xc8\x00' \
b'\xce\xae\xc7/\xf1\xa1\x06dZ\x8a\xa72\xf0sP\xf9\xafo\xa5\xae\xd7\x98\xd1\x03B7\r\xc1\xce_F\xab' \
b'\x82Hdj\x86\x1b"%\x1c\xce\x8c\x04\x80\x84\x0b\x0c\x01\xd1 ' \
b'bo%\xc6\x93\x83CH>x\x19\xbdZ\xc1\x1c\x02\x0f\x1dZ@\x92)\xfe,' \
b'\x08\xcb\x02W\x04\x00\x03/\x12\xe3&v\xb0\\\xf5\xee\xa03\xffd\x8a\xa7\x01\xf8<\x13>G\xc0\x0e:}{' \
b'\xf1\xc5\xc0sN\x04\xd3{2\xf4\xbc\x97\xf6\xb5\xd0&\x94\x80\x8c\xbc\xc2]D\x14\xe8K\x84\xd7\xc0X' \
b'\x06\xc2-\xf9,\x1e\x02\x88\xc3:\xc0\xc7\x9d\xc5c\x06w\xc2\t ' \
b'|\x01\xc0q\x01/\xc2|\xc5aL\xe9\xce\xd13a\xd5Gg^\xa1\x03$\x99\xe6y\x18^K\x15\xd4\xf5,' \
b'\x1c\xcc\xcb/\xa0\xa5A\x05\xd4\x19\xc7-\x16\xd1\xd4\x88/\x13\xe3B\x10v\xd2\xe9{' \
b'k\xbe\x18x\x1d\x0e\x8e\xb7\x17\xd0\xc3A\xc4\xabd\x8cP\x01\x92H\xb1{' \
b'\xd7\xf8R\x10\x82\x947\x171.\xb5\x1bqK-\xbc\xef?"\xc3;\xeeP\xc2\xd7\x01\x9c\x03`G\xbf5,' \
b'\x7f}\xb7\xf0\x89\xfc|\xba\xdf\xefX\x95\xf4\x1f\x1a@\x92)^\x0cBG\x00b\xacfF\xcei\xc0\x92\x9e\x0c' \
b'\r\x05\x10/\xd0\x10\xe5\x0f\xa9%\\\x00\xe0\xab~\xbf\x05s?*\x12aF~>u\x07\xda\xc9\x00\x83\x85\x02' \
b'\x90D\x9aS\x04d\xfd\xec\xf7\xc8z\xa3\xcb\x9b^\xc77\xef\xb9\x96\xd6\xf8\x19+\x0c\xbe\xa7gxOg\x08W' \
b'\x81\xf09_\xf3a\xbc]r0\xa9g!\xfd\xd1\xd78\x15r^q@\x92s\xf94X\xb8\xd9\xd7\xfe3\xee,' \
b'5\xe0\xacz\xfc*\xec\xae>`.\xaft\xde\xdf7\x8d\x19\xffB\x03>\x9c\xcfP\xc1\xb7\x18\x15r\\Q@\xda\xe6' \
b'\xf11\x96\x83\xbbA\x88\xf8\xd4\xff\x02;\x98m/\xa0\x07|\xf2_\x15n\xddo*V\t\xe7\x801\x8f\x08\xef' \
b'\xf0)\xe9\xd5\x91\x08\x0e\xbf/C\xaf\xf8\xe4\xbf"n+\x06H2\xcd\x873\xf0\x80_\x1f\xbf\xdc]sc\xde' \
b'\xc0\xb9\xf5\xf0s\xca\xeb\xcc\x992\x97\xf7j ,' \
b'\'\xc2\x87\xbd\xda\x88\xb4sW\x03\xbf\xd1\x80#Vf\xa8_\xc4.\xccm+\x02\xc8\x94\x14Ol\x04~\xe7\xcbkI' \
b'\xc6\xdb\x8e\x85\xd3\xbb\xe7\xd3O*!\xfc\xac\xc1\xbeC\xc1N\x89J\xd1\xd7\x07c\xd17n\xa1]\xdf\xacD' \
b'\x1e\xdb\x8a\x99H\xf3wh\xf8m\x97\xf6\x8b\x81\xbc\x9d%\xf7\x83fM\\\x81\x032\xb2\x84\xe2q\xa0\xbc' \
b'\xeeH\xeb\xc5\xc0\xe3p\xf0\t{' \
b'\x01\xfdU\xabc\x01g\x1d\xfd\xbd\x8f\x81\xe8\xb0\xd1&\x8c\xf2"\xc6\x17\x18X\xed\xd6\xdd%\x8b' \
b'\xffPjj~p\t\xedQ\xb1e\x1b\x89y|\x029\xb8\xc9\x97?R\xc0%\xf9,' \
b'\xcd\x17\x90-\xb4M\x03\x07$\x91\xe6ki\xf8\x15\xa4\xeekQ>K_\xd6\xedT\xd4\xdf\x96\x00\xd9\x86\x0f' \
b'\xb7`\xf5\xc3 z\xc8\x19\x83;o\xa0\x96\x97E\xe3\xa9\xb4wK"9\x0e~\xe6\xd3B\xd0)\xf9,' \
b'=\xa8\x92_\x18l\x03\x05\xa4-\xc5\'Z\x84\x9f\xea\xee8\xbb\x1f\xfcr\x94\xd1\xedW\xc6\x9f ' \
b'\x1b\x87`<\xc1\x16VXLw-\x8e\xb5\xf4\xc8\xc4\x17\xb5\x99\x9a\xe1\x1d\xac\x12\xee%\xe0\xa3\xa2\xb6' \
b'\xdbj\xcf\xc0\xcb\xd6 \x0eX\xf1MzC\xa7\xdf\xa0}\x05\x06\x88\xfb^\xbe4\x84\xa7u\xbeEa\x06\x83p' \
b'\x86\x9d\xa5\xc5A\x0b\xb7\xb5x\xed\xfd\xbd+\x89\xe8\x83\x1a\xf2q\xef.\x8b\xd7F\x9d\xc57\xd1\xbe' \
b'\xbe\xbe\x19rk\x14\xef>\x84\xbb\xdc\x8f~\x1a\xf2^\xef\x82\x19\xbf\xb0st\xbcN\x9fA\xfb\n\x04\x90' \
b'\x93N\xe2\xc8k\x07\xe0\x11\x00\x87\xeb\xea`yk(\xe1d{' \
b'>\xdd\xa1\xcb\xa7\x0e?Jw\x90\xad%\xc0|;\x08?\xe8\x8c\xb5\xe6u\xe4\xb8%\x1f\xee\x18\xfd\xeb\x00' \
b'\xdcL\xc0\xe7u\xc6p\x18\xe7u\xe7\xe8;:}\x06\xe9+\x10@\x92i^\x00\xe0b\x9d\x1ds\x08\xc7v\xcf\xa7_' \
b'\xea\xf4\xa9\xc3\x97\xc6;\xc8\xe6\xe90\xaf$X\xdf\x1a\x1f\xdbgY\x86\xfc9\xf2 ' \
b'\x99\xe2\xeb@\xd0\xfb,' \
b'W\xc2\xfb\xf3\x0b\xe9\t\x1d\xfa\x06\xed\xc3w@\x92\x19\xde\x0fC\xe5\xddw\xba>\x06:\x0e\xe1\xc4' \
b'\xee\xf9tw\xd0by\x89\xe7\xcb\x1dd\xb3\xc0\xbc\x9a\xc9\xba\xac+\xdar\x9d\x97\x9cD\xdb$R|\xab' \
b'\xd6RJ\x8c\xc7\xf29\xd2\xf6\xebA\xb4?*\xed\xfd\x07$\xcd\xee\x92\xe8#U\x92\xdc\xc8\xd6\xc1\xac' \
b'\xfc\x02\xbaQ\x9b?\xcd\x8e|\xbd\x83l\x92+\x83\xffBLs;c-\xcbA\x1a\xf7\xafd\xd8J\x0c\xe1\x1e\x9d' \
b'\xcf$\x0c|\xc5\xce\x92/@k\x1e\xc2\x8d\xdc\xf9\n\x88\xbb\xf1\x89\x80\xeb5v\xe0\xec|\x96\xae\xd1' \
b'\xe8O\xbb\xab`\xee \x9b\x92\xc2+At^g,' \
b'\xaemI\x8d\xbb)k\xcdN\xb0ixo\xbc\xf2\xe5\xee!\xa1!\xec\x9b\xbf\x8c\xfe\xa5\xec,' \
b'@\x07\xbe\x01\x92\xbc\x88w\xe5\x08\xfe\xa2\xb1\xb0\xdb\xc2|\x96\xdcc\x0cB}\x05y\x07\x19-\x04\xbb' \
b';\x85\x19?h\x88E\xbf\xb1\x88\xf6\xd4\xb2\xd4cd\x8f\xc9C\xba\x8e\xa3c\xc6Mv\x8e\xbe\x18\xea\x01' \
b'\xdc$9\xff\x00I\xf1\r \x9c\xaeC\x0c\xb7~\xac\x9d%\xb7xA\xe8\xafJ\x01\xb2N\x18\x06\n\x88\xf0\xe7' \
b'\xba\x9aZ\x1f\xd3!Vb.O\x00\xe1I\x8d\xaf\xe7\x8f\xcag\xc9}\xa3Y\x15\x97/\x80L\x9d\xcb\x93"\x16' \
b'\xb4|Ee\xc6?\xd6\x96\xf0\xbej\xa9\xa6\xd1^,' \
b'\xfc\x08\x18YZ\xce<\x96\x08\x07\x00\x14x\x81\x05\x80.\xe9\x8c\xb5hY\xee\xa1\xb3\x80\x063\x9e' \
b'\xb1st@U\xd0\x01\x9f*+&R\xfckM\xbf]\x1dv0\xb9\xda\xf7>\xcf\xe9\x7fq|\x89\x86\xf6#r\xde\x0b\x07' \
b'\xfbcxo\xc6d\x82\xbf\x87\x862\xf8\xb6\xaeX\xab{' \
b'\x16\xa3\xf2\xa5\xf3\xf5/3\xda\xed\x1c-QN*\x00\x07\xda\xef #\xe5A\xb5<,\x86i\t\x89\x1fc1{' \
b'\xa0\xef\x18\xcb\xe1\x13\x01|\xca\xbf\xea\x8a\xfc\xebb\xb4\xe1\x84[i\x82{' \
b'\xc2\x94\xf4U~h\x1f\x87\x95\xe5\xa2v\xea\xd7\xb3\xf9l\xf9\xce\x1a\xda\xca1\xeb\xba\xe8\x07 ' \
b'\xf7\x028FUCf<l\xe7H\xeb\xfa \xd5\x9c\xfc\xb4o\x1f(\xcc ' \
b'\x07s@8I\x7f\x1c~\xae\x04k\xfa\r\xb1\x16\xa5zVn\x95K\x8b\xf0\xb4\x8e\xfc\x1c\xe0s\xddY\xfa?\x1d' \
b'\xbe\xfc\xf4\xa1\x15\x90ii\xfe\x00\x03Je8\xdd\xce\x96\x8b\x01DpP=\x1ee|&\xbf\xb2\xc3\xc0\xc0' \
b'\x7fN!\xf0\xe9\x80\xbe?\x10\x0c~\xc1\x815E\x15\x92d\x8a\xe7\x83\x90V\x9d\x94\xee\xe6*;G\xefS\xf5' \
b'\xe3\xb7\xbdV@\x92)\xbe\x03\x84O\xaa&\xcd\x8co\xda9\xbaP\xd5O\xb5\xdb\xcf\x1a\xe8\x9dh1.&\x90{' \
b'B\xaf\xf2\xe5\xeeKa\x1e3eI\xf3{' \
b'^\x90u\xe6.l\xdcc\x08\xcf\x81\xb0\x97\xac\x8f\xf5v\x8c\x13\xf29\xfa\xb9\xb2\x1f\x1f\x1dh\x03$y' \
b'\x11\x1f\xc8\x11<\xa5Z\r\xd1-\xfb\xe9D0\xd1\x9c\xed\xbda\xd4;\xd6\xac>\x98Kk/\'\xd2\xb22\xb6\x8f' \
b'\xb8i\xca\xe2\xe6\xf1\xd2\xc7\x1a$S|,\x08\xf7(' \
b'\xcf\xcb*X\x82\xa2\x0f\x904\xbb\xcb?\x94?\x029\x8cOt\xe7\xe8g\xca\xe2\xd7\xa0\x83\x8e\x81\xbec' \
b'\xd9q\x16\x13\xd1{T\xba\xc7\xc0\xd3\xd1\xe8\x0e\x87\xff\x80v\xfb\x8f\xac\x9fD\x8a\x7fB\x84O\xcb' \
b'\xda\x8f\xb2\x0b\xf5\xc6*-\x80\xb8\x9bn"%\xbc\xa5*\x163\xee\xb3s\xa4\xfc\x80\xaf\x9aG\x98\xedg' \
b'\xf2\xcbc\x1b\x8b\xfd\x0b\x89\xca\xbb2-\xe9\\\x19wu6\xc7\xdd7hR\x97[' \
b'\x00\xa2\xd1\x82\xfa\xc1\x9f\x8c\xce|\x8e\xe6H%\x11\x80\x91\x16@\x12sy&Y\xf8\xb1j\xbe\xa5\x12>P' \
b'\xab\x05\xc8T\xb5\xd9\xd4\xbe\xfc\xd6\x8b\xf9\'J\x1f!\x89\xce\xe9\x8c\xb6\\-\x9b[' \
b'2\xcd\xdf\x07p\xa6\xac\xbdk\xc7\x8c\xb7\x9c\x06\xec\x12\xd6*\x97Z\x00I\xa6Y\xf9\xd5.\x03\xf7' \
b'\xd8Y\xfa\x98\x8a\xd8\xf5f;g\xcd\xf3\xefe\xa7t/@{' \
b'\xcb\xf5\x9d\x87\x9cH\xe4\x88%M\xfbH\xbdy\x9c\x9a\xe1\xdd\xad\x12^P=\x97\xdea|&\xac\xa7X)\x032' \
b'\xf9"~WS\x04/\xa9\xee\xf70w\x0f\xb9)>\x93\x9f\xdb\xad\xb1Hw\x13\xd1\x87\xe4<\xf0\xea\xceX\xab' \
b'\xf4\xf9\xf2\x894_O\x80\xd2O$\x06\xee\xb0\xb3\xa4\xe3yFN\x82mX)\x03\x92L\xf1\xd9 ' \
b'|W)3\xc6\x8a|\x8e\xa6+\xf9\xa8c\xe33\xf8\xef\xcdC\x03\xc5\x9f\x13\xa8MF\x06\x06\xb2]\xb1\xb8{' \
b'\xec\x84\xf05R\x19\xa5W\xe5.\xc2\x8c\xb5#?\xb3\xa4_\x1a\x08\'\xee\xd1@\x1d\x904?\xaaa\xafy\xa8' \
b'\xdfdx\xd4\xb2\xa2\xcd\xa627\xb4\x16\x0bKA2\x7f\x89y\x8d\xc3\xd1\x89\xb2\xdfG\x92:\xde`2\xe6' \
b'\xe4s\xd4YQ\x11\xb7\x10\\\t\x90r\x85D\xc2\xb3\x8a\x9dz6\x9f%\xff\n++&WU\xe6\xcc\xd41P\xb8\x1f' \
b'\xa0\xa4p\xde\xccwv6\xb7~J\xd8\x0e@[' \
b'\x9a?j\xc1=\x95K\xfeb\x86m\xe7$\xf2\x96\x0f\xe9\xc9R\t\x90D\x9a\xcf!@\xa9b\x85\xc3\x98\xd7\x9d#_' \
b'\x8f>\xf0\xa4D\x8d4:\x95\xff\xbast\xa0\xf4{' \
b'\x02\xf6\x11\xed\x12\xc3Jt\xc5\xf6\x91:\xeb#\x99\xe2\xd5*_\xd7\xdd\xe5E\rE\x8c\x0b\xdbI\xbaJ' \
b'\x80$S|\x17\x08\x1f\x17\x1d\x88\xd1\xed\xd9\xc1x{' \
b'\x01\xfdM\xc5\x87\xb1\xddX\x81/\r\xf4\xee\xe70VJ\xbc\x02~\xa03\x16?ZF\xcfD\x9a/#@iy\x90\xc38\xbe' \
b';G\xbf\x90\x89\xef\x97\x8d4 ' \
b'\xe5ZW\xfb\xe3\r\x95#\x9a\xebm\xc5\xae_\x83\xb8%\xbf\x1d\x03\xbdg\x82\xc9\xfdN!tq\x04\x87v5\xc5' \
b'\xdd\xda\xc9B\x97\xbb\xd4\x08\r\xf8\x93\x90\xd1\xe6\x8d\xaf\xcag\xc9=F.4\x974 ' \
b'\x89\xb9|\x14Y\xf8\xb5JO\x98q\xa6\x9d\xa3\x1f\xaa\xf80\xb6[' \
b'W\xa0\xa3\xbf\xf08\x08\x87\x08j\xb4\xb43\x16\x97*\x1e\x97H\xf1\xe3$\x1eo}zn\xf1q;K\x87\n\xe6' \
b'\xebksi@\xdaR\x9c\xb6\x08J[' \
b':\xfb#\xd8\xf5\x91\x0c\xbd\xe6k\x0f\xeb\xd8y\xfb`\xef\x87\xa8D\xbf\x13\x94\xc0Y\x1bm\xdc\xfb\xc7' \
b'\xb4\x97\xf0\xcf\xdeD\x9a/$\xe02\xc1x\x1b7\x1f\xc2;\xc3T\xf9D\x1a\x90D\x8a\x7fE\x84)\nb\xfc.\x9f' \
b'%_\x0erQ\xc8\xa9\xe6L\xdb\x8b\x85\x1bIp\x11)\x13\xbe\xd5\x15\x8d\x7fCT\x8c\xb64\x1ff\x01J\xc5' \
b'"\xd8\xc1\xc9\xf6\x02Z&\x1a\xdb\xaf\xf6R\x80\x94\x8b\x1d\x97\xf0\xb6\xd2\xc7!\xe0r;K\x17\xf9' \
b'\xd51\xe3wX\x81\x8e\x81\x17\xf6\x05\xaf}Fpac_g,' \
b'\x1e\x17\xd7\x90)\x99\xc6?\x01\xec"n;b\xc1\xf8Q>G\xff%m\xaf\xd9P\n\x90d\x9a\xddJ\x89J\x87\xc8' \
b';\x84i\xdd\xf3\xc9\xb7b\xcc\x9au\xaajw\x1d\xc5\xc2M\x00\xbe ' \
b'\xd2\t\xcb\x8a\x1c|\xfd\x98\t\xc2\x0f\xdd\xaa\xcb\xe0\x19Xige\x97\xcd\x88\xf4\xd0[[' \
b')@\x12i\x9eE\x80|U\n\xc6\x9a\x97\x1a\xb0\xe3\xaa\x0c\rzK\xd3\xb4RQ@\xe6.\xc2\xc0\xdc\xaeX|\xa1h' \
b'\xdcd\x9a\xdd\xd5\xbd\xc2o\xcf\xd6\xc7a\xac\xc9\xe7(' \
b'*\x1a\xd7\xaf\xf6R\x80$S\xbc\x10\x04\xe9\x9fG\xb5v\x8e\x9d_\x83\xa3\xd3o{' \
b'\xb1\xd0C\x80\xe7o\x1c\xcc\xf8mWs\xfc#\xa29L\xcd\xf0\x01\x91\x12\xfe,j7\xba\xfd`\t{' \
b'>\xb8\x90^R\xf1\xa1\xcbV\x0e\x904/\x07\xf0\x19\xd9$j\xbd\x9c\x8f\xac.~\xda\xb5\xf7\xf7\x9eGD\xdf' \
b'\x16\x89AQ\xec\xbe\x98\xe2\xff\x10\xb1q\xdb&\xd3\xec\xd6\xdf\x95~\x0ea\x07G\x87\xe5\xe8n)@\x12i' \
b'~J\xb1>\xd2)\xf9,\xfd\xaf\xa8\xf0\xa6\xbd\xbc\x02\xb3\x8a}\xfbD\xc0}B\x1e\x08\'vF\xe3w\t\xd9' \
b'\x00H\xa4\xf9!\x95#\xdd\x98q\x86\x9d#\x9dE\xcfE\xbb\xb0\xbe\xbd\x14 ' \
b'\xc9\x14\x0f\x800F6\xaa\xd9\xfb!\xab\x9c\x9a]{' \
b'\xb1\xf04\xad+\x8b\xea\xcdU\xba3\x16\xcfyk\xba\xa1U2\xcd\xee\xaa\xdcvQ\xbbu\xed\x19\xb8\xd2\xce' \
b'\xd2\xff\xc8\xda\xeb\xb4\x13\x06dJ\x8a[' \
b'\x1a\t\x05\x95$^\x8a`\x8cy@WQP\xce\xb6\xa3\xbfp-\x86\xf7\xb2{\xbb\x18\xcb:\x9b\xe3\'{k\xbc\x11 ' \
b'\xee7\x94o\x8a\xda\x8d\x02\xe4.;K\xd2\xfb\xe5e\xe3n\xc9N\x18\x90D\x8ag\x10A\xfa\xe83\xb76\x93' \
b'\x9d\xa5\x16\x9d\x9d0\xbe\xbc)0\xbb\xd8;\xdb\x02uyk]n\xf5lg,.\xbc\x15A\xf94c\xc6\x9f\xf39:P ' \
b'O\xdf\x9a\x8a\x032\x97O!\x0b\xb7*d\xf4\xcb|\x96\x8eU\xb07\xa6\x92\n\xcc\x1a\xec;4R\xe2?\x88\x98G' \
b'\xa2-M\x8b\x88\xd6\x8a\xd8\xa8\x96(' \
b'e\xc6\xbf\xed\x1cI?\xe4\x8b\xe4\xba\xbd\xb6\xe2\x80\xa4x6\x11D\xfe\nm\x94\x03\x03\xd7\xd9Y\xfa' \
b'\xca\xf6\x123\xff\xdf\x1f\x05:\x8a\x05\xa1\x82\xd1%\x8b\x0f\xb9aL\xeb\x93\xa2\xd9$\xd3,' \
b'\x14gS\xff\xf9,\t\xcfM\xd1\x1c\xbd\xb4\x17N"\x91\xe6\xaf\x12p\xad\x17\xe7[' \
b'j\xc3\x8c\xef\xd89:O\xd6\xde\xd8\xa9) ' \
b'\xba\xc2\xd7\xdd\xe7\xbe8\xd6\xd2#\x1a5\x91\xe6\xb7\x08\x90>\x17\xa5\x14\xc1\xce=\x19z]4\xae\xee' \
b'\xf6\xc2\x80$\xd3\xac\xf4\x00\x06\xa0*\x8eR\xd3-tX\xfcu\x14\x0b\xf7\x01\xf0\\ ' \
b'\x83-\xeb\xd3]c\xf6\x11>\x8b>\x99\xe6\xbf\x02\x90,' \
b'G\x04\xace\xc4\x1f\xc8\x91\xd8ki\x1fD\x16\x06$\x91\xe2\x0c\x11.\x91\xcd\x85\x81\xb4\x9d%\xe1W' \
b'\x87\xb2\xf1\x8c\xdd\xc6\n\xb4\x17{o%\xd0)^ua`NW,.\\L!\x99\xe2?\x80 ' \
b'\xbd\xb7\x83K8\xcc^HR\xf5\xba\xbc\xf6\xcdK;a@\x92)\xbe\x02\x04\xf9w\xd4\x8c\xf3\xf39\xb1/\xba' \
b'\x9bvdV\xb109\x02\x1c\xbd6\xda\xb8Df\xdf\x82\x17aj\xb5M{' \
b'\x7f\xe1j"|\xcdk\xff\x98q~Ws\\\xe8\x0b\xbc\xeb;\x91\xe2<\x11\xa4\xcf\x95\x0c\xcbbVa@\xdaR\xfc' \
b'=\x8b\xf0\xdf^\x05\xde\xac\x1d\xe3\xab\xf9\x9c\xf8V\xd0\xd1~:\x8a\xbd\xd7\x01\xf4e\x00\x0e\x03' \
b'+\x88iIsl\xe8\x8eki\xe2\x1a\xe9\xbc\xea\xc4\xb0\xa3\xd87\x0f\xe0K\xbdv\x97\x81\x85]\xb1\xb8\xf0' \
b'\xe9\xc2I\xc5\xe5H`\x9c\x94\xcf\x91\xbb\xa4\xa9\xa2\x970 ' \
b'\xaag\xd59\xc0\x97\xbb\xb3\xb4H\xa5\xd7\xed\xfd\x85\x97\x88\xb0\xfbh\x1f\x0c~\x93\x98nF\x03n' \
b'\xecl\x8a\xbb\xb5\xba\xcc\xb5\x05\x05f\x0f\xf6\x1dA%\xe78\xcf\xe2P\xe4\xb7]\xd1}\x84\x8f:H\xa6x1' \
b'\x08\x1d\x9e\xe3l\xda0$u\xb2\xc4\x01I\xb3{' \
b'\xbbUy\x0b\xf5\xf5|\x96\xae\x92\x15n\xd6\x9a\xde\xf7E\x1czb[' \
b'\xf6\x0c^\x05\xa6\xae\x86X\xf4\xc6E\xb4\xa7\xbb\x81\xc7\\\x01+\x90H\xf1""|I6\xac\x8e?\xa4\xb2' \
b'\xb1G\xdb\t\x03\xa2\xfc\x90\xce\xc8\xd89\xf2|\x8b\xdf\xb4\x93\x1d\xc5\xc2L\xc0{' \
b'%y\x06n\xe9\x8a\xc5\x856\x0b\xe9\x10\xb6\xde}\xd4- ' \
b'\xc9\x14\x7f\x1d\x84+e\'\x003\xbem\xe7\xe8|Y\xfb\xf6\x81\xc2\x95\xc4\x10)\rs\x7fg,' \
b'>C6\x9e\xb1\x93S\xa0n\x01iK\xf3\x19\x16\xf0#9\xd9\xcaV\x8b\xf2\xd9\xf2\x03\xb6\xd4\xd5\xd1_\xb8' \
b'\x13\x84Ox5f\xc67\xba\x9a\xe3\xdf\xf2\xda\xde\xb4\xd3\xa3@\xdd\x02\x92P\\\x8b\xc5\xc0\xadv\x96N' \
b'\x93\x1d\x86\xf6bo\x9e@\x9e_\x1f\x92\xc5\x9fY<\xa6\xf5v\xd9x\xc6NN\x81\xba\x05\xa4m\x1e\x1fo1' \
b'\xa4O&e@i)s{\x7f\xe17D8\xc2\xf3\xb0qdRg\xf3\x04\xa5\x02w\x9ec\x99\x86\xeb\x15H\xa6\xd9\xfd\x95q' \
b'\x86\xac$a\xd94%\xfc\x90\xde\x96\xe6\xa3-@xm\xce:\xa1T\xcf\xc7\xee\xe8/\x08}\xa1%\xa6#\x177\xb7' \
b'\xfcFv\xa0\x8c\x9d\x9c\x02u{' \
b'\x07\xd1Q\x83Ue\xa5\xa6h\xf1\x01\x10\x1d\xd7\x19mq\x8f\x883W\x80\n\xd4\xed\x1d\xa4|\x90|\tj_\xac' \
b'#h\xcdgHjWb{\x7fa9\x91\xf7\x82\x11\x0e\xf1\x99K\xa2\xad\xa6\xfeo\x80p\xb8\xa1\xea\xf6\x0e2\xd2' \
b'\xf9\xe7\x89 }\xae\x1d\x13>f\xcf\'\xe1\xaf\xb3n\xec\xf6b\xef\x0f\t\xde+\xef1p}W,' \
b'.\xfd[8\xe0yU3\xe1\xea\x1d\x90_\x12A\xfa\xdb\x02\x03\xe7\xdaY\x92:\xd7\xb0}\xa0\xf7\x1cb\x129' \
b'\xb4Gj\xdbh\xcd\xcc\xd4\nu\xa4\xde\x01\xb9\x86\x08gIk\xafP\x7fuv\xf1\xf9\x84\x05G\xa8d)S\xa4\xb5' \
b'+:A\xea\'\x9dt\x1f\xeb\xdc\xb0n\x9fAF~b\x9dE\x84kd\xe7\x00\x03\x7f\xb2\xb3t\xb0\x8c\xbd{' \
b'\xc4Xl\xa0$vd\x02\xd3\x05\x9d\xcd-W\xc8\xc436r\n\xd4\xf5\x1d\xa4m\x1e\x1fc1\xd4\xde\x0c\x95\xb0{' \
b'~!\tW\xeds\x87\xab\xa3Xp\xab\x95\xef\xe7u\xe8\x98\xf1xWs\\z\xf3\x8e\xd78\xa6\xdd\x06\x05\xea\x1a' \
b'\x10\x1d\xb5\xb1\xd8\xc1\xa9\xf6\x02\xbaMfR\xb5\x0f\x14\xae ' \
b'\x16\xdb\xb4\xe5\xc0J.\x89\xedc\xcb\xc436\xe2\n\xd45 ' \
b'\xae\\\xaa\xf5W\xc1\xe8\xcc\xe7h\x8e\xb8\xf4\xc0\x9c\xfe\xbe\x8f0\xf1#"\xb6\xb2\xc5\x98Eb\x98' \
b'\xb6\xe6\x0e\xb2^\x81D\x9a\x97\x12 \\uo\x9d\x03\xd5\x02r\xed\xfd\x85\xbf\x11aO\x91I)[' \
b'\x80@$\x86i;\xac@\xdd\xdfA4\xac\xeaE)\x82\x89=\x19zNfR\xb5\xf7\xf7^HDB\xe7\xe11\xf3\xdf\xd6\xc6' \
b'\xc6\xee\x7f\x13\xed\xfe\xb6LLc\xe3]\x81\xba\x07dj\x86\xf7\x8d\x94\xf0\x17\xef\x92m\xde\xd2a\xcc' \
b'\xeb\xceQV\xc6\xc7\xf0\xdb\xac\xa1\x97\x00\x12*\xa2m>\x1c\xca\xa8-nS\xf7\x80\x94o\xa3i~\x89\xb0' \
b'\xf1\xdep\x11)\x19x\xce\xce\xd2D\x11\x9b\xd1m;\x8a\xbd?\x00\xc4\xab42\xe1\x98\xaeh\xdc\xad\x0fe' \
b'.\x9f\x140\x80\x0c\xff\xce\xec"\xc2l\x15\x8d\x1d\xe0C\xddYZ)\xe3\xe3\x8b\xfc\xc2{' \
b'\x1a\x07\x06\xfb\x00j\x14\xb2g\xbcFhz\xff\xe2\xe6\xf1/\n\xd9\x99\xc6\x9e\x150\x80\x0c\xbf\xc9r' \
b'\xf7z\xbb\x07DJ_\xaa\xa5H%\xb6\xe0\x96se\xf0SN\xd4:\xfc\x06j\x19\x90N\xbe\x8a\x0c\xa7f\xb8' \
b'|\xee_O\x86\x02\xe9\xaf\x01\x04\xc0\xd4\x0c\xbf3R\xc2\xab*\xf3\x84\x81\x97\xed,' \
b'\xed!\xeb\xa3\x83_\xd8\x85\x07\x06\xfb\x08\xb4\xa3\xb0\x0f\xc6]\x9d\xcd\xf1P\x9cC!\x9c\xbb\x80' \
b'\xc1\x8c\xf3y\xecP\x0cw\x10\xa3\xd4\xf4\x06>y\xcf\xb5\xa4\xb6\x1a\xdbC\xec\xba^j2Z\x9fD\x9a\x7fA' \
b'\x80\xf7:K[\x10\x97\t\'\xda\xf3I\xf8\xa8\xafu\xaef\x0f\xf4}\xcdb\xbe\xda\xc3\xb8m\xdeD\xf2\x90' \
b'\x18\xa9X\x150*\xc3\x11\xc5}D8j\xe4\xd6yo\x10\x90\x18@F\x06;9\x97O\x83\x85\x9bU\xc6\x9e\x19\xbf' \
b'\xb7st\x98\x8a\x8f\x8eb\xefC\x00}T\xc6\x07\x83o\xeb\x8a\xb5\x9e*c\x1bf\x9b\xcd\xe0X\x97,' \
b'\xc3wH\xccO\xac\x11\xb1\x8f<\x97c\xb1\xb1\xf8\x17\x11b*\x93\x85\x19\xc7\xd89\x92~\xb34\xb3\xbfw' \
b'\xefF"\xf7\x0c>\xb9<\x98W\x96b\xd6\xc7o\xa0\x96\x97U\xfa\x11\x16\xdb\xad\xc21\n\x92]\x9e\xc1\xc7' \
b'\x97-\xa3\x92\x1f9\xbb\xe5\xa1\x98p\x82\xacob\\\x99\xcf\x91t\xed\x03\xd9\xb8\x9b\xda\t\xefI\xdfR' \
b'\xe0d\x8ao\x06A\xbaR\x89\xeb\x93\x19\x0f\xdb9\xb9;\x80\x96\x9fZ\xc3I\xfc\xd3!\xeb\xb3Kb-\xbf\xd2' \
b'%p%\xfcl\x17\x8e\r\x90,' \
b'\xdf\xe5\x19|\xde/H*\xd1w\xdd1\xb5\x00\x92\x98\xc7\xc7\x11\xe3\x17\xaa\xc9\x11\xa3mE\x8e\xa4' \
b'\x0bB\xb8\xf1\xdb\xfb{\x7fND\xc7\xcb\xe7\xc2C\x0eY__\x12m\x91^\xce/\x1f[' \
b'\xdd\xd23\x1c\x06\x12Obk\x01\xc4\x8d\x94H\xf1+Dx\x97\xa7\xa8[' \
b'o\xf4`>KST|\xcc\xe4\x97\xc76\x0e\xf4?F\xc0\x01*~\xc0x\x94#\xd6\xe5]M\x13\xee\x04\x91\xd2qbJy\x08' \
b'\x18\x0b\xc3a \xd9\xae\xba\xda\x00I\xaa\x17\xb5.\'\xab\xb2\x0c~]o\xdb\x07\xfe\x1a\'g\xe8\xf7 ' \
b'\xdai\xbb\nl\xb7\x01\xff\tL\x97v\xc6Z\x96\x87\x19\x14i8\x0c$\xdb\x9c\x01\xda\x00\x99|1\xef\xd1' \
b'\x18\xc1j\x02\x1a\xb6;\xe7\xb6\xd1\xc0\xfd.\xe2\x0c/b\xfc\x8f\x8a\x9f\x8ebo\x12\xa0\x15*>6\xb2e' \
b'\xfe\'\x13\xdd\x11\xc6\x02\x10\xcap\x18H\xb6:M\xb4\x01R\xfe\x99\x95\xe6\xeb\t\x90\xda\xe3\xb1I' \
b'\x86\xd7\xe4\xb3t\xb6\xea\xe4n\x1f\xe8\x9dF\xe5*\x90b\x0b\x1a\xb7\x16\x97\x19\x7f\xefj\x8e\xbfG5' \
b'/\x9d\xf6S3<\xce\x1a\xc2\xdd\xeb\xbfs\xa8:g\x98\x07\xf7Q\x1a\xea\x05d.O ' \
b'\x0bnq\x04Ki\x9c\x18\xa5\x92\x83C{\x16\xd2SJ~\x00\xcc.\xf6\x1dM\xe0{' \
b'\xa4_\xff\x8eJ\x80\x99\x1f\xebjn=\\5\']\xf6.\x1c\x91!t\xab\x9c\x05\xb8\xc5\\\x0c$\xebe\xd1\n\x88' \
b'\xebU\xc7+\xdf\xe1\x87\x11<\x96\xcf\x91\x96\xc98\xbb\xff\xf9\xa3\x08\x8e\xfbWv\x9c\xd2\xe4d\xfc' \
b'\xb4\xb39\xfeI%\x1f\x1a\x8d\xdd\x9fV\xa5(' \
b'\xee\x05a\x92F\xb7\xc3\xae\x0c$e\x19\xb4\x032%\xc5\x13\x1b\x80g\x88\xd4}3p\xb9\x9d\xa5\x8bt\x0c' \
b'~G\xb10\x01\xe0\x15\x00\xed+\xeb\x8f\xc1\xd7u\xc5Z\xbf"k\xef\x87\x9d\x81\xc4\x0fU7\xf8\xd4\x0e' \
b'\x88\xeb:\x91\xe6\xdb\t\xf8\x94j\xea\xccp_\xafN\xb3s\xa4\xa5\xd8B;\xbf\xfa\x0e\x0c\xbcu\x17' \
b'\x01GK\xe6\x96\xee\x8c\xc5Cw\x84\xf5\xc8C\xfa\x03D\xf8\xa0d\xbf\xb6nV\xe7w\x12_\x00\x99z1\x1f' \
b'\x1c\x89\xe0I\x1d\x83\xc5\x8cW\x9d\x06\x1c\xd2\x93!mK@\xda\x8b\x85\xf9\x04\xa4\xc5\xf3\xe3\x8e' \
b'\xceXk\x97\xb8\x9d\xff\x16\x93.\xe4\x9d\x9b\x1a\xb0\xc2@\xa2Wk_\x00)\xdfER|%\x91\xd0Qi\xdb\xfa' \
b'+\xf6P>G\x93uv}\xce\x9a\xc2!\xec\xf0\xad\x00\x1d\xe4\xd9o\xc8+\xc5\x1bH<\x8f\xa4\xe7\x86\xbe' \
b'\x01rX\x86\x9bw*\xe1\x19\x02\xc6{' \
b'\xcef\xdb\r\xaf\xc8g\xe9\x02M\xbe\xd6\xbbq\xcf\rg8\xe7\x13\xe8\x1d\xdb\xf3]\xb2\xf8\x90\x1b\xc6' \
b'\xb4j\xb93n/\x96\xec\xff7\x90\xc8*\xb7e;\xdf\x00q\xc3%S\xfcI\x10\xee\xd0\x98\xf2\xd9\xf9,' \
b'i_#5\x8b\xfb\xc6E\x06\xf8|\x06\x7fm[' \
b'\xa0D\xa2\xd1wU\xc3\xb1\xd2\x06\x12}3\xceW@F\x1e\xd8\x957Tm\xd4]\x07\xb3\xf2\x0b\xe8F}\x12l\xf0' \
b'\xf4E~q\xd7\xc6\xe2\xa0\xbb\xc7~&\x08\x87l\x1a\xa33\x16\xf7]/]\xfd2\x90\xe8Q\xd2\xf7\x01\x9f\x9a' \
b'\xe1\xf1\xd6\x10\x9eU\xdd/2\xaa\xbb\x8eC8\xb1{>\xdd\xadG\x82-{' \
b'\x99\xb3\xe6\xf9\xf7\xb2\xe3\xb8\x9b\xa8&1\xcag"\xfe\xa3+\x16o\xf13\xa6n\xdf\x06\x12uE}\x07\xc4M' \
b'\xb1-\xc5\xe7Z\x84\xab\xd4\xd3\xdd\xe0\xc1!\x1c\xdb=\x9f~\xa9\xd3\xe7\xb6|\x9d>\xb0\xba\xf5\xc6' \
b'\xe8\xde\xbdA\xc5\xd3\x15\xc7@\xa2\xa6d ' \
b'\x80\x8c\xfc\xd4ZA@R-\xdd\r\xd6\x0c\x0c\x81p\xb2=\x9ft>\xe3\xe8J/T~\x0c$\xf2\xc3\x11\x18 ' \
b'\xc9\x8bxWn\xc0S*\x85\xe66\xedf\xf9C"\xe1\x0c;K\x8b\xe5%\xa8\x0fK\x03\x89\xdc8\x07\x06H\xf9\xa7V' \
b'\x9a?j\x01\x0f(/f\xdc\xa4\xaf\x0c\xa4\xed,\x85\xee\x0b\xb7\xdc\x90\xf8ge ' \
b'\x11\xd76P@\xca?\xb5R\x9c!\xc2%\xe2\xa9n\xdb\x82\x81\xeb\xec\xacx\x19R\xddy\x84\xdd\x9f\x81Dl' \
b'\x84\x02\x07\x04`J\xa6\xf0\x80\x1f+P\x99\xf1\xe8\x10\xe3\xb3\x0f,' \
b'\xa0\x17\xc4d\xa8\xaf\xd6\x06\x12\xef\xe3]\x01@\x80\xe9\x19\xde\xd3)\xe1\x0f\x00v\xf3\x9e\xaa' \
b'\xe7\x96o:\x8c\x99\xdd9\xfa\x99g\x8b:lh \xf16\xe8\x15\x01d\xe4y\xe4 ' \
b'b<B\x84\xed.\xf1\xf0\xd6\x95\x8d[1\xf0\xdd\x97#\xb8`U\x86\x06e\xec\xeb\xc1\xc6@\xb2\xfdQ\xae\x18 ' \
b'\xa3\x1e\xda\xdd\xa5\xecM\xdbOU\xbc\x05sy_\xca\x97\xf2YzP\xdc\xba>,' \
b'\x0c$\xdb\x1e\xe7\x8a\x02R~h\x9f\xc7\'\x10\xe3N\xddo\xb66\xea6c\xa9\xd5\x80\xf3\xee\xcf\xd0\xdf' \
b'\xebc\xda\x8b\xf5\xd2@\xb2u\xbd*\x0e\xc8\xc8\x9d\xa4\xdd\x02:\xc5\x86U\xac5\x03\xff! [' \
b'\x8a\xe0\xaa\x9e\x0c\r\x89Y\xd7~k\x03\xc9\x96\xc78\x14\x80\xb8\xa9%\xd3|)\x80y\x01L\xc5\x02;\xc8' \
b'\xd8\x8d\xb8\x05\x19r\x02\x88W5!\x0c$\x9b\x0fUh\x00\t\x18\x12\xb7(' \
b'\xc1\x9f\x99q\x89\xbd\x00\xcb\x81\xea\xa8\x9c\x18\x04i\x06\x92\x8dU\x0e\x15 ' \
b'#\x90\x9c\t\xe0\xfbAL\x067\x063\x9e \xe0\x92|\x8e\xdc\xe7 s\xb9\xcb\x97\xcd\xf6\xdd\xf5\xf3 ' \
b't\x80\x8c<\xb8\x7f\n\x0e\x96\x12A\xec\xecA\xb5\xe9\xfd\n3\x96\x82q\xb3\xbd\x80\x1eUsU\xfd\xd6' \
b'\x06\x92\xe11\x0c% \xe5;\xc9<\x9e\x0e\x07w\x8006\xe8\xe9\xe6\x9e\xbe\x0b\xc6-\xe4\xe0\xf6\xfcBz' \
b'"\xe8\xf8a\x89g \t1 \xee$\x99z1\x1f\x1a\xb1\xb0\x02\x84]+8i^a\xc0\x06\xc3\xfd^c\xdb9\xaa\xba' \
b'=!*\xda\xf9\rI>\x87\x93\xc3\xfc\x0c\x18\xda;\xc8\xbaA\x9dv\t\xef\xed\x94p\x9b\xb6\xda\xb3*\xb3e' \
b'\xf8\x99\xe5o <J\xc0\x93p\xb0\x8a,' \
b'\xacZ\x91\xa5P\x17rP\xec\xb2\xbf\xcf$@W>\xeb\xd6s\x0e\xe7\x8b\x92\xd0\x03\xb2np\xdbR\x9c\xb6\x08' \
b'\xf3U\x07\xdb/{\xf7\xab=\x08\xee\xb9\xeb\xfd\xc4\xe8g\x0c\xff\xb3F\xfe\xebW\xdc\xd1~\x99\xf0\xf7' \
b'\xee,-\xf2#\x96\xafw\x92\x10CR5\x80\xb8\x83\xde\x96\xe6#,' \
b'\xc62\x10\xf6\xf2c\x12T\xbbO\x06V\xdaY\xfa\x90_\xfd\xa8GH\xaa\n\x10w\xe0\x8f\xc8\xf0\x8ecKp' \
b'\x8fY8\xd9\xaf\x89P\xad~\xfd\x06\xc4\xd5\xa5\xde ' \
b'\xa9:@\xd6\xff\xe4J\xf3\xa9\x16\xe3\x9a\n?\xc0\x87\x8a\xa5 ' \
b'\x00\xa97H\xaa\x16\x90u\x035\xa6\x01\xdf\x02\xa1#T3\xb5B\xc9\x04\x05H=AR\xd5\x80\xac\x9b\x87S' \
b'\xe7\xf2\xa4\x08\xa1\x0b\x84\x89\x15\x9a\x9b\xa1\x08\x1b$ ' \
b'\xf5\x02IM\x00\xe2\x0e\xd6\x81\x19n\xda\xa3\x84\xb9\x00.\xf4k\x7fI((' \
b'\xd8F\x12A\x03R\x0f\x90\xd4\x0c ' \
b'\xeb\xe6M2\xc3\xfb\xf1\x10RD\x98\x19\xf6\t\xad;\xbfJ\x00\xb2\x1e\x92F<\xac|\xf4\xf6\x96\x05\xa9' \
b'\xe8w\x92\x9a\x03d\x9d\xc6SR\xdc\xd2HH1cf\xc0k\xbat\xcf{' \
b'\xcf\xfe*\x05\x88\x9b`\xf2b~7G\xd0Sk\x90\xd4, ' \
b'\xeb\x9fO2<\x9e\x86p!\x11:\x08\x88z\x9emU\xd8\xb0\x92\x80\xd4*$5\x0f\xc8\xfa\x9f^\xc3\x7f\xe1' \
b'\xce!\xc6\xe9 \xecQ\x85\xf3\x7f\xbb)W\x1a\x90Z\x84\xa4n\x00\xd90\xbb\x98\x92iL\x02\xe34\x10N\x02' \
b'\xb0\xcbvg^\x954\x08\x03 ' \
b'\xb5\x06I\x1d\x02\xb2a\xb6\x1fv\x067\xee\xb4;\x8e%\x07\xa71p\xa2\xc6#\x1a*\x82TX\x00\xa9%H\xea' \
b'\x1a\x90\xd1\xb3\xf8\xc8s9\x16}\x07\xa6X\x8c\x19\xcc\x98A\x84\x83+2\xcb\x15\x82\x86\t\x90Z\x81' \
b'\xc4\x00\xb2\x95\t9#\xc3\xbb\xad-\xe1X\x02\xa6\x831\x9d\x08\xefV\x98\xbb\x81\x98\x86\r\x90Z\x80' \
b'\xc4\x00\xe2q\xea\xba\xc0\x0c\xaeE\x9c,' \
b'\xc4\x89\xd1B\x848\x03-`\xb8\xe7\xb2\x8d\x07!\xe2\xd1\x95o\xcd\xc2\x08H\xb5Cb\x00\xd14]\xddU' \
b'\xaec\xa2\xd8\x99\x071\x0e\x16\xc610\x0e\x84q\x160\x8e\xb9\\^\xd5w\xad\xfd\xdc\x0f\xa2*S\xb5' \
b'~\'\xf1}\xd0T\x855\xf6\xb5\xa3@5Bb\x00\xa9\x9d\xf9W\x15=\xa96H\x0c U1\xadj+\xc9j\x82\xc4\x00R[' \
b's\xafjzS-\x90\x18@\xaafJ\xd5^\xa2\xd5\x00\x89\x01\xa4\xf6\xe6]U\xf5(' \
b'\xec\x90\x18@\xaaj:\xd5f\xb2a\x86\xc4\x00R\x9bs\xae\xeaz\x15VH\x0c ' \
b'U7\x95j7\xe10Bb\x00\xa9\xdd\xf9V\x95=\x9b\x9a\xe1\xdd\xad!\xf4\x10a\x7f\xdd\x1d``\xb6\x9d\xa5' \
b'\x1bD\xfc\x1a@D\xd42m\x03Q\xc0\xa7;\xc9\x8f\xf3Y:]\xb4\x03\x06\x10Q\xc5L\xfb@\x14\xd0\t\t\x03' \
b'\xdf\xb3\xb3t\x96L\xe2\x06\x10\x19\xd5\x8cM ' \
b'\n\xe8\x80D\x05\x0e\xb7\x93\x06\x90@\x86\xda\x04\x91U@\x05\x12U8\x0c ' \
b'\xb2\xa3f\xec\x02U@\x06\x12\x1dp\x18@\x02\x1df\x13LE\x01\x11Ht\xc1a\x00Q\x191c\x1b\xb8\x02^ ' \
b'\xd1\t\x87\x01$\xf0!6\x01U\x15\xd8\x16$\xba\xe10\x80\xa8\x8e\x96\xb1\xaf\x88\x02[' \
b'\x82\xc4\x0f8\x0c \x15\x19^\x13T\x87\x02\xa3!\xf1\x0b\x0e\x03\x88\x8e\x912>*\xa6\x80\xbb,' \
b'\x85\x860\xbb;G\x97\xf9\x95\x84\xf9\x0e\xe2\x97\xb2\xc6oM(' \
b'`\x00\xa9\x89a4\x9d\xf0K\x01\x03\x88_\xca\x1a\xbf5\xa1\x80\x01\xa4&\x86\xd1t\xc2/\x05\x0c ' \
b'~)k\xfc\xd6\x84\x02\x06\x90\x9a\x18F\xd3\t\xbf\x140\x80\xf8\xa5\xac\xf1[' \
b'\x13\n\x18@jb\x18M\'\xfcR\xc0\x00\xe2\x97\xb2\xc6oM\x93\xd2\x92s\x00\x00\x00#IDAT(' \
b'`\x00\xa9\x89a4\x9d\xf0K\x01\x03\x88_\xca\x1a\xbf5\xa1\x80\x01\xa4&\x86\xd1t\xc2/\x05\xfe\x1f' \
b'\x96&n}\x8f\xba\xb4\xa5\x00\x00\x00\x00IEND\xaeB`\x82 '
self.set_theme()
self.log = self.welcome() # 有效记录
self.main = self.home()
self.task = None
self.file = None # 当前XLSX文件
self.page = None # 当前全部非正常页
self.pdf = None # 当前PDF文件
@staticmethod
def set_theme():
theme = {'BACKGROUND': '#fef6e4',
'TEXT': '#172c66',
'INPUT': '#f3d2c1',
'TEXT_INPUT': '#001858',
'SCROLL': '#f582ae',
'BUTTON': ('#232946', '#eebbc3'),
'PROGRESS': ('#8bd3dd', '#f582ae'),
'BORDER': 0,
'SLIDER_DEPTH': 0,
'PROGRESS_DEPTH': 0}
sg.theme_add_new('AC_Theme', theme)
sg.theme('AC_Theme')
def welcome(self):
layout = [[sg.Text('正在扫描检测记录......\n请稍等......', font=('微软雅黑', 12))], ]
gui = sg.Window(
f'异常页面检查辅助工具 {self.version}',
layout,
size=(345, 70),
text_justification='center',
element_justification='center',
icon=self.ICO,
finalize=True)
log = self.check_log()
gui.close()
return log
def run(self):
if not os.path.exists(ROOT):
os.mkdir(ROOT)
else:
self.main.find_element('status').update(
'程序异常,请尝试删除“img”文件夹后重新启动程序!', text_color="red")
self.main['-FILE-'].update(self.log)
while True:
event, values = self.main.read(timeout=100)
if event is None:
break
elif event == 'choice':
self.main['choice'].update(disabled=True)
self.main['check'].update(disabled=True)
tip = self.choice_deal()
if tip:
self.main['choice'].update(disabled=False)
self.main['check'].update(disabled=False)
self.main.find_element('status').update(tip)
continue
self.task = Process(target=self.pdf_to_image, args=(
self.pdf, self.page, values['low']), daemon=True)
self.task.start()
elif event == 'check':
self.main['choice'].update(disabled=True)
self.main['check'].update(disabled=True)
if not values['-FILE-']:
self.main['choice'].update(disabled=False)
self.main['check'].update(disabled=False)
self.main.find_element('status').update(
'请在上方选中文件后,再点击“检查文件”按钮!')
continue
self.pdf = values['-FILE-'][0]
self.file = self.pdf.replace('pdf', 'xlsx')
self.page = self.check_xlsx(self.file)
self.task = Process(target=self.pdf_to_image, args=(
self.pdf, self.page, values['low']), daemon=True)
self.task.start()
elif event == 'info':
webbrowser.open(
'https://github.com/JoeanAmiee/Private_office_tools')
if self.task:
sg.popup_animated(
sg.DEFAULT_BASE64_LOADING_GIF,
message='处理中',
text_color='black',
font=('黑体', 12),
icon=self.ICO,
background_color='white',
transparent_color='white',
time_between_frames=100)
self.task.join(timeout=0)
if not self.task.is_alive():
self.main['choice'].update(disabled=False)
self.main['check'].update(disabled=False)
sg.popup_animated(None)
self.start_check()
self.task = None
self.file = None
self.page = None
self.pdf = None
self.main.close()
if not os.listdir(ROOT):
os.rmdir(ROOT)
self.finished()
def home(self):
layout = [
[sg.Text('已检测且包含非正常页的文件(点击选中文件):', font=('微软雅黑', 12))],
[sg.Listbox(values=[], size=(80, 10), key='-FILE-', select_mode='LISTBOX_SELECT_MODE_SINGLE')],
[sg.Button('浏览文件', key='choice', font=('微软雅黑', 12), tooltip='选择 XLSX 格式的检测结果文件,并自动开始预览检查!'),
sg.Button('检查文件', key='check', font=('微软雅黑', 12), tooltip='开始预览检查选中的 PDF 文件!'),
sg.Button('查看工具详细说明', key='info', font=('微软雅黑', 12))],
[sg.Checkbox('低性能模式', font=('微软雅黑', 10), key='low', pad=((480, 0), (0, 0)),
tooltip='减少程序处理文件时占用的内存,但是会增加处理文件所用的时间\n建议低配置电脑或处理大文件时启用')],
[sg.StatusBar('准备就绪', key='status', font=('微软雅黑', 12), size=(10, 1))],
]
return sg.Window(
f'异常页面检查辅助工具 {self.version}',
layout,
text_justification='center',
element_justification='center',
icon=self.ICO,
finalize=True)
def check_gui(self):
layout = [
[sg.Frame('', [
[sg.Text('异常页:', font=('微软雅黑', 12)), ],
[sg.Listbox(values=[], size=(10, 35), key='-PAGE-', select_mode='LISTBOX_SELECT_MODE_SINGLE'), ],
], border_width=0, element_justification='center'),
sg.Frame('', [
[sg.Text('当前页:', font=('微软雅黑', 12)), sg.Text('', key='-NOW-', font=('微软雅黑', 12))],
[sg.Image('', key='-IMAGE-', size=(420, 590))],
], border_width=0, element_justification='center')],
[sg.Button('正常页', key='-TRUE-', font=('微软雅黑', 12), tooltip='标记当前页为正常页!'),
sg.Button('异常页', key='-FALSE-', font=('微软雅黑', 12), tooltip='标记当前页为异常页!'),
sg.Button('保存结果', key='-OVER-', font=('微软雅黑', 12), tooltip='保存检查结果至 XLSX 文件!')],
]
return sg.Window(
'预览检查',
layout,
text_justification='center',
element_justification='center',
icon=self.ICO,
finalize=True)
def start_check(self):
images = os.listdir(ROOT)
images.sort(key=lambda x: int(x[:-4]))
pages = [i.replace(".png", "") for i in images]
images = [os.path.join(ROOT, i) for i in images]
remove = []
def update(_gui, confirm=False):
nonlocal images, pages, remove
if confirm:
remove.append(_gui['-NOW-'].DisplayText)
os.remove(f"./img/{_gui['-NOW-'].DisplayText}.png")
if len(pages) != 0:
_gui['-NOW-'].update(pages.pop())
_gui['-IMAGE-'].update(images.pop())
else:
_gui['-TRUE-'].update(disabled=True)
_gui['-FALSE-'].update(disabled=True)
gui = self.check_gui()
self.main.Hide()
gui['-PAGE-'].update(values=pages)
gui['-PAGE-'].update(disabled=True) # 暂时禁用
images.reverse()
pages.reverse()
gui['-NOW-'].update(pages.pop())
gui['-IMAGE-'].update(images.pop())
while True:
event, values = gui.read(timeout=100)
if not event:
break
elif event == '-TRUE-':
update(gui, True)
elif event == '-FALSE-':
update(gui)
elif event == '-OVER-':
self.update_log(remove)
break
[os.remove(os.path.join(ROOT, i)) for i in os.listdir(ROOT)]
self.main['-FILE-'].update(self.log)
self.main.find_element('status').update('准备就绪')
self.main.UnHide()
gui.close()
def update_log(self, sure):
if sure:
xlsx = self.check_xlsx(self.file, to=False)
xlsx.drop([int(i) for i in sure], inplace=True)
if xlsx.empty and self.log:
self.log.discard(self.pdf)
xlsx.to_excel(self.file)
def choice_deal(self):
self.file = self.choice_file().replace('/', '\\')
if self.file and '_正常' not in self.file:
self.page = self.check_xlsx(self.file)
if self.page:
self.pdf = self.file.replace('xlsx', 'pdf')
if os.path.exists(self.pdf):
return None
return '选择的文件所对应的 PDF 文件不存在!'
return '选择的文件均为正常页,无需检查!'
return '未选择文件,或者选择的文件均为正常页,无需检查!'
@staticmethod
def pdf_to_image(filename, page_list, save):
"""PDF生成图片"""
doc = fitz.open(filename)
if save:
for i in page_list:
img = doc[i -
1].get_pixmap(matrix=fitz.Matrix(0.7, 0.7), alpha=False)
img.save(os.path.join(ROOT, "%s.png" % i))
fitz.TOOLS.store_shrink(100) # 清空缓存
else:
for i in page_list:
img = doc[i -
1].get_pixmap(matrix=fitz.Matrix(0.7, 0.7), alpha=False)
img.save(os.path.join(ROOT, "%s.png" % i))
doc.close()
@staticmethod
def check_xlsx(file, to=True):
xlsx = pd.read_excel(file, index_col=0, dtype={'状态': str})
if xlsx.empty:
return None
xlsx = xlsx[(xlsx['状态'] == 'None') | (xlsx['状态'] == 'False')]
if to:
return xlsx.index.tolist()
return xlsx
def choice_file(self):
return sg.popup_get_file(
'',
file_types=(
('XLSX',
'*.xlsx'),
),
icon=self.ICO,
no_window=True,
)
def check_log(self):
log = self.get_log()
if not log:
return set()
new_ = set()
for i in log:
j = i.replace('.pdf', '.xlsx')
if os.path.exists(i) and os.path.exists(j) and self.check_xlsx(j):
new_.add(i)
return new_
@staticmethod
def get_log():
if not os.path.exists('Inspection_records.pkl'):
return None
with open('Inspection_records.pkl', 'rb') as f:
log = pickle.load(f)
return log
def finished(self):
if os.path.exists('Inspection_records.pkl'):
with open('Inspection_records.pkl', 'wb') as f:
pickle.dump(self.log, f)
def main():
GUI().run()
if __name__ == '__main__':
freeze_support()
main()