master 9bc0f3e9fc9a cached
344 files
23.2 MB
6.1M tokens
9018 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (24,774K chars total). Download the full file to get everything.
Repository: Hyhyhyhyhyhyh/Django-Data-quality-system
Branch: master
Commit: 9bc0f3e9fc9a
Files: 344
Total size: 23.2 MB

Directory structure:
gitextract_j3qqf1bi/

├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── api/
│   ├── __init__.py
│   ├── admin.py
│   ├── api_backend.py
│   ├── api_blood.py
│   ├── api_check.py
│   ├── api_dashboard.py
│   ├── api_datastandard.py
│   ├── api_date.py
│   ├── api_files.py
│   ├── api_quality.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── authorize/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── authorize/
│   │       └── login.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── backend/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── backend/
│   │       ├── crontab.html
│   │       ├── database.html
│   │       ├── database_add.html
│   │       └── database_detail.html
│   ├── tests.py
│   └── views.py
├── blood/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── blood/
│   │       └── analyze.html
│   ├── tests.py
│   └── views.py
├── check/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── autocheck.py
│   ├── crontab_autocheck.py
│   ├── models.py
│   ├── templates/
│   │   └── check/
│   │       ├── blood_analyze.html
│   │       ├── crontab.html
│   │       ├── rule_edit.html
│   │       └── rule_list.html
│   ├── tests.py
│   └── views.py
├── data/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── data/
│   │       ├── dashboard.html
│   │       ├── dashboard_subcompany.html
│   │       ├── report.html
│   │       ├── result_detail.html
│   │       └── template-ui.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── demand/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── insert_excel.sql
│   ├── models.py
│   ├── templates/
│   │   └── demand/
│   │       └── upload_form.html
│   ├── tests.py
│   └── views.py
├── docs/
│   ├── api_views.md
│   ├── authorize_views.md
│   ├── check_views.md
│   ├── data_views.md
│   ├── ddl.sql
│   ├── demand_views.md
│   ├── demo数据.sql
│   ├── files_views.md
│   ├── requirements.txt
│   └── 部署文档.md
├── files/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── files/
│   │       └── file_list.html
│   ├── tests.py
│   └── views.py
├── gconfig.py
├── manage.py
├── mysite/
│   ├── __init__.py
│   ├── db_config.py
│   ├── settings.py
│   ├── source_db_config.py
│   ├── urls.py
│   └── wsgi.py
├── nginx.conf
├── standard/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── standard/
│   │       ├── show.html
│   │       └── update.html
│   ├── tests.py
│   └── views.py
├── static/
│   ├── CodeMirror/
│   │   ├── lib/
│   │   │   ├── codemirror.css
│   │   │   └── codemirror.js
│   │   ├── mode/
│   │   │   └── sql.js
│   │   └── theme/
│   │       └── eclipse.css
│   ├── check/
│   │   └── css/
│   │       ├── admin/
│   │       │   ├── jquery.dataTables.css
│   │       │   └── style.css
│   │       └── login.css
│   ├── css/
│   │   ├── animate.css
│   │   ├── bak/
│   │   │   └── animate.css
│   │   ├── datatables/
│   │   │   ├── datatables-site.css
│   │   │   ├── jquery.dataTables.css
│   │   │   └── jquery.dataTables.css.origin
│   │   ├── datatables.css
│   │   ├── fonts.css
│   │   ├── helper.css
│   │   ├── icons.css
│   │   ├── lib/
│   │   │   └── bootstrap/
│   │   │       └── bootstrap3.css
│   │   ├── login.css
│   │   ├── material-dash.css
│   │   ├── rule_list.css
│   │   ├── spinners.css
│   │   ├── style.css
│   │   └── sweetalert.css
│   ├── files/
│   │   ├── 信托公司风险指标.xlsx
│   │   ├── 基金1公司风险指标.xlsx
│   │   ├── 基金2公司风险指标.xlsx
│   │   ├── 担保公司风险指标.xlsx
│   │   ├── 资产公司风险指标.xlsx
│   │   ├── 金科公司风险指标.xlsx
│   │   └── 金租公司风险指标.xlsx
│   ├── fonts/
│   │   └── fontAwesome.otf
│   ├── icons/
│   │   ├── linea-icons/
│   │   │   └── linea.css
│   │   ├── simple-line-icons/
│   │   │   └── css/
│   │   │       └── simple-line-icons.css
│   │   └── themify-icons/
│   │       └── themify-icons.css
│   ├── js/
│   │   ├── DataTables/
│   │   │   ├── AutoFill-2.3.3/
│   │   │   │   ├── css/
│   │   │   │   │   ├── autoFill.bootstrap.css
│   │   │   │   │   ├── autoFill.bootstrap4.css
│   │   │   │   │   ├── autoFill.dataTables.css
│   │   │   │   │   ├── autoFill.foundation.css
│   │   │   │   │   ├── autoFill.jqueryui.css
│   │   │   │   │   └── autoFill.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── autoFill.bootstrap.js
│   │   │   │       ├── autoFill.bootstrap4.js
│   │   │   │       ├── autoFill.foundation.js
│   │   │   │       ├── autoFill.jqueryui.js
│   │   │   │       ├── autoFill.semanticui.js
│   │   │   │       └── dataTables.autoFill.js
│   │   │   ├── Buttons-1.5.6/
│   │   │   │   ├── css/
│   │   │   │   │   ├── buttons.bootstrap.css
│   │   │   │   │   ├── buttons.bootstrap4.css
│   │   │   │   │   ├── buttons.dataTables.css
│   │   │   │   │   ├── buttons.foundation.css
│   │   │   │   │   ├── buttons.jqueryui.css
│   │   │   │   │   ├── buttons.semanticui.css
│   │   │   │   │   ├── common.scss
│   │   │   │   │   └── mixins.scss
│   │   │   │   ├── js/
│   │   │   │   │   ├── buttons.bootstrap.js
│   │   │   │   │   ├── buttons.bootstrap4.js
│   │   │   │   │   ├── buttons.colVis.js
│   │   │   │   │   ├── buttons.flash.js
│   │   │   │   │   ├── buttons.foundation.js
│   │   │   │   │   ├── buttons.html5.js
│   │   │   │   │   ├── buttons.jqueryui.js
│   │   │   │   │   ├── buttons.print.js
│   │   │   │   │   ├── buttons.semanticui.js
│   │   │   │   │   └── dataTables.buttons.js
│   │   │   │   └── swf/
│   │   │   │       └── flashExport.swf
│   │   │   ├── ColReorder-1.5.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── colReorder.bootstrap.css
│   │   │   │   │   ├── colReorder.bootstrap4.css
│   │   │   │   │   ├── colReorder.dataTables.css
│   │   │   │   │   ├── colReorder.foundation.css
│   │   │   │   │   ├── colReorder.jqueryui.css
│   │   │   │   │   └── colReorder.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── colReorder.bootstrap.js
│   │   │   │       ├── colReorder.bootstrap4.js
│   │   │   │       ├── colReorder.dataTables.js
│   │   │   │       ├── colReorder.foundation.js
│   │   │   │       ├── colReorder.jqueryui.js
│   │   │   │       ├── colReorder.semanicui.js
│   │   │   │       ├── colReorder.semanticui.js
│   │   │   │       └── dataTables.colReorder.js
│   │   │   ├── DataTables-1.10.18/
│   │   │   │   ├── css/
│   │   │   │   │   ├── dataTables.bootstrap.css
│   │   │   │   │   ├── dataTables.bootstrap4.css
│   │   │   │   │   ├── dataTables.foundation.css
│   │   │   │   │   ├── dataTables.jqueryui.css
│   │   │   │   │   ├── dataTables.semanticui.css
│   │   │   │   │   └── jquery.dataTables.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.bootstrap.js
│   │   │   │       ├── dataTables.bootstrap4.js
│   │   │   │       ├── dataTables.foundation.js
│   │   │   │       ├── dataTables.jqueryui.js
│   │   │   │       ├── dataTables.semanticui.js
│   │   │   │       └── jquery.dataTables.js
│   │   │   ├── FixedColumns-3.2.5/
│   │   │   │   ├── css/
│   │   │   │   │   ├── fixedColumns.bootstrap.css
│   │   │   │   │   ├── fixedColumns.bootstrap4.css
│   │   │   │   │   ├── fixedColumns.dataTables.css
│   │   │   │   │   ├── fixedColumns.foundation.css
│   │   │   │   │   ├── fixedColumns.jqueryui.css
│   │   │   │   │   └── fixedColumns.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.fixedColumns.js
│   │   │   │       ├── fixedColumns.bootstrap.js
│   │   │   │       ├── fixedColumns.bootstrap4.js
│   │   │   │       ├── fixedColumns.dataTables.js
│   │   │   │       ├── fixedColumns.foundation.js
│   │   │   │       ├── fixedColumns.jqueryui.js
│   │   │   │       ├── fixedColumns.semanicui.js
│   │   │   │       └── fixedColumns.semanticui.js
│   │   │   ├── FixedHeader-3.1.4/
│   │   │   │   ├── css/
│   │   │   │   │   ├── fixedHeader.bootstrap.css
│   │   │   │   │   ├── fixedHeader.bootstrap4.css
│   │   │   │   │   ├── fixedHeader.dataTables.css
│   │   │   │   │   ├── fixedHeader.foundation.css
│   │   │   │   │   ├── fixedHeader.jqueryui.css
│   │   │   │   │   └── fixedHeader.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.fixedHeader.js
│   │   │   │       ├── fixedHeader.bootstrap.js
│   │   │   │       ├── fixedHeader.bootstrap4.js
│   │   │   │       ├── fixedHeader.dataTables.js
│   │   │   │       ├── fixedHeader.foundation.js
│   │   │   │       ├── fixedHeader.jqueryui.js
│   │   │   │       ├── fixedHeader.semanicui.js
│   │   │   │       └── fixedHeader.semanticui.js
│   │   │   ├── JSZip-2.5.0/
│   │   │   │   └── jszip.js
│   │   │   ├── KeyTable-2.5.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── keyTable.bootstrap.css
│   │   │   │   │   ├── keyTable.bootstrap4.css
│   │   │   │   │   ├── keyTable.dataTables.css
│   │   │   │   │   ├── keyTable.foundation.css
│   │   │   │   │   ├── keyTable.jqueryui.css
│   │   │   │   │   └── keyTable.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.keyTable.js
│   │   │   │       ├── keyTable.bootstrap.js
│   │   │   │       ├── keyTable.bootstrap4.js
│   │   │   │       ├── keyTable.dataTables.js
│   │   │   │       ├── keyTable.foundation.js
│   │   │   │       ├── keyTable.jqueryui.js
│   │   │   │       ├── keyTable.semanicui.js
│   │   │   │       └── keyTable.semanticui.js
│   │   │   ├── Responsive-2.2.2/
│   │   │   │   ├── css/
│   │   │   │   │   ├── responsive.bootstrap.css
│   │   │   │   │   ├── responsive.bootstrap4.css
│   │   │   │   │   ├── responsive.dataTables.css
│   │   │   │   │   ├── responsive.foundation.css
│   │   │   │   │   ├── responsive.jqueryui.css
│   │   │   │   │   └── responsive.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.responsive.js
│   │   │   │       ├── responsive.bootstrap.js
│   │   │   │       ├── responsive.bootstrap4.js
│   │   │   │       ├── responsive.foundation.js
│   │   │   │       ├── responsive.jqueryui.js
│   │   │   │       └── responsive.semanticui.js
│   │   │   ├── RowGroup-1.1.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── rowGroup.bootstrap.css
│   │   │   │   │   ├── rowGroup.bootstrap4.css
│   │   │   │   │   ├── rowGroup.dataTables.css
│   │   │   │   │   ├── rowGroup.foundation.css
│   │   │   │   │   ├── rowGroup.jqueryui.css
│   │   │   │   │   └── rowGroup.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.rowGroup.js
│   │   │   │       ├── rowGroup.bootstrap.js
│   │   │   │       ├── rowGroup.bootstrap4.js
│   │   │   │       ├── rowGroup.dataTables.js
│   │   │   │       ├── rowGroup.foundation.js
│   │   │   │       ├── rowGroup.jqueryui.js
│   │   │   │       ├── rowGroup.semanicui.js
│   │   │   │       └── rowGroup.semanticui.js
│   │   │   ├── RowReorder-1.2.4/
│   │   │   │   ├── css/
│   │   │   │   │   ├── rowReorder.bootstrap.css
│   │   │   │   │   ├── rowReorder.bootstrap4.css
│   │   │   │   │   ├── rowReorder.dataTables.css
│   │   │   │   │   ├── rowReorder.foundation.css
│   │   │   │   │   ├── rowReorder.jqueryui.css
│   │   │   │   │   └── rowReorder.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.rowReorder.js
│   │   │   │       ├── rowReorder.bootstrap.js
│   │   │   │       ├── rowReorder.bootstrap4.js
│   │   │   │       ├── rowReorder.dataTables.js
│   │   │   │       ├── rowReorder.foundation.js
│   │   │   │       ├── rowReorder.jqueryui.js
│   │   │   │       └── rowReorder.semanticui.js
│   │   │   ├── Scroller-2.0.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── scroller.bootstrap.css
│   │   │   │   │   ├── scroller.bootstrap4.css
│   │   │   │   │   ├── scroller.dataTables.css
│   │   │   │   │   ├── scroller.foundation.css
│   │   │   │   │   ├── scroller.jqueryui.css
│   │   │   │   │   └── scroller.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.scroller.js
│   │   │   │       ├── scroller.bootstrap.js
│   │   │   │       ├── scroller.bootstrap4.js
│   │   │   │       ├── scroller.dataTables.js
│   │   │   │       ├── scroller.foundation.js
│   │   │   │       ├── scroller.jqueryui.js
│   │   │   │       ├── scroller.semanicui.js
│   │   │   │       └── scroller.semanticui.js
│   │   │   ├── Select-1.3.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── select.bootstrap.css
│   │   │   │   │   ├── select.bootstrap4.css
│   │   │   │   │   ├── select.dataTables.css
│   │   │   │   │   ├── select.foundation.css
│   │   │   │   │   ├── select.jqueryui.css
│   │   │   │   │   └── select.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.select.js
│   │   │   │       ├── select.bootstrap.js
│   │   │   │       ├── select.bootstrap4.js
│   │   │   │       ├── select.dataTables.js
│   │   │   │       ├── select.foundation.js
│   │   │   │       ├── select.jqueryui.js
│   │   │   │       └── select.semanticui.js
│   │   │   ├── datatables.css
│   │   │   ├── datatables.js
│   │   │   ├── jQuery-3.3.1/
│   │   │   │   └── jquery-3.3.1.js
│   │   │   └── pdfmake-0.1.36/
│   │   │       ├── pdfmake.js
│   │   │       └── vfs_fonts.js
│   │   ├── Echarts/
│   │   │   ├── echarts-en.common.js
│   │   │   ├── echarts-en.js
│   │   │   ├── echarts-en.simple.js
│   │   │   ├── echarts.common.js
│   │   │   ├── echarts.js
│   │   │   ├── echarts.simple.js
│   │   │   └── extension/
│   │   │       ├── bmap.js
│   │   │       └── dataTool.js
│   │   ├── FileSaver.js
│   │   ├── bootstrap.js
│   │   ├── canvas-nest.js
│   │   ├── dashboard_echarts.js
│   │   ├── get_quality_detail.js
│   │   ├── gojs/
│   │   │   ├── Buttons.js
│   │   │   └── go.js
│   │   ├── init.js
│   │   ├── jquery/
│   │   │   ├── jquery.ba-resize.js
│   │   │   ├── jquery.slimscroll.js
│   │   │   └── jquery.wordexport.js
│   │   ├── login.js
│   │   ├── scripts.js
│   │   └── sidebarmenu.js
│   ├── resource/
│   │   ├── chinese.lang
│   │   ├── demand.json
│   │   └── stdNodes.json
│   └── zTree/
│       ├── css/
│       │   └── zTreeStyle.css
│       └── js/
│           └── fuzzysearch.js
└── utils/
    ├── functions.py
    ├── generate_dim_date.py
    └── report_data.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.js linguist-language=Python 
*.css linguist-language=Python 

================================================
FILE: .gitignore
================================================
*/__pycache__/
*/migrations/
.idea/


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2020 Hyhyhyhyhyhyh

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
# demo
http://data.sghen.cn
登录用户名密码:admin/admin

# 项目结构
```
项目
│  gconfig.py           gunicorn配置文件
│  manage.py            Django管理文件
│  README.md            readme
|  nginx.conf           nginx.conf
│
├─api                   ajax接口
│
├─authorize             身份认证模块
|
├─check                 自动检核模块
|
├─data                  仪表盘、检核明细模块
|
├─demand                更新源系统改造需求
|
├─docs                  文档目录
│
├─files                 上传下载文件模块
│
├─logs                  日志目录
|
├─mysite                Django配置目录
│
├─standard              查看、更新数据标准模块
|
├─utils                 一些复用的函数
│
└─static                css、js、附件等静态文件目录
```


# 更新记录
## 2020-09-05
- 修复若干本地部署会发生的错误
- **重要**:修正部署文档`docs/部署文档.md`中的许多错误

## 2020-06-13
- 更新血缘分析模块

## 2020-05
- 数据源跟检核规则库中的数据库进行关联

## 2020-04-23
1. 前端侧边栏修改,显示更加紧凑
2. 新增数据源的查看/修改/新增功能


## 2020-03-29
1. 后端
    - 检核结果由按季度存放改在按日存放,记录检核版本方便查看历史变化趋势
    - 根据check_execute_log检核日志表为前端提供日期选择接口;api代码更新为正式代码(代替随机数据)
    - 添加日期维度表
2. 前端:在仪表盘添加各公司质量总览及全期趋势图;添加日期选择控件等
3. 进一步前后分离,减少后端渲染模板

## 2019-12-29
实际部署demo

## 2019-09-09
demo


# 启停项目
```
# 切换虚拟环境
workon django-2.1

# 启动项目
gunicorn mysite.wsgi -c /data/pyweb/data-quality/gconfig.py &
```

# todo
- [ ] 数据标准编辑功能完善

# 说明
登录页面背景图来自https://pixabay.com

================================================
FILE: api/__init__.py
================================================


================================================
FILE: api/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: api/api_backend.py
================================================
from django.http.response import JsonResponse
from django.http.response import HttpResponseBadRequest
from django.views.decorators.http import require_http_methods
import pandas as pd
from crontab import CronTab

from mysite import db_config


def encrypy_password(connection_string):
    """将连接串中的密码替换为*号
    """
    str1 = connection_string.split('@')[0].split(':')[0]
    str2 = connection_string.split('@')[0].split(':')[1]
    str3 = connection_string.split('@')[1]
    return f'{str1}:{str2}:******@{str3}'


@require_http_methods(['GET'])
def db_query(request):
    try:
        conn = db_config.sqlalchemy_conn()
        db = pd.read_sql("select name,db_type,alias,connection_string,db,ip,note,id from source_db_info order by name,db_type", con=conn)
        
        db['connection_string'] = db['connection_string'].apply(encrypy_password)
        
        data = {
            'company': db['name'].values.tolist(),
            'db_type': db['db_type'].values.tolist(),
            'alias': db['alias'].values.tolist(),
            'connection_string': db['connection_string'].values.tolist(),
            'db': db['db'].values.tolist(),
            'ip': db['ip'].values.tolist(),
            'note': db['note'].values.tolist(),
            'rowid': db['id'].values.tolist()
        }
        return JsonResponse({'data': data, 'code': 1000})
    except Exception as e:
        return HttpResponseBadRequest(content=e)
    finally:
        conn.dispose()


@require_http_methods(['POST'])
def db_update(request):
    id = request.POST.get('id')
    ip = request.POST.get('ip')
    alias = request.POST.get('alias')
    user = request.POST.get('user')
    password = request.POST.get('password')
    db = request.POST.get('db')
    port = request.POST.get('port')
    db_type = request.POST.get('db_type')
    charset = request.POST.get('charset')
    note = request.POST.get('note')
    
    if db_type == 'mysql':
        connection_string = f'mysql+mysqldb://{user}:{password}@{ip}:{port}/{db}?charset={charset}'
    elif db_type == 'oracle':
        connection_string = f'oracle://{user}:{password}@{ip}:{port}/?service_name={db}'
    elif db_type == 'sqlserver':
        connection_string = f'mssql+pymssql://{user}:{password}@{ip}:{port}/{db}?charset={charset}'
    elif db_type == 'postgresql':
        connection_string = f'postgresql://{user}:{password}@{ip}:{port}/{db}'
    
    try:
        # conn = db_config.mysql_connect()
        # with conn.cursor() as curs:
        #     sql = f"""update source_db_info
        #                 set alias='{alias}',
        #                 connection_string='{connection_string}',
        #                 ip='{ip}',
        #                 passwd='{password}',
        #                 db='{db}',
        #                 port={port},
        #                 db_type='{db_type}',
        #                 note='{note}'
        #                 where id={id}"""
        #     curs.execute(sql)
        # conn.commit()
        return JsonResponse({'data': '修改成功', 'code': 1000})
    except Exception as e:
        conn.rollback()
        return HttpResponseBadRequest(content=e)
    finally:
        conn.close()

 
@require_http_methods(['POST'])
def db_insert(request):
    company = request.POST.get('company')
    name = request.POST.get('name')
    alias = request.POST.get('alias')
    ip = request.POST.get('ip')
    user = request.POST.get('user')
    password = request.POST.get('password')
    db = request.POST.get('db')
    port = request.POST.get('port')
    db_type = request.POST.get('db_type')
    charset = request.POST.get('charset')
    note = request.POST.get('note')
    
    if db_type == 'mysql':
        connection_string = f'mysql+mysqldb://{user}:{password}@{ip}:{port}/{db}?charset={charset}'
    elif db_type == 'oracle':
        connection_string = f'oracle://{user}:{password}@{ip}:{port}/?service_name={db}'
    elif db_type == 'sqlserver':
        connection_string = f'mssql+pymssql://{user}:{password}@{ip}:{port}/{db}?charset={charset}'
    elif db_type == 'postgresql':
        connection_string = f'postgresql://{user}:{password}@{ip}:{port}/{db}'
        
    try:
        conn = db_config.mysql_connect()
        # with conn.cursor() as curs:
        #     sql = f"""insert into source_db_info(company,name,alias,connection_string,ip,user,passwd,db,port,db_type,note)
        #                 values('{company}','{name}','{alias}','{connection_string}','{ip}','{user}','{password}','{db}',{port},'{db_type}','{note}')"""
        #     curs.execute(sql)
        # conn.commit()
        return JsonResponse({'data': '新增成功', 'code': 1000})
    except Exception as e:
        conn.rollback()
        return HttpResponseBadRequest(content=e)
    finally:
        conn.close()


@require_http_methods(['POST'])
def crontab_enable(request):
    """
    启用/禁用自动检核的crontab任务
    :param request:
    :return:
    """
    enable = request.POST.get('enable')
    job_name = request.POST.get('job_name')

    cron = CronTab(user=True)
    job = list(cron.find_comment(job_name))[0]

    if enable == 'false':
        # job.enable(False)
        # cron.write()
        return JsonResponse({"msg": "success"})
    elif enable == 'true':
        # job.enable()
        # cron.write()
        return JsonResponse({"msg": "success"})
    else:
        return JsonResponse({"msg": "failed"})
    

@require_http_methods(['POST'])
def crontab_run(request):
    job_name = request.POST.get('job_name')
    
    try:
        cron =  CronTab(user=True)
        job = list(cron.find_comment(job_name))[0]
        job.run()
        return JsonResponse({"msg": "success"})
    except Exception as e:
        return HttpResponseBadRequest(content=e)

================================================
FILE: api/api_blood.py
================================================
import re
import os
import sys
import pandas as pd
from sqlalchemy import create_engine
from django.http.response import JsonResponse, HttpResponseBadRequest
from django.views.decorators.http import require_http_methods

sys.path.insert(0, '..')
from mysite import db_config


'''
def extract_table_name_from_sql(sql_str):
    """
    提取sql语句中的表名
    """
    # 过滤去除/* */注释
    q = re.sub(r"/\*[^*]*\*+(?:[^*/][^*]*\*+)*/", "", sql_str)

    # 去除以 -- 或 # 开头的注释行
    lines = [line for line in q.splitlines() if not re.match("^\s*(--|#)", line)]

    # 去除行尾的以 -- 或 # 开头的注释
    q = " ".join([re.split("--|#", line)[0] for line in lines])

    # 根据空格、();分割单词
    tokens = re.split(r"[\s)(;]+", q)

    # 如果发现 from 或 join ,则把get_next设为True,然后获取表名
    result = set()
    get_next = False
    for token in tokens:
        if get_next:
            if token.lower() not in ["", "select"]:
                # result.append(token)
                result.add(token)
            get_next = False
        get_next = token.lower() in ["from", "join"]

    return result
'''
    
@require_http_methods(['GET'])
def query_mapping(request):
    table_name = request.GET.get('table_name')
    
    sql = f"""select distinct subject_area,
                mapping_name,
                source,
				target,
                case when locate('_ts_', mapping_name)>0 then 1
                     when locate('_ti_', mapping_name)>0 then 2
                     when locate('_ods_', mapping_name)>0 then 3
                     else 99
                end level
                from datacenter_mapping
                where (
                    lower(source) like '%{table_name.lower()}%'
                    or lower(target) like '%{table_name.lower()}%'
                    or lower(mapping_name) like '%{table_name.lower()}%'
                    )
                and source<>target
                order by level asc,1,2,3
            """
    
    try:
        conn = db_config.mysql_connect()
        with conn.cursor() as curs:
            curs.execute(sql)
            r = curs.fetchall()
        return JsonResponse({
            'subject_area': [i[0] for i in r],
            'mapping_name': [i[1] for i in r],
            'source': [i[2] for i in r],
            'target': [i[3] for i in r],
            'level': [i[4] for i in r]
        })
    except Exception as e:
        return HttpResponseBadRequest(e)
    finally:
        conn.close()



================================================
FILE: api/api_check.py
================================================
from django.http.response import JsonResponse, HttpResponse, HttpResponseBadRequest
from django.views.decorators.http import require_http_methods
from crontab import CronTab
import pandas as pd

import sys, MySQLdb

sys.path.insert(0, '..')
from mysite import db_config
from check.autocheck import Check, MyThread


@require_http_methods(['GET'])
def rule(request):
    """
    根据公司名查询所有检核规则详情
    """
    company = request.GET.get('name')
    filter = request.GET.get('risk_market_filter')

    conn = db_config.mysql_connect()
    curs = conn.cursor()
    curs.execute('set autocommit=0')
    try:
        sql = f"""select id,check_item,target_table,risk_market_item,problem_type,db,check_sql,note,status,source_system
                    from check_result_template
                    where source_system in ('{company}')
                    and risk_market_item like '%{filter}%'
                    order by id"""
        curs.execute(sql)
        result = curs.fetchall()
        # 构造json
        result_list = []
        for i in result:
            result_dict = {"id": i[0], "check_item": i[1], "target_table": i[2], "risk_market_item": i[3],
                           "problem_type": i[4], "db": i[5], "check_sql": i[6], "note": i[7], "status": i[8],
                           "source_system": i[9]}
            result_list.append(result_dict)
        json_data = {'data': result_list}
        return JsonResponse(json_data)
    except:
        return HttpResponse('error', status=500)
    finally:
        curs.close()
        conn.close()
        
        
@require_http_methods(['GET'])
def rule_detail(request):
    """
    根据公司名、id查询单条规则详情
    """
    company = request.GET.get('company')
    id =  request.GET.get('id')
    
    data = {
        "id": None,
        "source_system": None,
        "check_item": None,
        "target_table": None,
        "risk_market_item": None,
        "problem_type": None,
        "db": None,
        "check_sql": None,
        "note": None,
        "status": None,
    }
    if id == 'null':
        return JsonResponse(data)
    
    sql = f"""select id,check_item,target_table,risk_market_item,problem_type,db,check_sql,note,status
    from check_result_template
    where source_system in ('{company}') and id={id}"""
    conn = db_config.sqlalchemy_conn()
    try:
        result = pd.read_sql(sql, con=conn)
        data = {
            "check_item": result['check_item'].values.tolist()[0],
            "target_table": result['target_table'].values.tolist()[0],
            "risk_market_item": result['risk_market_item'].values.tolist()[0],
            "problem_type": result['problem_type'].values.tolist()[0],
            "db": result['db'].values.tolist()[0],
            "check_sql": result['check_sql'].values.tolist()[0],
            "note": result['note'].values.tolist()[0],
            "status": result['status'].values.tolist()[0],
        }
        return JsonResponse(data)
    except Exception as e:
        return HttpResponseBadRequest(e)
    finally:
        conn.dispose()


@require_http_methods(['POST'])
def rule_update(request):
    """
    执行修改检核规则
    """
    id = request.POST.get('id')
    source_system = request.POST.get('source_system')
    check_item = request.POST.get('check_item')
    target_table = request.POST.get('target_table')
    risk_market = request.POST.get('risk_market')
    problem_type = request.POST.get('problem_type')
    db = request.POST.get('db')
    check_sql = request.POST.get('check_sql')
    note = request.POST.get('note')
    status = request.POST.get('status')

    # 把"转义为',再把'转义为''
    check_sql = MySQLdb.escape_string(check_sql).decode('utf-8')
    # print(check_sql)
    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        curs.execute('set autocommit=0')
        sql = f"""update check_result_template set check_item='{check_item}',
                                                target_table='{target_table}',
                                                risk_market_item='{risk_market}',
                                                problem_type='{problem_type}',
                                                db='{db}',
                                                check_sql='{check_sql}',
                                                note='{note}',
                                                status='{status}'
                                                where id={id} and source_system='{source_system}'"""
        # print(sql)
        curs.execute(sql)
        conn.commit()
        return JsonResponse({'msg': '修改成功', 'code': 1000})
    except Exception as e:
        return HttpResponse(e, status=500)
    finally:
        curs.close()
        conn.close()


@require_http_methods(['POST'])
def rule_add(request):
    """
    新增检核规则
    """
    source_system = request.POST.get('source_system')
    check_item = request.POST.get('check_item')
    target_table = request.POST.get('target_table')
    risk_market = request.POST.get('risk_market')
    problem_type = request.POST.get('problem_type')
    db = request.POST.get('db')
    check_sql = request.POST.get('check_sql')
    note = request.POST.get('note')
    status = request.POST.get('status')

    # 处理检核SQL中含有''的情况
    check_sql = MySQLdb.escape_string(check_sql).decode('utf-8')
    # print(check_sql)
    try:
        # 连接数据库
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        curs.execute('set autocommit=0')
        sql = "select max(id)+1 from check_result_template where source_system in ('" + source_system + "')"
        curs.execute(sql)
        result = curs.fetchone()
        new_id = str(result[0])  # 获取新增的id
        sql = f"""insert into check_result_template(id,
                                                    source_system,
                                                    check_item,
                                                    target_table,
                                                    risk_market_item,
                                                    problem_type,
                                                    db,
                                                    check_sql,
                                                    note,
                                                    status)
                values({new_id},
                        '{source_system}',
                        '{check_item}',
                        '{target_table}',
                        '{risk_market}',
                        '{problem_type}',
                        '{db}',
                        '{check_sql}',
                        '{note}',
                        '{status}')"""
        # print(sql)
        curs.execute(sql)
        conn.commit()
        return JsonResponse({'msg': '修改成功', 'code': 1000})
    except Exception as e:
        return HttpResponse(e, status=500)
    finally:
        curs.close()
        conn.close()


@require_http_methods(['POST'])
def rule_status_modify(request):
    """修改检核规则状态,禁用/启用 规则的状态
    """
    id = request.POST.get('id')
    post_status = request.POST.get('status')
    company = request.POST.get('company')

    conn = db_config.mysql_connect()
    curs = conn.cursor()
    curs.execute('set autocommit=0')
    # 修改状态
    try:
        if post_status == '已启用':
            sql = f"update check_result_template set status='已停用' where id={id} and source_system='{company}'"
            rr = curs.execute(sql)
            conn.commit()
            return JsonResponse({'msg': '修改成功', 'code': 1000})
        else:
            sql = f"update check_result_template set status='已启用' where id={id} and source_system='{company}'"
            rr = curs.execute(sql)
            conn.commit()
            return JsonResponse({'msg': '修改成功', 'code': 1000})
    except:
        return HttpResponse('error', status=500)
    finally:
        curs.close()
        conn.close()


@require_http_methods(['POST'])
def rule_execute(request):
    """执行检核
    """
    company = request.POST.get('company')
    username = request.POST.get('username')
    quarter = request.POST.get('quarter')
    source_system = company

    if company == 'xt':
        check = Check()
        if check.init_table(company, source_system, quarter):
            # 初始化3个线程
            thread1 = MyThread(func=check.run_check,
                               args=(company, source_system, quarter, 'oracle'))
            thread2 = MyThread(func=check.run_check,
                               args=(company, source_system, quarter, 'sqlserver'))
            thread3 = MyThread(func=check.xt_spec, args=(quarter,))
            thread4 = MyThread(func=check.run_check,
                               args=(company, source_system, quarter, 'mysql'))
            # 开启3个线程
            thread1.start()
            thread2.start()
            thread3.start()
            thread4.start()
            # 等待运行结束
            thread1.join()
            thread2.join()
            thread3.join()
            thread4.join()

            if thread1.get_result() is True:
                if thread2.get_result() is True:
                    if thread3.get_result() is True:
                        if thread4.get_result() is True:
                            run = True
                        else:
                            return JsonResponse({
                                "status":
                                    "检核过程发生错误:" + str(thread4.get_result())
                            })
                    else:
                        return JsonResponse({
                            "status":
                                "检核过程发生错误:" + str(thread3.get_result())
                        })
                else:
                    return JsonResponse(
                        {"status": "检核过程发生错误:" + str(thread2.get_result())})
            else:
                return JsonResponse(
                    {"status": "检核过程发生错误:" + str(thread1.get_result())})
        else:
            return JsonResponse({"status": "初始化检核表发生错误"})

    elif company == 'zc':
        source_system = '资产'
        check = Check()
        if check.init_table(company, source_system, quarter):
            run = check.run_check(company, source_system, quarter, None)
            if run is not True:
                return JsonResponse({"status": "检核过程发生错误:" + str(run)})
        else:
            return JsonResponse({"status": "初始化检核表发生错误"})

    elif company == 'db':
        source_system = '担保'
        check = Check()
        if check.init_table(company, source_system, quarter):
            run = check.run_check(company, source_system, quarter, None)
            if run is not True:
                return JsonResponse({"status": "检核过程发生错误:" + str(run)})
        else:
            return JsonResponse({"status": "初始化检核表发生错误"})

    elif company == 'jk':
        source_system = '金科'
        check = Check()
        if check.init_table(company, source_system, quarter):
            run = check.run_check(company, source_system, quarter, None)
            if run is not True:
                return JsonResponse({"status": "检核过程发生错误:" + str(run)})
        else:
            return JsonResponse({"status": "初始化检核表发生错误"})

    elif company == 'jj1':
        source_system = '基金1'
        check = Check()
        if check.init_table(company, source_system, quarter):
            run = check.run_check(company, source_system, quarter, None)
            if run is not True:
                return JsonResponse({"status": "检核过程发生错误:" + str(run)})
        else:
            return JsonResponse({"status": "初始化检核表发生错误"})

    elif company == 'jj2':
        source_system = '基金2'
        check = Check()
        if check.init_table(company, source_system, quarter):
            run = check.run_check(company, source_system, quarter, None)
            if run is not True:
                return JsonResponse({"status": "检核过程发生错误:" + str(run)})
        else:
            return JsonResponse({"status": "初始化检核表发生错误"})

    elif company == 'jz':
        source_system = '金租'
        check = Check()
        if check.init_table(company, source_system, quarter):
            run = check.run_check(company, source_system, quarter, None)
            if run is not True:
                return JsonResponse({"status": "检核过程发生错误:" + str(run)})
        else:
            return JsonResponse({"status": "初始化检核表发生错误"})

    if run is True:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        curs.execute('set autocommit=0')
        sql = "insert into check_execute_log values(null,'{0}','{1}',now(),'{2}')".format(
            quarter, company, username)
        print(sql)
        curs.execute(sql)
        conn.commit()
        curs.close()
        conn.close()
        return JsonResponse({
            "status": "success",
            "msg": source_system + "公司检核成功!"
        })


def update_crontab(request):
    """更新crontab命令
    """
    job_time = request.POST.get('job_time')

    try:
        # cron  = CronTab(user=True)
        # job = list(cron.find_comment('自动进行数据质量检核'))[0]
        # job.setall(job_time)
        return JsonResponse({"msg": "操作成功"})
    except Exception as e:
        return JsonResponse({"msg": "操作失败", "reason": e})
    
    
@require_http_methods(['GET'])
def query_check_progress(request):
    """
    查询正在运行的检核任务执行进度
    :param request:
    :return:
    """
    company = request.GET.get('company')
    db = request.GET.get('db')
    
    data = {}
    try:
        conn = db_config.mysql_connect()
        for company in ('xt', 'zc', 'db', 'jk', 'jj1', 'jj2', 'jz'):
            data[company] = {}
            
            with conn.cursor() as curs:
                # 已检核指标总数
                sql  = f"""select a.db,count(*)
                            from check_result_{company} a,
                            (
                                select max(check_version) check_version,db from check_result_{company}
                                where db in (select distinct alias from source_db_info where company='{company}')
                                group by db
                            ) b
                            where a.check_sql is not null
                            and a.check_sql != ''
                            and a.check_version=b.check_version
                            and a.db=b.db
                            and a.update_flag='Y'
                            group by a.db"""
                curs.execute(sql)
                result = curs.fetchall()
                for i in result:
                    data[company][i[0]] = i[1]
                    
                # 待检核指标总数
                sql  = f"""select a.db,count(*)
                            from check_result_{company} a,
                            (
                                select max(check_version) check_version,db from check_result_{company}
                                where db in (select distinct alias from source_db_info where company='{company}')
                                group by db
                            ) b
                            where a.check_sql is not null
                            and a.check_sql != ''
                            and a.check_version=b.check_version
                            and a.db=b.db
                            group by a.db"""
                curs.execute(sql)
                result = curs.fetchall()
                for i in result:
                    if i[1] == 0:
                        data[company][i[0]] = 0
                    else:
                        data[company][i[0]] = round(data[company][i[0]]/i[1]*100, 2)
                    
        return JsonResponse(data)
    except Exception as e:
        return HttpResponseBadRequest(e)
    finally:
        conn.close()

================================================
FILE: api/api_dashboard.py
================================================
import numpy as np
from django.http.response import JsonResponse
from django.views.decorators.http import require_http_methods

import sys, MySQLdb

sys.path.insert(0, '..')
from mysite import db_config
from utils import functions as f

# np.set_printoptions(precision=2, suppress=True)


@require_http_methods(['GET'])
def avg_problem_percentage(request):
    """
    各公司平均问题占比
    :param request:
    :return:
    """
    # 接口返回值列表
    data = []
    data_quarter = ['quarter']
    data_company = []
    
    # 获取所有年所有季度
    year = f.query_data_year()
    quarter = []
    for y in year:
        q = f.query_data_quarter(y)
        quarter.extend([(y, i) for i in q])
        [data_quarter.append(str(y)+'Q'+str(i)) for i in q]
    data.append(data_quarter)

    # 查询各公司每季度数据
    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        for company in ('xt', 'zc', 'db', 'jk', 'jj1', 'jj2', 'jz'):
            data_company = [company]
            sql = f"""select round(sum(a.problem_count)/sum(a.item_count)*100,2)
                    from check_result_{company} a,dim_date b
                    where a.RISK_MARKET_ITEM='是'
                    and DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
                    and (b.year,b.quarter) in {tuple(quarter)}
                    group by b.year,b.quarter"""
            curs.execute(sql)
            result = curs.fetchall()
            [data_company.append(str(r[0])) for r in result]
            data.append(data_company)
        return JsonResponse(data, safe=False)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()


@require_http_methods(['GET'])
def same_problem_top5(request):
    """
    各公司同类问题Top 5统计
    :param request:
    :return:
    """
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    day = request.GET.get('day')

    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        # 查询风险集市相关的相同的检核项的问题占比总和
        sql = f"""select check_item,count(*) cnt,sum(problem_per) from (
                select check_item,problem_per,check_date from check_result_xt where risk_market_item='是' and problem_per is not null
                union
                select check_item,problem_per,check_date from check_result_zc where risk_market_item='是' and problem_per is not null
                union
                select check_item,problem_per,check_date from check_result_db where risk_market_item='是' and problem_per is not null
                union
                select check_item,problem_per,check_date from check_result_jk where risk_market_item='是' and problem_per is not null
                union
                select check_item,problem_per,check_date from check_result_jj1 where risk_market_item='是' and problem_per is not null
                union
                select check_item,problem_per,check_date from check_result_jj2 where risk_market_item='是' and problem_per is not null
                union
                select check_item,problem_per,check_date from check_result_jz where risk_market_item='是' and problem_per is not null
                ) a, dim_date b
            where DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
            and b.year={year}
            and b.quarter={quarter}
            and b.month={month}
            and b.day={day}
            group by check_item
            having count(*)>1
            order by 3 desc,2 desc"""
        curs.execute(sql)
        result = curs.fetchall()
        
        check_item = []
        total_problem = []
        [check_item.append(r[0]) for r in result]
        [total_problem.append(float(str(r[2]))) for r in result]
        
        # 取top4问题项及占比
        top4_item = check_item[0:4]
        top4_problem = total_problem[0:4]
        other_problem = sum(total_problem[4:])
        # 合并 其他项
        top4_item.append('其他')
        top4_problem.append(other_problem)
        data = {
            'name': top4_item,
            'value': top4_problem
        }
        return JsonResponse(data)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()



@require_http_methods(['GET'])
def subcompany_data_percentage(request):
    """
    各公司数据量占比
    :param request:
    :return:
    """
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    day = request.GET.get('day')

    data = []
    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        for company in ('xt', 'zc', 'db', 'jk', 'jj1', 'jj2', 'jz'):
            sql = f"""select sum(distinct item_count) from check_result_{company} a,
                        (
                            select max(a.check_version) check_version
                            from check_result_{company} a,dim_date b where DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
                            and b.year={year}
                            and b.quarter={quarter}
                            and b.month={month}
                            and b.day={day}
                        ) b
                        where a.check_version=b.check_version
                        and a.risk_market_item='是'"""
            curs.execute(sql)
            result = curs.fetchone()
            if result[0] is None:
                data.append({'name': company, 'value': 0})
            else:
                data.append({'name': company, 'value': float(str(result[0]))})
        return JsonResponse(data, safe=False)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()


def count_db_rows(request):
    """统计各类数据库数据量
    """
    quarter = request.GET.get('quarter')
    
    data = [{
                "name": "MySQL",
                "value": np.random.randint(1000,99999),
            },
            {
                "name": "Oracle",
                "value": np.random.randint(1000,99999)
            },
            {
                "name": "SQL server",
                "value": np.random.randint(1000,99999)
            },
            {
                "name": "HBase",
                "value": np.random.randint(1000,99999)
            },
            ]
    return JsonResponse(data, safe=False)


@require_http_methods(['GET'])
def data_overview_total(request):
    """
    统计风险集市相关 总数据量、总问题数据量、总问题占比
    :param request:
    :return:
    """
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    day = request.GET.get('day')

    all_cnt = 0
    problem_cnt = 0

    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        for company in ('xt', 'zc', 'db', 'jk', 'jj1', 'jj2', 'jz'):
            sql = f"""select sum(a.item_count),sum(a.problem_count) from check_result_{company} a,
                        (
                            select max(a.check_version) check_version
                            from check_result_{company} a,dim_date b where DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
                            and b.year={year}
                            and b.quarter={quarter}
                            and b.month={month}
                            and b.day={day}
                        ) b
                        where a.check_version=b.check_version
                        and a.risk_market_item='是'"""
            curs.execute(sql)
            result = curs.fetchone()
            if result[0] is None:
                continue
            else:
                all_cnt = all_cnt + result[0]
                problem_cnt = problem_cnt + result[1]

        response = {
            'all_cnt': all_cnt,
            'problem_cnt': problem_cnt,
            'problem_per': round(problem_cnt / all_cnt * 100, 2)
        }
        return JsonResponse(response)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()
    
    
@require_http_methods(['GET'])
def data_overview_company(request):
    """
    统计风险集市相关 各公司 检核数据量、问题数据量、问题数据占比
    :param request:
    :return:
    """
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    day = request.GET.get('day')
    

    data = []
    try:    
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        for company in ('xt', 'zc', 'db', 'jk', 'jj1', 'jj2', 'jz'):
            sql = f"""select sum(a.item_count),sum(a.problem_count),round(sum(a.problem_count)/sum(a.item_count)*100,2)
                        from check_result_{company} a,
                        (
                            select max(a.check_version) check_version
                            from check_result_{company} a,dim_date b where DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
                            and b.year={year}
                            and b.quarter={quarter}
                            and b.month={month}
                            and b.day={day}
                        ) b
                        where a.check_version=b.check_version
                        and a.risk_market_item='是'"""
            curs.execute (sql)
            result = curs.fetchone()
            data.append([company, result[0], result[1], result[2]])
        return JsonResponse(data, safe=False)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()
        
        
@require_http_methods(['GET'])
def data_overview_company_trend(request):
    """
    统计风险集市相关 各公司 检核数据量、问题数据量、问题数据占比
    :param request:
    :return:
    """
    year = request.GET.get('year')
    month = request.GET.get('month')
    day = request.GET.get('day')
    company = request.GET.get('company')
    
    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        sql = f"""select round(sum(problem_count)/sum(item_count)*100,2),check_version
                    from check_result_{company}
                    where risk_market_item='是'
                    and check_date < date_add('{year}-{month}-{day}',interval 1 day)
                    group by check_version
                    order by check_version asc"""
        curs.execute(sql)
        result = curs.fetchall()
        result = [r[0] for r in result]
        return JsonResponse(result, safe=False)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close() 


@require_http_methods(['GET'])
def total_trend(request):
    """
    显示集团总问题占比走势
    :param request:
    :return:
    """
    value = []
    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        sql = f"""select DATE_FORMAT(a.check_date,'%Y-%m-%d'),
                        round(sum(a.problem_count)/sum(a.item_count)*100,2),
                        count(distinct company) from
                (
                select 'xt' company,item_count,problem_count,check_date from check_result_xt where risk_market_item='是'
                union
                select 'zc' company,item_count,problem_count,check_date from check_result_zc where risk_market_item='是'
                union
                select 'db' company,item_count,problem_count,check_date from check_result_db where risk_market_item='是'
                union
                select 'jk' company,item_count,problem_count,check_date from check_result_jk where risk_market_item='是'
                union
                select 'jj1' company,item_count,problem_count,check_date from check_result_jj1 where risk_market_item='是'
                union
                select 'jj2' company,item_count,problem_count,check_date from check_result_jj2 where risk_market_item='是'
                union
                select 'jz' company,item_count,problem_count,check_date from check_result_jz where risk_market_item='是'
                ) a
                group by DATE_FORMAT(a.check_date,'%Y-%m-%d')
                having count(distinct company)=7
                order by 1 asc"""
        curs.execute(sql)
        result = curs.fetchall()
        return JsonResponse({'datatime': [r[0] for r in result], 'value': [r[1] for r in result]}, safe=False)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close() 
        

@require_http_methods(['GET'])
def subcompany_problem_count(request):
    """
    子公司仪表盘-问题数据项统计
    :param request:
    :return:
    """
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    day = request.GET.get('day')
    company = request.GET.get('company')

    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        # 问题占比 | 问题数据总量 | 问题数据项
        sql = f"""select sum(a.item_count),sum(a.problem_count),a.check_item from (
                    select a.check_item,a.item_count,a.problem_count
                                        from check_result_{company} a,
                                        (
                                            select max(a.check_version) check_version
                                            from check_result_{company} a,dim_date b where DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
                                            and b.year={year}
                                            and b.quarter={quarter}
                                            and b.month={month}
                                            and b.day={day}
                                        ) b
                                        where a.problem_count is not null
                                        and a.problem_count !=0
                                        and a.risk_market_item='是'
                                        and a.check_version=b.check_version
                    ) a
                    group by a.check_item
                    order by 2 desc"""
        curs.execute(sql)
        result = curs.fetchall()
        result_list = [['问题占比', '问题数据总量', '问题数据项'], ]
        for i in result:
            problem_per = (int(i[1]) / int(i[0]))
            problem_per = round(problem_per * 100, 2)
            problem_total = int(i[1])
            item = i[2]
            result_list.append([problem_per, problem_total, item])
        return JsonResponse(result_list, safe=False)
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()



================================================
FILE: api/api_datastandard.py
================================================
from django.http.response import JsonResponse
from django.views.decorators.http import require_http_methods

import sys, MySQLdb

sys.path.insert(0, '..')
from mysite import db_config


def db_query(std_name, std_type):
    conn = db_config.mysql_connect()
    curs = conn.cursor()
    if std_type == 'detail':
        '''
        请求类型:GET

        请求参数:std_name数据标准名

        返回参数:
            id                      主键id
            std_id                  标准编号
            name                    标准名称
            en_name                 标准英文名称
            business_definition     业务定义
            business_rule           业务规则
            std_source              标准来源
            data_type               数据类型
            data_format             数据格式
            code_rule               编码规则
            code_range              编码范围
            code_meaning            编码含义
            business_range          业务范围
            dept                    数据责任部门
            system                  数据使用系统
        '''
        sql = f"""select id,std_id,name,en_name,business_definition,business_rule,std_source,data_type,data_format,
code_rule,code_range,code_meaning,business_range,dept,`system`
from data_standard_detail
where name='{std_name}'"""
        print(sql)
        curs.execute(sql)
        result = curs.fetchone()
        return {
            'std_id': result[1],
            'name': result[2],
            'en_name': result[3],
            'business_definition': result[4],
            'business_rule': result[5],
            'std_source': result[6],
            'data_type': result[7],
            'data_format': result[8],
            'code_rule': result[9],
            'code_range': result[10],
            'code_meaning': result[11],
            'business_range': result[12],
            'dept': result[13],
            'system': result[14],
        }
    elif std_type == 'desc':
        '''
        请求类型:GET

        请求参数:std_name数据标准名

        返回参数:
            id          主键id
            name        标准名称
            content     标准内容    
        '''
        sql = f"select id,name,content from data_standard_desc where name='{std_name}'"
        curs.execute(sql)
        result = curs.fetchone()
        return {
            'name': result[1],
            'content': result[2],
        }
    curs.close()
    conn.close()


# 查询数据标准
@require_http_methods(["GET"])
def query_detail(request):
    std_name = request.GET.get('std_name')
    std_type = request.GET.get('std_type')

    if not all([std_name, std_type]):
        return JsonResponse({'msg': '请求参数缺失', 'code': 3000})

    data = db_query(std_name, std_type)
    return JsonResponse(data)


# 查询数据标准编辑记录
@require_http_methods(["GET"])
def query_update_history(request):
    std_name = request.GET.get('std_name')

    if std_name is None:
        return JsonResponse({'msg': '请求参数缺失', 'code': 3000})

    conn = db_config.mysql_connect()
    curs = conn.cursor()
    sql = f"select username,update_time from data_standard_update_log where std_name='{std_name}' order by update_time desc limit 1"
    if curs.execute(sql) == 1:
        result = curs.fetchone()
        return JsonResponse({'username': result[0], 'last_update_time': str(result[1])})
    else:
        return JsonResponse({'username': None, 'last_update_time': None})


# 更新数据标准
@require_http_methods(["POST"])
def update(request):
    username = request.POST.get('username')
    std_type = request.POST.get('std_type')
    std_name = request.POST.get('std_name')
    en_name = request.POST.get('en_name')
    business_definition = request.POST.get('business_definition')
    business_rule = request.POST.get('business_rule')
    std_source = request.POST.get('std_source')
    data_type = request.POST.get('data_type')
    data_format = request.POST.get('data_format')
    code_rule = request.POST.get('code_rule')
    code_range = request.POST.get('code_range')
    code_meaning = request.POST.get('code_meaning')
    business_range = request.POST.get('business_range')
    dept = request.POST.get('dept')
    system = request.POST.get('system')
    content = request.POST.get('content')

    conn = db_config.mysql_connect()
    curs = conn.cursor()
    curs.execute('set autocommit=0')

    if not all([std_name, std_type]):
        return JsonResponse({'msg': '请求参数缺失', 'code': 3000})

    # post内容与数据库内容对比,如果内容一致则无需update
    orgin_data = db_query(std_name, std_type)

    if std_type == 'desc':
        post_data = {'name': std_name, 'content': content}

        if post_data == orgin_data:
            return JsonResponse({'msg': '内容一致,无需修改', 'code': 1001})
        else:
            try:
                # 把上一版本的数据标准内容存入到日志表
                update_log = str(orgin_data.items() - post_data.items())  # 将被update替换的内容
                sql = f"insert into data_standard_update_log(std_name, username, previous_version) values('{std_name}', '{username}', \"{update_log}\")"
                curs.execute(sql)
                conn.commit()

                # 更新数据标准
                sql = f"update data_standard_desc set name='{std_name}', content='{content}' where name='{std_name}'"
                curs.execute(sql)
                conn.commit()
                curs.close()
                conn.close()
                return JsonResponse({'msg': '修改成功', 'code': 1000})
            except Exception as e:
                return JsonResponse({'msg': e, 'code': 2000})
    elif std_type == 'detail':
        post_data = {
            'name': std_name,
            'en_name': en_name,
            'business_definition': business_definition,
            'business_rule': business_rule,
            'std_source': std_source,
            'data_type': data_type,
            'data_format': data_format,
            'code_rule': code_rule,
            'code_range': code_range,
            'code_meaning': code_meaning,
            'business_range': business_range,
            'dept': dept,
            'system': system,
        }

        if post_data == db_query(std_name, std_type):
            return JsonResponse({'msg': '内容一致,无需修改', 'code': 1001})
        else:
            try:
                # 把上一版本的数据标准内容存入到日志表
                update_log = str(orgin_data.items() - post_data.items())  # 将被update替换的内容
                sql = f"insert into data_standard_update_log(std_name, username, previous_version) values('{std_name}', '{username}', \"{update_log}\")"
                curs.execute(sql)
                conn.commit()

                sql = f"""update data_standard_detail set name = '{std_name}', 
                                                    en_name = '{en_name}',
                                                    business_definition = '{business_definition}', 
                                                    business_rule = '{business_rule}',
                                                    std_source = '{std_source}',
                                                    data_type = '{data_type}',
                                                    data_format = '{data_format}',
                                                    code_rule = '{code_rule}',
                                                    code_range = '{code_range}',
                                                    code_meaning = '{code_meaning}',
                                                    business_range = '{business_range}',
                                                    dept = '{dept}',
                                                    `system` = '{system}'
                    where name='{std_name}'"""
                curs.execute(sql)
                conn.commit()
                curs.close()
                conn.close()
                return JsonResponse({'msg': '修改成功', 'code': 1000})
            except Exception as e:
                return JsonResponse({'msg': str(e), 'code': 2000})


# 获取数据标准目录
@require_http_methods(["GET"])
def query_index(request):
    conn = db_config.mysql_connect()
    curs = conn.cursor()

    sql = "select idx_id, idx_pid,idx_name,is_open from data_standard_index"
    curs.execute(sql)
    result = curs.fetchall()

    data = []
    for i in result:
        data.append({
            'id': i[0],
            'pId': i[1],
            'name': i[2],
            't': i[2],
            'open': i[3]
        })

    curs.close()
    conn.close()
    return JsonResponse(data, safe=False)


================================================
FILE: api/api_date.py
================================================
from django.http.response import HttpResponse, JsonResponse
from django.views.decorators.http import require_http_methods

import datetime
import math

import sys
sys.path.insert(0, '..')
from mysite import db_config
from utils import functions as f

@require_http_methods(['GET'])
def year_list(request):
    '''查询已有检核结果的年份
    '''
    year = f.query_data_year()
    
    if year:
        return JsonResponse({'data': year})
    else:
        return HttpResponse({'获取年份错误'}, status=500)


@require_http_methods(['GET'])
def quarter_list(request):
    '''查询已有检核结果的季度
    '''
    year = request.GET.get('year')
    if not year:
        year = datetime.datetime.now().year

    quarter = f.query_data_quarter(year)
    if quarter:
        return JsonResponse({'data': quarter})
    else:
        return HttpResponse({'获取季度错误'}, status=500)
    

@require_http_methods(['GET'])
def month_list(request):
    '''查询已有检核结果的月份
    '''
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    if not all((year, quarter)):
        year = year or datetime.datetime.now().year
        quarter = quarter or math.ceil(datetime.datetime.now().month/3.)

    month = f.query_data_month(year, quarter)
    if month:
        return JsonResponse({'data': month})
    else:
        return HttpResponse({'获取月份错误'}, status=500)


@require_http_methods(['GET'])
def day_list(request):
    '''查询已有检核结果的天
    '''
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    if not all((year, quarter, month)):
        year = year or datetime.datetime.now().year
        quarter = quarter or math.ceil(datetime.datetime.now().month/3.)
        month = month or datetime.datetime.now().month

    day = f.query_data_day(year, quarter, month)
    if day:
        return JsonResponse({'data': day})
    else:
        return HttpResponse({'获取天错误'}, status=500)

================================================
FILE: api/api_files.py
================================================
import os

from django.http import Http404, FileResponse
from django.utils.encoding import escape_uri_path


def download(request):
    filename = request.GET.get('filename')
    file_path = '/data/pyweb/data-quality/static/files/' + filename
    ext = os.path.basename(file_path).split('.')[-1].lower()
    # 禁止请求含有py、db、sqlite3关键字的文件名
    if ext not in ['py', 'db', 'sqlite3']:
        response = FileResponse(open(file_path, 'rb'))
        response['content_type'] = "application/octet-stream"
        response[
            'Content-Disposition'] = "attachment; filename*=utf-8''{}".format(
                escape_uri_path(filename))
        print(response['Content-Disposition'])
        return response
    else:
        raise Http404

================================================
FILE: api/api_quality.py
================================================
from django.http.response import JsonResponse
from django.views.decorators.http import require_http_methods

import sys

sys.path.insert(0, '..')
from mysite import db_config


@require_http_methods(['GET'])
def quality_detail(request):
    """
    查询给定日期的检核明细结果,返回最新版本数据
    """
    company = request.GET.get('company')
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    day = request.GET.get('day')
    
    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        sql  = f"""select id,
				source_system,
				check_item,
				target_table,
				risk_market_item,
				problem_type,
				check_sql,
				item_count,
				problem_count,
				concat(problem_per,'%'),
				note,
				check_date
				from check_result_{company} a,
				(
					select max(a.check_version) check_version
					from check_result_{company} a,dim_date b where DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
					and b.year={year}
					and b.quarter={quarter}
					and b.month={month}
					and b.day={day}
				) b
				where a.risk_market_item='是'
				and a.check_version=b.check_version
				order by id asc"""
        curs.execute(sql)
        result = curs.fetchall()
        
        result_list = []
        for i in result:
            result_dict = {"id": i[0], "source_system": i[1], "check_item": i[2], "target_table": i[3], "risk_market_item": i[4],
                           "problem_type": i[5], "check_sql": i[6], "item_count": i[7], "problem_count": i[8], "problem_per": i[9],
                           "note": i[10], "check_date": i[10]}
            result_list.append(result_dict)
        return JsonResponse({'data': result_list})
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()
        
        
@require_http_methods(['GET'])
def report_detail(request):
    """
    查询给定日期,各公司的检核明细结果,返回最新版本数据
    """
    company = request.GET.get('company')
    year = request.GET.get('year')
    quarter = request.GET.get('quarter')
    month = request.GET.get('month')
    day = request.GET.get('day')
    
    try:
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        sql  = f"""select a.check_item,a.problem_type,a.problem_count,a.item_count,concat(a.problem_per,'%') problem_per 
                    from check_result_{company} a,
                    (
                        select max(a.check_version) check_version
                        from check_result_{company} a,dim_date b where DATE_FORMAT(a.check_date,'%Y%m%d') = b.day_id
                        and b.year={year}
                        and b.quarter={quarter}
                        and b.month={month}
                        and b.day={day}
                    ) b
                    where a.risk_market_item='是'
                    and a.check_version=b.check_version
                    and (a.problem_count<>0 or a.problem_count is null)
                    order by a.problem_type,a.problem_count desc"""
        curs.execute(sql)
        result = curs.fetchall()
        
        result_list = []
        for i in result:
            result_dict = {"check_item": i[0],
                           "problem_type": i[1],
                           "problem_count": i[2],
                           "item_count": i[3],
                           "problem_per": i[4],
                           }
            result_list.append(result_dict)
        return JsonResponse({'data': result_list})
    except Exception as e:
        print(e)
        return JsonResponse({'msg': str(e)})
    finally:
        curs.close()
        conn.close()

================================================
FILE: api/apps.py
================================================
from django.apps import AppConfig


class ApiConfig(AppConfig):
    name = 'api'


================================================
FILE: api/models.py
================================================
from django.db import models

# Create your models here.


================================================
FILE: api/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: api/views.py
================================================
from django.shortcuts import render

# Create your views here.


================================================
FILE: authorize/__init__.py
================================================


================================================
FILE: authorize/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: authorize/apps.py
================================================
from django.apps import AppConfig


class AuthorizeConfig(AppConfig):
    name = 'authorize'


================================================
FILE: authorize/models.py
================================================
from django.db import models

# Create your models here.


================================================
FILE: authorize/templates/authorize/login.html
================================================
<!DOCTYPE html>
<html lang="zh-cmn-Hans">

<head>
    <meta charset="UTF-8">
    <meta content="IE=edge" http-equiv="X-UA-Compatible">
    <meta content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no, width=device-width" name="viewport">
    <!-- <meta name="theme-color" content="#3f51b5"> -->
    <title>数据质量管理平台</title>

    <link href="https://cdn.bootcss.com/twitter-bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
    <link href="/static/css/material-dash.css" rel="stylesheet">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
    <link href="https://cdn.bootcss.com/materialize/1.0.0/css/materialize.min.css" rel="stylesheet">

    <link rel="shortcut icon" href="/static/img/favicon.ico" type="image/x-icon" />
    <link href="/static/css/login.css" rel="stylesheet">

    <style>
        .nav>li>a {
            padding-top: unset !important;
            padding-bottom: unset !important;
        }
        nav i, nav [class^="mdi-"], nav [class*="mdi-"], nav i.material-icons {
            display: unset;
        }
        input[type="checkbox"]:not(:checked), [type="checkbox"]:checked {
            position: unset;
            opacity: unset;
            pointer-events: unset;
        }
    </style>
</head>

<body class="off-canvas-sidebar" onload="Onload();">
    <!-- Begin 背景动画 -->
    <div id="bg">
    </div>
    <!-- End 背景动画 -->

    <nav class="navbar navbar-primary navbar-transparent navbar-absolute">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navigation-example-2">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="/">数据质量管理平台</a>
            </div>
            <div class="collapse navbar-collapse">
                <ul class="nav navbar-nav navbar-right">
                    <li id="home">
                        <a href="/">
                            <i class="material-icons">dashboard</i> 首页
                        </a>
                    </li>
                    <li id="bind-mobile">
                        <a href="#">
                            <i class="material-icons">person_add</i> 绑定手机号
                        </a>
                    </li>
                    <li id="login-page" class="active">
                        <a href="#" onclick="SwitchTab('InputForm');">
                            <i class="material-icons">fingerprint</i> 登录
                        </a>
                    </li>
                    <li id="reset-pwd" class="">
                        <a href="#" onclick="SwitchTab('ResetForm');">
                            <i class="material-icons">verified_user</i> 重置密码
                        </a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="wrapper wrapper-full-page">
        <div class="full-page login-page">
            <div class="content">
                <div class="container">
                    <div class="row">
                        <div class="col-md-4 col-sm-6 col-md-offset-4 col-sm-offset-3">
                            <div class="card card-login">
                                <div class="card-header text-center" data-background-color="rose">
                                    <div class="card-title">
                                        <span>
                                            <!-- <img src="/static/img/logo.png" /> -->
                                            数据质量管理平台
                                        </span>
                                    </div>

                                    <div class="social-line">
                                        <a href="#账号登录" class="btn btn-just-icon btn-simple" onclick="SwitchTab('InputForm');">
                                            <span style="font-size: 14px;">账号登录</span>
                                        </a>
                                    </div>
                                </div>
                                
                                <!-- Begin 账号登录 -->
                                <div class="card-content" id="InputForm">
                                    <div class="input-group" onkeydown="NextElement('username');">
                                        <span class="input-group-addon"><i class="material-icons">face</i></span>
                                        <div class="form-group label-floating">
                                            <label class="control-label">账号名</label>
                                            <input class="form-control" style="cursor: auto;" type="text" id="username" value="admin">
                                            <span class="material-input"></span>
                                        </div>
                                    </div>

                                    <div class="input-group" onkeydown="NextElement('password');">
                                        <span class="input-group-addon"><i class="material-icons">lock_outline</i></span>
                                        <div class="form-group label-floating">
                                            <label class="control-label">密码</label>
                                            <input class="form-control" style="cursor: auto;" type="password" id="password" value="admin">
                                            <span class="material-input"></span>
                                        </div>
                                    </div>

                            
                                    <a id="forget-password" href="javascript:void(0)" onclick="SwitchTab('ResetForm');">忘记密码?</a>
                                </div>
                                <!-- End 账号登录 -->

                                <!-- Begin 重置密码 -->
                                <div class="card-content" id="ResetForm" style="display: none;">
                                    <div class="input-group">
                                        <span class="input-group-addon"><i class="material-icons">phone_iphone</i></span>
                                        <div class="form-group label-floating">
                                            <label class="control-label">手机号</label>
                                            <input class="form-control" style="cursor: auto;" type="text" id="mobile">
                                            <span class="material-input"></span>
                                        </div>
                                    </div>

                                    <div class="input-group" onkeydown="NextElement('send-sms');">
                                        <span class="input-group-addon">
                                            <button id="send-sms" type="button" onclick="SendSMSCode();" class="btn  btn-md">获取验证码</button>
                                        </span>
                                        <div class="form-group label-floating">
                                            <label class="control-label">短信验证码</label>
                                            <input class="form-control" style="cursor: auto;" type="text" id="sms-code">
                                            <span class="material-input"></span>
                                        </div>
                                    </div>

                                    <div class="input-group" onkeydown="NextElement('new-password');">
                                        <span class="input-group-addon"><i class="material-icons">lock_outline</i></span>
                                        <div class="form-group label-floating">
                                            <label class="control-label">新密码</label>
                                            <input class="form-control" style="cursor: auto;" type="password" id="new-password">
                                            <span class="material-input"></span>
                                        </div>
                                    </div>

                                    <a id="forget-password" href="javascript:void(0)" onclick="SwitchTab('InputForm');">返回账号登录</a>
                                </div>
                                <!-- End 重置密码 -->

                                <!-- 登录按钮 -->
                                <div class="text-center">
                                    <button type="button" id="login" onclick="Login();" class="btn btn-rose btn-simple btn-wd btn-lg">登录</button>
                                    <button type="button" id="reset" onclick="ModifyPassword();" class="btn btn-rose btn-simple btn-wd" style="display: none;">重置密码并登陆</button>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        
    </div>
    <footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;color:gray;text-align: right;">
        <div class="footer">
                © 2019-2020 Hyhyhyhyhyhyh
        </div>
    </footer>

    <script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    <script type="text/javascript" src="/static/js/login.js"></script>
    <script type="text/javascript" src="/static/js/sweetalert.min.js"></script>
</body>

</html>

================================================
FILE: authorize/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: authorize/urls.py
================================================
from django.urls import path

from . import views

app_name = 'authorize'
urlpatterns = [
    path('login', views.login, name='login'),
    path('logout', views.logout, name='logout'),
    path('login_auth', views.login_auth, name='login_auth'),
    path('register', views.register, name='register'),
    path('register_auth', views.register_auth, name='register_auth'),
]

================================================
FILE: authorize/views.py
================================================
from django.shortcuts import render, redirect
from django.views.decorators.http import require_http_methods
from django.http.response import JsonResponse


# from ldap3 import Server, Connection, ALL, SUBTREE, ServerPool,ALL_ATTRIBUTES

# 登录页面
def login(request):
    return render(request, "authorize/login.html")


# 登录验证
@require_http_methods(["POST"])
def login_auth(request):
    username = request.POST.get('username')
    password = request.POST.get('password')

    # 普通验证
    if username == 'admin' and password == 'admin':
        request.session['username'] = username
        request.session['is_login'] = True
        if request.POST.get('autologin') == 'on':
                request.session.set_expiry(7*24*60*60)  #session过期时间为7天
        return JsonResponse({'status': 'success'})
    else:
        # user_conn.unbind()
        # conn.unbind()
        return JsonResponse({'status': 'failed'})

    """
    使用openLDAP进行用户身份验证

    server = Server(host='', port=636, use_ssl=True, get_info='ALL')
    # 使用admin登录openldap验证输入的用户名
    ldap_admin_dn = ""
    ldap_admin_password = ""
    conn = Connection(server, user=ldap_admin_dn, password=ldap_admin_password, auto_bind=True,version=3)
    res = conn.search(search_base='',search_filter='(uid={})'.format(username)) #验证表单输入的账号名
    if res:
        entry = conn.response[0]  # 验证账号名及获取用户组织架构
        user_dn = entry['dn']
        user_status = entry['attributes']  #后续增加账号状态验证
        # 验证密码
        user_conn = Connection(server, user=user_dn, password=password, auto_bind=False,version=3)
        if user_conn.bind() is True:
            #验证通过
            user_conn.unbind()
            conn.unbind()
            
            if request.POST.get('autologin')=="1":
                request.session.set_expiry(7*24*60*60)  #session过期时间为7天
            request.session['username']=username
            request.session['is_login']=True
            return redirect('../../data/index')
        else:
            user_conn.unbind()
            conn.unbind()
            alert = "<script>alert ('密码输入不正确');window.location.href='login';</script>"
            return render(request, 'authorize/login.html',{'alert':alert})
    else:
        conn.unbind()
        alert = "<script>alert ('账号名输入不正确');window.location.href='login';</script>"
        return render(request, 'authorize/login.html',{'alert':alert})
    """


def logout(request):
    request.session.clear()
    return render(request, "authorize/login.html")


================================================
FILE: backend/__init__.py
================================================


================================================
FILE: backend/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: backend/apps.py
================================================
from django.apps import AppConfig


class BackendConfig(AppConfig):
    name = 'backend'


================================================
FILE: backend/models.py
================================================
from django.db import models

# Create your models here.


================================================
FILE: backend/templates/backend/crontab.html
================================================
{% include "data/template-ui.html" %}
<link rel="stylesheet" type="text/css" href="/static/css/icons.css" />
<link rel="stylesheet" type="text/css" href="/static/css/fonts.css" />
<link rel="stylesheet" type="text/css" href="/static/css/sweetalert.css" />
<link rel="stylesheet" type="text/css" href="/static/css/switchery.min.css" />

<style>
    .container-fluid {
        padding: 0 10 0;
    }

    .page-wrapper {
        padding-bottom: 20px;
    }

    .page-wrapper {
        min-height: 600px !important;
    }

    .table {
        font-size: 13px;
    }
    .table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th {
        line-height: unset;
    }
    tbody tr td {
        text-align: left;
    }
    
    h6 {
        color: rgb(0,128,82);
    }

    .btn {
        margin-top: -3px;
        margin-left: 1px;
        background-color: #4680ff;
        color: aliceblue;
    }
    .btn:hover, .btn:focus {
        color:aliceblue;
    }
</style>

<div class="page-wrapper">
    <div class="container-fluid animated fadeInUp">
        <div class="row">
            <div class="card col-12">
                <div class="card-title">
                    <h4 class="text-primary">后台任务 - 调度信息</h4>
                </div>

                <div class="card-content">
                    <table class="table table-hover">
                        <thead>
                            <td>任务名</td>
                            <td>任务内容</td>
                            <td>启用状态</td>
                            <td>调度周期</td>
                            <td># 操作</td>
                        </thead>
                        <tbody>
                        {% for i in jobs %}
                            <tr>
                                <!-- 任务名 -->
                                <td>{{ i.0 }}</td>

                                <!-- 任务内容 -->
                                <td>{{ i.1 }}</td>

                                <!-- 启用状态 -->
                                <td>
                                    {% if i.2 == True %}
                                    <input job_name="{{ i.0 }}" type="checkbox" class="js-switch" checked/>
                                    {% elif i.2 == False %}
                                    <input job_name="{{ i.0 }}" type="checkbox" class="js-switch"/>
                                    {% endif %}
                                </td>
                                
                                <!-- 调度周期 -->
                                <td>{{ i.3 }}</td>

                                <!-- 操作 -->
                                <td>
                                    <button job_name="{{ i.0 }}" onclick="ExecJob(this);" class="btn btn-xs btn-check" type="button">
                                        <i class="im-rocket"></i>&nbsp;&nbsp;立即执行>>
                                    </button>
                                </td>
                            </tr>
                        {% endfor%}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>

<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div class="footer">
        © 2019-2020 Hyhyhyhyhyhyh
    </div>
</footer>


<!-- 设置头像 / 设置日期 -->
<script src="/static/js/init.js"></script>

<script src="/static/js/sweetalert.min.js"></script>
<script src="/static/js/switchery.min.js"></script>

<script>
    var elems = Array.prototype.slice.call(document.querySelectorAll('.js-switch'));

    elems.forEach(function(html) {
        var switchery = new Switchery(html, { size: 'small' });

        html.onchange = function(e) {
            var obj = $(this);
            var job_name = obj.attr('job_name');
            var enable;

            if (obj.is(':checked')) {
                enable = true;
            } else {
                enable = false;
            }

            // 修改定时任务启用状态
            $.ajax({
                url: '../../api/backend/crontab/enable',
                type: 'POST',
                data:{
                    "enable": enable,
                    "job_name": job_name,
                },
                success: function (data) {
                    if (data.msg == 'success') {
                        return true
                    }
                    else {
                        swal({
							title: "发生错误",
                            icon: "error",
                            buttons: false,
							timer: 1000
						});
                    }
                },
                error: function (e) {
                    swal({
                        title: "发生错误",
                        icon: "error",
                        buttons: false,
                        timer: 1000
                    });
                }
            })
          }
    });

    function ExecJob(obj){
        var job_name = obj.attributes.job_name.value;
        obj.disabled = true;
        
        // 手工触发定时任务
        $.ajax({
            url: '../../api/backend/crontab/run',
            type: 'POST',
            data:{
                "job_name": job_name,
            },
            success: function (data) {
                if (data.msg == 'success') {
                    obj.disabled = false;
                    swal({
                        title: job_name + "  执行完成",
                        icon: "success",
                        timer: 1000
                    });
                }
                else {
                    swal({
                        title: "发生错误",
                        icon: "error",
                        buttons: false,
                        timer: 1000
                    });
                }
            },
            error: function (e) {
                swal({
                    title: "发生错误",
                    icon: "error",
                    buttons: false,
                    timer: 1000
                });
            }
        })
    }
</script>

</body>

</html>

================================================
FILE: backend/templates/backend/database.html
================================================
{% include "data/template-ui.html" %}
<link rel="stylesheet" type="text/css" href="/static/css/icons.css" />
<style>
    table {
        border-collapse: collapse;
        width: 100%;
        font-size: 13px;
    }
    .table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th {
        line-height: unset;
        vertical-align: middle;
    }
</style>

<div class="page-wrapper">
    <!-- 标题 -->
    <div class="row page-titles">
        <div class="col-md-1 align-self-center">
            <h3 class="text-primary" style="font-family: 'Open Sans', sans-serif;">数据源</h3>
        </div>

        <div class="col-md-7">
            <a href="../backend/database/add" target="_blank" class="btn btn-primary"><i class="im-plus-circle"></i> 添加数据源</a>
        </div>

        <div class="col-md-4 align-self-center">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="../../data/dashboard/">主页</a></li>
                <li class="breadcrumb-item active">数据源</li>
            </ol>
        </div>
    </div>

    <div class="container-fluid">
        <div class="row">
            <div class="col-md-12">
                <div class="card" id="page-content">
                    <div class="table-responsive">
                        <table class="table table-hover overview_table">
                            <thead>
                                <tr>
                                    <th>所属公司</th>
                                    <th>#</th>
                                    <th>类型</th>
                                    <th>源系统名</th>
                                    <th>连接串</th>
                                    <th>说明</th>
                                    <th>详情</th>
                                </tr>
                            </thead>
                            <tbody id="database">
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<!-- footer -->
<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div class="footer">
        © 2019-2020 Hyhyhyhyhyhyh
    </div>
</footer>
</div>


<!-- 设置头像 / 设置日期 -->
<script src="/static/js/init.js"></script>

<script>
    $.ajax({
        type : "GET",
        async : true,
        url : "../../api/backend/database/query",    
        data: {},
        dataType : "json",
        success : function(result) {
            let tab = document.getElementById("database");
            let html = "";
            for(let i in result.data.company){
                html += "<tr>";
                html += "<td>" + result.data.company[i] + "</td>";
                html += '<td><img src="../../static/icons/db-icons/'+ result.data.db_type[i] +'.svg" style="height:25px;width:40px;"></img></td>';
                html += "<td>" + result.data.db_type[i] + "</td>";
                html += "<td>" + result.data.alias[i] + "</td>";
                html += "<td>" + result.data.connection_string[i] + "</td>";
                if(result.data.note[i] == null){
                    html += "<td></td>";
                }
                else{
                    html += "<td>" + result.data.note[i] + "</td>";
                }
                html += '<td><a href="../backend/database/detail?id='+ result.data.rowid[i] +'" target="_blank" style="color:#1779ba;">详情</a></td>';
                html += "</tr>";
            }
            tab.innerHTML = html;
        },
    })
</script>

</body>

</html>

================================================
FILE: backend/templates/backend/database_add.html
================================================
<!DOCTYPE html>
<html lang="zh-cmn-Hans">

<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<!-- Tell the browser to be responsive to screen width -->
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta name="description" content="">
	<meta name="author" content="">
	<link rel="icon" type="image/png" sizes="16x16" href="/static/img/favicon.ico" />
	<title>数据质量检核平台</title>


	<link rel="stylesheet" type="text/css" href="/static/check/css/admin/bootstrap.min.css" />
	<link rel="stylesheet" type="text/css" href="/static/check/css/admin/style.css" />
	<link rel="stylesheet" type="text/css" href="/static/css/icons.css" />

	<link rel="stylesheet" type="text/css" href="/static/css/sweetalert.css" />

	<style>
        .table {
            color:black;
        }
        .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td {
            vertical-align: middle;
            text-align: center;
        }
        .ibox-tools{
            float: unset;
        }
        .ibox-title h5{
            margin: unset;
            padding-top: 8px;
            margin-right: 30px;
        }
        .table-hover>tbody>tr:hover {
            background-color: aliceblue;
        }
	</style>
</head>

<body>
	<div class="tnav row wrapper border-bottom white-bg page-heading">
		<div class="col-sm-4">
			<h2 class="fl" style="color: #007bff;font-size: 21px;font-weight:500">新增数据源</h2>
			<ol class="breadcrumb fl">
				<li><a href="../../data/dashboard/">主页</a></li>
				<li><strong>新增数据源</strong></li>
			</ol>
		</div>
	</div>

	<div class="row col-lg-8">
		<div class="wrapper wrapper-content">
			<div class="ibox">
				<div class="ibox-content">
                    <table class="table table-hover overview_table">
                        <tbody>
                            <tr>
                                <td style="width: 130px;">公司简称</td>
                                <td><input id="company" type="text" class="form-control" required></input></td>
                            </tr>
                            <tr>
                                <td>所属公司</td>
                                <td><input id="name" type="text" class="form-control" required></input></td>
                            </tr>
                            <tr>
                                <td>源系统名称</td>
                                <td><input id="alias" type="text" class="form-control" required></input></td>
                            </tr>
                            <tr>
                                <td>数据库类型</td>
                                <td style="text-align: left;">
                                    <select id="db_type">
                                        <option value=""></option>
                                        <option value="mysql">mysql</option>
                                        <option value="oracle">oracle</option>
                                        <option value="sqlserver">sqlserver</option>
                                        <option value="postgresql">postgresql</option>
                                    </select>
                                </td>
                            </tr>
                            <tr>
                                <td>IP</td>
                                <td><input id="ip" type="text" class="form-control"></td>
                            </tr>
                            <tr>
                                <td>端口号</td>
                                <td><input id="port" type="text" class="form-control"></td>
                            </tr>
                            <tr>
                                <td>数据库名/实例名</td>
                                <td><input id="db" type="text" class="form-control"></td>
                            </tr>
                            <tr>
                                <td>数据库用户</td>
                                <td><input id="user" type="text" class="form-control"></td>
                            </tr>
                            <tr>
                                <td>密码</td>
                                <td><input id="password" type="password" class="form-control" value=""></td>
                            </tr>
                            <tr>
                                <td>字符集</td>
                                <td><input id="charset" type="text" class="form-control"></td>
                            </tr>
                            <tr>
                                <td>备注说明</td>
                                <td><input id="note" type="text" class="form-control"></td>
                            </tr>

                            <tr>
                                <td colspan="2">
                                    <button onclick="Commit();" class="btn btn-primary"><i class="im-checkmark"></i> 提交修改</button>
                                </td>
                            </tr>
                        </tbody>
                    </table>
				</div>
			</div>
		</div>
	</div>

    <footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
		<div class="footer">
			© 2019-2020 Hyhyhyhyhyhyh
		</div>
	</footer>

	<script type="text/javascript" src="/static/js/jquery/jquery.min.js"></script>
	<script type="text/javascript" src="/static/js/bootstrap/js/bootstrap.min.js"></script>
	<script type="text/javascript" src="/static/js/sweetalert.min.js"></script>

	<script>
        function Commit(){
            var company = document.getElementById("company");
            var name = document.getElementById("name");
            var alias = document.getElementById("alias");
            var ip = document.getElementById("ip");
            var user = document.getElementById("user");
            var password = document.getElementById("password");
            var db = document.getElementById("db");
            var port = document.getElementById("port");
            var db_type = document.getElementById("db_type");
            var note = document.getElementById("note");

            var db_type_value = db_type[db_type.selectedIndex].value;

            // 判断数据源信息是否存在空值,存在空值则出现提示
            var obj_id = ["company", "name", "alias", "ip", "user", "password", "db", "port"];
            var objs = [company, name, alias, ip, user, password, db, port];
            var null_cnt = 0;
            for(let i in objs){
                if (objs[i].value == null || objs[i].value.length == 0){
                    document.getElementById(obj_id[i]).style.borderBottomColor = "#ff0000";
                    null_cnt += 1;
                }
                else{
                    objs[i].value = objs[i].value.trim();
                }
            }
            if(db_type_value.length == 0){
                db_type.style.borderBottomColor = "#ff0000";
            }
            if(null_cnt > 0){
                swal({
                    text: "存在空值!",
                    icon: "error",
                    buttons: false,
                    timer: 1000
                });
                return;
            }
            
            //更新数据库
            $.ajax({
                type: "POST",
                url: "../../api/backend/database/insert",
                data: {
                    company: company.value,
                    name: name.value,
                    alias: alias.value,
                    ip: ip.value,
                    user: user.value,
                    password: password.value,
                    db: db.value,
                    port: port.value,
                    db_type: db_type_value,
                    note: note.value
                },
                success: function (data) {
                    console.log(data);
                    swal({
                            text: "数据源新增成功...",
                            icon: "success",
                            buttons: false,
                            timer: 1000
                        }).then(function(){
                            window.history.back(-1) || window.close();
                        });
                },
                error: function (e) {
                    swal({
                        title: "发生错误",
                        text: e,
                        icon: "error",
                    })
                }
            })
        };
    </script>

</body>

</html>

================================================
FILE: backend/templates/backend/database_detail.html
================================================
<!DOCTYPE html>
<html lang="zh-cmn-Hans">

<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<!-- Tell the browser to be responsive to screen width -->
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta name="description" content="">
	<meta name="author" content="">
	<link rel="icon" type="image/png" sizes="16x16" href="/static/img/favicon.ico" />
	<title>数据质量检核平台</title>


	<link rel="stylesheet" type="text/css" href="/static/check/css/admin/bootstrap.min.css" />
	<link rel="stylesheet" type="text/css" href="/static/check/css/admin/style.css" />
	<link rel="stylesheet" type="text/css" href="/static/css/fonts.css" />
	<link rel="stylesheet" type="text/css" href="/static/css/icons.css" />

	<link rel="stylesheet" type="text/css" href="/static/css/sweetalert.css" />

	<style>
        .table {
            color:black;
        }
        .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td {
            vertical-align: middle;
        }
        .ibox-tools{
            float: unset;
        }
        .ibox-title h5{
            margin: unset;
            padding-top: 8px;
            margin-right: 30px;
        }
	</style>
</head>

<body>
	<!-- head star -->
	<div class="tnav row wrapper border-bottom white-bg page-heading">
		<div class="col-sm-4">
			<h2 class="fl" style="color: #007bff;font-size: 21px;font-weight:500">数据源:{{ db }} 详情</h2>
			<ol class="breadcrumb fl">
				<li><a href="../../data/dashboard/">主页</a></li>
				<li><strong>数据源详情</strong></li>
			</ol>
		</div>
	</div>
	<!-- head end -->

	<!-- table star -->
	<div class="row col-lg-8">
		<div class="wrapper wrapper-content">
			<div class="ibox">
				<div class="ibox-title">
					<h5>{{ name }}公司 - {{ db }}数据库 - 详情</h5>
					<div class="ibox-tools rboor">
                        <button class="btn btn-primary" onclick="Commit();"><i class="im-checkmark"></i> 提交修改</button>
					</div>
				</div>

				<div class="ibox-content">
                    <table class="table table-hover overview_table">
                        <tbody>
                            <tr>
                                <td style="width: 130px;">公司简称</td>
                                <td>{{ company }}</td>
                            </tr>
                            <tr>
                                <td>所属公司</td>
                                <td>{{ name }}</td>
                            </tr>
                            <tr>
                                <td>源系统名称</td>
                                <td>{{ alias }}</td>
                            </tr>
                            <tr>
                            <tr>
                                <td>数据库类型</td>
                                <td>
                                    <select id="db_type" class="selectpicker">
                                        <option>-- 请选择 --</option>
                                        <option value="mysql">mysql</option>
                                        <option value="oracle">oracle</option>
                                        <option value="sqlserver">sqlserver</option>
                                        <option value="postgresql">postgresql</option>
                                    </select>
                                </td>
                            </tr>
                            <tr>
                                <td>IP</td>
                                <td><input id="ip" type="text" class="form-control" value='{{ ip|default_if_none:"" }}' required="required"></td>
                            </tr>
                            <tr>
                                <td>端口号</td>
                                <td><input id="port" type="text" class="form-control" value='{{ port|default_if_none:"" }}' required="required"></td>
                            </tr>
                            <tr>
                                <td>数据库名/实例名</td>
                                <td><input id="db" type="text" class="form-control" value='{{ db|default_if_none:"" }}' required="required"></td>
                            </tr>
                            <tr>
                                <td>数据库用户</td>
                                <td><input id="user" type="text" class="form-control" value='{{ user|default_if_none:"" }}' required="required"></td>
                            </tr>
                            <tr>
                                <td>密码</td>
                                <td><input id="password" type="password" class="form-control" value="" required="required"></td>
                            </tr>
                            <tr>
                                <td>字符集</td>
                                <td><input id="charset" type="text" class="form-control" value='{{ charset|default_if_none:"" }}' required="required"></td>
                            </tr>
                            <tr>
                                <td>备注说明</td>
                                <td><input id="note" type="text" class="form-control" value='{{ note|default_if_none:"" }}' required="required"></td>
                            </tr>
                        </tbody>
                    </table>
				</div>
			</div>
		</div>
	</div>
	<!-- table end -->
	<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
		<div class="footer">
			© 2019-2020 Hyhyhyhyhyhyh
		</div>
	</footer>

	<script type="text/javascript" src="/static/js/jquery/jquery.min.js"></script>
	<script type="text/javascript" src="/static/js/bootstrap/js/bootstrap.min.js"></script>
	<script type="text/javascript" src="/static/js/sweetalert.min.js"></script>

	<script>
        function Commit(){
            var ip = document.getElementById("ip");
            var user = document.getElementById("user");
            var password = document.getElementById("password");
            var db = document.getElementById("db");
            var port = document.getElementById("port");
            var db_type = document.getElementById("db_type");
            var note = document.getElementById("note");

            // 判断数据源信息是否存在空值,存在空值则出现提示
            var obj_id = ["ip", "user", "password", "db", "port", "db_type"];
            var objs = [ip, user, password, db, port, db_type];
            var null_cnt = 0;
            for(let i in objs){
                console.log(obj_id[i], objs[i].value);
                if (objs[i].value == null || objs[i].value.length == 0){
                    document.getElementById(obj_id[i]).style.borderBottomColor = "#ff0000";
                    null_cnt += 1;
                }
            }
            if(null_cnt > 0){
                swal({
                    text: "存在空值!",
                    icon: "error",
                    buttons: false,
                    timer: 1000
                });
                return;
            }

            swal({
                text: "是否确定更新数据源信息?修改操作可能会导致检核任务失败",
                icon: "warning",
                buttons: ["取消", "确定"],
                dangerMode: true,
              })
              .then((value) => {
                  //更新数据库
                    $.ajax({
                        type: "POST",
                        url: "../../api/backend/database/update",
                        data: {
                            id: "{{ id }}",
                            ip: ip.value,
                            user: user.value,
                            password: password.value,
                            db: db.value,
                            port: port.value,
                            db_type: db_type.value,
                            note: note.value
                        },
                        success: function (data) {
                            console.log(data);
                            swal({
                                    text: "数据源更新成功...",
                                    icon: "success",
                                    buttons: false,
                                    timer: 1000
                                }).then(function(){
                                    window.history.back(-1) || window.close();
                                });
                        },
                        error: function (e) {
                            swal({
                                title: "发生错误",
                                text: e,
                                icon: "error",
                            })
                        }
                    })
              });
        };
	</script>

</body>

</html>

================================================
FILE: backend/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: backend/views.py
================================================
import re
import pandas as pd
from django.shortcuts import render
from django.http.response import HttpResponseBadRequest
from crontab import CronTab

from mysite import db_config
from utils.functions import is_login


@is_login
def database(request):
    """列出数据源
    """
    return render(request, "backend/database.html")


@is_login
def database_detail(request):
    """查看数据源详情
    """
    id = request.GET.get('id')
    
    try:
        conn = db_config.sqlalchemy_conn()
        db = pd.read_sql(f"select company,name,alias,ip,user,db,port,db_type,charset,note from source_db_info where id={id}", con=conn)
        return render(request, "backend/database_detail.html", {
                                                            'company': db['company'].values.tolist()[0],
                                                            'name': db['name'].values.tolist()[0],
                                                            'alias': db['alias'].values.tolist()[0],
                                                            'ip': db['ip'].values.tolist()[0],
                                                            'user': db['user'].values.tolist()[0],
                                                            'db': db['db'].values.tolist()[0],
                                                            'port': db['port'].values.tolist()[0],
                                                            'db_type': db['db_type'].values.tolist()[0],
                                                            'charset': db['charset'].values.tolist()[0],
                                                            'note': db['note'].values.tolist()[0],
                                                            'id': id
                                                        })
    except Exception as e:
        return HttpResponseBadRequest(content=e)
    finally:
        conn.dispose()


@is_login
def database_add(request):
    """新增数据源
    """
    return render(request, "backend/database_add.html")


@is_login
def crontab(request):
    """列出后台管理的定时任务
    """
    data = []
    cron = CronTab(user=True)
    job = list(cron.find_comment(re.compile(r'backend')))
    if job:
        for i in job:
            enable = i.is_enabled()
            job_time = i.description(use_24hour_time_format=True, locale_code='zh_CN') # 获取crontab的度周期
            comment = i.comment
            command = i.command
            data.append([comment, command, enable, job_time])
            return render(request, "backend/crontab.html", {"jobs": data})
    else:
        return render(request, "backend/crontab.html", {"jobs": None})
    

================================================
FILE: blood/__init__.py
================================================


================================================
FILE: blood/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: blood/apps.py
================================================
from django.apps import AppConfig


class BloodConfig(AppConfig):
    name = 'blood'


================================================
FILE: blood/models.py
================================================
from django.db import models

# Create your models here.


================================================
FILE: blood/templates/blood/analyze.html
================================================
{% include "data/template-ui.html" %}
<style>
    a.active, button.active, a:focus, button:focus, a:hover, button:hover {
        color: white;
    }
    table {
        border-collapse: collapse;
        width: 100%;
        font-size: 13px;
    }
    .table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th {
        line-height: unset;
        vertical-align: middle;
    }
</style>

<!-- 正文主体 -->
<div class="page-wrapper">
    <!-- 标题 -->
    <div class="row page-titles">
        <div class="col-md-8 align-self-center">
            <h3 class="text-primary" id="page_title">血缘分析</h3>
        </div>

        <div class="col-md-4 align-self-center">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="../../data/dashboard/">主页</a></li>
                <li class="breadcrumb-item active">血缘分析</li>
            </ol>
        </div>
    </div>
    
    <div class="container-fluid">
        <div class="row">
            <div class="col-lg-12">
                <div class="card">
                    <div class="row">
                        <div class="col-md-4">
                            <input id="table_name" placeholder="输入关键词:表名、mapping名" class="form-control" />
                        </div>
                        <div class="col-md-4">
                            <button class="btn btn-info" onclick="QueryMapping();"><i class="fa fa-search"></i> 查询</button>
                        </div>
                    </div>
    
                    <div class="row" style="padding-top:30px;">
                        <div class="col-md-12">
                            <div class="table-responsive">
                                <table class="table table-hover">
                                    <thead>
                                        <tr>
                                            <th>文件夹</th>
                                            <th>映射名称</th>
                                            <th>源表</th>
                                            <th>目标表</th>
                                        </tr>
                                    </thead>
                                    <tbody id="mapping_info">
                                    </tbody>
                                </table>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <div class="row">
            <div class="col-md-12">
                <div id="chart1" class="card" style="height: 300px;"></div>
            </div>
        </div>
    </div>
</div>

<!-- footer -->
<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div class="footer">
        © 2019-2020 Hyhyhyhyhyhyh
    </div>
</footer>

</div>


<!-- 设置头像 -->
<script src="/static/js/init.js"></script>
<script type="text/javascript" src="/static/js/sweetalert.min.js"></script>

<script>
    function QueryMapping(){
        var table_name = $("#table_name").val();

        if(table_name==undefined || table_name==""){
            table_name = localStorage.getItem("blood_query");
            $("#table_name").attr("placeholder", table_name);
        }
        else{
            localStorage.setItem("blood_query", table_name);
        }

        if(table_name == null || table_name == ''){
            swal({
                text: "不能查询空关键字",
                icon: "warning",
                buttons: false,
                timer: 1000
            });
            return
        }

        $.ajax({
            type : "GET",
            async : false,
            url : "../../api/blood/mapping",    
            data: {
                table_name: table_name
            },
            dataType : "json",
            success : function(result) {
                let tab = document.getElementById("mapping_info");
                let html = "";
                for(let i in result.subject_area){
                    html += "<tr>";
                    html += "<td>" + result.subject_area[i] + "</td>";
                    html += "<td>" + result.mapping_name[i] + "</td>";
                    html += "<td>" + result.source[i] + "</td>";
                    html += "<td>" + result.target[i] + "</td>";
                    html += "</tr>";
                }
                tab.innerHTML = html;

                InitChart(result);
            }
        })
    }

    // 血缘流向 桑基图
    function InitChart(result){
        var data = {
            nodes: [],
            links: []
        }

        var nodes = [];
        var links = [];
        const colors = [null, '#fbb4ae', '#b3cde3', '#ccebc5', '#decbe4'];
        for(let i in result.subject_area){
            nodes.push({
                name: result.source[i],
                itemStyle: {
                    normal: {
                        color: colors[result.level[i]]
                    }
                }
            });
            nodes.push({
                name: result.target[i],
                itemStyle: {
                    normal: {
                        color: colors[result.level[i]+1]
                    }
                }
            });
            links.push({
                source: result.source[i],
                target: result.target[i],
                value: result.mapping_name[i].length,
                mapping: result.mapping_name[i]
            })
        }

        // nodes数组去重
        var l = nodes.length;
        var nodes_uniq = [];
        for(let i=0;i<l;i++){
            for(let j=i+1;j<l;j++){
                if (nodes[i].name === nodes[j].name){
                    i++;
                    j = i;
                }
            }
            nodes_uniq.push(nodes[i]);
        }

        data = {
            nodes: nodes_uniq,
            links: links
        }
        console.log(data);

        // 设置桑基图
        var chart1 = echarts.init(document.getElementById('chart1'));
        chart1.clear();
        chart1.setOption(option = {
            title: {
                text: '血缘流向'
            },
            tooltip: {
                trigger: 'item',
                triggerOn: 'mousemove',
                formatter: function(x){
                    return x.data.mapping;
                }
            },
            animation: false,
            series: [
                {
                    type: 'sankey',
                    focusNodeAdjacency: 'allEdges',
                    nodeAlign: 'left',
                    data: data.nodes,
                    links: data.links,
                    lineStyle: {
                        color: 'source',
                        curveness: 0.5
                    }
                }
            ]
        });
    }

    // 初始化搜索结果,如果未有过血缘分析查询操作,则查询test_table用作展示样例
    function initQuery(){
        var blood_query = localStorage.getItem("blood_query");
        if(blood_query==undefined || blood_query==""){
            $("#table_name").val("test_table");
            $("#table_name").attr("placeholder","test_table");
            localStorage.setItem("blood_query", "test_table");
        }
        QueryMapping();
    }
    initQuery();
</script>

</body>

</html>

================================================
FILE: blood/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: blood/views.py
================================================
from django.shortcuts import render
from utils.functions import is_login


@is_login
def analyze(request):
    """血缘分析"""
    return render(request, "blood/analyze.html") 

================================================
FILE: check/__init__.py
================================================


================================================
FILE: check/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: check/apps.py
================================================
from django.apps import AppConfig


class CheckConfig(AppConfig):
    name = 'check'


================================================
FILE: check/autocheck.py
================================================
import logging
import sys
import threading
import os

sys.path.insert(0, '..')
from mysite import db_config
from utils import functions as f
from sqlalchemy import create_engine


os.environ['NLS_LANG']    = 'AMERICAN_AMERICA.UTF8'
os.environ['ORACLE_HOME'] = '/data/oracle/app/11.2.4'


class Check(object):
    def __init__(self, company):
        self.company = company
        
    def init_table(self):
        """
        类实例化所需参数
        :param company:         公司名
        :param source_system:   源系统名称
        :return:
        初始化检核表
            如果check_result_{0}表存在,则从check_result_template表中插入对应公司检核项和逻辑
            如果check_result_{0}表不存在,则使用check_result_template表作为模板新建
        """
        company = self.company
        
        logging.info('*' * 50)
        logging.info(f'开始初始化检核结果表...check_result_{company}')
        
        conn = db_config.mysql_connect()
        curs = conn.cursor()
        curs.execute('set autocommit=0')
        
        sql = f"select table_name from information_schema.tables where table_schema='data_quality' and table_name='check_result_{company}'"
        table_count = curs.execute(sql)
        try:
            if table_count == 0:    # 表不存在则新建
                sql = f"""create table check_result_{company} as select * from check_result_template
                                                                where company='{company}' order by id,source_system"""
                curs.execute(sql)
            else:                   # 表存在则插入
                # 获取检核版本号
                curs.execute(f"select count(*) from check_execute_log where company='{company}'")
                version = curs.fetchone()[0] + 1
                # 可能存在了初始化完检核表,但是检核失败导致事务回滚,检核表check_version={version}数据项为空的情况,因此需要处理这种情况
                for sql in (
                    f"delete from check_result_{company} where check_version={version}",
                    f"insert into check_result_{company} select * from check_result_template where company='{company}' order by id,source_system",
                    f"update check_result_{company} set check_version={version} where check_version is null",
                ):
                    curs.execute(sql)
                
            conn.commit()
            logging.info('*' * 50, f"初始化 check_result_{company}表 ...完成", '*' * 50)
            return True
        except Exception as e:
            conn.rollback()
            logging.error('!' * 50, f'初始化 check_result_{company}表 ...失败,错误信息:{str(e)}', '!' * 50)
            return False
        finally:
            curs.close()
            conn.close()
    
    def run_check(self, db):
        """
        执行检核
        类实例化所需参数
        :param company: 公司简称
        :param db:      检核的数据库
        :return:
        """
        company = self.company
        
        logging.info('-' * 50)
        logging.info("正在检核" + company + "数据...")

        try:
            conn = db_config.mysql_connect()
            curs = conn.cursor()
            curs.execute('set autocommit=0')

            # 从规则库表中取出检核项和检核sql,只运行“已启用”状态的SQL
            sql = f"""select id,check_sql from check_result_template
                    where company='{company}'
                    and check_sql is not null
                    and check_sql != ''
                    and db='{db}'
                    and status='已启用'
                    order by id"""
            curs.execute(sql)
            check_list = curs.fetchall()
            
            
            # 连接源系统数据库
            curs.execute(f"select connection_string from source_db_info where company='{company}' and alias='{db}'")
            connection_string = curs.fetchone()[0]
            engine = create_engine(
                connection_string,
                echo=False,                     # 打印sql语句
                max_overflow=0,                 # 超过连接池大小外最多创建的连接
                pool_size=5,                    # 连接池大小
                pool_timeout=30,                # 池中没有线程最多等待的时间,否则报错
                pool_recycle=-1,                # 多久之后对线程池中的线程进行一次连接的回收(重置)
            )
            conn_source = engine.raw_connection()
            
            # 获取检核版本号
            curs.execute(f"select count(*) from check_execute_log where company='{company}'")
            version = curs.fetchone()[0] + 1

            with conn_source.cursor() as curs_source:
                # 执行检核
                for i in check_list:
                    id = i[0]
                    check_sql = i[1]
                    logging.info(f'{company}, db={db}, id={i[0]} >>>开始检核')
                    curs_source.execute(check_sql)
                    check_result = curs_source.fetchall()  # 检核结果
                    for t in check_result:
                        item_count = t[0]
                        problem_count = t[1]
                        archive_sql = f"""update check_result_{company}
                                            set item_count={item_count},
                                            problem_count={problem_count},
                                            update_flag='Y',
                                            check_date=current_timestamp
                                            where id={id}
                                            and check_version={version}"""
                        curs.execute(archive_sql)
                        conn.commit()
                    logging.info(f'{company}, db={db}, id={i[0]} <<<完成')
            conn_source.close()

            # 根据检核结果明细计算问题占比
            self.calc_result(version)
            
            logging.info("-" * 25, f'{company}, db={db} 检核完成', "-" * 25)
            return True
        except Exception as e:
            conn.rollback()
            logging.error("!" * 25, f'{company}, db={db}, id={id} 检核出错,错误信息:{str(e)}', "!" * 25)
            return False
        finally:
            curs.close()
            conn.close()
            
    def calc_result(self, version):
        """根据检核结果明细计算问题占比
        1. 填充空值的问题占比
        2. 计算正常的问题占比
        
        :param version:     要进行计算的版本号
        :return:            检核成功返回True,失败返回False
        """
        company = self.company
        try:
            conn = db_config.mysql_connect()
            curs = conn.cursor()
            curs.execute('set autocommit=0')
            # 计算问题占比
            # 处理item_count和problem_count都是null或=0的行
            sql = f"""update check_result_{company}
                        set problem_per=100
                        where (item_count is null or item_count=0)
                        and check_version={version}"""
            curs.execute(sql)

            # 计算正常的问题占比
            sql = f"""update check_result_{company} set problem_per=problem_count/item_count*100\
                        where problem_per is null
                        and check_version={version}"""
            curs.execute(sql)
            conn.commit()
            return True
        except Exception as e:
            conn.rollback()
            return False
        finally:
            curs.close()
            conn.close()
    

class MyThread(threading.Thread):
    """重新定义带返回值的线程类"""
    def __init__(self,func,args=()):
        super(MyThread,self).__init__()
        self.func = func
        self.args = args
    def run(self):
        self.result = self.func(*self.args)
    def get_result(self):
        try:
            return self.result
        except Exception:
            return None

================================================
FILE: check/crontab_autocheck.py
================================================
import requests, datetime, math, threading

quarter = str(datetime.datetime.now().year)+"Q"+str(math.ceil(datetime.datetime.now().month/3.))
url = "http://dataquality.utrustfintech.com/check/rule_execute"

def post_rule_execute(company, quarter):
    data = {'company': company, 'username': 'crontab', 'quarter': quarter}
    r = requests.post(url, data)

t1 = threading.Thread(target=post_rule_execute, args=('ycxt', quarter))
t2 = threading.Thread(target=post_rule_execute, args=('yczc', quarter))
t3 = threading.Thread(target=post_rule_execute, args=('gdzdb', quarter))
t4 = threading.Thread(target=post_rule_execute, args=('ycjk', quarter))
t5 = threading.Thread(target=post_rule_execute, args=('fdct', quarter))
t6 = threading.Thread(target=post_rule_execute, args=('zyyc', quarter))
t7 = threading.Thread(target=post_rule_execute, args=('jz', quarter))

t1.start();t2.start();t3.start();t4.start();t5.start();t6.start();t7.start()

# 等待运行结束
t1.join();t2.join();t3.join();t4.join();t5.join();t6.join();t7.join()



================================================
FILE: check/models.py
================================================
from django.db import models

# Create your models here.


================================================
FILE: check/templates/check/blood_analyze.html
================================================
{% include "data/template-ui.html" %}
<!-- 正文主体 -->
<div class="page-wrapper">
    <!-- 标题 -->
    <div class="row page-titles">
        <div class="col-md-4 align-self-center">
            <h3 class="text-primary" id="page_title">血缘分析(信托公司)</h3>
        </div>

        <div class="col-md-5 align-self-center">
            <div class="row">
                选择公司:
                <select id="company_list">
                    <option>信托</option>
                    <option>资产</option>
                    <option>担保</option>
                    <option>金科</option>
                    <option>基金1</option>
                    <option>基金2</option>
                    <option>金租</option>
                </select>
                <button type="button" class="btn btn-primary btn-xs p310" onclick="ChangeCompany();"><i class="fa fa-search"></i></button>
            </div>
        </div>

        <div class="col-md-3 align-self-center">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="../../data/index">主页</a></li>
                <li class="breadcrumb-item active">血缘分析</li>
            </ol>
        </div>
    </div>
    
    <div class="container-fluid animated fadeInUp">
        <div class="row">
            <div class="card" style="height: 600px;width: 100%;">
                <div id="myDiagramDiv" style="width:100%; height:600px"></div>
            </div>
        </div>
    </div>
</div>

<!-- footer -->
<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div class="footer">
        © 2019 Hyhyhyhyhyhyh
    </div>
</footer>

</div>


<!-- 设置头像 / 设置gojs-->
<script src="/static/js/init.js"></script>
<!-- gojs库 -->
<script src="/static/js/gojs/go.js"></script>
<script src="/static/js/gojs/Buttons.js"></script>

<script>
    function ChangeCompany(){
        var obj = document.getElementById("company_list");
        var value = obj.options[obj.selectedIndex].value; // 选中值
        localStorage.setItem('selected_company', value);

        var title = document.getElementById("page_title");
        title.innerHTML = "血缘分析(" + value + "公司)";
    }
</script>

</body>

</html>

================================================
FILE: check/templates/check/crontab.html
================================================
{% include "data/template-ui.html" %}
<link rel="stylesheet" type="text/css" href="/static/css/icons.css" />
<link rel="stylesheet" type="text/css" href="/static/css/fonts.css" />
<link rel="stylesheet" type="text/css" href="/static/css/sweetalert.css" />
<link rel="stylesheet" type="text/css" href="/static/css/switchery.min.css" />

<style>
    .container-fluid {
        padding: 0 10 0;
    }

    .page-wrapper {
        padding-bottom: 20px;
    }

    .page-wrapper {
        min-height: 600px !important;
    }

    .table {
        font-size: 13px;
    }
    .table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td, .table > tfoot > tr > th, .table > thead > tr > td, .table > thead > tr > th {
        line-height: unset;
    }
    tbody tr td {
        text-align: left;
    }
    
    h6 {
        color: rgb(0,128,82);
    }

    .btn {
        margin-top: -3px;
        margin-left: 1px;
        background-color: #4680ff;
        color: aliceblue;
    }
    .btn:hover, .btn:focus {
        color:aliceblue;
    }
</style>

<div class="page-wrapper">
    <div class="container-fluid animated fadeInUp">
        <div class="row">
            <div class="card col-12">
                <div class="card-title">
                    <h4 class="text-primary">检核任务 - 调度信息</h4>
                </div>

                <div class="card-content">
                    <table class="table table-hover">
                        <thead>
                            <td>公司</td>
                            <td>数据库</td>
                            <td>启用状态</td>
                            <td>完成进度</td>
                            <td>调度周期</td>
                            <td>上次运行时间</td>
                            <td>上次运行情况</td>
                            <td>#  操作</td>
                        </thead>
                        <tbody>
                        {% for i in jobs %}
                            <tr>
                                <!-- 公司名 -->
                                <td>{{ i.0 }}</td>

                                <!-- 数据库名 -->
                                <td>{{ i.2 }}</td>

                                <!-- 启用状态 -->
                                <td>
                                    {% if i.5 == True %}
                                    <input company="{{ i.1 }}" db="{{ i.2 }}" type="checkbox" class="js-switch" checked/>
                                    {% elif i.5 == False %}
                                    <input company="{{ i.1 }}" db="{{ i.2 }}" type="checkbox" class="js-switch"/>
                                    {% elif i.5 is None %}
                                    <i class="fa fa-warning" style="color: #FFC107;"></i>&nbsp;&nbsp;未部署
                                    {% endif %}
                                </td>
                                
                                <!-- 完成进度 -->
                                <td class="project_progress">
                                    <div class="progress">
                                        <div class="progress-bar wow animated progress-animated"
                                            style="width: 0%; height:6px;"
                                            role="progressbar" id="progressbar_{{ i.1 }}_{{ i.2 }}"> </div>
                                    </div>
                                    <small id="progressvalue_{{ i.1 }}_{{ i.2 }}">0% 已完成</small>
                                </td>

                                <!-- 调度周期 -->
                                <td>{{ i.6 }}</td>

                                <!-- 上次运行时间 -->
                                <td>{{ i.3 }}</td>

                                <!-- 上次运行状态 -->
                                {% if i.4 == 'success' %}
                                <td style="color: #4CAF50;"><i class="fa fa-check"></i>&nbsp;&nbsp;成功</td>
                                {% else %}
                                <td style="color: #F44336;"><i class="fa fa-close"></i>&nbsp;&nbsp;失败</td>
                                {% endif %}

                                <!-- 操作 -->
                                <td>
                                    <button class="btn btn-xs btn-check" type="button" onclick="CheckNow(this)" c="{{ i.0 }}" company="{{ i.1 }}" db="{{ i.2 }}">
                                        <i class="im-paperplane"></i>&nbsp;&nbsp;立即检核>>
                                    </button>
                                    <span id="i_{{i.1}}_{{i.2}}" style="display: none;">
                                        <i class="fa fa-spinner fa-pulse"></i>&nbsp;&nbsp;正在检核...
                                    </span>
                                    <!-- <button style="display: none;" name="btn_progress" onclick="UpadteProgress(this);" company="{{ i.1 }}" db="{{ i.2 }}">
                                    </button> -->
                                </td>
                            </tr>
                        {% endfor%}
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
</div>

<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div class="footer">
        © 2019 Hyhyhyhyhyhyh
    </div>
</footer>


<!-- 设置头像 / 设置日期 -->
<script src="/static/js/init.js"></script>

<script src="/static/js/sweetalert.min.js"></script>
<script src="/static/js/switchery.min.js"></script>

<script>
    var elems = Array.prototype.slice.call(document.querySelectorAll('.js-switch'));

    elems.forEach(function(html) {
        var switchery = new Switchery(html, { size: 'small' });

        html.onchange = function(e) {
            var obj = $(this);
            var company = obj.attr('company');
            var db = obj.attr('db');
            var enable;

            if (obj.is(':checked')) {
                enable = true;
            } else {
                enable = false;
            }

            // 修改定时任务启用状态
            $.ajax({
                url: '../../api/check/crontab/status_modify',
                type: 'POST',
                data:{
                    "enable": enable,
                    "company": company,
                    "db": db
                },
                success: function (data) {
                    if (data.msg == 'success') {
                        return true
                    }
                    else {
                        swal({
							title: "发生错误",
                            icon: "error",
                            buttons: false,
							timer: 1000
						});
                    }
                },
                error: function (e) {
                    swal({
                        title: "发生错误",
                        icon: "error",
                        buttons: false,
                        timer: 1000
                    });
                }
            })
          }
    });


    // 点击按钮手工调度检核任务
    function CheckNow(obj){
        var c = obj.attributes.c.value;
        var company = obj.attributes.company.value;
        var db = obj.attributes.db.value;
        swal({
            title: c + "-" + db +"-开始执行检核",
            icon: "success",
            timer: 2000
        });
        obj.style.display = "none";
        document.getElementById("i_"+company+"_"+db).style.display = "block";

        $.ajax({
            type: "POST",
            url: "../../api/check/rule/execute",
            data: {
                company: company,
                db: db,
                username: localStorage.getItem("username"),
            },
            success: function (data) {
                //console.log(data);
                if (data.status == 'success') {
                    obj.style.display = "block";
                    document.getElementById("i_"+company+"_"+db).style.display = "none";
                    swal({
                        title: c + "-" + db +"-检核成功",
                        icon: "success",
                    });
                }
                else {
                    swal('发生错误!', data.status, 'error');
                    obj.style.display = "block";
                    document.getElementById("i_"+company+"_"+db).style.display = "none";
                }
            },
            error: function (e) {
                swal('发生错误!', data.status, 'error');
                obj.style.display = "block";
                document.getElementById("i_"+company+"_"+db).style.display = "none";
            }
        })
    }


    // 查询并填充任务进度条
    function UpadteProgress(){
        var bar = document.getElementsByClassName("progress-bar");
        for(let i=0;i<bar.length;i++){
            bar[i].style.width = '0%';
        }

        $.ajax({
            type : "GET",
            async : true,
            url : "../../api/check/progress",
            data: {},
            dataType : "json",
            success : function(result) {
                for(var i in result){    // 按公司循环遍历
                    var db =  result[i];
                    if(Object.keys(db).length == 1){
                        let value = Object.values(db)[0];
                        let b = document.getElementById("progressbar_" + i + "_" + Object.keys(db)[0]);
                        let v = document.getElementById("progressvalue_" + i + "_" + Object.keys(db)[0]);

                        b.style.width = value + "%";
                        v.innerHTML = value + "% 已完成";

                        if(value <= 33){
                            b.style.backgroundColor = '#F44336';  //红色
                            v.style.color = '#F44336';
                        }
                        else if(value <= 66){
                            b.style.backgroundColor = '#FFC107';  //黄色
                            v.style.color = '#FFC107';
                        }
                        else{
                            b.style.backgroundColor = '#4CAF50';  //绿色
                            v.style.color = '#4CAF50';
                        }
                    }
                    for(var j in db){
                        //console.log(db[j]);
                        let value = db[j];
                        let b = document.getElementById("progressbar_" + i + "_" + j);
                        let v = document.getElementById("progressvalue_" + i + "_" + j);
                        b.style.width = value + "%";
                        v.innerHTML = value + "% 已完成";

                        if(value <= 33){
                            b.style.backgroundColor = '#F44336';  //红色
                            v.style.color = '#F44336';
                        }
                        else if(value <= 66){
                            b.style.backgroundColor = '#FFC107';  //黄色
                            v.style.color = '#FFC107';
                        }
                        else{
                            b.style.backgroundColor = '#4CAF50';  //绿色
                            v.style.color = '#4CAF50';
                        }
                    }
                }
            }
        })
    };


    // 初始化进度条
    UpadteProgress();
    var intervalID = setInterval(UpadteProgress, 1000*60);     // 每分钟刷新一次进度条
</script>

</body>

</html>

================================================
FILE: check/templates/check/rule_edit.html
================================================
<!DOCTYPE html>
<html lang="zh-cmn-Hans">

<head>
	<meta charset="utf-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
	<meta name="viewport" content="width=device-width, initial-scale=1">
	<meta name="description" content="">
	<meta name="author" content="">
	<link rel="icon" type="image/png" sizes="16x16" href="/static/img/favicon.ico" />
	<title>数据质量检核平台</title>


	<link rel="stylesheet" type="text/css" href="/static/check/css/admin/bootstrap.min.css"/>
	<link rel="stylesheet" type="text/css" href="/static/check/css/admin/style.css"/>
	<link rel="stylesheet" type="text/css" href="/static/CodeMirror/lib/codemirror.css"/>
	<link rel="stylesheet" type="text/css" href="/static/CodeMirror/theme/eclipse.css"/>
	<link rel="stylesheet" type="text/css" href="/static/css/sweetalert.css"/>
	<link rel="stylesheet" type="text/css" href="/static/css/icons.css"/>
	<link href="https://cdn.bootcss.com/bootstrap-select/2.0.0-beta1/css/bootstrap-select.min.css" rel="stylesheet">


	<style>
		.modal.fade.in{
			top: 180px;
		}
		.table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td {
			vertical-align: middle;
		}
		.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default {
			background-color: unset;
			border-color: unset;
			color: unset;
		}
		.btn-default.active, .btn-default.focus, .btn-default:active, .btn-default:focus, .btn-default:hover, .open>.dropdown-toggle.btn-default {
			background-color: unset;
			border-color: unset;
			color: unset;
		}
		.popover{
			max-width: 100%;
		}
	</style>
</head>

<body onload="OnLoad();">
	<!-- head star -->
	<div class="tnav row wrapper border-bottom white-bg page-heading">
		<div class="col-sm-4">
			<h2 class="fl" style="color: #007bff;font-size: 21px;font-weight:500">数据质量检核规则库</h2>
			<ol class="breadcrumb fl">
				<li><a href="../../data/index">主页</a></li>
				<li><strong>检核规则库</strong></li>
			</ol>
		</div>
	</div>
	<!-- head end -->

	<!-- table star -->
	<div class="row col-lg-10">
		<div class="wrapper wrapper-content animated fadeInUp">
			<div class="ibox">
				<div class="ibox-title">
					<h5 id="page-title"></h5>
					<div class="ibox-tools rboor" style="bottom: 5px;">
						<button onclick="Commit();" class="btn btn-primary btn-sm">
							<i class="fa fa-check-square-o"></i> 提交
						</button>
					</div>
				</div>

				<div class="ibox-content">
					<table class="table table-hover">
						<tr>
							<td style="width: 150px;">
								<label class="form-label">数据标准</label>
							</td>
							<td>
								<input id="check_item" type="text" class="form-control" style="width: 400px;">
							</td>
						</tr>

						<tr>
							<td>
								<label class="form-label">目标表</label>
							</td>
							<td>
								<input id="target_table" type="text" class="form-control" style="width: 400px;">
							</td>
						</tr>

						<tr>
							<td>
								<label class="form-label">是否风险集市</label>
							</td>
							<td>
								<select id="risk_market" class="selectpicker form-control" style="width: 400px;">
									<option value="是">是</option>
									<option value="否">否</option>
								</select>
							</td>
						</tr>

						<tr>
							<td>
								<label class="form-label">问题分类</label>
							</td>
							<td>
								<select id="problem_type" type="text" class="selectpicker form-control">
									<option>-- 请选择 --</option>
									<option value="完整性检验">完整性检验</option>
									<option value="准确性检验">准确性检验</option>
									<option value="合理性检验">合理性检验</option>
									<option value="一致性检验">一致性检验</option>
									<option value="及时性检验">及时性检验</option>
								</select>
							</td>
							<td>
								<i class="fa fa-question-circle" style="color: #ffab00;font-size:15px;" data-toggle="popover"></i>
							</td>
						</tr>

						<tr>
							<td>
								<label class="form-label">源系统数据库</label>
							</td>
							<td style="width: 150px;">
								<select id="db" class="selectpicker form-control" disabled></select>
							</td>
							<td>
								<button class="btn btn-primary btn-sm" onclick="QueryDB();">查询</button>
							</td>
						</tr>

						<tr>
							<td>
								<label class="form-label">检核逻辑</label>
							</td>
							<td colspan="2">
								<textarea id="check_sql" name="code" type="text" class="form-control"></textarea>
							</td>
						</tr>

						<tr>
							<td>
								<label class="form-label">备注</label>
							</td>
							<td colspan="2">
								<textarea id="note" type="text" class="form-control" style="width: 800px;"></textarea>
							</td>
						</tr>

						<tr>
							<td>
								<label class="form-label">状态</label>
							</td>
							<td>
								<select id="status" class="selectpicker" >
									<option value="已启用">已启用</option>
									<option value="已停用">已停用</option>
								</select>
							</td>
						</tr>
					</table>
				</div>
			</div>
		</div>
	</div>
	<!-- table end -->
	<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
		<div class="footer">
			© 2019 Hyhyhyhyhyhyh
		</div>
	</footer>

	<script src="/static/js/jquery/jquery.min.js"></script>
	<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
	<script src="/static/CodeMirror/lib/codemirror.js"></script>
	<script src="/static/CodeMirror/mode/sql.js"></script>
	<script src="/static/js/sweetalert.min.js"></script>
	<script src="https://cdn.bootcss.com/bootstrap-select/2.0.0-beta1/js/bootstrap-select.min.js"></script>


	<script>
		var company = "{{ source_system }}";
		var id = "{{ id }}";
		
		// 初始化CodeMirror编辑框
		var textarea = document.getElementById('check_sql');
		var editor = CodeMirror.fromTextArea(textarea, {
			lineNumbers: true,
			autofocus: true,
			mode: 'text/x-plsql',
			theme: 'eclipse',
			matchBrackets: true,
			autoCloseBrackets: true,
			extraKeys: {
				"Ctrl": "autocomplete"
			},
		});
		editor.setSize('1000px', 'auto');

		// 填充现有检核规则信息
		function OnLoad(){
			$(".selectpicker").selectpicker({
				noneSelectedText: '-- 请选择 --' //默认显示内容  
			 });

			if(id == "null"){
				$("#page-title").html(company + "公司-新增检核规则");
			}
			else{
				$("#page-title").html(company + "公司-修改检核规则");
				QueryDetail();
			}
		}

		function QueryDetail(){
			$.ajax({
				type: "GET",
				url: "../../api/check/rule/detail",
				data: {
					company: company,
					id: id,
				},
				success: function (result) {
					$("#check_item").val(result.check_item);
					$("#target_table").val(result.target_table);
					$("#risk_market_item").val(result.risk_market_item);
					$("#problem_type").val(result.problem_type);
					$("#db").selectpicker({noneSelectedText: result.db});
					$("#check_sql").val(result.check_sql);
					editor.replaceSelection(result.check_sql);
					$("#note").val(result.note);
					$("#status").val(result.status);

					$("#problem_type").selectpicker("refresh");
					$("#db").selectpicker("refresh");
					$("#status").selectpicker("refresh");
				}
			})
		}

		// popover气泡提示窗
		$(function() {
			$("[data-toggle='popover']").popover({
				html : true,
				placement: "right",
				trigger: "hover focus",
				container: "body",
				title: "说明",
				delay:{show:100, hide:200},
				content: "<ul>\
				<li>完整性:主要包括实体缺失、属性缺失、记录缺失和字段值缺失四个方面;</li>\
				<li>准确性:一个数据值与设定为准确的值之间的一致程度,或与可接受程度之间的差异;</li>\
				<li>合理性:主要包括格式、类型、值域和业务规则的合理有效;</li>\
				<li>一致性:系统之间的数据差异和相互矛盾的一致性,业务指标统一定义,数据逻辑加工结果一致性;</li>\
				<li>及时性:数据仓库ETL、应用展现的及时和快速性,Jobs运行耗时、运行质量、依赖运行及时性。</li>\
				</ul>"
			});
		});

		function QueryDB(){
			$.ajax({
				type: "GET",
					url: "../../api/backend/database/query",
					data: {},
					success: function (result) {
						// 根据公司名从接口数据获取对应的数据库名
						let db = [];
						for(let i in result.data.company){
							if(result.data.company[i] == company){
								db.push(result.data.alias[i]);
							}
						}
						// 清除原有option
						$("#db").empty();
						// 设置显示内容
						for(i in db){
							$("#db").append($("<option value='"+db[i]+"'>"+db[i]+"</option>"));
						}
						// 取消下拉框的禁用状态
						$('#db').prop('disabled', false);
						// 刷新下拉框状态
						$("#db").selectpicker("refresh");
					}
			})
		}

		function Commit(){
			// 获取检核逻辑代码框中修改后的value
			editor.save();
			var check_sql = editor.getValue();

			if(id == 'null'){
				// 新增检核规则
				$.ajax({
					type: "POST",
					url: "../../api/check/rule/add",
					data: {
						source_system:	company,
						check_item: 	$("#check_item").val(),
						target_table: 	$("#target_table").val(),
						risk_market:	$("#risk_market").val(),
						problem_type:	$("#problem_type").val(),
						db: 			$("#db").val(),
						check_sql: 		check_sql,
						note: 			$("#note").val(),
						status: 		$("#status").val(),
					},
					success: function (data) {
						swal({
							text: "检核规则新增成功,正在返回上一页...",
							icon: "success",
							buttons: false,
							timer: 1000
						}).then(function(){
							window.history.back(-1) || window.close();
						});
					},
					error: function (e) {
						swal({
							title: "发生错误",
							text: e,
							icon: "error",
						})
					}
				})
			}
			else{
				// 更新检核规则
				$.ajax({
					type: "POST",
					url: "../../api/check/rule/update",
					data: {
						id:				id,
						source_system:	company,
						check_item: 	$("#check_item").val(),
						target_table: 	$("#target_table").val(),
						risk_market:	$("#risk_market").val(),
						problem_type:	$("#problem_type").val(),
						db: 			$("#db").val(),
						check_sql: 		check_sql,
						note: 			$("#note").val(),
						status: 		$("#status").val(),
					},
					success: function (data) {
						swal({
							text: "检核规则修改成功,正在返回上一页...",
							icon: "success",
							buttons: false,
							timer: 1000
						}).then(function(){
							window.history.back(-1) || window.close();
						});
					},
					error: function (e) {
						swal({
							title: "发生错误",
							text: e,
							icon: "error",
						})
					}
				})
			}
		}
	</script>

</body>

</html>

================================================
FILE: check/templates/check/rule_list.html
================================================
{% include "data/template-ui.html" %}
<link rel="stylesheet" type="text/css" href="/static/css/datatables/foundation.min.css" />
<link rel="stylesheet" type="text/css" href="/static/css/datatables/dataTables.bootstrap4.min.css" />
<link rel="stylesheet" type="text/css" href="/static/css/icons.css" />
<link rel="stylesheet" type="text/css" href="/static/css/fonts.css" />
<link rel="stylesheet" type="text/css" href="/static/css/rule_list.css" />

<style>
	td.details-control {
		background: url("/static/img/details_open.png") no-repeat center center;
		cursor: pointer;
	}

	tr.shown td.details-control {
		background: url("/static/img/details_close.png") no-repeat center center;
	}
</style>

<div class="page-wrapper">
	<!-- 正文 -->
	<div class="container-fluid animated fadeInUp">
		<div class="col-12">
			<div class="card">
				<div class="card-title">
					<div class="row" style="padding:0px !important;">
						<div class="col-md-10">
							<h4 class="text-primary">{{ source_system }}公司-检核规则库</h4>
						</div>
						<div class="col-md-2 pull-right">
							<a href="../check/rule/edit?company={{ source_system }}&id=null"
								class="btn btn-primary btn-xs p310"><i class="im-plus"></i> 添加规则</a>
							<button id="tb-refresh" href="#" class="btn btn-primary btn-xs p1010"><i
									class="im-spinner2 fa-spin"></i> 刷新</button>
						</div>
					</div>
				</div>

				<div class="card-content">
					<div class="col-lg-3 ">
						<select style="height:2.2rem; font-size:13px; bottom:10px;margin:unset;"
							onchange="fun_option(this.value);">
							<option>是否风险集市</option>
							<option value="是">是</option>
							<option value="否">否</option>
							<option value="">显示全部</option>
						</select>
					</div>

					<table id="example" class="table table-bordered" cellspacing="0" width="100%">
						<thead>
							<tr>
								<th>ID</th>
								<th>数据标准</th>
								<th>目标表</th>
								<th>是否风险集市</th>
								<th>问题分类</th>
								<th>源系统数据库</th>
								<th>检核逻辑</th>
								<th>状态</th>
								<th>操作</th>
							</tr>
						</thead>
					</table>
				</div>
			</div>
		</div>
	</div>

	<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
		<div class="footer">
			© 2019 Hyhyhyhyhyhyh
		</div>
	</footer>

	<!-- 设置头像 / 设置日期 -->
	<script src="/static/js/init.js"></script>

	<script type="text/javascript" src="/static/js/DataTables/DataTables-1.10.18/js/jquery.dataTables.js">
	</script>
	<script type="text/javascript" src="/static/js/DataTables/DataTables-1.10.18/js/dataTables.bootstrap.js">
	</script>
	<script type="text/javascript">
		function fun_option(val) { //下拉框触发事件
			document.location.href = "../check/rule?company={{ source_system }}&risk_market=" + val;
		}

		function fun_status(id, status) { //下拉框触发事件
			$.ajax({
				type: "POST",
				url: "../../api/check/rule/status_modify",
				data: {
					id: id,
					status: status,
					company: "{{ source_system }}",
				},
				success: function (data) {
					console.log(data);
					location.reload(true);
				},
				error: function (e) {
					console.log(e);
				}
			})
		}

		function format(d) {
			// `d` is the original data object for the row
			return '<table cellpadding="5" cellspacing="0" border="0" style="padding-left:50px;">' +
				'<tr>' +
				'<td>检核逻辑:</td>' +
				'<td>' + d.check_sql + '</td>' +
				'</tr>' +
				'<tr>' +
				'<td>备注:</td>' +
				'<td>' + d.note + '</td>' +
				'</tr>' +
				'</table>';
		}

		$(document).ready(function () {
			var table = $('#example').DataTable({
				"ajax": {
					"url": "../../api/check/rule",
					"type": "GET",
					"data": function (d) {
						return $.extend({}, d, {
							name: "{{ source_system }}",
							risk_market_filter: "{{ risk_market_filter }}",
						});
					}
				},
				//"ajax": "/static/resource/objects2.txt",
				"columns": [{
						"data": "id"
					},
					{
						"data": "check_item"
					},
					{
						"data": "target_table"
					},
					{
						"data": "risk_market_item"
					},
					{
						"data": "problem_type"
					},
					{
						"data": "db"
					},
					{
						"className": 'details-control',
						"orderable": false,
						"data": null,
						"defaultContent": ''
					},
					{
						"data": "status"
					},
				],

				"columnDefs": [{
						// 定义操作列,######以下是重点########
						"targets": 8,
						//操作按钮目标列
						"data": null,
						"render": function (data, type, row) {
							var id = '"' + row.id + '"';
							var html = "<a href='../check/rule/edit?id=" + row.id + "&company=" + row
								.source_system + "&username=" + "{{ username }}" +
								"' style='margin-right:5px;border-bottom: 1px dotted;'>编辑</a>"
							return html;
						}
					},

					{
						"targets": 7,
						"data": "status",
						"render": function (data, type, row) {
							var id = '"' + row.id + '"';
							if (data == '已启用') {
								var html = "<a href='javascript:void(0);' onclick='fun_status(" + row
									.id + ",\"" + row.status +
									"\")' style='color:#429e47;border-bottom: 1px dotted;'>" + data +
									"</a>"
								return html;
							} else {
								var html = "<a href='javascript:void(0);' onclick='fun_status(" + row
									.id + ",\"" + row.status +
									"\")' style='color:#e33734;border-bottom: 1px dotted;'>" + data +
									"</a>"
								return html;
							}
						}
					},
				],

				"pagingType": "full_numbers",
				"sLoadingRecords": "正在加载数据...",
				"sZeroRecords": "暂无数据",
				stateSave: true,
				"searching": true,
				"ordering": true,
				//"dom":'frtilp',
				"dom": 'frt<"row"<"col-md-3"l><"col-md-3"i><"col-md-6 pull-right"p>>',

				//汉化
				"language": {
					"processing": "玩命加载中...",
					"lengthMenu": "显示 _MENU_ 项结果",
					"zeroRecords": "没有匹配结果",
					"info": "显示第 _START_ 至 _END_ 项结果,共 _TOTAL_ 项",
					"infoEmpty": "显示第 0 至 0 项结果,共 0 项",
					"infoFiltered": "(由 _MAX_ 项结果过滤)",
					"infoPostFix": "",
					"url": "",
					"paginate": {
						"first": "首页",
						"previous": "上一页",
						"next": "下一页",
						"last": "末页"
					},
					"sSearch": "搜索:",
				},
			});

			$('#example tbody').on('click', 'td.details-control', function () {
				var tr = $(this).closest('tr');
				var row = table.row(tr);

				if (row.child.isShown()) {
					// This row is already open - close it
					row.child.hide();
					tr.removeClass('shown');
				} else {
					// Open this row
					row.child(format(row.data())).show();
					tr.addClass('shown');
				}
			});

			//刷新页面按钮
			$("#tb-refresh").on("click", function () {
				location.reload();
			});

		});
	</script>

	</body>

	</html>

================================================
FILE: check/tests.py
================================================
from django.test import TestCase

# Create your tests here.


================================================
FILE: check/views.py
================================================
import datetime
import math
import sys

from crontab import CronTab
from django.shortcuts import render

sys.path.insert(0, '..')
from mysite import db_config
from utils import functions as f
from utils.functions import is_login


@is_login
def rule_list(request):
    """
    检核规则列表
    :param request:
    :return:
    """
    return render(request, "check/rule_list.html", {"source_system": request.GET.get('company'),
                                                    "risk_market_filter": request.GET.get('risk_market'),
                                                    "username": request.session['username']
                                                    }
                  )


@is_login
def rule_edit(request):
    """
    单条检核规则页面
    :param request:
    :return:
    """
    return render(request, "check/rule_edit.html", {"username": request.session['username'],
                                                   "source_system": request.GET.get('company'),
                                                   "id": request.GET.get('id')
                                                   })


@is_login
def rule_execute_manual(request):
    """
    查询检核进度
    :param request:
    :return:
    """
    date = str(datetime.datetime.now().year) + "-" + str(datetime.datetime.now().month) + '-' + str(datetime.datetime.now().day)
    return render(request, "check/rule_exec.html", {"date": date})


@is_login
def show_crontab(request):
    """
    自动检核配置页面
    :param request:
    :return:
    """
    conn = db_config.mysql_connect()
    with conn.cursor() as curs:
        # 查询各个公司检核规则配置的数据库、上次检核任务的运行情况
        sql = """select distinct b.name,
                                a.company,
                                a.db,
                                CAST(c.execute_date as char),
                                c.status
                from check_result_template a,
                source_db_info b,
                (select db,company,execute_date,status from check_execute_log  where id in 
                    (
                        select id from (select max(id) id,company,db from check_execute_log where db is not null group by company,db) a
                    )
                ) c
                where a.db=b.alias
                and a.db=c.db
                and a.company=c.company
                order by 1,2,3"""
        curs.execute(sql)
        jobs = curs.fetchall()
        
    # 根据数据源中的公司和数据库信息匹配crontab定时任务
    cron = CronTab(user=True)
    data = []
    for i in jobs:
        job = list(cron.find_comment(f'autocheck-{i[1]}-{i[2]}'))
        t = list(i)
        if len(job) > 0:
            enable = job[0].is_enabled()                                # 获取crontab启用状态
            job_time = job[0].description(use_24hour_time_format=True, locale_code='zh_CN') # 获取crontab的调度周期 
            t.extend([enable, job_time])
        else:
            t.append(None)
        data.append(t)
    
    return render(request, "check/crontab.html", {"jobs": data})


@is_login
def blood_analyze(request):
    """血缘分析"""
    return render(request, "check/blood_analyze.html") 

================================================
FILE: data/__init__.py
================================================


================================================
FILE: data/admin.py
================================================
from django.contrib import admin

# Register your models here.


================================================
FILE: data/apps.py
================================================
from django.apps import AppConfig


class DataConfig(AppConfig):
    name = 'data'


================================================
FILE: data/models.py
================================================
from django.db import models

# Create your models here.


================================================
FILE: data/templates/data/dashboard.html
================================================
{% include "data/template-ui.html" %}
<style>
    table {
        border-collapse: collapse;
        width: 100%;
    }
    thead th {
        border-bottom: 2px solid #dee2e6;
    }
    tbody tr td {
        padding: 9px;
        vertical-align: top;
        border-top: 1px solid #dee2e6;
    }
    #demand_table {
        line-height: 19px;
    }
    .alert {
        margin-bottom: 0px;
        margin-left: 1%
    }
    select{
        border: 0 none;
        border-bottom: 1px solid;
        appearance: none;
        -moz-appearance:none; /* Firefox */
        -webkit-appearance:none; /* Safari 和 Chrome */
        -ms-appearance: none;
        padding-left: 2%;
        padding-right: 1%;
    }
    select::-ms-expand { display: none; }
    .overview_table tr td{
        font-size: 14px;
        line-height: 31px;
        padding: 0.3rem;
        vertical-align: middle;
    }
</style>

<!-- 正文主体 -->
<div class="page-wrapper">
    <!-- 标题 -->
    <div class="row page-titles">
        <div class="col-md-4 align-self-center">
            <h3 class="text-primary">风险集市数据质量仪表盘</h3>
        </div>

        <div class="col-md-5 align-self-center">
            <div class="row">
                数据日期:
                <select id="data_year" onchange="GetQuarter();" style="width: 60px;"></select><span style="padding-right: 5px;">年</span>
                <span>· 第</span><select id="data_quarter" onchange="GetMonth();" style="width: 30px;"></select><span style="padding-right: 5px;">季度 ·</span>
                <select id="data_month" onchange="GetDay();" style="width: 40px;"></select><span style="padding-right: 5px;">月</span>
                <select id="data_day" style="width: 40px;"></select><span style="padding-right: 15px;">日</span>
                <button type="button" class="btn btn-primary btn-xs p310" onclick="ChangeDataDate();"><i class="fa fa-search"></i></button>
            </div>
        </div>

        <div class="col-md-3 align-self-center">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="../../data/dashboard">主页</a></li>
                <li class="breadcrumb-item active">仪表盘</li>
            </ol>
        </div>
    </div>

    <div class="container-fluid animated fadeInUp">
        <!--数据概览-->
        <div class="row">
            <div class="col-lg-12">
                <div class="card">
                    <div class="card-body">
                        <h4 class="card-title" style="margin-bottom: -10px;">数据质量总览</h4>
                        <div class="card-content">
                            <div class="row">
                                <div class="col-md-4">
                                    <div class="card bg-pink p-20">
                                        <div class="media widget-ten">
                                            <div class="media-left meida media-middle">
                                                <span><i class="ti-vector f-s-40"></i></span>
                                            </div>
                                            <div class="media-body media-text-right">
                                                <h2 class="color-white" id="all_cnt"></h2>
                                                <p class="m-b-0">检核数据总量</p>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div class="col-md-4">
                                    <div class="card bg-danger p-20">
                                        <div class="media widget-ten">
                                            <div class="media-left meida media-middle">
                                                <span><i class="ti-location-pin f-s-40"></i></span>
                                            </div>
                                            <div class="media-body media-text-right">
                                                <h2 class="color-white" id="problem_cnt"></h2>
                                                <p class="m-b-0">问题数据总量</p>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                                <div class="col-md-4">
                                    <div class="card bg-primary p-20">
                                        <div class="media widget-ten">
                                            <div class="media-left meida media-middle">
                                                <span><i class="ti-bag f-s-40"></i></span>
                                            </div>
                                            <div class="media-body media-text-right">
                                                <h2 class="color-white" id="problem_per"></h2>
                                                <p class="m-b-0">问题占比</p>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>

                            <div class="row">
                                <div class="alert alert-secondary alert-dismissible fade show">
                                    <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                                    <strong>注:</strong> 本季度的检核逻辑主要针对数据的规范性,尚未检核数据的准确性
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>

        <!--问题占比-->
        <div class="row">
            <div class="col-lg-4">
                <div class="card">
                    <!-- <h4 class="card-title">各公司数据质量概况</h4> -->
                    <div class="card-body">
                        <div class="table-responsive">
                            <table class="table table-hover overview_table">
                                <thead>
                                    <tr>
                                        <th colspan="2">信托</th>
                                        <th>问题占比趋势</th>
                                    </tr>
                                </thead>
                                <tbody id="overview_xt">
                                </tbody>
                            </table>
                        </div>
                    </div>
                </div>
            </div>

            <div class="col-lg-4">
                <div class="card">
                    <div class="table-responsive">
                        <table class="table table-hover overview_table">
                            <thead>
                                <tr>
                                    <th colspan="2">资产</th>
                                    <th>问题占比趋势</th>
                                </tr>
                            </thead>
                            <tbody id="overview_zc">
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>

            <div class="col-lg-4">
                <div class="card">
                    <div class="table-responsive">
                        <table class="table table-hover overview_table">
                            <thead>
                                <tr>
                                    <th colspan="2">担保</th>
                                    <th>问题占比趋势</th>
                                </tr>
                            </thead>
                            <tbody id="overview_db">
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>

            <div class="col-lg-4">
                <div class="card">
                    <div class="table-responsive">
                        <table class="table table-hover overview_table">
                            <thead>
                                <tr>
                                    <th colspan="2">金科</th>
                                    <th>问题占比趋势</th>
                                </tr>
                            </thead>
                            <tbody id="overview_jk">
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>

            <div class="col-lg-4">
                <div class="card">
                    <div class="table-responsive">
                        <table class="table table-hover overview_table">
                            <thead>
                                <tr>
                                    <th colspan="2">基金1</th>
                                    <th>问题占比趋势</th>
                                </tr>
                            </thead>
                            <tbody id="overview_jj1">
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>

            <div class="col-lg-4">
                <div class="card">
                    <div class="table-responsive">
                        <table class="table table-hover overview_table">
                            <thead>
                                <tr>
                                    <th colspan="2">基金2</th>
                                    <th>问题占比趋势</th>
                                </tr>
                            </thead>
                            <tbody id="overview_jj2">
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>

            <div class="col-lg-4">
                <div class="card">
                    <div class="table-responsive">
                        <table class="table table-hover overview_table">
                            <thead>
                                <tr>
                                    <th colspan="2">金租</th>
                                    <th>问题占比趋势</th>
                                </tr>
                            </thead>
                            <tbody id="overview_jz">
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </div>
        
        <div class="row">
            <!-- 各公司平均问题占比 -->
            <div class="col-lg-7">
                <div class="card" id="echarts1" style="width:100%;height:400px;"></div>
            </div>

            <!-- 集团总问题占比趋势 -->
            <div class="col-lg-5">
                <div class="card" id="echarts5" style="width:100%;height:400px;"></div>
            </div>
        </div>

        <!-- 各公司需求改造进度 -->
        <div class="row">
            <div class="col-lg-7">
                <div class="card" id="echarts4" style="width:100%;height:400px;"></div>
            </div>

            <div class="col-lg-5">
                <div class="card" style="width:100%;height:400px;">
                    <h5 class="card-title">各公司需求改造进度</h5>
                    <h4 class="card-subtitle">风险集市相关</h4>
                    <table id="demand_table"></table>
                </div>
            </div>
        </div>

        <div class="row">
            <!-- 各公司数据量占比 -->
            <div class="col-lg-7">
                <div class="card" id="echarts3" style="width:100%;height:500px;"></div>
            </div>

            <!-- 各公司同类问题Top 10统计 -->
            <div class="col-lg-5">
                <div class="card" id="echarts2" style="width:100%;height:500px;"></div>
            </div>
        </div>

    </div>
</div>

<!-- footer -->
<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div class="footer">
        © 2019 Hyhyhyhyhyhyh
    </div>
</footer>
</div>

<script>
    //将用户名存入localStorage
    localStorage.setItem('username', "{{ username }}");
</script>

<!-- 设置头像 / 设置日期 -->
<script src="/static/js/init.js"></script>
<!-- 加载echarts数据 -->
<script src="/static/js/dashboard_echarts.js"></script>


</body>

</html>

================================================
FILE: data/templates/data/dashboard_subcompany.html
================================================
{% include "data/template-ui.html" %}
<style>
    table {
        border-collapse: collapse;
        width: 100%;
    }
    thead th {
        border-bottom: 2px solid #dee2e6;
    }
    tbody tr td {
        padding: 7px;
        vertical-align: top;
        border-top: 1px solid #dee2e6;
    }
    .excel-btn {
        position: absolute;
        right: 60%;
        top: 85%;
        background-color: #fff;
        border-radius: 50%;
        white-space: nowrap;
        height: 56px;
        width: 56px;
        text-decoration: none;
        box-shadow: 0 3px 5px -1px rgba(0, 0, 0, .2), 0 6px 10px 0 rgba(0, 0, 0, .14), 0 1px 18px 0 rgba(0, 0, 0, .12);
        border-radius: 50%;
        font-weight: 500;
        letter-spacing: .0892857143em;
    }

    .excel-tips {
        position: absolute;
        display: none;
        background: rgba(97, 97, 97, .9);
        color: #fff;
        border-radius: 4px;
        font-size: 14px;
        line-height: 22px;
        padding: 5px 8px;
        text-transform: none;
        width: auto;
        pointer-events: none;
    }

    .excel-icon {
        border-radius: 50%;
        height: 56px;
        width: 56px;
    }

    .excel-btn:hover .excel-tips {
        display: inline-block;
        top: 25%;
        left: 120%;
        animation: fade-in;/*动画名称*/  
        animation-duration: 0.3s;/*动画持续时间*/  
        -webkit-animation:fade-in 0.3s;/*针对webkit内核*/
    }

    @keyframes fade-in {  
        0% {opacity: 0;}/*初始状态 透明度为0*/  
        50% {opacity: 0.5;}/*过渡状态 透明度为0*/  
        100% {opacity: 1;}/*结束状态 透明度为1*/  
    }  
    @-webkit-keyframes fade-in {/*针对webkit内核*/  
        0% {opacity: 0;}  
        50% {opacity: 0.5;}  
        100% {opacity: 1;}  
    }  
    select{
        border: 0 none;
        border-bottom: 1px solid;
        appearance: none;
        -moz-appearance:none; /* Firefox */
        -webkit-appearance:none; /* Safari 和 Chrome */
        -ms-appearance: none;
        padding-left: 2%;
        padding-right: 1%;
    }
    select::-ms-expand { display: none; }
</style>

<!-- 正文主体 -->
<div class="page-wrapper">
    <!-- 标题 -->
    <div class="row page-titles">
        <div class="col-md-4 align-self-center">
            <h3 class="text-primary">{{ company }}公司-数据质量仪表盘</h3>
        </div>

        <div class="col-md-5 align-self-center">
            <div class="row">
                数据日期:
                <select id="data_year" onchange="GetQuarter();" style="width: 60px;"></select><span style="padding-right: 5px;">年</span>
                <span>· 第</span><select id="data_quarter" onchange="GetMonth();" style="width: 30px;"></select><span style="padding-right: 5px;">季度 ·</span>
                <select id="data_month" onchange="GetDay();" style="width: 40px;"></select><span style="padding-right: 5px;">月</span>
                <select id="data_day" style="width: 40px;"></select><span style="padding-right: 15px;">日</span>
                <button type="button" class="btn btn-primary btn-xs p310" onclick="ChangeDataDate();"><i class="fa fa-search"></i></button>
            </div>
        </div>

        <div class="col-md-3 align-self-center">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="../../data/index">主页</a></li>
                <li class="breadcrumb-item active">仪表盘</li>
            </ol>
        </div>
    </div>

    <!-- Begin 正文-->
    <div class="container-fluid">
        <div class="alert alert-secondary alert-dismissible fade show" style="margin-top:10px;margin-bottom:-7px;">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            <strong>注:</strong> 本季度的检核逻辑主要针对数据的规范性,尚未检核数据的准确性
        </div>
        
        <div class="row">
            <div class="col-lg-12">
                <div class="card" id="chart1" style="width:100%;height:500px;"></div>
            </div>
        </div>

        <div class="row">
            <div class="col-lg-4">
                <div class="card">
                        <h4 class="card-title">问题数据统计(风险集市相关)</h4>
                        <table id="chart1_table"></table>
                </div>
            </div>

            <div class="col-lg-8">
                    <div class="card">
                        <h4 class="card-title">源系统改造情况(风险集市相关)</h4>
                        <table id="demand_table"></table>
                    </div>
                </div>
        </div>

        <!-- 各公司风险指标图 -->
        <div class="row">
            <div class="col-lg-12">
                <div class="card" style="position:relative;">
                    <img src="../../static/resource/{{ company_zh }}公司风险指标.png" style="object-fit:contain;width:100%;height:43vw;">
                    <a href="../../api/files/download?filename={{ company_zh }}公司风险指标.xlsx" class="excel-btn">
                        <i><img src="../../static/img/excel-icon.jpg" class="excel-icon" /></i>
                        <div class="excel-tips">
                            <span>下载详细定义</span>
                        </div>
                    </a>
                </div>
            </div>
        </div>
    </div>
    <!-- End 正文 -->
</div>

<!-- footer -->
<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div class="footer">
            © 2019 Hyhyhyhyhyhyh
    </div>
</footer>
</div>


<!-- 设置头像 / 设置日期 -->
<script src="/static/js/init.js"></script>

<script type="text/javascript">
    var year = localStorage.getItem("selected_year");
    var quarter = localStorage.getItem("selected_quarter");
    var month = localStorage.getItem("selected_month");
    var day = localStorage.getItem("selected_day");
    
    var myChart1 = echarts.init(document.getElementById('chart1'));
    
    $('.chart').resize(function(){
        myChart1.resize();
    });
    
    var option = {
        title : {
            text: '问题数据项统计',
            subtext: year+'-'+month+'-'+day +' 风险集市相关',
            x:'center'
        },
        dataset: {
            source: []
        },
        tooltip : {
            trigger: 'axis',
            formatter: ('{c}'.split(","))[1]
        },
        grid: {
            containLabel: true,
            //width: 500,
        },
        xAxis: {
            name: '问题数据总量',
        },
        yAxis: {
            name: '问题数据项',
            type: 'category',
        },
        visualMap: {
            orient: 'horizontal',
            left: 'center',
            min: 10,
            max: 100,
            text: ['高占比', '低占比'],
            // Map the score column to color
            dimension: 0,
            inRange: {
                color: ['#D7DA8B', '#E15457']
            }
        },
        series: [
            {
                type: 'bar',
                encode: {
                    x: '问题数据总量',
                    y: '问题数据项'
                }
            }
        ]
    };    
    
    myChart1.setOption(option);
    myChart1.showLoading();

    // 请求接口数据-填充[问题数据统计]
    $.ajax({
        type : "get",
        async : true,
        url : "../../api/dashboard/subcompany_problem_count",
        data: {
            "company": "{{ company }}",
            "year": year,
            "quarter": quarter,
            "month": month,
            "day": day,
        },
        dataType : "json",
        success : function(result) {
            if (result) {                           //请求成功时执行该函数内容,result即为服务器返回的json对象
                myChart1.hideLoading();              //隐藏加载动画
                myChart1.setOption({                 //加载数据图表
                //渲染echarts
                    dataset: {
                        source: result
                    }
                });

                //渲染table
                var html = "<thead><th>问题数据项</th><th>问题数据总量</th><th>问题占比</th></thead><tbody>";
                for(var i=1;i<result.length;i++){
                    html += "<tr>";
                    html += "<td>" + result[i][2] + "</td>";
                    html += "<td>" + result[i][1] + "</td>";
                    html += "<td>" + result[i][0] + "%</td>";
                    html += "</tr>";
                }
                html += "</tbody>";
                document.getElementById("chart1_table").innerHTML = html;
            }
        },
        error : function(errorMsg) {
            console.log(errorMsg);
        }
    })


    // 请求接口数据-填充[源系统改造需求情况]
    $.ajax({
        type : "get",
        async : true,           //异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
        url : "../../static/resource/demand.json",
        data: {},
        dataType : "json",        //返回数据形式为json
        success : function(result) {
            if (result) {
                //渲染table
                var html = "<thead><th>#</th><th>源系统数据项</th><th>改造需求</th><th>需求提出时间</th>";
                for(var i=5;i<result[0].length;i++){
                    html += "<th>";
                    html += result[0][i].substr(0,6) + "进度";
                    html += "</th>"
                }
                html += "</thead><tbody>";

                for(var i=1;i<result.length;i++){
                    html += "<tr>";
                    if (result[i][1] != '{{ company_zh }}'){
                       continue;
                    }
                    for(var t=0;t<result[i].length;t++){
                        if(t==1){
                           continue; 
                        }
                        html += "<td>" + result[i][t] + "</td>";
                    }
                    html += "</tr>";
                }
                html += "</tbody>";
                document.getElementById("demand_table").innerHTML = html;
            }
        },
        error : function(errorMsg) {
            console.log(errorMsg);
        }
    })
</script>
</body>

</html>

================================================
FILE: data/templates/data/report.html
================================================
{% include "data/template-ui.html" %}
<!-- 设置word文档格式 -->
<style type="text/css">
    tbody tr td {
        font-family: "SimSun", sans-serif;
        font-size: 21.3px;
        color: #000;
        text-align: center;
    }

    .table>thead>tr>th {
        line-height: 25px;
        vertical-align: top;
    }

    .table>thead>tr>th {
        font-weight: 100;
    }

    thead tr th {
        color: #000;
        text-align: center;
    }

    thead tr th:last-child {
        text-align: center;
    }

    tbody tr td:last-child {
        text-align: center;
    }

    h3 {
        size: 21.3px;
        font-family: "SimSun", sans-serif;
        color: #000;
    }

    select{
        border: 0 none;
        border-bottom: 1px solid;
        appearance:none;
        -moz-appearance:none; /* Firefox */
        -webkit-appearance:none; /* Safari 和 Chrome */
        padding: unset;
        height: unset;
        padding-left: 2%;
        padding-right: 1%;
        /*padding-top: 0.8rem;*/
        margin: unset;
    }
    select::-ms-expand { display: none; }
    select:focus{
        border: 0 none;
        border-bottom: 1px solid;
        box-shadow: unset;
    }
</style>
<!-- 设置word文档格式 END -->

<div class="page-wrapper">
    <!-- 标题 -->
    <div class="row page-titles">
        <div class="col-md-4 align-self-center">
            <h3 class="text-primary" style="font-family: 'Open Sans', sans-serif;">数据质量报告</h3>
        </div>

        <div class="col-md-5 align-self-center">
            <div class="row">
                数据日期:
                <select id="data_year" onchange="GetQuarter();" style="width: 60px;"></select><span style="padding-right: 5px;">年</span>
                <span>· 第</span><select id="data_quarter" onchange="GetMonth();" style="width: 30px;"></select><span style="padding-right: 5px;">季度 ·</span>
                <select id="data_month" onchange="GetDay();" style="width: 40px;"></select><span style="padding-right: 5px;">月</span>
                <select id="data_day" style="width: 40px;"></select><span style="padding-right: 15px;">日</span>
                <button type="button" class="btn btn-primary btn-xs p310" onclick="ChangeDataDate();" style="border-radius: .25rem;"><i class="fa fa-search"></i></button>
            </div>
        </div>

        <div class="col-md-3 align-self-center">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="../../data/index">主页</a></li>
                <li class="breadcrumb-item active">数据质量检核报告-WORD</li>
            </ol>
        </div>
    </div>

    <div class="container-fluid animated fadeInUp">
        <div class="row">
            <div class="col-md-10">
                <div class="card" id="page-content">
                    <h2 style="size:29.3px;text-align:center;font-family:SimSun;font-weight:bold;color:#000;" />
                    集团{{ quarter }}数据质量报告
                    <h3 style="font-weight:bold;" />1 总结
                    <h3>&nbsp;&nbsp;本季度对对信托、资产、担保、金科、基金1、基金2、金租七个公司风险集市相关共{{ sum_item_cnt }}条数据进行检查,合计问题数{{ sum_problem_cnt }},问题占比{{ total_problem_per }}。
                        <font
                            style="font-style:italic;size:21.3px;font-family:SimSun;color:rgb(91, 155, 213);text-decoration:underline;">
                            补充环比统计和需求完成情况统计</font>
                    </h3>
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);" />
                    &nbsp;&nbsp;注:每个基础数据项为一条数据。例如一个项目的项目名称、项目类别、项目资金用途将会统计为3条数据。问题数据量、系统改造需求数量均按此粒度统计。
                    </br>

                    <h3 />风险集市相关数据质量概况如下(详见附件一):
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th />季度
                                <th />公司
                                <th />监测数据量
                                <th />问题数据量
                                <th />问题数据占比
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in overview_result_1 %}
                            <tr>
                                <td>{{ i.0 }}</td>
                                <td>{{ i.1 }}</td>
                                <td>{{ i.2 }}</td>
                                <td>{{ i.3 }}</td>
                                <td>{{ i.4 }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;" />注:填写备注
                    <h3 />&nbsp;&nbsp;源系统改造需求完成情况如下(详见附件一的“系统改造需求”标签页):
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th />序号
                                <th />公司
                                <th />已完成需求数
                                <th />待完成需求数
                                <th />完成率
                            </tr>
                        </thead>
                        <tbody>
                            <tr>
                                <td />1
                                <td />信托
                                <td />
                                <td />
                                <td />
                            </tr>
                            <tr>
                                <td />2
                                <td />资产
                                <td />
                                <td />
                                <td />
                            </tr>
                            <tr>
                                <td />3
                                <td />担保
                                <td />
                                <td />
                                <td />
                            </tr>
                            <tr>
                                <td />4
                                <td />金科
                                <td />
                                <td />
                                <td />
                            </tr>
                            <tr>
                                <td />5
                                <td />基金1
                                <td />
                                <td />
                                <td />
                            </tr>
                            <tr>
                                <td />6
                                <td />基金2
                                <td />
                                <td />
                                <td />
                            </tr>
                            <tr>
                                <td />7
                                <td />金租
                                <td />
                                <td />
                                <td />
                            </tr>
                            <tr>
                                <td />
                                <td />合计
                                <td />
                                <td />
                                <td />
                            </tr>
                        </tbody>
                    </table>
                    </br>

                    <h3 style="font-weight:bold;" />2 检查方案
                    <h3 />依据标准:《集团数据质量标准V1.0》。
                    <h3 />检查数据范围:
                    <h3 style="color:#FF0000;" />风险集市需要且截止2018年1月1日未结项的数据。
                    <h3 />检查方法:具体参考附件一,主要对数据项进行空值检核、值域检核、类型检核、未创建项检核、合法性检核等。检核规则会逐步完善。
                    </br>

                    <h3 style="font-weight:bold;" />3 数据质量检查结果
                    <h3 />3.1 信托公司
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;">问题分析</h3>
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />数据项
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核规则
                                <th style="background-color:rgb(221,235,247);font-weight:bold;color:#FF0000;" />问题数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />占比
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />建议改进方案
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in ycxt_detail %}
                            <tr>
                                <td>{{ i.0|default_if_none:"" }}</td>
                                <td>{{ i.1|default_if_none:"" }}</td>
                                <td>{{ i.2|default_if_none:"" }}</td>
                                <td>{{ i.3|default_if_none:"" }}</td>
                                <td>{{ i.4|default_if_none:"" }}</td>
                                <td>{{ i.5|default_if_none:"" }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    </br>

                    <h3 />3.2 资产公司
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;">问题分析</h3>
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />数据项
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核规则
                                <th style="background-color:rgb(221,235,247);font-weight:bold;color:#FF0000;" />问题数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />占比
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />建议改进方案
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in yczc_detail %}
                            <tr>
                                <td>{{ i.0|default_if_none:"" }}</td>
                                <td>{{ i.1|default_if_none:"" }}</td>
                                <td>{{ i.2|default_if_none:"" }}</td>
                                <td>{{ i.3|default_if_none:"" }}</td>
                                <td>{{ i.4|default_if_none:"" }}</td>
                                <td>{{ i.5|default_if_none:"" }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    </br>

                    <h3 />3.3 担保公司
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;">问题分析</h3>
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />数据项
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核规则
                                <th style="background-color:rgb(221,235,247);font-weight:bold;color:#FF0000;" />问题数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />占比
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />建议改进方案
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in gdzdb_detail %}
                            <tr>
                                <td>{{ i.0|default_if_none:"" }}</td>
                                <td>{{ i.1|default_if_none:"" }}</td>
                                <td>{{ i.2|default_if_none:"" }}</td>
                                <td>{{ i.3|default_if_none:"" }}</td>
                                <td>{{ i.4|default_if_none:"" }}</td>
                                <td>{{ i.5|default_if_none:"" }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    </br>

                    <h3 />3.4 金科公司
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;">问题分析</h3>
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />数据项
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核规则
                                <th style="background-color:rgb(221,235,247);font-weight:bold;color:#FF0000;" />问题数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />占比
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />建议改进方案
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in ycjk_detail %}
                            <tr>
                                <td>{{ i.0|default_if_none:"" }}</td>
                                <td>{{ i.1|default_if_none:"" }}</td>
                                <td>{{ i.2|default_if_none:"" }}</td>
                                <td>{{ i.3|default_if_none:"" }}</td>
                                <td>{{ i.4|default_if_none:"" }}</td>
                                <td>{{ i.5|default_if_none:"" }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    </br>

                    <h3 />3.5 基金1
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;">问题分析</h3>
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />数据项
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核规则
                                <th style="background-color:rgb(221,235,247);font-weight:bold;color:#FF0000;" />问题数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />占比
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />建议改进方案
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in fdct_detail %}
                            <tr>
                                <td>{{ i.0|default_if_none:"" }}</td>
                                <td>{{ i.1|default_if_none:"" }}</td>
                                <td>{{ i.2|default_if_none:"" }}</td>
                                <td>{{ i.3|default_if_none:"" }}</td>
                                <td>{{ i.4|default_if_none:"" }}</td>
                                <td>{{ i.5|default_if_none:"" }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    </br>

                    <h3 />3.6 基金2
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;">问题分析</h3>
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />数据项
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核规则
                                <th style="background-color:rgb(221,235,247);font-weight:bold;color:#FF0000;" />问题数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />占比
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />建议改进方案
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in zyyc_detail %}
                            <tr>
                                <td>{{ i.0|default_if_none:"" }}</td>
                                <td>{{ i.1|default_if_none:"" }}</td>
                                <td>{{ i.2|default_if_none:"" }}</td>
                                <td>{{ i.3|default_if_none:"" }}</td>
                                <td>{{ i.4|default_if_none:"" }}</td>
                                <td>{{ i.5|default_if_none:"" }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    </br>

                    <h3 />3.7 金租公司
                    <h3 style="font-style:italic;color:rgb(91, 155, 213);text-decoration:underline;">问题分析</h3>
                    <table class="table table-bordered">
                        <thead>
                            <tr>
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />数据项
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核规则
                                <th style="background-color:rgb(221,235,247);font-weight:bold;color:#FF0000;" />问题数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />检核数据量
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />占比
                                <th style="background-color:rgb(221,235,247);font-weight:bold;" />建议改进方案
                            </tr>
                        </thead>
                        <tbody>
                            {% for i in jz_detail %}
                            <tr>
                                <td>{{ i.0|default_if_none:"" }}</td>
                                <td>{{ i.1|default_if_none:"" }}</td>
                                <td>{{ i.2|default_if_none:"" }}</td>
                                <td>{{ i.3|default_if_none:"" }}</td>
                                <td>{{ i.4|default_if_none:"" }}</td>
                                <td>{{ i.5|default_if_none:"" }}</td>
                            </tr>
                            {% endfor %}
                        </tbody>
                    </table>
                    </br>

                    <h3 style="font-weight:bold;font-family:SimSun;color:#000;">4 附件</h3>
                    <h3 style="font-family:SimSun;color:#000;">附件一、数据质量检核结果明细</h3>
                    <h3
                        style="font-style:italic;size:21.3px;font-family:SimSun;color:rgb(91, 155, 213);text-decoration:underline;" />
                    &nbsp;&nbsp;插入附件
                    <h3 style="font-family:SimSun;color:#000;">附件二、集团风险数据集市数据标准</h3>
                    <h3
                        style="font-style:italic;size:21.3px;font-family:SimSun;color:rgb(91, 155, 213);text-decoration:underline;" />
                    &nbsp;&nbsp;插入附件
                </div>
            </div>

            <div class="col-md-2">
                <div class="card">
                    <a class="btn jquery-word-export" href="javascript:void(0)" style="color:#000;">
                        <span class="word-icon" style="font-family:'Helvetica', sans-serif;
                        font-size: 24px;
                        font-weight: bold;
                        background-color: #0054a6;
                        color: white;
                        padding: 2px 5px;
                        vertical-align: middle;">W</span>
                        导出为.doc
                    </a>
                </div>
            </div>
            <!-- /.blog-sidebar -->
        </div>
    </div>
</div>

<!-- footer -->
<footer class="navbar-fixed-bottom" style="line-height: 10px;font-size:13px;">
    <div cl
Download .txt
gitextract_j3qqf1bi/

├── .gitattributes
├── .gitignore
├── LICENSE
├── README.md
├── api/
│   ├── __init__.py
│   ├── admin.py
│   ├── api_backend.py
│   ├── api_blood.py
│   ├── api_check.py
│   ├── api_dashboard.py
│   ├── api_datastandard.py
│   ├── api_date.py
│   ├── api_files.py
│   ├── api_quality.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── authorize/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── authorize/
│   │       └── login.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── backend/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── backend/
│   │       ├── crontab.html
│   │       ├── database.html
│   │       ├── database_add.html
│   │       └── database_detail.html
│   ├── tests.py
│   └── views.py
├── blood/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── blood/
│   │       └── analyze.html
│   ├── tests.py
│   └── views.py
├── check/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── autocheck.py
│   ├── crontab_autocheck.py
│   ├── models.py
│   ├── templates/
│   │   └── check/
│   │       ├── blood_analyze.html
│   │       ├── crontab.html
│   │       ├── rule_edit.html
│   │       └── rule_list.html
│   ├── tests.py
│   └── views.py
├── data/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── data/
│   │       ├── dashboard.html
│   │       ├── dashboard_subcompany.html
│   │       ├── report.html
│   │       ├── result_detail.html
│   │       └── template-ui.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── demand/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── insert_excel.sql
│   ├── models.py
│   ├── templates/
│   │   └── demand/
│   │       └── upload_form.html
│   ├── tests.py
│   └── views.py
├── docs/
│   ├── api_views.md
│   ├── authorize_views.md
│   ├── check_views.md
│   ├── data_views.md
│   ├── ddl.sql
│   ├── demand_views.md
│   ├── demo数据.sql
│   ├── files_views.md
│   ├── requirements.txt
│   └── 部署文档.md
├── files/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── files/
│   │       └── file_list.html
│   ├── tests.py
│   └── views.py
├── gconfig.py
├── manage.py
├── mysite/
│   ├── __init__.py
│   ├── db_config.py
│   ├── settings.py
│   ├── source_db_config.py
│   ├── urls.py
│   └── wsgi.py
├── nginx.conf
├── standard/
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── templates/
│   │   └── standard/
│   │       ├── show.html
│   │       └── update.html
│   ├── tests.py
│   └── views.py
├── static/
│   ├── CodeMirror/
│   │   ├── lib/
│   │   │   ├── codemirror.css
│   │   │   └── codemirror.js
│   │   ├── mode/
│   │   │   └── sql.js
│   │   └── theme/
│   │       └── eclipse.css
│   ├── check/
│   │   └── css/
│   │       ├── admin/
│   │       │   ├── jquery.dataTables.css
│   │       │   └── style.css
│   │       └── login.css
│   ├── css/
│   │   ├── animate.css
│   │   ├── bak/
│   │   │   └── animate.css
│   │   ├── datatables/
│   │   │   ├── datatables-site.css
│   │   │   ├── jquery.dataTables.css
│   │   │   └── jquery.dataTables.css.origin
│   │   ├── datatables.css
│   │   ├── fonts.css
│   │   ├── helper.css
│   │   ├── icons.css
│   │   ├── lib/
│   │   │   └── bootstrap/
│   │   │       └── bootstrap3.css
│   │   ├── login.css
│   │   ├── material-dash.css
│   │   ├── rule_list.css
│   │   ├── spinners.css
│   │   ├── style.css
│   │   └── sweetalert.css
│   ├── files/
│   │   ├── 信托公司风险指标.xlsx
│   │   ├── 基金1公司风险指标.xlsx
│   │   ├── 基金2公司风险指标.xlsx
│   │   ├── 担保公司风险指标.xlsx
│   │   ├── 资产公司风险指标.xlsx
│   │   ├── 金科公司风险指标.xlsx
│   │   └── 金租公司风险指标.xlsx
│   ├── fonts/
│   │   └── fontAwesome.otf
│   ├── icons/
│   │   ├── linea-icons/
│   │   │   └── linea.css
│   │   ├── simple-line-icons/
│   │   │   └── css/
│   │   │       └── simple-line-icons.css
│   │   └── themify-icons/
│   │       └── themify-icons.css
│   ├── js/
│   │   ├── DataTables/
│   │   │   ├── AutoFill-2.3.3/
│   │   │   │   ├── css/
│   │   │   │   │   ├── autoFill.bootstrap.css
│   │   │   │   │   ├── autoFill.bootstrap4.css
│   │   │   │   │   ├── autoFill.dataTables.css
│   │   │   │   │   ├── autoFill.foundation.css
│   │   │   │   │   ├── autoFill.jqueryui.css
│   │   │   │   │   └── autoFill.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── autoFill.bootstrap.js
│   │   │   │       ├── autoFill.bootstrap4.js
│   │   │   │       ├── autoFill.foundation.js
│   │   │   │       ├── autoFill.jqueryui.js
│   │   │   │       ├── autoFill.semanticui.js
│   │   │   │       └── dataTables.autoFill.js
│   │   │   ├── Buttons-1.5.6/
│   │   │   │   ├── css/
│   │   │   │   │   ├── buttons.bootstrap.css
│   │   │   │   │   ├── buttons.bootstrap4.css
│   │   │   │   │   ├── buttons.dataTables.css
│   │   │   │   │   ├── buttons.foundation.css
│   │   │   │   │   ├── buttons.jqueryui.css
│   │   │   │   │   ├── buttons.semanticui.css
│   │   │   │   │   ├── common.scss
│   │   │   │   │   └── mixins.scss
│   │   │   │   ├── js/
│   │   │   │   │   ├── buttons.bootstrap.js
│   │   │   │   │   ├── buttons.bootstrap4.js
│   │   │   │   │   ├── buttons.colVis.js
│   │   │   │   │   ├── buttons.flash.js
│   │   │   │   │   ├── buttons.foundation.js
│   │   │   │   │   ├── buttons.html5.js
│   │   │   │   │   ├── buttons.jqueryui.js
│   │   │   │   │   ├── buttons.print.js
│   │   │   │   │   ├── buttons.semanticui.js
│   │   │   │   │   └── dataTables.buttons.js
│   │   │   │   └── swf/
│   │   │   │       └── flashExport.swf
│   │   │   ├── ColReorder-1.5.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── colReorder.bootstrap.css
│   │   │   │   │   ├── colReorder.bootstrap4.css
│   │   │   │   │   ├── colReorder.dataTables.css
│   │   │   │   │   ├── colReorder.foundation.css
│   │   │   │   │   ├── colReorder.jqueryui.css
│   │   │   │   │   └── colReorder.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── colReorder.bootstrap.js
│   │   │   │       ├── colReorder.bootstrap4.js
│   │   │   │       ├── colReorder.dataTables.js
│   │   │   │       ├── colReorder.foundation.js
│   │   │   │       ├── colReorder.jqueryui.js
│   │   │   │       ├── colReorder.semanicui.js
│   │   │   │       ├── colReorder.semanticui.js
│   │   │   │       └── dataTables.colReorder.js
│   │   │   ├── DataTables-1.10.18/
│   │   │   │   ├── css/
│   │   │   │   │   ├── dataTables.bootstrap.css
│   │   │   │   │   ├── dataTables.bootstrap4.css
│   │   │   │   │   ├── dataTables.foundation.css
│   │   │   │   │   ├── dataTables.jqueryui.css
│   │   │   │   │   ├── dataTables.semanticui.css
│   │   │   │   │   └── jquery.dataTables.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.bootstrap.js
│   │   │   │       ├── dataTables.bootstrap4.js
│   │   │   │       ├── dataTables.foundation.js
│   │   │   │       ├── dataTables.jqueryui.js
│   │   │   │       ├── dataTables.semanticui.js
│   │   │   │       └── jquery.dataTables.js
│   │   │   ├── FixedColumns-3.2.5/
│   │   │   │   ├── css/
│   │   │   │   │   ├── fixedColumns.bootstrap.css
│   │   │   │   │   ├── fixedColumns.bootstrap4.css
│   │   │   │   │   ├── fixedColumns.dataTables.css
│   │   │   │   │   ├── fixedColumns.foundation.css
│   │   │   │   │   ├── fixedColumns.jqueryui.css
│   │   │   │   │   └── fixedColumns.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.fixedColumns.js
│   │   │   │       ├── fixedColumns.bootstrap.js
│   │   │   │       ├── fixedColumns.bootstrap4.js
│   │   │   │       ├── fixedColumns.dataTables.js
│   │   │   │       ├── fixedColumns.foundation.js
│   │   │   │       ├── fixedColumns.jqueryui.js
│   │   │   │       ├── fixedColumns.semanicui.js
│   │   │   │       └── fixedColumns.semanticui.js
│   │   │   ├── FixedHeader-3.1.4/
│   │   │   │   ├── css/
│   │   │   │   │   ├── fixedHeader.bootstrap.css
│   │   │   │   │   ├── fixedHeader.bootstrap4.css
│   │   │   │   │   ├── fixedHeader.dataTables.css
│   │   │   │   │   ├── fixedHeader.foundation.css
│   │   │   │   │   ├── fixedHeader.jqueryui.css
│   │   │   │   │   └── fixedHeader.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.fixedHeader.js
│   │   │   │       ├── fixedHeader.bootstrap.js
│   │   │   │       ├── fixedHeader.bootstrap4.js
│   │   │   │       ├── fixedHeader.dataTables.js
│   │   │   │       ├── fixedHeader.foundation.js
│   │   │   │       ├── fixedHeader.jqueryui.js
│   │   │   │       ├── fixedHeader.semanicui.js
│   │   │   │       └── fixedHeader.semanticui.js
│   │   │   ├── JSZip-2.5.0/
│   │   │   │   └── jszip.js
│   │   │   ├── KeyTable-2.5.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── keyTable.bootstrap.css
│   │   │   │   │   ├── keyTable.bootstrap4.css
│   │   │   │   │   ├── keyTable.dataTables.css
│   │   │   │   │   ├── keyTable.foundation.css
│   │   │   │   │   ├── keyTable.jqueryui.css
│   │   │   │   │   └── keyTable.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.keyTable.js
│   │   │   │       ├── keyTable.bootstrap.js
│   │   │   │       ├── keyTable.bootstrap4.js
│   │   │   │       ├── keyTable.dataTables.js
│   │   │   │       ├── keyTable.foundation.js
│   │   │   │       ├── keyTable.jqueryui.js
│   │   │   │       ├── keyTable.semanicui.js
│   │   │   │       └── keyTable.semanticui.js
│   │   │   ├── Responsive-2.2.2/
│   │   │   │   ├── css/
│   │   │   │   │   ├── responsive.bootstrap.css
│   │   │   │   │   ├── responsive.bootstrap4.css
│   │   │   │   │   ├── responsive.dataTables.css
│   │   │   │   │   ├── responsive.foundation.css
│   │   │   │   │   ├── responsive.jqueryui.css
│   │   │   │   │   └── responsive.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.responsive.js
│   │   │   │       ├── responsive.bootstrap.js
│   │   │   │       ├── responsive.bootstrap4.js
│   │   │   │       ├── responsive.foundation.js
│   │   │   │       ├── responsive.jqueryui.js
│   │   │   │       └── responsive.semanticui.js
│   │   │   ├── RowGroup-1.1.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── rowGroup.bootstrap.css
│   │   │   │   │   ├── rowGroup.bootstrap4.css
│   │   │   │   │   ├── rowGroup.dataTables.css
│   │   │   │   │   ├── rowGroup.foundation.css
│   │   │   │   │   ├── rowGroup.jqueryui.css
│   │   │   │   │   └── rowGroup.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.rowGroup.js
│   │   │   │       ├── rowGroup.bootstrap.js
│   │   │   │       ├── rowGroup.bootstrap4.js
│   │   │   │       ├── rowGroup.dataTables.js
│   │   │   │       ├── rowGroup.foundation.js
│   │   │   │       ├── rowGroup.jqueryui.js
│   │   │   │       ├── rowGroup.semanicui.js
│   │   │   │       └── rowGroup.semanticui.js
│   │   │   ├── RowReorder-1.2.4/
│   │   │   │   ├── css/
│   │   │   │   │   ├── rowReorder.bootstrap.css
│   │   │   │   │   ├── rowReorder.bootstrap4.css
│   │   │   │   │   ├── rowReorder.dataTables.css
│   │   │   │   │   ├── rowReorder.foundation.css
│   │   │   │   │   ├── rowReorder.jqueryui.css
│   │   │   │   │   └── rowReorder.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.rowReorder.js
│   │   │   │       ├── rowReorder.bootstrap.js
│   │   │   │       ├── rowReorder.bootstrap4.js
│   │   │   │       ├── rowReorder.dataTables.js
│   │   │   │       ├── rowReorder.foundation.js
│   │   │   │       ├── rowReorder.jqueryui.js
│   │   │   │       └── rowReorder.semanticui.js
│   │   │   ├── Scroller-2.0.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── scroller.bootstrap.css
│   │   │   │   │   ├── scroller.bootstrap4.css
│   │   │   │   │   ├── scroller.dataTables.css
│   │   │   │   │   ├── scroller.foundation.css
│   │   │   │   │   ├── scroller.jqueryui.css
│   │   │   │   │   └── scroller.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.scroller.js
│   │   │   │       ├── scroller.bootstrap.js
│   │   │   │       ├── scroller.bootstrap4.js
│   │   │   │       ├── scroller.dataTables.js
│   │   │   │       ├── scroller.foundation.js
│   │   │   │       ├── scroller.jqueryui.js
│   │   │   │       ├── scroller.semanicui.js
│   │   │   │       └── scroller.semanticui.js
│   │   │   ├── Select-1.3.0/
│   │   │   │   ├── css/
│   │   │   │   │   ├── select.bootstrap.css
│   │   │   │   │   ├── select.bootstrap4.css
│   │   │   │   │   ├── select.dataTables.css
│   │   │   │   │   ├── select.foundation.css
│   │   │   │   │   ├── select.jqueryui.css
│   │   │   │   │   └── select.semanticui.css
│   │   │   │   └── js/
│   │   │   │       ├── dataTables.select.js
│   │   │   │       ├── select.bootstrap.js
│   │   │   │       ├── select.bootstrap4.js
│   │   │   │       ├── select.dataTables.js
│   │   │   │       ├── select.foundation.js
│   │   │   │       ├── select.jqueryui.js
│   │   │   │       └── select.semanticui.js
│   │   │   ├── datatables.css
│   │   │   ├── datatables.js
│   │   │   ├── jQuery-3.3.1/
│   │   │   │   └── jquery-3.3.1.js
│   │   │   └── pdfmake-0.1.36/
│   │   │       ├── pdfmake.js
│   │   │       └── vfs_fonts.js
│   │   ├── Echarts/
│   │   │   ├── echarts-en.common.js
│   │   │   ├── echarts-en.js
│   │   │   ├── echarts-en.simple.js
│   │   │   ├── echarts.common.js
│   │   │   ├── echarts.js
│   │   │   ├── echarts.simple.js
│   │   │   └── extension/
│   │   │       ├── bmap.js
│   │   │       └── dataTool.js
│   │   ├── FileSaver.js
│   │   ├── bootstrap.js
│   │   ├── canvas-nest.js
│   │   ├── dashboard_echarts.js
│   │   ├── get_quality_detail.js
│   │   ├── gojs/
│   │   │   ├── Buttons.js
│   │   │   └── go.js
│   │   ├── init.js
│   │   ├── jquery/
│   │   │   ├── jquery.ba-resize.js
│   │   │   ├── jquery.slimscroll.js
│   │   │   └── jquery.wordexport.js
│   │   ├── login.js
│   │   ├── scripts.js
│   │   └── sidebarmenu.js
│   ├── resource/
│   │   ├── chinese.lang
│   │   ├── demand.json
│   │   └── stdNodes.json
│   └── zTree/
│       ├── css/
│       │   └── zTreeStyle.css
│       └── js/
│           └── fuzzysearch.js
└── utils/
    ├── functions.py
    ├── generate_dim_date.py
    └── report_data.py
Download .txt
Showing preview only (713K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9018 symbols across 66 files)

FILE: api/api_backend.py
  function encrypy_password (line 10) | def encrypy_password(connection_string):
  function db_query (line 20) | def db_query(request):
  function db_update (line 45) | def db_update(request):
  function db_insert (line 90) | def db_insert(request):
  function crontab_enable (line 128) | def crontab_enable(request):
  function crontab_run (line 153) | def crontab_run(request):

FILE: api/api_blood.py
  function query_mapping (line 45) | def query_mapping(request):

FILE: api/api_check.py
  function rule (line 14) | def rule(request):
  function rule_detail (line 49) | def rule_detail(request):
  function rule_update (line 95) | def rule_update(request):
  function rule_add (line 138) | def rule_add(request):
  function rule_status_modify (line 196) | def rule_status_modify(request):
  function rule_execute (line 226) | def rule_execute(request):
  function update_crontab (line 357) | def update_crontab(request):
  function query_check_progress (line 372) | def query_check_progress(request):

FILE: api/api_dashboard.py
  function avg_problem_percentage (line 15) | def avg_problem_percentage(request):
  function same_problem_top5 (line 61) | def same_problem_top5(request):
  function subcompany_data_percentage (line 129) | def subcompany_data_percentage(request):
  function count_db_rows (line 171) | def count_db_rows(request):
  function data_overview_total (line 197) | def data_overview_total(request):
  function data_overview_company (line 249) | def data_overview_company(request):
  function data_overview_company_trend (line 291) | def data_overview_company_trend(request):
  function total_trend (line 324) | def total_trend(request):
  function subcompany_problem_count (line 367) | def subcompany_problem_count(request):

FILE: api/api_datastandard.py
  function db_query (line 10) | def db_query(std_name, std_type):
  function query_detail (line 83) | def query_detail(request):
  function query_update_history (line 96) | def query_update_history(request):
  function update (line 114) | def update(request):
  function query_index (line 216) | def query_index(request):

FILE: api/api_date.py
  function year_list (line 13) | def year_list(request):
  function quarter_list (line 25) | def quarter_list(request):
  function month_list (line 40) | def month_list(request):
  function day_list (line 57) | def day_list(request):

FILE: api/api_files.py
  function download (line 7) | def download(request):

FILE: api/api_quality.py
  function quality_detail (line 11) | def quality_detail(request):
  function report_detail (line 67) | def report_detail(request):

FILE: api/apps.py
  class ApiConfig (line 4) | class ApiConfig(AppConfig):

FILE: authorize/apps.py
  class AuthorizeConfig (line 4) | class AuthorizeConfig(AppConfig):

FILE: authorize/views.py
  function login (line 9) | def login(request):
  function login_auth (line 15) | def login_auth(request):
  function logout (line 68) | def logout(request):

FILE: backend/apps.py
  class BackendConfig (line 4) | class BackendConfig(AppConfig):

FILE: backend/views.py
  function database (line 12) | def database(request):
  function database_detail (line 19) | def database_detail(request):
  function database_add (line 47) | def database_add(request):
  function crontab (line 54) | def crontab(request):

FILE: blood/apps.py
  class BloodConfig (line 4) | class BloodConfig(AppConfig):

FILE: blood/views.py
  function analyze (line 6) | def analyze(request):

FILE: check/apps.py
  class CheckConfig (line 4) | class CheckConfig(AppConfig):

FILE: check/autocheck.py
  class Check (line 16) | class Check(object):
    method __init__ (line 17) | def __init__(self, company):
    method init_table (line 20) | def init_table(self):
    method run_check (line 69) | def run_check(self, db):
    method calc_result (line 152) | def calc_result(self, version):
  class MyThread (line 188) | class MyThread(threading.Thread):
    method __init__ (line 190) | def __init__(self,func,args=()):
    method run (line 194) | def run(self):
    method get_result (line 196) | def get_result(self):

FILE: check/crontab_autocheck.py
  function post_rule_execute (line 6) | def post_rule_execute(company, quarter):

FILE: check/views.py
  function rule_list (line 15) | def rule_list(request):
  function rule_edit (line 29) | def rule_edit(request):
  function rule_execute_manual (line 42) | def rule_execute_manual(request):
  function show_crontab (line 53) | def show_crontab(request):
  function blood_analyze (line 99) | def blood_analyze(request):

FILE: data/apps.py
  class DataConfig (line 4) | class DataConfig(AppConfig):

FILE: data/views.py
  function dashboard (line 8) | def dashboard(request):
  function dashboard_subcompany (line 19) | def dashboard_subcompany(request):
  function result_detail (line 34) | def result_detail(request):
  function report (line 44) | def report(request):

FILE: demand/apps.py
  class DemandConfig (line 4) | class DemandConfig(AppConfig):

FILE: demand/views.py
  function list_subcompany (line 14) | def list_subcompany(request):
  class UploadFileForm (line 46) | class UploadFileForm(forms.Form):
  function import_sheet (line 50) | def import_sheet(request):

FILE: docs/ddl.sql
  type `check_result_template` (line 13) | CREATE TABLE `check_result_template` (
  type `check_execute_log` (line 37) | CREATE TABLE `check_execute_log` (
  type `source_system_demand` (line 49) | CREATE TABLE `source_system_demand` (
  type `data_standard_detail` (line 63) | CREATE TABLE `data_standard_detail` (
  type `data_standard_desc` (line 84) | CREATE TABLE `data_standard_desc` (
  type `data_standard_index` (line 93) | CREATE TABLE `data_standard_index` (
  type `data_standard_update_log` (line 103) | CREATE TABLE `data_standard_update_log` (
  type `dim_date` (line 115) | CREATE TABLE `dim_date` (
  type `source_db_info` (line 139) | CREATE TABLE `source_db_info` (
  type `datacenter_mapping` (line 158) | CREATE TABLE `datacenter_mapping` (

FILE: files/apps.py
  class FilesConfig (line 4) | class FilesConfig(AppConfig):

FILE: files/views.py
  function list (line 9) | def list(request):

FILE: manage.py
  function main (line 7) | def main():

FILE: mysite/db_config.py
  function mysql_connect (line 14) | def mysql_connect():
  function sqlalchemy_conn (line 26) | def sqlalchemy_conn():

FILE: mysite/source_db_config.py
  function sqlserver_db (line 7) | def sqlserver_db():
  function oracle_db (line 17) | def oracle_db():
  function mysql_db (line 24) | def mysql_db():

FILE: standard/apps.py
  class StandardConfig (line 4) | class StandardConfig(AppConfig):

FILE: standard/views.py
  function show (line 7) | def show(request):
  function update (line 13) | def update(request):

FILE: static/CodeMirror/lib/codemirror.js
  function CodeMirror (line 62) | function CodeMirror(place, options) {
  function Display (line 137) | function Display(place, doc, input) {
  function loadMode (line 239) | function loadMode(cm) {
  function resetModeState (line 244) | function resetModeState(cm) {
  function wrappingChanged (line 255) | function wrappingChanged(cm) {
  function estimateHeight (line 273) | function estimateHeight(cm) {
  function estimateLineHeights (line 291) | function estimateLineHeights(cm) {
  function themeChanged (line 299) | function themeChanged(cm) {
  function guttersChanged (line 305) | function guttersChanged(cm) {
  function updateGutters (line 313) | function updateGutters(cm) {
  function updateGutterSpace (line 328) | function updateGutterSpace(cm) {
  function lineLength (line 336) | function lineLength(line) {
  function findMaxLine (line 355) | function findMaxLine(cm) {
  function setGuttersForLineNumbers (line 371) | function setGuttersForLineNumbers(options) {
  function measureForScrollbars (line 385) | function measureForScrollbars(cm) {
  function NativeScrollbars (line 401) | function NativeScrollbars(place, scroll, cm) {
  function maybeDisable (line 473) | function maybeDisable() {
  function NullScrollbars (line 494) | function NullScrollbars() {}
  function initScrollbars (line 505) | function initScrollbars(cm) {
  function updateScrollbars (line 527) | function updateScrollbars(cm, measure) {
  function updateScrollbarsInner (line 541) | function updateScrollbarsInner(cm, measure) {
  function visibleLines (line 564) | function visibleLines(display, doc, viewport) {
  function alignHorizontally (line 589) | function alignHorizontally(cm) {
  function maybeUpdateLineNumberWidth (line 612) | function maybeUpdateLineNumberWidth(cm) {
  function lineNumberFor (line 630) | function lineNumberFor(options, i) {
  function compensateForHScroll (line 637) | function compensateForHScroll(display) {
  function DisplayUpdate (line 643) | function DisplayUpdate(cm, viewport, force) {
  function maybeClipScrollbars (line 667) | function maybeClipScrollbars(cm) {
  function updateDisplayIfNeeded (line 681) | function updateDisplayIfNeeded(cm, update) {
  function postUpdateDisplay (line 753) | function postUpdateDisplay(cm, update) {
  function updateDisplaySimple (line 782) | function updateDisplaySimple(cm, viewport) {
  function setDocumentHeight (line 795) | function setDocumentHeight(cm, measure) {
  function updateHeightsInViewport (line 803) | function updateHeightsInViewport(cm) {
  function updateWidgetHeight (line 830) | function updateWidgetHeight(line) {
  function getDimensions (line 837) | function getDimensions(cm) {
  function patchDisplay (line 855) | function patchDisplay(cm, updateNumbersFrom, dims) {
  function updateLineForChanges (line 900) | function updateLineForChanges(cm, lineView, lineN, dims) {
  function ensureLineWrapped (line 913) | function ensureLineWrapped(lineView) {
  function updateLineBackground (line 924) | function updateLineBackground(lineView) {
  function getLineContent (line 938) | function getLineContent(cm, lineView) {
  function updateLineText (line 951) | function updateLineText(cm, lineView) {
  function updateLineClasses (line 966) | function updateLineClasses(lineView) {
  function updateLineGutter (line 976) | function updateLineGutter(cm, lineView, lineN, dims) {
  function updateLineWidgets (line 1016) | function updateLineWidgets(cm, lineView, dims) {
  function buildLineElement (line 1027) | function buildLineElement(cm, lineView, lineN, dims) {
  function insertLineWidgets (line 1041) | function insertLineWidgets(cm, lineView, dims) {
  function insertLineWidgetsFor (line 1047) | function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) {
  function positionLineWidget (line 1063) | function positionLineWidget(widget, node, lineView, dims) {
  function copyPos (line 1093) | function copyPos(x) {return Pos(x.line, x.ch);}
  function maxPos (line 1094) | function maxPos(a, b) { return cmp(a, b) < 0 ? b : a; }
  function minPos (line 1095) | function minPos(a, b) { return cmp(a, b) < 0 ? a : b; }
  function ensureFocus (line 1099) | function ensureFocus(cm) {
  function applyTextInput (line 1108) | function applyTextInput(cm, inserted, deleted, sel, origin) {
  function handlePaste (line 1155) | function handlePaste(e, cm) {
  function triggerElectric (line 1165) | function triggerElectric(cm, inserted) {
  function copyableRanges (line 1189) | function copyableRanges(cm) {
  function disableBrowserMagic (line 1200) | function disableBrowserMagic(field, spellcheck) {
  function TextareaInput (line 1208) | function TextareaInput(cm) {
  function hiddenTextarea (line 1227) | function hiddenTextarea() {
  function prepareCopyCut (line 1268) | function prepareCopyCut(e) {
  function p (line 1409) | function p() {
  function prepareSelectAllHack (line 1513) | function prepareSelectAllHack() {
  function rehide (line 1526) | function rehide() {
  function ContentEditableInput (line 1570) | function ContentEditableInput(cm) {
  function onCopyCut (line 1631) | function onCopyCut(e) {
  function poll (line 1768) | function poll() {
  function posToDOM (line 1888) | function posToDOM(cm, pos) {
  function badPos (line 1904) | function badPos(pos, bad) { if (bad) pos.bad = true; return pos; }
  function domToPos (line 1906) | function domToPos(cm, node, offset) {
  function locateNodeInLineView (line 1925) | function locateNodeInLineView(lineView, node, offset) {
  function domTextBetween (line 1980) | function domTextBetween(cm, from, to, fromLine, toLine) {
  function Selection (line 2030) | function Selection(ranges, primIndex) {
  function Range (line 2067) | function Range(anchor, head) {
  function normalizeSelection (line 2082) | function normalizeSelection(ranges, primIndex) {
  function simpleSelection (line 2098) | function simpleSelection(anchor, head) {
  function clipLine (line 2104) | function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.fi...
  function clipPos (line 2105) | function clipPos(doc, pos) {
  function clipToLen (line 2111) | function clipToLen(pos, linelen) {
  function isLine (line 2117) | function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.si...
  function clipPosArray (line 2118) | function clipPosArray(doc, array) {
  function extendRange (line 2133) | function extendRange(doc, range, head, other) {
  function extendSelection (line 2152) | function extendSelection(doc, head, other, options) {
  function extendSelections (line 2158) | function extendSelections(doc, heads, options) {
  function replaceOneSelection (line 2166) | function replaceOneSelection(doc, i, range, options) {
  function setSimpleSelection (line 2173) | function setSimpleSelection(doc, anchor, head, options) {
  function filterSelectionChange (line 2179) | function filterSelectionChange(doc, sel, options) {
  function setSelectionReplaceHistory (line 2196) | function setSelectionReplaceHistory(doc, sel, options) {
  function setSelection (line 2207) | function setSelection(doc, sel, options) {
  function setSelectionNoUndo (line 2212) | function setSelectionNoUndo(doc, sel, options) {
  function setSelectionInner (line 2224) | function setSelectionInner(doc, sel) {
  function reCheckSelection (line 2238) | function reCheckSelection(doc) {
  function skipAtomicInSelection (line 2244) | function skipAtomicInSelection(doc, sel, bias, mayClear) {
  function skipAtomicInner (line 2259) | function skipAtomicInner(doc, pos, oldPos, dir, mayClear) {
  function skipAtomic (line 2292) | function skipAtomic(doc, pos, oldPos, bias, mayClear) {
  function movePos (line 2305) | function movePos(doc, pos, dir, line) {
  function updateSelection (line 2319) | function updateSelection(cm) {
  function prepareSelection (line 2323) | function prepareSelection(cm, primary) {
  function drawSelectionCursor (line 2342) | function drawSelectionCursor(cm, head, output) {
  function drawSelectionRange (line 2361) | function drawSelectionRange(cm, range, output) {
  function restartBlink (line 2436) | function restartBlink(cm) {
  function startWorker (line 2452) | function startWorker(cm, time) {
  function highlightWorker (line 2457) | function highlightWorker(cm) {
  function findStartLine (line 2500) | function findStartLine(cm, n, precise) {
  function getStateBefore (line 2516) | function getStateBefore(cm, n, precise) {
  function paddingTop (line 2534) | function paddingTop(display) {return display.lineSpace.offsetTop;}
  function paddingVert (line 2535) | function paddingVert(display) {return display.mover.offsetHeight - displ...
  function paddingH (line 2536) | function paddingH(display) {
  function scrollGap (line 2545) | function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth; }
  function displayWidth (line 2546) | function displayWidth(cm) {
  function displayHeight (line 2549) | function displayHeight(cm) {
  function ensureLineHeights (line 2557) | function ensureLineHeights(cm, lineView, rect) {
  function mapFromLineView (line 2578) | function mapFromLineView(lineView, line, lineN) {
  function updateExternalMeasurement (line 2591) | function updateExternalMeasurement(cm, line) {
  function measureChar (line 2604) | function measureChar(cm, line, ch, bias) {
  function findViewForLine (line 2609) | function findViewForLine(cm, lineN) {
  function prepareMeasureForLine (line 2622) | function prepareMeasureForLine(cm, line) {
  function measureCharPrepared (line 2644) | function measureCharPrepared(cm, prepared, ch, bias, varHeight) {
  function nodeAndOffsetInLineMap (line 2666) | function nodeAndOffsetInLineMap(map, ch, bias) {
  function getUsefulRect (line 2703) | function getUsefulRect(rects, bias) {
  function measureCharInner (line 2713) | function measureCharInner(cm, prepared, ch, bias) {
  function maybeUpdateRectForZooming (line 2765) | function maybeUpdateRectForZooming(measure, rect) {
  function clearLineMeasurementCacheFor (line 2775) | function clearLineMeasurementCacheFor(lineView) {
  function clearLineMeasurementCache (line 2784) | function clearLineMeasurementCache(cm) {
  function clearCaches (line 2791) | function clearCaches(cm) {
  function pageScrollX (line 2798) | function pageScrollX() { return window.pageXOffset || (document.document...
  function pageScrollY (line 2799) | function pageScrollY() { return window.pageYOffset || (document.document...
  function intoCoordSystem (line 2805) | function intoCoordSystem(cm, lineObj, rect, context) {
  function fromCoordSystem (line 2827) | function fromCoordSystem(cm, coords, context) {
  function charCoords (line 2844) | function charCoords(cm, pos, context, lineObj, bias) {
  function cursorCoords (line 2852) | function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHei...
  function estimateCoords (line 2884) | function estimateCoords(cm, pos) {
  function PosWithInfo (line 2898) | function PosWithInfo(line, ch, outside, xRel) {
  function coordsChar (line 2907) | function coordsChar(cm, x, y) {
  function coordsCharInner (line 2928) | function coordsCharInner(cm, lineObj, lineNo, x, y) {
  function textHeight (line 2983) | function textHeight(display) {
  function charWidth (line 3003) | function charWidth(display) {
  function startOperation (line 3025) | function startOperation(cm) {
  function fireCallbacksForOps (line 3053) | function fireCallbacksForOps(group) {
  function endOperation (line 3070) | function endOperation(cm) {
  function endOperations (line 3085) | function endOperations(group) {
  function endOperation_R1 (line 3099) | function endOperation_R1(op) {
  function endOperation_W1 (line 3112) | function endOperation_W1(op) {
  function endOperation_R2 (line 3116) | function endOperation_R2(op) {
  function endOperation_W2 (line 3137) | function endOperation_W2(op) {
  function endOperation_finish (line 3162) | function endOperation_finish(op) {
  function runInOp (line 3209) | function runInOp(cm, f) {
  function operation (line 3216) | function operation(cm, f) {
  function methodOp (line 3226) | function methodOp(f) {
  function docMethodOp (line 3234) | function docMethodOp(f) {
  function LineView (line 3249) | function LineView(doc, line, lineN) {
  function buildViewArray (line 3261) | function buildViewArray(cm, from, to) {
  function regChange (line 3277) | function regChange(cm, from, to, lendiff) {
  function regLineChange (line 3342) | function regLineChange(cm, line, type) {
  function resetView (line 3356) | function resetView(cm) {
  function findViewIndex (line 3364) | function findViewIndex(cm, n) {
  function viewCuttingPoint (line 3375) | function viewCuttingPoint(cm, oldN, newN, dir) {
  function adjustView (line 3401) | function adjustView(cm, from, to) {
  function countDirtyView (line 3422) | function countDirtyView(cm) {
  function registerEventHandlers (line 3434) | function registerEventHandlers(cm) {
  function dragDropChanged (line 3540) | function dragDropChanged(cm, value, old) {
  function onResize (line 3554) | function onResize(cm) {
  function eventInWidget (line 3567) | function eventInWidget(display, e) {
  function posFromMouse (line 3580) | function posFromMouse(cm, e, liberal, forRect) {
  function onMouseDown (line 3601) | function onMouseDown(e) {
  function leftButtonDown (line 3643) | function leftButtonDown(cm, e, start) {
  function leftButtonStartDrag (line 3670) | function leftButtonStartDrag(cm, e, start, modifier) {
  function leftButtonSelect (line 3699) | function leftButtonSelect(cm, e, start, type, addNew) {
  function gutterEvent (line 3845) | function gutterEvent(cm, e, type, prevent) {
  function clickInGutter (line 3868) | function clickInGutter(cm, e) {
  function onDrop (line 3876) | function onDrop(e) {
  function onDragStart (line 3935) | function onDragStart(cm, e) {
  function onDragOver (line 3958) | function onDragOver(cm, e) {
  function clearDragCursor (line 3970) | function clearDragCursor(cm) {
  function setScrollTop (line 3981) | function setScrollTop(cm, val) {
  function setScrollLeft (line 3992) | function setScrollLeft(cm, val, isScroller) {
  function onScrollWheel (line 4036) | function onScrollWheel(cm, e) {
  function doHandleBinding (line 4114) | function doHandleBinding(cm, bound, dropShift) {
  function lookupKeyForEditor (line 4134) | function lookupKeyForEditor(cm, name, handle) {
  function dispatchKey (line 4144) | function dispatchKey(cm, name, e, handle) {
  function handleKeyBinding (line 4176) | function handleKeyBinding(cm, e) {
  function handleCharBinding (line 4195) | function handleCharBinding(cm, e, ch) {
  function onKeyDown (line 4201) | function onKeyDown(e) {
  function showCrossHair (line 4222) | function showCrossHair(cm) {
  function onKeyUp (line 4237) | function onKeyUp(e) {
  function onKeyPress (line 4242) | function onKeyPress(e) {
  function delayBlurEvent (line 4255) | function delayBlurEvent(cm) {
  function onFocus (line 4265) | function onFocus(cm, e) {
  function onBlur (line 4284) | function onBlur(cm, e) {
  function onContextMenu (line 4301) | function onContextMenu(cm, e) {
  function contextMenuInGutter (line 4307) | function contextMenuInGutter(cm, e) {
  function adjustForChange (line 4324) | function adjustForChange(pos, change) {
  function computeSelAfterChange (line 4333) | function computeSelAfterChange(doc, change) {
  function offsetPos (line 4343) | function offsetPos(pos, old, nw) {
  function computeReplacedSel (line 4352) | function computeReplacedSel(doc, changes, hint) {
  function filterChange (line 4372) | function filterChange(doc, change, update) {
  function makeChange (line 4396) | function makeChange(doc, change, ignoreReadOnly) {
  function makeChangeInner (line 4418) | function makeChangeInner(doc, change) {
  function makeChangeFromHistory (line 4436) | function makeChangeFromHistory(doc, type, allowSelectionOnly) {
  function shiftDoc (line 4502) | function shiftDoc(doc, distance) {
  function makeChangeSingleDoc (line 4518) | function makeChangeSingleDoc(doc, change, selAfter, spans) {
  function makeChangeSingleDocInEditor (line 4551) | function makeChangeSingleDocInEditor(cm, change, spans) {
  function replaceRange (line 4610) | function replaceRange(doc, code, from, to, origin) {
  function maybeScrollWindow (line 4621) | function maybeScrollWindow(cm, coords) {
  function scrollPosIntoView (line 4641) | function scrollPosIntoView(cm, pos, end, margin) {
  function scrollIntoView (line 4665) | function scrollIntoView(cm, x1, y1, x2, y2) {
  function calculateScrollPos (line 4675) | function calculateScrollPos(cm, x1, y1, x2, y2) {
  function addToScrollPos (line 4705) | function addToScrollPos(cm, left, top) {
  function ensureCursorVisible (line 4715) | function ensureCursorVisible(cm) {
  function resolveScrollToPos (line 4729) | function resolveScrollToPos(cm) {
  function indentLine (line 4749) | function indentLine(cm, n, how, aggressive) {
  function changeLine (line 4811) | function changeLine(doc, handle, changeType, op) {
  function deleteNearSelection (line 4822) | function deleteNearSelection(cm, compute) {
  function findPosH (line 4854) | function findPosH(doc, pos, dir, unit, visually) {
  function findPosV (line 4906) | function findPosV(cm, pos, dir, unit) {
  function interpret (line 5331) | function interpret(val) {
  function option (line 5387) | function option(name, deflt, handle, notOnInit) {
  function normalizeKeyName (line 5859) | function normalizeKeyName(name) {
  function getKeyMap (line 5945) | function getKeyMap(val) {
  function save (line 5966) | function save() {textarea.value = cm.getValue();}
  function markText (line 6216) | function markText(doc, from, to, options, type) {
  function markTextShared (line 6309) | function markTextShared(doc, from, to, options, type) {
  function findSharedMarkers (line 6324) | function findSharedMarkers(doc) {
  function copySharedMarkers (line 6329) | function copySharedMarkers(doc, markers) {
  function detachSharedMarkers (line 6341) | function detachSharedMarkers(markers) {
  function MarkedSpan (line 6357) | function MarkedSpan(marker, from, to) {
  function getMarkedSpanFor (line 6363) | function getMarkedSpanFor(spans, marker) {
  function removeMarkedSpan (line 6371) | function removeMarkedSpan(spans, span) {
  function addMarkedSpan (line 6377) | function addMarkedSpan(line, span) {
  function markedSpansBefore (line 6386) | function markedSpansBefore(old, startCh, isInsert) {
  function markedSpansAfter (line 6397) | function markedSpansAfter(old, endCh, isInsert) {
  function stretchSpansOverChange (line 6416) | function stretchSpansOverChange(doc, change) {
  function clearEmptySpans (line 6478) | function clearEmptySpans(spans) {
  function mergeOldSpans (line 6492) | function mergeOldSpans(doc, change) {
  function removeReadOnlyRanges (line 6515) | function removeReadOnlyRanges(doc, from, to) {
  function detachMarkedSpans (line 6544) | function detachMarkedSpans(line) {
  function attachMarkedSpans (line 6551) | function attachMarkedSpans(line, spans) {
  function extraLeft (line 6560) | function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0; }
  function extraRight (line 6561) | function extraRight(marker) { return marker.inclusiveRight ? 1 : 0; }
  function compareCollapsedMarkers (line 6566) | function compareCollapsedMarkers(a, b) {
  function collapsedSpanAtSide (line 6579) | function collapsedSpanAtSide(line, start) {
  function collapsedSpanAtStart (line 6589) | function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, t...
  function collapsedSpanAtEnd (line 6590) | function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, fal...
  function conflictingCollapsedRange (line 6595) | function conflictingCollapsedRange(doc, lineNo, from, to, marker) {
  function visualLine (line 6615) | function visualLine(line) {
  function visualLineContinued (line 6624) | function visualLineContinued(line) {
  function visualLineNo (line 6635) | function visualLineNo(doc, lineN) {
  function visualLineEndNo (line 6642) | function visualLineEndNo(doc, lineN) {
  function lineIsHidden (line 6654) | function lineIsHidden(doc, line) {
  function lineIsHiddenInner (line 6665) | function lineIsHiddenInner(doc, line, span) {
  function adjustScrollWhenAboveVisible (line 6693) | function adjustScrollWhenAboveVisible(cm, line, diff) {
  function widgetHeight (line 6722) | function widgetHeight(widget) {
  function addLineWidget (line 6737) | function addLineWidget(doc, handle, node, options) {
  function updateLine (line 6772) | function updateLine(line, text, markedSpans, estimateHeight) {
  function cleanUpLine (line 6784) | function cleanUpLine(line) {
  function extractLineClasses (line 6789) | function extractLineClasses(type, output) {
  function callBlankLine (line 6803) | function callBlankLine(mode, state) {
  function readToken (line 6810) | function readToken(mode, stream, state, inner) {
  function takeToken (line 6820) | function takeToken(cm, pos, precise, asArray) {
  function runMode (line 6842) | function runMode(cm, text, mode, state, f, lineClasses, forceToEnd) {
  function highlightLine (line 6885) | function highlightLine(cm, line, state, forceToEnd) {
  function getLineStyles (line 6923) | function getLineStyles(cm, line, updateFrontier) {
  function processLine (line 6939) | function processLine(cm, text, state, startAt) {
  function interpretTokenStyle (line 6954) | function interpretTokenStyle(style, options) {
  function buildLineContent (line 6966) | function buildLineContent(cm, lineView) {
  function defaultSpecialCharPlaceholder (line 7024) | function defaultSpecialCharPlaceholder(ch) {
  function buildToken (line 7033) | function buildToken(builder, text, style, startStyle, endStyle, title, c...
  function splitSpaces (line 7092) | function splitSpaces(text, trailingBefore) {
  function buildTokenBadBidi (line 7107) | function buildTokenBadBidi(inner, order) {
  function buildCollapsedSpan (line 7126) | function buildCollapsedSpan(builder, size, marker, ignoreWidget) {
  function insertLineContent (line 7144) | function insertLineContent(line, builder, styles) {
  function isWholeLineUpdate (line 7217) | function isWholeLineUpdate(doc, change) {
  function updateDoc (line 7223) | function updateDoc(doc, change, markedSpans, estimateHeight) {
  function LeafChunk (line 7286) | function LeafChunk(lines) {
  function BranchChunk (line 7326) | function BranchChunk(children) {
  function linkedDocs (line 7799) | function linkedDocs(doc, f, sharedHistOnly) {
  function attachDoc (line 7814) | function attachDoc(cm, doc) {
  function getLine (line 7828) | function getLine(doc, n) {
  function getBetween (line 7843) | function getBetween(doc, start, end) {
  function getLines (line 7855) | function getLines(doc, from, to) {
  function updateLineHeight (line 7863) | function updateLineHeight(line, height) {
  function lineNo (line 7870) | function lineNo(line) {
  function lineAtHeight (line 7884) | function lineAtHeight(chunk, h) {
  function heightAtLine (line 7905) | function heightAtLine(lineObj) {
  function getOrder (line 7927) | function getOrder(line) {
  function History (line 7935) | function History(startGen) {
  function historyChangeFromChange (line 7952) | function historyChangeFromChange(doc, change) {
  function clearSelectionEvents (line 7961) | function clearSelectionEvents(array) {
  function lastChangeEvent (line 7971) | function lastChangeEvent(hist, force) {
  function addChangeToHistory (line 7986) | function addChangeToHistory(doc, change, selAfter, opId) {
  function selectionEventCanBeMerged (line 8028) | function selectionEventCanBeMerged(doc, origin, prev, sel) {
  function addSelectionToHistory (line 8041) | function addSelectionToHistory(doc, sel, opId, options) {
  function pushSelectionToHistory (line 8063) | function pushSelectionToHistory(sel, dest) {
  function attachLocalSpans (line 8070) | function attachLocalSpans(doc, change, from, to) {
  function removeClearedSpans (line 8081) | function removeClearedSpans(spans) {
  function getOldSpans (line 8091) | function getOldSpans(doc, change) {
  function copyHistoryArray (line 8101) | function copyHistoryArray(events, newGroup, instantiateSel) {
  function rebaseHistSelSingle (line 8126) | function rebaseHistSelSingle(pos, from, to, diff) {
  function rebaseHistArray (line 8142) | function rebaseHistArray(array, from, to, diff) {
  function rebaseHist (line 8170) | function rebaseHist(hist, change) {
  function e_defaultPrevented (line 8189) | function e_defaultPrevented(e) {
  function e_target (line 8194) | function e_target(e) {return e.target || e.srcElement;}
  function e_button (line 8195) | function e_button(e) {
  function getHandlers (line 8224) | function getHandlers(emitter, type, copy) {
  function signalLater (line 8258) | function signalLater(emitter, type /*, values...*/) {
  function fireOrphanDelayed (line 8275) | function fireOrphanDelayed() {
  function signalDOMEvent (line 8284) | function signalDOMEvent(cm, e, override) {
  function signalCursorActivity (line 8291) | function signalCursorActivity(cm) {
  function hasHandler (line 8299) | function hasHandler(emitter, type) {
  function eventMixin (line 8305) | function eventMixin(ctor) {
  function Delayed (line 8322) | function Delayed() {this.id = null;}
  function spaceStr (line 8362) | function spaceStr(n) {
  function lst (line 8368) | function lst(arr) { return arr[arr.length-1]; }
  function indexOf (line 8376) | function indexOf(array, elt) {
  function map (line 8381) | function map(array, f) {
  function insertSorted (line 8387) | function insertSorted(array, value, score) {
  function nothing (line 8393) | function nothing() {}
  function createObj (line 8395) | function createObj(base, props) {
  function copyObj (line 8407) | function copyObj(obj, target, overwrite) {
  function bind (line 8415) | function bind(f) {
  function isWordChar (line 8425) | function isWordChar(ch, helper) {
  function isEmpty (line 8431) | function isEmpty(obj) {
  function isExtendingChar (line 8442) | function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendi...
  function elt (line 8446) | function elt(tag, content, className, style) {
  function removeChildren (line 8472) | function removeChildren(e) {
  function removeChildrenAndAdd (line 8478) | function removeChildrenAndAdd(parent, e) {
  function activeElt (line 8493) | function activeElt() {
  function classTest (line 8506) | function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)...
  function joinClasses (line 8519) | function joinClasses(a, b) {
  function forEachCodeMirror (line 8532) | function forEachCodeMirror(f) {
  function ensureGlobalHandlers (line 8542) | function ensureGlobalHandlers() {
  function registerGlobalHandlers (line 8547) | function registerGlobalHandlers() {
  function zeroWidthElement (line 8574) | function zeroWidthElement(measure) {
  function hasBadBidiRects (line 8589) | function hasBadBidiRects(measure) {
  function hasBadZoomedRects (line 8637) | function hasBadZoomedRects(measure) {
  function iterateBidiSections (line 8668) | function iterateBidiSections(order, from, to, f) {
  function bidiLeft (line 8681) | function bidiLeft(part) { return part.level % 2 ? part.to : part.from; }
  function bidiRight (line 8682) | function bidiRight(part) { return part.level % 2 ? part.from : part.to; }
  function lineLeft (line 8684) | function lineLeft(line) { var order = getOrder(line); return order ? bid...
  function lineRight (line 8685) | function lineRight(line) {
  function lineStart (line 8691) | function lineStart(cm, lineN) {
  function lineEnd (line 8699) | function lineEnd(cm, lineN) {
  function lineStartSmart (line 8709) | function lineStartSmart(cm, pos) {
  function compareBidiLevel (line 8721) | function compareBidiLevel(order, a, b) {
  function getBidiPartAt (line 8728) | function getBidiPartAt(order, pos) {
  function moveInLine (line 8748) | function moveInLine(line, pos, dir, byUnit) {
  function moveVisually (line 8760) | function moveVisually(line, start, dir, byUnit) {
  function moveLogically (line 8783) | function moveLogically(line, start, dir, byUnit) {
  function charType (line 8817) | function charType(code) {
  function BidiSpan (line 8832) | function BidiSpan(level, from, to) {

FILE: static/CodeMirror/mode/sql.js
  function tokenBase (line 26) | function tokenBase(stream, state) {
  function tokenLiteral (line 120) | function tokenLiteral(quote) {
  function tokenComment (line 133) | function tokenComment(stream, state) {
  function pushContext (line 149) | function pushContext(stream, state, type) {
  function popContext (line 158) | function popContext(state) {
  function hookIdentifier (line 209) | function hookIdentifier(stream) {
  function hookVar (line 221) | function hookVar(stream) {
  function hookClient (line 248) | function hookClient(stream) {
  function set (line 263) | function set(str) {

FILE: static/js/DataTables/Buttons-1.5.6/js/buttons.flash.js
  function createCellPos (line 651) | function createCellPos( n ){
  function _createNode (line 675) | function _createNode( doc, nodeName, opts ){
  function _excelColWidth (line 703) | function _excelColWidth( data, col ) {
  function _xlsxToStrings (line 765) | function _xlsxToStrings( obj ) {

FILE: static/js/DataTables/Buttons-1.5.6/js/buttons.html5.js
  function _jsZip (line 44) | function _jsZip () {
  function _pdfMake (line 47) | function _pdfMake () {
  function createCellPos (line 355) | function createCellPos( n ){
  function _addToZip (line 383) | function _addToZip( zip, obj ) {
  function _createNode (line 463) | function _createNode( doc, nodeName, opts ) {
  function _excelColWidth (line 491) | function _excelColWidth( data, col ) {

FILE: static/js/DataTables/Buttons-1.5.6/js/dataTables.buttons.js
  function _init (line 1946) | function _init ( settings ) {

FILE: static/js/DataTables/ColReorder-1.5.0/js/dataTables.colReorder.js
  function fnInvertKeyValues (line 60) | function fnInvertKeyValues( aIn )
  function fnArraySwitch (line 79) | function fnArraySwitch( aArray, iFrom, iTo )
  function fnDomSwitch (line 95) | function fnDomSwitch( nParent, iFrom, iTo )

FILE: static/js/DataTables/DataTables-1.10.18/js/jquery.dataTables.js
  function _fnHungarianMap (line 1655) | function _fnHungarianMap ( o )
  function _fnCamelToHungarian (line 1693) | function _fnCamelToHungarian ( src, user, force )
  function _fnLanguageCompat (line 1732) | function _fnLanguageCompat( lang )
  function _fnCompatOpts (line 1794) | function _fnCompatOpts ( init )
  function _fnCompatCols (line 1835) | function _fnCompatCols ( init )
  function _fnBrowserDetect (line 1855) | function _fnBrowserDetect( settings )
  function _fnReduce (line 1935) | function _fnReduce ( that, fn, init, start, end, inc )
  function _fnAddColumn (line 1969) | function _fnAddColumn( oSettings, nTh )
  function _fnColumnOptions (line 2001) | function _fnColumnOptions( oSettings, iCol, oOptions )
  function _fnAdjustColumnSizing (line 2132) | function _fnAdjustColumnSizing ( settings )
  function _fnVisibleToColumnIndex (line 2164) | function _fnVisibleToColumnIndex( oSettings, iMatch )
  function _fnColumnIndexToVisible (line 2182) | function _fnColumnIndexToVisible( oSettings, iMatch )
  function _fnVisbleColumns (line 2197) | function _fnVisbleColumns( oSettings )
  function _fnGetColumns (line 2220) | function _fnGetColumns( oSettings, sParam )
  function _fnColumnTypes (line 2239) | function _fnColumnTypes ( settings )
  function _fnApplyColumnDefs (line 2310) | function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
  function _fnAddData (line 2390) | function _fnAddData ( oSettings, aDataIn, nTr, anTds )
  function _fnAddTr (line 2440) | function _fnAddTr( settings, trs )
  function _fnNodeToDataIndex (line 2463) | function _fnNodeToDataIndex( oSettings, n )
  function _fnNodeToColumnIndex (line 2477) | function _fnNodeToColumnIndex( oSettings, iRow, n )
  function _fnGetCellData (line 2492) | function _fnGetCellData( settings, rowIdx, colIdx, type )
  function _fnSetCellData (line 2540) | function _fnSetCellData( settings, rowIdx, colIdx, val )
  function _fnSplitObjNotation (line 2562) | function _fnSplitObjNotation( str )
  function _fnGetObjectDataFn (line 2577) | function _fnGetObjectDataFn( mSource )
  function _fnSetObjectDataFn (line 2702) | function _fnSetObjectDataFn( mSource )
  function _fnGetDataMaster (line 2821) | function _fnGetDataMaster ( settings )
  function _fnClearTable (line 2832) | function _fnClearTable( settings )
  function _fnDeleteIndex (line 2848) | function _fnDeleteIndex( a, iTarget, splice )
  function _fnInvalidate (line 2887) | function _fnInvalidate( settings, rowIdx, src, colIdx )
  function _fnGetRowElements (line 2965) | function _fnGetRowElements( settings, row, colIdx, d )
  function _fnCreateTr (line 3074) | function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
  function _fnRowAttributes (line 3158) | function _fnRowAttributes( settings, row )
  function _fnBuildHead (line 3198) | function _fnBuildHead( oSettings )
  function _fnDrawHead (line 3284) | function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
  function _fnDraw (line 3382) | function _fnDraw( oSettings )
  function _fnReDraw (line 3523) | function _fnReDraw( settings, holdPosition )
  function _fnAddOptionsHtml (line 3561) | function _fnAddOptionsHtml ( oSettings )
  function _fnDetectHeader (line 3717) | function _fnDetectHeader ( aLayout, nThead )
  function _fnGetUniqueThs (line 3792) | function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
  function _fnBuildAjax (line 3829) | function _fnBuildAjax( oSettings, data, fn )
  function _fnAjaxUpdate (line 3962) | function _fnAjaxUpdate( settings )
  function _fnAjaxParameters (line 3993) | function _fnAjaxParameters( settings )
  function _fnAjaxUpdateDraw (line 4101) | function _fnAjaxUpdateDraw ( settings, json )
  function _fnAjaxDataSrc (line 4151) | function _fnAjaxDataSrc ( oSettings, json )
  function _fnFeatureHtmlFilter (line 4174) | function _fnFeatureHtmlFilter ( settings )
  function _fnFilterComplete (line 4262) | function _fnFilterComplete ( oSettings, oInput, iForce )
  function _fnFilterCustom (line 4315) | function _fnFilterCustom( settings )
  function _fnFilterColumn (line 4352) | function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, ca...
  function _fnFilter (line 4385) | function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
  function _fnFilterCreateSearch (line 4440) | function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
  function _fnFilterData (line 4482) | function _fnFilterData ( settings )
  function _fnSearchToCamel (line 4555) | function _fnSearchToCamel ( obj )
  function _fnSearchToHung (line 4574) | function _fnSearchToHung ( obj )
  function _fnFeatureHtmlInfo (line 4590) | function _fnFeatureHtmlInfo ( settings )
  function _fnUpdateInfo (line 4624) | function _fnUpdateInfo ( settings )
  function _fnInfoMacros (line 4662) | function _fnInfoMacros ( settings, str )
  function _fnInitialise (line 4689) | function _fnInitialise ( settings )
  function _fnInitComplete (line 4773) | function _fnInitComplete ( settings, json )
  function _fnLengthChange (line 4788) | function _fnLengthChange ( settings, val )
  function _fnFeatureHtmlLength (line 4806) | function _fnFeatureHtmlLength ( settings )
  function _fnFeatureHtmlPaginate (line 4872) | function _fnFeatureHtmlPaginate ( settings )
  function _fnPageChange (line 4933) | function _fnPageChange ( settings, action, redraw )
  function _fnFeatureHtmlProcessing (line 5006) | function _fnFeatureHtmlProcessing ( settings )
  function _fnProcessingDisplay (line 5023) | function _fnProcessingDisplay ( settings, show )
  function _fnFeatureHtmlTable (line 5038) | function _fnFeatureHtmlTable ( settings )
  function _fnScrollDraw (line 5196) | function _fnScrollDraw ( settings )
  function _fnApplyToChildren (line 5479) | function _fnApplyToChildren( fn, an1, an2 )
  function _fnCalculateColumnWidths (line 5518) | function _fnCalculateColumnWidths ( oSettings )
  function _fnConvertToWidth (line 5756) | function _fnConvertToWidth ( width, parent )
  function _fnGetWidestNode (line 5780) | function _fnGetWidestNode( settings, colIdx )
  function _fnGetMaxLenString (line 5801) | function _fnGetMaxLenString( settings, colIdx )
  function _fnStringToCss (line 5826) | function _fnStringToCss( s )
  function _fnSortFlatten (line 5846) | function _fnSortFlatten ( settings )
  function _fnSort (line 5918) | function _fnSort ( oSettings )
  function _fnSortAria (line 6044) | function _fnSortAria ( settings )
  function _fnSortListener (line 6099) | function _fnSortListener ( settings, colIdx, append, callback )
  function _fnSortAttachListener (line 6183) | function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
  function _fnSortingClasses (line 6221) | function _fnSortingClasses( settings )
  function _fnSortData (line 6254) | function _fnSortData( settings, idx )
  function _fnSaveState (line 6297) | function _fnSaveState ( settings )
  function _fnLoadState (line 6333) | function _fnLoadState ( settings, oInit, callback )
  function _fnSettingsFromNode (line 6435) | function _fnSettingsFromNode ( table )
  function _fnLog (line 6454) | function _fnLog( settings, level, msg, tn )
  function _fnMap (line 6497) | function _fnMap( ret, src, name, mappedName )
  function _fnExtend (line 6539) | function _fnExtend( out, extender, breakRefs )
  function _fnBindAction (line 6575) | function _fnBindAction( n, oData, fn )
  function _fnCallbackReg (line 6604) | function _fnCallbackReg( oSettings, sStore, fn, sName )
  function _fnCallbackFire (line 6630) | function _fnCallbackFire( settings, callbackArr, eventName, args )
  function _fnLengthOverflow (line 6652) | function _fnLengthOverflow ( settings )
  function _fnRenderer (line 6677) | function _fnRenderer( settings, type )
  function _fnDataSource (line 6706) | function _fnDataSource ( settings )
  function _numbers (line 14455) | function _numbers ( page, pages ) {
  function _addNumericSort (line 14746) | function _addNumericSort ( decimalPlace ) {
  function _fnExternApiFunc (line 14996) | function _fnExternApiFunc (fn)

FILE: static/js/DataTables/JSZip-2.5.0/jszip.js
  function s (line 12) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function CompressedObject (line 86) | function CompressedObject() {
  function DataReader (line 237) | function DataReader(data) {
  function JSZip (line 503) | function JSZip(data, options) {
  function NodeBufferReader (line 609) | function NodeBufferReader(data) {
  function StringReader (line 1526) | function StringReader(data, optimizedBinaryString) {
  function Uint8ArrayReader (line 1633) | function Uint8ArrayReader(data) {
  function identity (line 1975) | function identity(input) {
  function stringToArrayLike (line 1985) | function stringToArrayLike(str, array) {
  function arrayLikeToString (line 1997) | function arrayLikeToString(array) {
  function arrayLikeToArrayLike (line 2061) | function arrayLikeToArrayLike(arrayFrom, arrayTo) {
  function ZipEntries (line 2270) | function ZipEntries(data, loadOptions) {
  function ZipEntry (line 2493) | function ZipEntry(options, loadOptions) {
  function deflate (line 3119) | function deflate(input, options) {
  function deflateRaw (line 3139) | function deflateRaw(input, options) {
  function gzip (line 3154) | function gzip(input, options) {
  function inflate (line 3489) | function inflate(input, options) {
  function inflateRaw (line 3509) | function inflateRaw(input, options) {
  function buf2binstring (line 3719) | function buf2binstring(buf, len) {
  function adler32 (line 3828) | function adler32(adler, buf, len, pos) {
  function makeTable (line 3911) | function makeTable() {
  function crc32 (line 3929) | function crc32(crc, buf, len, pos) {
  function err (line 4050) | function err(strm, errorCode) {
  function rank (line 4055) | function rank(f) {
  function zero (line 4059) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function flush_pending (line 4068) | function flush_pending(strm) {
  function flush_block_only (line 4090) | function flush_block_only (s, last) {
  function put_byte (line 4097) | function put_byte(s, b) {
  function putShortMSB (line 4107) | function putShortMSB(s, b) {
  function read_buf (line 4122) | function read_buf(strm, buf, start, size) {
  function longest_match (line 4155) | function longest_match(s, cur_match) {
  function fill_window (line 4268) | function fill_window(s) {
  function deflate_stored (line 4424) | function deflate_stored(s, flush) {
  function deflate_fast (line 4522) | function deflate_fast(s, flush) {
  function deflate_slow (line 4650) | function deflate_slow(s, flush) {
  function deflate_rle (line 4812) | function deflate_rle(s, flush) {
  function deflate_huff (line 4907) | function deflate_huff(s, flush) {
  function lm_init (line 4993) | function lm_init(s) {
  function DeflateState (line 5016) | function DeflateState() {
  function deflateResetKeep (line 5205) | function deflateResetKeep(strm) {
  function deflateReset (line 5234) | function deflateReset(strm) {
  function deflateSetHeader (line 5243) | function deflateSetHeader(strm, head) {
  function deflateInit2 (line 5251) | function deflateInit2(strm, level, method, windowBits, memLevel, strateg...
  function deflateInit (line 5322) | function deflateInit(strm, level) {
  function deflate (line 5327) | function deflate(strm, flush) {
  function deflateEnd (line 5661) | function deflateEnd(strm) {
  function GZheader (line 5714) | function GZheader() {
  function ZSWAP32 (line 6173) | function ZSWAP32(q) {
  function InflateState (line 6181) | function InflateState() {
  function inflateResetKeep (line 6239) | function inflateResetKeep(strm) {
  function inflateReset (line 6266) | function inflateReset(strm) {
  function inflateReset2 (line 6278) | function inflateReset2(strm, windowBits) {
  function inflateInit2 (line 6312) | function inflateInit2(strm, windowBits) {
  function inflateInit (line 6332) | function inflateInit(strm) {
  function fixedtables (line 6351) | function fixedtables(state) {
  function updatewindow (line 6399) | function updatewindow(strm, src, end, copy) {
  function inflate (line 6441) | function inflate(strm, flush) {
  function inflateEnd (line 7533) | function inflateEnd(strm) {
  function inflateGetHeader (line 7547) | function inflateGetHeader(strm, head) {
  function zero (line 7948) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function d_code (line 8094) | function d_code(dist) {
  function put_short (line 8103) | function put_short (s, w) {
  function send_bits (line 8115) | function send_bits(s, value, length) {
  function send_code (line 8128) | function send_code(s, c, tree) {
  function bi_reverse (line 8138) | function bi_reverse(code, len) {
  function bi_flush (line 8152) | function bi_flush(s) {
  function gen_bitlen (line 8176) | function gen_bitlen(s, desc)
  function gen_codes (line 8273) | function gen_codes(tree, max_code, bl_count)
  function tr_static_init (line 8311) | function tr_static_init() {
  function init_block (line 8415) | function init_block(s) {
  function bi_windup (line 8432) | function bi_windup(s)
  function copy_block (line 8448) | function copy_block(s, buf, len, header)
  function smaller (line 8471) | function smaller(tree, n, m, depth) {
  function pqdownheap (line 8484) | function pqdownheap(s, tree, k)
  function compress_block (line 8517) | function compress_block(s, ltree, dtree)
  function build_tree (line 8577) | function build_tree(s, desc)
  function scan_tree (line 8673) | function scan_tree(s, tree, max_code)
  function send_tree (line 8739) | function send_tree(s, tree, max_code)
  function build_bl_tree (line 8810) | function build_bl_tree(s) {
  function send_all_trees (line 8846) | function send_all_trees(s, lcodes, dcodes, blcodes)
  function detect_data_type (line 8886) | function detect_data_type(s) {
  function _tr_init (line 8924) | function _tr_init(s)
  function _tr_stored_block (line 8947) | function _tr_stored_block(s, buf, stored_len, last)
  function _tr_align (line 8962) | function _tr_align(s) {
  function _tr_flush_block (line 8973) | function _tr_flush_block(s, buf, stored_len, last)
  function _tr_tally (line 9060) | function _tr_tally(s, dist, lc)
  function ZStream (line 9127) | function ZStream() {

FILE: static/js/DataTables/Responsive-2.2.2/js/dataTables.responsive.js
  function _childNodes (line 1122) | function _childNodes( dt, row, col ) {
  function _childNodesRestore (line 1141) | function _childNodesRestore( dt, row, col ) {

FILE: static/js/DataTables/Select-1.3.0/js/dataTables.select.js
  function cellRange (line 226) | function cellRange( dt, idx, last )
  function disableMouseSelection (line 307) | function disableMouseSelection( dt )
  function enableMouseSelection (line 326) | function enableMouseSelection ( dt )
  function eventTrigger (line 446) | function eventTrigger ( api, type, args, any )
  function info (line 468) | function info ( api )
  function init (line 522) | function init ( ctx ) {
  function rowColumnRange (line 606) | function rowColumnRange( dt, type, idx, last )
  function clear (line 649) | function clear( ctx, force )
  function typeSelect (line 670) | function typeSelect ( e, dt, ctx, type, idx )
  function i18n (line 1033) | function i18n( label, def ) {
  function namespacedEvents (line 1040) | function namespacedEvents ( config ) {
  function enabled (line 1046) | function enabled ( dt, config ) {

FILE: static/js/DataTables/datatables.js
  function DOMEval (line 109) | function DOMEval( code, doc, node ) {
  function toType (line 127) | function toType( obj ) {
  function isArrayLike (line 495) | function isArrayLike( obj ) {
  function Sizzle (line 727) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 866) | function createCache() {
  function markFunction (line 884) | function markFunction( fn ) {
  function assert (line 893) | function assert( fn ) {
  function addHandle (line 915) | function addHandle( attrs, handler ) {
  function siblingCheck (line 930) | function siblingCheck( a, b ) {
  function createInputPseudo (line 956) | function createInputPseudo( type ) {
  function createButtonPseudo (line 967) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 978) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1034) | function createPositionalPseudo( fn ) {
  function testContext (line 1057) | function testContext( context ) {
  function setFilters (line 2139) | function setFilters() {}
  function toSelector (line 2210) | function toSelector( tokens ) {
  function addCombinator (line 2220) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2284) | function elementMatcher( matchers ) {
  function multipleContexts (line 2298) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2307) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2328) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2421) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2479) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function nodeName (line 2815) | function nodeName( elem, name ) {
  function winnow (line 2825) | function winnow( elements, qualifier, not ) {
  function sibling (line 3120) | function sibling( cur, dir ) {
  function createOptions (line 3207) | function createOptions( options ) {
  function Identity (line 3432) | function Identity( v ) {
  function Thrower (line 3435) | function Thrower( ex ) {
  function adoptValue (line 3439) | function adoptValue( value, resolve, reject, noValue ) {
  function resolve (line 3532) | function resolve( depth, deferred, handler, special ) {
  function completed (line 3897) | function completed() {
  function fcamelCase (line 3992) | function fcamelCase( all, letter ) {
  function camelCase (line 3999) | function camelCase( string ) {
  function Data (line 4016) | function Data() {
  function getData (line 4185) | function getData( data ) {
  function dataAttr (line 4210) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4523) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4590) | function getDefaultDisplay( elem ) {
  function showHide (line 4613) | function showHide( elements, show ) {
  function getAll (line 4714) | function getAll( context, tag ) {
  function setGlobalEval (line 4739) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4755) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4878) | function returnTrue() {
  function returnFalse (line 4882) | function returnFalse() {
  function safeActiveElement (line 4888) | function safeActiveElement() {
  function on (line 4894) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5622) | function manipulationTarget( elem, content ) {
  function disableScript (line 5633) | function disableScript( elem ) {
  function restoreScript (line 5637) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5647) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5682) | function fixInput( src, dest ) {
  function domManip (line 5695) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5785) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 6078) | function computeStyleTests() {
  function roundPixelMeasures (line 6120) | function roundPixelMeasures( measure ) {
  function curCSS (line 6165) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6218) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6255) | function vendorPropName( name ) {
  function finalPropName (line 6276) | function finalPropName( name ) {
  function setPositiveNumber (line 6284) | function setPositiveNumber( elem, value, subtract ) {
  function boxModelAdjustment (line 6296) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
  function getWidthOrHeight (line 6361) | function getWidthOrHeight( elem, dimension, extra ) {
  function Tween (line 6694) | function Tween( elem, options, prop, end, easing ) {
  function schedule (line 6817) | function schedule() {
  function createFxNow (line 6830) | function createFxNow() {
  function genFx (line 6838) | function genFx( type, includeWidth ) {
  function createTween (line 6858) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6872) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7044) | function propFilter( props, specialEasing ) {
  function Animation (line 7081) | function Animation( elem, properties, options ) {
  function stripAndCollapse (line 7796) | function stripAndCollapse( value ) {
  function getClass (line 7802) | function getClass( elem ) {
  function classesToArray (line 7806) | function classesToArray( value ) {
  function buildParams (line 8428) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 8578) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8612) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8641) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8661) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8719) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9232) | function done( status, nativeStatusText, responses, headers ) {
  function s (line 10390) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function CompressedObject (line 10464) | function CompressedObject() {
  function DataReader (line 10615) | function DataReader(data) {
  function JSZip (line 10881) | function JSZip(data, options) {
  function NodeBufferReader (line 10987) | function NodeBufferReader(data) {
  function StringReader (line 11904) | function StringReader(data, optimizedBinaryString) {
  function Uint8ArrayReader (line 12011) | function Uint8ArrayReader(data) {
  function identity (line 12353) | function identity(input) {
  function stringToArrayLike (line 12363) | function stringToArrayLike(str, array) {
  function arrayLikeToString (line 12375) | function arrayLikeToString(array) {
  function arrayLikeToArrayLike (line 12439) | function arrayLikeToArrayLike(arrayFrom, arrayTo) {
  function ZipEntries (line 12648) | function ZipEntries(data, loadOptions) {
  function ZipEntry (line 12871) | function ZipEntry(options, loadOptions) {
  function deflate (line 13497) | function deflate(input, options) {
  function deflateRaw (line 13517) | function deflateRaw(input, options) {
  function gzip (line 13532) | function gzip(input, options) {
  function inflate (line 13867) | function inflate(input, options) {
  function inflateRaw (line 13887) | function inflateRaw(input, options) {
  function buf2binstring (line 14097) | function buf2binstring(buf, len) {
  function adler32 (line 14206) | function adler32(adler, buf, len, pos) {
  function makeTable (line 14289) | function makeTable() {
  function crc32 (line 14307) | function crc32(crc, buf, len, pos) {
  function err (line 14428) | function err(strm, errorCode) {
  function rank (line 14433) | function rank(f) {
  function zero (line 14437) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function flush_pending (line 14446) | function flush_pending(strm) {
  function flush_block_only (line 14468) | function flush_block_only (s, last) {
  function put_byte (line 14475) | function put_byte(s, b) {
  function putShortMSB (line 14485) | function putShortMSB(s, b) {
  function read_buf (line 14500) | function read_buf(strm, buf, start, size) {
  function longest_match (line 14533) | function longest_match(s, cur_match) {
  function fill_window (line 14646) | function fill_window(s) {
  function deflate_stored (line 14802) | function deflate_stored(s, flush) {
  function deflate_fast (line 14900) | function deflate_fast(s, flush) {
  function deflate_slow (line 15028) | function deflate_slow(s, flush) {
  function deflate_rle (line 15190) | function deflate_rle(s, flush) {
  function deflate_huff (line 15285) | function deflate_huff(s, flush) {
  function lm_init (line 15371) | function lm_init(s) {
  function DeflateState (line 15394) | function DeflateState() {
  function deflateResetKeep (line 15583) | function deflateResetKeep(strm) {
  function deflateReset (line 15612) | function deflateReset(strm) {
  function deflateSetHeader (line 15621) | function deflateSetHeader(strm, head) {
  function deflateInit2 (line 15629) | function deflateInit2(strm, level, method, windowBits, memLevel, strateg...
  function deflateInit (line 15700) | function deflateInit(strm, level) {
  function deflate (line 15705) | function deflate(strm, flush) {
  function deflateEnd (line 16039) | function deflateEnd(strm) {
  function GZheader (line 16092) | function GZheader() {
  function ZSWAP32 (line 16551) | function ZSWAP32(q) {
  function InflateState (line 16559) | function InflateState() {
  function inflateResetKeep (line 16617) | function inflateResetKeep(strm) {
  function inflateReset (line 16644) | function inflateReset(strm) {
  function inflateReset2 (line 16656) | function inflateReset2(strm, windowBits) {
  function inflateInit2 (line 16690) | function inflateInit2(strm, windowBits) {
  function inflateInit (line 16710) | function inflateInit(strm) {
  function fixedtables (line 16729) | function fixedtables(state) {
  function updatewindow (line 16777) | function updatewindow(strm, src, end, copy) {
  function inflate (line 16819) | function inflate(strm, flush) {
  function inflateEnd (line 17911) | function inflateEnd(strm) {
  function inflateGetHeader (line 17925) | function inflateGetHeader(strm, head) {
  function zero (line 18326) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function d_code (line 18472) | function d_code(dist) {
  function put_short (line 18481) | function put_short (s, w) {
  function send_bits (line 18493) | function send_bits(s, value, length) {
  function send_code (line 18506) | function send_code(s, c, tree) {
  function bi_reverse (line 18516) | function bi_reverse(code, len) {
  function bi_flush (line 18530) | function bi_flush(s) {
  function gen_bitlen (line 18554) | function gen_bitlen(s, desc)
  function gen_codes (line 18651) | function gen_codes(tree, max_code, bl_count)
  function tr_static_init (line 18689) | function tr_static_init() {
  function init_block (line 18793) | function init_block(s) {
  function bi_windup (line 18810) | function bi_windup(s)
  function copy_block (line 18826) | function copy_block(s, buf, len, header)
  function smaller (line 18849) | function smaller(tree, n, m, depth) {
  function pqdownheap (line 18862) | function pqdownheap(s, tree, k)
  function compress_block (line 18895) | function compress_block(s, ltree, dtree)
  function build_tree (line 18955) | function build_tree(s, desc)
  function scan_tree (line 19051) | function scan_tree(s, tree, max_code)
  function send_tree (line 19117) | function send_tree(s, tree, max_code)
  function build_bl_tree (line 19188) | function build_bl_tree(s) {
  function send_all_trees (line 19224) | function send_all_trees(s, lcodes, dcodes, blcodes)
  function detect_data_type (line 19264) | function detect_data_type(s) {
  function _tr_init (line 19302) | function _tr_init(s)
  function _tr_stored_block (line 19325) | function _tr_stored_block(s, buf, stored_len, last)
  function _tr_align (line 19340) | function _tr_align(s) {
  function _tr_flush_block (line 19351) | function _tr_flush_block(s, buf, stored_len, last)
  function _tr_tally (line 19438) | function _tr_tally(s, dist, lc)
  function ZStream (line 19505) | function ZStream() {
  function __webpack_require__ (line 19551) | function __webpack_require__(moduleId) {
  function isString (line 19618) | function isString(variable) {
  function isNumber (line 19622) | function isNumber(variable) {
  function isBoolean (line 19626) | function isBoolean(variable) {
  function isArray (line 19630) | function isArray(variable) {
  function isFunction (line 19634) | function isFunction(variable) {
  function isObject (line 19638) | function isObject(variable) {
  function isNull (line 19642) | function isNull(variable) {
  function isUndefined (line 19646) | function isUndefined(variable) {
  function pack (line 19650) | function pack() {
  function offsetVector (line 19668) | function offsetVector(vector, x, y) {
  function fontStringify (line 19690) | function fontStringify(key, val) {
  function typedArraySupport (line 19768) | function typedArraySupport () {
  function kMaxLength (line 19780) | function kMaxLength () {
  function createBuffer (line 19786) | function createBuffer (that, length) {
  function Buffer (line 19815) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 19840) | function from (that, value, encodingOrOffset, length) {
  function assertSize (line 19881) | function assertSize (size) {
  function alloc (line 19889) | function alloc (that, size, fill, encoding) {
  function allocUnsafe (line 19913) | function allocUnsafe (that, size) {
  function fromString (line 19937) | function fromString (that, string, encoding) {
  function fromArrayLike (line 19961) | function fromArrayLike (that, array) {
  function fromArrayBuffer (line 19970) | function fromArrayBuffer (that, array, byteOffset, length) {
  function fromObject (line 20000) | function fromObject (that, obj) {
  function checked (line 20030) | function checked (length) {
  function SlowBuffer (line 20040) | function SlowBuffer (length) {
  function byteLength (line 20123) | function byteLength (string, encoding) {
  function slowToString (line 20168) | function slowToString (encoding, start, end) {
  function swap (line 20242) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 20376) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 20433) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 20501) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 20528) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 20532) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 20536) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 20540) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 20544) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 20627) | function base64Slice (buf, start, end) {
  function utf8Slice (line 20635) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 20713) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 20731) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 20741) | function latin1Slice (buf, start, end) {
  function hexSlice (line 20751) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 20764) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 20812) | function checkOffset (offset, ext, length) {
  function checkInt (line 20973) | function checkInt (buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 21026) | function objectWriteUInt16 (buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 21060) | function objectWriteUInt32 (buf, value, offset, littleEndian) {
  function checkIEEE754 (line 21210) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 21215) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 21231) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 21364) | function base64clean (str) {
  function stringtrim (line 21376) | function stringtrim (str) {
  function toHex (line 21381) | function toHex (n) {
  function utf8ToBytes (line 21386) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 21466) | function asciiToBytes (str) {
  function utf16leToBytes (line 21475) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 21491) | function base64ToBytes (str) {
  function blitBuffer (line 21495) | function blitBuffer (src, dst, offset, length) {
  function isnan (line 21503) | function isnan (val) {
  function VirtualFileSystem (line 21667) | function VirtualFileSystem() {
  function fixFilename (line 21697) | function fixFilename(filename) {
  function defaultSetTimout (line 21749) | function defaultSetTimout() {
  function defaultClearTimeout (line 21752) | function defaultClearTimeout () {
  function runTimeout (line 21775) | function runTimeout(fun) {
  function runClearTimeout (line 21800) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 21832) | function cleanUpNextTick() {
  function drainQueue (line 21847) | function drainQueue() {
  function Item (line 21885) | function Item(fun, array) {
  function noop (line 21899) | function noop() {}
  function PropertyDescriptor (line 21952) | function PropertyDescriptor(opts) {
  function Stream (line 22044) | function Stream() {
  function ondata (line 22051) | function ondata(chunk) {
  function ondrain (line 22061) | function ondrain() {
  function onend (line 22077) | function onend() {
  function onclose (line 22085) | function onclose() {
  function onerror (line 22093) | function onerror(er) {
  function cleanup (line 22104) | function cleanup() {
  function Duplex (line 22197) | function Duplex(options) {
  function onend (line 22214) | function onend() {
  function onEndNT (line 22224) | function onEndNT(self) {
  function forEach (line 22256) | function forEach(xs, f) {
  function ctor (line 22360) | function ctor() { this.constructor = child; }
  function NumberT (line 22365) | function NumberT(type, endian) {
  function Fixed (line 22431) | function Fixed(size, endian, fracBits) {
  function isArray (line 22523) | function isArray(arg) {
  function isBoolean (line 22531) | function isBoolean(arg) {
  function isNull (line 22536) | function isNull(arg) {
  function isNullOrUndefined (line 22541) | function isNullOrUndefined(arg) {
  function isNumber (line 22546) | function isNumber(arg) {
  function isString (line 22551) | function isString(arg) {
  function isSymbol (line 22556) | function isSymbol(arg) {
  function isUndefined (line 22561) | function isUndefined(arg) {
  function isRegExp (line 22566) | function isRegExp(re) {
  function isObject (line 22571) | function isObject(arg) {
  function isDate (line 22576) | function isDate(d) {
  function isError (line 22581) | function isError(e) {
  function isFunction (line 22586) | function isFunction(arg) {
  function isPrimitive (line 22591) | function isPrimitive(arg) {
  function objectToString (line 22603) | function objectToString(o) {
  function PDFObject (line 22626) | function PDFObject() {}
  function EventEmitter (line 22819) | function EventEmitter() {
  function g (line 22957) | function g() {
  function isFunction (line 23085) | function isFunction(arg) {
  function isNumber (line 23089) | function isNumber(arg) {
  function isObject (line 23093) | function isObject(arg) {
  function isUndefined (line 23097) | function isUndefined(arg) {
  function nextTick (line 23117) | function nextTick(fn, arg1, arg2, arg3) {
  function copyProps (line 23163) | function copyProps (src, dst) {
  function SafeBuffer (line 23176) | function SafeBuffer (arg, encodingOrOffset, length) {
  function _has (line 23234) | function _has(obj, key) {
  function TextTools (line 23536) | function TextTools(fontProvider) {
  function getTrimmedWidth (line 23582) | function getTrimmedWidth(item) {
  function splitWords (line 23621) | function splitWords(text, noWrap) {
  function copyStyle (line 23650) | function copyStyle(source, destination) {
  function normalizeTextArray (line 23663) | function normalizeTextArray(array, styleContextStack) {
  function normalizeString (line 23711) | function normalizeString(value) {
  function getStyleProperty (line 23723) | function getStyleProperty(item, styleContextStack, property, defaultValu...
  function measure (line 23746) | function measure(fontProvider, textArray, styleContextStack) {
  function widthOfString (line 23816) | function widthOfString(text, font, fontSize, characterSpacing, fontFeatu...
  function UnicodeTrie (line 23867) | function UnicodeTrie(data) {
  function buildColumnWidths (line 23929) | function buildColumnWidths(columns, availableWidth) {
  function isAutoColumn (line 24012) | function isAutoColumn(column) {
  function isStarColumn (line 24016) | function isStarColumn(column) {
  function measureMinMax (line 24021) | function measureMinMax(columns) {
  function WriteReq (line 24116) | function WriteReq(chunk, encoding, cb) {
  function CorkedRequest (line 24125) | function CorkedRequest(state) {
  function _uint8ArrayToBuffer (line 24165) | function _uint8ArrayToBuffer(chunk) {
  function _isUint8Array (line 24168) | function _isUint8Array(obj) {
  function nop (line 24178) | function nop() {}
  function WritableState (line 24180) | function WritableState(options, stream) {
  function Writable (line 24330) | function Writable(options) {
  function writeAfterEnd (line 24367) | function writeAfterEnd(stream, cb) {
  function validChunk (line 24377) | function validChunk(stream, state, chunk, cb) {
  function decodeChunk (line 24444) | function decodeChunk(state, chunk, encoding) {
  function writeOrBuffer (line 24454) | function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  function doWrite (line 24493) | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  function onwriteError (line 24502) | function onwriteError(stream, state, sync, er, cb) {
  function onwriteStateUpdate (line 24526) | function onwriteStateUpdate(state) {
  function onwrite (line 24533) | function onwrite(stream, er) {
  function afterWrite (line 24558) | function afterWrite(stream, state, finished, cb) {
  function onwriteDrain (line 24568) | function onwriteDrain(stream, state) {
  function clearBuffer (line 24576) | function clearBuffer(stream, state) {
  function needFinish (line 24667) | function needFinish(state) {
  function callFinal (line 24670) | function callFinal(stream, state) {
  function prefinish (line 24681) | function prefinish(stream, state) {
  function finishMaybe (line 24694) | function finishMaybe(stream, state) {
  function endWritable (line 24706) | function endWritable(stream, state, cb) {
  function onCorkedFinish (line 24716) | function onCorkedFinish(corkReq, state, err) {
  function _normalizeEncoding (line 24779) | function _normalizeEncoding(enc) {
  function normalizeEncoding (line 24809) | function normalizeEncoding(enc) {
  function StringDecoder (line 24819) | function StringDecoder(encoding) {
  function utf8CheckByte (line 24880) | function utf8CheckByte(byte) {
  function utf8CheckIncomplete (line 24888) | function utf8CheckIncomplete(self, buf, i) {
  function utf8CheckExtraBytes (line 24921) | function utf8CheckExtraBytes(self, buf, p) {
  function utf8FillLast (line 24941) | function utf8FillLast(buf) {
  function utf8Text (line 24956) | function utf8Text(buf, i) {
  function utf8End (line 24967) | function utf8End(buf) {
  function utf16Text (line 24977) | function utf16Text(buf, i) {
  function utf16End (line 25000) | function utf16End(buf) {
  function base64Text (line 25009) | function base64Text(buf, i) {
  function base64End (line 25023) | function base64End(buf) {
  function simpleWrite (line 25030) | function simpleWrite(buf) {
  function simpleEnd (line 25034) | function simpleEnd(buf) {
  function zlibBuffer (line 25230) | function zlibBuffer(engine, buffer, callback) {
  function zlibBufferSync (line 25271) | function zlibBufferSync(engine, buffer) {
  function Deflate (line 25283) | function Deflate(opts) {
  function Inflate (line 25288) | function Inflate(opts) {
  function Gzip (line 25294) | function Gzip(opts) {
  function Gunzip (line 25299) | function Gunzip(opts) {
  function DeflateRaw (line 25305) | function DeflateRaw(opts) {
  function InflateRaw (line 25310) | function InflateRaw(opts) {
  function Unzip (line 25316) | function Unzip(opts) {
  function isValidFlushFlag (line 25321) | function isValidFlushFlag(flag) {
  function Zlib (line 25330) | function Zlib(opts, mode) {
  function _close (line 25492) | function _close(engine, callback) {
  function emitCloseNT (line 25502) | function emitCloseNT(self) {
  function callback (line 25587) | function callback(availInAfter, availOutAfter) {
  function deprecated (line 25735) | function deprecated() {
  function inspect (line 25782) | function inspect(obj, opts) {
  function stylizeWithColor (line 25840) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 25852) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 25857) | function arrayToHash(array) {
  function formatValue (line 25868) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 25981) | function formatPrimitive(ctx, value) {
  function formatError (line 26000) | function formatError(value) {
  function formatArray (line 26005) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 26025) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 26084) | function reduceToSingleString(output, base, braces) {
  function isArray (line 26107) | function isArray(ar) {
  function isBoolean (line 26112) | function isBoolean(arg) {
  function isNull (line 26117) | function isNull(arg) {
  function isNullOrUndefined (line 26122) | function isNullOrUndefined(arg) {
  function isNumber (line 26127) | function isNumber(arg) {
  function isString (line 26132) | function isString(arg) {
  function isSymbol (line 26137) | function isSymbol(arg) {
  function isUndefined (line 26142) | function isUndefined(arg) {
  function isRegExp (line 26147) | function isRegExp(re) {
  function isObject (line 26152) | function isObject(arg) {
  function isDate (line 26157) | function isDate(d) {
  function isError (line 26162) | function isError(e) {
  function isFunction (line 26168) | function isFunction(arg) {
  function isPrimitive (line 26173) | function isPrimitive(arg) {
  function objectToString (line 26185) | function objectToString(o) {
  function pad (line 26190) | function pad(n) {
  function timestamp (line 26199) | function timestamp() {
  function hasOwnProperty (line 26241) | function hasOwnProperty(obj, prop) {
  function PDFFont (line 26278) | function PDFFont() {
  function DecodeStream (line 26344) | function DecodeStream(buffer) {
  function _interopRequireDefault (line 26887) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function TraversalTracker (line 26965) | function TraversalTracker() {
  function LineBreaker (line 27037) | function LineBreaker(string) {
  function Break (line 27093) | function Break(position, required) {
  function Tree (line 27186) | function Tree() {
  function Data (line 27191) | function Data(source, dest) {
  function tinf_build_bits_base (line 27235) | function tinf_build_bits_base(bits, base, delta, first) {
  function tinf_build_fixed_trees (line 27250) | function tinf_build_fixed_trees(lt, dt) {
  function tinf_build_tree (line 27276) | function tinf_build_tree(t, lengths, off, num) {
  function tinf_getbit (line 27304) | function tinf_getbit(d) {
  function tinf_read_bits (line 27320) | function tinf_read_bits(d, num, base) {
  function tinf_decode_symbol (line 27336) | function tinf_decode_symbol(d, t) {
  function tinf_decode_trees (line 27362) | function tinf_decode_trees(d, lt, dt) {
  function tinf_inflate_block_data (line 27428) | function tinf_inflate_block_data(d, lt, dt) {
  function tinf_inflate_uncompressed_block (line 27462) | function tinf_inflate_uncompressed_block(d) {
  function tinf_uncompress (line 27497) | function tinf_uncompress(source, dest) {
  function StyleContextStack (line 27580) | function StyleContextStack(styleDictionary, defaultStyle) {
  function DocumentContext (line 27757) | function DocumentContext(pageSize, pageMargins) {
  function pageOrientation (line 27933) | function pageOrientation(pageOrientationString, currentPageOrientation) {
  function bottomMostContext (line 28031) | function bottomMostContext(c1, c2) {
  function Line (line 28068) | function Line(maxWidth) {
  function _uint8ArrayToBuffer (line 28194) | function _uint8ArrayToBuffer(chunk) {
  function _isUint8Array (line 28197) | function _isUint8Array(obj) {
  function prependListener (line 28226) | function prependListener(emitter, event, fn) {
  function ReadableState (line 28238) | function ReadableState(options, stream) {
  function Readable (line 28315) | function Readable(options) {
  function readableAddChunk (line 28390) | function readableAddChunk(stream, chunk, encoding, addToFront, skipChunk...
  function addChunk (line 28426) | function addChunk(stream, state, chunk, addToFront) {
  function chunkInvalid (line 28440) | function chunkInvalid(state, chunk) {
  function needMoreData (line 28455) | function needMoreData(state) {
  function computeNewHighWaterMark (line 28473) | function computeNewHighWaterMark(n) {
  function howMuchToRead (line 28492) | function howMuchToRead(n, state) {
  function onEofChunk (line 28611) | function onEofChunk(stream, state) {
  function emitReadable (line 28629) | function emitReadable(stream) {
  function emitReadable_ (line 28639) | function emitReadable_(stream) {
  function maybeReadMore (line 28651) | function maybeReadMore(stream, state) {
  function maybeReadMore_ (line 28658) | function maybeReadMore_(stream, state) {
  function onunpipe (line 28702) | function onunpipe(readable, unpipeInfo) {
  function onend (line 28712) | function onend() {
  function cleanup (line 28725) | function cleanup() {
  function ondata (line 28753) | function ondata(chunk) {
  function onerror (line 28773) | function onerror(er) {
  function onclose (line 28784) | function onclose() {
  function onfinish (line 28789) | function onfinish() {
  function unpipe (line 28796) | function unpipe() {
  function pipeOnDrain (line 28813) | function pipeOnDrain(src) {
  function nReadingNextTick (line 28900) | function nReadingNextTick(self) {
  function resume (line 28917) | function resume(stream, state) {
  function resume_ (line 28924) | function resume_(stream, state) {
  function flow (line 28947) | function flow(stream) {
  function fromList (line 29023) | function fromList(n, state) {
  function fromListPartial (line 29043) | function fromListPartial(n, list, hasStrings) {
  function copyFromBufferString (line 29063) | function copyFromBufferString(n, list) {
  function copyFromBuffer (line 29092) | function copyFromBuffer(n, list) {
  function endReadable (line 29119) | function endReadable(stream) {
  function endReadableNT (line 29132) | function endReadableNT(state, stream) {
  function forEach (line 29141) | function forEach(xs, f) {
  function indexOf (line 29147) | function indexOf(xs, x) {
  function destroy (line 29175) | function destroy(err, cb) {
  function undestroy (line 29216) | function undestroy() {
  function emitErrorNT (line 29233) | function emitErrorNT(self, err) {
  function afterTransform (line 29323) | function afterTransform(er, data) {
  function Transform (line 29348) | function Transform(options) {
  function prefinish (line 29380) | function prefinish() {
  function done (line 29447) | function done(stream, er, data) {
  function ctor (line 29476) | function ctor() { this.constructor = child; }
  function PDFReference (line 29486) | function PDFReference(document, id, data) {
  function compare (line 29594) | function compare(a, b) {
  function isBuffer (line 29618) | function isBuffer(b) {
  function pToString (line 29657) | function pToString (obj) {
  function isView (line 29660) | function isView(arrbuf) {
  function getName (line 29694) | function getName(func) {
  function truncate (line 29744) | function truncate(s, n) {
  function inspect (line 29751) | function inspect(something) {
  function getMessage (line 29759) | function getMessage(self) {
  function fail (line 29776) | function fail(actual, expected, message, operator, stackStartFunction) {
  function ok (line 29796) | function ok(value, message) {
  function _deepEqual (line 29833) | function _deepEqual(actual, expected, strict, memos) {
  function isArguments (line 29899) | function isArguments(object) {
  function objEquiv (line 29903) | function objEquiv(a, b, strict, actualVisitedObjects) {
  function notDeepStrictEqual (line 29955) | function notDeepStrictEqual(actual, expected, message) {
  function expectedException (line 29980) | function expectedException(actual, expected) {
  function _tryBlock (line 30004) | function _tryBlock(block) {
  function _throws (line 30014) | function _throws(shouldThrow, block, expected, message) {
  function adler32 (line 30106) | function adler32(adler, buf, len, pos) {
  function makeTable (line 30165) | function makeTable() {
  function crc32 (line 30183) | function crc32(crc, buf, len, pos) {
  function ArrayT (line 30225) | function ArrayT(type, length, lengthType) {
  function Struct (line 30334) | function Struct(fields) {
  function _interopRequireDefault (line 30616) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function defineProperties (line 30619) | function defineProperties(target, props) {
  function DecodeWindowBits (line 31040) | function DecodeWindowBits(br) {
  function DecodeVarLenUint8 (line 31060) | function DecodeVarLenUint8(br) {
  function MetaBlockLength (line 31072) | function MetaBlockLength() {
  function DecodeMetaBlockLength (line 31079) | function DecodeMetaBlockLength(br) {
  function ReadSymbol (line 31128) | function ReadSymbol(table, index, br) {
  function ReadHuffmanCodeLengths (line 31144) | function ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, c...
  function ReadHuffmanCode (line 31214) | function ReadHuffmanCode(alphabet_size, tables, table, br) {
  function ReadBlockLength (line 31319) | function ReadBlockLength(table, index, br) {
  function TranslateShortCodes (line 31327) | function TranslateShortCodes(code, ringbuffer, index) {
  function MoveToFront (line 31339) | function MoveToFront(v, index) {
  function InverseMoveToFrontTransform (line 31346) | function InverseMoveToFrontTransform(v, v_len) {
  function HuffmanTreeGroup (line 31360) | function HuffmanTreeGroup(alphabet_size, num_htrees) {
  function DecodeContextMap (line 31378) | function DecodeContextMap(context_map_size, br) {
  function DecodeBlockType (line 31434) | function DecodeBlockType(max_block_type, trees, tree_type, block_types, ...
  function CopyUncompressedBlockToOutput (line 31454) | function CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, rin...
  function JumpToByteBoundary (line 31538) | function JumpToByteBoundary(br) {
  function BrotliDecompressedSize (line 31544) | function BrotliDecompressedSize(buffer) {
  function BrotliDecompressBuffer (line 31554) | function BrotliDecompressBuffer(buffer, output_size) {
  function BrotliDecompress (line 31575) | function BrotliDecompress(input, output) {
  function BrotliInput (line 31926) | function BrotliInput(buffer) {
  function BrotliOutput (line 31945) | function BrotliOutput(buf) {
  function HuffmanCode (line 32008) | function HuffmanCode(bits, value) {
  function GetNextKey (line 32019) | function GetNextKey(key, len) {
  function ReplicateValue (line 32029) | function ReplicateValue(table, i, step, end, code) {
  function NextTableBitSize (line 32039) | function NextTableBitSize(count, len, root_bits) {
  function PDFImage (line 32156) | function PDFImage() {}
  function Document (line 32221) | function Document(docDefinition, tableLayouts, fonts, vfs) {
  function canCreatePdf (line 32228) | function canCreatePdf() {
  function placeHoldersCount (line 32425) | function placeHoldersCount (b64) {
  function byteLength (line 32439) | function byteLength (b64) {
  function toByteArray (line 32444) | function toByteArray (b64) {
  function tripletToBase64 (line 32475) | function tripletToBase64 (num) {
  function encodeChunk (line 32479) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 32489) | function fromByteArray (uint8) {
  function PdfPrinter (line 32653) | function PdfPrinter(fontDescriptors) {
  function setMetadata (line 32747) | function setMetadata(docDefinition, pdfKitDoc) {
  function calculatePageHeight (line 32777) | function calculatePageHeight(pages, margins) {
  function fixPageSize (line 32799) | function fixPageSize(pageSize, pageOrientation) {
  function fixPageMargins (line 32822) | function fixPageMargins(margin) {
  function registerDefaultTableLayouts (line 32842) | function registerDefaultTableLayouts(layoutBuilder) {
  function pageSize2widthAndHeight (line 32898) | function pageSize2widthAndHeight(pageSize) {
  function updatePageOrientationInOptions (line 32910) | function updatePageOrientationInOptions(currentPage, pdfKitDoc) {
  function renderPages (line 32920) | function renderPages(pages, fontProvider, pdfKitDoc, progressCallback) {
  function renderLine (line 32969) | function renderLine(line, x, y, pdfKitDoc) {
  function renderWatermark (line 33033) | function renderWatermark(page, pdfKitDoc) {
  function renderVector (line 33054) | function renderVector(vector, pdfKitDoc) {
  function renderImage (line 33130) | function renderImage(image, x, y, pdfKitDoc) {
  function beginClip (line 33137) | function beginClip(rect, pdfKitDoc) {
  function endClip (line 33143) | function endClip(pdfKitDoc) {
  function typeName (line 33159) | function typeName(bold, italics) {
  function FontProvider (line 33171) | function FontProvider(fontDescriptors, pdfKitDoc) {
  function addAll (line 33236) | function addAll(target, otherArray) {
  function LayoutBuilder (line 33249) | function LayoutBuilder(pageSize, pageMargins, imageMeasure) {
  function addPageBreaksIfNecessary (line 33273) | function addPageBreaksIfNecessary(linearNodeList, pages) {
  function resetXYs (line 33346) | function resetXYs(result) {
  function getSize (line 33487) | function getSize(pageSize, watermark, fontProvider) {
  function decorateNode (line 33524) | function decorateNode(node) {
  function applyMargins (line 33610) | function applyMargins(callback) {
  function gapArray (line 33661) | function gapArray(gap) {
  function storePageBreakData (line 33712) | function storePageBreakData(data) {
  function colLeftOffset (line 33731) | function colLeftOffset(i) {
  function getEndingCell (line 33738) | function getEndingCell(column, columnIndex) {
  function addMarkerToFirstLeaf (line 33770) | function addMarkerToFirstLeaf(line) {
  function cloneInline (line 33858) | function cloneInline(inline) {
  function DocPreprocessor (line 33951) | function DocPreprocessor() {
  function DocMeasure (line 34173) | function DocMeasure(fontProvider, styleDictionary, defaultStyle, imageMe...
  function extendMargins (line 34225) | function extendMargins(node) {
  function getNodeMargin (line 34236) | function getNodeMargin() {
  function buildDisc (line 34427) | function buildDisc(gapSize, color) {
  function buildSquare (line 34442) | function buildSquare(gapSize, color) {
  function buildCircle (line 34457) | function buildCircle(gapSize, color) {
  function prepareAlpha (line 34501) | function prepareAlpha(counter) {
  function prepareRoman (line 34513) | function prepareRoman(counter) {
  function prepareDecimal (line 34528) | function prepareDecimal(counter) {
  function measureCb (line 34725) | function measureCb(_this, data) {
  function getLayout (line 34734) | function getLayout(tableLayouts) {
  function getOffsets (line 34775) | function getOffsets(layout) {
  function extendWidthsForColSpans (line 34795) | function extendWidthsForColSpans() {
  function getMinMax (line 34823) | function getMinMax(col, span, offsets) {
  function markSpans (line 34834) | function markSpans(rowData, col, span) {
  function markVSpans (line 34845) | function markVSpans(table, row, col, span) {
  function extendTableWidths (line 34856) | function extendTableWidths(node) {
  function decode (line 34943) | function decode (elt) {
  function b64ToByteArray (line 34961) | function b64ToByteArray (b64) {
  function uint8ToBase64 (line 35007) | function uint8ToBase64 (uint8) {
  function generateFrame (line 35849) | function generateFrame(data, options) {
  function buildCanvas (line 35911) | function buildCanvas(data, options) {
  function measure (line 35950) | function measure(node) {
  function PageElementWriter (line 35979) | function PageElementWriter(context, tracker) {
  function fitOnPage (line 35986) | function fitOnPage(self, addFct) {
  function ElementWriter (line 36148) | function ElementWriter(context, tracker) {
  function addPageItem (line 36154) | function addPageItem(page, item, index) {
  function cloneLine (line 36354) | function cloneLine(line) {
  function TableProcessor (line 36462) | function TableProcessor(tableNode) {
  function getTableInnerContentWidth (line 36495) | function getTableInnerContentWidth() {
  function prepareRowSpanData (line 36505) | function prepareRowSpanData() {
  function prepareCellBorders (line 36529) | function prepareCellBorders(body) {
  function getLineXs (line 36843) | function getLineXs() {
  function ctor (line 36881) | function ctor() { this.constructor = child; }
  function PDFDocument (line 36899) | function PDFDocument(options1) {
  function _classCallCheck (line 37135) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function copyBuffer (line 37140) | function copyBuffer(src, target, offset) {
  function BufferList (line 37145) | function BufferList() {
  function Timeout (line 37240) | function Timeout(id, clearFn) {
  function setImmediate (line 37303) | function setImmediate(callback) {
  function clearImmediate (line 37320) | function clearImmediate(handle) {
  function run (line 37324) | function run(task) {
  function runIfPresent (line 37346) | function runIfPresent(handle) {
  function installNextTickImplementation (line 37367) | function installNextTickImplementation() {
  function canUsePostMessage (line 37373) | function canUsePostMessage() {
  function installPostMessageImplementation (line 37388) | function installPostMessageImplementation() {
  function installMessageChannelImplementation (line 37413) | function installMessageChannelImplementation() {
  function installReadyStateChangeImplementation (line 37425) | function installReadyStateChangeImplementation() {
  function installSetTimeoutImplementation (line 37441) | function installSetTimeoutImplementation() {
  function deprecate (line 37508) | function deprecate (fn, msg) {
  function config (line 37539) | function config (name) {
  function PassThrough (line 37596) | function PassThrough(options) {
  function Zlib (line 37669) | function Zlib(mode) {
  function ZStream (line 38116) | function ZStream() {
  function err (line 38273) | function err(strm, errorCode) {
  function rank (line 38278) | function rank(f) {
  function zero (line 38282) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function flush_pending (line 38291) | function flush_pending(strm) {
  function flush_block_only (line 38313) | function flush_block_only(s, last) {
  function put_byte (line 38320) | function put_byte(s, b) {
  function putShortMSB (line 38330) | function putShortMSB(s, b) {
  function read_buf (line 38345) | function read_buf(strm, buf, start, size) {
  function longest_match (line 38379) | function longest_match(s, cur_match) {
  function fill_window (line 38492) | function fill_window(s) {
  function deflate_stored (line 38648) | function deflate_stored(s, flush) {
  function deflate_fast (line 38746) | function deflate_fast(s, flush) {
  function deflate_slow (line 38874) | function deflate_slow(s, flush) {
  function deflate_rle (line 39036) | function deflate_rle(s, flush) {
  function deflate_huff (line 39131) | function deflate_huff(s, flush) {
  function Config (line 39188) | function Config(good_length, max_lazy, nice_length, max_chain, func) {
  function lm_init (line 39217) | function lm_init(s) {
  function DeflateState (line 39240) | function DeflateState() {
  function deflateResetKeep (line 39429) | function deflateResetKeep(strm) {
  function deflateReset (line 39458) | function deflateReset(strm) {
  function deflateSetHeader (line 39467) | function deflateSetHeader(strm, head) {
  function deflateInit2 (line 39475) | function deflateInit2(strm, level, method, windowBits, memLevel, strateg...
  function deflateInit (line 39553) | function deflateInit(strm, level) {
  function deflate (line 39558) | function deflate(strm, flush) {
  function deflateEnd (line 39892) | function deflateEnd(strm) {
  function deflateSetDictionary (line 39921) | function deflateSetDictionary(strm, dictionary) {
  function zero (line 40072) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function StaticTreeDesc (line 40195) | function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_...
  function TreeDesc (line 40213) | function TreeDesc(dyn_tree, stat_desc) {
  function d_code (line 40221) | function d_code(dist) {
  function put_short (line 40230) | function put_short(s, w) {
  function send_bits (line 40242) | function send_bits(s, value, length) {
  function send_code (line 40255) | function send_code(s, c, tree) {
  function bi_reverse (line 40265) | function bi_reverse(code, len) {
  function bi_flush (line 40279) | function bi_flush(s) {
  function gen_bitlen (line 40303) | function gen_bitlen(s, desc)
  function gen_codes (line 40400) | function gen_codes(tree, max_code, bl_count)
  function tr_static_init (line 40438) | function tr_static_init() {
  function init_block (line 40542) | function init_block(s) {
  function bi_windup (line 40559) | function bi_windup(s)
  function copy_block (line 40575) | function copy_block(s, buf, len, header)
  function smaller (line 40598) | function smaller(tree, n, m, depth) {
  function pqdownheap (line 40611) | function pqdownheap(s, tree, k)
  function compress_block (line 40644) | function compress_block(s, ltree, dtree)
  function build_tree (line 40704) | function build_tree(s, desc)
  function scan_tree (line 40800) | function scan_tree(s, tree, max_code)
  function send_tree (line 40866) | function send_tree(s, tree, max_code)
  function build_bl_tree (line 40937) | function build_bl_tree(s) {
  function send_all_trees (line 40973) | function send_all_trees(s, lcodes, dcodes, blcodes)
  function detect_data_type (line 41013) | function detect_data_type(s) {
  function _tr_init (line 41051) | function _tr_init(s)
  function _tr_stored_block (line 41074) | function _tr_stored_block(s, buf, stored_len, last)
  function _tr_align (line 41089) | function _tr_align(s) {
  function _tr_flush_block (line 41100) | function _tr_flush_block(s, buf, stored_len, last)
  function _tr_tally (line 41187) | function _tr_tally(s, dist, lc)
  function zswap32 (line 41408) | function zswap32(q) {
  function InflateState (line 41416) | function InflateState() {
  function inflateResetKeep (line 41474) | function inflateResetKeep(strm) {
  function inflateReset (line 41501) | function inflateReset(strm) {
  function inflateReset2 (line 41513) | function inflateReset2(strm, windowBits) {
  function inflateInit2 (line 41547) | function inflateInit2(strm, windowBits) {
  function inflateInit (line 41567) | function inflateInit(strm) {
  function fixedtables (line 41586) | function fixedtables(state) {
  function updatewindow (line 41634) | function updatewindow(strm, src, end, copy) {
  function inflate (line 41676) | function inflate(strm, flush) {
  function inflateEnd (line 42768) | function inflateEnd(strm) {
  function inflateGetHeader (line 42782) | function inflateGetHeader(strm, head) {
  function inflateSetDictionary (line 42796) | function inflateSetDictionary(strm, dictionary) {
  function PDFPage (line 43648) | function PDFPage(document, options) {
  function ctor (line 44118) | function ctor() { this.constructor = child; }
  function PDFGradient (line 44122) | function PDFGradient(doc) {
  function PDFLinearGradient (line 44289) | function PDFLinearGradient(doc, x1, y1, x2, y2) {
  function PDFRadialGradient (line 44319) | function PDFRadialGradient(doc, x1, y1, r1, x2, y2, r2) {
  function SVGPath (line 44676) | function SVGPath() {}
  function _interopDefault (line 45121) | function _interopDefault (ex) { return (ex && (typeof ex === 'object') &...
  function cache (line 45209) | function cache(target, key, descriptor) {
  function getEncoding (line 45453) | function getEncoding(platformID, encodingID) {
  function CFFIndex (line 45887) | function CFFIndex(type) {
  function CFFOperand (line 46087) | function CFFOperand() {
  function CFFDict (line 46211) | function CFFDict() {
  function CFFPointer (line 46457) | function CFFPointer(type) {
  function Ptr (line 46507) | function Ptr(val) {
  function CFFBlendOp (line 46522) | function CFFBlendOp() {
  function LookupList (line 46608) | function LookupList(SubTable) {
  function PredefinedOp (line 46861) | function PredefinedOp(predefinedOps, type) {
  function CFFEncodingVersion (line 46895) | function CFFEncodingVersion() {
  function RangeArray (line 46940) | function RangeArray() {
  function CFFPrivateOp (line 47018) | function CFFPrivateOp() {
  function CFFFont (line 47075) | function CFFFont(stream) {
  function ValueRecord (line 47635) | function ValueRecord() {
  function VariableSizeNumber (line 47957) | function VariableSizeNumber(size) {
  function UnboundedArrayAccessor (line 48271) | function UnboundedArrayAccessor(type, stream, parent) {
  function UnboundedArray (line 48302) | function UnboundedArray(type) {
  function Shadow (line 48320) | function Shadow(type) {
  function StateTable (line 48403) | function StateTable() {
  function StateTable1 (line 48428) | function StateTable1() {
  function Offset (line 48563) | function Offset() {
  function binarySearch (line 48886) | function binarySearch(arr, cmp) {
  function range (line 48905) | function range(index, end) {
  function _applyDecoratedDescriptor$1 (line 48914) | function _applyDecoratedDescriptor$1(target, property, decorators, descr...
  function CmapProcessor (line 48949) | function CmapProcessor(cmapTable) {
  function KernProcessor (line 49322) | function KernProcessor(font) {
  function UnicodeLayoutEngine (line 49442) | function UnicodeLayoutEngine(font) {
  function BBox (line 49706) | function BBox() {
  function fromOpenType (line 49950) | function fromOpenType(tag) {
  function forString (line 49954) | function forString(string) {
  function forCodePoints (line 49980) | function forCodePoints(codePoints) {
  function direction (line 50023) | function direction(script) {
  function GlyphRun (line 50037) | function GlyphRun(glyphs, features, script, language, direction$$) {
  function mapOTToAAT (line 50708) | function mapOTToAAT(features) {
  function mapFeatureStrings (line 50726) | function mapFeatureStrings(f) {
  function mapAATToOT (line 50749) | function mapAATToOT(features) {
  function _applyDecoratedDescriptor$3 (line 50776) | function _applyDecoratedDescriptor$3(target, property, decorators, descr...
  function AATLookupTable (line 50806) | function AATLookupTable(table) {
  function AATStateMachine (line 50974) | function AATStateMachine(stateTable) {
  function _applyDecoratedDescriptor$2 (line 51086) | function _applyDecoratedDescriptor$2(target, property, decorators, descr...
  function AATMorxProcessor (line 51139) | function AATMorxProcessor(font) {
  function swap (line 51570) | function swap(glyphs, rangeA, rangeB) {
  function reorderGlyphs (line 51588) | function reorderGlyphs(glyphs, verb, firstGlyph, lastGlyph) {
  function AATLayoutEngine (line 51661) | function AATLayoutEngine(font) {
  function ShapingPlan (line 51747) | function ShapingPlan(font, script, direction) {
  function DefaultShaper (line 51920) | function DefaultShaper() {
  function ArabicShaper (line 52045) | function ArabicShaper() {
  function getShapingClass (line 52106) | function getShapingClass(codePoint) {
  function GlyphIterator (line 52121) | function GlyphIterator(glyphs, options) {
  function OTProcessor (line 52207) | function OTProcessor(font, table) {
  function GlyphInfo (line 52872) | function GlyphInfo(font, id) {
  function HangulShaper (line 52962) | function HangulShaper() {
  function getType (line 53068) | function getType(code) {
  function getGlyph (line 53113) | function getGlyph(font, code, features) {
  function decompose (line 53117) | function decompose(glyphs, i, font) {
  function compose (line 53152) | function compose(glyphs, i, font) {
  function getLength (line 53225) | function getLength(code) {
  function reorderToneMark (line 53237) | function reorderToneMark(glyphs, i, font) {
  function insertDottedCircle (line 53253) | function insertDottedCircle(glyphs, i, font) {
  function IndicShaper (line 53481) | function IndicShaper() {
  function indicCategory (line 53545) | function indicCategory(glyph) {
  function indicPosition (line 53549) | function indicPosition(glyph) {
  function setupSyllables (line 53562) | function setupSyllables(font, glyphs) {
  function isConsonant (line 53607) | function isConsonant(glyph) {
  function isJoiner (line 53611) | function isJoiner(glyph) {
  function isHalantOrCoeng (line 53615) | function isHalantOrCoeng(glyph) {
  function wouldSubstitute (line 53619) | function wouldSubstitute(glyphs, feature) {
  function consonantPosition (line 53645) | function consonantPosition(font, consonant, virama) {
  function initialReordering (line 53658) | function initialReordering(font, glyphs, plan) {
  function finalReordering (line 54053) | function finalReordering(font, glyphs, plan) {
  function nextSyllable (line 54387) | function nextSyllable(glyphs, start) {
  function UniversalShaper (line 54409) | function UniversalShaper() {
  function useCategory (line 54463) | function useCategory(glyph) {
  function setupSyllables$1 (line 54475) | function setupSyllables$1(font, glyphs) {
  function clearSubstitutionFlags (line 54509) | function clearSubstitutionFlags(font, glyphs) {
  function recordRphf (line 54528) | function recordRphf(font, glyphs) {
  function recordPref (line 54550) | function recordPref(font, glyphs) {
  function reorder (line 54572) | function reorder(font, glyphs) {
  function nextSyllable$1 (line 54629) | function nextSyllable$1(glyphs, start) {
  function isHalant (line 54636) | function isHalant(glyph) {
  function isBase (line 54640) | function isBase(info) {
  function choose (line 54726) | function choose(script) {
  function GSUBProcessor (line 54757) | function GSUBProcessor() {
  function GPOSProcessor (line 55003) | function GPOSProcessor() {
  function OTLayoutEngine (line 55392) | function OTLayoutEngine(font) {
  function LayoutEngine (line 55512) | function LayoutEngine(font) {
  function Path (line 55765) | function Path() {
  function _applyDecoratedDescriptor$4 (line 56088) | function _applyDecoratedDescriptor$4(target, property, decorators, descr...
  function Glyph (line 56126) | function Glyph(id, codePoints, font) {
  function Point (line 56380) | function Point(onCurve, endContour) {
  function TTFGlyph (line 56420) | function TTFGlyph() {
  function CFFGlyph (line 56778) | function CFFGlyph() {
  function checkWidth (line 56838) | function checkWidth() {
  function parseStems (line 56844) | function parseStems() {
  function moveTo (line 56853) | function moveTo(x, y) {
  function SBIXGlyph (line 57443) | function SBIXGlyph() {
  function COLRGlyph (line 57509) | function COLRGlyph() {
  function GlyphVariationProcessor (line 57635) | function GlyphVariationProcessor(font, coords) {
  function Subset (line 58115) | function Subset(font) {
  function Point (line 58164) | function Point() {
  function TTFGlyphEncoder (line 58201) | function TTFGlyphEncoder() {
  function TTFSubset (line 58332) | function TTFSubset(font) {
  function CFFSubset (line 58478) | function CFFSubset(font) {
  function _applyDecoratedDescriptor (line 58687) | function _applyDecoratedDescriptor(target, property, decorators, descrip...
  function TTFFont (line 58726) | function TTFFont(stream) {
  function WOFFFont (line 59403) | function WOFFFont() {
  function WOFF2Glyph (line 59445) | function WOFF2Glyph() {
  function WOFF2Font (line 59544) | function WOFF2Font() {
  function Substream (line 59652) | function Substream(length) {
  function read255UInt16 (line 59694) | function read255UInt16(stream) {
  function withSign (line 59712) | function withSign(flag, baseval) {
  function decodeTriplet (line 59716) | function decodeTriplet(flags, glyphs, nPoints) {
  function TrueTypeCollection (line 59780) | function TrueTypeCollection(stream) {
  function DFont (line 59921) | function DFont(stream) {
  function ctor (line 60097) | function ctor() { this.constructor = child; }
  function EncodeStream (line 60112) | function EncodeStream(bufferSize) {
  function PrependBOMWrapper (line 60257) | function PrependBOMWrapper(encoder, options) {
  function StripBOMWrapper (line 60279) | function StripBOMWrapper(decoder, options) {
  function InternalCodec (line 60364) | function InternalCodec(codecOptions, iconv) {
  function InternalDecoder (line 60394) | function InternalDecoder(options, codec) {
  function InternalEncoder (line 60404) | function InternalEncoder(options, codec) {
  function InternalEncoderBase64 (line 60419) | function InternalEncoderBase64(options, codec) {
  function InternalEncoderCesu8 (line 60440) | function InternalEncoderCesu8(options, codec) {
  function InternalDecoderCesu8 (line 60470) | function InternalDecoderCesu8(options, codec) {
  function Utf16BECodec (line 60543) | function Utf16BECodec() {
  function Utf16BEEncoder (line 60553) | function Utf16BEEncoder() {
  function Utf16BEDecoder (line 60570) | function Utf16BEDecoder() {
  function Utf16Codec (line 60610) | function Utf16Codec(codecOptions, iconv) {
  function Utf16Encoder (line 60620) | function Utf16Encoder(options, codec) {
  function Utf16Decoder (line 60638) | function Utf16Decoder(options, codec) {
  function detectEncoding (line 60680) | function detectEncoding(buf, defaultEncoding) {
  function Utf7Codec (line 60727) | function Utf7Codec(codecOptions, iconv) {
  function Utf7Encoder (line 60740) | function Utf7Encoder(options, codec) {
  function Utf7Decoder (line 60760) | function Utf7Decoder(options, codec) {
  function Utf7IMAPCodec (line 60851) | function Utf7IMAPCodec(codecOptions, iconv) {
  function Utf7IMAPEncoder (line 60862) | function Utf7IMAPEncoder(options, codec) {
  function Utf7IMAPDecoder (line 60936) | function Utf7IMAPDecoder(options, codec) {
  function SBCSCodec (line 61023) | function SBCSCodec(codecOptions, iconv) {
  function SBCSEncoder (line 61054) | function SBCSEncoder(options, codec) {
  function SBCSDecoder (line 61070) | function SBCSDecoder(options, codec) {
  function DBCSCodec (line 61750) | function DBCSCodec(codecOptions, iconv) {
  function DBCSEncoder (line 61999) | function DBCSEncoder(options, codec) {
  function DBCSDecoder (line 62168) | function DBCSDecoder(options, codec) {
  function findIdx (line 62269) | function findIdx(table, val) {
  function IconvLiteEncoderStream (line 62533) | function IconvLiteEncoderStream(conv, options) {
  function IconvLiteDecoderStream (line 62580) | function IconvLiteDecoderStream(conv, options) {
  function ctor (line 62857) | function ctor() { this.constructor = child; }
  function LazyArrayT (line 62870) | function LazyArrayT() {
  function LazyArray (line 62910) | function LazyArray(type, length, stream, ctx) {
  function Bitfield (line 62964) | function Bitfield(type, flags) {
  function BooleanT (line 63020) | function BooleanT(type) {
  function BufferT (line 63058) | function BufferT(length) {
  function Enum (line 63100) | function Enum(type, options) {
  function Optional (line 63142) | function Optional(type, condition) {
  function Reserved (line 63202) | function Reserved(type, count) {
  function StringT (line 63244) | function StringT(length, encoding) {
  function ctor (line 63328) | function ctor() { this.constructor = child; }
  function VersionedStruct (line 63335) | function VersionedStruct(type, versions) {
  function Pointer (line 63473) | function Pointer(offsetType, type, options) {
  function VoidPointer (line 63628) | function VoidPointer(type, value) {
  function _interopRequireDefault (line 64453) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 64484) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isUndefinedOrNull (line 64641) | function isUndefinedOrNull(value) {
  function isBuffer (line 64645) | function isBuffer (x) {
  function objEquiv (line 64654) | function objEquiv(a, b, opts) {
  function shim (line 64716) | function shim (obj) {
  function supported (line 64734) | function supported(object) {
  function unsupported (line 64739) | function unsupported(object){
  function _interopDefault (line 65188) | function _interopDefault (ex) { return (ex && (typeof ex === 'object') &...
  function StateMachine (line 65207) | function StateMachine(dfa) {
  function _interopRequireDefault (line 65395) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sliceIterator (line 65398) | function sliceIterator(arr, i) {
  function _interopRequireDefault (line 65479) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrap (line 65583) | function wrap(innerFn, outerFn, self, tryLocsList) {
  function tryCatch (line 65607) | function tryCatch(fn, obj, arg) {
  function Generator (line 65628) | function Generator() {}
  function GeneratorFunction (line 65629) | function GeneratorFunction() {}
  function GeneratorFunctionPrototype (line 65630) | function GeneratorFunctionPrototype() {}
  function defineIteratorMethods (line 65658) | function defineIteratorMethods(prototype) {
  function AsyncIterator (line 65697) | function AsyncIterator(generator) {
  function makeInvokeMethod (line 65793) | function makeInvokeMethod(innerFn, self, context) {
  function maybeInvokeDelegate (line 65875) | function maybeInvokeDelegate(delegate, context) {
  function pushTryEntry (line 65972) | function pushTryEntry(locs) {
  function resetTryEntry (line 65987) | function resetTryEntry(entry) {
  function Context (line 65994) | function Context(tryLocsList) {
  function values (line 66030) | function values(iterable) {
  function doneResult (line 66066) | function doneResult() {
  function handle (line 66117) | function handle(loc, caught) {
  function clone (line 66326) | function clone(parent, circular, depth, prototype) {
  function __objToStr (line 66430) | function __objToStr(o) {
  function __isDate (line 66435) | function __isDate(o) {
  function __isArray (line 66440) | function __isArray(o) {
  function __isRegExp (line 66445) | function __isRegExp(o) {
  function __getRegExpFlags (line 66450) | function __getRegExpFlags(re) {
  function BrotliBitReader (line 66507) | function BrotliBitReader(input) {
  function placeHoldersCount (line 66652) | function placeHoldersCount (b64) {
  function byteLength (line 66666) | function byteLength (b64) {
  function toByteArray (line 66671) | function toByteArray (b64) {
  function tripletToBase64 (line 66702) | function tripletToBase64 (num) {
  function encodeChunk (line 66706) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 66716) | function fromByteArray (uint8) {
  function PrefixCodeRange (line 67036) | function PrefixCodeRange(offset, nbits) {
  function Transform (line 67123) | function Transform(prefix, transform, suffix) {
  function ToUpperCase (line 67262) | function ToUpperCase(p, i) {
  function ctor (line 67338) | function ctor() { this.constructor = child; }
  function StandardFont (line 67352) | function StandardFont(document, name1, id) {
  function AFMFont (line 67479) | function AFMFont(contents) {
  function ctor (line 67645) | function ctor() { this.constructor = child; }
  function EmbeddedFont (line 67658) | function EmbeddedFont(document, font, id) {
  function ctor (line 68235) | function ctor() { this.constructor = child; }
  function LineWrapper (line 68245) | function LineWrapper(document, options) {
  function Data (line 68612) | function Data(data) {
  function JPEG (line 68817) | function JPEG(data, label) {
  function PNGImage (line 68898) | function PNGImage(data, label) {
  function PNG (line 69102) | function PNG(data) {
  function ImageMeasure (line 69583) | function ImageMeasure(pdfKitDoc, imageDictionary) {
  function realImageSrc (line 69610) | function realImageSrc(src) {
  function groupDecorations (line 69639) | function groupDecorations(line) {
  function drawDecoration (line 69676) | function drawDecoration(group, x, y, pdfKitDoc) {
  function drawDecorations (line 69761) | function drawDecorations(line, x, y, pdfKitDoc) {
  function drawBackground (line 69768) | function drawBackground(line, x, y, pdfKitDoc) {
  function _fnHungarianMap (line 71665) | function _fnHungarianMap ( o )
  function _fnCamelToHungarian (line 71703) | function _fnCamelToHungarian ( src, user, force )
  function _fnLanguageCompat (line 71742) | function _fnLanguageCompat( lang )
  function _fnCompatOpts (line 71804) | function _fnCompatOpts ( init )
  function _fnCompatCols (line 71845) | function _fnCompatCols ( init )
  function _fnBrowserDetect (line 71865) | function _fnBrowserDetect( settings )
  function _fnReduce (line 71945) | function _fnReduce ( that, fn, init, start, end, inc )
  function _fnAddColumn (line 71979) | function _fnAddColumn( oSettings, nTh )
  function _fnColumnOptions (line 72011) | function _fnColumnOptions( oSettings, iCol, oOptions )
  function _fnAdjustColumnSizing (line 72142) | function _fnAdjustColumnSizing ( settings )
  function _fnVisibleToColumnIndex (line 72174) | function _fnVisibleToColumnIndex( oSettings, iMatch )
  function _fnColumnIndexToVisible (line 72192) | function _fnColumnIndexToVisible( oSettings, iMatch )
  function _fnVisbleColumns (line 72207) | function _fnVisbleColumns( oSettings )
  function _fnGetColumns (line 72230) | function _fnGetColumns( oSettings, sParam )
  function _fnColumnTypes (line 72249) | function _fnColumnTypes ( settings )
  function _fnApplyColumnDefs (line 72320) | function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
  function _fnAddData (line 72400) | function _fnAddData ( oSettings, aDataIn, nTr, anTds )
  function _fnAddTr (line 72450) | function _fnAddTr( settings, trs )
  function _fnNodeToDataIndex (line 72473) | function _fnNodeToDataIndex( oSettings, n )
  function _fnNodeToColumnIndex (line 72487) | function _fnNodeToColumnIndex( oSettings, iRow, n )
  function _fnGetCellData (line 72502) | function _fnGetCellData( settings, rowIdx, colIdx, type )
  function _fnSetCellData (line 72550) | function _fnSetCellData( settings, rowIdx, colIdx, val )
  function _fnSplitObjNotation (line 72572) | function _fnSplitObjNotation( str )
  function _fnGetObjectDataFn (line 72587) | function _fnGetObjectDataFn( mSource )
  function _fnSetObjectDataFn (line 72712) | function _fnSetObjectDataFn( mSource )
  function _fnGetDataMaster (line 72831) | function _fnGetDataMaster ( settings )
  function _fnClearTable (line 72842) | function _fnClearTable( settings )
  function _fnDeleteIndex (line 72858) | function _fnDeleteIndex( a, iTarget, splice )
  function _fnInvalidate (line 72897) | function _fnInvalidate( settings, rowIdx, src, colIdx )
  function _fnGetRowElements (line 72975) | function _fnGetRowElements( settings, row, colIdx, d )
  function _fnCreateTr (line 73084) | function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
  function _fnRowAttributes (line 73168) | function _fnRowAttributes( settings, row )
  function _fnBuildHead (line 73208) | function _fnBuildHead( oSettings )
  function _fnDrawHead (line 73294) | function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
  function _fnDraw (line 73392) | function _fnDraw( oSettings )
  function _fnReDraw (line 73533) | function _fnReDraw( settings, holdPosition )
  function _fnAddOptionsHtml (line 73571) | function _fnAddOptionsHtml ( oSettings )
  function _fnDetectHeader (line 73727) | function _fnDetectHeader ( aLayout, nThead )
  function _fnGetUniqueThs (line 73802) | function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
  function _fnBuildAjax (line 73839) | function _fnBuildAjax( oSettings, data, fn )
  function _fnAjaxUpdate (line 73972) | function _fnAjaxUpdate( settings )
  function _fnAjaxParameters (line 74003) | function _fnAjaxParameters( settings )
  function _fnAjaxUpdateDraw (line 74111) | function _fnAjaxUpdateDraw ( settings, json )
  function _fnAjaxDataSrc (line 74161) | function _fnAjaxDataSrc ( oSettings, json )
  function _fnFeatureHtmlFilter (line 74184) | function _fnFeatureHtmlFilter ( settings )
  function _fnFilterComplete (line 74272) | function _fnFilterComplete ( oSettings, oInput, iForce )
  function _fnFilterCustom (line 74325) | function _fnFilterCustom( settings )
  function _fnFilterColumn (line 74362) | function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, ca...
  function _fnFilter (line 74395) | function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
  function _fnFilterCreateSearch (line 74450) | function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
  function _fnFilterData (line 74492) | function _fnFilterData ( settings )
  function _fnSearchToCamel (line 74565) | function _fnSearchToCamel ( obj )
  function _fnSearchToHung (line 74584) | function _fnSearchToHung ( obj )
  function _fnFeatureHtmlInfo (line 74600) | function _fnFeatureHtmlInfo ( settings )
  function _fnUpdateInfo (line 74634) | function _fnUpdateInfo ( settings )
  function _fnInfoMacros (line 74672) | function _fnInfoMacros ( settings, str )
  function _fnInitialise (line 74699) | function _fnInitialise ( settings )
  function _fnInitComplete (line 74783) | function _fnInitComplete ( settings, json )
  function _fnLengthChange (line 74798) | function _fnLengthChange ( settings, val )
  function _fnFeatureHtmlLength (line 74816) | function _fnFeatureHtmlLength ( settings )
  function _fnFeatureHtmlPaginate (line 74882) | function _fnFeatureHtmlPaginate ( settings )
  function _fnPageChange (line 74943) | function _fnPageChange ( settings, action, redraw )
  function _fnFeatureHtmlProcessing (line 75016) | function _fnFeatureHtmlProcessing ( settings )
  function _fnProcessingDisplay (line 75033) | function _fnProcessingDisplay ( settings, show )
  function _fnFeatureHtmlTable (line 75048) | function _fnFeatureHtmlTable ( settings )
  function _fnScrollDraw (line 75206) | function _fnScrollDraw ( settings )
  function _fnApplyToChildren (line 75489) | function _fnApplyToChildren( fn, an1, an2 )
  function _fnCalculateColumnWidths (line 75528) | function _fnCalculateColumnWidths ( oSettings )
  function _fnConvertToWidth (line 75766) | function _fnConvertToWidth ( width, parent )
  function _fnGetWidestNode (line 75790) | function _fnGetWidestNode( settings, colIdx )
  function _fnGetMaxLenString (line 75811) | function _fnGetMaxLenString( settings, colIdx )
  function _fnStringToCss (line 75836) | function _fnStringToCss( s )
  function _fnSortFlatten (line 75856) | function _fnSortFlatten ( settings )
  function _fnSort (line 75928) | function _fnSort ( oSettings )
  function _fnSortAria (line 76054) | function _fnSortAria ( settings )
  function _fnSortListener (line 76109) | function _fnSortListener ( settings, colIdx, append, callback )
  function _fnSortAttachListener (line 76193) | function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
  function _fnSortingClasses (line 76231) | function _fnSortingClasses( settings )
  function _fnSortData (line 76264) | function _fnSortData( settings, idx )
  function _fnSaveState (line 76307) | function _fnSaveState ( settings )
  function _fnLoadState (line 76343) | function _fnLoadState ( settings, oInit, callback )
  function _fnSettingsFromNode (line 76445) | function _fnSettingsFromNode ( table )
  function _fnLog (line 76464) | function _fnLog( settings, level, msg, tn )
  function _fnMap (line 76507) | function _fnMap( ret, src, name, mappedName )
  function _fnExtend (line 76549) | function _fnExtend( out, extender, breakRefs )
  function _fnBindAction (line 76585) | function _fnBindAction( n, oData, fn )
  function _fnCallbackReg (line 76614) | function _fnCallbackReg( oSettings, sStore, fn, sName )
  function _fnCallbackFire (line 76640) | function _fnCallbackFire( settings, callbackArr, eventName, args )
  function _fnLengthOverflow (line 76662) | function _fnLengthOverflow ( settings )
  function _fnRenderer (line 76687) | function _fnRenderer( settings, type )
  function _fnDataSource (line 76716) | function _fnDataSource ( settings )
  function _numbers (line 84465) | function _numbers ( page, pages ) {
  function _addNumericSort (line 84756) | function _addNumericSort ( decimalPlace ) {
  function _fnExternApiFunc (line 85006) | function _fnExternApiFunc (fn)
  function _init (line 88686) | function _init ( settings ) {
  function createCellPos (line 89664) | function createCellPos( n ){
  function _createNode (line 89688) | function _createNode( doc, nodeName, opts ){
  function _excelColWidth (line 89716) | function _excelColWidth( data, col ) {
  function _xlsxToStrings (line 89778) | function _xlsxToStrings( obj ) {
  function _jsZip (line 90515) | function _jsZip () {
  function _pdfMake (line 90518) | function _pdfMake () {
  function createCellPos (line 90826) | function createCellPos( n ){
  function _addToZip (line 90854) | function _addToZip( zip, obj ) {
  function _createNode (line 90934) | function _createNode( doc, nodeName, opts ) {
  function _excelColWidth (line 90962) | function _excelColWidth( data, col ) {
  function fnInvertKeyValues (line 92204) | function fnInvertKeyValues( aIn )
  function fnArraySwitch (line 92223) | function fnArraySwitch( aArray, iFrom, iTo )
  function fnDomSwitch (line 92239) | function fnDomSwitch( nParent, iFrom, iTo )
  function _childNodes (line 98183) | function _childNodes( dt, row, col ) {
  function _childNodesRestore (line 98202) | function _childNodesRestore( dt, row, col ) {
  function cellRange (line 101283) | function cellRange( dt, idx, last )
  function disableMouseSelection (line 101364) | function disableMouseSelection( dt )
  function enableMouseSelection (line 101383) | function enableMouseSelection ( dt )
  function eventTrigger (line 101503) | function eventTrigger ( api, type, args, any )
  function info (line 101525) | function info ( api )
  function init (line 101579) | function init ( ctx ) {
  function rowColumnRange (line 101663) | function rowColumnRange( dt, type, idx, last )
  function clear (line 101706) | function clear( ctx, force )
  function typeSelect (line 101727) | function typeSelect ( e, dt, ctx, type, idx )
  function i18n (line 102090) | function i18n( label, def ) {
  function namespacedEvents (line 102097) | function namespacedEvents ( config ) {
  function enabled (line 102103) | function enabled ( dt, config ) {

FILE: static/js/DataTables/jQuery-3.3.1/jquery-3.3.1.js
  function DOMEval (line 97) | function DOMEval( code, doc, node ) {
  function toType (line 115) | function toType( obj ) {
  function isArrayLike (line 483) | function isArrayLike( obj ) {
  function Sizzle (line 715) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 854) | function createCache() {
  function markFunction (line 872) | function markFunction( fn ) {
  function assert (line 881) | function assert( fn ) {
  function addHandle (line 903) | function addHandle( attrs, handler ) {
  function siblingCheck (line 918) | function siblingCheck( a, b ) {
  function createInputPseudo (line 944) | function createInputPseudo( type ) {
  function createButtonPseudo (line 955) | function createButtonPseudo( type ) {
  function createDisabledPseudo (line 966) | function createDisabledPseudo( disabled ) {
  function createPositionalPseudo (line 1022) | function createPositionalPseudo( fn ) {
  function testContext (line 1045) | function testContext( context ) {
  function setFilters (line 2127) | function setFilters() {}
  function toSelector (line 2198) | function toSelector( tokens ) {
  function addCombinator (line 2208) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2272) | function elementMatcher( matchers ) {
  function multipleContexts (line 2286) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2295) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2316) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2409) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2467) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function nodeName (line 2803) | function nodeName( elem, name ) {
  function winnow (line 2813) | function winnow( elements, qualifier, not ) {
  function sibling (line 3108) | function sibling( cur, dir ) {
  function createOptions (line 3195) | function createOptions( options ) {
  function Identity (line 3420) | function Identity( v ) {
  function Thrower (line 3423) | function Thrower( ex ) {
  function adoptValue (line 3427) | function adoptValue( value, resolve, reject, noValue ) {
  function resolve (line 3520) | function resolve( depth, deferred, handler, special ) {
  function completed (line 3885) | function completed() {
  function fcamelCase (line 3980) | function fcamelCase( all, letter ) {
  function camelCase (line 3987) | function camelCase( string ) {
  function Data (line 4004) | function Data() {
  function getData (line 4173) | function getData( data ) {
  function dataAttr (line 4198) | function dataAttr( elem, key, data ) {
  function adjustCSS (line 4511) | function adjustCSS( elem, prop, valueParts, tween ) {
  function getDefaultDisplay (line 4578) | function getDefaultDisplay( elem ) {
  function showHide (line 4601) | function showHide( elements, show ) {
  function getAll (line 4702) | function getAll( context, tag ) {
  function setGlobalEval (line 4727) | function setGlobalEval( elems, refElements ) {
  function buildFragment (line 4743) | function buildFragment( elems, context, scripts, selection, ignored ) {
  function returnTrue (line 4866) | function returnTrue() {
  function returnFalse (line 4870) | function returnFalse() {
  function safeActiveElement (line 4876) | function safeActiveElement() {
  function on (line 4882) | function on( elem, types, selector, data, fn, one ) {
  function manipulationTarget (line 5610) | function manipulationTarget( elem, content ) {
  function disableScript (line 5621) | function disableScript( elem ) {
  function restoreScript (line 5625) | function restoreScript( elem ) {
  function cloneCopyEvent (line 5635) | function cloneCopyEvent( src, dest ) {
  function fixInput (line 5670) | function fixInput( src, dest ) {
  function domManip (line 5683) | function domManip( collection, args, callback, ignored ) {
  function remove (line 5773) | function remove( elem, selector, keepData ) {
  function computeStyleTests (line 6066) | function computeStyleTests() {
  function roundPixelMeasures (line 6108) | function roundPixelMeasures( measure ) {
  function curCSS (line 6153) | function curCSS( elem, name, computed ) {
  function addGetHookIf (line 6206) | function addGetHookIf( conditionFn, hookFn ) {
  function vendorPropName (line 6243) | function vendorPropName( name ) {
  function finalPropName (line 6264) | function finalPropName( name ) {
  function setPositiveNumber (line 6272) | function setPositiveNumber( elem, value, subtract ) {
  function boxModelAdjustment (line 6284) | function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, ...
  function getWidthOrHeight (line 6349) | function getWidthOrHeight( elem, dimension, extra ) {
  function Tween (line 6682) | function Tween( elem, options, prop, end, easing ) {
  function schedule (line 6805) | function schedule() {
  function createFxNow (line 6818) | function createFxNow() {
  function genFx (line 6826) | function genFx( type, includeWidth ) {
  function createTween (line 6846) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 6860) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7032) | function propFilter( props, specialEasing ) {
  function Animation (line 7069) | function Animation( elem, properties, options ) {
  function stripAndCollapse (line 7784) | function stripAndCollapse( value ) {
  function getClass (line 7790) | function getClass( elem ) {
  function classesToArray (line 7794) | function classesToArray( value ) {
  function buildParams (line 8416) | function buildParams( prefix, obj, traditional, add ) {
  function addToPrefiltersOrTransports (line 8566) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8600) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8629) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8649) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8707) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9220) | function done( status, nativeStatusText, responses, headers ) {

FILE: static/js/DataTables/pdfmake-0.1.36/pdfmake.js
  function __webpack_require__ (line 17) | function __webpack_require__(moduleId) {
  function isString (line 84) | function isString(variable) {
  function isNumber (line 88) | function isNumber(variable) {
  function isBoolean (line 92) | function isBoolean(variable) {
  function isArray (line 96) | function isArray(variable) {
  function isFunction (line 100) | function isFunction(variable) {
  function isObject (line 104) | function isObject(variable) {
  function isNull (line 108) | function isNull(variable) {
  function isUndefined (line 112) | function isUndefined(variable) {
  function pack (line 116) | function pack() {
  function offsetVector (line 134) | function offsetVector(vector, x, y) {
  function fontStringify (line 156) | function fontStringify(key, val) {
  function typedArraySupport (line 234) | function typedArraySupport () {
  function kMaxLength (line 246) | function kMaxLength () {
  function createBuffer (line 252) | function createBuffer (that, length) {
  function Buffer (line 281) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 306) | function from (that, value, encodingOrOffset, length) {
  function assertSize (line 347) | function assertSize (size) {
  function alloc (line 355) | function alloc (that, size, fill, encoding) {
  function allocUnsafe (line 379) | function allocUnsafe (that, size) {
  function fromString (line 403) | function fromString (that, string, encoding) {
  function fromArrayLike (line 427) | function fromArrayLike (that, array) {
  function fromArrayBuffer (line 436) | function fromArrayBuffer (that, array, byteOffset, length) {
  function fromObject (line 466) | function fromObject (that, obj) {
  function checked (line 496) | function checked (length) {
  function SlowBuffer (line 506) | function SlowBuffer (length) {
  function byteLength (line 589) | function byteLength (string, encoding) {
  function slowToString (line 634) | function slowToString (encoding, start, end) {
  function swap (line 708) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 842) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 899) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 967) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 994) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 998) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 1002) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 1006) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 1010) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 1093) | function base64Slice (buf, start, end) {
  function utf8Slice (line 1101) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 1179) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 1197) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 1207) | function latin1Slice (buf, start, end) {
  function hexSlice (line 1217) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 1230) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 1278) | function checkOffset (offset, ext, length) {
  function checkInt (line 1439) | function checkInt (buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 1492) | function objectWriteUInt16 (buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 1526) | function objectWriteUInt32 (buf, value, offset, littleEndian) {
  function checkIEEE754 (line 1676) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 1681) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 1697) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 1830) | function base64clean (str) {
  function stringtrim (line 1842) | function stringtrim (str) {
  function toHex (line 1847) | function toHex (n) {
  function utf8ToBytes (line 1852) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 1932) | function asciiToBytes (str) {
  function utf16leToBytes (line 1941) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 1957) | function base64ToBytes (str) {
  function blitBuffer (line 1961) | function blitBuffer (src, dst, offset, length) {
  function isnan (line 1969) | function isnan (val) {
  function VirtualFileSystem (line 2133) | function VirtualFileSystem() {
  function fixFilename (line 2163) | function fixFilename(filename) {
  function defaultSetTimout (line 2215) | function defaultSetTimout() {
  function defaultClearTimeout (line 2218) | function defaultClearTimeout () {
  function runTimeout (line 2241) | function runTimeout(fun) {
  function runClearTimeout (line 2266) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 2298) | function cleanUpNextTick() {
  function drainQueue (line 2313) | function drainQueue() {
  function Item (line 2351) | function Item(fun, array) {
  function noop (line 2365) | function noop() {}
  function PropertyDescriptor (line 2418) | function PropertyDescriptor(opts) {
  function Stream (line 2510) | function Stream() {
  function ondata (line 2517) | function ondata(chunk) {
  function ondrain (line 2527) | function ondrain() {
  function onend (line 2543) | function onend() {
  function onclose (line 2551) | function onclose() {
  function onerror (line 2559) | function onerror(er) {
  function cleanup (line 2570) | function cleanup() {
  function Duplex (line 2663) | function Duplex(options) {
  function onend (line 2680) | function onend() {
  function onEndNT (line 2690) | function onEndNT(self) {
  function forEach (line 2722) | function forEach(xs, f) {
  function ctor (line 2826) | function ctor() { this.constructor = child; }
  function NumberT (line 2831) | function NumberT(type, endian) {
  function Fixed (line 2897) | function Fixed(size, endian, fracBits) {
  function isArray (line 2989) | function isArray(arg) {
  function isBoolean (line 2997) | function isBoolean(arg) {
  function isNull (line 3002) | function isNull(arg) {
  function isNullOrUndefined (line 3007) | function isNullOrUndefined(arg) {
  function isNumber (line 3012) | function isNumber(arg) {
  function isString (line 3017) | function isString(arg) {
  function isSymbol (line 3022) | function isSymbol(arg) {
  function isUndefined (line 3027) | function isUndefined(arg) {
  function isRegExp (line 3032) | function isRegExp(re) {
  function isObject (line 3037) | function isObject(arg) {
  function isDate (line 3042) | function isDate(d) {
  function isError (line 3047) | function isError(e) {
  function isFunction (line 3052) | function isFunction(arg) {
  function isPrimitive (line 3057) | function isPrimitive(arg) {
  function objectToString (line 3069) | function objectToString(o) {
  function PDFObject (line 3092) | function PDFObject() {}
  function EventEmitter (line 3285) | function EventEmitter() {
  function g (line 3423) | function g() {
  function isFunction (line 3551) | function isFunction(arg) {
  function isNumber (line 3555) | function isNumber(arg) {
  function isObject (line 3559) | function isObject(arg) {
  function isUndefined (line 3563) | function isUndefined(arg) {
  function nextTick (line 3583) | function nextTick(fn, arg1, arg2, arg3) {
  function copyProps (line 3629) | function copyProps (src, dst) {
  function SafeBuffer (line 3642) | function SafeBuffer (arg, encodingOrOffset, length) {
  function _has (line 3700) | function _has(obj, key) {
  function TextTools (line 4002) | function TextTools(fontProvider) {
  function getTrimmedWidth (line 4048) | function getTrimmedWidth(item) {
  function splitWords (line 4087) | function splitWords(text, noWrap) {
  function copyStyle (line 4116) | function copyStyle(source, destination) {
  function normalizeTextArray (line 4129) | function normalizeTextArray(array, styleContextStack) {
  function normalizeString (line 4177) | function normalizeString(value) {
  function getStyleProperty (line 4189) | function getStyleProperty(item, styleContextStack, property, defaultValu...
  function measure (line 4212) | function measure(fontProvider, textArray, styleContextStack) {
  function widthOfString (line 4282) | function widthOfString(text, font, fontSize, characterSpacing, fontFeatu...
  function UnicodeTrie (line 4333) | function UnicodeTrie(data) {
  function buildColumnWidths (line 4395) | function buildColumnWidths(columns, availableWidth) {
  function isAutoColumn (line 4478) | function isAutoColumn(column) {
  function isStarColumn (line 4482) | function isStarColumn(column) {
  function measureMinMax (line 4487) | function measureMinMax(columns) {
  function WriteReq (line 4582) | function WriteReq(chunk, encoding, cb) {
  function CorkedRequest (line 4591) | function CorkedRequest(state) {
  function _uint8ArrayToBuffer (line 4631) | function _uint8ArrayToBuffer(chunk) {
  function _isUint8Array (line 4634) | function _isUint8Array(obj) {
  function nop (line 4644) | function nop() {}
  function WritableState (line 4646) | function WritableState(options, stream) {
  function Writable (line 4796) | function Writable(options) {
  function writeAfterEnd (line 4833) | function writeAfterEnd(stream, cb) {
  function validChunk (line 4843) | function validChunk(stream, state, chunk, cb) {
  function decodeChunk (line 4910) | function decodeChunk(state, chunk, encoding) {
  function writeOrBuffer (line 4920) | function writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {
  function doWrite (line 4959) | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  function onwriteError (line 4968) | function onwriteError(stream, state, sync, er, cb) {
  function onwriteStateUpdate (line 4992) | function onwriteStateUpdate(state) {
  function onwrite (line 4999) | function onwrite(stream, er) {
  function afterWrite (line 5024) | function afterWrite(stream, state, finished, cb) {
  function onwriteDrain (line 5034) | function onwriteDrain(stream, state) {
  function clearBuffer (line 5042) | function clearBuffer(stream, state) {
  function needFinish (line 5133) | function needFinish(state) {
  function callFinal (line 5136) | function callFinal(stream, state) {
  function prefinish (line 5147) | function prefinish(stream, state) {
  function finishMaybe (line 5160) | function finishMaybe(stream, state) {
  function endWritable (line 5172) | function endWritable(stream, state, cb) {
  function onCorkedFinish (line 5182) | function onCorkedFinish(corkReq, state, err) {
  function _normalizeEncoding (line 5245) | function _normalizeEncoding(enc) {
  function normalizeEncoding (line 5275) | function normalizeEncoding(enc) {
  function StringDecoder (line 5285) | function StringDecoder(encoding) {
  function utf8CheckByte (line 5346) | function utf8CheckByte(byte) {
  function utf8CheckIncomplete (line 5354) | function utf8CheckIncomplete(self, buf, i) {
  function utf8CheckExtraBytes (line 5387) | function utf8CheckExtraBytes(self, buf, p) {
  function utf8FillLast (line 5407) | function utf8FillLast(buf) {
  function utf8Text (line 5422) | function utf8Text(buf, i) {
  function utf8End (line 5433) | function utf8End(buf) {
  function utf16Text (line 5443) | function utf16Text(buf, i) {
  function utf16End (line 5466) | function utf16End(buf) {
  function base64Text (line 5475) | function base64Text(buf, i) {
  function base64End (line 5489) | function base64End(buf) {
  function simpleWrite (line 5496) | function simpleWrite(buf) {
  function simpleEnd (line 5500) | function simpleEnd(buf) {
  function zlibBuffer (line 5696) | function zlibBuffer(engine, buffer, callback) {
  function zlibBufferSync (line 5737) | function zlibBufferSync(engine, buffer) {
  function Deflate (line 5749) | function Deflate(opts) {
  function Inflate (line 5754) | function Inflate(opts) {
  function Gzip (line 5760) | function Gzip(opts) {
  function Gunzip (line 5765) | function Gunzip(opts) {
  function DeflateRaw (line 5771) | function DeflateRaw(opts) {
  function InflateRaw (line 5776) | function InflateRaw(opts) {
  function Unzip (line 5782) | function Unzip(opts) {
  function isValidFlushFlag (line 5787) | function isValidFlushFlag(flag) {
  function Zlib (line 5796) | function Zlib(opts, mode) {
  function _close (line 5958) | function _close(engine, callback) {
  function emitCloseNT (line 5968) | function emitCloseNT(self) {
  function callback (line 6053) | function callback(availInAfter, availOutAfter) {
  function deprecated (line 6201) | function deprecated() {
  function inspect (line 6248) | function inspect(obj, opts) {
  function stylizeWithColor (line 6306) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 6318) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 6323) | function arrayToHash(array) {
  function formatValue (line 6334) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 6447) | function formatPrimitive(ctx, value) {
  function formatError (line 6466) | function formatError(value) {
  function formatArray (line 6471) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 6491) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 6550) | function reduceToSingleString(output, base, braces) {
  function isArray (line 6573) | function isArray(ar) {
  function isBoolean (line 6578) | function isBoolean(arg) {
  function isNull (line 6583) | function isNull(arg) {
  function isNullOrUndefined (line 6588) | function isNullOrUndefined(arg) {
  function isNumber (line 6593) | function isNumber(arg) {
  function isString (line 6598) | function isString(arg) {
  function isSymbol (line 6603) | function isSymbol(arg) {
  function isUndefined (line 6608) | function isUndefined(arg) {
  function isRegExp (line 6613) | function isRegExp(re) {
  function isObject (line 6618) | function isObject(arg) {
  function isDate (line 6623) | function isDate(d) {
  function isError (line 6628) | function isError(e) {
  function isFunction (line 6634) | function isFunction(arg) {
  function isPrimitive (line 6639) | function isPrimitive(arg) {
  function objectToString (line 6651) | function objectToString(o) {
  function pad (line 6656) | function pad(n) {
  function timestamp (line 6665) | function timestamp() {
  function hasOwnProperty (line 6707) | function hasOwnProperty(obj, prop) {
  function PDFFont (line 6744) | function PDFFont() {
  function DecodeStream (line 6810) | function DecodeStream(buffer) {
  function _interopRequireDefault (line 7353) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function TraversalTracker (line 7431) | function TraversalTracker() {
  function LineBreaker (line 7503) | function LineBreaker(string) {
  function Break (line 7559) | function Break(position, required) {
  function Tree (line 7652) | function Tree() {
  function Data (line 7657) | function Data(source, dest) {
  function tinf_build_bits_base (line 7701) | function tinf_build_bits_base(bits, base, delta, first) {
  function tinf_build_fixed_trees (line 7716) | function tinf_build_fixed_trees(lt, dt) {
  function tinf_build_tree (line 7742) | function tinf_build_tree(t, lengths, off, num) {
  function tinf_getbit (line 7770) | function tinf_getbit(d) {
  function tinf_read_bits (line 7786) | function tinf_read_bits(d, num, base) {
  function tinf_decode_symbol (line 7802) | function tinf_decode_symbol(d, t) {
  function tinf_decode_trees (line 7828) | function tinf_decode_trees(d, lt, dt) {
  function tinf_inflate_block_data (line 7894) | function tinf_inflate_block_data(d, lt, dt) {
  function tinf_inflate_uncompressed_block (line 7928) | function tinf_inflate_uncompressed_block(d) {
  function tinf_uncompress (line 7963) | function tinf_uncompress(source, dest) {
  function StyleContextStack (line 8046) | function StyleContextStack(styleDictionary, defaultStyle) {
  function DocumentContext (line 8223) | function DocumentContext(pageSize, pageMargins) {
  function pageOrientation (line 8399) | function pageOrientation(pageOrientationString, currentPageOrientation) {
  function bottomMostContext (line 8497) | function bottomMostContext(c1, c2) {
  function Line (line 8534) | function Line(maxWidth) {
  function _uint8ArrayToBuffer (line 8660) | function _uint8ArrayToBuffer(chunk) {
  function _isUint8Array (line 8663) | function _isUint8Array(obj) {
  function prependListener (line 8692) | function prependListener(emitter, event, fn) {
  function ReadableState (line 8704) | function ReadableState(options, stream) {
  function Readable (line 8781) | function Readable(options) {
  function readableAddChunk (line 8856) | function readableAddChunk(stream, chunk, encoding, addToFront, skipChunk...
  function addChunk (line 8892) | function addChunk(stream, state, chunk, addToFront) {
  function chunkInvalid (line 8906) | function chunkInvalid(state, chunk) {
  function needMoreData (line 8921) | function needMoreData(state) {
  function computeNewHighWaterMark (line 8939) | function computeNewHighWaterMark(n) {
  function howMuchToRead (line 8958) | function howMuchToRead(n, state) {
  function onEofChunk (line 9077) | function onEofChunk(stream, state) {
  function emitReadable (line 9095) | function emitReadable(stream) {
  function emitReadable_ (line 9105) | function emitReadable_(stream) {
  function maybeReadMore (line 9117) | function maybeReadMore(stream, state) {
  function maybeReadMore_ (line 9124) | function maybeReadMore_(stream, state) {
  function onunpipe (line 9168) | function onunpipe(readable, unpipeInfo) {
  function onend (line 9178) | function onend() {
  function cleanup (line 9191) | function cleanup() {
  function ondata (line 9219) | function ondata(chunk) {
  function onerror (line 9239) | function onerror(er) {
  function onclose (line 9250) | function onclose() {
  function onfinish (line 9255) | function onfinish() {
  function unpipe (line 9262) | function unpipe() {
  function pipeOnDrain (line 9279) | function pipeOnDrain(src) {
  function nReadingNextTick (line 9366) | function nReadingNextTick(self) {
  function resume (line 9383) | function resume(stream, state) {
  function resume_ (line 9390) | function resume_(stream, state) {
  function flow (line 9413) | function flow(stream) {
  function fromList (line 9489) | function fromList(n, state) {
  function fromListPartial (line 9509) | function fromListPartial(n, list, hasStrings) {
  function copyFromBufferString (line 9529) | function copyFromBufferString(n, list) {
  function copyFromBuffer (line 9558) | function copyFromBuffer(n, list) {
  function endReadable (line 9585) | function endReadable(stream) {
  function endReadableNT (line 9598) | function endReadableNT(state, stream) {
  function forEach (line 9607) | function forEach(xs, f) {
  function indexOf (line 9613) | function indexOf(xs, x) {
  function destroy (line 9641) | function destroy(err, cb) {
  function undestroy (line 9682) | function undestroy() {
  function emitErrorNT (line 9699) | function emitErrorNT(self, err) {
  function afterTransform (line 9789) | function afterTransform(er, data) {
  function Transform (line 9814) | function Transform(options) {
  function prefinish (line 9846) | function prefinish() {
  function done (line 9913) | function done(stream, er, data) {
  function ctor (line 9942) | function ctor() { this.constructor = child; }
  function PDFReference (line 9952) | function PDFReference(document, id, data) {
  function compare (line 10060) | function compare(a, b) {
  function isBuffer (line 10084) | function isBuffer(b) {
  function pToString (line 10123) | function pToString (obj) {
  function isView (line 10126) | function isView(arrbuf) {
  function getName (line 10160) | function getName(func) {
  function truncate (line 10210) | function truncate(s, n) {
  function inspect (line 10217) | function inspect(something) {
  function getMessage (line 10225) | function getMessage(self) {
  function fail (line 10242) | function fail(actual, expected, message, operator, stackStartFunction) {
  function ok (line 10262) | function ok(value, message) {
  function _deepEqual (line 10299) | function _deepEqual(actual, expected, strict, memos) {
  function isArguments (line 10365) | function isArguments(object) {
  function objEquiv (line 10369) | function objEquiv(a, b, strict, actualVisitedObjects) {
  function notDeepStrictEqual (line 10421) | function notDeepStrictEqual(actual, expected, message) {
  function expectedException (line 10446) | function expectedException(actual, expected) {
  function _tryBlock (line 10470) | function _tryBlock(block) {
  function _throws (line 10480) | function _throws(shouldThrow, block, expected, message) {
  function adler32 (line 10572) | function adler32(adler, buf, len, pos) {
  function makeTable (line 10631) | function makeTable() {
  function crc32 (line 10649) | function crc32(crc, buf, len, pos) {
  function ArrayT (line 10691) | function ArrayT(type, length, lengthType) {
  function Struct (line 10800) | function Struct(fields) {
  function _interopRequireDefault (line 11082) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function defineProperties (line 11085) | function defineProperties(target, props) {
  function DecodeWindowBits (line 11506) | function DecodeWindowBits(br) {
  function DecodeVarLenUint8 (line 11526) | function DecodeVarLenUint8(br) {
  function MetaBlockLength (line 11538) | function MetaBlockLength() {
  function DecodeMetaBlockLength (line 11545) | function DecodeMetaBlockLength(br) {
  function ReadSymbol (line 11594) | function ReadSymbol(table, index, br) {
  function ReadHuffmanCodeLengths (line 11610) | function ReadHuffmanCodeLengths(code_length_code_lengths, num_symbols, c...
  function ReadHuffmanCode (line 11680) | function ReadHuffmanCode(alphabet_size, tables, table, br) {
  function ReadBlockLength (line 11785) | function ReadBlockLength(table, index, br) {
  function TranslateShortCodes (line 11793) | function TranslateShortCodes(code, ringbuffer, index) {
  function MoveToFront (line 11805) | function MoveToFront(v, index) {
  function InverseMoveToFrontTransform (line 11812) | function InverseMoveToFrontTransform(v, v_len) {
  function HuffmanTreeGroup (line 11826) | function HuffmanTreeGroup(alphabet_size, num_htrees) {
  function DecodeContextMap (line 11844) | function DecodeContextMap(context_map_size, br) {
  function DecodeBlockType (line 11900) | function DecodeBlockType(max_block_type, trees, tree_type, block_types, ...
  function CopyUncompressedBlockToOutput (line 11920) | function CopyUncompressedBlockToOutput(output, len, pos, ringbuffer, rin...
  function JumpToByteBoundary (line 12004) | function JumpToByteBoundary(br) {
  function BrotliDecompressedSize (line 12010) | function BrotliDecompressedSize(buffer) {
  function BrotliDecompressBuffer (line 12020) | function BrotliDecompressBuffer(buffer, output_size) {
  function BrotliDecompress (line 12041) | function BrotliDecompress(input, output) {
  function BrotliInput (line 12392) | function BrotliInput(buffer) {
  function BrotliOutput (line 12411) | function BrotliOutput(buf) {
  function HuffmanCode (line 12474) | function HuffmanCode(bits, value) {
  function GetNextKey (line 12485) | function GetNextKey(key, len) {
  function ReplicateValue (line 12495) | function ReplicateValue(table, i, step, end, code) {
  function NextTableBitSize (line 12505) | function NextTableBitSize(count, len, root_bits) {
  function PDFImage (line 12622) | function PDFImage() {}
  function Document (line 12687) | function Document(docDefinition, tableLayouts, fonts, vfs) {
  function canCreatePdf (line 12694) | function canCreatePdf() {
  function placeHoldersCount (line 12891) | function placeHoldersCount (b64) {
  function byteLength (line 12905) | function byteLength (b64) {
  function toByteArray (line 12910) | function toByteArray (b64) {
  function tripletToBase64 (line 12941) | function tripletToBase64 (num) {
  function encodeChunk (line 12945) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 12955) | function fromByteArray (uint8) {
  function PdfPrinter (line 13119) | function PdfPrinter(fontDescriptors) {
  function setMetadata (line 13213) | function setMetadata(docDefinition, pdfKitDoc) {
  function calculatePageHeight (line 13243) | function calculatePageHeight(pages, margins) {
  function fixPageSize (line 13265) | function fixPageSize(pageSize, pageOrientation) {
  function fixPageMargins (line 13288) | function fixPageMargins(margin) {
  function registerDefaultTableLayouts (line 13308) | function registerDefaultTableLayouts(layoutBuilder) {
  function pageSize2widthAndHeight (line 13364) | function pageSize2widthAndHeight(pageSize) {
  function updatePageOrientationInOptions (line 13376) | function updatePageOrientationInOptions(currentPage, pdfKitDoc) {
  function renderPages (line 13386) | function renderPages(pages, fontProvider, pdfKitDoc, progressCallback) {
  function renderLine (line 13435) | function renderLine(line, x, y, pdfKitDoc) {
  function renderWatermark (line 13499) | function renderWatermark(page, pdfKitDoc) {
  function renderVector (line 13520) | function renderVector(vector, pdfKitDoc) {
  function renderImage (line 13596) | function renderImage(image, x, y, pdfKitDoc) {
  function beginClip (line 13603) | function beginClip(rect, pdfKitDoc) {
  function endClip (line 13609) | function endClip(pdfKitDoc) {
  function typeName (line 13625) | function typeName(bold, italics) {
  function FontProvider (line 13637) | function FontProvider(fontDescriptors, pdfKitDoc) {
  function addAll (line 13702) | function addAll(target, otherArray) {
  function LayoutBuilder (line 13715) | function LayoutBuilder(pageSize, pageMargins, imageMeasure) {
  function addPageBreaksIfNecessary (line 13739) | function addPageBreaksIfNecessary(linearNodeList, pages) {
  function resetXYs (line 13812) | function resetXYs(result) {
  function getSize (line 13953) | function getSize(pageSize, watermark, fontProvider) {
  function decorateNode (line 13990) | function decorateNode(node) {
  function applyMargins (line 14076) | function applyMargins(callback) {
  function gapArray (line 14127) | function gapArray(gap) {
  function storePageBreakData (line 14178) | function storePageBreakData(data) {
  function colLeftOffset (line 14197) | function colLeftOffset(i) {
  function getEndingCell (line 14204) | function getEndingCell(column, columnIndex) {
  function addMarkerToFirstLeaf (line 14236) | function addMarkerToFirstLeaf(line) {
  function cloneInline (line 14324) | function cloneInline(inline) {
  function DocPreprocessor (line 14417) | function DocPreprocessor() {
  function DocMeasure (line 14639) | function DocMeasure(fontProvider, styleDictionary, defaultStyle, imageMe...
  function extendMargins (line 14691) | function extendMargins(node) {
  function getNodeMargin (line 14702) | function getNodeMargin() {
  function buildDisc (line 14893) | function buildDisc(gapSize, color) {
  function buildSquare (line 14908) | function buildSquare(gapSize, color) {
  function buildCircle (line 14923) | function buildCircle(gapSize, color) {
  function prepareAlpha (line 14967) | function prepareAlpha(counter) {
  function prepareRoman (line 14979) | function prepareRoman(counter) {
  function prepareDecimal (line 14994) | function prepareDecimal(counter) {
  function measureCb (line 15191) | function measureCb(_this, data) {
  function getLayout (line 15200) | function getLayout(tableLayouts) {
  function getOffsets (line 15241) | function getOffsets(layout) {
  function extendWidthsForColSpans (line 15261) | function extendWidthsForColSpans() {
  function getMinMax (line 15289) | function getMinMax(col, span, offsets) {
  function markSpans (line 15300) | function markSpans(rowData, col, span) {
  function markVSpans (line 15311) | function markVSpans(table, row, col, span) {
  function extendTableWidths (line 15322) | function extendTableWidths(node) {
  function decode (line 15409) | function decode (elt) {
  function b64ToByteArray (line 15427) | function b64ToByteArray (b64) {
  function uint8ToBase64 (line 15473) | function uint8ToBase64 (uint8) {
  function generateFrame (line 16315) | function generateFrame(data, options) {
  function buildCanvas (line 16377) | function buildCanvas(data, options) {
  function measure (line 16416) | function measure(node) {
  function PageElementWriter (line 16445) | function PageElementWriter(context, tracker) {
  function fitOnPage (line 16452) | function fitOnPage(self, addFct) {
  function ElementWriter (line 16614) | function ElementWriter(context, tracker) {
  function addPageItem (line 16620) | function addPageItem(page, item, index) {
  function cloneLine (line 16820) | function cloneLine(line) {
  function TableProcessor (line 16928) | function TableProcessor(tableNode) {
  function getTableInnerContentWidth (line 16961) | function getTableInnerContentWidth() {
  function prepareRowSpanData (line 16971) | function prepareRowSpanData() {
  function prepareCellBorders (line 16995) | function prepareCellBorders(body) {
  function getLineXs (line 17309) | function getLineXs() {
  function ctor (line 17347) | function ctor() { this.constructor = child; }
  function PDFDocument (line 17365) | function PDFDocument(options1) {
  function _classCallCheck (line 17601) | function _classCallCheck(instance, Constructor) { if (!(instance instanc...
  function copyBuffer (line 17606) | function copyBuffer(src, target, offset) {
  function BufferList (line 17611) | function BufferList() {
  function Timeout (line 17706) | function Timeout(id, clearFn) {
  function setImmediate (line 17769) | function setImmediate(callback) {
  function clearImmediate (line 17786) | function clearImmediate(handle) {
  function run (line 17790) | function run(task) {
  function runIfPresent (line 17812) | function runIfPresent(handle) {
  function installNextTickImplementation (line 17833) | function installNextTickImplementation() {
  function canUsePostMessage (line 17839) | function canUsePostMessage() {
  function installPostMessageImplementation (line 17854) | function installPostMessageImplementation() {
  function installMessageChannelImplementation (line 17879) | function installMessageChannelImplementation() {
  function installReadyStateChangeImplementation (line 17891) | function installReadyStateChangeImplementation() {
  function installSetTimeoutImplementation (line 17907) | function installSetTimeoutImplementation() {
  function deprecate (line 17974) | function deprecate (fn, msg) {
  function config (line 18005) | function config (name) {
  function PassThrough (line 18062) | function PassThrough(options) {
  function Zlib (line 18135) | function Zlib(mode) {
  function ZStream (line 18582) | function ZStream() {
  function err (line 18739) | function err(strm, errorCode) {
  function rank (line 18744) | function rank(f) {
  function zero (line 18748) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function flush_pending (line 18757) | function flush_pending(strm) {
  function flush_block_only (line 18779) | function flush_block_only(s, last) {
  function put_byte (line 18786) | function put_byte(s, b) {
  function putShortMSB (line 18796) | function putShortMSB(s, b) {
  function read_buf (line 18811) | function read_buf(strm, buf, start, size) {
  function longest_match (line 18845) | function longest_match(s, cur_match) {
  function fill_window (line 18958) | function fill_window(s) {
  function deflate_stored (line 19114) | function deflate_stored(s, flush) {
  function deflate_fast (line 19212) | function deflate_fast(s, flush) {
  function deflate_slow (line 19340) | function deflate_slow(s, flush) {
  function deflate_rle (line 19502) | function deflate_rle(s, flush) {
  function deflate_huff (line 19597) | function deflate_huff(s, flush) {
  function Config (line 19654) | function Config(good_length, max_lazy, nice_length, max_chain, func) {
  function lm_init (line 19683) | function lm_init(s) {
  function DeflateState (line 19706) | function DeflateState() {
  function deflateResetKeep (line 19895) | function deflateResetKeep(strm) {
  function deflateReset (line 19924) | function deflateReset(strm) {
  function deflateSetHeader (line 19933) | function deflateSetHeader(strm, head) {
  function deflateInit2 (line 19941) | function deflateInit2(strm, level, method, windowBits, memLevel, strateg...
  function deflateInit (line 20019) | function deflateInit(strm, level) {
  function deflate (line 20024) | function deflate(strm, flush) {
  function deflateEnd (line 20358) | function deflateEnd(strm) {
  function deflateSetDictionary (line 20387) | function deflateSetDictionary(strm, dictionary) {
  function zero (line 20538) | function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len]...
  function StaticTreeDesc (line 20661) | function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_...
  function TreeDesc (line 20679) | function TreeDesc(dyn_tree, stat_desc) {
  function d_code (line 20687) | function d_code(dist) {
  function put_short (line 20696) | function put_short(s, w) {
  function send_bits (line 20708) | function send_bits(s, value, length) {
  function send_code (line 20721) | function send_code(s, c, tree) {
  function bi_reverse (line 20731) | function bi_reverse(code, len) {
  function bi_flush (line 20745) | function bi_flush(s) {
  function gen_bitlen (line 20769) | function gen_bitlen(s, desc)
  function gen_codes (line 20866) | function gen_codes(tree, max_code, bl_count)
  function tr_static_init (line 20904) | function tr_static_init() {
  function init_block (line 21008) | function init_block(s) {
  function bi_windup (line 21025) | function bi_windup(s)
  function copy_block (line 21041) | function copy_block(s, buf, len, header)
  function smaller (line 21064) | function smaller(tree, n, m, depth) {
  function pqdownheap (line 21077) | function pqdownheap(s, tree, k)
  function compress_block (line 21110) | function compress_block(s, ltree, dtree)
  function build_tree (line 21170) | function build_tree(s, desc)
  function scan_tree (line 21266) | function scan_tree(s, tree, max_code)
  function send_tree (line 21332) | function send_tree(s, tree, max_code)
  function build_bl_tree (line 21403) | function build_bl_tree(s) {
  function send_all_trees (line 21439) | function send_all_trees(s, lcodes, dcodes, blcodes)
  function detect_data_type (line 21479) | function detect_data_type(s) {
  function _tr_init (line 21517) | function _tr_init(s)
  function _tr_stored_block (line 21540) | function _tr_stored_block(s, buf, stored_len, last)
  function _tr_align (line 21555) | function _tr_align(s) {
  function _tr_flush_block (line 21566) | function _tr_flush_block(s, buf, stored_len, last)
  function _tr_tally (line 21653) | function _tr_tally(s, dist, lc)
  function zswap32 (line 21874) | function zswap32(q) {
  function InflateState (line 21882) | function InflateState() {
  function inflateResetKeep (line 21940) | function inflateResetKeep(strm) {
  function inflateReset (line 21967) | function inflateReset(strm) {
  function inflateReset2 (line 21979) | function inflateReset2(strm, windowBits) {
  function inflateInit2 (line 22013) | function inflateInit2(strm, windowBits) {
  function inflateInit (line 22033) | function inflateInit(strm) {
  function fixedtables (line 22052) | function fixedtables(state) {
  function updatewindow (line 22100) | function updatewindow(strm, src, end, copy) {
  function inflate (line 22142) | function inflate(strm, flush) {
  function inflateEnd (line 23234) | function inflateEnd(strm) {
  function inflateGetHeader (line 23248) | function inflateGetHeader(strm, head) {
  function inflateSetDictionary (line 23262) | function inflateSetDictionary(strm, dictionary) {
  function PDFPage (line 24114) | function PDFPage(document, options) {
  function ctor (line 24584) | function ctor() { this.constructor = child; }
  function PDFGradient (line 24588) | function PDFGradient(doc) {
  function PDFLinearGradient (line 24755) | function PDFLinearGradient(doc, x1, y1, x2, y2) {
  function PDFRadialGradient (line 24785) | function PDFRadialGradient(doc, x1, y1, r1, x2, y2, r2) {
  function SVGPath (line 25142) | function SVGPath() {}
  function _interopDefault (line 25587) | function _interopDefault (ex) { return (ex && (typeof ex === 'object') &...
  function cache (line 25675) | function cache(target, key, descriptor) {
  function getEncoding (line 25919) | function getEncoding(platformID, encodingID) {
  function CFFIndex (line 26353) | function CFFIndex(type) {
  function CFFOperand (line 26553) | function CFFOperand() {
  function CFFDict (line 26677) | function CFFDict() {
  function CFFPointer (line 26923) | function CFFPointer(type) {
  function Ptr (line 26973) | function Ptr(val) {
  function CFFBlendOp (line 26988) | function CFFBlendOp() {
  function LookupList (line 27074) | function LookupList(SubTable) {
  function PredefinedOp (line 27327) | function PredefinedOp(predefinedOps, type) {
  function CFFEncodingVersion (line 27361) | function CFFEncodingVersion() {
  function RangeArray (line 27406) | function RangeArray() {
  function CFFPrivateOp (line 27484) | function CFFPrivateOp() {
  function CFFFont (line 27541) | function CFFFont(stream) {
  function ValueRecord (line 28101) | function ValueRecord() {
  function VariableSizeNumber (line 28423) | function VariableSizeNumber(size) {
  function UnboundedArrayAccessor (line 28737) | function UnboundedArrayAccessor(type, stream, parent) {
  function UnboundedArray (line 28768) | function UnboundedArray(type) {
  function Shadow (line 28786) | function Shadow(type) {
  function StateTable (line 28869) | function StateTable() {
  function StateTable1 (line 28894) | function StateTable1() {
  function Offset (line 29029) | function Offset() {
  function binarySearch (line 29352) | function binarySearch(arr, cmp) {
  function range (line 29371) | function range(index, end) {
  function _applyDecoratedDescriptor$1 (line 29380) | function _applyDecoratedDescriptor$1(target, property, decorators, descr...
  function CmapProcessor (line 29415) | function CmapProcessor(cmapTable) {
  function KernProcessor (line 29788) | function KernProcessor(font) {
  function UnicodeLayoutEngine (line 29908) | function UnicodeLayoutEngine(font) {
  function BBox (line 30172) | function BBox() {
  function fromOpenType (line 30416) | function fromOpenType(tag) {
  function forString (line 30420) | function forString(string) {
  function forCodePoints (line 30446) | function forCodePoints(codePoints) {
  function direction (line 30489) | function direction(script) {
  function GlyphRun (line 30503) | function GlyphRun(glyphs, features, script, language, direction$$) {
  function mapOTToAAT (line 31174) | function mapOTToAAT(features) {
  function mapFeatureStrings (line 31192) | function mapFeatureStrings(f) {
  function mapAATToOT (line 31215) | function mapAATToOT(features) {
  function _applyDecoratedDescriptor$3 (line 31242) | function _applyDecoratedDescriptor$3(target, property, decorators, descr...
  function AATLookupTable (line 31272) | function AATLookupTable(table) {
  function AATStateMachine (line 31440) | function AATStateMachine(stateTable) {
  function _applyDecoratedDescriptor$2 (line 31552) | function _applyDecoratedDescriptor$2(target, property, decorators, descr...
  function AATMorxProcessor (line 31605) | function AATMorxProcessor(font) {
  function swap (line 32036) | function swap(glyphs, rangeA, rangeB) {
  function reorderGlyphs (line 32054) | function reorderGlyphs(glyphs, verb, firstGlyph, lastGlyph) {
  function AATLayoutEngine (line 32127) | function AATLayoutEngine(font) {
  function ShapingPlan (line 32213) | function ShapingPlan(font, script, direction) {
  function DefaultShaper (line 32386) | function DefaultShaper() {
  function ArabicShaper (line 32511) | function ArabicShaper() {
  function getShapingClass (line 32572) | function getShapingClass(codePoint) {
  function GlyphIterator (line 32587) | function GlyphIterator(glyphs, options) {
  function OTProcessor (line 32673) | function OTProcessor(font, table) {
  function GlyphInfo (line 33338) | function GlyphInfo(font, id) {
  function HangulShaper (line 33428) | function HangulShaper() {
  function getType (line 33534) | function getType(code) {
  function getGlyph (line 33579) | function getGlyph(font, code, features) {
  function decompose (line 33583) | function decompose(glyphs, i, font) {
  function compose (line 33618) | function compose(glyphs, i, font) {
  function getLength (line 33691) | function getLength(code) {
  function reorderToneMark (line 33703) | function reorderToneMark(glyphs, i, font) {
  function insertDottedCircle (line 33719) | function insertDottedCircle(glyphs, i, font) {
  function IndicShaper (line 33947) | function IndicShaper() {
  function indicCategory (line 34011) | function indicCategory(glyph) {
  function indicPosition (line 34015) | function indicPosition(glyph) {
  function setupSyllables (line 34028) | function setupSyllables(font, glyphs) {
  function isConsonant (line 34073) | function isConsonant(glyph) {
  function isJoiner (line 34077) | function isJoiner(glyph) {
  function isHalantOrCoeng (line 34081) | function isHalantOrCoeng(glyph) {
  function wouldSubstitute (line 34085) | function wouldSubstitute(glyphs, feature) {
  function consonantPosition (line 34111) | function consonantPosition(font, consonant, virama) {
  function initialReordering (line 34124) | function initialReordering(font, glyphs, plan) {
  function finalReordering (line 34519) | function finalReordering(font, glyphs, plan) {
  function nextSyllable (line 34853) | function nextSyllable(glyphs, start) {
  function UniversalShaper (line 34875) | function UniversalShaper() {
  function useCategory (line 34929) | function useCategory(glyph) {
  function setupSyllables$1 (line 34941) | function setupSyllables$1(font, glyphs) {
  function clearSubstitutionFlags (line 34975) | function clearSubstitutionFlags(font, glyphs) {
  function recordRphf (line 34994) | function recordRphf(font, glyphs) {
  function recordPref (line 35016) | function recordPref(font, glyphs) {
  function reorder (line 35038) | function reorder(font, glyphs) {
  function nextSyllable$1 (line 35095) | function nextSyllable$1(glyphs, start) {
  function isHalant (line 35102) | function isHalant(glyph) {
  function isBase (line 35106) | function isBase(info) {
  function choose (line 35192) | function choose(script) {
  function GSUBProcessor (line 35223) | function GSUBProcessor() {
  function GPOSProcessor (line 35469) | function GPOSProcessor() {
  function OTLayoutEngine (line 35858) | function OTLayoutEngine(font) {
  function LayoutEngine (line 35978) | function LayoutEngine(font) {
  function Path (line 36231) | function Path() {
  function _applyDecoratedDescriptor$4 (line 36554) | function _applyDecoratedDescriptor$4(target, property, decorators, descr...
  function Glyph (line 36592) | function Glyph(id, codePoints, font) {
  function Point (line 36846) | function Point(onCurve, endContour) {
  function TTFGlyph (line 36886) | function TTFGlyph() {
  function CFFGlyph (line 37244) | function CFFGlyph() {
  function checkWidth (line 37304) | function checkWidth() {
  function parseStems (line 37310) | function parseStems() {
  function moveTo (line 37319) | function moveTo(x, y) {
  function SBIXGlyph (line 37909) | function SBIXGlyph() {
  function COLRGlyph (line 37975) | function COLRGlyph() {
  function GlyphVariationProcessor (line 38101) | function GlyphVariationProcessor(font, coords) {
  function Subset (line 38581) | function Subset(font) {
  function Point (line 38630) | function Point() {
  function TTFGlyphEncoder (line 38667) | function TTFGlyphEncoder() {
  function TTFSubset (line 38798) | function TTFSubset(font) {
  function CFFSubset (line 38944) | function CFFSubset(font) {
  function _applyDecoratedDescriptor (line 39153) | function _applyDecoratedDescriptor(target, property, decorators, descrip...
  function TTFFont (line 39192) | function TTFFont(stream) {
  function WOFFFont (line 39869) | function WOFFFont() {
  function WOFF2Glyph (line 39911) | function WOFF2Glyph() {
  function WOFF2Font (line 40010) | function WOFF2Font() {
  function Substream (line 40118) | function Substream(length) {
  function read255UInt16 (line 40160) | function read255UInt16(stream) {
  function withSign (line 40178) | function withSign(flag, baseval) {
  function decodeTriplet (line 40182) | function decodeTriplet(flags, glyphs, nPoints) {
  function TrueTypeCollection (line 40246) | function TrueTypeCollection(stream) {
  function DFont (line 40387) | function DFont(stream) {
  function ctor (line 40563) | function ctor() { this.constructor = child; }
  function EncodeStream (line 40578) | function EncodeStream(bufferSize) {
  function PrependBOMWrapper (line 40723) | function PrependBOMWrapper(encoder, options) {
  function StripBOMWrapper (line 40745) | function StripBOMWrapper(decoder, options) {
  function InternalCodec (line 40830) | function InternalCodec(codecOptions, iconv) {
  function InternalDecoder (line 40860) | function InternalDecoder(options, codec) {
  function InternalEncoder (line 40870) | function InternalEncoder(options, codec) {
  function InternalEncoderBase64 (line 40885) | function InternalEncoderBase64(options, codec) {
  function InternalEncoderCesu8 (line 40906) | function InternalEncoderCesu8(options, codec) {
  function InternalDecoderCesu8 (line 40936) | function InternalDecoderCesu8(options, codec) {
  function Utf16BECodec (line 41009) | function Utf16BECodec() {
  function Utf16BEEncoder (line 41019) | function Utf16BEEncoder() {
  function Utf16BEDecoder (line 41036) | function Utf16BEDecoder() {
  function Utf16Codec (line 41076) | function Utf16Codec(codecOptions, iconv) {
  function Utf16Encoder (line 41086) | function Utf16Encoder(options, codec) {
  function Utf16Decoder (line 41104) | function Utf16Decoder(options, codec) {
  function detectEncoding (line 41146) | function detectEncoding(buf, defaultEncoding) {
  function Utf7Codec (line 41193) | function Utf7Codec(codecOptions, iconv) {
  function Utf7Encoder (line 41206) | function Utf7Encoder(options, codec) {
  function Utf7Decoder (line 41226) | function Utf7Decoder(options, codec) {
  function Utf7IMAPCodec (line 41317) | function Utf7IMAPCodec(codecOptions, iconv) {
  function Utf7IMAPEncoder (line 41328) | function Utf7IMAPEncoder(options, codec) {
  function Utf7IMAPDecoder (line 41402) | function Utf7IMAPDecoder(options, codec) {
  function SBCSCodec (line 41489) | function SBCSCodec(codecOptions, iconv) {
  function SBCSEncoder (line 41520) | function SBCSEncoder(options, codec) {
  function SBCSDecoder (line 41536) | function SBCSDecoder(options, codec) {
  function DBCSCodec (line 42216) | function DBCSCodec(codecOptions, iconv) {
  function DBCSEncoder (line 42465) | function DBCSEncoder(options, codec) {
  function DBCSDecoder (line 42634) | function DBCSDecoder(options, codec) {
  function findIdx (line 42735) | function findIdx(table, val) {
  function IconvLiteEncoderStream (line 42999) | function IconvLiteEncoderStream(conv, options) {
  function IconvLiteDecoderStream (line 43046) | function IconvLiteDecoderStream(conv, options) {
  function ctor (line 43323) | function ctor() { this.constructor = child; }
  function LazyArrayT (line 43336) | function LazyArrayT() {
  function LazyArray (line 43376) | function LazyArray(type, length, stream, ctx) {
  function Bitfield (line 43430) | function Bitfield(type, flags) {
  function BooleanT (line 43486) | function BooleanT(type) {
  function BufferT (line 43524) | function BufferT(length) {
  function Enum (line 43566) | function Enum(type, options) {
  function Optional (line 43608) | function Optional(type, condition) {
  function Reserved (line 43668) | function Reserved(type, count) {
  function StringT (line 43710) | function StringT(length, encoding) {
  function ctor (line 43794) | function ctor() { this.constructor = child; }
  function VersionedStruct (line 43801) | function VersionedStruct(type, versions) {
  function Pointer (line 43939) | function Pointer(offsetType, type, options) {
  function VoidPointer (line 44094) | function VoidPointer(type, value) {
  function _interopRequireDefault (line 44919) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function _interopRequireDefault (line 44950) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function isUndefinedOrNull (line 45107) | function isUndefinedOrNull(value) {
  function isBuffer (line 45111) | function isBuffer (x) {
  function objEquiv (line 45120) | function objEquiv(a, b, opts) {
  function shim (line 45182) | function shim (obj) {
  function supported (line 45200) | function supported(object) {
  function unsupported (line 45205) | function unsupported(object){
  function _interopDefault (line 45654) | function _interopDefault (ex) { return (ex && (typeof ex === 'object') &...
  function StateMachine (line 45673) | function StateMachine(dfa) {
  function _interopRequireDefault (line 45861) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function sliceIterator (line 45864) | function sliceIterator(arr, i) {
  function _interopRequireDefault (line 45945) | function _interopRequireDefault(obj) { return obj && obj.__esModule ? ob...
  function wrap (line 46049) | function wrap(innerFn, outerFn, self, tryLocsList) {
  function tryCatch (line 46073) | function tryCatch(fn, obj, arg) {
  function Generator (line 46094) | function Generator() {}
  function GeneratorFunction (line 46095) | function GeneratorFunction() {}
  function GeneratorFunctionPrototype (line 46096) | function GeneratorFunctionPrototype() {}
  function defineIteratorMethods (line 46124) | function defineIteratorMethods(prototype) {
  function AsyncIterator (line 46163) | function AsyncIterator(generator) {
  function makeInvokeMethod (line 46259) | function makeInvokeMethod(innerFn, self, context) {
  function maybeInvokeDelegate (line 46341) | function maybeInvokeDelegate(delegate, context) {
  function pushTryEntry (line 46438) | function pushTryEntry(locs) {
  function resetTryEntry (line 46453) | function resetTryEntry(entry) {
  function Context (line 46460) | function Context(tryLocsList) {
  function values (line 46496) | function values(iterable) {
  function doneResult (line 46532) | function doneResult() {
  function handle (line 46583) | function handle(loc, caught) {
  function clone (line 46792) | function clone(parent, circular, depth, prototype) {
  function __objToStr (line 46896) | function __objToStr(o) {
  function __isDate (line 46901) | function __isDate(o) {
  function __isArray (line 46906) | function __isArray(o) {
  function __isRegExp (line 46911) | function __isRegExp(o) {
  function __getRegExpFlags (line 46916) | function __getRegExpFlags(re) {
  function BrotliBitReader (line 46973) | function BrotliBitReader(input) {
  function placeHoldersCount (line 47118) | function placeHoldersCount (b64) {
  function byteLength (line 47132) | function byteLength (b64) {
  function toByteArray (line 47137) | function toByteArray (b64) {
  function tripletToBase64 (line 47168) | function tripletToBase64 (num) {
  function encodeChunk (line 47172) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 47182) | function fromByteArray (uint8) {
  function PrefixCodeRange (line 47502) | function PrefixCodeRange(offset, nbits) {
  function Transform (line 47589) | function Transform(prefix, transform, suffix) {
  function ToUpperCase (line 47728) | function ToUpperCase(p, i) {
  function ctor (line 47804) | function ctor() { this.constructor = child; }
  function StandardFont (line 47818) | function StandardFont(document, name1, id) {
  function AFMFont (line 47945) | function AFMFont(contents) {
  function ctor (line 48111) | function ctor() { this.constructor = child; }
  function EmbeddedFont (line 48124) | function EmbeddedFont(document, font, id) {
  function ctor (line 48701) | function ctor() { this.constructor = child; }
  function LineWrapper (line 48711) | function LineWrapper(document, options) {
  function Data (line 49078) | function Data(data) {
  function JPEG (line 49283) | function JPEG(data, label) {
  function PNGImage (line 49364) | function PNGImage(data, label) {
  function PNG (line 49568) | function PNG(data) {
  function ImageMeasure (line 50049) | function ImageMeasure(pdfKitDoc, imageDictionary) {
  function realImageSrc (line 50076) | function realImageSrc(src) {
  function groupDecorations (line 50105) | function groupDecorations(line) {
  function drawDecoration (line 50142) | function drawDecoration(group, x, y, pdfKitDoc) {
  function drawDecorations (line 50227) | function drawDecorations(line, x, y, pdfKitDoc) {
  function drawBackground (line 50234) | function drawBackground(line, x, y, pdfKitDoc) {

FILE: static/js/Echarts/echarts-en.common.js
  function detect (line 118) | function detect(ua) {
  function $override (line 277) | function $override(name, fn) {
  function clone (line 302) | function clone(source) {
  function merge (line 350) | function merge(target, source, overwrite) {
  function mergeAll (line 392) | function mergeAll(targetAndSources, overwrite) {
  function extend (line 405) | function extend(target, source) {
  function defaults (line 420) | function defaults(target, source, overlay) {
  function getContext (line 442) | function getContext() {
  function indexOf (line 455) | function indexOf(array, value) {
  function inherits (line 476) | function inherits(clazz, baseClazz) {
  function mixin (line 495) | function mixin(target, source, overlay) {
  function isArrayLike (line 506) | function isArrayLike(data) {
  function each$1 (line 523) | function each$1(obj, cb, context) {
  function map (line 552) | function map(obj, cb, context) {
  function reduce (line 576) | function reduce(obj, cb, memo, context) {
  function filter (line 599) | function filter(obj, cb, context) {
  function find (line 625) | function find(obj, cb, context) {
  function bind (line 642) | function bind(func, context) {
  function curry (line 654) | function curry(func) {
  function isArray (line 666) | function isArray(value) {
  function isFunction$1 (line 675) | function isFunction$1(value) {
  function isString (line 684) | function isString(value) {
  function isObject$1 (line 693) | function isObject$1(value) {
  function isBuiltInObject (line 705) | function isBuiltInObject(value) {
  function isTypedArray (line 714) | function isTypedArray(value) {
  function isDom (line 723) | function isDom(value) {
  function eqNaN (line 734) | function eqNaN(value) {
  function retrieve (line 744) | function retrieve(values) {
  function retrieve2 (line 752) | function retrieve2(value0, value1) {
  function retrieve3 (line 758) | function retrieve3(value0, value1, value2) {
  function slice (line 773) | function slice() {
  function normalizeCssArray (line 786) | function normalizeCssArray(val) {
  function assert$1 (line 807) | function assert$1(condition, message) {
  function trim (line 818) | function trim(str) {
  function setAsPrimitive (line 834) | function setAsPrimitive(obj) {
  function isPrimitive (line 838) | function isPrimitive(obj) {
  function HashMap (line 846) | function HashMap(obj) {
  function createHashMap (line 889) | function createHashMap(obj) {
  function concatArray (line 893) | function concatArray(a, b) {
  function noop (line 906) | function noop() {}
  function create (line 961) | function create(x, y) {
  function copy (line 980) | function copy(out, v) {
  function clone$1 (line 991) | function clone$1(v) {
  function set (line 1005) | function set(out, a, b) {
  function add (line 1017) | function add(out, v1, v2) {
  function scaleAndAdd (line 1030) | function scaleAndAdd(out, v1, v2, a) {
  function sub (line 1042) | function sub(out, v1, v2) {
  function len (line 1053) | function len(v) {
  function lenSquare (line 1063) | function lenSquare(v) {
  function mul (line 1074) | function mul(out, v1, v2) {
  function div (line 1086) | function div(out, v1, v2) {
  function dot (line 1098) | function dot(v1, v2) {
  function scale (line 1108) | function scale(out, v, s) {
  function normalize (line 1119) | function normalize(out, v) {
  function distance (line 1138) | function distance(v1, v2) {
  function distanceSquare (line 1152) | function distanceSquare(v1, v2) {
  function negate (line 1163) | function negate(out, v) {
  function lerp (line 1176) | function lerp(out, v1, v2, t) {
  function applyTransform (line 1188) | function applyTransform(out, v, m) {
  function min (line 1202) | function min(out, v1, v2) {
  function max (line 1214) | function max(out, v1, v2) {
  function Draggable (line 1251) | function Draggable() {
  function param (line 1329) | function param(target, e) {
  function normalizeQuery (line 1566) | function normalizeQuery(host, query) {
  function on (line 1574) | function on(eventful, event, query, handler, context, isOnce) {
  function getBoundingClientRect (line 1628) | function getBoundingClientRect(el) {
  function clientToLocal (line 1634) | function clientToLocal(el, e, out, calculate) {
  function defaultGetZrXY (line 1675) | function defaultGetZrXY(el, e, out) {
  function normalizeEvent (line 1686) | function normalizeEvent(el, e, calculate) {
  function addEventListener (line 1729) | function addEventListener(el, name, handler) {
  function removeEventListener (line 1759) | function removeEventListener(el, name, handler) {
  function isMiddleOrRightButtonOnMouseUpDown (line 1795) | function isMiddleOrRightButtonOnMouseUpDown(e) {
  function dist$1 (line 1867) | function dist$1(pointPair) {
  function center (line 1874) | function center(pointPair) {
  function makeEventPacket (line 1920) | function makeEventPacket(eveType, targetInfo, event) {
  function stopEvent (line 1942) | function stopEvent(event) {
  function EmptyProxy (line 1946) | function EmptyProxy() {}
  function isHover (line 2265) | function isHover(displayable, x, y) {
  function create$1 (line 2303) | function create$1() {
  function identity (line 2314) | function identity(out) {
  function copy$1 (line 2329) | function copy$1(out, m) {
  function mul$1 (line 2345) | function mul$1(out, m1, m2) {
  function translate (line 2370) | function translate(out, a, v) {
  function rotate (line 2386) | function rotate(out, a, rad) {
  function scale$1 (line 2411) | function scale$1(out, a, v) {
  function invert (line 2428) | function invert(out, a) {
  function clone$2 (line 2456) | function clone$2(a) {
  function isNotAroundZero (line 2484) | function isNotAroundZero(val) {
  function Clip (line 3126) | function Clip(options) {
  function clampCssByte (line 3500) | function clampCssByte(i) {  // Clamp to integer 0 .. 255.
  function clampCssAngle (line 3505) | function clampCssAngle(i) {  // Clamp to integer 0 .. 360.
  function clampCssFloat (line 3510) | function clampCssFloat(f) {  // Clamp to float 0.0 .. 1.0.
  function parseCssInt (line 3514) | function parseCssInt(str) {  // int or percentage.
  function parseCssFloat (line 3521) | function parseCssFloat(str) {  // float or percentage.
  function cssHueToRgb (line 3528) | function cssHueToRgb(m1, m2, h) {
  function lerpNumber (line 3548) | function lerpNumber(a, b, p) {
  function setRgba (line 3552) | function setRgba(out, r, g, b, a) {
  function copyRgba (line 3556) | function copyRgba(out, a) {
  function putToCache (line 3564) | function putToCache(colorStr, rgbaArr) {
  function parse (line 3578) | function parse(colorStr, rgbaArr) {
  function hsla2rgba (line 3694) | function hsla2rgba(hsla, rgba) {
  function rgba2hsla (line 3722) | function rgba2hsla(rgba) {
  function lift (line 3790) | function lift(color, level) {
  function toHex (line 3816) | function toHex(color) {
  function fastLerp (line 3830) | function fastLerp(normalizedValue, colors, out) {
  function lerp$1 (line 3866) | function lerp$1(normalizedValue, colors, fullOutput) {
  function modifyHSL (line 3913) | function modifyHSL(color, h, s, l) {
  function modifyAlpha (line 3932) | function modifyAlpha(color, alpha) {
  function stringify (line 3946) | function stringify(arrColor, type) {
  function defaultGetter (line 3977) | function defaultGetter(target, key) {
  function defaultSetter (line 3981) | function defaultSetter(target, key, value) {
  function interpolateNumber (line 3991) | function interpolateNumber(p0, p1, percent) {
  function interpolateString (line 4001) | function interpolateString(p0, p1, percent) {
  function interpolateArray (line 4012) | function interpolateArray(p0, p1, percent, out, arrDim) {
  function fillArr (line 4033) | function fillArr(arr0, arr1, arrDim) {
  function isArraySame (line 4076) | function isArraySame(arr0, arr1, arrDim) {
  function catmullRomInterpolateArray (line 4116) | function catmullRomInterpolateArray(
  function catmullRomInterpolate (line 4151) | function catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) {
  function cloneValue (line 4159) | function cloneValue(value) {
  function rgba2String (line 4176) | function rgba2String(rgba) {
  function getArrayDim (line 4184) | function getArrayDim(keyframes) {
  function createTrackClip (line 4189) | function createTrackClip(animator, easing, oneTrackDone, keyframes, prop...
  function animateTo (line 4805) | function animateTo(animatable, target, time, delay, easing, callback, fo...
  function animateToShallow (line 4887) | function animateToShallow(animatable, path, source, target, time, delay,...
  function setAttrByPath (line 4930) | function setAttrByPath(el, path, name, value) {
  function BoundingRect (line 5211) | function BoundingRect(x, y, width, height) {
  function minRunLength (line 5708) | function minRunLength(n) {
  function makeAscendingRun (line 5719) | function makeAscendingRun(array, lo, hi, compare) {
  function reverseRun (line 5742) | function reverseRun(array, lo, hi) {
  function binaryInsertionSort (line 5752) | function binaryInsertionSort(array, lo, hi, start, compare) {
  function gallopLeft (line 5798) | function gallopLeft(value, array, start, length, hint, compare) {
  function gallopRight (line 5855) | function gallopRight(value, array, start, length, hint, compare) {
  function TimSort (line 5916) | function TimSort(array, compare) {
  function sort (line 6315) | function sort(array, compare, lo, hi) {
  function shapeCompareFunc (line 6365) | function shapeCompareFunc(a, b) {
  function 
Copy disabled (too large) Download .json
Condensed preview — 344 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (25,760K chars).
[
  {
    "path": ".gitattributes",
    "chars": 62,
    "preview": "*.js linguist-language=Python \n*.css linguist-language=Python "
  },
  {
    "path": ".gitignore",
    "chars": 36,
    "preview": "*/__pycache__/\n*/migrations/\n.idea/\n"
  },
  {
    "path": "LICENSE",
    "chars": 1070,
    "preview": "MIT License\n\nCopyright (c) 2020 Hyhyhyhyhyhyh\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
  },
  {
    "path": "README.md",
    "chars": 1226,
    "preview": "# demo\nhttp://data.sghen.cn\n登录用户名密码:admin/admin\n\n# 项目结构\n```\n项目\n│  gconfig.py           gunicorn配置文件\n│  manage.py        "
  },
  {
    "path": "api/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "api/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "api/api_backend.py",
    "chars": 5736,
    "preview": "from django.http.response import JsonResponse\nfrom django.http.response import HttpResponseBadRequest\nfrom django.views."
  },
  {
    "path": "api/api_blood.py",
    "chars": 2425,
    "preview": "import re\nimport os\nimport sys\nimport pandas as pd\nfrom sqlalchemy import create_engine\nfrom django.http.response import"
  },
  {
    "path": "api/api_check.py",
    "chars": 15825,
    "preview": "from django.http.response import JsonResponse, HttpResponse, HttpResponseBadRequest\nfrom django.views.decorators.http im"
  },
  {
    "path": "api/api_dashboard.py",
    "chars": 14844,
    "preview": "import numpy as np\nfrom django.http.response import JsonResponse\nfrom django.views.decorators.http import require_http_m"
  },
  {
    "path": "api/api_datastandard.py",
    "chars": 8406,
    "preview": "from django.http.response import JsonResponse\nfrom django.views.decorators.http import require_http_methods\n\nimport sys,"
  },
  {
    "path": "api/api_date.py",
    "chars": 1909,
    "preview": "from django.http.response import HttpResponse, JsonResponse\nfrom django.views.decorators.http import require_http_method"
  },
  {
    "path": "api/api_files.py",
    "chars": 739,
    "preview": "import os\n\nfrom django.http import Http404, FileResponse\nfrom django.utils.encoding import escape_uri_path\n\n\ndef downloa"
  },
  {
    "path": "api/api_quality.py",
    "chars": 3690,
    "preview": "from django.http.response import JsonResponse\nfrom django.views.decorators.http import require_http_methods\n\nimport sys\n"
  },
  {
    "path": "api/apps.py",
    "chars": 81,
    "preview": "from django.apps import AppConfig\n\n\nclass ApiConfig(AppConfig):\n    name = 'api'\n"
  },
  {
    "path": "api/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "api/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "api/views.py",
    "chars": 63,
    "preview": "from django.shortcuts import render\n\n# Create your views here.\n"
  },
  {
    "path": "authorize/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "authorize/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "authorize/apps.py",
    "chars": 93,
    "preview": "from django.apps import AppConfig\n\n\nclass AuthorizeConfig(AppConfig):\n    name = 'authorize'\n"
  },
  {
    "path": "authorize/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "authorize/templates/authorize/login.html",
    "chars": 9713,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-cmn-Hans\">\n\n<head>\n    <meta charset=\"UTF-8\">\n    <meta content=\"IE=edge\" http-equiv=\"X-U"
  },
  {
    "path": "authorize/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "authorize/urls.py",
    "chars": 372,
    "preview": "from django.urls import path\n\nfrom . import views\n\napp_name = 'authorize'\nurlpatterns = [\n    path('login', views.login,"
  },
  {
    "path": "authorize/views.py",
    "chars": 2475,
    "preview": "from django.shortcuts import render, redirect\nfrom django.views.decorators.http import require_http_methods\nfrom django."
  },
  {
    "path": "backend/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "backend/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "backend/apps.py",
    "chars": 89,
    "preview": "from django.apps import AppConfig\n\n\nclass BackendConfig(AppConfig):\n    name = 'backend'\n"
  },
  {
    "path": "backend/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "backend/templates/backend/crontab.html",
    "chars": 6131,
    "preview": "{% include \"data/template-ui.html\" %}\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/icons.css\" />\n<link rel=\""
  },
  {
    "path": "backend/templates/backend/database.html",
    "chars": 3653,
    "preview": "{% include \"data/template-ui.html\" %}\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/icons.css\" />\n<style>\n   "
  },
  {
    "path": "backend/templates/backend/database_add.html",
    "chars": 8510,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-cmn-Hans\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"I"
  },
  {
    "path": "backend/templates/backend/database_detail.html",
    "chars": 8708,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-cmn-Hans\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"I"
  },
  {
    "path": "backend/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "backend/views.py",
    "chars": 2659,
    "preview": "import re\nimport pandas as pd\nfrom django.shortcuts import render\nfrom django.http.response import HttpResponseBadReques"
  },
  {
    "path": "blood/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "blood/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "blood/apps.py",
    "chars": 85,
    "preview": "from django.apps import AppConfig\n\n\nclass BloodConfig(AppConfig):\n    name = 'blood'\n"
  },
  {
    "path": "blood/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "blood/templates/blood/analyze.html",
    "chars": 7298,
    "preview": "{% include \"data/template-ui.html\" %}\n<style>\n    a.active, button.active, a:focus, button:focus, a:hover, button:hover "
  },
  {
    "path": "blood/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "blood/views.py",
    "chars": 171,
    "preview": "from django.shortcuts import render\nfrom utils.functions import is_login\n\n\n@is_login\ndef analyze(request):\n    \"\"\"血缘分析\"\""
  },
  {
    "path": "check/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "check/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "check/apps.py",
    "chars": 85,
    "preview": "from django.apps import AppConfig\n\n\nclass CheckConfig(AppConfig):\n    name = 'check'\n"
  },
  {
    "path": "check/autocheck.py",
    "chars": 7440,
    "preview": "import logging\nimport sys\nimport threading\nimport os\n\nsys.path.insert(0, '..')\nfrom mysite import db_config\nfrom utils i"
  },
  {
    "path": "check/crontab_autocheck.py",
    "chars": 1018,
    "preview": "import requests, datetime, math, threading\n\nquarter = str(datetime.datetime.now().year)+\"Q\"+str(math.ceil(datetime.datet"
  },
  {
    "path": "check/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "check/templates/check/blood_analyze.html",
    "chars": 2165,
    "preview": "{% include \"data/template-ui.html\" %}\n<!-- 正文主体 -->\n<div class=\"page-wrapper\">\n    <!-- 标题 -->\n    <div class=\"row page-"
  },
  {
    "path": "check/templates/check/crontab.html",
    "chars": 11285,
    "preview": "{% include \"data/template-ui.html\" %}\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/icons.css\" />\n<link rel=\""
  },
  {
    "path": "check/templates/check/rule_edit.html",
    "chars": 10065,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-cmn-Hans\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"I"
  },
  {
    "path": "check/templates/check/rule_list.html",
    "chars": 6574,
    "preview": "{% include \"data/template-ui.html\" %}\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/datatables/foundation.min"
  },
  {
    "path": "check/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "check/views.py",
    "chars": 3119,
    "preview": "import datetime\nimport math\nimport sys\n\nfrom crontab import CronTab\nfrom django.shortcuts import render\n\nsys.path.insert"
  },
  {
    "path": "data/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "data/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "data/apps.py",
    "chars": 83,
    "preview": "from django.apps import AppConfig\n\n\nclass DataConfig(AppConfig):\n    name = 'data'\n"
  },
  {
    "path": "data/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "data/templates/data/dashboard.html",
    "chars": 12365,
    "preview": "{% include \"data/template-ui.html\" %}\n<style>\n    table {\n        border-collapse: collapse;\n        width: 100%;\n    }\n"
  },
  {
    "path": "data/templates/data/dashboard_subcompany.html",
    "chars": 9861,
    "preview": "{% include \"data/template-ui.html\" %}\n<style>\n    table {\n        border-collapse: collapse;\n        width: 100%;\n    }\n"
  },
  {
    "path": "data/templates/data/report.html",
    "chars": 21119,
    "preview": "{% include \"data/template-ui.html\" %}\n<!-- 设置word文档格式 -->\n<style type=\"text/css\">\n    tbody tr td {\n        font-family:"
  },
  {
    "path": "data/templates/data/result_detail.html",
    "chars": 9906,
    "preview": "{% include \"data/template-ui.html\" %}\n<!-- DataTables CSS -->\n<link rel=\"stylesheet\" type=\"text/css\" href=\"/static/css/d"
  },
  {
    "path": "data/templates/data/template-ui.html",
    "chars": 13327,
    "preview": "<!DOCTYPE html>\n<html lang=\"zh-cmn-Hans\">\n{% load staticfiles %}\n\n<head>\n    <meta charset=\"utf-8\">\n    <meta http-equiv"
  },
  {
    "path": "data/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "data/urls.py",
    "chars": 382,
    "preview": "from django.urls import path\n\nfrom . import views\nfrom . import dashboard_charts\n\napp_name = 'data'\nurlpatterns = [\n    "
  },
  {
    "path": "data/views.py",
    "chars": 1153,
    "preview": "from django.shortcuts import render\n\nfrom utils.functions import is_login\nfrom utils import functions as f\n\n\n@is_login\nd"
  },
  {
    "path": "demand/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "demand/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "demand/apps.py",
    "chars": 87,
    "preview": "from django.apps import AppConfig\n\n\nclass DemandConfig(AppConfig):\n    name = 'demand'\n"
  },
  {
    "path": "demand/insert_excel.sql",
    "chars": 29644,
    "preview": "insert into source_system_demand(id,company,item_name,demand_name,demand_created,quarter,status) values(1,'信托','风险等级','补"
  },
  {
    "path": "demand/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "demand/templates/demand/upload_form.html",
    "chars": 452,
    "preview": "<html>\n<head>\n    <title>数据质量检核平台</title>\n</head>\n<body>\n    <h5>上传源系统改造进度Excel表</h5>\n\n    {% if form.errors %}\n        "
  },
  {
    "path": "demand/tests.py",
    "chars": 257,
    "preview": "from django.test import TestCase\nimport requests\n\nurl = \"http://localhost:8000/api/demand_list\"\nresponse = requests.get("
  },
  {
    "path": "demand/views.py",
    "chars": 2043,
    "preview": "import json\nimport sys\n\nfrom django import forms\nfrom django.http import HttpResponse, HttpResponseBadRequest\nfrom djang"
  },
  {
    "path": "docs/api_views.md",
    "chars": 2436,
    "preview": "# 后端API接口说明\n> 部分echarts获取展示的数据是通过请求后端的api接口获取,而不是由Django模板渲染而来,方便代码复用\n\n---\n\n## download\n- URL:http://100.100.0.177/api/f"
  },
  {
    "path": "docs/authorize_views.md",
    "chars": 486,
    "preview": "# 身份验证接口\n\n## login\n- URL:http://100.100.0.177/authorize/login\n\n- 功能:登录表单,用户输入账号名密码\n- 请求类型:GET\n- 请求参数:无\n- 返回值:无\n\n---\n\n## "
  },
  {
    "path": "docs/check_views.md",
    "chars": 3617,
    "preview": "# 自动检核说明\n\n## rule_list\n- URL:http://100.100.0.177/check/login\n- 功能:检核规则库,`规则列表的内容由ajax调用check/rule_detail获取`\n- 请求类型:GET\n"
  },
  {
    "path": "docs/data_views.md",
    "chars": 1740,
    "preview": "# 数据质量仪表盘接口\n\n## index\n- URL:http://100.100.0.177/data/index\n\n- 功能:重定向到http://100.100.0.177/data/dashboard\n- 请求类型:GET\n- 请"
  },
  {
    "path": "docs/ddl.sql",
    "chars": 5630,
    "preview": "-- DDL\nCREATE DATABASE `data_quality` /*!40100 DEFAULT CHARACTER SET utf8 */ ;\n\n\n-- 程序账号\ncreate user system@'127.0.0.1' "
  },
  {
    "path": "docs/demand_views.md",
    "chars": 1431,
    "preview": "# 身份验证接口\n\n## import_sheet\n- URL:http://100.100.0.177/demand/import_sheet\n- 功能:上传源系统改造情况Excel表,处理成json格式的文本文件,存放在服务器`/dat"
  },
  {
    "path": "docs/demo数据.sql",
    "chars": 37156,
    "preview": "use data_quality;\n\n-- check_result_template demo数据\nINSERT INTO `check_result_template` VALUES (1,'db','db','项目编号',NULL,'"
  },
  {
    "path": "docs/files_views.md",
    "chars": 159,
    "preview": "# 文件接口\n\n## list\n- URL:http://100.100.0.177/file/list\n- 功能:列出服务器`/data/data-quality/static/files`下的所有文件,文件下载调用`api/file/d"
  },
  {
    "path": "docs/requirements.txt",
    "chars": 1059,
    "preview": "astroid==2.3.3\nbackports.csv==1.0.7\ncertifi==2019.9.11\nchardet==3.0.4\ncron-descriptor==1.2.24\ncx-Oracle==7.2.2\nDateTime="
  },
  {
    "path": "docs/部署文档.md",
    "chars": 2574,
    "preview": "# 运行环境\n环境|版本\n-|-\n操作系统|CentOS 7.6\n数据库|MySQL 5.7.24\nOracle客户端|11.2.0.4\n\n# 环境部署\n## 安装依赖包\n```\nyum install -y libaio*\nyum ins"
  },
  {
    "path": "files/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "files/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "files/apps.py",
    "chars": 85,
    "preview": "from django.apps import AppConfig\n\n\nclass FilesConfig(AppConfig):\n    name = 'files'\n"
  },
  {
    "path": "files/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "files/templates/files/file_list.html",
    "chars": 1625,
    "preview": "{% include \"data/template-ui.html\" %}\n\n<div class=\"page-wrapper\">\n\t<!-- 正文 -->\n\t<div class=\"container-fluid animated fad"
  },
  {
    "path": "files/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "files/views.py",
    "chars": 1242,
    "preview": "import os\n\nfrom django.shortcuts import render\n\nfrom utils.functions import is_login\n\n\n@is_login\ndef list(request):\n    "
  },
  {
    "path": "gconfig.py",
    "chars": 866,
    "preview": "# from gevent import monkey\n# monkey.patch_all()\n\nimport multiprocessing, logging\n\ndebug        = True\ntimeout      = 20"
  },
  {
    "path": "manage.py",
    "chars": 626,
    "preview": "#!/usr/bin/env python\n\"\"\"Django's command-line utility for administrative tasks.\"\"\"\nimport os\nimport sys\n\n\ndef main():\n "
  },
  {
    "path": "mysite/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "mysite/db_config.py",
    "chars": 1151,
    "preview": "import MySQLdb\nfrom sqlalchemy import create_engine\n\n\nmysql_host    = '127.0.0.1'\nmysql_port    = 3306\nconn_user     = '"
  },
  {
    "path": "mysite/settings.py",
    "chars": 3334,
    "preview": "\"\"\"\nDjango settings for mysite project.\n\nGenerated by 'django-admin startproject' using Django 2.2.4.\n\nFor more informat"
  },
  {
    "path": "mysite/source_db_config.py",
    "chars": 843,
    "preview": "import MySQLdb\nimport pymssql\nimport cx_Oracle\nimport os\n\n# SQL server数据库\ndef sqlserver_db():\n    conn = pymssql.connect"
  },
  {
    "path": "mysite/urls.py",
    "chars": 7449,
    "preview": "\"\"\"mysite URL Configuration\n\nThe `urlpatterns` list routes URLs to views. For more information please see:\n    https://d"
  },
  {
    "path": "mysite/wsgi.py",
    "chars": 389,
    "preview": "\"\"\"\nWSGI config for mysite project.\n\nIt exposes the WSGI callable as a module-level variable named ``application``.\n\nFor"
  },
  {
    "path": "nginx.conf",
    "chars": 1450,
    "preview": "# 如果使用容器,则使用以下命令启动nginx\n# docker run -d \\\n#     -p 80:80 \\\n#     --volume /data/nginx/nginx.conf:/etc/nginx/nginx.conf \\"
  },
  {
    "path": "standard/__init__.py",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "standard/admin.py",
    "chars": 63,
    "preview": "from django.contrib import admin\n\n# Register your models here.\n"
  },
  {
    "path": "standard/apps.py",
    "chars": 91,
    "preview": "from django.apps import AppConfig\n\n\nclass StandardConfig(AppConfig):\n    name = 'standard'\n"
  },
  {
    "path": "standard/models.py",
    "chars": 57,
    "preview": "from django.db import models\n\n# Create your models here.\n"
  },
  {
    "path": "standard/templates/standard/show.html",
    "chars": 13770,
    "preview": "{% include \"data/template-ui.html\" %}\n<link rel=\"stylesheet\" href='/static/zTree/css/zTreeStyle.css'>\n<style>\n    #std t"
  },
  {
    "path": "standard/templates/standard/update.html",
    "chars": 14159,
    "preview": "{% load staticfiles %}\n<!DOCTYPE html>\n<html lang=\"zh-cmn-Hans\">\n\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA"
  },
  {
    "path": "standard/tests.py",
    "chars": 60,
    "preview": "from django.test import TestCase\n\n# Create your tests here.\n"
  },
  {
    "path": "standard/views.py",
    "chars": 488,
    "preview": "from django.shortcuts import render\n\nfrom utils.functions import is_login\n\n\n@is_login\ndef show(request):\n    return rend"
  },
  {
    "path": "static/CodeMirror/lib/codemirror.css",
    "chars": 8308,
    "preview": "/* BASICS */\n\n.CodeMirror {\n  /* Set height, width, borders, and global font properties here */\n  font-family: monospace"
  },
  {
    "path": "static/CodeMirror/lib/codemirror.js",
    "chars": 357250,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/L"
  },
  {
    "path": "static/CodeMirror/mode/sql.js",
    "chars": 34202,
    "preview": "// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: http://codemirror.net/L"
  },
  {
    "path": "static/CodeMirror/theme/eclipse.css",
    "chars": 1159,
    "preview": ".cm-s-eclipse span.cm-meta { color: #FF1717; }\n.cm-s-eclipse span.cm-keyword { line-height: 1em; font-weight: bold; colo"
  },
  {
    "path": "static/check/css/admin/jquery.dataTables.css",
    "chars": 14628,
    "preview": "/*\n * Table styles\n */\ntable.dataTable {\n  width: 100%;\n  margin: 0 auto;\n  clear: both;\n  border-collapse: collapse;\n  "
  },
  {
    "path": "static/check/css/admin/style.css",
    "chars": 130323,
    "preview": "/* @import url(\"http://fonts.useso.com/css?family=Open+Sans:300,400,600,700&amp;lang=en\");\n@import url(\"http://fonts.goo"
  },
  {
    "path": "static/check/css/login.css",
    "chars": 4158,
    "preview": "@charset \"utf-8\";\n/* login */\nhtml,body{ overflow:hidden;}\nbody{  background: #65cea7 url(\"/images/login/login-bg.jpg\") "
  },
  {
    "path": "static/css/animate.css",
    "chars": 55921,
    "preview": "@charset \"UTF-8\";.animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animatio"
  },
  {
    "path": "static/css/bak/animate.css",
    "chars": 56449,
    "preview": "@charset \"UTF-8\";/*!\n * animate.css -http://daneden.me/animate\n * Version - 3.5.1\n * Licensed under the MIT license - ht"
  },
  {
    "path": "static/css/datatables/datatables-site.css",
    "chars": 70739,
    "preview": "/*\nThis CSS file uses code with the following licenses:\n\n------\nGridism\nA simple, responsive, and handy CSS grid by @cob"
  },
  {
    "path": "static/css/datatables/jquery.dataTables.css",
    "chars": 14629,
    "preview": "/*\n * Table styles\n */\n table.dataTable {\n  width: 100%;\n  margin: 0 auto;\n  clear: both;\n  border-collapse: collapse;\n "
  },
  {
    "path": "static/css/datatables/jquery.dataTables.css.origin",
    "chars": 15799,
    "preview": "/*\n * Table styles\n */\ntable.dataTable {\n  width: 100%;\n  margin: 0 auto;\n  clear: both;\n  border-collapse: separate;\n  "
  },
  {
    "path": "static/css/datatables.css",
    "chars": 16797,
    "preview": "/*\n * Table styles\n */\ntable.dataTable {\n  width: 100%;\n  margin: 0 auto;\n  clear: both;\n  border-collapse: separate;\n  "
  },
  {
    "path": "static/css/fonts.css",
    "chars": 11646,
    "preview": "/* cyrillic-ext */\n@font-face {\n  font-family: 'Roboto';\n  font-style: normal;\n  font-weight: 300;\n  src: local('Roboto "
  },
  {
    "path": "static/css/helper.css",
    "chars": 54282,
    "preview": "/*  font  */\n\n/*  font size */\n\n.f-s-1 {font-size: 1px!important;}\n.f-s-2 {font-size: 2px!important;}\n.f-s-3 {font-size:"
  },
  {
    "path": "static/css/icons.css",
    "chars": 81938,
    "preview": "/* ==========================================================================\nIcon packs\n==============================="
  },
  {
    "path": "static/css/lib/bootstrap/bootstrap3.css",
    "chars": 159509,
    "preview": "/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "static/css/login.css",
    "chars": 3379,
    "preview": ".input-group {\n    padding-top: 10px;\n    padding-bottom: 10px;\n}\n\n/* @font-face {\n    font-family: title-speed;\n    src"
  },
  {
    "path": "static/css/material-dash.css",
    "chars": 330205,
    "preview": ".noUi-target,\n.noUi-target * {\n    -webkit-touch-callout: none;\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n    -"
  },
  {
    "path": "static/css/rule_list.css",
    "chars": 2271,
    "preview": "table {\n    font-size: 13px;\n}\n\n/* 表格紧凑 */\n.table > tbody > tr > td, .table > tbody > tr > th, .table > tfoot > tr > td,"
  },
  {
    "path": "static/css/spinners.css",
    "chars": 18964,
    "preview": "\n\n.preloader{\n  position: relative;\n  margin: 0 auto;\n  width: 100px;\n}\n.preloader:before{\n    content: '';\n    display:"
  },
  {
    "path": "static/css/style.css",
    "chars": 158187,
    "preview": "@import url('https://fonts.googleapis.com/css?family=Open+Sans:300i,400,600,700,800');\n@import url(../icons/font-awesom"
  },
  {
    "path": "static/css/sweetalert.css",
    "chars": 22956,
    "preview": "body.stop-scrolling {\n  height: 100%;\n  overflow: hidden; }\n\n.sweet-overlay {\n  background-color: black;\n  /* IE8 */\n  -"
  },
  {
    "path": "static/icons/linea-icons/linea.css",
    "chars": 49546,
    "preview": "@charset \"UTF-8\";\n.glyphs.character-mapping {\n  margin: 0 0 20px 0;\n  padding: 20px 0 20px 30px;\n  color: rgba(0,0,0,0.5"
  },
  {
    "path": "static/icons/simple-line-icons/css/simple-line-icons.css",
    "chars": 12583,
    "preview": "@font-face {\n  font-family: 'simple-line-icons';\n  src: url('../fonts/Simple-Line-Icons4c82.eot?-i3a2kk');\n  src: url('."
  },
  {
    "path": "static/icons/themify-icons/themify-icons.css",
    "chars": 16431,
    "preview": "@font-face {\n\tfont-family: 'themify';\n\tsrc:url('fonts/themify9f24.eot?-fvbane');\n\tsrc:url('fonts/themifyd41d.eot?#iefix-"
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/css/autoFill.bootstrap.css",
    "chars": 2073,
    "preview": "div.dt-autofill-handle {\n  position: absolute;\n  height: 8px;\n  width: 8px;\n  z-index: 102;\n  box-sizing: border-box;\n  "
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/css/autoFill.bootstrap4.css",
    "chars": 2073,
    "preview": "div.dt-autofill-handle {\n  position: absolute;\n  height: 8px;\n  width: 8px;\n  z-index: 102;\n  box-sizing: border-box;\n  "
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/css/autoFill.dataTables.css",
    "chars": 2206,
    "preview": "div.dt-autofill-handle {\n  position: absolute;\n  height: 8px;\n  width: 8px;\n  z-index: 102;\n  box-sizing: border-box;\n  "
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/css/autoFill.foundation.css",
    "chars": 2000,
    "preview": "div.dt-autofill-handle {\n  position: absolute;\n  height: 8px;\n  width: 8px;\n  z-index: 102;\n  box-sizing: border-box;\n  "
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/css/autoFill.jqueryui.css",
    "chars": 2010,
    "preview": "div.dt-autofill-handle {\n  position: absolute;\n  height: 8px;\n  width: 8px;\n  z-index: 102;\n  box-sizing: border-box;\n  "
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/css/autoFill.semanticui.css",
    "chars": 1948,
    "preview": "div.dt-autofill-handle {\n  position: absolute;\n  height: 8px;\n  width: 8px;\n  z-index: 102;\n  box-sizing: border-box;\n  "
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/js/autoFill.bootstrap.js",
    "chars": 939,
    "preview": "/*! Bootstrap integration for DataTables' AutoFill\n * ©2015 SpryMedia Ltd - datatables.net/license\n */\n\n(function( facto"
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/js/autoFill.bootstrap4.js",
    "chars": 941,
    "preview": "/*! Bootstrap integration for DataTables' AutoFill\n * ©2015 SpryMedia Ltd - datatables.net/license\n */\n\n(function( facto"
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/js/autoFill.foundation.js",
    "chars": 936,
    "preview": "/*! Foundation integration for DataTables' AutoFill\n * ©2015 SpryMedia Ltd - datatables.net/license\n */\n\n(function( fact"
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/js/autoFill.jqueryui.js",
    "chars": 969,
    "preview": "/*! jQuery UI integration for DataTables' AutoFill\n * ©2015 SpryMedia Ltd - datatables.net/license\n */\n\n(function( facto"
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/js/autoFill.semanticui.js",
    "chars": 933,
    "preview": "/*! Bootstrap integration for DataTables' AutoFill\n * ©2015 SpryMedia Ltd - datatables.net/license\n */\n\n(function( facto"
  },
  {
    "path": "static/js/DataTables/AutoFill-2.3.3/js/dataTables.autoFill.js",
    "chars": 30380,
    "preview": "/*! AutoFill 2.3.3\n * ©2008-2018 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     AutoFill\n * @descriptio"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/buttons.bootstrap.css",
    "chars": 3661,
    "preview": "@keyframes dtb-spinner {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes dtb-spinner {\n  100% {\n    -o-trans"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/buttons.bootstrap4.css",
    "chars": 5036,
    "preview": "@keyframes dtb-spinner {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes dtb-spinner {\n  100% {\n    -o-trans"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/buttons.dataTables.css",
    "chars": 11438,
    "preview": "@keyframes dtb-spinner {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes dtb-spinner {\n  100% {\n    -o-trans"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/buttons.foundation.css",
    "chars": 4361,
    "preview": "@keyframes dtb-spinner {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes dtb-spinner {\n  100% {\n    -o-trans"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/buttons.jqueryui.css",
    "chars": 5434,
    "preview": "@keyframes dtb-spinner {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes dtb-spinner {\n  100% {\n    -o-trans"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/buttons.semanticui.css",
    "chars": 3797,
    "preview": "@charset \"UTF-8\";\n@keyframes dtb-spinner {\n  100% {\n    transform: rotate(360deg);\n  }\n}\n@-o-keyframes dtb-spinner {\n  1"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/common.scss",
    "chars": 590,
    "preview": "\ndiv.dt-button-info {\n\tposition: fixed;\n\ttop: 50%;\n\tleft: 50%;\n\twidth: 400px;\n\tmargin-top: -100px;\n\tmargin-left: -200px;"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/css/mixins.scss",
    "chars": 3861,
    "preview": "\n@mixin dtb-two-stop-gradient($fromColor, $toColor) {\n\tbackground-color: $toColor; /* Fallback */\n\tbackground-image: -we"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.bootstrap.js",
    "chars": 1447,
    "preview": "/*! Bootstrap integration for DataTables' Buttons\n * ©2016 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factor"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.bootstrap4.js",
    "chars": 1552,
    "preview": "/*! Bootstrap integration for DataTables' Buttons\n * ©2016 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factor"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.colVis.js",
    "chars": 5610,
    "preview": "/*!\n * Column visibility buttons for Buttons and DataTables.\n * 2016 SpryMedia Ltd - datatables.net/license\n */\n\n(functi"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.flash.js",
    "chars": 46165,
    "preview": "/*!\n * Flash export buttons for Buttons and DataTables.\n * 2015-2017 SpryMedia Ltd - datatables.net/license\n *\n * ZeroCl"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.foundation.js",
    "chars": 1932,
    "preview": "/*! Foundation integration for DataTables' Buttons\n * ©2016 SpryMedia Ltd - datatables.net/license\n */\n\n(function( facto"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.html5.js",
    "chars": 43980,
    "preview": "/*!\n * HTML5 export buttons for Buttons and DataTables.\n * 2016 SpryMedia Ltd - datatables.net/license\n *\n * FileSaver.j"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.jqueryui.js",
    "chars": 1423,
    "preview": "/*! jQuery UI integration for DataTables' Buttons\n * ©2016 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factor"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.print.js",
    "chars": 5066,
    "preview": "/*!\n * Print button for Buttons and DataTables.\n * 2016 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory )"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/buttons.semanticui.js",
    "chars": 1177,
    "preview": "/*! Bootstrap integration for DataTables' Buttons\n * ©2016 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factor"
  },
  {
    "path": "static/js/DataTables/Buttons-1.5.6/js/dataTables.buttons.js",
    "chars": 48432,
    "preview": "/*! Buttons for DataTables 1.5.6\n * ©2016-2019 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory ){\n\tif ( t"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/css/colReorder.bootstrap.css",
    "chars": 213,
    "preview": "table.DTCR_clonedTable.dataTable {\n  position: absolute !important;\n  background-color: rgba(255, 255, 255, 0.7);\n  z-in"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/css/colReorder.bootstrap4.css",
    "chars": 213,
    "preview": "table.DTCR_clonedTable.dataTable {\n  position: absolute !important;\n  background-color: rgba(255, 255, 255, 0.7);\n  z-in"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/css/colReorder.dataTables.css",
    "chars": 213,
    "preview": "table.DTCR_clonedTable.dataTable {\n  position: absolute !important;\n  background-color: rgba(255, 255, 255, 0.7);\n  z-in"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/css/colReorder.foundation.css",
    "chars": 213,
    "preview": "table.DTCR_clonedTable.dataTable {\n  position: absolute !important;\n  background-color: rgba(255, 255, 255, 0.7);\n  z-in"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/css/colReorder.jqueryui.css",
    "chars": 213,
    "preview": "table.DTCR_clonedTable.dataTable {\n  position: absolute !important;\n  background-color: rgba(255, 255, 255, 0.7);\n  z-in"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/css/colReorder.semanticui.css",
    "chars": 210,
    "preview": "table.DTCR_clonedTable.dataTable {\n  position: absolute !important;\n  background-color: rgba(255, 255, 255, 0.7);\n  z-in"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/colReorder.bootstrap.js",
    "chars": 846,
    "preview": "/*! Bootstrap 3 styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory )"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/colReorder.bootstrap4.js",
    "chars": 848,
    "preview": "/*! Bootstrap 4 styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory )"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/colReorder.dataTables.js",
    "chars": 845,
    "preview": "/*! DataTables styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory ){"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/colReorder.foundation.js",
    "chars": 846,
    "preview": "/*! Bootstrap 4 styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory )"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/colReorder.jqueryui.js",
    "chars": 848,
    "preview": "/*! jQuery UI styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory ){\n"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/colReorder.semanicui.js",
    "chars": 845,
    "preview": "/*! Semanic UI styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory ){"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/colReorder.semanticui.js",
    "chars": 845,
    "preview": "/*! Semanic UI styling wrapper for ColReorder\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory ){"
  },
  {
    "path": "static/js/DataTables/ColReorder-1.5.0/js/dataTables.colReorder.js",
    "chars": 37345,
    "preview": "/*! ColReorder 1.5.0\n * ©2010-2018 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     ColReorder\n * @descri"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/css/dataTables.bootstrap.css",
    "chars": 4940,
    "preview": "table.dataTable {\n  clear: both;\n  margin-top: 6px !important;\n  margin-bottom: 6px !important;\n  max-width: none !impor"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/css/dataTables.bootstrap4.css",
    "chars": 5799,
    "preview": "table.dataTable {\n  clear: both;\n  margin-top: 6px !important;\n  margin-bottom: 6px !important;\n  max-width: none !impor"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/css/dataTables.foundation.css",
    "chars": 3015,
    "preview": "table.dataTable {\n  clear: both;\n  margin: 0.5em 0 !important;\n  max-width: none !important;\n  width: 100%;\n}\ntable.data"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/css/dataTables.jqueryui.css",
    "chars": 16504,
    "preview": "/*\n * Table styles\n */\ntable.dataTable {\n  width: 100%;\n  margin: 0 auto;\n  clear: both;\n  border-collapse: separate;\n  "
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/css/dataTables.semanticui.css",
    "chars": 2942,
    "preview": "/*\n * Styling for DataTables with Semantic UI\n */\ntable.dataTable.table {\n  margin: 0;\n}\ntable.dataTable.table thead th,"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/css/jquery.dataTables.css",
    "chars": 15800,
    "preview": "/*\n * Table styles\n */\ntable.dataTable {\n  width: 100%;\n  margin: 0 auto;\n  clear: both;\n  border-collapse: separate;\n  "
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/js/dataTables.bootstrap.js",
    "chars": 4558,
    "preview": "/*! DataTables Bootstrap 3 integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/js/dataTables.bootstrap4.js",
    "chars": 4692,
    "preview": "/*! DataTables Bootstrap 4 integration\n * ©2011-2017 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/js/dataTables.foundation.js",
    "chars": 4372,
    "preview": "/*! DataTables Foundation integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integr"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/js/dataTables.jqueryui.js",
    "chars": 4485,
    "preview": "/*! DataTables jQuery UI integration\n * ©2011-2014 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integra"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/js/dataTables.semanticui.js",
    "chars": 5312,
    "preview": "/*! DataTables Bootstrap 3 integration\n * ©2011-2015 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * DataTables integ"
  },
  {
    "path": "static/js/DataTables/DataTables-1.10.18/js/jquery.dataTables.js",
    "chars": 447527,
    "preview": "/*! DataTables 1.10.18\n * ©2008-2018 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     DataTables\n * @desc"
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/css/fixedColumns.bootstrap.css",
    "chars": 1486,
    "preview": "table.DTFC_Cloned tr {\n  background-color: white;\n  margin-bottom: 0;\n}\n\ndiv.DTFC_LeftHeadWrapper table,\ndiv.DTFC_RightH"
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/css/fixedColumns.bootstrap4.css",
    "chars": 1566,
    "preview": "table.DTFC_Cloned tr {\n  background-color: white;\n  margin-bottom: 0;\n}\n\ndiv.DTFC_LeftHeadWrapper table,\ndiv.DTFC_RightH"
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/css/fixedColumns.dataTables.css",
    "chars": 367,
    "preview": "table.DTFC_Cloned thead,\ntable.DTFC_Cloned tfoot {\n  background-color: white;\n}\n\ndiv.DTFC_Blocker {\n  background-color: "
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/css/fixedColumns.foundation.css",
    "chars": 610,
    "preview": "div.DTFC_LeftHeadWrapper table,\ndiv.DTFC_LeftBodyWrapper table,\ndiv.DTFC_LeftFootWrapper table {\n  border-right-width: 0"
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/css/fixedColumns.jqueryui.css",
    "chars": 266,
    "preview": "div.DTFC_LeftWrapper table.dataTable,\ndiv.DTFC_RightWrapper table.dataTable {\n  z-index: 2;\n}\ndiv.DTFC_LeftWrapper table"
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/css/fixedColumns.semanticui.css",
    "chars": 1472,
    "preview": "div.DTFC_LeftWrapper table.ui.table.dataTable {\n  border-right: none;\n}\n\ndiv.DTFC_RightWrapper table.ui.table.dataTable "
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/js/dataTables.fixedColumns.js",
    "chars": 46066,
    "preview": "/*! FixedColumns 3.2.5\n * ©2010-2018 SpryMedia Ltd - datatables.net/license\n */\n\n/**\n * @summary     FixedColumns\n * @de"
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/js/fixedColumns.bootstrap.js",
    "chars": 854,
    "preview": "/*! Bootstrap 3 styling wrapper for FixedColumns\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory"
  },
  {
    "path": "static/js/DataTables/FixedColumns-3.2.5/js/fixedColumns.bootstrap4.js",
    "chars": 856,
    "preview": "/*! Bootstrap 4 styling wrapper for FixedColumns\n * ©2018 SpryMedia Ltd - datatables.net/license\n */\n\n(function( factory"
  }
]

// ... and 144 more files (download for full content)

About this extraction

This page contains the full source code of the Hyhyhyhyhyhyh/Django-Data-quality-system GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 344 files (23.2 MB), approximately 6.1M tokens, and a symbol index with 9018 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!