Full Code of zhanghe06/flask_project for AI

master 41796f4cd2a4 cached
2856 files
32.0 MB
8.5M tokens
12586 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (34,767K chars total). Download the full file to get everything.
Repository: zhanghe06/flask_project
Branch: master
Commit: 41796f4cd2a4
Files: 2856
Total size: 32.0 MB

Directory structure:
gitextract_dou5xjo6/

├── .gitignore
├── README.md
├── app_api/
│   ├── README.md
│   └── __init__.py
├── app_backend/
│   ├── README.md
│   ├── __init__.py
│   ├── api/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── active_item.py
│   │   ├── admin.py
│   │   ├── admin_role.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── author.py
│   │   ├── blog.py
│   │   ├── complaint.py
│   │   ├── message.py
│   │   ├── order.py
│   │   ├── scheduling.py
│   │   ├── scheduling_item.py
│   │   ├── score.py
│   │   ├── user.py
│   │   ├── user_auth.py
│   │   ├── user_bank.py
│   │   ├── user_config.py
│   │   ├── user_profile.py
│   │   └── wallet.py
│   ├── database.py
│   ├── filters.py
│   ├── forms/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── admin.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── blog.py
│   │   ├── complaint.py
│   │   ├── login.py
│   │   ├── order.py
│   │   ├── pay.py
│   │   ├── scheduling.py
│   │   ├── score.py
│   │   ├── settings.py
│   │   ├── user.py
│   │   └── wallet.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── captcha.py
│   │   ├── cart.py
│   │   ├── container.py
│   │   ├── counter.py
│   │   ├── mongo.py
│   │   ├── qiniu_store.py
│   │   ├── rabbit_mq.py
│   │   ├── redis_session.py
│   │   ├── sendcloud.py
│   │   ├── session.py
│   │   ├── sms_chuanglan.py
│   │   ├── sms_chuanglan_iso.py
│   │   └── token.py
│   ├── login.py
│   ├── models.py
│   ├── pages/
│   │   ├── blank.html
│   │   ├── buttons.html
│   │   ├── flot.html
│   │   ├── forms.html
│   │   ├── grid.html
│   │   ├── icons.html
│   │   ├── index.html
│   │   ├── login.html
│   │   ├── morris.html
│   │   ├── notifications.html
│   │   ├── panels-wells.html
│   │   ├── tables.html
│   │   └── typography.html
│   ├── permissions.py
│   ├── static/
│   │   ├── css/
│   │   │   ├── bootstrap-select.css
│   │   │   ├── bootstrap-theme.css
│   │   │   ├── bootstrap.css
│   │   │   ├── custom.css
│   │   │   ├── lightbox.css
│   │   │   ├── sb-admin-2.css
│   │   │   └── slideout.css
│   │   ├── csv/
│   │   │   └── flare.csv
│   │   ├── js/
│   │   │   ├── bootstrap-select.js
│   │   │   ├── bootstrap.js
│   │   │   ├── custom.js
│   │   │   ├── i18n/
│   │   │   │   ├── defaults-ar_AR.js
│   │   │   │   ├── defaults-bg_BG.js
│   │   │   │   ├── defaults-cro_CRO.js
│   │   │   │   ├── defaults-cs_CZ.js
│   │   │   │   ├── defaults-da_DK.js
│   │   │   │   ├── defaults-de_DE.js
│   │   │   │   ├── defaults-en_US.js
│   │   │   │   ├── defaults-es_CL.js
│   │   │   │   ├── defaults-es_ES.js
│   │   │   │   ├── defaults-eu.js
│   │   │   │   ├── defaults-fa_IR.js
│   │   │   │   ├── defaults-fi_FI.js
│   │   │   │   ├── defaults-fr_FR.js
│   │   │   │   ├── defaults-hu_HU.js
│   │   │   │   ├── defaults-id_ID.js
│   │   │   │   ├── defaults-it_IT.js
│   │   │   │   ├── defaults-ko_KR.js
│   │   │   │   ├── defaults-lt_LT.js
│   │   │   │   ├── defaults-nb_NO.js
│   │   │   │   ├── defaults-nl_NL.js
│   │   │   │   ├── defaults-pl_PL.js
│   │   │   │   ├── defaults-pt_BR.js
│   │   │   │   ├── defaults-pt_PT.js
│   │   │   │   ├── defaults-ro_RO.js
│   │   │   │   ├── defaults-ru_RU.js
│   │   │   │   ├── defaults-sk_SK.js
│   │   │   │   ├── defaults-sl_SI.js
│   │   │   │   ├── defaults-sv_SE.js
│   │   │   │   ├── defaults-tr_TR.js
│   │   │   │   ├── defaults-ua_UA.js
│   │   │   │   ├── defaults-zh_CN.js
│   │   │   │   └── defaults-zh_TW.js
│   │   │   ├── npm.js
│   │   │   └── sb-admin-2.js
│   │   ├── plugin/
│   │   │   ├── Chart.js-2.6.0/
│   │   │   │   ├── .codeclimate.yml
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .eslintignore
│   │   │   │   ├── .eslintrc
│   │   │   │   ├── .github/
│   │   │   │   │   ├── ISSUE_TEMPLATE.md
│   │   │   │   │   └── PULL_REQUEST_TEMPLATE.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── LICENSE.md
│   │   │   │   ├── MAINTAINING.md
│   │   │   │   ├── README.md
│   │   │   │   ├── book.json
│   │   │   │   ├── composer.json
│   │   │   │   ├── dist/
│   │   │   │   │   ├── Chart.bundle.js
│   │   │   │   │   └── Chart.js
│   │   │   │   ├── docs/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── SUMMARY.md
│   │   │   │   │   ├── axes/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── cartesian/
│   │   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   │   ├── category.md
│   │   │   │   │   │   │   ├── linear.md
│   │   │   │   │   │   │   ├── logarithmic.md
│   │   │   │   │   │   │   └── time.md
│   │   │   │   │   │   ├── labelling.md
│   │   │   │   │   │   ├── radial/
│   │   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   │   └── linear.md
│   │   │   │   │   │   └── styling.md
│   │   │   │   │   ├── charts/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── area.md
│   │   │   │   │   │   ├── bar.md
│   │   │   │   │   │   ├── bubble.md
│   │   │   │   │   │   ├── doughnut.md
│   │   │   │   │   │   ├── line.md
│   │   │   │   │   │   ├── mixed.md
│   │   │   │   │   │   ├── polar.md
│   │   │   │   │   │   ├── radar.md
│   │   │   │   │   │   └── scatter.md
│   │   │   │   │   ├── configuration/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── animations.md
│   │   │   │   │   │   ├── elements.md
│   │   │   │   │   │   ├── layout.md
│   │   │   │   │   │   ├── legend.md
│   │   │   │   │   │   ├── title.md
│   │   │   │   │   │   └── tooltip.md
│   │   │   │   │   ├── developers/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── api.md
│   │   │   │   │   │   ├── axes.md
│   │   │   │   │   │   ├── charts.md
│   │   │   │   │   │   ├── contributing.md
│   │   │   │   │   │   ├── plugins.md
│   │   │   │   │   │   └── updates.md
│   │   │   │   │   ├── general/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── colors.md
│   │   │   │   │   │   ├── fonts.md
│   │   │   │   │   │   ├── interactions/
│   │   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   │   ├── events.md
│   │   │   │   │   │   │   └── modes.md
│   │   │   │   │   │   └── responsive.md
│   │   │   │   │   ├── getting-started/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── installation.md
│   │   │   │   │   │   ├── integration.md
│   │   │   │   │   │   └── usage.md
│   │   │   │   │   ├── notes/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── comparison.md
│   │   │   │   │   │   ├── extensions.md
│   │   │   │   │   │   └── license.md
│   │   │   │   │   └── style.css
│   │   │   │   ├── gulpfile.js
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── samples/
│   │   │   │   │   ├── advanced/
│   │   │   │   │   │   ├── data-labelling.html
│   │   │   │   │   │   └── progress-bar.html
│   │   │   │   │   ├── charts/
│   │   │   │   │   │   ├── area/
│   │   │   │   │   │   │   ├── analyser.js
│   │   │   │   │   │   │   ├── line-boundaries.html
│   │   │   │   │   │   │   ├── line-datasets.html
│   │   │   │   │   │   │   ├── line-stacked.html
│   │   │   │   │   │   │   └── radar.html
│   │   │   │   │   │   ├── bar/
│   │   │   │   │   │   │   ├── horizontal.html
│   │   │   │   │   │   │   ├── multi-axis.html
│   │   │   │   │   │   │   ├── stacked-group.html
│   │   │   │   │   │   │   ├── stacked.html
│   │   │   │   │   │   │   └── vertical.html
│   │   │   │   │   │   ├── bubble.html
│   │   │   │   │   │   ├── combo-bar-line.html
│   │   │   │   │   │   ├── doughnut.html
│   │   │   │   │   │   ├── line/
│   │   │   │   │   │   │   ├── basic.html
│   │   │   │   │   │   │   ├── interpolation-modes.html
│   │   │   │   │   │   │   ├── line-styles.html
│   │   │   │   │   │   │   ├── multi-axis.html
│   │   │   │   │   │   │   ├── point-sizes.html
│   │   │   │   │   │   │   ├── point-styles.html
│   │   │   │   │   │   │   ├── skip-points.html
│   │   │   │   │   │   │   └── stepped.html
│   │   │   │   │   │   ├── pie.html
│   │   │   │   │   │   ├── polar-area.html
│   │   │   │   │   │   ├── radar-skip-points.html
│   │   │   │   │   │   ├── radar.html
│   │   │   │   │   │   └── scatter/
│   │   │   │   │   │       ├── basic.html
│   │   │   │   │   │       └── multi-axis.html
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── legend/
│   │   │   │   │   │   ├── point-style.html
│   │   │   │   │   │   └── positioning.html
│   │   │   │   │   ├── samples.js
│   │   │   │   │   ├── scales/
│   │   │   │   │   │   ├── filtering-labels.html
│   │   │   │   │   │   ├── gridlines-display.html
│   │   │   │   │   │   ├── gridlines-style.html
│   │   │   │   │   │   ├── linear/
│   │   │   │   │   │   │   ├── min-max-suggested.html
│   │   │   │   │   │   │   ├── min-max.html
│   │   │   │   │   │   │   └── step-size.html
│   │   │   │   │   │   ├── logarithmic/
│   │   │   │   │   │   │   ├── line.html
│   │   │   │   │   │   │   └── scatter.html
│   │   │   │   │   │   ├── multiline-labels.html
│   │   │   │   │   │   ├── non-numeric-y.html
│   │   │   │   │   │   └── time/
│   │   │   │   │   │       ├── combo.html
│   │   │   │   │   │       ├── line-point-data.html
│   │   │   │   │   │       └── line.html
│   │   │   │   │   ├── style.css
│   │   │   │   │   ├── tooltips/
│   │   │   │   │   │   ├── border.html
│   │   │   │   │   │   ├── callbacks.html
│   │   │   │   │   │   ├── custom-line.html
│   │   │   │   │   │   ├── custom-pie.html
│   │   │   │   │   │   ├── custom-points.html
│   │   │   │   │   │   ├── interactions.html
│   │   │   │   │   │   └── positioning.html
│   │   │   │   │   └── utils.js
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── deploy.sh
│   │   │   │   │   └── release.sh
│   │   │   │   ├── src/
│   │   │   │   │   ├── chart.js
│   │   │   │   │   ├── charts/
│   │   │   │   │   │   ├── Chart.Bar.js
│   │   │   │   │   │   ├── Chart.Bubble.js
│   │   │   │   │   │   ├── Chart.Doughnut.js
│   │   │   │   │   │   ├── Chart.Line.js
│   │   │   │   │   │   ├── Chart.PolarArea.js
│   │   │   │   │   │   ├── Chart.Radar.js
│   │   │   │   │   │   └── Chart.Scatter.js
│   │   │   │   │   ├── controllers/
│   │   │   │   │   │   ├── controller.bar.js
│   │   │   │   │   │   ├── controller.bubble.js
│   │   │   │   │   │   ├── controller.doughnut.js
│   │   │   │   │   │   ├── controller.line.js
│   │   │   │   │   │   ├── controller.polarArea.js
│   │   │   │   │   │   └── controller.radar.js
│   │   │   │   │   ├── core/
│   │   │   │   │   │   ├── core.animation.js
│   │   │   │   │   │   ├── core.canvasHelpers.js
│   │   │   │   │   │   ├── core.controller.js
│   │   │   │   │   │   ├── core.datasetController.js
│   │   │   │   │   │   ├── core.element.js
│   │   │   │   │   │   ├── core.helpers.js
│   │   │   │   │   │   ├── core.interaction.js
│   │   │   │   │   │   ├── core.js
│   │   │   │   │   │   ├── core.layoutService.js
│   │   │   │   │   │   ├── core.plugin.js
│   │   │   │   │   │   ├── core.scale.js
│   │   │   │   │   │   ├── core.scaleService.js
│   │   │   │   │   │   ├── core.ticks.js
│   │   │   │   │   │   └── core.tooltip.js
│   │   │   │   │   ├── elements/
│   │   │   │   │   │   ├── element.arc.js
│   │   │   │   │   │   ├── element.line.js
│   │   │   │   │   │   ├── element.point.js
│   │   │   │   │   │   └── element.rectangle.js
│   │   │   │   │   ├── platforms/
│   │   │   │   │   │   ├── platform.dom.js
│   │   │   │   │   │   └── platform.js
│   │   │   │   │   ├── plugins/
│   │   │   │   │   │   ├── plugin.filler.js
│   │   │   │   │   │   ├── plugin.legend.js
│   │   │   │   │   │   └── plugin.title.js
│   │   │   │   │   └── scales/
│   │   │   │   │       ├── scale.category.js
│   │   │   │   │       ├── scale.linear.js
│   │   │   │   │       ├── scale.linearbase.js
│   │   │   │   │       ├── scale.logarithmic.js
│   │   │   │   │       ├── scale.radialLinear.js
│   │   │   │   │       └── scale.time.js
│   │   │   │   └── test/
│   │   │   │       ├── fixtures/
│   │   │   │       │   └── plugin.filler/
│   │   │   │       │       ├── fill-line-boundary-end-span.json
│   │   │   │       │       ├── fill-line-boundary-end.json
│   │   │   │       │       ├── fill-line-boundary-origin-span.json
│   │   │   │       │       ├── fill-line-boundary-origin-spline-span.json
│   │   │   │       │       ├── fill-line-boundary-origin-spline.json
│   │   │   │       │       ├── fill-line-boundary-origin-stepped-span.json
│   │   │   │       │       ├── fill-line-boundary-origin-stepped.json
│   │   │   │       │       ├── fill-line-boundary-origin.json
│   │   │   │       │       ├── fill-line-boundary-start-span.json
│   │   │   │       │       ├── fill-line-boundary-start.json
│   │   │   │       │       ├── fill-line-dataset-span.json
│   │   │   │       │       ├── fill-line-dataset-spline-span.json
│   │   │   │       │       ├── fill-line-dataset-spline.json
│   │   │   │       │       ├── fill-line-dataset.json
│   │   │   │       │       ├── fill-radar-boundary-origin-spline.json
│   │   │   │       │       └── fill-radar-boundary-origin.json
│   │   │   │       ├── jasmine.context.js
│   │   │   │       ├── jasmine.index.js
│   │   │   │       ├── jasmine.matchers.js
│   │   │   │       ├── jasmine.utils.js
│   │   │   │       └── specs/
│   │   │   │           ├── controller.bar.tests.js
│   │   │   │           ├── controller.bubble.tests.js
│   │   │   │           ├── controller.doughnut.tests.js
│   │   │   │           ├── controller.line.tests.js
│   │   │   │           ├── controller.polarArea.tests.js
│   │   │   │           ├── controller.radar.tests.js
│   │   │   │           ├── core.controller.tests.js
│   │   │   │           ├── core.datasetController.tests.js
│   │   │   │           ├── core.element.tests.js
│   │   │   │           ├── core.helpers.tests.js
│   │   │   │           ├── core.interaction.tests.js
│   │   │   │           ├── core.layoutService.tests.js
│   │   │   │           ├── core.plugin.tests.js
│   │   │   │           ├── core.scaleService.tests.js
│   │   │   │           ├── core.tooltip.tests.js
│   │   │   │           ├── element.arc.tests.js
│   │   │   │           ├── element.line.tests.js
│   │   │   │           ├── element.point.tests.js
│   │   │   │           ├── element.rectangle.tests.js
│   │   │   │           ├── global.defaults.tests.js
│   │   │   │           ├── global.deprecations.tests.js
│   │   │   │           ├── platform.dom.tests.js
│   │   │   │           ├── plugin.filler.tests.js
│   │   │   │           ├── plugin.legend.tests.js
│   │   │   │           ├── plugin.title.tests.js
│   │   │   │           ├── scale.category.tests.js
│   │   │   │           ├── scale.linear.tests.js
│   │   │   │           ├── scale.logarithmic.tests.js
│   │   │   │           ├── scale.radialLinear.tests.js
│   │   │   │           └── scale.time.tests.js
│   │   │   ├── Gallery-2.25.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── LICENSE.txt
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── blueimp-gallery-indicator.css
│   │   │   │   │   ├── blueimp-gallery-video.css
│   │   │   │   │   ├── blueimp-gallery.css
│   │   │   │   │   └── demo/
│   │   │   │   │       └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── blueimp-gallery-fullscreen.js
│   │   │   │   │   ├── blueimp-gallery-indicator.js
│   │   │   │   │   ├── blueimp-gallery-video.js
│   │   │   │   │   ├── blueimp-gallery-vimeo.js
│   │   │   │   │   ├── blueimp-gallery-youtube.js
│   │   │   │   │   ├── blueimp-gallery.js
│   │   │   │   │   ├── blueimp-helper.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── jquery.blueimp-gallery.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.js
│   │   │   │   └── package.json
│   │   │   ├── JavaScript-Canvas-to-Blob-3.7.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── js/
│   │   │   │   │   └── canvas-to-blob.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── load-image.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Load-Image-2.12.2/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo.css
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.Jcrop.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── load-image-exif-map.js
│   │   │   │   │   ├── load-image-exif.js
│   │   │   │   │   ├── load-image-fetch.js
│   │   │   │   │   ├── load-image-meta.js
│   │   │   │   │   ├── load-image-orientation.js
│   │   │   │   │   ├── load-image-scale.js
│   │   │   │   │   ├── load-image.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       ├── jquery.Jcrop.js
│   │   │   │   │       └── jquery.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── canvas-to-blob.js
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── expect.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates-3.8.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── Lightbox/
│   │   │   │   └── lightbox.js
│   │   │   ├── Slideout/
│   │   │   │   └── slideout.js
│   │   │   ├── Swiper-3.3.1/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── component.json
│   │   │   │   ├── demos/
│   │   │   │   │   ├── 01-default.html
│   │   │   │   │   ├── 02-responsive.html
│   │   │   │   │   ├── 03-vertical.html
│   │   │   │   │   ├── 04-space-between.html
│   │   │   │   │   ├── 05-slides-per-view.html
│   │   │   │   │   ├── 06-slides-per-view-auto.html
│   │   │   │   │   ├── 07-centered.html
│   │   │   │   │   ├── 08-centered-auto.html
│   │   │   │   │   ├── 09-freemode.html
│   │   │   │   │   ├── 10-slides-per-column.html
│   │   │   │   │   ├── 11-nested.html
│   │   │   │   │   ├── 12-grab-cursor.html
│   │   │   │   │   ├── 13-scrollbar.html
│   │   │   │   │   ├── 14-nav-arrows.html
│   │   │   │   │   ├── 15-infinite-loop.html
│   │   │   │   │   ├── 16-effect-fade.html
│   │   │   │   │   ├── 17-effect-cube.html
│   │   │   │   │   ├── 18-effect-coverflow.html
│   │   │   │   │   ├── 19-keyboard-control.html
│   │   │   │   │   ├── 20-mousewheel-control.html
│   │   │   │   │   ├── 21-autoplay.html
│   │   │   │   │   ├── 22-dynamic-slides.html
│   │   │   │   │   ├── 23-thumbs-gallery-loop.html
│   │   │   │   │   ├── 23-thumbs-gallery.html
│   │   │   │   │   ├── 24-multiple-swipers.html
│   │   │   │   │   ├── 25-hash-navigation.html
│   │   │   │   │   ├── 26-rtl.html
│   │   │   │   │   ├── 27-jquery.html
│   │   │   │   │   ├── 28-parallax.html
│   │   │   │   │   ├── 29-custom-pagination.html
│   │   │   │   │   ├── 30-lazy-load-images.html
│   │   │   │   │   ├── 31-custom-plugin.html
│   │   │   │   │   ├── 32-scroll-container.html
│   │   │   │   │   ├── 33-responsive-breakpoints.html
│   │   │   │   │   ├── 34-autoheight.html
│   │   │   │   │   ├── 35-effect-flip.html
│   │   │   │   │   ├── 36-pagination-fraction.html
│   │   │   │   │   └── 37-pagination-progress.html
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── swiper.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── swiper.jquery.js
│   │   │   │   │       ├── swiper.jquery.umd.js
│   │   │   │   │       └── swiper.js
│   │   │   │   ├── gulpfile.js
│   │   │   │   ├── package.js
│   │   │   │   ├── package.json
│   │   │   │   ├── playground/
│   │   │   │   │   └── index.html
│   │   │   │   └── src/
│   │   │   │       ├── js/
│   │   │   │       │   ├── a11y.js
│   │   │   │       │   ├── amd.js
│   │   │   │       │   ├── controller.js
│   │   │   │       │   ├── core.js
│   │   │   │       │   ├── dom-plugins.js
│   │   │   │       │   ├── dom.js
│   │   │   │       │   ├── effects.js
│   │   │   │       │   ├── emitter.js
│   │   │   │       │   ├── get-dom-lib.js
│   │   │   │       │   ├── get-jquery.js
│   │   │   │       │   ├── hashnav.js
│   │   │   │       │   ├── init.js
│   │   │   │       │   ├── keyboard.js
│   │   │   │       │   ├── lazy-load.js
│   │   │   │       │   ├── mousewheel.js
│   │   │   │       │   ├── parallax.js
│   │   │   │       │   ├── plugins.js
│   │   │   │       │   ├── scrollbar.js
│   │   │   │       │   ├── swiper-intro-f7.js
│   │   │   │       │   ├── swiper-intro.js
│   │   │   │       │   ├── swiper-outro.js
│   │   │   │       │   ├── swiper-proto.js
│   │   │   │       │   ├── wrap-end-umd.js
│   │   │   │       │   ├── wrap-end.js
│   │   │   │       │   ├── wrap-start-umd.js
│   │   │   │       │   └── wrap-start.js
│   │   │   │       └── less/
│   │   │   │           ├── core.less
│   │   │   │           ├── effects.less
│   │   │   │           ├── mixins.less
│   │   │   │           ├── navigation-f7.less
│   │   │   │           ├── navigation.less
│   │   │   │           ├── preloader-f7.less
│   │   │   │           ├── preloader.less
│   │   │   │           ├── scrollbar.less
│   │   │   │           └── swiper.less
│   │   │   ├── bootstrap-datepicker-1.6.4/
│   │   │   │   ├── css/
│   │   │   │   │   ├── bootstrap-datepicker.css
│   │   │   │   │   ├── bootstrap-datepicker.standalone.css
│   │   │   │   │   ├── bootstrap-datepicker3.css
│   │   │   │   │   └── bootstrap-datepicker3.standalone.css
│   │   │   │   └── js/
│   │   │   │       └── bootstrap-datepicker.js
│   │   │   ├── bootstrap-select-1.12.2/
│   │   │   │   ├── .github/
│   │   │   │   │   └── ISSUE_TEMPLATE.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── Gruntfile.js
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── composer.json
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │       └── i18n/
│   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   ├── docs/
│   │   │   │   │   ├── custom_theme/
│   │   │   │   │   │   ├── base.html
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── base.css
│   │   │   │   │   │   ├── js/
│   │   │   │   │   │   │   └── base.js
│   │   │   │   │   │   ├── nav.html
│   │   │   │   │   │   └── toc.html
│   │   │   │   │   ├── docs/
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── custom.css
│   │   │   │   │   │   ├── dist/
│   │   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   │   │   └── js/
│   │   │   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │   │   │       └── i18n/
│   │   │   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   │   │   ├── examples.md
│   │   │   │   │   │   ├── index.md
│   │   │   │   │   │   ├── methods.md
│   │   │   │   │   │   ├── options.md
│   │   │   │   │   │   └── playground/
│   │   │   │   │   │       ├── index.html
│   │   │   │   │   │       ├── plnkrOpener.js
│   │   │   │   │   │       └── test.html
│   │   │   │   │   └── mkdocs.yml
│   │   │   │   ├── js/
│   │   │   │   │   ├── .jshintrc
│   │   │   │   │   ├── bootstrap-select.js
│   │   │   │   │   └── i18n/
│   │   │   │   │       ├── defaults-ar_AR.js
│   │   │   │   │       ├── defaults-bg_BG.js
│   │   │   │   │       ├── defaults-cro_CRO.js
│   │   │   │   │       ├── defaults-cs_CZ.js
│   │   │   │   │       ├── defaults-da_DK.js
│   │   │   │   │       ├── defaults-de_DE.js
│   │   │   │   │       ├── defaults-en_US.js
│   │   │   │   │       ├── defaults-es_CL.js
│   │   │   │   │       ├── defaults-es_ES.js
│   │   │   │   │       ├── defaults-eu.js
│   │   │   │   │       ├── defaults-fa_IR.js
│   │   │   │   │       ├── defaults-fi_FI.js
│   │   │   │   │       ├── defaults-fr_FR.js
│   │   │   │   │       ├── defaults-hu_HU.js
│   │   │   │   │       ├── defaults-id_ID.js
│   │   │   │   │       ├── defaults-it_IT.js
│   │   │   │   │       ├── defaults-ko_KR.js
│   │   │   │   │       ├── defaults-lt_LT.js
│   │   │   │   │       ├── defaults-nb_NO.js
│   │   │   │   │       ├── defaults-nl_NL.js
│   │   │   │   │       ├── defaults-pl_PL.js
│   │   │   │   │       ├── defaults-pt_BR.js
│   │   │   │   │       ├── defaults-pt_PT.js
│   │   │   │   │       ├── defaults-ro_RO.js
│   │   │   │   │       ├── defaults-ru_RU.js
│   │   │   │   │       ├── defaults-sk_SK.js
│   │   │   │   │       ├── defaults-sl_SI.js
│   │   │   │   │       ├── defaults-sv_SE.js
│   │   │   │   │       ├── defaults-tr_TR.js
│   │   │   │   │       ├── defaults-ua_UA.js
│   │   │   │   │       ├── defaults-zh_CN.js
│   │   │   │   │       └── defaults-zh_TW.js
│   │   │   │   ├── less/
│   │   │   │   │   ├── bootstrap-select.less
│   │   │   │   │   └── variables.less
│   │   │   │   ├── nuget/
│   │   │   │   │   ├── MyGet.ps1
│   │   │   │   │   └── bootstrap-select.nuspec
│   │   │   │   ├── package.json
│   │   │   │   ├── sass/
│   │   │   │   │   ├── bootstrap-select.scss
│   │   │   │   │   └── variables.scss
│   │   │   │   └── test.html
│   │   │   ├── d3/
│   │   │   │   ├── API.md
│   │   │   │   ├── CHANGES.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   └── d3.js
│   │   │   ├── font-awesome/
│   │   │   │   ├── HELP-US-OUT.txt
│   │   │   │   ├── css/
│   │   │   │   │   └── font-awesome.css
│   │   │   │   ├── fonts/
│   │   │   │   │   └── FontAwesome.otf
│   │   │   │   ├── less/
│   │   │   │   │   ├── animated.less
│   │   │   │   │   ├── bordered-pulled.less
│   │   │   │   │   ├── core.less
│   │   │   │   │   ├── extras.less
│   │   │   │   │   ├── fixed-width.less
│   │   │   │   │   ├── font-awesome.less
│   │   │   │   │   ├── icons.less
│   │   │   │   │   ├── larger.less
│   │   │   │   │   ├── list.less
│   │   │   │   │   ├── mixins.less
│   │   │   │   │   ├── path.less
│   │   │   │   │   ├── rotated-flipped.less
│   │   │   │   │   ├── screen-reader.less
│   │   │   │   │   ├── spinning.less
│   │   │   │   │   ├── stacked.less
│   │   │   │   │   └── variables.less
│   │   │   │   └── scss/
│   │   │   │       ├── _animated.scss
│   │   │   │       ├── _bordered-pulled.scss
│   │   │   │       ├── _core.scss
│   │   │   │       ├── _extras.scss
│   │   │   │       ├── _fixed-width.scss
│   │   │   │       ├── _icons.scss
│   │   │   │       ├── _larger.scss
│   │   │   │       ├── _list.scss
│   │   │   │       ├── _mixins.scss
│   │   │   │       ├── _path.scss
│   │   │   │       ├── _rotated-flipped.scss
│   │   │   │       ├── _screen-reader.scss
│   │   │   │       ├── _spinning.scss
│   │   │   │       ├── _stacked.scss
│   │   │   │       ├── _variables.scss
│   │   │   │       └── font-awesome.scss
│   │   │   ├── jQuery-File-Upload-9.18.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .npmignore
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── angularjs.html
│   │   │   │   ├── basic-plus.html
│   │   │   │   ├── basic.html
│   │   │   │   ├── bower-version-update.js
│   │   │   │   ├── bower.json
│   │   │   │   ├── cors/
│   │   │   │   │   ├── postmessage.html
│   │   │   │   │   └── result.html
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo-ie8.css
│   │   │   │   │   ├── demo.css
│   │   │   │   │   ├── jquery.fileupload-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui.css
│   │   │   │   │   ├── jquery.fileupload.css
│   │   │   │   │   └── style.css
│   │   │   │   ├── index.html
│   │   │   │   ├── jquery-ui.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── app.js
│   │   │   │   │   ├── cors/
│   │   │   │   │   │   ├── jquery.postmessage-transport.js
│   │   │   │   │   │   └── jquery.xdr-transport.js
│   │   │   │   │   ├── jquery.fileupload-angular.js
│   │   │   │   │   ├── jquery.fileupload-audio.js
│   │   │   │   │   ├── jquery.fileupload-image.js
│   │   │   │   │   ├── jquery.fileupload-jquery-ui.js
│   │   │   │   │   ├── jquery.fileupload-process.js
│   │   │   │   │   ├── jquery.fileupload-ui.js
│   │   │   │   │   ├── jquery.fileupload-validate.js
│   │   │   │   │   ├── jquery.fileupload-video.js
│   │   │   │   │   ├── jquery.fileupload.js
│   │   │   │   │   ├── jquery.iframe-transport.js
│   │   │   │   │   ├── main.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.ui.widget.js
│   │   │   │   ├── package.json
│   │   │   │   ├── server/
│   │   │   │   │   ├── gae-go/
│   │   │   │   │   │   ├── app/
│   │   │   │   │   │   │   └── main.go
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   ├── gae-python/
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   ├── main.py
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   └── php/
│   │   │   │   │       ├── Dockerfile
│   │   │   │   │       ├── UploadHandler.php
│   │   │   │   │       ├── docker-compose.yml
│   │   │   │   │       ├── files/
│   │   │   │   │       │   ├── .gitignore
│   │   │   │   │       │   └── .htaccess
│   │   │   │   │       └── index.php
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       └── test.js
│   │   │   ├── metisMenu/
│   │   │   │   ├── metisMenu.css
│   │   │   │   └── metisMenu.js
│   │   │   └── moment-2.18.1/
│   │   │       ├── .editorconfig
│   │   │       ├── .gitattributes
│   │   │       ├── .gitignore
│   │   │       ├── .jscs.json
│   │   │       ├── .jshintrc
│   │   │       ├── .npmignore
│   │   │       ├── .spmignore
│   │   │       ├── .travis.yml
│   │   │       ├── CHANGELOG.md
│   │   │       ├── CONTRIBUTING.md
│   │   │       ├── Gruntfile.js
│   │   │       ├── ISSUE_TEMPLATE.md
│   │   │       ├── LICENSE
│   │   │       ├── Moment.js.nuspec
│   │   │       ├── README.md
│   │   │       ├── benchmarks/
│   │   │       │   ├── add.js
│   │   │       │   ├── clone.js
│   │   │       │   ├── endOf.js
│   │   │       │   ├── fromDate.js
│   │   │       │   ├── fromDateUtc.js
│   │   │       │   ├── makeDuration.js
│   │   │       │   ├── query.js
│   │   │       │   ├── startOf.js
│   │   │       │   ├── subtract.js
│   │   │       │   └── zeroFill.js
│   │   │       ├── bower.json
│   │   │       ├── component.json
│   │   │       ├── composer.json
│   │   │       ├── ender.js
│   │   │       ├── locale/
│   │   │       │   ├── af.js
│   │   │       │   ├── ar-dz.js
│   │   │       │   ├── ar-kw.js
│   │   │       │   ├── ar-ly.js
│   │   │       │   ├── ar-ma.js
│   │   │       │   ├── ar-sa.js
│   │   │       │   ├── ar-tn.js
│   │   │       │   ├── ar.js
│   │   │       │   ├── az.js
│   │   │       │   ├── be.js
│   │   │       │   ├── bg.js
│   │   │       │   ├── bn.js
│   │   │       │   ├── bo.js
│   │   │       │   ├── br.js
│   │   │       │   ├── bs.js
│   │   │       │   ├── ca.js
│   │   │       │   ├── cs.js
│   │   │       │   ├── cv.js
│   │   │       │   ├── cy.js
│   │   │       │   ├── da.js
│   │   │       │   ├── de-at.js
│   │   │       │   ├── de-ch.js
│   │   │       │   ├── de.js
│   │   │       │   ├── dv.js
│   │   │       │   ├── el.js
│   │   │       │   ├── en-au.js
│   │   │       │   ├── en-ca.js
│   │   │       │   ├── en-gb.js
│   │   │       │   ├── en-ie.js
│   │   │       │   ├── en-nz.js
│   │   │       │   ├── eo.js
│   │   │       │   ├── es-do.js
│   │   │       │   ├── es.js
│   │   │       │   ├── et.js
│   │   │       │   ├── eu.js
│   │   │       │   ├── fa.js
│   │   │       │   ├── fi.js
│   │   │       │   ├── fo.js
│   │   │       │   ├── fr-ca.js
│   │   │       │   ├── fr-ch.js
│   │   │       │   ├── fr.js
│   │   │       │   ├── fy.js
│   │   │       │   ├── gd.js
│   │   │       │   ├── gl.js
│   │   │       │   ├── gom-latn.js
│   │   │       │   ├── he.js
│   │   │       │   ├── hi.js
│   │   │       │   ├── hr.js
│   │   │       │   ├── hu.js
│   │   │       │   ├── hy-am.js
│   │   │       │   ├── id.js
│   │   │       │   ├── is.js
│   │   │       │   ├── it.js
│   │   │       │   ├── ja.js
│   │   │       │   ├── jv.js
│   │   │       │   ├── ka.js
│   │   │       │   ├── kk.js
│   │   │       │   ├── km.js
│   │   │       │   ├── kn.js
│   │   │       │   ├── ko.js
│   │   │       │   ├── ky.js
│   │   │       │   ├── lb.js
│   │   │       │   ├── lo.js
│   │   │       │   ├── lt.js
│   │   │       │   ├── lv.js
│   │   │       │   ├── me.js
│   │   │       │   ├── mi.js
│   │   │       │   ├── mk.js
│   │   │       │   ├── ml.js
│   │   │       │   ├── mr.js
│   │   │       │   ├── ms-my.js
│   │   │       │   ├── ms.js
│   │   │       │   ├── my.js
│   │   │       │   ├── nb.js
│   │   │       │   ├── ne.js
│   │   │       │   ├── nl-be.js
│   │   │       │   ├── nl.js
│   │   │       │   ├── nn.js
│   │   │       │   ├── pa-in.js
│   │   │       │   ├── pl.js
│   │   │       │   ├── pt-br.js
│   │   │       │   ├── pt.js
│   │   │       │   ├── ro.js
│   │   │       │   ├── ru.js
│   │   │       │   ├── sd.js
│   │   │       │   ├── se.js
│   │   │       │   ├── si.js
│   │   │       │   ├── sk.js
│   │   │       │   ├── sl.js
│   │   │       │   ├── sq.js
│   │   │       │   ├── sr-cyrl.js
│   │   │       │   ├── sr.js
│   │   │       │   ├── ss.js
│   │   │       │   ├── sv.js
│   │   │       │   ├── sw.js
│   │   │       │   ├── ta.js
│   │   │       │   ├── te.js
│   │   │       │   ├── tet.js
│   │   │       │   ├── th.js
│   │   │       │   ├── tl-ph.js
│   │   │       │   ├── tlh.js
│   │   │       │   ├── tr.js
│   │   │       │   ├── tzl.js
│   │   │       │   ├── tzm-latn.js
│   │   │       │   ├── tzm.js
│   │   │       │   ├── uk.js
│   │   │       │   ├── ur.js
│   │   │       │   ├── uz-latn.js
│   │   │       │   ├── uz.js
│   │   │       │   ├── vi.js
│   │   │       │   ├── x-pseudo.js
│   │   │       │   ├── yo.js
│   │   │       │   ├── zh-cn.js
│   │   │       │   ├── zh-hk.js
│   │   │       │   └── zh-tw.js
│   │   │       ├── meteor/
│   │   │       │   ├── README.md
│   │   │       │   ├── export.js
│   │   │       │   ├── moment.js
│   │   │       │   ├── package.js
│   │   │       │   └── test.js
│   │   │       ├── min/
│   │   │       │   ├── locales.js
│   │   │       │   ├── moment-with-locales.js
│   │   │       │   └── tests.js
│   │   │       ├── moment.d.ts
│   │   │       ├── moment.js
│   │   │       ├── package.js
│   │   │       ├── package.json
│   │   │       ├── scripts/
│   │   │       │   ├── locales.js
│   │   │       │   └── npm_prepublish.sh
│   │   │       ├── src/
│   │   │       │   ├── lib/
│   │   │       │   │   ├── create/
│   │   │       │   │   │   ├── check-overflow.js
│   │   │       │   │   │   ├── date-from-array.js
│   │   │       │   │   │   ├── from-anything.js
│   │   │       │   │   │   ├── from-array.js
│   │   │       │   │   │   ├── from-object.js
│   │   │       │   │   │   ├── from-string-and-array.js
│   │   │       │   │   │   ├── from-string-and-format.js
│   │   │       │   │   │   ├── from-string.js
│   │   │       │   │   │   ├── local.js
│   │   │       │   │   │   ├── parsing-flags.js
│   │   │       │   │   │   ├── utc.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── duration/
│   │   │       │   │   │   ├── abs.js
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── as.js
│   │   │       │   │   │   ├── bubble.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── create.js
│   │   │       │   │   │   ├── duration.js
│   │   │       │   │   │   ├── get.js
│   │   │       │   │   │   ├── humanize.js
│   │   │       │   │   │   ├── iso-string.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── format/
│   │   │       │   │   │   └── format.js
│   │   │       │   │   ├── locale/
│   │   │       │   │   │   ├── base-config.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── en.js
│   │   │       │   │   │   ├── formats.js
│   │   │       │   │   │   ├── invalid.js
│   │   │       │   │   │   ├── lists.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── locales.js
│   │   │       │   │   │   ├── ordinal.js
│   │   │       │   │   │   ├── pre-post-format.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── relative.js
│   │   │       │   │   │   └── set.js
│   │   │       │   │   ├── moment/
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── clone.js
│   │   │       │   │   │   ├── compare.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── creation-data.js
│   │   │       │   │   │   ├── diff.js
│   │   │       │   │   │   ├── format.js
│   │   │       │   │   │   ├── from.js
│   │   │       │   │   │   ├── get-set.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── min-max.js
│   │   │       │   │   │   ├── moment.js
│   │   │       │   │   │   ├── now.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── start-end-of.js
│   │   │       │   │   │   ├── to-type.js
│   │   │       │   │   │   ├── to.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── parse/
│   │   │       │   │   │   ├── regex.js
│   │   │       │   │   │   └── token.js
│   │   │       │   │   ├── units/
│   │   │       │   │   │   ├── aliases.js
│   │   │       │   │   │   ├── constants.js
│   │   │       │   │   │   ├── day-of-month.js
│   │   │       │   │   │   ├── day-of-week.js
│   │   │       │   │   │   ├── day-of-year.js
│   │   │       │   │   │   ├── hour.js
│   │   │       │   │   │   ├── millisecond.js
│   │   │       │   │   │   ├── minute.js
│   │   │       │   │   │   ├── month.js
│   │   │       │   │   │   ├── offset.js
│   │   │       │   │   │   ├── priorities.js
│   │   │       │   │   │   ├── quarter.js
│   │   │       │   │   │   ├── second.js
│   │   │       │   │   │   ├── timestamp.js
│   │   │       │   │   │   ├── timezone.js
│   │   │       │   │   │   ├── units.js
│   │   │       │   │   │   ├── week-calendar-utils.js
│   │   │       │   │   │   ├── week-year.js
│   │   │       │   │   │   ├── week.js
│   │   │       │   │   │   └── year.js
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── abs-ceil.js
│   │   │       │   │       ├── abs-floor.js
│   │   │       │   │       ├── abs-round.js
│   │   │       │   │       ├── compare-arrays.js
│   │   │       │   │       ├── defaults.js
│   │   │       │   │       ├── deprecate.js
│   │   │       │   │       ├── extend.js
│   │   │       │   │       ├── has-own-prop.js
│   │   │       │   │       ├── hooks.js
│   │   │       │   │       ├── index-of.js
│   │   │       │   │       ├── is-array.js
│   │   │       │   │       ├── is-date.js
│   │   │       │   │       ├── is-function.js
│   │   │       │   │       ├── is-number.js
│   │   │       │   │       ├── is-object-empty.js
│   │   │       │   │       ├── is-object.js
│   │   │       │   │       ├── is-undefined.js
│   │   │       │   │       ├── keys.js
│   │   │       │   │       ├── map.js
│   │   │       │   │       ├── some.js
│   │   │       │   │       ├── to-int.js
│   │   │       │   │       └── zero-fill.js
│   │   │       │   ├── locale/
│   │   │       │   │   ├── af.js
│   │   │       │   │   ├── ar-dz.js
│   │   │       │   │   ├── ar-kw.js
│   │   │       │   │   ├── ar-ly.js
│   │   │       │   │   ├── ar-ma.js
│   │   │       │   │   ├── ar-sa.js
│   │   │       │   │   ├── ar-tn.js
│   │   │       │   │   ├── ar.js
│   │   │       │   │   ├── az.js
│   │   │       │   │   ├── be.js
│   │   │       │   │   ├── bg.js
│   │   │       │   │   ├── bn.js
│   │   │       │   │   ├── bo.js
│   │   │       │   │   ├── br.js
│   │   │       │   │   ├── bs.js
│   │   │       │   │   ├── ca.js
│   │   │       │   │   ├── cs.js
│   │   │       │   │   ├── cv.js
│   │   │       │   │   ├── cy.js
│   │   │       │   │   ├── da.js
│   │   │       │   │   ├── de-at.js
│   │   │       │   │   ├── de-ch.js
│   │   │       │   │   ├── de.js
│   │   │       │   │   ├── dv.js
│   │   │       │   │   ├── el.js
│   │   │       │   │   ├── en-au.js
│   │   │       │   │   ├── en-ca.js
│   │   │       │   │   ├── en-gb.js
│   │   │       │   │   ├── en-ie.js
│   │   │       │   │   ├── en-nz.js
│   │   │       │   │   ├── eo.js
│   │   │       │   │   ├── es-do.js
│   │   │       │   │   ├── es.js
│   │   │       │   │   ├── et.js
│   │   │       │   │   ├── eu.js
│   │   │       │   │   ├── fa.js
│   │   │       │   │   ├── fi.js
│   │   │       │   │   ├── fo.js
│   │   │       │   │   ├── fr-ca.js
│   │   │       │   │   ├── fr-ch.js
│   │   │       │   │   ├── fr.js
│   │   │       │   │   ├── fy.js
│   │   │       │   │   ├── gd.js
│   │   │       │   │   ├── gl.js
│   │   │       │   │   ├── gom-latn.js
│   │   │       │   │   ├── he.js
│   │   │       │   │   ├── hi.js
│   │   │       │   │   ├── hr.js
│   │   │       │   │   ├── hu.js
│   │   │       │   │   ├── hy-am.js
│   │   │       │   │   ├── id.js
│   │   │       │   │   ├── is.js
│   │   │       │   │   ├── it.js
│   │   │       │   │   ├── ja.js
│   │   │       │   │   ├── jv.js
│   │   │       │   │   ├── ka.js
│   │   │       │   │   ├── kk.js
│   │   │       │   │   ├── km.js
│   │   │       │   │   ├── kn.js
│   │   │       │   │   ├── ko.js
│   │   │       │   │   ├── ky.js
│   │   │       │   │   ├── lb.js
│   │   │       │   │   ├── lo.js
│   │   │       │   │   ├── lt.js
│   │   │       │   │   ├── lv.js
│   │   │       │   │   ├── me.js
│   │   │       │   │   ├── mi.js
│   │   │       │   │   ├── mk.js
│   │   │       │   │   ├── ml.js
│   │   │       │   │   ├── mr.js
│   │   │       │   │   ├── ms-my.js
│   │   │       │   │   ├── ms.js
│   │   │       │   │   ├── my.js
│   │   │       │   │   ├── nb.js
│   │   │       │   │   ├── ne.js
│   │   │       │   │   ├── nl-be.js
│   │   │       │   │   ├── nl.js
│   │   │       │   │   ├── nn.js
│   │   │       │   │   ├── pa-in.js
│   │   │       │   │   ├── pl.js
│   │   │       │   │   ├── pt-br.js
│   │   │       │   │   ├── pt.js
│   │   │       │   │   ├── ro.js
│   │   │       │   │   ├── ru.js
│   │   │       │   │   ├── sd.js
│   │   │       │   │   ├── se.js
│   │   │       │   │   ├── si.js
│   │   │       │   │   ├── sk.js
│   │   │       │   │   ├── sl.js
│   │   │       │   │   ├── sq.js
│   │   │       │   │   ├── sr-cyrl.js
│   │   │       │   │   ├── sr.js
│   │   │       │   │   ├── ss.js
│   │   │       │   │   ├── sv.js
│   │   │       │   │   ├── sw.js
│   │   │       │   │   ├── ta.js
│   │   │       │   │   ├── te.js
│   │   │       │   │   ├── tet.js
│   │   │       │   │   ├── th.js
│   │   │       │   │   ├── tl-ph.js
│   │   │       │   │   ├── tlh.js
│   │   │       │   │   ├── tr.js
│   │   │       │   │   ├── tzl.js
│   │   │       │   │   ├── tzm-latn.js
│   │   │       │   │   ├── tzm.js
│   │   │       │   │   ├── uk.js
│   │   │       │   │   ├── ur.js
│   │   │       │   │   ├── uz-latn.js
│   │   │       │   │   ├── uz.js
│   │   │       │   │   ├── vi.js
│   │   │       │   │   ├── x-pseudo.js
│   │   │       │   │   ├── yo.js
│   │   │       │   │   ├── zh-cn.js
│   │   │       │   │   ├── zh-hk.js
│   │   │       │   │   └── zh-tw.js
│   │   │       │   ├── moment.js
│   │   │       │   └── test/
│   │   │       │       ├── helpers/
│   │   │       │       │   ├── common-locale.js
│   │   │       │       │   ├── deprecation-handler.js
│   │   │       │       │   ├── dst.js
│   │   │       │       │   ├── each.js
│   │   │       │       │   └── object-keys.js
│   │   │       │       ├── locale/
│   │   │       │       │   ├── af.js
│   │   │       │       │   ├── ar-dz.js
│   │   │       │       │   ├── ar-kw.js
│   │   │       │       │   ├── ar-ly.js
│   │   │       │       │   ├── ar-ma.js
│   │   │       │       │   ├── ar-sa.js
│   │   │       │       │   ├── ar-tn.js
│   │   │       │       │   ├── ar.js
│   │   │       │       │   ├── az.js
│   │   │       │       │   ├── be.js
│   │   │       │       │   ├── bg.js
│   │   │       │       │   ├── bn.js
│   │   │       │       │   ├── bo.js
│   │   │       │       │   ├── br.js
│   │   │       │       │   ├── bs.js
│   │   │       │       │   ├── ca.js
│   │   │       │       │   ├── cs.js
│   │   │       │       │   ├── cv.js
│   │   │       │       │   ├── cy.js
│   │   │       │       │   ├── da.js
│   │   │       │       │   ├── de-at.js
│   │   │       │       │   ├── de-ch.js
│   │   │       │       │   ├── de.js
│   │   │       │       │   ├── dv.js
│   │   │       │       │   ├── el.js
│   │   │       │       │   ├── en-au.js
│   │   │       │       │   ├── en-ca.js
│   │   │       │       │   ├── en-gb.js
│   │   │       │       │   ├── en-ie.js
│   │   │       │       │   ├── en-nz.js
│   │   │       │       │   ├── en.js
│   │   │       │       │   ├── eo.js
│   │   │       │       │   ├── es-do.js
│   │   │       │       │   ├── es.js
│   │   │       │       │   ├── et.js
│   │   │       │       │   ├── eu.js
│   │   │       │       │   ├── fa.js
│   │   │       │       │   ├── fi.js
│   │   │       │       │   ├── fo.js
│   │   │       │       │   ├── fr-ca.js
│   │   │       │       │   ├── fr-ch.js
│   │   │       │       │   ├── fr.js
│   │   │       │       │   ├── fy.js
│   │   │       │       │   ├── gd.js
│   │   │       │       │   ├── gl.js
│   │   │       │       │   ├── gom-latn.js
│   │   │       │       │   ├── he.js
│   │   │       │       │   ├── hi.js
│   │   │       │       │   ├── hr.js
│   │   │       │       │   ├── hu.js
│   │   │       │       │   ├── hy-am.js
│   │   │       │       │   ├── id.js
│   │   │       │       │   ├── is.js
│   │   │       │       │   ├── it.js
│   │   │       │       │   ├── ja.js
│   │   │       │       │   ├── jv.js
│   │   │       │       │   ├── ka.js
│   │   │       │       │   ├── kk.js
│   │   │       │       │   ├── km.js
│   │   │       │       │   ├── kn.js
│   │   │       │       │   ├── ko.js
│   │   │       │       │   ├── ky.js
│   │   │       │       │   ├── lb.js
│   │   │       │       │   ├── lo.js
│   │   │       │       │   ├── lt.js
│   │   │       │       │   ├── lv.js
│   │   │       │       │   ├── me.js
│   │   │       │       │   ├── mi.js
│   │   │       │       │   ├── mk.js
│   │   │       │       │   ├── ml.js
│   │   │       │       │   ├── mr.js
│   │   │       │       │   ├── ms-my.js
│   │   │       │       │   ├── ms.js
│   │   │       │       │   ├── my.js
│   │   │       │       │   ├── nb.js
│   │   │       │       │   ├── ne.js
│   │   │       │       │   ├── nl-be.js
│   │   │       │       │   ├── nl.js
│   │   │       │       │   ├── nn.js
│   │   │       │       │   ├── pa-in.js
│   │   │       │       │   ├── pl.js
│   │   │       │       │   ├── pt-br.js
│   │   │       │       │   ├── pt.js
│   │   │       │       │   ├── ro.js
│   │   │       │       │   ├── ru.js
│   │   │       │       │   ├── sd.js
│   │   │       │       │   ├── se.js
│   │   │       │       │   ├── si.js
│   │   │       │       │   ├── sk.js
│   │   │       │       │   ├── sl.js
│   │   │       │       │   ├── sq.js
│   │   │       │       │   ├── sr-cyrl.js
│   │   │       │       │   ├── sr.js
│   │   │       │       │   ├── ss.js
│   │   │       │       │   ├── sv.js
│   │   │       │       │   ├── sw.js
│   │   │       │       │   ├── ta.js
│   │   │       │       │   ├── te.js
│   │   │       │       │   ├── tet.js
│   │   │       │       │   ├── th.js
│   │   │       │       │   ├── tl-ph.js
│   │   │       │       │   ├── tlh.js
│   │   │       │       │   ├── tr.js
│   │   │       │       │   ├── tzl.js
│   │   │       │       │   ├── tzm-latn.js
│   │   │       │       │   ├── tzm.js
│   │   │       │       │   ├── uk.js
│   │   │       │       │   ├── ur.js
│   │   │       │       │   ├── uz-latn.js
│   │   │       │       │   ├── uz.js
│   │   │       │       │   ├── vi.js
│   │   │       │       │   ├── x-pseudo.js
│   │   │       │       │   ├── yo.js
│   │   │       │       │   ├── zh-cn.js
│   │   │       │       │   ├── zh-hk.js
│   │   │       │       │   └── zh-tw.js
│   │   │       │       ├── moment/
│   │   │       │       │   ├── add_subtract.js
│   │   │       │       │   ├── calendar.js
│   │   │       │       │   ├── create.js
│   │   │       │       │   ├── creation-data.js
│   │   │       │       │   ├── days_in_month.js
│   │   │       │       │   ├── days_in_year.js
│   │   │       │       │   ├── deprecate.js
│   │   │       │       │   ├── diff.js
│   │   │       │       │   ├── duration.js
│   │   │       │       │   ├── duration_from_moments.js
│   │   │       │       │   ├── duration_invalid.js
│   │   │       │       │   ├── format.js
│   │   │       │       │   ├── from_to.js
│   │   │       │       │   ├── getters_setters.js
│   │   │       │       │   ├── instanceof.js
│   │   │       │       │   ├── invalid.js
│   │   │       │       │   ├── is_after.js
│   │   │       │       │   ├── is_array.js
│   │   │       │       │   ├── is_before.js
│   │   │       │       │   ├── is_between.js
│   │   │       │       │   ├── is_date.js
│   │   │       │       │   ├── is_moment.js
│   │   │       │       │   ├── is_number.js
│   │   │       │       │   ├── is_same.js
│   │   │       │       │   ├── is_same_or_after.js
│   │   │       │       │   ├── is_same_or_before.js
│   │   │       │       │   ├── is_valid.js
│   │   │       │       │   ├── leapyear.js
│   │   │       │       │   ├── listers.js
│   │   │       │       │   ├── locale.js
│   │   │       │       │   ├── locale_inheritance.js
│   │   │       │       │   ├── locale_update.js
│   │   │       │       │   ├── min_max.js
│   │   │       │       │   ├── mutable.js
│   │   │       │       │   ├── normalize_units.js
│   │   │       │       │   ├── now.js
│   │   │       │       │   ├── parsing_flags.js
│   │   │       │       │   ├── preparse_postformat.js
│   │   │       │       │   ├── quarter.js
│   │   │       │       │   ├── relative_time.js
│   │   │       │       │   ├── start_end_of.js
│   │   │       │       │   ├── string_prototype.js
│   │   │       │       │   ├── to_type.js
│   │   │       │       │   ├── utc.js
│   │   │       │       │   ├── utc_offset.js
│   │   │       │       │   ├── week_year.js
│   │   │       │       │   ├── weekday.js
│   │   │       │       │   ├── weeks.js
│   │   │       │       │   ├── weeks_in_year.js
│   │   │       │       │   ├── zone_switching.js
│   │   │       │       │   └── zones.js
│   │   │       │       └── qunit.js
│   │   │       ├── tasks/
│   │   │       │   ├── bump_version.js
│   │   │       │   ├── check_sauce_creds.js
│   │   │       │   ├── component.js
│   │   │       │   ├── nuget.js
│   │   │       │   ├── qtest.js
│   │   │       │   ├── transpile.js
│   │   │       │   └── update_index.js
│   │   │       ├── templates/
│   │   │       │   ├── default.js
│   │   │       │   ├── locale-header.js
│   │   │       │   └── test-header.js
│   │   │       └── typing-tests/
│   │   │           ├── moment-tests.ts
│   │   │           └── tsconfig.json
│   │   └── robots.txt
│   ├── tasks/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── run_stats.py
│   │   └── run_task.py
│   ├── templates/
│   │   ├── 404.html
│   │   ├── 500.html
│   │   ├── _left.html
│   │   ├── _top.html
│   │   ├── active/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── admin/
│   │   │   ├── add.html
│   │   │   ├── edit.html
│   │   │   ├── list.html
│   │   │   ├── profile.html
│   │   │   └── role.html
│   │   ├── apply_get/
│   │   │   ├── add.html
│   │   │   ├── info.html
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── apply_put/
│   │   │   ├── add.html
│   │   │   ├── info.html
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── auth/
│   │   │   ├── email.html
│   │   │   ├── index.html
│   │   │   └── phone.html
│   │   ├── complaint/
│   │   │   ├── list.html
│   │   │   └── reply.html
│   │   ├── index.html
│   │   ├── index_.html
│   │   ├── layout.html
│   │   ├── login.html
│   │   ├── macros.html
│   │   ├── main.html
│   │   ├── message/
│   │   │   └── list.html
│   │   ├── order/
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── scheduling/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── score/
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── settings/
│   │   │   ├── apply_get.html
│   │   │   ├── apply_put.html
│   │   │   ├── bonus.html
│   │   │   ├── interest.html
│   │   │   ├── order.html
│   │   │   ├── score.html
│   │   │   ├── switch.html
│   │   │   ├── user.html
│   │   │   └── wallet.html
│   │   ├── stats/
│   │   │   ├── apply_get.html
│   │   │   ├── apply_put.html
│   │   │   ├── order.html
│   │   │   └── user.html
│   │   ├── user/
│   │   │   ├── _give_active.html
│   │   │   ├── _team_tree.html
│   │   │   ├── add.html
│   │   │   ├── auth.html
│   │   │   ├── bank.html
│   │   │   ├── config.html
│   │   │   ├── list.html
│   │   │   ├── profile.html
│   │   │   ├── relationship.html
│   │   │   └── stats.html
│   │   └── wallet/
│   │       ├── list.html
│   │       └── stats.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_user_profile.py
│   ├── tools/
│   │   ├── __init__.py
│   │   ├── config_manage.py
│   │   ├── db.py
│   │   ├── db_test.py
│   │   ├── decorators.py
│   │   ├── file.py
│   │   ├── send_sms.py
│   │   ├── session_manage.py
│   │   ├── stat.py
│   │   ├── system.py
│   │   └── url.py
│   ├── vendor/
│   │   ├── bootstrap/
│   │   │   ├── css/
│   │   │   │   └── bootstrap.css
│   │   │   └── js/
│   │   │       └── bootstrap.js
│   │   ├── bootstrap-social/
│   │   │   ├── bootstrap-social.css
│   │   │   ├── bootstrap-social.less
│   │   │   └── bootstrap-social.scss
│   │   ├── datatables/
│   │   │   ├── css/
│   │   │   │   ├── dataTables.bootstrap.css
│   │   │   │   ├── dataTables.bootstrap4.css
│   │   │   │   ├── dataTables.foundation.css
│   │   │   │   ├── dataTables.jqueryui.css
│   │   │   │   ├── dataTables.material.css
│   │   │   │   ├── dataTables.semanticui.css
│   │   │   │   ├── dataTables.uikit.css
│   │   │   │   ├── jquery.dataTables.css
│   │   │   │   └── jquery.dataTables_themeroller.css
│   │   │   ├── images/
│   │   │   │   └── Sorting icons.psd
│   │   │   └── js/
│   │   │       ├── dataTables.bootstrap.js
│   │   │       ├── dataTables.bootstrap4.js
│   │   │       ├── dataTables.foundation.js
│   │   │       ├── dataTables.jqueryui.js
│   │   │       ├── dataTables.material.js
│   │   │       ├── dataTables.semanticui.js
│   │   │       ├── dataTables.uikit.js
│   │   │       ├── jquery.dataTables.js
│   │   │       └── jquery.js
│   │   ├── datatables-plugins/
│   │   │   ├── dataTables.bootstrap.css
│   │   │   ├── dataTables.bootstrap.js
│   │   │   └── index.html
│   │   ├── datatables-responsive/
│   │   │   ├── dataTables.responsive.css
│   │   │   ├── dataTables.responsive.js
│   │   │   └── dataTables.responsive.scss
│   │   ├── flot/
│   │   │   ├── excanvas.js
│   │   │   ├── jquery.colorhelpers.js
│   │   │   ├── jquery.flot.canvas.js
│   │   │   ├── jquery.flot.categories.js
│   │   │   ├── jquery.flot.crosshair.js
│   │   │   ├── jquery.flot.errorbars.js
│   │   │   ├── jquery.flot.fillbetween.js
│   │   │   ├── jquery.flot.image.js
│   │   │   ├── jquery.flot.js
│   │   │   ├── jquery.flot.navigate.js
│   │   │   ├── jquery.flot.pie.js
│   │   │   ├── jquery.flot.resize.js
│   │   │   ├── jquery.flot.selection.js
│   │   │   ├── jquery.flot.stack.js
│   │   │   ├── jquery.flot.symbol.js
│   │   │   ├── jquery.flot.threshold.js
│   │   │   ├── jquery.flot.time.js
│   │   │   └── jquery.js
│   │   ├── flot-tooltip/
│   │   │   ├── jquery.flot.tooltip.js
│   │   │   └── jquery.flot.tooltip.source.js
│   │   ├── font-awesome/
│   │   │   ├── HELP-US-OUT.txt
│   │   │   ├── css/
│   │   │   │   └── font-awesome.css
│   │   │   ├── fonts/
│   │   │   │   └── FontAwesome.otf
│   │   │   ├── less/
│   │   │   │   ├── animated.less
│   │   │   │   ├── bordered-pulled.less
│   │   │   │   ├── core.less
│   │   │   │   ├── extras.less
│   │   │   │   ├── fixed-width.less
│   │   │   │   ├── font-awesome.less
│   │   │   │   ├── icons.less
│   │   │   │   ├── larger.less
│   │   │   │   ├── list.less
│   │   │   │   ├── mixins.less
│   │   │   │   ├── path.less
│   │   │   │   ├── rotated-flipped.less
│   │   │   │   ├── screen-reader.less
│   │   │   │   ├── spinning.less
│   │   │   │   ├── stacked.less
│   │   │   │   └── variables.less
│   │   │   └── scss/
│   │   │       ├── _animated.scss
│   │   │       ├── _bordered-pulled.scss
│   │   │       ├── _core.scss
│   │   │       ├── _extras.scss
│   │   │       ├── _fixed-width.scss
│   │   │       ├── _icons.scss
│   │   │       ├── _larger.scss
│   │   │       ├── _list.scss
│   │   │       ├── _mixins.scss
│   │   │       ├── _path.scss
│   │   │       ├── _rotated-flipped.scss
│   │   │       ├── _screen-reader.scss
│   │   │       ├── _spinning.scss
│   │   │       ├── _stacked.scss
│   │   │       ├── _variables.scss
│   │   │       └── font-awesome.scss
│   │   ├── jquery/
│   │   │   └── jquery.js
│   │   ├── metisMenu/
│   │   │   ├── metisMenu.css
│   │   │   └── metisMenu.js
│   │   ├── morrisjs/
│   │   │   ├── morris.css
│   │   │   └── morris.js
│   │   └── raphael/
│   │       └── raphael.js
│   └── views/
│       ├── __init__.py
│       ├── active.py
│       ├── admin.py
│       ├── apply_get.py
│       ├── apply_put.py
│       ├── complaint.py
│       ├── message.py
│       ├── order.py
│       ├── scheduling.py
│       ├── score.py
│       ├── settings.py
│       ├── stats.py
│       ├── user.py
│       └── wallet.py
├── app_common/
│   ├── README.md
│   ├── __init__.py
│   ├── maps/
│   │   ├── __init__.py
│   │   ├── output.py
│   │   ├── role_admin.py
│   │   ├── status_active.py
│   │   ├── status_apply.py
│   │   ├── status_audit.py
│   │   ├── status_delete.py
│   │   ├── status_flow.py
│   │   ├── status_lock.py
│   │   ├── status_order.py
│   │   ├── status_pay.py
│   │   ├── status_rec.py
│   │   ├── status_reply.py
│   │   ├── type_active.py
│   │   ├── type_apply.py
│   │   ├── type_auth.py
│   │   ├── type_level.py
│   │   ├── type_order.py
│   │   ├── type_pay.py
│   │   ├── type_payment.py
│   │   ├── type_scheduling.py
│   │   ├── type_score.py
│   │   ├── type_withdraw.py
│   │   └── 全球区号.xlsx
│   └── tools/
│       ├── __init__.py
│       ├── date_time.py
│       ├── file.py
│       ├── ip.py
│       └── tree.py
├── app_frontend/
│   ├── README.md
│   ├── __init__.py
│   ├── api/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── active_item.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── author.py
│   │   ├── bit_coin.py
│   │   ├── bit_coin_item.py
│   │   ├── blog.py
│   │   ├── bonus.py
│   │   ├── bonus_item.py
│   │   ├── complaint.py
│   │   ├── credit.py
│   │   ├── message.py
│   │   ├── order.py
│   │   ├── order_bill.py
│   │   ├── scheduling.py
│   │   ├── scheduling_item.py
│   │   ├── score.py
│   │   ├── score_charity.py
│   │   ├── score_charity_item.py
│   │   ├── score_digital.py
│   │   ├── score_digital_item.py
│   │   ├── score_expense.py
│   │   ├── score_expense_item.py
│   │   ├── user.py
│   │   ├── user_auth.py
│   │   ├── user_bank.py
│   │   ├── user_config.py
│   │   ├── user_profile.py
│   │   ├── wallet.py
│   │   └── wallet_item.py
│   ├── celery_worker.py
│   ├── database.py
│   ├── emails.py
│   ├── filters.py
│   ├── forms/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── blog.py
│   │   ├── complaint.py
│   │   ├── login.py
│   │   ├── message.py
│   │   ├── order.py
│   │   ├── pay.py
│   │   ├── reg.py
│   │   ├── scheduling.py
│   │   └── user.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── captcha.py
│   │   ├── cart.py
│   │   ├── container.py
│   │   ├── counter.py
│   │   ├── mongo.py
│   │   ├── qiniu_store.py
│   │   ├── rabbit_mq.py
│   │   ├── redis_session.py
│   │   ├── sendcloud.py
│   │   ├── session.py
│   │   ├── sms_chuanglan.py
│   │   ├── sms_chuanglan_iso.py
│   │   └── token.py
│   ├── log_test.py
│   ├── login.py
│   ├── middlewares.py
│   ├── models.py
│   ├── models_sqlite.py
│   ├── static/
│   │   ├── css/
│   │   │   ├── bootstrap-select.css
│   │   │   ├── bootstrap-theme.css
│   │   │   ├── bootstrap.css
│   │   │   ├── custom.css
│   │   │   ├── lightbox.css
│   │   │   └── slideout.css
│   │   ├── js/
│   │   │   ├── bootstrap-select.js
│   │   │   ├── bootstrap.js
│   │   │   ├── custom.js
│   │   │   ├── i18n/
│   │   │   │   ├── defaults-ar_AR.js
│   │   │   │   ├── defaults-bg_BG.js
│   │   │   │   ├── defaults-cro_CRO.js
│   │   │   │   ├── defaults-cs_CZ.js
│   │   │   │   ├── defaults-da_DK.js
│   │   │   │   ├── defaults-de_DE.js
│   │   │   │   ├── defaults-en_US.js
│   │   │   │   ├── defaults-es_CL.js
│   │   │   │   ├── defaults-es_ES.js
│   │   │   │   ├── defaults-eu.js
│   │   │   │   ├── defaults-fa_IR.js
│   │   │   │   ├── defaults-fi_FI.js
│   │   │   │   ├── defaults-fr_FR.js
│   │   │   │   ├── defaults-hu_HU.js
│   │   │   │   ├── defaults-id_ID.js
│   │   │   │   ├── defaults-it_IT.js
│   │   │   │   ├── defaults-ko_KR.js
│   │   │   │   ├── defaults-lt_LT.js
│   │   │   │   ├── defaults-nb_NO.js
│   │   │   │   ├── defaults-nl_NL.js
│   │   │   │   ├── defaults-pl_PL.js
│   │   │   │   ├── defaults-pt_BR.js
│   │   │   │   ├── defaults-pt_PT.js
│   │   │   │   ├── defaults-ro_RO.js
│   │   │   │   ├── defaults-ru_RU.js
│   │   │   │   ├── defaults-sk_SK.js
│   │   │   │   ├── defaults-sl_SI.js
│   │   │   │   ├── defaults-sv_SE.js
│   │   │   │   ├── defaults-tr_TR.js
│   │   │   │   ├── defaults-ua_UA.js
│   │   │   │   ├── defaults-zh_CN.js
│   │   │   │   └── defaults-zh_TW.js
│   │   │   └── npm.js
│   │   ├── plugin/
│   │   │   ├── Chart/
│   │   │   │   └── Chart.js
│   │   │   ├── Gallery-2.25.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── LICENSE.txt
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── blueimp-gallery-indicator.css
│   │   │   │   │   ├── blueimp-gallery-video.css
│   │   │   │   │   ├── blueimp-gallery.css
│   │   │   │   │   └── demo/
│   │   │   │   │       └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── blueimp-gallery-fullscreen.js
│   │   │   │   │   ├── blueimp-gallery-indicator.js
│   │   │   │   │   ├── blueimp-gallery-video.js
│   │   │   │   │   ├── blueimp-gallery-vimeo.js
│   │   │   │   │   ├── blueimp-gallery-youtube.js
│   │   │   │   │   ├── blueimp-gallery.js
│   │   │   │   │   ├── blueimp-helper.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── jquery.blueimp-gallery.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.js
│   │   │   │   └── package.json
│   │   │   ├── JavaScript-Canvas-to-Blob-3.7.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── js/
│   │   │   │   │   └── canvas-to-blob.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── load-image.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Load-Image-2.12.2/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo.css
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.Jcrop.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── load-image-exif-map.js
│   │   │   │   │   ├── load-image-exif.js
│   │   │   │   │   ├── load-image-fetch.js
│   │   │   │   │   ├── load-image-meta.js
│   │   │   │   │   ├── load-image-orientation.js
│   │   │   │   │   ├── load-image-scale.js
│   │   │   │   │   ├── load-image.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       ├── jquery.Jcrop.js
│   │   │   │   │       └── jquery.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── canvas-to-blob.js
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── expect.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates-3.8.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── Lightbox/
│   │   │   │   └── lightbox.js
│   │   │   ├── Slideout/
│   │   │   │   └── slideout.js
│   │   │   ├── Swiper-3.3.1/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── component.json
│   │   │   │   ├── demos/
│   │   │   │   │   ├── 01-default.html
│   │   │   │   │   ├── 02-responsive.html
│   │   │   │   │   ├── 03-vertical.html
│   │   │   │   │   ├── 04-space-between.html
│   │   │   │   │   ├── 05-slides-per-view.html
│   │   │   │   │   ├── 06-slides-per-view-auto.html
│   │   │   │   │   ├── 07-centered.html
│   │   │   │   │   ├── 08-centered-auto.html
│   │   │   │   │   ├── 09-freemode.html
│   │   │   │   │   ├── 10-slides-per-column.html
│   │   │   │   │   ├── 11-nested.html
│   │   │   │   │   ├── 12-grab-cursor.html
│   │   │   │   │   ├── 13-scrollbar.html
│   │   │   │   │   ├── 14-nav-arrows.html
│   │   │   │   │   ├── 15-infinite-loop.html
│   │   │   │   │   ├── 16-effect-fade.html
│   │   │   │   │   ├── 17-effect-cube.html
│   │   │   │   │   ├── 18-effect-coverflow.html
│   │   │   │   │   ├── 19-keyboard-control.html
│   │   │   │   │   ├── 20-mousewheel-control.html
│   │   │   │   │   ├── 21-autoplay.html
│   │   │   │   │   ├── 22-dynamic-slides.html
│   │   │   │   │   ├── 23-thumbs-gallery-loop.html
│   │   │   │   │   ├── 23-thumbs-gallery.html
│   │   │   │   │   ├── 24-multiple-swipers.html
│   │   │   │   │   ├── 25-hash-navigation.html
│   │   │   │   │   ├── 26-rtl.html
│   │   │   │   │   ├── 27-jquery.html
│   │   │   │   │   ├── 28-parallax.html
│   │   │   │   │   ├── 29-custom-pagination.html
│   │   │   │   │   ├── 30-lazy-load-images.html
│   │   │   │   │   ├── 31-custom-plugin.html
│   │   │   │   │   ├── 32-scroll-container.html
│   │   │   │   │   ├── 33-responsive-breakpoints.html
│   │   │   │   │   ├── 34-autoheight.html
│   │   │   │   │   ├── 35-effect-flip.html
│   │   │   │   │   ├── 36-pagination-fraction.html
│   │   │   │   │   └── 37-pagination-progress.html
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── swiper.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── swiper.jquery.js
│   │   │   │   │       ├── swiper.jquery.umd.js
│   │   │   │   │       └── swiper.js
│   │   │   │   ├── gulpfile.js
│   │   │   │   ├── package.js
│   │   │   │   ├── package.json
│   │   │   │   ├── playground/
│   │   │   │   │   └── index.html
│   │   │   │   └── src/
│   │   │   │       ├── js/
│   │   │   │       │   ├── a11y.js
│   │   │   │       │   ├── amd.js
│   │   │   │       │   ├── controller.js
│   │   │   │       │   ├── core.js
│   │   │   │       │   ├── dom-plugins.js
│   │   │   │       │   ├── dom.js
│   │   │   │       │   ├── effects.js
│   │   │   │       │   ├── emitter.js
│   │   │   │       │   ├── get-dom-lib.js
│   │   │   │       │   ├── get-jquery.js
│   │   │   │       │   ├── hashnav.js
│   │   │   │       │   ├── init.js
│   │   │   │       │   ├── keyboard.js
│   │   │   │       │   ├── lazy-load.js
│   │   │   │       │   ├── mousewheel.js
│   │   │   │       │   ├── parallax.js
│   │   │   │       │   ├── plugins.js
│   │   │   │       │   ├── scrollbar.js
│   │   │   │       │   ├── swiper-intro-f7.js
│   │   │   │       │   ├── swiper-intro.js
│   │   │   │       │   ├── swiper-outro.js
│   │   │   │       │   ├── swiper-proto.js
│   │   │   │       │   ├── wrap-end-umd.js
│   │   │   │       │   ├── wrap-end.js
│   │   │   │       │   ├── wrap-start-umd.js
│   │   │   │       │   └── wrap-start.js
│   │   │   │       └── less/
│   │   │   │           ├── core.less
│   │   │   │           ├── effects.less
│   │   │   │           ├── mixins.less
│   │   │   │           ├── navigation-f7.less
│   │   │   │           ├── navigation.less
│   │   │   │           ├── preloader-f7.less
│   │   │   │           ├── preloader.less
│   │   │   │           ├── scrollbar.less
│   │   │   │           └── swiper.less
│   │   │   ├── bootstrap-select-1.12.2/
│   │   │   │   ├── .github/
│   │   │   │   │   └── ISSUE_TEMPLATE.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── Gruntfile.js
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── composer.json
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │       └── i18n/
│   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   ├── docs/
│   │   │   │   │   ├── custom_theme/
│   │   │   │   │   │   ├── base.html
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── base.css
│   │   │   │   │   │   ├── js/
│   │   │   │   │   │   │   └── base.js
│   │   │   │   │   │   ├── nav.html
│   │   │   │   │   │   └── toc.html
│   │   │   │   │   ├── docs/
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── custom.css
│   │   │   │   │   │   ├── dist/
│   │   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   │   │   └── js/
│   │   │   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │   │   │       └── i18n/
│   │   │   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   │   │   ├── examples.md
│   │   │   │   │   │   ├── index.md
│   │   │   │   │   │   ├── methods.md
│   │   │   │   │   │   ├── options.md
│   │   │   │   │   │   └── playground/
│   │   │   │   │   │       ├── index.html
│   │   │   │   │   │       ├── plnkrOpener.js
│   │   │   │   │   │       └── test.html
│   │   │   │   │   └── mkdocs.yml
│   │   │   │   ├── js/
│   │   │   │   │   ├── .jshintrc
│   │   │   │   │   ├── bootstrap-select.js
│   │   │   │   │   └── i18n/
│   │   │   │   │       ├── defaults-ar_AR.js
│   │   │   │   │       ├── defaults-bg_BG.js
│   │   │   │   │       ├── defaults-cro_CRO.js
│   │   │   │   │       ├── defaults-cs_CZ.js
│   │   │   │   │       ├── defaults-da_DK.js
│   │   │   │   │       ├── defaults-de_DE.js
│   │   │   │   │       ├── defaults-en_US.js
│   │   │   │   │       ├── defaults-es_CL.js
│   │   │   │   │       ├── defaults-es_ES.js
│   │   │   │   │       ├── defaults-eu.js
│   │   │   │   │       ├── defaults-fa_IR.js
│   │   │   │   │       ├── defaults-fi_FI.js
│   │   │   │   │       ├── defaults-fr_FR.js
│   │   │   │   │       ├── defaults-hu_HU.js
│   │   │   │   │       ├── defaults-id_ID.js
│   │   │   │   │       ├── defaults-it_IT.js
│   │   │   │   │       ├── defaults-ko_KR.js
│   │   │   │   │       ├── defaults-lt_LT.js
│   │   │   │   │       ├── defaults-nb_NO.js
│   │   │   │   │       ├── defaults-nl_NL.js
│   │   │   │   │       ├── defaults-pl_PL.js
│   │   │   │   │       ├── defaults-pt_BR.js
│   │   │   │   │       ├── defaults-pt_PT.js
│   │   │   │   │       ├── defaults-ro_RO.js
│   │   │   │   │       ├── defaults-ru_RU.js
│   │   │   │   │       ├── defaults-sk_SK.js
│   │   │   │   │       ├── defaults-sl_SI.js
│   │   │   │   │       ├── defaults-sv_SE.js
│   │   │   │   │       ├── defaults-tr_TR.js
│   │   │   │   │       ├── defaults-ua_UA.js
│   │   │   │   │       ├── defaults-zh_CN.js
│   │   │   │   │       └── defaults-zh_TW.js
│   │   │   │   ├── less/
│   │   │   │   │   ├── bootstrap-select.less
│   │   │   │   │   └── variables.less
│   │   │   │   ├── nuget/
│   │   │   │   │   ├── MyGet.ps1
│   │   │   │   │   └── bootstrap-select.nuspec
│   │   │   │   ├── package.json
│   │   │   │   ├── sass/
│   │   │   │   │   ├── bootstrap-select.scss
│   │   │   │   │   └── variables.scss
│   │   │   │   └── test.html
│   │   │   ├── clipboard.js-1.6.1/
│   │   │   │   ├── .babelrc
│   │   │   │   ├── .banner
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .github/
│   │   │   │   │   └── issue_template.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── bower.json
│   │   │   │   ├── contributing.md
│   │   │   │   ├── demo/
│   │   │   │   │   ├── constructor-node.html
│   │   │   │   │   ├── constructor-nodelist.html
│   │   │   │   │   ├── constructor-selector.html
│   │   │   │   │   ├── function-target.html
│   │   │   │   │   ├── function-text.html
│   │   │   │   │   ├── target-div.html
│   │   │   │   │   ├── target-input.html
│   │   │   │   │   └── target-textarea.html
│   │   │   │   ├── dist/
│   │   │   │   │   └── clipboard.js
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.js
│   │   │   │   ├── package.json
│   │   │   │   ├── readme.md
│   │   │   │   ├── src/
│   │   │   │   │   ├── clipboard-action.js
│   │   │   │   │   └── clipboard.js
│   │   │   │   └── test/
│   │   │   │       ├── clipboard-action.js
│   │   │   │       └── clipboard.js
│   │   │   ├── jQuery-File-Upload-9.18.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .npmignore
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── angularjs.html
│   │   │   │   ├── basic-plus.html
│   │   │   │   ├── basic.html
│   │   │   │   ├── bower-version-update.js
│   │   │   │   ├── bower.json
│   │   │   │   ├── cors/
│   │   │   │   │   ├── postmessage.html
│   │   │   │   │   └── result.html
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo-ie8.css
│   │   │   │   │   ├── demo.css
│   │   │   │   │   ├── jquery.fileupload-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui.css
│   │   │   │   │   ├── jquery.fileupload.css
│   │   │   │   │   └── style.css
│   │   │   │   ├── index.html
│   │   │   │   ├── jquery-ui.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── app.js
│   │   │   │   │   ├── cors/
│   │   │   │   │   │   ├── jquery.postmessage-transport.js
│   │   │   │   │   │   └── jquery.xdr-transport.js
│   │   │   │   │   ├── jquery.fileupload-angular.js
│   │   │   │   │   ├── jquery.fileupload-audio.js
│   │   │   │   │   ├── jquery.fileupload-image.js
│   │   │   │   │   ├── jquery.fileupload-jquery-ui.js
│   │   │   │   │   ├── jquery.fileupload-process.js
│   │   │   │   │   ├── jquery.fileupload-ui.js
│   │   │   │   │   ├── jquery.fileupload-validate.js
│   │   │   │   │   ├── jquery.fileupload-video.js
│   │   │   │   │   ├── jquery.fileupload.js
│   │   │   │   │   ├── jquery.iframe-transport.js
│   │   │   │   │   ├── main.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.ui.widget.js
│   │   │   │   ├── package.json
│   │   │   │   ├── server/
│   │   │   │   │   ├── gae-go/
│   │   │   │   │   │   ├── app/
│   │   │   │   │   │   │   └── main.go
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   ├── gae-python/
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   ├── main.py
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   └── php/
│   │   │   │   │       ├── Dockerfile
│   │   │   │   │       ├── UploadHandler.php
│   │   │   │   │       ├── docker-compose.yml
│   │   │   │   │       ├── files/
│   │   │   │   │       │   ├── .gitignore
│   │   │   │   │       │   └── .htaccess
│   │   │   │   │       └── index.php
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       └── test.js
│   │   │   └── moment-2.18.1/
│   │   │       ├── .editorconfig
│   │   │       ├── .gitattributes
│   │   │       ├── .gitignore
│   │   │       ├── .jscs.json
│   │   │       ├── .jshintrc
│   │   │       ├── .npmignore
│   │   │       ├── .spmignore
│   │   │       ├── .travis.yml
│   │   │       ├── CHANGELOG.md
│   │   │       ├── CONTRIBUTING.md
│   │   │       ├── Gruntfile.js
│   │   │       ├── ISSUE_TEMPLATE.md
│   │   │       ├── LICENSE
│   │   │       ├── Moment.js.nuspec
│   │   │       ├── README.md
│   │   │       ├── benchmarks/
│   │   │       │   ├── add.js
│   │   │       │   ├── clone.js
│   │   │       │   ├── endOf.js
│   │   │       │   ├── fromDate.js
│   │   │       │   ├── fromDateUtc.js
│   │   │       │   ├── makeDuration.js
│   │   │       │   ├── query.js
│   │   │       │   ├── startOf.js
│   │   │       │   ├── subtract.js
│   │   │       │   └── zeroFill.js
│   │   │       ├── bower.json
│   │   │       ├── component.json
│   │   │       ├── composer.json
│   │   │       ├── ender.js
│   │   │       ├── locale/
│   │   │       │   ├── af.js
│   │   │       │   ├── ar-dz.js
│   │   │       │   ├── ar-kw.js
│   │   │       │   ├── ar-ly.js
│   │   │       │   ├── ar-ma.js
│   │   │       │   ├── ar-sa.js
│   │   │       │   ├── ar-tn.js
│   │   │       │   ├── ar.js
│   │   │       │   ├── az.js
│   │   │       │   ├── be.js
│   │   │       │   ├── bg.js
│   │   │       │   ├── bn.js
│   │   │       │   ├── bo.js
│   │   │       │   ├── br.js
│   │   │       │   ├── bs.js
│   │   │       │   ├── ca.js
│   │   │       │   ├── cs.js
│   │   │       │   ├── cv.js
│   │   │       │   ├── cy.js
│   │   │       │   ├── da.js
│   │   │       │   ├── de-at.js
│   │   │       │   ├── de-ch.js
│   │   │       │   ├── de.js
│   │   │       │   ├── dv.js
│   │   │       │   ├── el.js
│   │   │       │   ├── en-au.js
│   │   │       │   ├── en-ca.js
│   │   │       │   ├── en-gb.js
│   │   │       │   ├── en-ie.js
│   │   │       │   ├── en-nz.js
│   │   │       │   ├── eo.js
│   │   │       │   ├── es-do.js
│   │   │       │   ├── es.js
│   │   │       │   ├── et.js
│   │   │       │   ├── eu.js
│   │   │       │   ├── fa.js
│   │   │       │   ├── fi.js
│   │   │       │   ├── fo.js
│   │   │       │   ├── fr-ca.js
│   │   │       │   ├── fr-ch.js
│   │   │       │   ├── fr.js
│   │   │       │   ├── fy.js
│   │   │       │   ├── gd.js
│   │   │       │   ├── gl.js
│   │   │       │   ├── gom-latn.js
│   │   │       │   ├── he.js
│   │   │       │   ├── hi.js
│   │   │       │   ├── hr.js
│   │   │       │   ├── hu.js
│   │   │       │   ├── hy-am.js
│   │   │       │   ├── id.js
│   │   │       │   ├── is.js
│   │   │       │   ├── it.js
│   │   │       │   ├── ja.js
│   │   │       │   ├── jv.js
│   │   │       │   ├── ka.js
│   │   │       │   ├── kk.js
│   │   │       │   ├── km.js
│   │   │       │   ├── kn.js
│   │   │       │   ├── ko.js
│   │   │       │   ├── ky.js
│   │   │       │   ├── lb.js
│   │   │       │   ├── lo.js
│   │   │       │   ├── lt.js
│   │   │       │   ├── lv.js
│   │   │       │   ├── me.js
│   │   │       │   ├── mi.js
│   │   │       │   ├── mk.js
│   │   │       │   ├── ml.js
│   │   │       │   ├── mr.js
│   │   │       │   ├── ms-my.js
│   │   │       │   ├── ms.js
│   │   │       │   ├── my.js
│   │   │       │   ├── nb.js
│   │   │       │   ├── ne.js
│   │   │       │   ├── nl-be.js
│   │   │       │   ├── nl.js
│   │   │       │   ├── nn.js
│   │   │       │   ├── pa-in.js
│   │   │       │   ├── pl.js
│   │   │       │   ├── pt-br.js
│   │   │       │   ├── pt.js
│   │   │       │   ├── ro.js
│   │   │       │   ├── ru.js
│   │   │       │   ├── sd.js
│   │   │       │   ├── se.js
│   │   │       │   ├── si.js
│   │   │       │   ├── sk.js
│   │   │       │   ├── sl.js
│   │   │       │   ├── sq.js
│   │   │       │   ├── sr-cyrl.js
│   │   │       │   ├── sr.js
│   │   │       │   ├── ss.js
│   │   │       │   ├── sv.js
│   │   │       │   ├── sw.js
│   │   │       │   ├── ta.js
│   │   │       │   ├── te.js
│   │   │       │   ├── tet.js
│   │   │       │   ├── th.js
│   │   │       │   ├── tl-ph.js
│   │   │       │   ├── tlh.js
│   │   │       │   ├── tr.js
│   │   │       │   ├── tzl.js
│   │   │       │   ├── tzm-latn.js
│   │   │       │   ├── tzm.js
│   │   │       │   ├── uk.js
│   │   │       │   ├── ur.js
│   │   │       │   ├── uz-latn.js
│   │   │       │   ├── uz.js
│   │   │       │   ├── vi.js
│   │   │       │   ├── x-pseudo.js
│   │   │       │   ├── yo.js
│   │   │       │   ├── zh-cn.js
│   │   │       │   ├── zh-hk.js
│   │   │       │   └── zh-tw.js
│   │   │       ├── meteor/
│   │   │       │   ├── README.md
│   │   │       │   ├── export.js
│   │   │       │   ├── moment.js
│   │   │       │   ├── package.js
│   │   │       │   └── test.js
│   │   │       ├── min/
│   │   │       │   ├── locales.js
│   │   │       │   ├── moment-with-locales.js
│   │   │       │   └── tests.js
│   │   │       ├── moment.d.ts
│   │   │       ├── moment.js
│   │   │       ├── package.js
│   │   │       ├── package.json
│   │   │       ├── scripts/
│   │   │       │   ├── locales.js
│   │   │       │   └── npm_prepublish.sh
│   │   │       ├── src/
│   │   │       │   ├── lib/
│   │   │       │   │   ├── create/
│   │   │       │   │   │   ├── check-overflow.js
│   │   │       │   │   │   ├── date-from-array.js
│   │   │       │   │   │   ├── from-anything.js
│   │   │       │   │   │   ├── from-array.js
│   │   │       │   │   │   ├── from-object.js
│   │   │       │   │   │   ├── from-string-and-array.js
│   │   │       │   │   │   ├── from-string-and-format.js
│   │   │       │   │   │   ├── from-string.js
│   │   │       │   │   │   ├── local.js
│   │   │       │   │   │   ├── parsing-flags.js
│   │   │       │   │   │   ├── utc.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── duration/
│   │   │       │   │   │   ├── abs.js
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── as.js
│   │   │       │   │   │   ├── bubble.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── create.js
│   │   │       │   │   │   ├── duration.js
│   │   │       │   │   │   ├── get.js
│   │   │       │   │   │   ├── humanize.js
│   │   │       │   │   │   ├── iso-string.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── format/
│   │   │       │   │   │   └── format.js
│   │   │       │   │   ├── locale/
│   │   │       │   │   │   ├── base-config.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── en.js
│   │   │       │   │   │   ├── formats.js
│   │   │       │   │   │   ├── invalid.js
│   │   │       │   │   │   ├── lists.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── locales.js
│   │   │       │   │   │   ├── ordinal.js
│   │   │       │   │   │   ├── pre-post-format.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── relative.js
│   │   │       │   │   │   └── set.js
│   │   │       │   │   ├── moment/
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── clone.js
│   │   │       │   │   │   ├── compare.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── creation-data.js
│   │   │       │   │   │   ├── diff.js
│   │   │       │   │   │   ├── format.js
│   │   │       │   │   │   ├── from.js
│   │   │       │   │   │   ├── get-set.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── min-max.js
│   │   │       │   │   │   ├── moment.js
│   │   │       │   │   │   ├── now.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── start-end-of.js
│   │   │       │   │   │   ├── to-type.js
│   │   │       │   │   │   ├── to.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── parse/
│   │   │       │   │   │   ├── regex.js
│   │   │       │   │   │   └── token.js
│   │   │       │   │   ├── units/
│   │   │       │   │   │   ├── aliases.js
│   │   │       │   │   │   ├── constants.js
│   │   │       │   │   │   ├── day-of-month.js
│   │   │       │   │   │   ├── day-of-week.js
│   │   │       │   │   │   ├── day-of-year.js
│   │   │       │   │   │   ├── hour.js
│   │   │       │   │   │   ├── millisecond.js
│   │   │       │   │   │   ├── minute.js
│   │   │       │   │   │   ├── month.js
│   │   │       │   │   │   ├── offset.js
│   │   │       │   │   │   ├── priorities.js
│   │   │       │   │   │   ├── quarter.js
│   │   │       │   │   │   ├── second.js
│   │   │       │   │   │   ├── timestamp.js
│   │   │       │   │   │   ├── timezone.js
│   │   │       │   │   │   ├── units.js
│   │   │       │   │   │   ├── week-calendar-utils.js
│   │   │       │   │   │   ├── week-year.js
│   │   │       │   │   │   ├── week.js
│   │   │       │   │   │   └── year.js
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── abs-ceil.js
│   │   │       │   │       ├── abs-floor.js
│   │   │       │   │       ├── abs-round.js
│   │   │       │   │       ├── compare-arrays.js
│   │   │       │   │       ├── defaults.js
│   │   │       │   │       ├── deprecate.js
│   │   │       │   │       ├── extend.js
│   │   │       │   │       ├── has-own-prop.js
│   │   │       │   │       ├── hooks.js
│   │   │       │   │       ├── index-of.js
│   │   │       │   │       ├── is-array.js
│   │   │       │   │       ├── is-date.js
│   │   │       │   │       ├── is-function.js
│   │   │       │   │       ├── is-number.js
│   │   │       │   │       ├── is-object-empty.js
│   │   │       │   │       ├── is-object.js
│   │   │       │   │       ├── is-undefined.js
│   │   │       │   │       ├── keys.js
│   │   │       │   │       ├── map.js
│   │   │       │   │       ├── some.js
│   │   │       │   │       ├── to-int.js
│   │   │       │   │       └── zero-fill.js
│   │   │       │   ├── locale/
│   │   │       │   │   ├── af.js
│   │   │       │   │   ├── ar-dz.js
│   │   │       │   │   ├── ar-kw.js
│   │   │       │   │   ├── ar-ly.js
│   │   │       │   │   ├── ar-ma.js
│   │   │       │   │   ├── ar-sa.js
│   │   │       │   │   ├── ar-tn.js
│   │   │       │   │   ├── ar.js
│   │   │       │   │   ├── az.js
│   │   │       │   │   ├── be.js
│   │   │       │   │   ├── bg.js
│   │   │       │   │   ├── bn.js
│   │   │       │   │   ├── bo.js
│   │   │       │   │   ├── br.js
│   │   │       │   │   ├── bs.js
│   │   │       │   │   ├── ca.js
│   │   │       │   │   ├── cs.js
│   │   │       │   │   ├── cv.js
│   │   │       │   │   ├── cy.js
│   │   │       │   │   ├── da.js
│   │   │       │   │   ├── de-at.js
│   │   │       │   │   ├── de-ch.js
│   │   │       │   │   ├── de.js
│   │   │       │   │   ├── dv.js
│   │   │       │   │   ├── el.js
│   │   │       │   │   ├── en-au.js
│   │   │       │   │   ├── en-ca.js
│   │   │       │   │   ├── en-gb.js
│   │   │       │   │   ├── en-ie.js
│   │   │       │   │   ├── en-nz.js
│   │   │       │   │   ├── eo.js
│   │   │       │   │   ├── es-do.js
│   │   │       │   │   ├── es.js
│   │   │       │   │   ├── et.js
│   │   │       │   │   ├── eu.js
│   │   │       │   │   ├── fa.js
│   │   │       │   │   ├── fi.js
│   │   │       │   │   ├── fo.js
│   │   │       │   │   ├── fr-ca.js
│   │   │       │   │   ├── fr-ch.js
│   │   │       │   │   ├── fr.js
│   │   │       │   │   ├── fy.js
│   │   │       │   │   ├── gd.js
│   │   │       │   │   ├── gl.js
│   │   │       │   │   ├── gom-latn.js
│   │   │       │   │   ├── he.js
│   │   │       │   │   ├── hi.js
│   │   │       │   │   ├── hr.js
│   │   │       │   │   ├── hu.js
│   │   │       │   │   ├── hy-am.js
│   │   │       │   │   ├── id.js
│   │   │       │   │   ├── is.js
│   │   │       │   │   ├── it.js
│   │   │       │   │   ├── ja.js
│   │   │       │   │   ├── jv.js
│   │   │       │   │   ├── ka.js
│   │   │       │   │   ├── kk.js
│   │   │       │   │   ├── km.js
│   │   │       │   │   ├── kn.js
│   │   │       │   │   ├── ko.js
│   │   │       │   │   ├── ky.js
│   │   │       │   │   ├── lb.js
│   │   │       │   │   ├── lo.js
│   │   │       │   │   ├── lt.js
│   │   │       │   │   ├── lv.js
│   │   │       │   │   ├── me.js
│   │   │       │   │   ├── mi.js
│   │   │       │   │   ├── mk.js
│   │   │       │   │   ├── ml.js
│   │   │       │   │   ├── mr.js
│   │   │       │   │   ├── ms-my.js
│   │   │       │   │   ├── ms.js
│   │   │       │   │   ├── my.js
│   │   │       │   │   ├── nb.js
│   │   │       │   │   ├── ne.js
│   │   │       │   │   ├── nl-be.js
│   │   │       │   │   ├── nl.js
│   │   │       │   │   ├── nn.js
│   │   │       │   │   ├── pa-in.js
│   │   │       │   │   ├── pl.js
│   │   │       │   │   ├── pt-br.js
│   │   │       │   │   ├── pt.js
│   │   │       │   │   ├── ro.js
│   │   │       │   │   ├── ru.js
│   │   │       │   │   ├── sd.js
│   │   │       │   │   ├── se.js
│   │   │       │   │   ├── si.js
│   │   │       │   │   ├── sk.js
│   │   │       │   │   ├── sl.js
│   │   │       │   │   ├── sq.js
│   │   │       │   │   ├── sr-cyrl.js
│   │   │       │   │   ├── sr.js
│   │   │       │   │   ├── ss.js
│   │   │       │   │   ├── sv.js
│   │   │       │   │   ├── sw.js
│   │   │       │   │   ├── ta.js
│   │   │       │   │   ├── te.js
│   │   │       │   │   ├── tet.js
│   │   │       │   │   ├── th.js
│   │   │       │   │   ├── tl-ph.js
│   │   │       │   │   ├── tlh.js
│   │   │       │   │   ├── tr.js
│   │   │       │   │   ├── tzl.js
│   │   │       │   │   ├── tzm-latn.js
│   │   │       │   │   ├── tzm.js
│   │   │       │   │   ├── uk.js
│   │   │       │   │   ├── ur.js
│   │   │       │   │   ├── uz-latn.js
│   │   │       │   │   ├── uz.js
│   │   │       │   │   ├── vi.js
│   │   │       │   │   ├── x-pseudo.js
│   │   │       │   │   ├── yo.js
│   │   │       │   │   ├── zh-cn.js
│   │   │       │   │   ├── zh-hk.js
│   │   │       │   │   └── zh-tw.js
│   │   │       │   ├── moment.js
│   │   │       │   └── test/
│   │   │       │       ├── helpers/
│   │   │       │       │   ├── common-locale.js
│   │   │       │       │   ├── deprecation-handler.js
│   │   │       │       │   ├── dst.js
│   │   │       │       │   ├── each.js
│   │   │       │       │   └── object-keys.js
│   │   │       │       ├── locale/
│   │   │       │       │   ├── af.js
│   │   │       │       │   ├── ar-dz.js
│   │   │       │       │   ├── ar-kw.js
│   │   │       │       │   ├── ar-ly.js
│   │   │       │       │   ├── ar-ma.js
│   │   │       │       │   ├── ar-sa.js
│   │   │       │       │   ├── ar-tn.js
│   │   │       │       │   ├── ar.js
│   │   │       │       │   ├── az.js
│   │   │       │       │   ├── be.js
│   │   │       │       │   ├── bg.js
│   │   │       │       │   ├── bn.js
│   │   │       │       │   ├── bo.js
│   │   │       │       │   ├── br.js
│   │   │       │       │   ├── bs.js
│   │   │       │       │   ├── ca.js
│   │   │       │       │   ├── cs.js
│   │   │       │       │   ├── cv.js
│   │   │       │       │   ├── cy.js
│   │   │       │       │   ├── da.js
│   │   │       │       │   ├── de-at.js
│   │   │       │       │   ├── de-ch.js
│   │   │       │       │   ├── de.js
│   │   │       │       │   ├── dv.js
│   │   │       │       │   ├── el.js
│   │   │       │       │   ├── en-au.js
│   │   │       │       │   ├── en-ca.js
│   │   │       │       │   ├── en-gb.js
│   │   │       │       │   ├── en-ie.js
│   │   │       │       │   ├── en-nz.js
│   │   │       │       │   ├── en.js
│   │   │       │       │   ├── eo.js
│   │   │       │       │   ├── es-do.js
│   │   │       │       │   ├── es.js
│   │   │       │       │   ├── et.js
│   │   │       │       │   ├── eu.js
│   │   │       │       │   ├── fa.js
│   │   │       │       │   ├── fi.js
│   │   │       │       │   ├── fo.js
│   │   │       │       │   ├── fr-ca.js
│   │   │       │       │   ├── fr-ch.js
│   │   │       │       │   ├── fr.js
│   │   │       │       │   ├── fy.js
│   │   │       │       │   ├── gd.js
│   │   │       │       │   ├── gl.js
│   │   │       │       │   ├── gom-latn.js
│   │   │       │       │   ├── he.js
│   │   │       │       │   ├── hi.js
│   │   │       │       │   ├── hr.js
│   │   │       │       │   ├── hu.js
│   │   │       │       │   ├── hy-am.js
│   │   │       │       │   ├── id.js
│   │   │       │       │   ├── is.js
│   │   │       │       │   ├── it.js
│   │   │       │       │   ├── ja.js
│   │   │       │       │   ├── jv.js
│   │   │       │       │   ├── ka.js
│   │   │       │       │   ├── kk.js
│   │   │       │       │   ├── km.js
│   │   │       │       │   ├── kn.js
│   │   │       │       │   ├── ko.js
│   │   │       │       │   ├── ky.js
│   │   │       │       │   ├── lb.js
│   │   │       │       │   ├── lo.js
│   │   │       │       │   ├── lt.js
│   │   │       │       │   ├── lv.js
│   │   │       │       │   ├── me.js
│   │   │       │       │   ├── mi.js
│   │   │       │       │   ├── mk.js
│   │   │       │       │   ├── ml.js
│   │   │       │       │   ├── mr.js
│   │   │       │       │   ├── ms-my.js
│   │   │       │       │   ├── ms.js
│   │   │       │       │   ├── my.js
│   │   │       │       │   ├── nb.js
│   │   │       │       │   ├── ne.js
│   │   │       │       │   ├── nl-be.js
│   │   │       │       │   ├── nl.js
│   │   │       │       │   ├── nn.js
│   │   │       │       │   ├── pa-in.js
│   │   │       │       │   ├── pl.js
│   │   │       │       │   ├── pt-br.js
│   │   │       │       │   ├── pt.js
│   │   │       │       │   ├── ro.js
│   │   │       │       │   ├── ru.js
│   │   │       │       │   ├── sd.js
│   │   │       │       │   ├── se.js
│   │   │       │       │   ├── si.js
│   │   │       │       │   ├── sk.js
│   │   │       │       │   ├── sl.js
│   │   │       │       │   ├── sq.js
│   │   │       │       │   ├── sr-cyrl.js
│   │   │       │       │   ├── sr.js
│   │   │       │       │   ├── ss.js
│   │   │       │       │   ├── sv.js
│   │   │       │       │   ├── sw.js
│   │   │       │       │   ├── ta.js
│   │   │       │       │   ├── te.js
│   │   │       │       │   ├── tet.js
│   │   │       │       │   ├── th.js
│   │   │       │       │   ├── tl-ph.js
│   │   │       │       │   ├── tlh.js
│   │   │       │       │   ├── tr.js
│   │   │       │       │   ├── tzl.js
│   │   │       │       │   ├── tzm-latn.js
│   │   │       │       │   ├── tzm.js
│   │   │       │       │   ├── uk.js
│   │   │       │       │   ├── ur.js
│   │   │       │       │   ├── uz-latn.js
│   │   │       │       │   ├── uz.js
│   │   │       │       │   ├── vi.js
│   │   │       │       │   ├── x-pseudo.js
│   │   │       │       │   ├── yo.js
│   │   │       │       │   ├── zh-cn.js
│   │   │       │       │   ├── zh-hk.js
│   │   │       │       │   └── zh-tw.js
│   │   │       │       ├── moment/
│   │   │       │       │   ├── add_subtract.js
│   │   │       │       │   ├── calendar.js
│   │   │       │       │   ├── create.js
│   │   │       │       │   ├── creation-data.js
│   │   │       │       │   ├── days_in_month.js
│   │   │       │       │   ├── days_in_year.js
│   │   │       │       │   ├── deprecate.js
│   │   │       │       │   ├── diff.js
│   │   │       │       │   ├── duration.js
│   │   │       │       │   ├── duration_from_moments.js
│   │   │       │       │   ├── duration_invalid.js
│   │   │       │       │   ├── format.js
│   │   │       │       │   ├── from_to.js
│   │   │       │       │   ├── getters_setters.js
│   │   │       │       │   ├── instanceof.js
│   │   │       │       │   ├── invalid.js
│   │   │       │       │   ├── is_after.js
│   │   │       │       │   ├── is_array.js
│   │   │       │       │   ├── is_before.js
│   │   │       │       │   ├── is_between.js
│   │   │       │       │   ├── is_date.js
│   │   │       │       │   ├── is_moment.js
│   │   │       │       │   ├── is_number.js
│   │   │       │       │   ├── is_same.js
│   │   │       │       │   ├── is_same_or_after.js
│   │   │       │       │   ├── is_same_or_before.js
│   │   │       │       │   ├── is_valid.js
│   │   │       │       │   ├── leapyear.js
│   │   │       │       │   ├── listers.js
│   │   │       │       │   ├── locale.js
│   │   │       │       │   ├── locale_inheritance.js
│   │   │       │       │   ├── locale_update.js
│   │   │       │       │   ├── min_max.js
│   │   │       │       │   ├── mutable.js
│   │   │       │       │   ├── normalize_units.js
│   │   │       │       │   ├── now.js
│   │   │       │       │   ├── parsing_flags.js
│   │   │       │       │   ├── preparse_postformat.js
│   │   │       │       │   ├── quarter.js
│   │   │       │       │   ├── relative_time.js
│   │   │       │       │   ├── start_end_of.js
│   │   │       │       │   ├── string_prototype.js
│   │   │       │       │   ├── to_type.js
│   │   │       │       │   ├── utc.js
│   │   │       │       │   ├── utc_offset.js
│   │   │       │       │   ├── week_year.js
│   │   │       │       │   ├── weekday.js
│   │   │       │       │   ├── weeks.js
│   │   │       │       │   ├── weeks_in_year.js
│   │   │       │       │   ├── zone_switching.js
│   │   │       │       │   └── zones.js
│   │   │       │       └── qunit.js
│   │   │       ├── tasks/
│   │   │       │   ├── bump_version.js
│   │   │       │   ├── check_sauce_creds.js
│   │   │       │   ├── component.js
│   │   │       │   ├── nuget.js
│   │   │       │   ├── qtest.js
│   │   │       │   ├── transpile.js
│   │   │       │   └── update_index.js
│   │   │       ├── templates/
│   │   │       │   ├── default.js
│   │   │       │   ├── locale-header.js
│   │   │       │   └── test-header.js
│   │   │       └── typing-tests/
│   │   │           ├── moment-tests.ts
│   │   │           └── tsconfig.json
│   │   ├── robots.txt
│   │   ├── theme/
│   │   │   └── default/
│   │   │       ├── css/
│   │   │       │   ├── animate.css
│   │   │       │   ├── footer-1.css
│   │   │       │   ├── header-1.css
│   │   │       │   ├── magnific-popup.css
│   │   │       │   └── style.css
│   │   │       ├── fonts/
│   │   │       │   └── FontAwesome.otf
│   │   │       ├── js/
│   │   │       │   ├── cubeportfolio/
│   │   │       │   │   ├── blog-grid-3col.js
│   │   │       │   │   ├── portfolio-masonry-4col.js
│   │   │       │   │   ├── team.js
│   │   │       │   │   └── testimonials.js
│   │   │       │   ├── custom.js
│   │   │       │   ├── google-map.js
│   │   │       │   ├── index.js
│   │   │       │   └── navigation.js
│   │   │       └── plugins/
│   │   │           ├── FlexSlider/
│   │   │           │   ├── jquery.flexslider-min.js
│   │   │           │   └── jquery.flexslider.css
│   │   │           └── owl-carousel/
│   │   │               ├── owl.carousel.css
│   │   │               └── owl.theme.css
│   │   └── uploads/
│   │       └── index.html
│   ├── tasks/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── cron_send_sms.py
│   │   ├── run_apply_put_interest_on_principal.py
│   │   ├── run_lock_active_not_put.py
│   │   ├── run_lock_order_not_pay.py
│   │   ├── run_lock_pay_not_rec.py
│   │   ├── run_lock_reg_not_active.py
│   │   ├── run_send_sms.py
│   │   └── run_send_sms_priority.py
│   ├── templates/
│   │   ├── 404.html
│   │   ├── 500.html
│   │   ├── _footer.html
│   │   ├── _top.html
│   │   ├── about.html
│   │   ├── about_bak.html
│   │   ├── active/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── apply/
│   │   │   ├── get_add.html
│   │   │   ├── get_edit.html
│   │   │   ├── get_list.html
│   │   │   ├── put_add.html
│   │   │   ├── put_edit.html
│   │   │   └── put_list.html
│   │   ├── auth/
│   │   │   ├── _forget_password.html
│   │   │   ├── _login_three_part.html
│   │   │   ├── email.html
│   │   │   ├── index.html
│   │   │   └── phone.html
│   │   ├── bit_coin/
│   │   │   └── list.html
│   │   ├── blog/
│   │   │   ├── add.html
│   │   │   ├── edit.html
│   │   │   ├── hot.html
│   │   │   ├── index.html
│   │   │   ├── list_edit.html
│   │   │   └── new.html
│   │   ├── complaint/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── contact.html
│   │   ├── credit/
│   │   │   └── index.html
│   │   ├── email.html
│   │   ├── index.html
│   │   ├── layout.html
│   │   ├── logout.html
│   │   ├── macros.html
│   │   ├── message/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── order/
│   │   │   ├── get_info.html
│   │   │   ├── get_list.html
│   │   │   ├── pay.html
│   │   │   ├── put_info.html
│   │   │   └── put_list.html
│   │   ├── reg/
│   │   │   ├── _agreement.html
│   │   │   ├── _agreement_en.html
│   │   │   ├── email.html
│   │   │   ├── index.html
│   │   │   └── phone.html
│   │   ├── scheduling/
│   │   │   └── list.html
│   │   ├── score/
│   │   │   ├── charity_list.html
│   │   │   ├── digital_list.html
│   │   │   └── expense_list.html
│   │   ├── setting.html
│   │   ├── site/
│   │   │   └── index.html
│   │   ├── theme/
│   │   │   └── default/
│   │   │       ├── _footer.html
│   │   │       ├── _header.html
│   │   │       ├── index.html
│   │   │       └── layout.html
│   │   ├── uploads.html
│   │   ├── user/
│   │   │   ├── _account_info.html
│   │   │   ├── _invite_link.html
│   │   │   ├── _status.html
│   │   │   ├── _team_tree.html
│   │   │   ├── account.html
│   │   │   ├── auth.html
│   │   │   ├── bank.html
│   │   │   ├── notification.html
│   │   │   ├── profile.html
│   │   │   └── team.html
│   │   └── wallet/
│   │       └── list.html
│   ├── tools/
│   │   ├── __init__.py
│   │   ├── config_manage.py
│   │   ├── db.py
│   │   ├── db_test_mysql.py
│   │   ├── db_test_sqlite.py
│   │   ├── decorators.py
│   │   ├── exception.py
│   │   ├── file.py
│   │   ├── send_sms.py
│   │   ├── session_manage.py
│   │   ├── stat.py
│   │   ├── system.py
│   │   └── url.py
│   └── views/
│       ├── __init__.py
│       ├── active.py
│       ├── apply.py
│       ├── auth.py
│       ├── bit_coin.py
│       ├── blog.py
│       ├── captcha.py
│       ├── complaint.py
│       ├── credit.py
│       ├── file.py
│       ├── get.py
│       ├── invite.py
│       ├── message.py
│       ├── order.py
│       ├── pay.py
│       ├── penetration.py
│       ├── put.py
│       ├── reg.py
│       ├── scheduling.py
│       ├── score.py
│       ├── site.py
│       ├── test.py
│       ├── user.py
│       ├── wallet.py
│       └── wechat.py
├── backup/
│   ├── batch_import.sh
│   ├── data_test.sql
│   ├── db_dump.sh
│   ├── db_init.sh
│   ├── db_restore.sh
│   ├── model_create.sh
│   ├── run.sh
│   ├── schema.dump.sql
│   ├── schema.sql
│   ├── test.py
│   └── views_bak.py
├── changelog/
│   └── 2017-07-03/
│       └── mysql.sql
├── config/
│   ├── __init__.py
│   ├── develop/
│   │   ├── __init__.py
│   │   └── settings/
│   │       ├── __init__.py
│   │       ├── apply.py
│   │       ├── interest.py
│   │       ├── order.py
│   │       ├── sms.py
│   │       └── user.py
│   └── product/
│       ├── __init__.py
│       └── settings/
│           ├── __init__.py
│           ├── apply.py
│           ├── interest.py
│           ├── order.py
│           ├── sms.py
│           └── user.py
├── db/
│   ├── data/
│   │   └── mysql.sql
│   ├── mysql.py
│   ├── postgresql.py
│   ├── schema/
│   │   ├── mysql.sql
│   │   ├── postgresql.sql
│   │   └── sqlite.sql
│   └── sqlite.py
├── doc/
│   ├── BluePrint.md
│   ├── Celery.md
│   ├── Docker.md
│   ├── DockerHub.md
│   ├── ElasticSearch.md
│   ├── Flask-SQLAlchemy.md
│   ├── Flask-SSE.md
│   ├── Flask-WTF.md
│   ├── Flower.md
│   ├── Git.md
│   ├── Gunicorn.md
│   ├── LightBox.md
│   ├── MariaDB.md
│   ├── MongoDB.md
│   ├── OAuth.md
│   ├── OpenPay.md
│   ├── Redis.md
│   ├── Siege.md
│   ├── SqlAlchemy.md
│   ├── UbuntuServer.md
│   ├── WeiXin.md
│   ├── bootstrap-select.md
│   ├── cache.md
│   ├── fabric.md
│   ├── https.md
│   ├── jQuery-File-Upload.md
│   └── mirrors.md
├── docker/
│   ├── Dockerfile
│   ├── README.md
│   ├── docker_build.sh
│   ├── docker_login.sh
│   ├── docker_run.sh
│   ├── mariadb/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── cli.sh
│   │   ├── db_dump.sh
│   │   ├── db_init.sh
│   │   ├── docker_run_develop.sh
│   │   ├── docker_run_product.sh
│   │   └── env.sh
│   ├── mongodb/
│   │   ├── README.md
│   │   ├── cli.sh
│   │   ├── docker_run.sh
│   │   └── env.sh
│   ├── nginx/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── conf/
│   │   │   ├── conf.d/
│   │   │   │   ├── default.conf
│   │   │   │   ├── project.conf
│   │   │   │   └── project_ssl.conf
│   │   │   ├── nginx.conf
│   │   │   └── ssl/
│   │   │       ├── ca.key
│   │   │       ├── server.crt
│   │   │       ├── server.csr
│   │   │       ├── server.key
│   │   │       └── v3.ext
│   │   ├── create_ca.sh
│   │   ├── create_crt.sh
│   │   ├── create_csr.sh
│   │   ├── create_key.sh
│   │   └── docker_run.sh
│   ├── rabbitmq/
│   │   ├── README.md
│   │   ├── docker_run.sh
│   │   └── docker_run_management.sh
│   ├── redis/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── cli.sh
│   │   ├── docker_run_aof.sh
│   │   └── docker_run_rdb.sh
│   └── requirements.txt
├── docker-compose.yml
├── env_develop.sh
├── env_product.sh
├── etc/
│   ├── app_backend.ini
│   ├── app_frontend.ini
│   ├── app_wechat.ini
│   ├── cron_send_sms.ini
│   ├── nginx.conf
│   ├── nginx_ssl.conf
│   ├── supervisord.conf
│   ├── task_lock.ini
│   └── task_sms.ini
├── gen.py
├── project/
│   ├── doc.md
│   ├── run_develop.md
│   └── run_product.md
├── requirements.txt
├── run_backend.py
├── run_frontend.py
├── service_start.md
└── ssl/
    ├── server.crt
    ├── server.csr
    ├── server.key
    └── server.key.org

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

================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### Python template

*.env
*.pyc
#*.log
.idea/
*.DS_Store

app_frontend/static/uploads/*
!app_frontend/static/uploads/index.html

# 数据
docker/mariadb/backup/*

# 日志
app_wechat/
db/backup/
docker/mariadb/backup/
docker/mariadb/data/
docker/mongodb/data/
docker/nginx/log/
docker/rabbitmq/data/
docker/redis/data/
logs/


================================================
FILE: README.md
================================================
## Flask 项目模拟


- product 生产环境
- develop 开发环境

### 项目演示步骤

虚拟环境 部署方式
```
$ cd flask_project                  # 进入项目目录
$ virtualenv flask.env              # 新建虚拟环境
$ source flask.env/bin/activate     # 进入虚拟环境
$ pip install -r requirements.txt   # 安装环境依赖
$ python run_frontend.py            # 开启前台服务
$ python run_backend.py             # 开启后台服务
```

也可以 docker 方式部署
```
$ cd flask_project/docker           # 进入Docker脚本目录
$ sh docker/docker_build.sh         # 创建本地Docker镜像
$ sh docker/docker_run.sh           # 运行本地Docker容器
```


### 安装 flask 以及扩展

创建并进入虚拟环境
```
$ virtualenv flask.env
$ source flask.env/bin/activate
```

项目服务依赖
```
Nginx
Redis
MariaDB
RabbitMQ
MongoDB
```


项目扩展依赖
```
$ pip install Flask
$ pip install Flask-Login
$ pip install Flask-Mail
$ pip install Flask-SQLAlchemy
$ pip install Flask-WTF
$ pip install Flask-OAuthlib
$ pip install Flask-Excel
$ pip install Flask-Moment
$ pip install Flask-Uploads
$ pip install Flask-Principal
$ pip install Flask-Babel
$ pip install sqlacodegen
$ pip install gunicorn
$ pip install schedule
$ pip install supervisor
$ pip install redis
$ pip install requests
$ pip install celery
$ pip install librabbitmq
$ pip install pika
$ pip install Pillow
$ pip install sshtunnel
$ pip install MySQL-python
$ pip freeze > requirements.txt
```

服务部署安装方式
```
$ pip install -r requirements.txt
```


### 创建目录结构

```
$ mkdir app
$ mkdir app/static
$ mkdir app/templates
$ mkdir tmp
```

在 Pycharm 中设置 templates 目录
```
app/templates 目录右键 >> Mark Directory As >> Template Folder
File >> Settings >> Languages & Frameworks >> Python Template Languages >> Template Language: jinja2
```


### 引入 Bootstrap

Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。

项目地址:https://github.com/twbs/bootstrap

Bootstrap 英文官网:http://getbootstrap.com/

Bootstrap 中文网:http://www.bootcss.com/

Bootstrap CDN
```
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

<!-- Optional theme -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">

<!-- Latest compiled and minified JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
```

### 启动 web 服务
```
$ chmod a+x run.py
$ ./run.py
# 可以 Ctrl-C 来终止服务
```

浏览器访问:

[http://localhost:5000](http://localhost:5000)

[http://localhost:5000/index](http://localhost:5000/index)



### 如何生成强壮的密钥
```
In [1]: import os
In [2]: os.urandom(24)
Out[2]: '\x03\xabjR\xbbg\x82\x0b{\x96f\xca\xa8\xbdM\xb0x\xdbK%\xf2\x07\r\x8c'
```


### 创建数据库

模拟数据
```
INSERT INTO author(name, email) VALUES('Mark', 'mark@gmail.com');
INSERT INTO author(name, email) VALUES('Jacob', 'jacob@gmail.com');
INSERT INTO author(name, email) VALUES('Larry', 'larry@gmail.com');
INSERT INTO author(name, email) VALUES('Tom', 'tom@gmail.com');
INSERT INTO author(name, email) VALUES('Lily', 'lily@gmail.com');
```
```
INSERT INTO blog(author, title, pub_date) VALUES('Mark', 'The old man and the sea', '2016-01-11 11:01:05');
INSERT INTO blog(author, title, pub_date) VALUES('Jacob', 'The fault in our stars', '2016-01-11 20:23:27');
INSERT INTO blog(author, title, pub_date) VALUES('Larry', 'The Great Gatsby', '2016-01-11 23:15:18');
INSERT INTO blog(author, title, pub_date) VALUES('Tom', 'Sense and Sensibility', '2016-01-12 12:25:34');
INSERT INTO blog(author, title, pub_date) VALUES('Tom', 'Pride and Prejudice', '2016-01-12 13:17:25');
INSERT INTO blog(author, title, pub_date) VALUES('Lily', 'Game of Thrones', '2016-01-12 14:53:01');
INSERT INTO blog(author, title, pub_date) VALUES('Mark', 'Charlie and the Chocolate Factory', '2016-01-12 15:13:17');
INSERT INTO blog(author, title, pub_date) VALUES('Larry', 'Harry Potter and the Sorcerer''s Stone', '2016-01-12 19:32:15');
INSERT INTO blog(author, title, pub_date) VALUES('Larry', 'The house on mango street', '2016-01-12 01:43:42');
INSERT INTO blog(author, title, pub_date) VALUES('Jacob', 'And then there were none', '2016-01-13 16:17:32');
```

注意:插入内容中如果存在半角单引号('),需要替换为2个单引号('')
前提是插入内容在两个单引号之间,存入数据库会自动转义为1个单引号


生成建表语句(备份)
```
$ sqlite3 flask.db ".dump" > schema.sql
```


创建数据库(恢复):
```
$ sqlite3 flask.db < schema.sql
```

etc 目录下已经创建好脚本(初始化数据,备份数据)
```
$ chmod a+x db_init.sh
$ chmod a+x db_dump.sh
$ ./db_init.sh
```


### SQLAlchemy

python 的一种 ORM 框架

ORM:Object-Relational Mapping

把关系数据库的表结构映射到对象上

使用 Flask-SQLAlchemy 进行数据库管理
```
Database engine     URL
---------------     ---
MySQL               mysql://username:password@hostname/database
Postgres            postgresql://username:password@hostname/database
SQLite (Unix)       sqlite:////absolute/path/to/database
SQLite (Windows)    sqlite:///c:/absolute/path/to/database
```

最常用的 SQLAlchemy 列类型如下:
```
Type name       Python Type         Python type Description
---------       -------             -----------------------
Integer         int                 Integerint Regular integer, typically 32 bits
SmallInteger    int                 Short-range integer, typically 16 bits
BigInteger      int or long         Unlimited precision integer
Float           float               Floating-point number
Numeric         decimal.Decimal     Fixed-point number
String          str                 Variable-length string
Text            str                 Variable-length string, optimized for large or unbound length
Unicode         unicode             Variable-length Unicode string
UnicodeText     unicode             Variable-length Unicode string, optimized for large or unbound length
Boolean         bool                Boolean value
Date            datetime.date       Date value
Time            datetime.time       Time value
DateTime        datetime.datetime   Date and time value
Interval        datetime.timedelta  Time interval
Enum            str                 List of string values
PickleType      Any Python object   Automatic Pickle serialization
LargeBinary     str                 Binary blob
```
模型可以(没有强制要求)定义 __repr()__ 方法,返回一个具有可读性的字符串表示模型,可在调试和测试时使用。

最常见的 SQLAlchemy 选项:
```
Option name     Description
-----------     -----------
primary_key     If set to True , the column is the table’s primary key.
unique          If set to True , do not allow duplicate values for this column.
index           If set to True , create an index for this column, so that queries are more efficient.
nullable        If set to True , allow empty values for this column. If set to False , the column will not allow null values.
default         Define a default value for the column.
```

官方文档:
[SQLAlchemy 1.0 Documentation](http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html)

[常见的过滤器运算符 Common Filter Operators](http://docs.sqlalchemy.org/en/rel_1_0/orm/tutorial.html#common-filter-operators)

[动态获取 Model 对象的主键](http://docs.sqlalchemy.org/en/latest/orm/internals.html#sqlalchemy.orm.state.InstanceState.identity)


打开自动提交
```
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(session_options={'autocommit': True})
后者:
SQLALCHEMY_COMMIT_ON_TEARDOWN = True  # 打开自动提交
```

联表(内联)分页查询
```
paginate = User.query.join(UserProfile, User.id == UserProfile.user_id).add_entity(UserProfile).order_by(User.id.desc()).paginate(1, 10, False)

print paginate.items
    for (user, user_profile) in paginate.items:
        print user.id, user_profile.user_id
```
如果需要外联,join 替换为 outerjoin 即可


### sqlacodegen

安装
```
$ pip install sqlacodegen
```

生成 model
```
$ sqlacodegen sqlite:///flask.db --outfile app/models.py
```

参考例子:
```
$ sqlacodegen postgresql:///some_local_db
$ sqlacodegen mysql+oursql://user:password@localhost/db_name
$ sqlacodegen sqlite:///database.db
$ sqlacodegen mysql://root:root@127.0.0.1:3306/db_name > models.py
$ sqlacodegen mysql://root:root@127.0.0.1:3306/db_name --outfile models.py
```

修改 models 文件:

    from sqlalchemy.ext.declarative import declarative_base
    
    
    Base = declarative_base()

替换为:

    from flask.ext.sqlalchemy import SQLAlchemy
    from app import app
    db = SQLAlchemy(app)
    Base = db.Model


[http://docs.sqlalchemy.org/en/latest/core/engines.html](http://docs.sqlalchemy.org/en/latest/core/engines.html)

注意:

添加选项 --noinflect 否则工具默认会将表名后缀s去掉


### 存入数据库中文乱码

SQLALCHEMY_DATABASE_URI = 'mysql://[用户]:[密码]@[IP]/[库名]?charset=utf8'

注意是 utf8 ,不是 utf-8
> show variables like 'character%';
mysql 里的 charset 是 utf8


### 关于分页

错误写法:
```
rows = db_session.query(Author).filter_by(**kwargs).paginate(page, per_page, False)
```

报错如下:
```
AttributeError: 'Query' object has no attribute 'paginate'
```

失败原因:
```
"Query" refers to the SQLAlchemy Query object. 
"BaseQuery" refers to the Flask-SQLALchemy BaseQuery object, which is a subclass of Query. 
This subclass includes helpers such as first_or_404() and paginate().
However, this means that a Query object does NOT have the paginate() function.
How you actually build the object you are calling your "Query" object depends on whether you are dealing with a Query or BaseQuery object.
```

参考:[http://stackoverflow.com/questions/18468887/flask-sqlalchemy-pagination-error](http://stackoverflow.com/questions/18468887/flask-sqlalchemy-pagination-error)

正确写法:
```
rows = Author.query.filter_by(**kwargs).paginate(page, per_page, False)
```

模板中遍历 item,单页 item 序号用 loop.index 表示


### 表单

WTForms 标准 HTML 表单域
```
表单域类型               描述
---------               ----
StringField             文本框
TextAreaField           多行文本框
PasswordField           密码输入框
HiddenField             隐藏文本框
DateField               接收给定格式datetime.date型的文本框
DateTimeField           接收给定格式datetime.datetime型的文本框
IntegerField            接收整型的文本框
DecimalField            接收decimal.Decimal型的文本框
FloadField              接收浮点型的文本框
BooleanField            带有True和False的复选框
RadioField              一组单选框
SelectField             下拉选择框
SelectMultipleField     下拉多选框
FieldField              文件上传框
SubmitField             表单提交按钮
FormField               将一个表单作为表单域嵌入到容器表单中
FieldList               给定类型的表单域列表
```

WTForms 验证
```
验证程序         描述
-------         ----
Email           验证邮箱地址
EqualTo         比较两个域的值;在要求输入两次密码进行确认的时候非常有用
IPAddress       验证IPv4网络地址
Length          验证输入字符串的长度
NumberRange     验证输入的值在数值范围内
Optional        允许输入为空;忽略额外的验证
Required        验证表单域包含数据
Regexp          验证输入的正则表达式
URL             验证一个URL
AnyOf           验证输入是一组可能值中的一个
NoneOf          验证输入不是一组可能值中的一个
```

自定义表单验证

参考官方文档:[http://wtforms.readthedocs.org/en/latest/validators.html#custom-validators](http://wtforms.readthedocs.org/en/latest/validators.html#custom-validators)

注意事项:
NumberRange 校验只对数值类型(IntegerField,FloadField,DecimalField)生效;字符串类型(StringField)不生效

DataRequired, InputRequired 的区别

- DataRequired 检查类型转换后的值,是否为真(即 if field.data)
- InputRequired 检查原始输入的值,是否为真


### CSRF
跨站请求伪造

攻击方式:
    利用用户身份执行非法请求(在用户浏览器端发起特定请求)
防御策略:
    通常使用csrf_token防御

http://flask-wtf.readthedocs.io/en/stable/csrf.html

Any view using FlaskForm to process the request is already getting CSRF protection. 
也就是使用FlaskForm的表单默认都会受到保护

HTML Forms
```html
<form method="post">
    {{ form.csrf_token }}
</form>
```

```html
<form method="post">
    <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"/>
</form>
```

JavaScript Requests
```html
<script type="text/javascript">
    var csrf_token = "{{ csrf_token() }}";

    $.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
                xhr.setRequestHeader("X-CSRFToken", csrf_token);
            }
        }
    });
</script>
```

### Message Flashing

闪现消息 定义4种类型 success info warning danger

参考:[http://flask.pocoo.org/docs/0.10/patterns/flashing/#flashing-with-categories](http://flask.pocoo.org/docs/0.10/patterns/flashing/#flashing-with-categories)


如果需要自动关闭
```
$("#success-alert").fadeTo(2000, 500).slideUp(500, function(){
    $("#success-alert").slideUp(500);
});
```

### 关于时间

python 中:
timestamp=datetime.datetime.utcnow()

sql 模式下:
CURRENT_TIMESTAMP

均为 UTC 时间(非系统本地时间)

把时间设置为 UTC 时区,所有的存储在数据库里的时间将是 UTC 格式,用户可能在世界各地写微博,因此我们需要使用统一的时间单位。

另外,sqlite 并不支持像 mysql 有这种 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 触发器的简单语法。
其实更新时间完全可以在程序中控制。

若缺省值是 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP,则当前 UTC 日期和/或时间被插入字段。

CURRENT_TIME 的格式为 “HH:MM:SS”

CURRENT_DATE 为 “YYYY-MM-DD”

而 CURRENT_TIMESTAMP 是 “YYYY-MM-DD HH:MM:SS”

注意:
数据库表中的创建时间字段一般会设置缺省当前时间。
保存数据时,如果程序中,创建时间为空,创建时间字段存储的是数据库服务器的当前时间;
如果程序中直接设置好创建时间为当前时间,则保存的创建时间字段是代码服务器的当前时间。
生产环境通常 web 与 db 是分开的,时钟往往不同步。
不同开发人员程序中如果不统一的话,会造成麻烦。

Flask-Moment 本地化日期和时间

https://github.com/miguelgrinberg/Flask-Moment

[http://momentjs.com/](http://momentjs.com/)

例子
```
{{ moment().fromNow(refresh=True).format('LLLL') }}
```

页面配置

本地加载:
```
<script src="{{ url_for('static', filename='plugin/moment-2.18.1/min/moment-with-locales.min.js') }}"></script>
<script>
    moment.locale("zh-cn");
    function flask_moment_render(elem) {
        $(elem).text(eval('moment("' + $(elem).data('timestamp') + '").' + $(elem).data('format') + ';'));
        $(elem).removeClass('flask-moment').show();
    }
    function flask_moment_render_all() {
        $('.flask-moment').each(function () {
            flask_moment_render(this);
            if ($(this).data('refresh')) {
                (function (elem, interval) {
                    setInterval(function () {
                        flask_moment_render(elem)
                    }, interval);
                })(this, $(this).data('refresh'));
            }
        })
    }
    $(document).ready(function () {
        flask_moment_render_all();
    });
</script>
```

cdn方案:
```
{{ moment.include_moment() }}
{{ moment.locale('zh-cn') }}
```


### 用户登陆

Flask-Login 扩展需要在我们 model 的 User 类里实现一些方法。:

    def is_authenticated(self):
            return True
    
    def is_active(self):
        return True
    
    def is_anonymous(self):
        return False
    
    def get_id(self):
        try:
            return unicode(self.id)  # python 2
        except NameError:
            return str(self.id)  # python 3


[https://flask-login.readthedocs.io/en/latest/](https://flask-login.readthedocs.io/en/latest/)


### 用 jQuery 实现 Ajax

[http://www.pythondoc.com/flask/patterns/jquery.html](http://www.pythondoc.com/flask/patterns/jquery.html)


### Bootstrap 轮播(Carousel)插件

[http://www.runoob.com/bootstrap/bootstrap-carousel-plugin.html](http://www.runoob.com/bootstrap/bootstrap-carousel-plugin.html)


### 轮播大图样式

- 选择 宽度1920 高度610 的高画质图片
- 主要图像内容信息集中在中间1024的区域


### Swiper 移动端触摸滑动插件

[http://www.swiper.com.cn/](http://www.swiper.com.cn/)


### Slideout.js 侧滑插件

[https://github.com/mango/slideout](https://github.com/mango/slideout)


### LightBox 插件

参考: [LightBox.md](doc/LightBox.md)


### Chart.js 图表插件

[http://www.bootcss.com/p/chart.js/docs/](http://www.bootcss.com/p/chart.js/docs/)

响应式辅助参数:
responsive: true


## clipboard.js 剪贴板插件

https://github.com/zenorocha/clipboard.js/


## Flask-Excel

http://flask-excel.readthedocs.io/en/latest/

支持 csv tsv 导出
如果需要导出 xls 格式,需要安装 pyexcel-xls


## Flask-Uploads

https://pythonhosted.org/Flask-Uploads/


## Flask-Principal

http://pythonhosted.org/Flask-Principal/
http://flask-principal-cn.readthedocs.io/zh_CN/latest/



## Flask-DebugToolbar
https://flask-debugtoolbar.readthedocs.io/en/latest/


## 部署方案( Nginx + Gunicorn + Supervisor )

生产环境下,flask 自带的 服务器,无法满足性能要求。我们这里采用 gunicorn 做 wsgi 容器,用来部署 python。

Gunicorn 官网:[http://gunicorn.org/](http://gunicorn.org/)

参考:[virtualenv 环境下 Flask + Nginx + Gunicorn+ Supervisor 搭建 Python Web](http://www.ituring.com.cn/article/201045?utm_source=tuicool)

Supervisor 重启 Gunicorn 时,有时会碰到 Gunicorn 起不来的情况
查看端口占用情况
```
# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      1722/python
tcp        0      0 127.0.0.1:9001          0.0.0.0:*               LISTEN      1/python
tcp        0      0 0.0.0.0:8010            0.0.0.0:*               LISTEN      647/python
# kill -9 PID
```

安装
```
$ pip install gunicorn
```
用 gunicorn 启动 flask
```
$ gunicorn -w4 -b0.0.0.0:8000 app:app
[2016-03-02 15:22:44 +0000] [14362] [INFO] Starting gunicorn 19.4.5
[2016-03-02 15:22:44 +0000] [14362] [INFO] Listening at: http://0.0.0.0:8000 (14362)
[2016-03-02 15:22:44 +0000] [14362] [INFO] Using worker: sync
[2016-03-02 15:22:44 +0000] [14367] [INFO] Booting worker with pid: 14367
[2016-03-02 15:22:44 +0000] [14370] [INFO] Booting worker with pid: 14370
[2016-03-02 15:22:45 +0000] [14373] [INFO] Booting worker with pid: 14373
[2016-03-02 15:22:45 +0000] [14374] [INFO] Booting worker with pid: 14374
```
此时,我们需要用 8000 的端口进行访问,原先的5000并没有启用。

进程数的推荐配置:
workers = multiprocessing.cpu_count() * 2 + 1

安装 supervisor
```
$ pip install supervisor
$ echo_supervisord_conf > etc/supervisord.conf
```

新增如下配置
```
[program:app]
command="gunicorn -w 4 -b 0.0.0.0:8000 app:app"
startsecs=0
stopwaitsecs=0
autostart=false
autorestart=false
stdout_logfile=log/gunicorn.log
stderr_logfile=log/gunicorn.err
```

启动 supervisord 服务
```
$ supervisord -c etc/supervisord.conf
```

常用命令
```
supervisord -c etc/supervisord.conf
supervisorctl -c etc/supervisord.conf status                  查看supervisor的状态
supervisorctl -c etc/supervisord.conf reload                  重新载入 配置文件
supervisorctl -c etc/supervisord.conf start [all]|[appname]   启动指定/所有 supervisor 管理的程序进程
supervisorctl -c etc/supervisord.conf stop [all]|[appname]    关闭指定/所有 supervisor 管理的程序进程
supervisorctl -c etc/supervisord.conf restart [all]|[appname] 重启指定/所有 supervisor 管理的程序进程
```

supervisor 还有一个 web 的管理界面,可以激活。更改下配置:
```
[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for all iface)
username=admin             ; (default is no username (open server))
password=123456            ; (default is no password (open server))
```
```
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://127.0.0.1:9001       ; use an http:// url to specify an inet socket
username=admin                        ; should be same as http_username if set
password=123456                       ; should be same as http_password if set
;prompt=mysupervisor                  ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history           ; use readline history if available
```
用户名 和 密码 必须一致,也可以同时注释掉。

重新加载配置 并 重启服务
```
$ supervisorctl -c etc/supervisord.conf reload
$ supervisorctl -c etc/supervisord.conf restart all
```

浏览器访问 [http://127.0.0.1:9001](http://127.0.0.1:9001) 可以得到 supervisor 的 web 管理界面,
访问 [http://127.0.0.1:8000](http://127.0.0.1:8000) 可以看见 gunicorn 启动的返回的页面。

nginx 服务
```
sudo service nginx start
sudo service nginx stop
sudo service nginx restart
```

```
进入项目目录
$ sudo ln -s `pwd`/etc/nginx.conf /etc/nginx/conf.d/flask_app_nginx.conf
$ sudo nginx -s reload  # 平滑重启
$ sudo subl /etc/hosts
# 127.0.0.1    www.flask-app.com
```

查看 ip 地址
```
$ ifconfig eth0 | grep 'inet ' | awk '{print $2}'
```

nginx 静态资源目录配置
```
$ sudo mkdir -p /data/static
$ sudo chown nginx. /data -R
$ sudo ln -s /data/static /home/zhanghe/code/flask_project/app/static
```

为了保证网站安全(避免上传漏洞),需要正确权限配置(目录755,静态文件644权限)
```
$ cd /data/
$ find ./ -type d -print | xargs chmod 755
$ find ./ -type f -print | xargs chmod 644
```

不建议以下为方便而设置的777权限
```
$ sudo chmod 777 -R /data/static/
```

新增 nginx 配置信息
```
location ~ ^/static/ {
    root /data/;
    #过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
    expires 30d;
}
```

Nginx https 部署

参考: [https.md](doc/https.md)


## 上传目录权限设置
```
$ chmod 777 /data/uploads
```

## 统计代码行数(包含注释)

查看项目python代码行数
```
$ find ./app -type f -name "*.py" | xargs wc -l
```

查看项目模板文件行数
```
$ find ./app -type f -name "*.html" | xargs wc -l
```


## 调试

在 Python 应用程序中设置断点
```
import pdb; pdb.set_trace()
```


## 远程调试
```
$ pip install remote-pdb
```

远程调试配置代码(添加web服务启动之前):
```
import signal
import os


def handle_pdb(sig, frame):
    from remote_pdb import RemotePdb
    print sig, frame
    RemotePdb('0.0.0.0', 48110).set_trace()  # 如将ip地址设置为127.0.0.1,只能本机调试

signal.signal(signal.SIGUSR1, handle_pdb)
print('pid:%s' % os.getpid())
```

调试过程:

一、服务启动
```
$ ./run.py 
pid:7892
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
10 <frame object at 0x7fb9010259d8>
CRITICAL:root:RemotePdb session open at 127.0.0.1:48110, waiting for connection ...
RemotePdb session open at 0.0.0.0:48110, waiting for connection ...
CRITICAL:root:RemotePdb accepted connection from ('127.0.0.1', 41497).
RemotePdb accepted connection from ('127.0.0.1', 41497).
```
终端输出的进程id 为 7892

二、给进程7892 发送终止信号
```
$ kill -10 7892
```

三、远程登陆
```
$ telnet 127.0.0.1 48110
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
--Return--
> /home/zhanghe/code/flask_project/run.py(21)handle_pdb()->None
-> RemotePdb('127.0.0.1', 48110).set_trace()
(Pdb) 
```

四、退出调试(2步):
Ctrl + ], q
```
(Pdb) ^]

telnet> q
Connection closed.
```
此时,程序继续运行(web继续提供服务)

pdb 可以执行命令:
直接回车是重复前一条命令!
p(print) 查看一个变量值
n(next) 下一步
s(step) 单步,可进入函数
c(continue)继续前进
l(list)看源代码

查看系统支持的信号列表
```
$ kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX
```

以上程序使用的 SIGUSR1 是终止进程信号,为用户定义信号1


参考文档
[https://pypi.python.org/pypi/remote-pdb](https://pypi.python.org/pypi/remote-pdb)


## 参考资料:

[Flask 代码模式](http://docs.jinkan.org/docs/flask/patterns/index.html)


## 安全设置

- 路由参数 校验参数类型,格式

例如:
```
@app.route('/blog/edit/<int:blog_id>/', methods=['GET', 'POST'])
```
防止 XSS 漏洞

- 主键设置为整型(为方便底层操作,统一命名为 id)

好处:安全(防止因代码疏忽而导致的 XSS 漏洞),效率

- 链接中的重定向参数(next)不能为外链

防止 URL 重定向/跳转漏洞
redirect=<script>alert('XSS')</script>


## GitHub 操作

…or create a new repository on the command line
```
echo "# flask_project" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:zhanghe06/flask_project.git
git push -u origin master
```

…or push an existing repository from the command line
```
git remote add origin git@github.com:zhanghe06/flask_project.git
git push -u origin master
```


## Fix SNIMissingWarning

机器环境:
```
$ python --version
Python 2.7.6
```

虚拟环境:
```
$ pip freeze | grep requests
requests==2.9.1
requests-oauthlib==0.6.1
```

执行 pip freeze 命令后有报错信息:
```
/home/zhanghe/code/flask_project/flask.env/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
```
原因: [requests 2.6 以后的版本, pyopenssl.inject_into_urllib3()](https://github.com/kennethreitz/requests/blob/a57c87a459d51c5b17d20285109e901b8aa95752/requests/__init__.py#L54)

python-2.7.9 以前的版本都会有这个问题

如果不想升级 python 版本, 可以选择降级 requests 版本, 例如: requests==2.5.3

最佳解决方案:
```
$ sudo apt-get install python-dev libffi-dev libssl-dev
$ pip install 'requests[security]'
```
相应的依赖都会被装上:
```
Installing collected packages: idna, pyasn1, six, enum34, ipaddress, pycparser, cffi, cryptography, pyOpenSSL, ndg-httpsclient
Successfully installed cffi-1.5.2 cryptography-1.3.1 enum34-1.1.3 idna-2.1 ipaddress-1.0.16 ndg-httpsclient-0.4.0 pyOpenSSL-16.0.0 pyasn1-0.1.9 pycparser-2.14 six-1.10.0
```


## UUID

[https://docs.python.org/2/library/uuid.html#example](https://docs.python.org/2/library/uuid.html#example)


## SendCloud

[http://sendcloud.sohu.com/](http://sendcloud.sohu.com/)

## QiNiu

安装
```
$ pip install qiniu
```

[http://www.qiniu.com/](http://www.qiniu.com/)

[python SDK 官方版](https://github.com/qiniu/python-sdk)

[python SDK 社区版](https://github.com/yueyoum/seven-cow)

[Flask 扩展](https://github.com/csuzhangxc/Flask-QiniuStorage)


## 注册邮箱验证

主要验证两点:
- 邮箱是否可达
- 是否本人操作

验证方式:
- 一、验证 token:https://www.***.com/email/signup/token
- 二、验证签名:https://www.***.com/email/signup/sign

显然第二种方式更好,不需要生成一个一次性的 token 并把它们存到数据库中

参考:[http://itsdangerous.readthedocs.io/en/latest/](http://itsdangerous.readthedocs.io/en/latest/)


## 签名模块

中文文档:[http://itsdangerous.readthedocs.io/en/latest/](http://itsdangerous.readthedocs.io/en/latest/)


## 常用链接的处理

添加锚点: url_for('end_points', _anchor='part_id')

_external=True 绝对路径


## 编码规范(建议)

新增表单
```
@app.route('/add/', methods=['GET', 'POST'])
@login_required
def add():
    """
    添加
    """
    form = AddForm(request.form)
    if request.method == 'POST':
        if form.validate_on_submit():
            from datetime import datetime
            current_time = datetime.utcnow()
            info = {
                'author': form.author.data,
                'title': form.title.data,
                'pub_date': form.pub_date.data,
                'add_time': current_time,
                'edit_time': current_time,
            }
            result = add(info)
            if result:
                flash(u'Add Success', 'success')
            else:
                flash(u'Add Failed', 'warning')
    return render_template('add.html', form=form)
```

编辑表单
```
@app.route('/edit/<int:id>/', methods=['GET', 'POST'])
@login_required
def edit(id):
    """
    编辑
    """
    form = EditForm(request.form)
    if request.method == 'GET':
        info = get_info(id)
        if blog_info:
            form.author.data = info.author
            form.title.data = info.title
            form.pub_date.data = info.pub_date
        else:
            return redirect(url_for('index'))
    if request.method == 'POST':
        if form.validate_on_submit():
            from datetime import datetime
            info = {
                'author': form.author.data,
                'title': form.title.data,
                'pub_date': form.pub_date.data,
                'edit_time': datetime.utcnow(),
            }
            result = edit(id, info)
            if result:
                flash(u'Edit Success', 'success')
            else:
                flash(u'Edit Failed', 'warning')
    return render_template('edit.html', id=id, form=form)
```


## 模板引擎

[https://github.com/aui/artTemplate](https://github.com/aui/artTemplate)

[https://github.com/wycats/handlebars.js](https://github.com/wycats/handlebars.js)

模板引擎与jinja结合
```
{% raw %}
...
{% endraw %}
```


## 模块导入更新

旧模块 | 新模块
| --- | --- |
flask.ext.login | flask_login
flask.ext.wtf | flask_wtf
flask.ext.sqlalchemy | flask_sqlalchemy
flask.ext.mail | flask_mail

表单里,用 FlaskForm 替代历史版本 Form
```
from flask.ext.wtf import Form
替换为
from flask_wtf import FlaskForm
```


## 过滤器

注册自定义过滤器
```
方式一:
@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]

方式二:
def reverse_filter(s):
    return s[::-1]
app.jinja_env.filters['reverse'] = reverse_filter
```

过滤器使用
```
{% for x in mylist | reverse %}
{% endfor %}
```


## 用户注册

注册方式 | 校验方式
| --- | --- |
手机号码 | 短信验证码
邮箱 | 发送带身份信息加密的链接,点击校验通过后即确认身份
第三方 | oauth

注意:如果需要兼容国际手机号码注册,需要添加国家区号

平台内先注册,后绑定第三方账号


## 手机注册

检查手机号码
检查图形码
获取短信验证码
    1、前台页面60S倒计时,60S后恢复
    2、后台生成短信码 session存储
    3、发送短信
提交注册(校验 表单与session 短信验证码)


## 忘记密码


## 页面全选功能设计
```
$("#check_all").change(function(){ 
    $('.check_children').prop("checked",this.checked); 
}); 
```


## 业务逻辑确认外键还是数据库设置外键

效率与一致性的权衡

主外键只是一种保持数据一致性的手段之一,如果有别的方式来保持数据一致性(业务逻辑保持数据一致性),那么数据库不设置主外键也是可以的。


## 数据库设计 NOT NULL 与 DEFAULT(默认非null值)

1、NOT NULL DEFAULT 同时设置,可以不插入字段,但是不能插入 null 值
2、仅仅设置 DEFAULT,可以不插入字段,也可插入 null 值
3、仅仅设置 NOT NULL,可以不插入字段,不可插入 null 值

通常,DEFAULT 的设置会简化代码的设计,
同时考虑索引效率,会将需要建立索引的字段添加 DEFAULT,因为 null是无法比较的
```
MariaDB [(none)]> select 2=2, 'a'='a', NULL=NULL;
+-----+---------+-----------+
| 2=2 | 'a'='a' | NULL=NULL |
+-----+---------+-----------+
|   1 |       1 |      NULL |
+-----+---------+-----------+
1 row in set (0.00 sec)
```

## 关于数据库索引优化

索引的类型

索引名称 | 定义 | 描述
| --- | --- | --- |
普通索引 | key | 唯一的作用就是加快查询的速度
主键索引 | primary key | 字段具备唯一性 一张数据表中只有一个
唯一索引 | unique key | 保证数据唯一性
联合索引 | key(a,b,c) | 实际上是建立3个索引(a,b,c;a,b;a),每个索引都包含a
外键索引 | - | 就是用来维护数据表之间的相关性的,并且会导致数据的写入等操作的速度过慢,所以好像没啥用(对于较大的项目)
全文索引 | FULLTEXT(column1, column2) | mysql5.6以前的InnoDB表不支持。使用:WHERE MATCH(column) AGAINST('search_content')


能否用到索引 | 操作符
| --- | --- |
可以用到 | <, <=, =, >, >=, BETWEEN, IN, LIKE _%
不能用到 | <>, !=, not in, LIKE %_

对于比较长的字符串比如varchar(255)类型字段,可为该字段的前n个值建立索引,可用以下语句确定索引的长度
```
select count(distinct substring(字段,1,结束位置)) from 表
```

EXPLAIN 测试SQL执行计划


## 基于 redisde 会话管理

登陆成功后,即可看到session信息
```
127.0.0.1:6379> keys *
1) "session:.eJw9kF1vgjAYhf_K0msvsOASTbww1jkMbwmk1bU3RD5caWUoyNAa__uIS8y5PMnz5Jw7Sg5N0So0uzRdMUJJmaPZHb2laIbAZhMgEYZqY8CKnla8D5nxQGc3uhYerMEBZjDV2VhYvwcilcDcBcxxSGJDdV5KkpchiVzBVi7stlpqH0vmX0PiO0C4pYxWYI0n7JAq1oPHEXp1kyxWIVGGDsxwxz2h1VGyaHBFPeBoAhZcsaNHqmHosjl6jFDWNofkUpvi5zVBEo6BDWjsD6rMk-x7TK1UgGMDjA_z-I3q1QS070itNCXGkYv5E3c-J_W-u6imyMvmRdx_xk5G6t_ALjpYen2gF-8hWfSwnLYpzk9pOVX5V1yn7uZUVFsTuB_XoP8ndm3RPA9GLnr8AWDyey8.C58cvw._6DL2RmlQ9oqsw8IlGuX0FvLGts"
127.0.0.1:6379> type "session:.eJw9kF1vgjAYhf_K0msvsOASTbww1jkMbwmk1bU3RD5caWUoyNAa__uIS8y5PMnz5Jw7Sg5N0So0uzRdMUJJmaPZHb2laIbAZhMgEYZqY8CKnla8D5nxQGc3uhYerMEBZjDV2VhYvwcilcDcBcxxSGJDdV5KkpchiVzBVi7stlpqH0vmX0PiO0C4pYxWYI0n7JAq1oPHEXp1kyxWIVGGDsxwxz2h1VGyaHBFPeBoAhZcsaNHqmHosjl6jFDWNofkUpvi5zVBEo6BDWjsD6rMk-x7TK1UgGMDjA_z-I3q1QS070itNCXGkYv5E3c-J_W-u6imyMvmRdx_xk5G6t_ALjpYen2gF-8hWfSwnLYpzk9pOVX5V1yn7uZUVFsTuB_XoP8ndm3RPA9GLnr8AWDyey8.C58cvw._6DL2RmlQ9oqsw8IlGuX0FvLGts"
string
127.0.0.1:6379> get "session:.eJw9kF1vgjAYhf_K0msvsOASTbww1jkMbwmk1bU3RD5caWUoyNAa__uIS8y5PMnz5Jw7Sg5N0So0uzRdMUJJmaPZHb2laIbAZhMgEYZqY8CKnla8D5nxQGc3uhYerMEBZjDV2VhYvwcilcDcBcxxSGJDdV5KkpchiVzBVi7stlpqH0vmX0PiO0C4pYxWYI0n7JAq1oPHEXp1kyxWIVGGDsxwxz2h1VGyaHBFPeBoAhZcsaNHqmHosjl6jFDWNofkUpvi5zVBEo6BDWjsD6rMk-x7TK1UgGMDjA_z-I3q1QS070itNCXGkYv5E3c-J_W-u6imyMvmRdx_xk5G6t_ALjpYen2gF-8hWfSwnLYpzk9pOVX5V1yn7uZUVFsTuB_XoP8ndm3RPA9GLnr8AWDyey8.C58cvw._6DL2RmlQ9oqsw8IlGuX0FvLGts"
"(dp0\nS'csrf_token'\np1\nS'c44590d3e1d7be4250ff8c88e1b807832939b8ab'\np2\nsS'_fresh'\np3\nI01\nsS'user_id'\np4\nV3\np5\nsS'_id'\np6\nS'3790462bd3606e09982724f80c4196675c2006ace73e684d67bd7b847a171ecf26e2182405353f398c63bdc364b12e4a88d46a9e8b8ee466403d9337ace638b7'\np7\ns."
127.0.0.1:6379>
```


## 并发测试

flask 自带的 BaseHTTPServer 性能太差,测试过程中,连续刷新10次左右竟然报错
```
IOError: [Errno 32] Broken pipe
```

测试图形验证码并发
```
✗ ab -n 1000 -c 100 http://127.0.0.1:8000/captcha/get_code/reg/
```


## 事务一致性

分布式架构下,无法做到跨服务事务,只能通过逻辑事务,回滚采用补偿方案处理


## ajax 前后端规范

后端返回结构
```
json.dumps({'result': True})
json.dumps({'result': False, 'msg': u'错误消息'})
json.dumps({'result': False, 'msg': u'错误消息', 'location': 'http://www.baidu.com'})
```

前端处理逻辑
```

```

## sqlalchemy.exc.OperationalError
OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away')


## sqlalchemy.exc.InvalidRequestError
StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back

检查配置
```
MariaDB [flask_project]> show global variables like "%timeout%";
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 5        |
| deadlock_timeout_long       | 50000000 |
| deadlock_timeout_short      | 10000    |
| delayed_insert_timeout      | 300      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 50       |
| innodb_rollback_on_timeout  | OFF      |
| interactive_timeout         | 28800    |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 30       |
| net_write_timeout           | 60       |
| slave_net_timeout           | 3600     |
| thread_pool_idle_timeout    | 60       |
| wait_timeout                | 600      |
+-----------------------------+----------+
14 rows in set (0.00 sec)
```

查看连接情况
```
MariaDB [flask_project]> show processlist;
+-----+------+------------------+---------------+---------+------+-------+------------------+----------+
| Id  | User | Host             | db            | Command | Time | State | Info             | Progress |
+-----+------+------------------+---------------+---------+------+-------+------------------+----------+
| 176 | root | 172.17.0.5:46672 | flask_project | Query   |    0 | init  | show processlist |    0.000 |
| 180 | root | 172.17.0.1:39592 | flask_project | Sleep   |  284 |       | NULL             |    0.000 |
+-----+------+------------------+---------------+---------+------+-------+------------------+----------+
2 rows in set (0.00 sec)
```

查看当前打开的连接的数量
```
MariaDB [flask_project]> show status like '%Threads_connected%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 2     |
+-------------------+-------+
1 row in set (0.01 sec)
```

修改连接超时时间(测试)
```
MariaDB [flask_project]> set global wait_timeout=6;
```

```
MariaDB [flask_project]> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 600   |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [flask_project]> show variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 28800 |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [flask_project]> show global status like 'uptime';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| Uptime        | 204519 |
+---------------+--------+
1 row in set (0.00 sec)

MariaDB [flask_project]> show global variables like 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 16777216 |
+--------------------+----------+
1 row in set (0.00 sec)
```


错误重现:

当有事务没有提交或者没有回滚时,sqlalchemy 的连接回收时间(SQLALCHEMY_POOL_RECYCLE)大于数据库关闭等待连接时间(global wait_timeout);

一旦数据库连接超时自动断开,此时 sqlalchemy 尝试连接数据库,会出现 OperationalError: (_mysql_exceptions.OperationalError) (2006, 'MySQL server has gone away')

处理方案:
1. sqlalchemy 的超时时间 小于 数据库的超时时间
2. 代码操作数据库,立即提交事务,错误回滚

官方说明:

http://flask-sqlalchemy.pocoo.org/2.2/config/#timeouts


## gunicorn [CRITICAL] WORKER TIMEOUT


## jinja 模板递归

关键词 recursive

```
{% for item in [8,[[10,11,34],2],[3,4,5,[6,7,8]]] recursive %}
    {% if loop.first %}
        <br/>{{ '----'*loop.depth }}开始{{ loop.depth }}<br/>
    {% endif %}
    {{ '----'*loop.depth }}Depth: {{ loop.depth }}
    {% if item[0] %}
        {{ loop(item) }}
    {% else %}
        Number: {{ item }} ;<br/>
    {% endif %}
    {% if loop.last %}
        {{ '----'*loop.depth }}结束{{ loop.depth }}<br/>
    {% endif %}
{% endfor %}
```

递归循环结果:
```
----开始1
----Depth: 1 Number: 8 ;
----Depth: 1
--------开始2
--------Depth: 2
------------开始3
------------Depth: 3 Number: 10 ;
------------Depth: 3 Number: 11 ;
------------Depth: 3 Number: 34 ;
------------结束3
--------Depth: 2 Number: 2 ;
--------结束2
----Depth: 1
--------开始2
--------Depth: 2 Number: 3 ;
--------Depth: 2 Number: 4 ;
--------Depth: 2 Number: 5 ;
--------Depth: 2
------------开始3
------------Depth: 3 Number: 6 ;
------------Depth: 3 Number: 7 ;
------------Depth: 3 Number: 8 ;
------------结束3
--------结束2
----结束1
```

## 在 jinja2 macro 使用 current_user

需要带使用上下文参数(with context)
```
{% from "macros/comments.html" import comment_form with context %}
```


## 银行卡验证接口

http://www.apistore.cn/

http://v.gotoway.com/api/v4/bankCard?key=0341749f1adc9e4f47f6a936e7ed9b46&bankcard=123456


```
{
"error_code": 0,
"reason": "Succes",
"result": {
    "abbreviation": "ABC",
    "bankimage": "http://auth.apis.la/bank/3_ABC.png",
    "bankname": "农业银行",
    "banknum": "1030000",
    "bankurl": "http://www.abchina.com/",
    "cardlength": "19",
    "cardname": "金穗通宝卡(银联卡)",
    "cardprefixlength": "6",
    "cardprefixnum": "622848",
    "cardtype": "银联借记卡",
    "enbankname": "Agricultural Bank of China",
    "isLuhn": true,
    "iscreditcard": 1,
    "servicephone": "95599"
},
"ordersign": "20170621091044215952509756"
}
```

认证类型:
- 实名认证 (姓名、身份证号码)
- 银行卡三要素认证 (银行卡姓名/卡号/身份证)
- 银行卡四要素认证 (银行卡姓名/卡号/身份证/手机号)


## 参数优化

连接池大小 == web进程数 == CPU核心数

SQLALCHEMY_POOL_RECYCLE < wait_timeout


```
MariaDB [flask_project]> show global variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 100   |
+-----------------+-------+
1 row in set (0.00 sec)
MariaDB [flask_project]> set global max_connections=1000;
```
set global max_connections=1000;


## 流式处理的几种方式

- HTML5 Server-Sent Events
- Flask-SSE

http://dormousehole.readthedocs.io/en/latest/patterns/streaming.html

http://flask.pocoo.org/snippets/118/

http://www.python-requests.org/en/master/user/advanced/#streaming-requests

http://flask-sse.readthedocs.io/en/latest/quickstart.html


## 日志

使用 supervisor 管理进程,终端输出的日志信息,被supervisor截获后,写入stderr_logfile,一直想不通

查看 logging 模块源码

```
class StreamHandler(Handler):
    """
    A handler class which writes logging records, appropriately formatted,
    to a stream. Note that this class does not close the stream, as
    sys.stdout or sys.stderr may be used.
    """

    def __init__(self, stream=None):
        """
        Initialize the handler.

        If stream is not specified, sys.stderr is used.
        """
        Handler.__init__(self)
        if stream is None:
            stream = sys.stderr
        self.stream = stream
```

StreamHandler 默认是按照标准错误输出处理

print 则使用的是标准输出


## 分库分表

垂直分库

水平分表

- 分库

http://flask-sqlalchemy.pocoo.org/2.1/binds/
```
SQLALCHEMY_DATABASE_URI = 'postgres://localhost/main'
SQLALCHEMY_BINDS = {
    'users':        'mysqldb://localhost/users',
    'appmeta':      'sqlite:////path/to/appmeta.db'
}
```

```
class User(db.Model):
    __bind_key__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
```

使用 SQLALCHEMY_BINDS() 和 **\_\_bind_key__**

- 分表

网友方案,先拿来
```
class GoodsDesc(object):

    _mapper = {}

    @staticmethod
    def model(goods_id):
        table_index = goods_id%100
        class_name = 'GoodsDesc_%d' % table_index

        ModelClass = GoodsDesc._mapper.get(class_name, None)
        if ModelClass is None:
            ModelClass = type(class_name, (db.Model,), {
                '__module__' : __name__,
                '__name__' : class_name,
                '__tablename__' : 'goods_desc_%d' % table_index,

                'goods_id' : db.Column(db.Integer, primary_key=True),
                'goods_desc' : db.Column(db.Text, default=None),
            })
            GoodsDesc._mapper[class_name] = ModelClass

        cls = ModelClass()
        cls.goods_id = goods_id
        return cls

# 外部代码调用如例如下:
# -----------------------

# 新增插入
gdm = GoodsDesc.model(goods_id)
gdm.goods_desc = 'desc'
db.session.add(gd)

# 查询
gdm = GoodsDesc.model(goods_id)
gd = gdm.query.filter_by(goods_id=goods_id).first()
```

待改进
```
_mapper = {}


def shard(self, pk_id):
    """
    分表
    :param self:
    :param pk_id:
    :return:
    """
    table_index = pk_id % 16
    class_name = '%s_%02d' % (self.name, table_index)

    model_class = _mapper.get(class_name, None)
    if model_class is None:
        model_class = type(class_name, (Base,), {
            '__module__': __name__,
            '__name__': class_name,
            '__tablename__': '%s_%d' % (self.__table__.name, table_index),

            'goods_id': db.Column(db.Integer, primary_key=True),
            'goods_desc': db.Column(db.Text, default=None),
        })
        _mapper[class_name] = model_class

    cls = model_class()
    cls.id = pk_id
    return cls
```


## 单一架构 VS 微服务架构


## 信息修改
账号修改
密码修改


## Todo:

- 第三方登陆

- 第三方支付

- 邮件列表的绑定和解绑

- 找回密码安全设置
参考:[密码找回功能可能存在的问题](http://drops.wooyun.org/web/3295)

- 接口参数签名校验的必要性
参考:[在线支付逻辑漏洞总结](http://drops.wooyun.org/papers/345)

- 检查数据重复, 处理效率问题

- 页面导出csv

- 各大搜索引擎提交入口

- 用户推广,注册邀请


================================================
FILE: app_api/README.md
================================================
## App 专用


================================================
FILE: app_api/__init__.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: __init__.py.py
@time: 2017/4/19 下午2:24
"""


def func():
    pass


class Main(object):
    def __init__(self):
        pass


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/README.md
================================================
## 运营后台


================================================
FILE: app_backend/__init__.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: __init__.py
@time: 2017/4/9 上午10:11
"""

from logging.config import dictConfig
from config import current_config

from flask import Flask
from flask_login import LoginManager
from flask_moment import Moment
from flask_oauthlib.client import OAuth
from flask_principal import Principal

from app_backend.lib.qiniu_store import QiNiuClient
from app_backend.lib.redis_session import RedisSessionInterface
from app_backend.lib.sendcloud import SendCloudClient
from app_backend.lib.sms_chuanglan_iso import SmsChuangLanIsoApi


app = Flask(__name__)
app.config.from_object(current_config)
app.config['REMEMBER_COOKIE_NAME'] = 'r_a'
app.session_cookie_name = 's_a'
app.session_interface = RedisSessionInterface(prefix='s:a:', **app.config['REDIS'])

login_manager = LoginManager()
login_manager.init_app(app)  # setup_app 方法已淘汰
login_manager.login_view = 'login'
login_manager.login_message = u'请登录后操作'  # 设置登录提示消息
login_manager.login_message_category = 'info'  # 设置消息分类

# 权限管理插件
principals = Principal(app)

# Moment 时间插件
moment = Moment(app)

# 短信通道
sms_client = SmsChuangLanIsoApi(app.config['SMS']['UN'], app.config['SMS']['PW'])

# SendCloud 邮件
send_cloud_client = SendCloudClient(app)

# 七牛云存储
qi_niu_client = QiNiuClient(app)

# 第三方开放授权登录
oauth = OAuth(app)

# GitHub
oauth_github = oauth.remote_app(
    'github',
    **app.config['GITHUB_OAUTH']
)

# QQ
oauth_qq = oauth.remote_app(
    'qq',
    **app.config['QQ_OAUTH']
)

# WeiBo
oauth_weibo = oauth.remote_app(
    'weibo',
    **app.config['WEIBO_OAUTH']
)

# Google
# 要银子,妹的


# 配置日志
dictConfig(app.config['LOG_CONFIG'])

if not app.config['DEBUG']:
    import logging
    from logging.handlers import SMTPHandler
    credentials = None
    if app.config['MAIL_USERNAME'] or app.config['MAIL_PASSWORD']:
        credentials = (app.config['MAIL_USERNAME'], app.config['MAIL_PASSWORD'])
    mail_handler = SMTPHandler(
        (app.config['MAIL_SERVER'], app.config['MAIL_PORT']),
        app.config['MAIL_DEFAULT_SENDER'][1],
        app.config['ADMINS'],
        'App Error Message',
        credentials
    )
    mail_handler.setLevel(logging.DEBUG)
    app.logger.addHandler(mail_handler)


# 这个 import 语句放在这里, 防止views, models import发生循环import
from app_backend import models, tasks

# 导入视图(不使用蓝图的单模式方式)
from app_backend import views

# 导入视图(不使用蓝图的多模块方式)
# from application.views import auth
# from application.views import blog
# from application.views import reg
# from application.views import site
# from application.views import user

# 导入蓝图(使用蓝图的多模块方式)
from app_backend.views.admin import bp_admin
from app_backend.views.apply_get import bp_apply_get
from app_backend.views.apply_put import bp_apply_put
from app_backend.views.order import bp_order
from app_backend.views.score import bp_score
from app_backend.views.wallet import bp_wallet
# from app_backend.views.blog import bp_blog
# from app_backend.views.file import bp_file
# from app_backend.views.reg import bp_reg
from app_backend.views.user import bp_user
from app_backend.views.settings import bp_settings
from app_backend.views.complaint import bp_complaint
from app_backend.views.message import bp_message
from app_backend.views.stats import bp_stats
from app_backend.views.active import bp_active
from app_backend.views.scheduling import bp_scheduling


# 注册蓝图
app.register_blueprint(bp_admin)
app.register_blueprint(bp_apply_get)
app.register_blueprint(bp_apply_put)
app.register_blueprint(bp_order)
app.register_blueprint(bp_score)
app.register_blueprint(bp_wallet)
# app.register_blueprint(bp_blog)
# app.register_blueprint(bp_file)
# app.register_blueprint(bp_reg)
app.register_blueprint(bp_user)
app.register_blueprint(bp_settings)
app.register_blueprint(bp_complaint)
app.register_blueprint(bp_message)
app.register_blueprint(bp_stats)
app.register_blueprint(bp_active)
app.register_blueprint(bp_scheduling)

# 导入自定义过滤器
from app_backend import filters


================================================
FILE: app_backend/api/__init__.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: __init__.py.py
@time: 2017/3/10 下午11:32
"""


def func():
    pass


class Main(object):
    def __init__(self):
        pass


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/api/active.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: active.py
@time: 2017/5/14 上午1:42
"""


from datetime import datetime
from app_backend.database import db
from app_backend.models import Active, ActiveItem, User
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete
from app_common.maps.status_audit import *
from app_common.maps.type_active import *
from app_common.maps.status_active import *


def get_active_row_by_id(active_id):
    """
    通过 id 获取激活信息
    :param active_id:
    :return: None/object
    """
    return get_row_by_id(Active, active_id)


def get_active_row(*args, **kwargs):
    """
    获取激活信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Active, *args, **kwargs)


def add_active(active_data):
    """
    添加激活信息
    :param active_data:
    :return: None/Value of active.id
    """
    return add(Active, active_data)


def edit_active(active_id, active_data):
    """
    修改激活信息
    :param active_id:
    :param active_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Active, active_id, active_data)


def delete_active(active_id):
    """
    删除激活信息
    :param active_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Active, active_id)


def get_active_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取激活列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Active, page, per_page, *args, **kwargs)
    return rows


def give_active(user_id_active, amount=1):
    """
    赠送激活数量
    :param user_id_active:
    :param amount:
    :return:
    """
    try:

        current_time = datetime.utcnow()

        # 添加激活码消费明细
        active_item_data = {
            'user_id': 0,
            'type': TYPE_ACTIVE_GIVE,
            'amount': amount,
            'sc_id': user_id_active,
            'status_audit': STATUS_AUDIT_SUCCESS,
            'audit_time': current_time,
            'create_time': current_time,
            'update_time': current_time,
        }
        db.session.add(ActiveItem(**active_item_data))

        # 新增接收用户激活码总数量
        active_obj = db.session.query(Active).filter(Active.user_id == user_id_active)
        active_info = active_obj.first()
        if active_info:
            active_data = {
                'user_id': user_id_active,
                'amount': active_info.amount + amount,
                'update_time': current_time,
            }
            active_obj.update(active_data)
        else:
            active_data = {
                'user_id': user_id_active,
                'amount': amount,
                'create_time': current_time,
                'update_time': current_time,
            }
            db.session.add(Active(**active_data))

        db.session.commit()
        return True
    except Exception as e:
        db.session.rollback()
        raise e


================================================
FILE: app_backend/api/active_item.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: active_item.py
@time: 2017/5/20 下午6:29
"""


from app_backend.models import ActiveItem
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete


def get_active_item_row_by_id(active_item_id):
    """
    通过 id 获取激活信息
    :param active_item_id:
    :return: None/object
    """
    return get_row_by_id(ActiveItem, active_item_id)


def get_active_item_row(*args, **kwargs):
    """
    获取激活信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(ActiveItem, *args, **kwargs)


def add_active_item(active_item_data):
    """
    添加激活信息
    :param active_item_data:
    :return: None/Value of active.id
    """
    return add(ActiveItem, active_item_data)


def edit_active_item(active_item_id, active_item_data):
    """
    修改激活信息
    :param active_item_id:
    :param active_item_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(ActiveItem, active_item_id, active_item_data)


def delete_active_item(active_item_id):
    """
    删除激活信息
    :param active_item_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(ActiveItem, active_item_id)


def get_active_item_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取激活列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(ActiveItem, page, per_page, *args, **kwargs)
    return rows


================================================
FILE: app_backend/api/admin.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: admin.py
@time: 17-4-20 下午10:04
"""


from app_backend.login import LoginUser
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete, update_rows


def get_admin_row_by_id(user_auth_id):
    """
    通过 id 获取用户信息
    :param user_auth_id:
    :return: None/object
    """
    return get_row_by_id(LoginUser, user_auth_id)


def get_admin_row(*args, **kwargs):
    """
    获取用户信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(LoginUser, *args, **kwargs)


def add_admin(user_auth_data):
    """
    添加用户信息
    :param user_auth_data:
    :return: None/Value of user.id
    """
    return add(LoginUser, user_auth_data)


def edit_admin(user_auth_id, user_auth_data):
    """
    修改用户信息
    :param user_auth_id:
    :param user_auth_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(LoginUser, user_auth_id, user_auth_data)


def delete_admin(user_auth_id):
    """
    删除用户信息
    :param user_auth_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(LoginUser, user_auth_id)


def get_admin_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取用户列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(LoginUser, page, per_page, *args, **kwargs)
    return rows


def update_admin_rows(data, *args, **kwargs):
    """
    批量更新用户信息
    """
    return update_rows(LoginUser, data, *args, **kwargs)


================================================
FILE: app_backend/api/admin_role.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: admin_role.py
@time: 2017/6/14 上午11:07
"""


from app_backend.models import AdminRole
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete, get_lists


def get_admin_role_row_by_id(admin_role_id):
    """
    通过 id 获取角色信息
    :param admin_role_id:
    :return: None/object
    """
    return get_row_by_id(AdminRole, admin_role_id)


def get_admin_role_row(*args, **kwargs):
    """
    获取角色信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(AdminRole, *args, **kwargs)


def add_admin_role(admin_role_data):
    """
    添加角色信息
    :param admin_role_data:
    :return: None/Value of author.id
    """
    return add(AdminRole, admin_role_data)


def edit_admin_role(admin_role_id, admin_role_data):
    """
    修改角色信息
    :param admin_role_id:
    :param admin_role_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(AdminRole, admin_role_id, admin_role_data)


def delete_admin_role(admin_role_id):
    """
    删除角色信息
    :param admin_role_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(AdminRole, admin_role_id)


def get_admin_role_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取角色列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(AdminRole, page, per_page, *args, **kwargs)
    return rows


def get_admin_role_lists(*args, **kwargs):
    """
    获取角色列表
    :param args:
    :param kwargs:
    :return: None/list
    """
    return get_lists(AdminRole, *args, **kwargs)


================================================
FILE: app_backend/api/apply_get.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: apply_get.py
@time: 2017/4/13 上午11:27
"""


from datetime import datetime
import traceback

from sqlalchemy import func

from app_backend.database import db
from app_backend.models import ApplyGet, Order, ApplyPut
from app_backend.tools.db import get_row, get_rows_by_ids, get_lists, get_rows, get_row_by_id, add, edit, delete
from app_common.maps.status_audit import STATUS_AUDIT_SUCCESS
from app_common.maps.status_order import STATUS_ORDER_COMPLETED, STATUS_ORDER_PROCESSING
from app_common.tools.date_time import get_current_day_time_ends, get_hours, time_local_to_utc, \
    get_current_month_time_ends, get_days, get_current_year_time_ends, get_months


def get_apply_get_row_by_id(apply_get_id):
    """
    通过 id 获取提现申请信息
    :param apply_get_id:
    :return: None/object
    """
    return get_row_by_id(ApplyGet, apply_get_id)


def get_apply_get_row(*args, **kwargs):
    """
    获取提现申请信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(ApplyGet, *args, **kwargs)


def add_apply_get(apply_get_data):
    """
    添加提现申请信息
    :param apply_get_data:
    :return: None/Value of apply_get.id
    """
    return add(ApplyGet, apply_get_data)


def edit_apply_get(apply_get_id, apply_get_data):
    """
    修改提现申请信息
    :param apply_get_id:
    :param apply_get_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(ApplyGet, apply_get_id, apply_get_data)


def delete_apply_get(apply_get_id):
    """
    删除提现申请信息
    :param apply_get_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(ApplyGet, apply_get_id)


def get_apply_get_rows_by_ids(ids):
    """
    获取提现申请列表通过主键列表
    :param ids:
    :return: list
    """
    return get_rows_by_ids(ApplyGet, ids)


def get_apply_get_lists(*args, **kwargs):
    """
    获取提现申请列表
    :param args:
    :param kwargs:
    :return: None/list
    """
    return get_lists(ApplyGet, *args, **kwargs)


def get_apply_get_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取提现申请列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(ApplyGet, page, per_page, *args, **kwargs)
    return rows


def apply_get_match(apply_get_id, apply_put_ids, accept_split=0):
    """
    提现申请匹配
    :param apply_get_id:
    :param apply_put_ids:
    :param accept_split:
    :return:
    """
    from app_backend.api.apply_put import get_apply_put_rows_by_ids

    apply_get_info = get_apply_get_row_by_id(apply_get_id)

    # 判断是否已经匹配
    if apply_get_info.status_order == int(STATUS_ORDER_COMPLETED):
        raise Exception(u'不能重复匹配')
    apply_put_list = get_apply_put_rows_by_ids(apply_put_ids)

    # 判断是否同一个人
    apply_put_user_ids = [apply_put_item.user_id for apply_put_item in apply_put_list]
    if apply_get_info.user_id in apply_put_user_ids:
        raise Exception(u'不能匹配给自己')

    # 判断金额
    money_need_match = apply_get_info.money_apply - apply_get_info.money_order

    apply_put_amount = sum([apply_put_item.money_apply-apply_put_item.money_order for apply_put_item in apply_put_list])
    # 如果接收拆分,判断被拆金额是否大于被匹配金额
    if accept_split:
        if money_need_match < apply_put_amount:
            raise Exception(u'选择金额太大')
    elif money_need_match != apply_put_amount:
        raise Exception(u'金额不匹配')

    # 循环投资申请,生成对应的订单
    try:
        money_order = 0
        for apply_put_item in apply_put_list:
            money_match = apply_put_item.money_apply - apply_put_item.money_order
            current_time = datetime.utcnow()

            order_data = {
                'apply_put_id': apply_put_item.id,
                'apply_get_id': apply_get_id,
                'apply_put_uid': apply_put_item.user_id,
                'apply_get_uid': apply_get_info.user_id,
                'money': money_match,
                'status_audit': STATUS_AUDIT_SUCCESS,
                'audit_time': current_time,
                'create_time': current_time,
                'update_time': current_time,
            }
            db.session.add(Order(**order_data))

            # 更新投资申请状态
            apply_put_update_info = {
                'money_order': apply_put_item.money_order + money_match,
                'status_order': STATUS_ORDER_COMPLETED,
                'update_time': current_time,
            }
            apply_put_obj = db.session.query(ApplyPut).filter(ApplyPut.id == apply_put_item.id)
            apply_put_obj.update(apply_put_update_info)

            money_order += money_match

        # 更新提现订单金额和申请状态
        current_time = datetime.utcnow()
        apply_get_update_data = {
            'money_order': ApplyGet.money_order + money_order,
            'status_order': STATUS_ORDER_COMPLETED if money_order == money_need_match else STATUS_ORDER_PROCESSING,
            'update_time': current_time,
        }
        # result = edit_apply_get(apply_get_id, apply_get_update_info)
        apply_get_obj = db.session.query(ApplyGet).filter(ApplyGet.id == apply_get_id)
        result = apply_get_obj.update(apply_get_update_data)

        db.session.commit()
        return result
    except Exception as e:
        print traceback.print_exc()
        db.session.rollback()
        raise e


def apply_get_stats(time_based='hour'):
    """
    提现申请统计
    :return:
    """
    # 按小时统计
    if time_based == 'hour':
        start_time, end_time = get_current_day_time_ends()
        hours = get_hours(False)
        hours_zerofill = get_hours()
        result = dict(zip(hours, [0] * len(hours)))
        rows = db.session \
            .query(func.hour(ApplyGet.create_time).label('hour'), func.sum(ApplyGet.money_apply)) \
            .filter(ApplyGet.create_time >= time_local_to_utc(start_time),
                    ApplyGet.create_time <= time_local_to_utc(end_time)) \
            .group_by('hour') \
            .limit(len(hours)) \
            .all()
        result.update(dict(rows))
        return [(hours_zerofill[i], result[hour]) for i, hour in enumerate(hours)]
    # 按日期统计
    if time_based == 'date':
        start_time, end_time = get_current_month_time_ends()
        today = datetime.today()
        days = get_days(year=today.year, month=today.month, zerofill=False)
        days_zerofill = get_days(year=today.year, month=today.month)
        result = dict(zip(days, [0] * len(days)))
        rows = db.session \
            .query(func.day(ApplyGet.create_time).label('date'), func.sum(ApplyGet.money_apply)) \
            .filter(ApplyGet.create_time >= time_local_to_utc(start_time),
                    ApplyGet.create_time <= time_local_to_utc(end_time)) \
            .group_by('date') \
            .limit(len(days)) \
            .all()
        result.update(dict(rows))
        return [(days_zerofill[i], result[day]) for i, day in enumerate(days)]
    # 按月份统计
    if time_based == 'month':
        start_time, end_time = get_current_year_time_ends()
        months = get_months(False)
        months_zerofill = get_months()
        result = dict(zip(months, [0] * len(months)))
        rows = db.session \
            .query(func.month(ApplyGet.create_time).label('month'), func.sum(ApplyGet.money_apply)) \
            .filter(ApplyGet.create_time >= time_local_to_utc(start_time),
                    ApplyGet.create_time <= time_local_to_utc(end_time)) \
            .group_by('month') \
            .limit(len(months)) \
            .all()
        result.update(dict(rows))
        return [(months_zerofill[i], result[month]) for i, month in enumerate(months)]


================================================
FILE: app_backend/api/apply_put.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: apply_put.py
@time: 2017/4/13 下午9:45
"""


from datetime import datetime
import traceback

from sqlalchemy import func

from app_backend.models import ApplyGet, Order, ApplyPut
from app_backend.tools.db import get_row, get_rows_by_ids, get_lists, get_rows, get_row_by_id, add, edit, delete
from app_backend.database import db
from app_common.maps.status_audit import STATUS_AUDIT_SUCCESS
from app_common.maps.status_order import STATUS_ORDER_COMPLETED, STATUS_ORDER_PROCESSING
from app_common.tools.date_time import get_current_day_time_ends, get_hours, time_local_to_utc, \
    get_current_month_time_ends, get_days, get_current_year_time_ends, get_months


def get_apply_put_row_by_id(apply_put_id):
    """
    通过 id 获取投资申请信息
    :param apply_put_id:
    :return: None/object
    """
    return get_row_by_id(ApplyPut, apply_put_id)


def get_apply_put_row(*args, **kwargs):
    """
    获取投资申请信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(ApplyPut, *args, **kwargs)


def add_apply_put(apply_put_data):
    """
    添加投资申请信息
    :param apply_put_data:
    :return: None/Value of apply_put.id
    """
    return add(ApplyPut, apply_put_data)


def edit_apply_put(apply_put_id, apply_put_data):
    """
    修改投资申请信息
    :param apply_put_id:
    :param apply_put_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(ApplyPut, apply_put_id, apply_put_data)


def delete_apply_put(apply_put_id):
    """
    删除投资申请信息
    :param apply_put_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(ApplyPut, apply_put_id)


def get_apply_put_rows_by_ids(ids):
    """
    获取投资申请列表
    :param ids:
    :return: list
    """
    return get_rows_by_ids(ApplyPut, ids)


def get_apply_put_lists(*args, **kwargs):
    """
    获取投资申请列表
    :param args:
    :param kwargs:
    :return: None/list
    """
    return get_lists(ApplyPut, *args, **kwargs)


def get_apply_put_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取投资申请列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(ApplyPut, page, per_page, *args, **kwargs)
    return rows


def apply_put_match(apply_put_id, apply_get_ids, accept_split=0):
    """
    投资申请匹配
    :param apply_put_id:
    :param apply_get_ids:
    :param accept_split:
    :return:
    """
    from app_backend.api.apply_get import get_apply_get_rows_by_ids

    apply_put_info = get_apply_put_row_by_id(apply_put_id)

    # 判断是否已经匹配
    if apply_put_info.status_order == int(STATUS_ORDER_COMPLETED):
        raise Exception(u'不能重复匹配')
    apply_get_list = get_apply_get_rows_by_ids(apply_get_ids)

    # 判断是否同一个人
    apply_get_user_ids = [apply_get_item.user_id for apply_get_item in apply_get_list]
    if apply_put_info.user_id in apply_get_user_ids:
        raise Exception(u'不能匹配给自己')

    # 判断金额
    money_need_match = apply_put_info.money_apply - apply_put_info.money_order

    apply_get_amount = sum(
        [apply_get_item.money_apply - apply_get_item.money_order for apply_get_item in apply_get_list])
    # 如果接收拆分,判断被拆金额是否大于被匹配金额
    if accept_split:
        if money_need_match < apply_get_amount:
            raise Exception(u'选择金额太大')
    elif money_need_match != apply_get_amount:
        raise Exception(u'金额不匹配')

    # 循环提现申请,生成对应的订单
    try:
        money_order = 0
        for apply_get_item in apply_get_list:
            money_match = apply_get_item.money_apply - apply_get_item.money_order
            current_time = datetime.utcnow()

            order_data = {
                'apply_put_id': apply_put_id,
                'apply_get_id': apply_get_item.id,
                'apply_put_uid': apply_put_info.user_id,
                'apply_get_uid': apply_get_item.user_id,
                'money': money_match,
                'status_audit': STATUS_AUDIT_SUCCESS,
                'audit_time': current_time,
                'create_time': current_time,
                'update_time': current_time,
            }
            db.session.add(Order(**order_data))

            # 更新提现申请状态
            apply_get_update_info = {
                'money_order': apply_get_item.money_order + money_match,
                'status_order': STATUS_ORDER_COMPLETED,
                'update_time': current_time,
            }
            apply_get_obj = db.session.query(ApplyGet).filter(ApplyGet.id == apply_get_item.id)
            apply_get_obj.update(apply_get_update_info)

            money_order += money_match

        # 更新投资订单金额和申请状态
        current_time = datetime.utcnow()
        apply_put_update_data = {
            'money_order': ApplyPut.money_order + money_order,
            'status_order': STATUS_ORDER_COMPLETED if money_order == money_need_match else STATUS_ORDER_PROCESSING,
            'update_time': current_time,
        }
        # result = edit_apply_get(apply_get_id, apply_get_update_info)
        apply_put_obj = db.session.query(ApplyPut).filter(ApplyPut.id == apply_put_id)
        result = apply_put_obj.update(apply_put_update_data)

        db.session.commit()
        return result
    except Exception as e:
        print traceback.print_exc()
        db.session.rollback()
        raise e


def apply_put_stats(time_based='hour'):
    """
    投资申请统计
    :return:
    """
    # 按小时统计
    if time_based == 'hour':
        start_time, end_time = get_current_day_time_ends()
        hours = get_hours(False)
        hours_zerofill = get_hours()
        result = dict(zip(hours, [0] * len(hours)))
        rows = db.session \
            .query(func.hour(ApplyPut.create_time).label('hour'), func.sum(ApplyPut.money_apply)) \
            .filter(ApplyPut.create_time >= time_local_to_utc(start_time), ApplyPut.create_time <= time_local_to_utc(end_time)) \
            .group_by('hour') \
            .limit(len(hours)) \
            .all()
        result.update(dict(rows))
        return [(hours_zerofill[i], result[hour]) for i, hour in enumerate(hours)]
    # 按日期统计
    if time_based == 'date':
        start_time, end_time = get_current_month_time_ends()
        today = datetime.today()
        days = get_days(year=today.year, month=today.month, zerofill=False)
        days_zerofill = get_days(year=today.year, month=today.month)
        result = dict(zip(days, [0] * len(days)))
        rows = db.session \
            .query(func.day(ApplyPut.create_time).label('date'), func.sum(ApplyPut.money_apply)) \
            .filter(ApplyPut.create_time >= time_local_to_utc(start_time), ApplyPut.create_time <= time_local_to_utc(end_time)) \
            .group_by('date') \
            .limit(len(days)) \
            .all()
        result.update(dict(rows))
        return [(days_zerofill[i], result[day]) for i, day in enumerate(days)]
    # 按月份统计
    if time_based == 'month':
        start_time, end_time = get_current_year_time_ends()
        months = get_months(False)
        months_zerofill = get_months()
        result = dict(zip(months, [0] * len(months)))
        rows = db.session \
            .query(func.month(ApplyPut.create_time).label('month'), func.sum(ApplyPut.money_apply)) \
            .filter(ApplyPut.create_time >= time_local_to_utc(start_time), ApplyPut.create_time <= time_local_to_utc(end_time)) \
            .group_by('month') \
            .limit(len(months)) \
            .all()
        result.update(dict(rows))
        return [(months_zerofill[i], result[month]) for i, month in enumerate(months)]


================================================
FILE: app_backend/api/author.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: author.py
@time: 16-1-17 上午12:05
"""


from app_backend.models import Author
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete


def get_author_row_by_id(author_id):
    """
    通过 id 获取博客信息
    :param author_id:
    :return: None/object
    """
    return get_row_by_id(Author, author_id)


def get_author_row(*args, **kwargs):
    """
    获取博客信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Author, *args, **kwargs)


def add_author(author_data):
    """
    添加博客信息
    :param author_data:
    :return: None/Value of author.id
    """
    return add(Author, author_data)


def edit_author(author_id, author_data):
    """
    修改博客信息
    :param author_id:
    :param author_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Author, author_id, author_data)


def delete_author(author_id):
    """
    删除博客信息
    :param author_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Author, author_id)


def get_author_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取博客列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Author, page, per_page, *args, **kwargs)
    return rows


================================================
FILE: app_backend/api/blog.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@blog: zhanghe
@software: PyCharm
@file: blog.py
@time: 16-1-21 上午10:24
"""


from app_backend.models import Blog
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete
from app_backend.lib.counter import Counter
from app_backend.lib.container import Container


def get_blog_row_by_id(blog_id):
    """
    通过 id 获取博客信息
    :param blog_id:
    :return: None/object
    """
    return get_row_by_id(Blog, blog_id)


def get_blog_row(*args, **kwargs):
    """
    获取博客信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Blog, *args, **kwargs)


def add_blog(blog_data):
    """
    添加博客信息
    :param blog_data:
    :return: None/Value of blog.id
    """
    return add(Blog, blog_data)


def edit_blog(blog_id, blog_data):
    """
    修改博客信息
    :param blog_id:
    :param blog_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Blog, blog_id, blog_data)


def delete_blog(blog_id):
    """
    删除博客信息
    :param blog_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Blog, blog_id)


def get_blog_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取博客列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Blog, page, per_page, *args, **kwargs)
    return rows


def get_blog_counter(blog_id):
    """
    获取blog计数器
    :param blog_id:
    :return:
    """
    blog_cnt_obj = Counter('blog')
    return blog_cnt_obj.counter_blog_item(blog_id)


def set_blog_counter(blog_id, stat_type, num):
    """
    设置blog计数器
    :param blog_id:
    :param stat_type:
    :param num:
    :return:
    """
    blog_cnt_obj = Counter('blog')
    return blog_cnt_obj.set_blog_counter(blog_id, stat_type, num)


def get_blog_list_counter(blog_id_list):
    """
    获取blog计数器
    :param blog_id_list:
    :return:
    """
    blog_cnt_obj = Counter('blog')
    return blog_cnt_obj.counter_blog_list(blog_id_list)


def get_blog_container_status(blog_id, uid):
    """
    获取blog容器状态
    :param blog_id:
    :param uid:
    :return:
    """
    blog_container_obj = Container('blog')
    return blog_container_obj.get_item_container_status(blog_id, uid)


def get_blog_list_container_status(blog_id_list, uid):
    """
    获取blog容器状态
    :param blog_id_list:
    :param uid:
    :return:
    """
    blog_container_obj = Container('blog')
    return blog_container_obj.get_item_list_container_status(blog_id_list, uid)


def add_blog_stat_item(stat_type, blog_id, uid):
    """
    添加blog统计明细
    :param stat_type:
    :param blog_id:
    :param uid:
    :return:
    """
    blog_container_obj = Container('blog')
    return blog_container_obj.add_item(stat_type, blog_id, uid)

if __name__ == '__main__':
    blog_rows = get_blog_rows(1, 10)
    if blog_rows:
        for item in blog_rows.items:
            print item.id, item.author, item.title, item.pub_date

    import json
    print json.dumps(get_blog_counter(['1', '2', '3']), indent=4, ensure_ascii=False)


================================================
FILE: app_backend/api/complaint.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: complaint.py
@time: 2017/4/29 下午2:30
"""


from app_backend.models import Complaint
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete


def get_complaint_row_by_id(complaint_id):
    """
    通过 id 获取投诉信息
    :param complaint_id:
    :return: None/object
    """
    return get_row_by_id(Complaint, complaint_id)


def get_complaint_row(*args, **kwargs):
    """
    获取投诉信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Complaint, *args, **kwargs)


def add_complaint(complaint_data):
    """
    添加投诉信息
    :param complaint_data:
    :return: None/Value of complaint.id
    """
    return add(Complaint, complaint_data)


def edit_complaint(complaint_id, complaint_data):
    """
    修改投诉信息
    :param complaint_id:
    :param complaint_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Complaint, complaint_id, complaint_data)


def delete_complaint(complaint_id):
    """
    删除投诉信息
    :param complaint_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Complaint, complaint_id)


def get_complaint_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取投诉列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Complaint, page, per_page, *args, **kwargs)
    return rows



================================================
FILE: app_backend/api/message.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: message.py
@time: 2017/6/24 下午10:20
"""


from app_backend.models import Message
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete


def get_message_row_by_id(message_id):
    """
    通过 id 获取留言信息
    :param message_id:
    :return: None/object
    """
    return get_row_by_id(Message, message_id)


def get_message_row(*args, **kwargs):
    """
    获取留言信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Message, *args, **kwargs)


def add_message(message_data):
    """
    添加留言信息
    :param message_data:
    :return: None/Value of message.id
    """
    return add(Message, message_data)


def edit_message(message_id, message_data):
    """
    修改留言信息
    :param message_id:
    :param message_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Message, message_id, message_data)


def delete_message(message_id):
    """
    删除留言信息
    :param message_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Message, message_id)


def get_message_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取留言列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Message, page, per_page, *args, **kwargs)
    return rows


================================================
FILE: app_backend/api/order.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: order.py
@time: 2017/4/13 下午9:45
"""


from datetime import datetime
from sqlalchemy import func

from app_backend.models import Order, ApplyGet, ApplyPut
from app_backend.tools.db import get_row, get_lists, get_rows, get_row_by_id, add, edit, delete
from app_backend.database import db
from app_common.maps.status_audit import STATUS_AUDIT_SUCCESS
from app_common.maps.status_order import STATUS_ORDER_COMPLETED, STATUS_ORDER_PROCESSING
from app_common.tools.date_time import get_hours, get_current_day_time_ends, time_local_to_utc, \
    get_current_month_time_ends, get_days, get_current_year_time_ends, get_months


def get_order_row_by_id(order_id):
    """
    通过 id 获取订单信息
    :param order_id:
    :return: None/object
    """
    return get_row_by_id(Order, order_id)


def get_order_row(*args, **kwargs):
    """
    获取订单信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Order, *args, **kwargs)


def add_order(order_data):
    """
    添加订单信息
    :param order_data:
    :return: None/Value of order.id
    """
    return add(Order, order_data)


def edit_order(order_id, order_data):
    """
    修改订单信息
    :param order_id:
    :param order_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Order, order_id, order_data)


def delete_order(order_id):
    """
    删除订单信息
    :param order_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Order, order_id)


def get_order_lists(*args, **kwargs):
    """
    获取订单列表
    :param args:
    :param kwargs:
    :return: None/list
    """
    return get_lists(Order, *args, **kwargs)


def get_order_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取订单列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Order, page, per_page, *args, **kwargs)
    return rows


def get_put_match_order_rows(apply_put_id):
    """
    获取投资匹配订单列表
    :param apply_put_id:
    :return: list
    """
    try:
        rows = db.session.query(Order, ApplyGet). \
            filter(Order.apply_put_id == apply_put_id, ApplyGet.id == Order.apply_get_id). \
            all()
        db.session.commit()
        return rows
    except Exception as e:
        db.session.rollback()
        raise e


def get_get_match_order_rows(apply_get_id):
    """
    获取提现匹配订单列表
    :param apply_get_id:
    :return: list
    """
    try:
        rows = db.session.query(Order, ApplyPut). \
            filter(Order.apply_get_id == apply_get_id, ApplyPut.id == Order.apply_put_id). \
            all()
        db.session.commit()
        return rows
    except Exception as e:
        db.session.rollback()
        raise e


def flow(order_id, next_uid):
    """
    订单流转
    :param order_id:
    :param next_uid:
    :return:
    """
    # 获取订单信息
    # 新增投资
    # 新增匹配订单(流转类型)
    # 修改原始订单(流转状态)
    # 新增订单流转记录


def order_stats(time_based='hour'):
    """
    订单金额统计
    :return:
    """
    # 按小时统计
    if time_based == 'hour':
        start_time, end_time = get_current_day_time_ends()
        hours = get_hours(False)
        hours_zerofill = get_hours()
        result = dict(zip(hours, [0] * len(hours)))
        rows = db.session \
            .query(func.hour(Order.create_time).label('hour'), func.sum(Order.money)) \
            .filter(Order.create_time >= time_local_to_utc(start_time),
                    Order.create_time <= time_local_to_utc(end_time)) \
            .group_by('hour') \
            .limit(len(hours)) \
            .all()
        result.update(dict(rows))
        return [(hours_zerofill[i], result[hour]) for i, hour in enumerate(hours)]
    # 按日期统计
    if time_based == 'date':
        start_time, end_time = get_current_month_time_ends()
        today = datetime.today()
        days = get_days(year=today.year, month=today.month, zerofill=False)
        days_zerofill = get_days(year=today.year, month=today.month)
        result = dict(zip(days, [0] * len(days)))
        rows = db.session \
            .query(func.day(Order.create_time).label('date'), func.sum(Order.money)) \
            .filter(Order.create_time >= time_local_to_utc(start_time),
                    Order.create_time <= time_local_to_utc(end_time)) \
            .group_by('date') \
            .limit(len(days)) \
            .all()
        result.update(dict(rows))
        return [(days_zerofill[i], result[day]) for i, day in enumerate(days)]
    # 按月份统计
    if time_based == 'month':
        start_time, end_time = get_current_year_time_ends()
        months = get_months(False)
        months_zerofill = get_months()
        result = dict(zip(months, [0] * len(months)))
        rows = db.session \
            .query(func.month(Order.create_time).label('month'), func.sum(Order.money)) \
            .filter(Order.create_time >= time_local_to_utc(start_time),
                    Order.create_time <= time_local_to_utc(end_time)) \
            .group_by('month') \
            .limit(len(months)) \
            .all()
        result.update(dict(rows))
        return [(months_zerofill[i], result[month]) for i, month in enumerate(months)]


================================================
FILE: app_backend/api/scheduling.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: scheduling.py
@time: 2017/6/29 下午8:46
"""


from datetime import datetime

from app_backend.database import db
from app_backend.models import Scheduling, SchedulingItem
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete
from app_common.maps.status_audit import STATUS_AUDIT_SUCCESS
from app_common.maps.type_scheduling import TYPE_SCHEDULING_GIVE


def get_scheduling_row_by_id(scheduling_id):
    """
    通过 id 获取排单信息
    :param scheduling_id:
    :return: None/object
    """
    return get_row_by_id(Scheduling, scheduling_id)


def get_scheduling_row(*args, **kwargs):
    """
    获取排单信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Scheduling, *args, **kwargs)


def add_scheduling(scheduling_data):
    """
    添加排单信息
    :param scheduling_data:
    :return: None/Value of score.id
    """
    return add(Scheduling, scheduling_data)


def edit_scheduling(scheduling_id, scheduling_data):
    """
    修改排单信息
    :param scheduling_id:
    :param scheduling_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Scheduling, scheduling_id, scheduling_data)


def delete_scheduling(scheduling_id):
    """
    删除排单信息
    :param scheduling_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Scheduling, scheduling_id)


def get_scheduling_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取排单列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Scheduling, page, per_page, *args, **kwargs)
    return rows


def give_scheduling(user_id_scheduling, amount=1):
    """
    赠送排单数量
    :param user_id_scheduling:
    :param amount:
    :return:
    """
    try:
        current_time = datetime.utcnow()

        # 添加排单币消费明细
        scheduling_item_data = {
            'user_id': 0,
            'type': TYPE_SCHEDULING_GIVE,
            'amount': amount,
            'sc_id': user_id_scheduling,
            'status_audit': STATUS_AUDIT_SUCCESS,
            'audit_time': current_time,
            'create_time': current_time,
            'update_time': current_time,
        }
        db.session.add(SchedulingItem(**scheduling_item_data))

        # 新增接收用户排单币总数量
        scheduling_obj = db.session.query(Scheduling).filter(Scheduling.user_id == user_id_scheduling)
        scheduling_info = scheduling_obj.first()
        if scheduling_info:
            scheduling_data = {
                'user_id': user_id_scheduling,
                'amount': scheduling_info.amount + amount,
                'update_time': current_time,
            }
            scheduling_obj.update(scheduling_data)
        else:
            scheduling_data = {
                'user_id': user_id_scheduling,
                'amount': amount,
                'create_time': current_time,
                'update_time': current_time,
            }
            db.session.add(Scheduling(**scheduling_data))

        db.session.commit()
        return True
    except Exception as e:
        db.session.rollback()
        raise e


================================================
FILE: app_backend/api/scheduling_item.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: scheduling_item.py
@time: 2017/6/29 下午8:46
"""


from app_backend.models import SchedulingItem
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete


def get_scheduling_item_item_row_by_id(scheduling_item_item_id):
    """
    通过 id 获取排单明细信息
    :param scheduling_item_item_id:
    :return: None/object
    """
    return get_row_by_id(SchedulingItem, scheduling_item_item_id)


def get_scheduling_item_item_row(*args, **kwargs):
    """
    获取排单明细信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(SchedulingItem, *args, **kwargs)


def add_scheduling_item(scheduling_item_item_data):
    """
    添加排单明细信息
    :param scheduling_item_item_data:
    :return: None/Value of score.id
    """
    return add(SchedulingItem, scheduling_item_item_data)


def edit_scheduling_item(scheduling_item_item_id, scheduling_item_item_data):
    """
    修改排单明细信息
    :param scheduling_item_item_id:
    :param scheduling_item_item_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(SchedulingItem, scheduling_item_item_id, scheduling_item_item_data)


def delete_scheduling_item(scheduling_item_item_id):
    """
    删除排单明细信息
    :param scheduling_item_item_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(SchedulingItem, scheduling_item_item_id)


def get_scheduling_item_item_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取排单明细列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(SchedulingItem, page, per_page, *args, **kwargs)
    return rows


================================================
FILE: app_backend/api/score.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: score.py
@time: 2017/4/25 下午1:29
"""


from app_backend.models import Score
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete


def get_score_row_by_id(score_id):
    """
    通过 id 获取积分信息
    :param score_id:
    :return: None/object
    """
    return get_row_by_id(Score, score_id)


def get_score_row(*args, **kwargs):
    """
    获取积分信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Score, *args, **kwargs)


def add_score(score_data):
    """
    添加积分信息
    :param score_data:
    :return: None/Value of score.id
    """
    return add(Score, score_data)


def edit_score(score_id, score_data):
    """
    修改积分信息
    :param score_id:
    :param score_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Score, score_id, score_data)


def delete_score(score_id):
    """
    删除积分信息
    :param score_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Score, score_id)


def get_score_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取积分列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Score, page, per_page, *args, **kwargs)
    return rows


================================================
FILE: app_backend/api/user.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@user: zhanghe
@software: PyCharm
@file: user.py
@time: 17-4-21 下午10:42
"""


from datetime import datetime
from sqlalchemy.sql import func

from app_backend.database import db
from app_backend import app
from app_backend.models import User
from app_backend.models import UserBank
from app_backend.models import UserProfile
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete
from app_common.maps.status_lock import *
from app_common.maps.status_active import *
from app_common.tools.date_time import get_hours, get_days, get_months, time_local_to_utc
from app_common.tools.date_time import get_current_day_time_ends
from app_common.tools.date_time import get_current_month_time_ends
from app_common.tools.date_time import get_current_year_time_ends

PER_PAGE_BACKEND = app.config['PER_PAGE_BACKEND']


def get_user_row_by_id(user_id):
    """
    通过 id 获取用户信息
    :param user_id:
    :return: None/object
    """
    return get_row_by_id(User, user_id)


def get_user_row(*args, **kwargs):
    """
    获取用户信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(User, *args, **kwargs)


def add_user(user_data):
    """
    添加用户信息
    :param user_data:
    :return: None/Value of user.id
    """
    return add(User, user_data)


def edit_user(user_id, user_data):
    """
    修改用户信息
    :param user_id:
    :param user_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(User, user_id, user_data)


def delete_user(user_id):
    """
    删除用户信息
    :param user_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(User, user_id)


def get_user_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取用户列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(User, page, per_page, *args, **kwargs)
    return rows


def get_user_detail_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取用户详细信息列表(分页)
        User
        UserProfile
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    try:
        rows = User.query. \
            outerjoin(UserProfile, User.id == UserProfile.user_id). \
            outerjoin(UserBank, User.id == UserBank.user_id). \
            add_entity(UserProfile). \
            add_entity(UserBank). \
            filter(*args). \
            filter_by(**kwargs). \
            paginate(page, PER_PAGE_BACKEND, False)
        db.session.commit()
        return rows
    except Exception as e:
        db.session.rollback()
        raise e


def lock(user_id):
    """
    锁定用户
    :param user_id:
    :return: Number of affected rows (Example: 0/1)
    """
    current_time = datetime.utcnow()
    user_data = {
        'status_lock': STATUS_LOCK_OK,
        'lock_time': current_time,
        'update_time': current_time
    }
    result = edit_user(user_id, user_data)
    return result


def unlock(user_id):
    """
    解锁用户
    :param user_id:
    :return: Number of affected rows (Example: 0/1)
    """
    current_time = datetime.utcnow()
    user_data = {
        'status_lock': STATUS_LOCK_NO,
        'update_time': current_time
    }
    result = edit_user(user_id, user_data)
    return result


def user_reg_stats(time_based='hour'):
    """
    用户注册统计
    :return:
    """
    # 按小时统计
    if time_based == 'hour':
        start_time, end_time = get_current_day_time_ends()
        hours = get_hours(False)
        hours_zerofill = get_hours()
        result = dict(zip(hours, [0] * len(hours)))
        rows = db.session \
            .query(func.hour(User.create_time).label('hour'), func.count(User.id)) \
            .filter(User.create_time >= time_local_to_utc(start_time),
                    User.create_time <= time_local_to_utc(end_time)) \
            .group_by('hour') \
            .limit(len(hours)) \
            .all()
        result.update(dict(rows))
        return [(hours_zerofill[i], result[hour]) for i, hour in enumerate(hours)]
    # 按日期统计
    if time_based == 'date':
        start_time, end_time = get_current_month_time_ends()
        today = datetime.today()
        days = get_days(year=today.year, month=today.month, zerofill=False)
        days_zerofill = get_days(year=today.year, month=today.month)
        result = dict(zip(days, [0] * len(days)))
        rows = db.session \
            .query(func.day(User.create_time).label('date'), func.count(User.id)) \
            .filter(User.create_time >= time_local_to_utc(start_time),
                    User.create_time <= time_local_to_utc(end_time)) \
            .group_by('date') \
            .limit(len(days)) \
            .all()
        result.update(dict(rows))
        return [(days_zerofill[i], result[day]) for i, day in enumerate(days)]
    # 按月份统计
    if time_based == 'month':
        start_time, end_time = get_current_year_time_ends()
        months = get_months(False)
        months_zerofill = get_months()
        result = dict(zip(months, [0] * len(months)))
        rows = db.session \
            .query(func.month(User.create_time).label('month'), func.count(User.id)) \
            .filter(User.create_time >= time_local_to_utc(start_time),
                    User.create_time <= time_local_to_utc(end_time)) \
            .group_by('month') \
            .limit(len(months)) \
            .all()
        result.update(dict(rows))
        return [(months_zerofill[i], result[month]) for i, month in enumerate(months)]


def user_active_stats(time_based='hour'):
    """
    用户激活统计
    :return:
    """
    # 按小时统计
    if time_based == 'hour':
        start_time, end_time = get_current_day_time_ends()
        hours = get_hours(False)
        hours_zerofill = get_hours()
        result = dict(zip(hours, [0] * len(hours)))
        rows = db.session \
            .query(func.hour(User.create_time).label('hour'), func.count(User.id)) \
            .filter(User.create_time >= time_local_to_utc(start_time),
                    User.create_time <= time_local_to_utc(end_time),
                    User.status_active == STATUS_ACTIVE_OK) \
            .group_by('hour') \
            .limit(len(hours)) \
            .all()
        result.update(dict(rows))
        return [(hours_zerofill[i], result[hour]) for i, hour in enumerate(hours)]
    # 按日期统计
    if time_based == 'date':
        start_time, end_time = get_current_month_time_ends()
        today = datetime.today()
        days = get_days(year=today.year, month=today.month, zerofill=False)
        days_zerofill = get_days(year=today.year, month=today.month)
        result = dict(zip(days, [0] * len(days)))
        rows = db.session \
            .query(func.day(User.create_time).label('date'), func.count(User.id)) \
            .filter(User.create_time >= time_local_to_utc(start_time),
                    User.create_time <= time_local_to_utc(end_time),
                    User.status_active == STATUS_ACTIVE_OK) \
            .group_by('date') \
            .limit(len(days)) \
            .all()
        result.update(dict(rows))
        return [(days_zerofill[i], result[day]) for i, day in enumerate(days)]
    # 按月份统计
    if time_based == 'month':
        start_time, end_time = get_current_year_time_ends()
        months = get_months(False)
        months_zerofill = get_months()
        result = dict(zip(months, [0] * len(months)))
        rows = db.session \
            .query(func.month(User.create_time).label('month'), func.count(User.id)) \
            .filter(User.create_time >= time_local_to_utc(start_time),
                    User.create_time <= time_local_to_utc(end_time),
                    User.status_active == STATUS_ACTIVE_OK) \
            .group_by('month') \
            .limit(len(months)) \
            .all()
        result.update(dict(rows))
        return [(months_zerofill[i], result[month]) for i, month in enumerate(months)]


================================================
FILE: app_backend/api/user_auth.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: user_auth.py
@time: 16-4-28 上午1:04
"""


from app_backend.models import UserAuth
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete, update_rows


def get_user_auth_row_by_id(user_auth_id):
    """
    通过 id 获取用户信息
    :param user_auth_id:
    :return: None/object
    """
    return get_row_by_id(UserAuth, user_auth_id)


def get_user_auth_row(*args, **kwargs):
    """
    获取用户信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(UserAuth, *args, **kwargs)


def add_user_auth(user_auth_data):
    """
    添加用户信息
    :param user_auth_data:
    :return: None/Value of user.id
    """
    return add(UserAuth, user_auth_data)


def edit_user_auth(user_auth_id, user_auth_data):
    """
    修改用户信息
    :param user_auth_id:
    :param user_auth_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(UserAuth, user_auth_id, user_auth_data)


def delete_user_auth(user_auth_id):
    """
    删除用户信息
    :param user_auth_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(UserAuth, user_auth_id)


def get_user_auth_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取用户列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(UserAuth, page, per_page, *args, **kwargs)
    return rows


def update_user_auth_rows(data, *args, **kwargs):
    """
    批量更新用户信息
    """
    return update_rows(UserAuth, data, *args, **kwargs)


================================================
FILE: app_backend/api/user_bank.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: user_bank.py
@time: 2017/4/26 下午1:46
"""


from app_backend.models import UserBank
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete, update_rows


def get_user_bank_row_by_id(user_bank_id):
    """
    通过 id 获取用户银行信息
    :param user_bank_id:
    :return: None/object
    """
    return get_row_by_id(UserBank, user_bank_id)


def get_user_bank_row(*args, **kwargs):
    """
    获取用户银行信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(UserBank, *args, **kwargs)


def add_user_bank(user_bank_data):
    """
    添加用户银行信息
    :param user_bank_data:
    :return: None/Value of user.id
    """
    return add(UserBank, user_bank_data)


def edit_user_bank(user_bank_id, user_bank_data):
    """
    修改用户银行信息
    :param user_bank_id:
    :param user_bank_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(UserBank, user_bank_id, user_bank_data)


def delete_user_bank(user_bank_id):
    """
    删除用户银行信息
    :param user_bank_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(UserBank, user_bank_id)


def get_user_bank_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取用户银行列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(UserBank, page, per_page, *args, **kwargs)
    return rows


def update_user_bank_rows(data, *args, **kwargs):
    """
    批量更新用户银行信息
    """
    return update_rows(UserBank, data, *args, **kwargs)


================================================
FILE: app_backend/api/user_config.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: user_config.py
@time: 2017/6/29 上午11:41
"""


from app_backend.models import UserConfig
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, merge, delete


def get_user_config_row_by_id(user_config_id):
    """
    通过 id 获取用户配置信息
    :param user_config_id:
    :return: None/object
    """
    return get_row_by_id(UserConfig, user_config_id)


def get_user_config_row(*args, **kwargs):
    """
    获取用户配置信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(UserConfig, *args, **kwargs)


def add_user_config(user_config_data):
    """
    添加用户配置信息
    :param user_config_data:
    :return: None/Value of wallet.id
    """
    return add(UserConfig, user_config_data)


def edit_user_config(user_config_id, user_config_data):
    """
    修改用户配置信息
    :param user_config_id:
    :param user_config_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(UserConfig, user_config_id, user_config_data)


def merge_user_config(user_config_data):
    """
    填充用户配置信息
    :param user_config_data:
    :return: Value of PK
    """
    return merge(UserConfig, user_config_data)


def delete_user_config(user_config_id):
    """
    删除用户配置信息
    :param user_config_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(UserConfig, user_config_id)


def get_user_config_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取用户配置列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(UserConfig, page, per_page, *args, **kwargs)
    return rows



================================================
FILE: app_backend/api/user_profile.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@user: zhanghe
@software: PyCharm
@file: user_profile.py
@time: 17-4-29 下午16:36
"""


from app_backend.models import UserProfile
from app_backend.tools.db import get_row, get_rows, get_lists, get_row_by_id, add, edit, delete
from app_common.tools.tree import tree


def get_user_profile_row_by_id(user_id):
    """
    通过 id 获取用户信息
    :param user_id:
    :return: None/object
    """
    return get_row_by_id(UserProfile, user_id)


def get_user_profile_row(*args, **kwargs):
    """
    获取用户信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(UserProfile, *args, **kwargs)


def add_user_profile(user_data):
    """
    添加用户信息
    :param user_data:
    :return: None/Value of user.id
    """
    return add(UserProfile, user_data)


def edit_user_profile(user_id, user_data):
    """
    修改用户信息
    :param user_id:
    :param user_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(UserProfile, user_id, user_data)


def delete_user_profile(user_id):
    """
    删除用户信息
    :param user_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(UserProfile, user_id)


def get_user_profile_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取用户列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(UserProfile, page, per_page, *args, **kwargs)
    return rows


def get_child_users(user_id):
    """
    获取子节点
    :param user_id:
    :return:
    """
    condition = {
        'user_pid': user_id
    }
    rows = get_lists(UserProfile, **condition)
    return [(row.user_id, row.nickname, row.type_level) for row in rows]


def get_team_tree_recursion(user_id, team=None, node=None):
    """
    递归获取用户团队树形结构(深度优先)
    :param user_id:
    :param team:
    :param node:
    :return:
    """
    # print '-'*10, user_id, team
    if not team:
        team = tree()
        node = team
    child_users = get_child_users(user_id)
    for child_user in child_users:   # 遍历当前所有子节点
        node[child_user] = {}  # 子节点加入树
        user_id_next = child_user[0]
        get_team_tree_recursion(user_id_next, team, node[child_user])  # 递归下一个子节点
    return team


================================================
FILE: app_backend/api/wallet.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: wallet.py
@time: 2017/4/25 下午1:29
"""


from app_backend.models import Wallet
from app_backend.tools.db import get_row, get_rows, get_row_by_id, add, edit, delete


def get_wallet_row_by_id(wallet_id):
    """
    通过 id 获取钱包信息
    :param wallet_id:
    :return: None/object
    """
    return get_row_by_id(Wallet, wallet_id)


def get_wallet_row(*args, **kwargs):
    """
    获取钱包信息
    :param args:
    :param kwargs:
    :return: None/object
    """
    return get_row(Wallet, *args, **kwargs)


def add_wallet(wallet_data):
    """
    添加钱包信息
    :param wallet_data:
    :return: None/Value of wallet.id
    """
    return add(Wallet, wallet_data)


def edit_wallet(wallet_id, wallet_data):
    """
    修改钱包信息
    :param wallet_id:
    :param wallet_data:
    :return: Number of affected rows (Example: 0/1)
    """
    return edit(Wallet, wallet_id, wallet_data)


def delete_wallet(wallet_id):
    """
    删除钱包信息
    :param wallet_id:
    :return: Number of affected rows (Example: 0/1)
    """
    return delete(Wallet, wallet_id)


def get_wallet_rows(page=1, per_page=10, *args, **kwargs):
    """
    获取钱包列表(分页)
    Usage:
        items: 信息列表
        has_next: 如果本页之后还有超过一个分页,则返回True
        has_prev: 如果本页之前还有超过一个分页,则返回True
        next_num: 返回下一页的页码
        prev_num: 返回上一页的页码
        iter_pages(): 页码列表
        iter_pages(left_edge=2, left_current=2, right_current=5, right_edge=2) 页码列表默认参数
    :param page:
    :param per_page:
    :param args:
    :param kwargs:
    :return:
    """
    rows = get_rows(Wallet, page, per_page, *args, **kwargs)
    return rows


================================================
FILE: app_backend/database.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: database.py
@time: 17-4-20 下午13:44
"""


from flask_sqlalchemy import SQLAlchemy
from app_backend import app
db = SQLAlchemy(app)


================================================
FILE: app_backend/filters.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: filters.py
@time: 2017/4/13 下午2:33
@desc: 自定义过滤器
"""

import time

from app_backend.api.active import get_active_row_by_id
from app_backend.api.scheduling import get_scheduling_row_by_id
from app_common.maps.role_admin import ROLE_ADMIN_DICT
from app_common.maps.type_active import TYPE_ACTIVE_DICT
from app_common.maps.type_apply import TYPE_APPLY_DICT
from app_common.maps.type_auth import TYPE_AUTH_DICT
from app_common.maps.type_scheduling import TYPE_SCHEDULING_DICT
from app_common.maps.status_audit import STATUS_AUDIT_DICT
from app_common.maps.status_apply import STATUS_APPLY_DICT
from app_common.maps.status_order import STATUS_ORDER_DICT
from app_common.maps.status_delete import STATUS_DEL_DICT
from app_common.maps.status_pay import STATUS_PAY_DICT
from app_common.maps.status_rec import STATUS_REC_DICT
from app_common.maps.type_level import TYPE_LEVEL_DICT
from app_common.maps.status_active import STATUS_ACTIVE_DICT
from app_common.maps.status_lock import STATUS_LOCK_DICT
from app_backend import app
from app_backend.views.user import get_user_profile_row_by_id
from app_common.maps.type_order import TYPE_ORDER_DICT


@app.template_filter('reverse')
def reverse_filter(s):
    return s[::-1]


@app.template_filter('url_t')
def url_t_filter(s):
    return '%s?t=%s' % (s, time.time())


@app.template_filter('time_diff_pretty')
def time_diff_pretty_filter(delta_s):
    """
    时间差友好显示
    {{ 1234 | time_diff_pretty }} >> 2分34秒
    :param delta_s:
    :return:
    """
    delta_s *= 1.00
    result = u''
    if delta_s >= (365 * 24 * 60 * 60):
        count = int(delta_s / (365 * 24 * 60 * 60))
        result += u'%s年' % count
        delta_s -= count * 365 * 24 * 60 * 60
    if delta_s >= (30 * 24 * 60 * 60):
        count = int(delta_s / (30 * 24 * 60 * 60))
        result += u'%s月' % count
        delta_s -= count * 30 * 24 * 60 * 60
    if delta_s >= (24 * 60 * 60):
        count = int(delta_s / (24 * 60 * 60))
        result += u'%s天' % count
        delta_s -= count * 24 * 60 * 60
    if delta_s >= (60 * 60):
        count = int(delta_s / (60 * 60))
        result += u'%s小时' % count
        delta_s -= count * 60 * 60
    if delta_s >= 60:
        count = int(delta_s / 60)
        result += u'%s分' % count
        delta_s -= count * 60
    if delta_s > 0:
        count = int(delta_s)
        result += u'%s秒' % count
    return result


@app.template_filter('nickname')
def filter_nickname(user_id):
    """
    显示用户名称
    :param user_id:
    :return:
    """
    user_info = get_user_profile_row_by_id(user_id)
    return user_info.nickname if user_info else u'系统用户'


@app.template_filter('user_active')
def filter_user_active(user_id):
    """
    用户激活码量
    :param user_id:
    :return:
    """
    if not user_id:
        return 0
    row = get_active_row_by_id(user_id)
    return row.amount if row else 0


@app.template_filter('role_admin')
def filter_role_admin(role_admin_id):
    """
    管理后台显示管理账号角色
    :param role_admin_id:
    :return:
    """
    return ROLE_ADMIN_DICT.get(role_admin_id, u'')


@app.template_filter('type_apply')
def filter_type_apply(type_apply_id):
    """
    申请类型
    :param type_apply_id:
    :return:
    """
    return TYPE_APPLY_DICT.get(type_apply_id, u'')


@app.template_filter('type_order')
def filter_type_order(type_order_id):
    """
    订单类型
    :param type_order_id:
    :return:
    """
    return TYPE_ORDER_DICT.get(type_order_id, u'')


@app.template_filter('type_auth')
def filter_type_auth(type_auth_id):
    """
    认证类型
    :param type_auth_id:
    :return:
    """
    return TYPE_AUTH_DICT.get(type_auth_id, u'')


@app.template_filter('type_active')
def filter_type_active(type_active_id):
    """
    激活类型
    :param type_active_id:
    :return:
    """
    return TYPE_ACTIVE_DICT.get(type_active_id, u'')


@app.template_filter('type_scheduling')
def filter_type_scheduling(type_scheduling_id):
    """
    排单类型
    :param type_scheduling_id:
    :return:
    """
    return TYPE_SCHEDULING_DICT.get(type_scheduling_id, u'')


@app.template_filter('status_apply')
def filter_status_apply(status_apply_id):
    """
    申请状态
    :param status_apply_id:
    :return:
    """
    return STATUS_APPLY_DICT.get(status_apply_id, u'')


@app.template_filter('status_audit')
def filter_status_audit(status_audit_id):
    """
    审核状态
    :param status_audit_id:
    :return:
    """
    return STATUS_AUDIT_DICT.get(status_audit_id, u'')


@app.template_filter('status_order')
def filter_status_order(status_order_id):
    """
    订单状态
    :param status_order_id:
    :return:
    """
    return STATUS_ORDER_DICT.get(status_order_id, u'')


@app.template_filter('status_delete')
def filter_status_delete(status_delete_id):
    """
    删除状态
    :param status_delete_id:
    :return:
    """
    return STATUS_DEL_DICT.get(status_delete_id, u'')


@app.template_filter('status_pay')
def filter_status_pay(status_pay_id):
    """
    支付状态
    :param status_pay_id:
    :return:
    """
    return STATUS_PAY_DICT.get(status_pay_id, u'')


@app.template_filter('status_rec')
def filter_status_rec(status_rec_id):
    """
    收款状态
    :param status_rec_id:
    :return:
    """
    return STATUS_REC_DICT.get(status_rec_id, u'')


@app.template_filter('type_level')
def filter_type_level(type_level_id):
    """
    等级类型
    :param type_level_id:
    :return:
    """
    return TYPE_LEVEL_DICT.get(type_level_id, u'')


@app.template_filter('status_active')
def filter_status_active(status_active_id):
    """
    激活状态
    :param status_active_id:
    :return:
    """
    return STATUS_ACTIVE_DICT.get(status_active_id, u'')


@app.template_filter('status_lock')
def filter_status_lock(status_lock_id):
    """
    锁定状态
    :param status_lock_id:
    :return:
    """
    return STATUS_LOCK_DICT.get(status_lock_id, u'')


@app.template_filter('scheduling_amount')
def filter_scheduling_amount(user_id):
    """
    排单剩余次数
    :param user_id:
    :return:
    """
    if not user_id:
        return 0
    row = get_scheduling_row_by_id(user_id)
    return row.amount if row else 0


================================================
FILE: app_backend/forms/__init__.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: __init__.py.py
@time: 2017/4/9 上午10:13
"""


from wtforms import SelectField, BooleanField
from wtforms.widgets import HTMLString
from wtforms.compat import text_type, iteritems
from wtforms.widgets import html_params


def select_multi_checkbox(field, ul_class='', **kwargs):
    """
    多选框控件
    :param field:
    :param ul_class:
    :param kwargs:
    :return:
    """
    kwargs.setdefault('type', 'checkbox')
    field_id = kwargs.pop('id', field.id)
    html = [u'<ul %s>' % html_params(id=field_id, class_=ul_class)]
    for value, label, checked in field.iter_choices():
        choice_id = u'%s-%s' % (field_id, value)
        options = dict(kwargs, name=field.name, value=value, id=choice_id)
        if checked:
            options['checked'] = 'checked'
        html.append(u'<li><input %s /> ' % html_params(**options))
        html.append(u'<label for="%s">%s</label></li>' % (field_id, label))
    html.append(u'</ul>')
    return u''.join(html)


class SelectBSWidget(object):
    """
    自定义选择组件
    """
    def __call__(self, field, **kwargs):
        params = {
            'id': field.id,
            'name': field.id,
            'class': 'selectpicker show-tick',
            # 'data-live-search': 'true',
            'title': kwargs.pop('placeholder', 'Choose one of the following...'),
            'data-header': kwargs.pop('data_header', 'Select a condiment'),
            'data-width': kwargs.pop('data_width', 'auto')
        }
        html = ['<select %s>' % html_params(**params)]
        for k, v in field.choices:
            html.append('<option value="%s" data-subtext="[%s]">%s</option>' % (k, k, v))
        html.append('</select>')
        return HTMLString('\n'.join(html))


class SelectBS(SelectField):
    """
    自定义选择表单控件
    """
    widget = SelectBSWidget()

    def pre_validate(self, form):
        """
        校验表单传值是否合法
        """
        for v, _ in self.choices:
            # print self.data, v, type(self.data), type(v)
            if str(self.data) == str(v):
                break
        else:
            raise ValueError(self.gettext('Not a valid choice'))


class CheckBoxBSWidget(object):
    """
    自定义复选框组件
    """
    input_type = 'checkbox'

    def __call__(self, field, **kwargs):
        if getattr(field, 'checked', field.data):
            kwargs['checked'] = True
        kwargs.setdefault('id', field.id)
        kwargs.setdefault('type', self.input_type)
        if 'value' not in kwargs:
            kwargs['value'] = 1
        html = [
            '<div class="checkbox">',
            '<label>',
            '<input %s>' % html_params(name=field.name, **kwargs),
            '</label>',
            '</div>'
        ]
        return HTMLString('\n'.join(html))


class CheckBoxBS(BooleanField):
    """
    自定义复选框控件
    """
    widget = CheckBoxBSWidget()


class SelectAreaCodeWidget(object):
    """
    自定义选择组件 - 区号
    """
    def __call__(self, field, **kwargs):
        params = {
            'id': field.id,
            'name': field.id,
            'class': 'selectpicker show-tick',
            'data-live-search': 'true',
            'title': kwargs.pop('title', 'Choose one of the following...'),
            'data-header': kwargs.pop('data-header', 'Select a condiment'),
        }
        html = ['<select %s>' % html_params(**params)]
        for _, area_data in field.choices:
            for area_name, area_list in area_data.items():
                html.append('\t<optgroup label="%s">' % area_name)
                for country_data in area_list:
                    # html.append('\t\t<option value="%s" data-subtext="%s(%s)">[%s] %s</option>' % (country_data['id'], country_data['name_c'], country_data['name_e'], country_data['short_code'], country_data['phone_pre']))
                    html.append('\t\t<option value="%s" data-subtext="%s">[%s] %s</option>' % (country_data['id'], country_data['name_c'], country_data['short_code'], country_data['phone_pre']))
                html.append('\t</optgroup>')
        html.append('</select>')
        return HTMLString('\n'.join(html))


class SelectAreaCode(SelectField):
    """
    自定义选择表单控件
    """
    widget = SelectAreaCodeWidget()

    def pre_validate(self, form):
        """
        校验表单传值是否合法
        """
        is_find = False
        for _, area_data in self.choices:
            for area_list in area_data.values():
                if self.data in [str(i['id']) for i in area_list]:
                    is_find = True
                    break
            if is_find:
                break
        else:
            raise ValueError(self.gettext('Not a valid choice'))


================================================
FILE: app_backend/forms/active.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: active.py
@time: 2017/6/1 下午2:42
"""


from flask_login import current_user
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField, DecimalField, IntegerField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress

from app_common.maps.status_delete import *
from app_common.maps.type_auth import *
from app_backend.api.user import get_user_row_by_id
from app_backend.api.user_auth import get_user_auth_row
from app_backend.api.user_profile import get_user_profile_row_by_id


class UserRightValidate(object):
    """
    用户权限校验
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        # 用户异常处理
        user_info = get_user_row_by_id(field.data)

        if not user_info:
            raise ValidationError(u'异常操作,此用户不存在')
        if user_info.status_delete == int(STATUS_DEL_OK):
            raise ValidationError(u'异常操作,此用户已删除')

        user_profile_info = get_user_profile_row_by_id(field.data)
        if not user_profile_info:
            raise ValidationError(u'异常操作,此用户不存在')


class ActiveAddForm(FlaskForm):
    """
    激活添加表单
    """
    user_id = StringField(u'赠送用户ID', validators=[
        DataRequired(message=u'赠送用户ID不能为空'),
        UserRightValidate()
    ])
    amount = IntegerField(u'赠送数量', validators=[
        DataRequired(message=u'赠送数量必须为整数'),
        NumberRange(min=1, message=u'赠送数量必须为整数')
    ])




================================================
FILE: app_backend/forms/admin.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: user.py
@time: 2017/3/17 下午11:49
"""


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField, HiddenField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress

from app_common.maps import area_code_list, role_admin_list
from app_backend.api.admin import get_admin_row
from app_backend.forms import SelectAreaCode, SelectBS


def reg_username_repeat(form, field):
    """
    登录账号重复校验
    """
    condition = {
        'username': field.data
    }
    row = get_admin_row(**condition)
    if row:
        raise ValidationError(u'登录账号重复')


def password_edit_validator(form, field):
    """
    密码修改表单校验
    :param form:
    :param field:
    :return:
    """
    field_data_length = len(field.data) if field.data else 0
    if field_data_length > 0 and (field_data_length < 6 or field_data_length > 20):
        raise ValidationError(u'密码长度不符')


class AdminProfileForm(FlaskForm):
    """
    管理员基本信息表单
    """
    id = HiddenField('Id')
    username = StringField(u'管理账号', validators=[DataRequired(), Length(min=2, max=20)])
    password = StringField(u'登录密码', validators=[password_edit_validator])
    area_code_choices = []
    for m, n in enumerate(area_code_list):
        area_code_choices.append((m, n))
    area_id = SelectAreaCode(u'手机区号', default='0', choices=area_code_choices, validators=[DataRequired()])
    phone = StringField(u'手机号码')
    role_id = SelectBS(u'管理角色', default='', choices=role_admin_list, validators=[DataRequired(u'管理角色不能为空')])
    login_ip = StringField(u'登录IP')
    login_time = DateTimeField(u'登录时间')
    create_time = DateTimeField(u'创建时间')
    update_time = DateTimeField(u'更新时间')


class AdminAddForm(FlaskForm):
    """
    管理员添加表单
    """
    username = StringField(u'管理账号', validators=[DataRequired(), Length(min=2, max=20)])
    password = StringField(u'登录密码', validators=[DataRequired(), Length(min=6, max=20)])
    area_code_choices = []
    for m, n in enumerate(area_code_list):
        area_code_choices.append((m, n))
    area_id = SelectAreaCode(u'手机区号', default='0', choices=area_code_choices, validators=[DataRequired()])
    phone = StringField(u'手机号码')
    role_id = SelectBS(u'管理角色', default='', choices=role_admin_list, validators=[DataRequired(u'管理角色不能为空')])
    login_ip = StringField(u'登录IP')
    login_time = DateTimeField(u'Login Time')


class AdminEditForm(FlaskForm):
    """
    管理员编辑表单
    """
    id = HiddenField('Id')
    username = StringField(u'管理账号', validators=[DataRequired(), Length(min=2, max=20)])
    password = StringField(u'登录密码', validators=[password_edit_validator])
    area_code_choices = []
    for m, n in enumerate(area_code_list):
        area_code_choices.append((m, n))
    area_id = SelectAreaCode(u'手机区号', default='0', choices=area_code_choices, validators=[DataRequired()])
    phone = StringField(u'手机号码')
    role_id = SelectBS(u'管理角色', default='', choices=role_admin_list, validators=[DataRequired(u'管理角色不能为空')])
    login_ip = StringField(u'登录IP')
    login_time = DateTimeField(u'登录时间')
    create_time = DateTimeField(u'创建时间')
    update_time = DateTimeField(u'更新时间')


class AdminRoleForm(FlaskForm):
    """
    管理员角色表单
    """
    role_id = SelectBS(u'管理角色', default='', choices=role_admin_list, validators=[DataRequired(u'管理角色不能为空')])
    name = StringField(u'模块权限')
    note = StringField(u'权限备注')
    module = StringField(u'模块权限')
    create_time = DateTimeField(u'创建时间')
    update_time = DateTimeField(u'更新时间')


class EditPassword(FlaskForm):
    """
    修改用户密码
    """
    password = PasswordField('New Password', validators=[
        DataRequired(),
        Length(min=6, max=40),
        EqualTo('confirm', message='Passwords must match')
    ])
    confirm = PasswordField('Repeat Password', validators=[
        DataRequired(),
        Length(min=6, max=40)
    ])



================================================
FILE: app_backend/forms/apply_get.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: apply_get.py
@time: 2017/4/13 下午9:31
"""


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress
from app_backend.api.user_auth import get_user_auth_row
from app_backend.forms import SelectBS
from app_common.maps import type_apply_list
from app_common.maps import status_apply_list
from app_common.maps import status_order_list
from app_common.maps import status_delete_list


class ApplyGetSearchForm(FlaskForm):
    """
    提现申请搜索表单
    """
    apply_get_id = StringField('Apply Get Id')
    user_id = StringField('User Id')
    type_apply = SelectBS('Type Apply', default='', choices=type_apply_list)
    money_apply = StringField('Type Apply')
    status_apply = SelectBS('Type Apply', default='', choices=status_apply_list)
    status_order = SelectBS('Status Order', default='', choices=status_order_list)
    status_delete = SelectBS('Status Delete', default='', choices=status_delete_list)
    min_money = StringField(u'最小金额')
    max_money = StringField(u'最大金额')
    start_time = StringField(u'开始时间')
    end_time = StringField(u'结束时间')


================================================
FILE: app_backend/forms/apply_put.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: apply_put.py
@time: 2017/4/13 下午9:31
"""


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress
from app_backend.api.user_auth import get_user_auth_row
from app_backend.forms import SelectBS
from app_common.maps import type_apply_list
from app_common.maps import status_apply_list
from app_common.maps import status_order_list
from app_common.maps import status_delete_list


class ApplyPutSearchForm(FlaskForm):
    """
    投资申请搜索表单
    """
    apply_put_id = StringField('Apply Put Id')
    user_id = StringField('User Id')
    type_apply = SelectBS('Type Apply', default='', choices=type_apply_list)
    money_apply = StringField('Type Apply')
    status_apply = SelectBS('Type Apply', default='', choices=status_apply_list)
    status_order = SelectBS('Status Order', default='', choices=status_order_list)
    status_delete = SelectBS('Status Delete', default='', choices=status_delete_list)
    min_money = StringField(u'最小金额')
    max_money = StringField(u'最大金额')
    start_time = StringField(u'开始时间')
    end_time = StringField(u'结束时间')


================================================
FILE: app_backend/forms/blog.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: blog.py
@time: 2017/3/10 下午11:00
"""


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress


class BlogAddForm(FlaskForm):
    """
    Blog 添加表单
    """
    author = StringField('Author', validators=[DataRequired()])
    title = StringField('Title', validators=[DataRequired(), Length(max=40)])
    pub_date = DateField('Pub Date', validators=[DataRequired()])


class BlogEditForm(FlaskForm):
    """
    Blog 编辑表单
    """
    author = StringField('Author', validators=[DataRequired()])
    title = StringField('Title', validators=[DataRequired(), Length(max=40)])
    pub_date = DateField('Pub Date', validators=[DataRequired()])


================================================
FILE: app_backend/forms/complaint.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: complaint.py
@time: 2017/6/24 下午11:13
"""


from flask_login import current_user
from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, PasswordField, BooleanField, DateField, DateTimeField, DecimalField, IntegerField, HiddenField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress


class ComplaintReplyForm(FlaskForm):
    """
    投诉回复表单
    """
    id = StringField(u'投诉明细ID')
    send_user_id = StringField(u'投诉用户')
    receive_user_id = StringField(u'被投诉用户')
    content = TextAreaField(u'投诉内容', validators=[
        DataRequired(message=u'投诉内容不能为空'),
        Length(min=2, message=u'请输入有效的投诉内容'),
        Length(max=512, message=u'投诉内容超出长度限制'),
    ])
    content_reply = TextAreaField(u'回复内容', validators=[
        DataRequired(message=u'回复内容不能为空'),
        Length(min=2, message=u'请输入有效的回复内容'),
        Length(max=512, message=u'回复内容超出长度限制'),
    ])


================================================
FILE: app_backend/forms/login.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: login.py
@time: 2017/3/10 下午10:49
"""


import re
from flask import session
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress
from app_backend.api.user_auth import get_user_auth_row
from app_backend import app


class SmsCodeValidate(object):
    """
    短信验证码校验
    """
    def __init__(self, message=None):
        self.message = message

        self._reg = re.compile(ur'^\d{6}$')

    def __call__(self, form, field):
        data = field.data
        if not self._reg.match(data):
            raise ValidationError(self.message or u"短信验证码格式错误")

        code_key = '%s:%s' % ('sms_code', 'login')
        # print session.get(code_key), type(session.get(code_key)), data, type(data)
        # 测试模式下,跳过验证
        if not app.config.get('TEST') and session.get(code_key) != data:
            raise ValidationError(self.message or u"短信验证码校验错误")


class LoginForm(FlaskForm):
    """
    账号登录表单
    """
    account = StringField(u'登录账号', validators=[
        DataRequired(u'登录账号不能为空'),
        Length(min=2, max=20, message=u'登录账号长度不符')
    ])
    password = PasswordField(u'登录密码', validators=[
        DataRequired(u'密码不能为空'),
        Length(min=6, max=20, message=u'密码长度不符')
    ])
    sms = StringField(u'短信验证码', validators=[
        DataRequired(u'短信验证码不能为空'),
        Length(min=6, max=6, message=u'短信验证码长度不符'),
        SmsCodeValidate()
    ])
    remember = BooleanField('Remember Me', default=False)


================================================
FILE: app_backend/forms/order.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: order.py
@time: 2017/4/13 下午9:32
"""


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress
from app_backend.api.user_auth import get_user_auth_row
from app_backend.forms import SelectBS
from app_common.maps import status_audit_list
from app_common.maps import status_pay_list
from app_common.maps import status_rec_list


class OrderSearchForm(FlaskForm):
    """
    订单搜索表单
    """
    order_id = StringField(U'订单ID')
    apply_put_id = StringField(u'申请投资ID')      # 申请投资Id
    apply_get_id = StringField(u'申请提现ID')      # 申请提现Id
    apply_put_uid = StringField(u'申请投资用户ID')    # 申请投资用户Id
    apply_get_uid = StringField(u'申请提现用户ID')    # 申请提现用户Id
    status_audit = SelectBS('Status Audit', default='', choices=status_audit_list)      # 审核状态:0:待审核,1:审核通过,2:审核失败
    status_pay = SelectBS('Status Pay', default='', choices=status_pay_list)            # 支付状态:0:待支付,1:支付成功,2:支付失败
    status_rec = SelectBS('Status Rec', default='', choices=status_rec_list)            # 收款状态:0:待收款,1:收款成功,2:收款失败
    start_time = StringField('Start Time')
    end_time = StringField('End Time')


================================================
FILE: app_backend/forms/pay.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: pay.py
@time: 2017/3/18 上午12:29
"""


def func():
    pass


class Main(object):
    def __init__(self):
        pass


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/forms/scheduling.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: scheduling.py
@time: 2017/6/29 下午8:46
"""


from flask_login import current_user
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField, DecimalField, IntegerField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress

from app_common.maps.status_delete import *
from app_common.maps.type_auth import *
from app_backend.api.user import get_user_row_by_id
from app_backend.api.user_auth import get_user_auth_row
from app_backend.api.user_profile import get_user_profile_row_by_id


class UserRightValidate(object):
    """
    用户权限校验
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        # 用户异常处理
        user_info = get_user_row_by_id(field.data)

        if not user_info:
            raise ValidationError(u'异常操作,此用户不存在')
        if user_info.status_delete == int(STATUS_DEL_OK):
            raise ValidationError(u'异常操作,此用户已删除')

        user_profile_info = get_user_profile_row_by_id(field.data)
        if not user_profile_info:
            raise ValidationError(u'异常操作,此用户不存在')


class SchedulingAddForm(FlaskForm):
    """
    排单币添加表单
    """
    user_id = StringField(u'用户ID', validators=[
        DataRequired(message=u'用户ID不能为空'),
        UserRightValidate()
    ])
    amount = IntegerField(u'添加数量', validators=[
        DataRequired(message=u'添加数量必须为整数'),
        NumberRange(min=1, message=u'添加数量必须为整数')
    ])


================================================
FILE: app_backend/forms/score.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: score.py
@time: 2017/4/25 下午1:25
"""


def func():
    pass


class Main(object):
    def __init__(self):
        pass


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/forms/settings.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: settings.py
@time: 2017/6/4 上午11:53
"""


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField, HiddenField, IntegerField, DecimalField
from wtforms.validators import DataRequired, InputRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress, AnyOf

from app_backend.forms import SelectAreaCode, CheckBoxBS


class SwitchForm(FlaskForm):
    """
    开关配置表单
    SWITCH_EXPORT = OFF         # 导出

    SWITCH_REG_ACCOUNT = ON     # 用户账号注册
    SWITCH_REG_PHONE = OFF      # 用户手机注册
    SWITCH_REG_EMAIL = OFF      # 用户邮箱注册

    SWITCH_REG_THREE_PART = OFF     # 第三方平台注册

    SWITCH_LOGIN_ACCOUNT = ON   # 用户账号登录
    SWITCH_LOGIN_PHONE = ON     # 用户手机登录
    SWITCH_LOGIN_EMAIL = ON     # 用户邮箱登录

    SWITCH_LOGIN_THREE_PART = OFF     # 第三方平台登录
    """
    SWITCH_EXPORT = CheckBoxBS(u'导出开关')

    SWITCH_REG_ACCOUNT = CheckBoxBS(u'用户账号注册')
    SWITCH_REG_PHONE = CheckBoxBS(u'用户手机注册')
    SWITCH_REG_EMAIL = CheckBoxBS(u'用户邮箱注册')
    SWITCH_REG_THREE_PART = CheckBoxBS(u'第三方平台注册')

    SWITCH_LOGIN_ACCOUNT = CheckBoxBS(u'用户账号登录')
    SWITCH_LOGIN_PHONE = CheckBoxBS(u'用户手机登录')
    SWITCH_LOGIN_EMAIL = CheckBoxBS(u'用户邮箱登录')
    SWITCH_LOGIN_THREE_PART = CheckBoxBS(u'第三方平台登录')


class UserForm(FlaskForm):
    """
    用户配置表单
    LOCK_REG_NOT_ACTIVE_TTL = 3600*24*3     # 注册后3天内未激活
    LOCK_ACTIVE_NOT_PUT_TTL = 3600*24*3     # 激活后3天内未排单
    LOCK_ORDER_NOT_PAY_TTL = 3600*48        # 匹配后超过48小时不打款
    LOCK_PAY_NOT_REC_TTL = 3600*48          # 收款后48小时不确认
    """
    LOCK_REG_NOT_ACTIVE_TTL = IntegerField(u'注册未激活时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])
    LOCK_ACTIVE_NOT_PUT_TTL = IntegerField(u'激活未排单时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])
    LOCK_ORDER_NOT_PAY_TTL = IntegerField(u'匹配未付款时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])
    LOCK_PAY_NOT_REC_TTL = IntegerField(u'收款未确认时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])


class OrderForm(FlaskForm):
    """
    订单配置
    # 订单限制
    ORDER_MAX_AMOUNT = 10000  # 订单最大金额
    ORDER_MAX_COUNT = 100  # 订单最大数量

    # 推广奖励

    BONUS_DIRECT = 0.03  # 直接推荐奖励

    BONUS_LEVEL_FIRST = 0.05        # 一级推荐奖励
    BONUS_LEVEL_SECOND = 0.05       # 二级推荐奖励
    BONUS_LEVEL_THIRD = 0.03        # 三级推荐奖励
    """
    # 订单限制
    ORDER_MAX_AMOUNT = IntegerField(u'订单最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    ORDER_MAX_COUNT = IntegerField(u'订单最大数量', validators=[
        DataRequired(u'数量不能为空'),
        NumberRange(min=0, message=u'数量必须为正数')
    ])

    # 推广奖励
    BONUS_DIRECT = DecimalField(u'直接推荐奖励', validators=[
        DataRequired(u'利息不能为空'),
        NumberRange(min=0, message=u'利息必须为正数')
    ])
    BONUS_LEVEL_FIRST = DecimalField(u'一级推荐奖励', validators=[
        DataRequired(u'利息不能为空'),
        NumberRange(min=0, max=1, message=u'奖励利息范围:0-1')
    ])
    BONUS_LEVEL_SECOND = DecimalField(u'二级推荐奖励', validators=[
        DataRequired(u'利息不能为空'),
        NumberRange(min=0, max=1, message=u'奖励利息范围:0-1')
    ])
    BONUS_LEVEL_THIRD = DecimalField(u'三级推荐奖励', validators=[
        DataRequired(u'利息不能为空'),
        NumberRange(min=0, max=1, message=u'奖励利息范围:0-1')
    ])


class ApplyPutForm(FlaskForm):
    """
    投资配置
    # 单次投资金额范围
    APPLY_PUT_MIN_EACH = 2000               # 最小值
    APPLY_PUT_MAX_EACH = 20000              # 最大值
    APPLY_PUT_STEP = 1000                   # 投资金额步长(基数)

    # 单个用户投资限制
    APPLY_PUT_USER_MAX_AMOUNT = 30000       # 单个用户投资最大交易中金额
    APPLY_PUT_USER_MAX_COUNT = 1            # 单个用户投资最大交易中单数(0 表示不限制)

    # 每日投资限制
    APPLY_PUT_MAX_AMOUNT_DAILY = 1000000    # 最大金额
    APPLY_PUT_MAX_COUNT_DAILY = 0           # 最大数量(0 表示不限制)

    # 每月投资限制
    APPLY_PUT_MAX_AMOUNT_MONTHLY = 30000000 # 最大值
    APPLY_PUT_MAX_COUNT_MONTHLY = 0         # 最大数量(0 表示不限制)

    # 投资时间配置
    APPLY_PUT_TIME_START = '00:00:00'       # 每天投资申请开始时间
    APPLY_PUT_TIME_END = '59:00:00'         # 每天投资申请结束时间

    # 分红配置
    APPLY_PUT_DAYS_BONUS = 15               # 分红计算天数
    APPLY_PUT_DAYS_LOCK = 15                # 投资锁定天数、提现冻结天数

    APPLY_PUT_INTEREST_ON_PRINCIPAL_TTL = 3600*24*15     # 投资申请后15天完成的订单执行回收本息
    """
    # 单次投资金额范围
    APPLY_PUT_MIN_EACH = IntegerField(u'单次投资最小金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_PUT_MAX_EACH = IntegerField(u'单次投资最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_PUT_STEP = IntegerField(u'投资金额调整基数', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])

    # 单个用户投资限制
    APPLY_PUT_USER_MAX_AMOUNT = IntegerField(u'单个用户投资最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_PUT_USER_MAX_COUNT = IntegerField(u'单个用户投资最大单数', validators=[
        InputRequired(u'数量不能为空'),
        NumberRange(min=0, message=u'数量必须为正数')
    ])

    # 每日投资限制
    APPLY_PUT_MAX_AMOUNT_DAILY = IntegerField(u'每日投资最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_PUT_MAX_COUNT_DAILY = IntegerField(u'每日投资最大单数', validators=[
        DataRequired(u'数量不能为空'),
        NumberRange(min=0, message=u'数量必须为正数')
    ])

    # 每月投资限制
    APPLY_PUT_MAX_AMOUNT_MONTHLY = IntegerField(u'每月投资最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_PUT_MAX_COUNT_MONTHLY = IntegerField(u'每月投资最大单数', validators=[
        DataRequired(u'数量不能为空'),
        NumberRange(min=0, message=u'数量必须为正数')
    ])

    # 投资时间配置
    APPLY_PUT_TIME_START = StringField(u'每天投资申请开始时间', validators=[
        DataRequired(u'时间不能为空')
    ])
    APPLY_PUT_TIME_END = StringField(u'每天投资申请结束时间', validators=[
        DataRequired(u'时间不能为空')
    ])


class ApplyGetForm(FlaskForm):
    """
    提现配置

    # 单次提现金额范围
    APPLY_GET_MIN_EACH = 2000               # 最小值
    APPLY_GET_MAX_EACH = 20000              # 最大值
    APPLY_GET_STEP = 1000                   # 投资金额步长(基数)

    # 单个用户提现限制
    APPLY_GET_USER_MAX_AMOUNT = 30000       # 单个用户提现最大交易中金额
    APPLY_GET_USER_MAX_COUNT = 1            # 单个用户提现最大交易中单数(0 表示不限制)

    # 每日提现限制
    APPLY_GET_MAX_AMOUNT_DAILY = 1000000    # 最大金额
    APPLY_GET_MAX_COUNT_DAILY = 0           # 最大数量(0 表示不限制)

    # 每月提现限制
    APPLY_GET_MAX_AMOUNT_MONTHLY = 30000000 # 最大值
    APPLY_GET_MAX_COUNT_MONTHLY = 0         # 最大数量(0 表示不限制)

    # 提现时间配置
    APPLY_GET_TIME_START = '00:00:00'       # 每天提现申请开始时间
    APPLY_GET_TIME_END = '59:00:00'         # 每天提现申请结束时间
    """
    # 单次投资金额范围
    APPLY_GET_MIN_EACH = IntegerField(u'单次提现最小金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_GET_MAX_EACH = IntegerField(u'单次提现最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_GET_STEP = IntegerField(u'提现金额调整基数', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])

    # 单个用户提现限制
    APPLY_GET_USER_MAX_AMOUNT = IntegerField(u'单个用户提现最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_GET_USER_MAX_COUNT = IntegerField(u'单个用户提现最大单数', validators=[
        InputRequired(u'数量不能为空'),
        NumberRange(min=0, message=u'数量必须为正数')
    ])

    # 每日提现限制
    APPLY_GET_MAX_AMOUNT_DAILY = IntegerField(u'每日提现最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_GET_MAX_COUNT_DAILY = IntegerField(u'每日提现最大单数', validators=[
        DataRequired(u'数量不能为空'),
        NumberRange(min=0, message=u'数量必须为正数')
    ])

    # 每月提现限制
    APPLY_GET_MAX_AMOUNT_MONTHLY = IntegerField(u'每月提现最大金额', validators=[
        DataRequired(u'金额不能为空'),
        NumberRange(min=0, message=u'金额必须为正数')
    ])
    APPLY_GET_MAX_COUNT_MONTHLY = IntegerField(u'每月提现最大单数', validators=[
        DataRequired(u'数量不能为空'),
        NumberRange(min=0, message=u'数量必须为正数')
    ])

    # 提现时间配置
    APPLY_GET_TIME_START = StringField(u'每天提现申请开始时间', validators=[
        DataRequired(u'时间不能为空')
    ])
    APPLY_GET_TIME_END = StringField(u'每天提现申请结束时间', validators=[
        DataRequired(u'时间不能为空')
    ])


class InterestForm(FlaskForm):
    """
    利息配置

    INTEREST_PUT = 0.01  # 投资利息(日息)

    # 支付奖惩比例
    INTEREST_PAY_AHEAD = 0.02  # 提前支付奖金比例
    INTEREST_PAY_DELAY = 0.02  # 延迟支付罚金比例

    # 支付时间差
    DIFF_TIME_PAY_AHEAD = 60*60*1   # 提前支付奖金时间差
    DIFF_TIME_PAY_DELAY = 60*60*24  # 延迟支付罚金时间差

    # 确认奖惩比例
    INTEREST_REC_AHEAD = 0.02  # 提前确认奖金比例
    INTEREST_REC_DELAY = 0.02  # 延迟确认罚金比例

    # 确认时间差
    DIFF_TIME_REC_AHEAD = 60*60*1   # 提前确认奖金时间差
    DIFF_TIME_REC_DELAY = 60*60*24  # 延迟确认罚金时间差
    """
    # 利息配置
    INTEREST_PUT = DecimalField(u'投资利息(日息)', validators=[
        DataRequired(u'利息不能为空'),
        NumberRange(min=0, message=u'利息必须为正数')
    ])

    # 支付奖惩比例
    INTEREST_PAY_AHEAD = DecimalField(u'提前支付奖金比例', validators=[
        DataRequired(u'奖金比例不能为空'),
        NumberRange(min=0, message=u'奖金比例必须为正数')
    ])
    INTEREST_PAY_DELAY = DecimalField(u'延迟支付罚金比例', validators=[
        DataRequired(u'罚金比例不能为空'),
        NumberRange(min=0, message=u'罚金比例必须为正数')
    ])

    # 支付时间差
    DIFF_TIME_PAY_AHEAD = IntegerField(u'提前支付奖金时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])
    DIFF_TIME_PAY_DELAY = IntegerField(u'延迟支付罚金时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])

    # 确认奖惩比例
    INTEREST_REC_AHEAD = DecimalField(u'提前确认奖金比例', validators=[
        DataRequired(u'奖金比例不能为空'),
        NumberRange(min=0, message=u'奖金比例必须为正数')
    ])
    INTEREST_REC_DELAY = DecimalField(u'延迟确认罚金比例', validators=[
        DataRequired(u'罚金比例不能为空'),
        NumberRange(min=0, message=u'罚金比例必须为正数')
    ])

    # 确认时间差
    DIFF_TIME_REC_AHEAD = IntegerField(u'提前确认奖金时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])
    DIFF_TIME_REC_DELAY = IntegerField(u'延迟确认罚金时间', validators=[
        DataRequired(u'时间不能为空'),
        NumberRange(min=0, message=u'时间必须为正数')
    ])


================================================
FILE: app_backend/forms/user.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: user.py
@time: 2017/3/17 下午11:49
"""


from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, DateField, DateTimeField, HiddenField, IntegerField
from wtforms.validators import DataRequired, Length, NumberRange, EqualTo, Email, ValidationError, IPAddress, \
    InputRequired
from flask_login import current_user

from app_backend.api.user import get_user_row_by_id
from app_backend.models import UserProfile, UserAuth
from app_backend.forms import SelectBS, CheckBoxBS
from app_common.maps import status_lock_list
from app_common.maps import status_active_list
from app_common.maps import area_code_list
from app_backend.api.user_auth import get_user_auth_row

from app_backend.api.user_profile import get_user_profile_row
from app_backend.forms import SelectAreaCode, CheckBoxBS
from app_common.maps.status_delete import STATUS_DEL_OK
from app_common.maps.type_auth import TYPE_AUTH_ACCOUNT


def reg_email_repeat(form, field):
    """
    邮箱重复校验
    """
    condition = {
        'auth_type': 'email',
        'auth_key': field.data
    }
    row = get_user_auth_row(**condition)
    if row:
        raise ValidationError(u'注册邮箱重复')


class PhoneFormatValidate(object):
    """
    手机号码格式校验
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        phone_len = len(field.data)
        if phone_len < 6 or phone_len > 11:
            raise ValidationError(u'手机号码长度不符')
        # 中国手机号码格式校验
        if form.area_id.data == '0' and phone_len != 11:
            raise ValidationError(u'手机号码长度不符')
        if field.data.startswith('0'):
            raise ValidationError(u'手机号码格式不符')


class PhoneRepeatValidate(object):
    """
    手机重复校验
    (编辑重复校验排除当前用户)
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        condition = [
            UserProfile.area_id == form.area_id.data,
            UserProfile.phone == field.data,
            UserProfile.user_id != form.user_id.data
        ]
        row = get_user_profile_row(*condition)

        if row:
            raise ValidationError(self.message or u'手机号码重复')


class IdCardRepeatValidate(object):
    """
    身份证号重复校验
    (编辑重复校验排除当前用户)
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        condition = [
            UserProfile.area_id == form.area_id.data,
            UserProfile.id_card == field.data,
            UserProfile.user_id != form.user_id.data
        ]
        row = get_user_profile_row(*condition)

        if row:
            raise ValidationError(self.message or u'身份证号重复')


class RegAccountRepeatValidate(object):
    """
    登录账号重复校验
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        condition = [
            UserAuth.type_auth == TYPE_AUTH_ACCOUNT,
            UserAuth.auth_key == field.data,
            UserAuth.user_id != form.user_id.data
        ]
        row = get_user_auth_row(*condition)
        if row:
            raise ValidationError(self.message or u'登录账号重复')


class PasswordFormatValidate(object):
    """
    密码格式校验
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        password_len = len(field.data)
        if password_len > 0 and (password_len < 6 or password_len > 20):
            raise ValidationError(self.message or u'密码长度不符')


class UserProfileForm(FlaskForm):
    """
    用户基本信息表单
    """
    user_id = HiddenField('User Id', validators=[DataRequired()])
    user_pid = StringField(u'推荐人ID', validators=[InputRequired()])
    nickname = StringField(u'用户名称')
    avatar_url = StringField(u'用户头像')
    email = StringField(u'电子邮箱')
    area_code_choices = []
    for m, n in enumerate(area_code_list):
        area_code_choices.append((m, n))
    area_id = SelectAreaCode(u'手机区号', default='0', choices=area_code_choices, validators=[DataRequired()])
    area_code = StringField('Area Code')
    phone = StringField(u'手机号码', validators=[
        DataRequired(u'手机号码不能为空'),
        PhoneFormatValidate(),
        PhoneRepeatValidate()
    ])
    birthday = DateField(u'出生日期')
    real_name = StringField(u'真实姓名', validators=[
        DataRequired(u'真实姓名不能为空'),
        Length(min=2, max=20, message=u'真实姓名长度不符')
    ])
    id_card = StringField(u'身份证号', validators=[
        DataRequired(u'身份证号不能为空'),
        Length(min=18, max=18, message=u'身份证号长度不符'),
        IdCardRepeatValidate()
    ])
    create_time = DateTimeField(u'创建时间')
    update_time = DateTimeField(u'修改时间')


class UserAuthForm(FlaskForm):
    """
    用户登录认证信息表单
    """
    id = HiddenField('Id', validators=[DataRequired()])
    user_id = HiddenField('User Id', validators=[DataRequired()])
    type_auth = StringField(u'账号类型')
    auth_key = StringField(u'登录账号', validators=[
        DataRequired(u'登录账号不能为空'),
        Length(min=2, max=20, message=u'登录账号长度不符'),
        RegAccountRepeatValidate()
    ])
    auth_secret = PasswordField(u'登录密码', validators=[
        PasswordFormatValidate()
    ])
    status_verified = CheckBoxBS(u'认证状态')
    create_time = DateTimeField(u'创建时间')
    update_time = DateTimeField(u'更新时间')


class UserBankForm(FlaskForm):
    """
    用户基本银行信息表单
    """
    user_id = HiddenField(u'用户ID', validators=[DataRequired()])
    account_name = StringField(u'账户姓名', validators=[
        DataRequired(u'账户姓名不能为空'),
        Length(min=2, max=20, message=u'账户姓名长度不符'),
    ])
    bank_name = StringField(u'银行名称', validators=[DataRequired(u'银行名称不能为空')])
    bank_address = StringField(u'支行名称', validators=[DataRequired(u'支行名称不能为空')])
    bank_account = StringField(u'银行卡号', validators=[DataRequired(u'银行卡号不能为空')])
    status_verified = CheckBoxBS(u'认证状态')
    status_delete = StringField(u'删除状态')
    create_time = DateTimeField(u'创建时间')
    update_time = DateTimeField(u'更新时间')


class EditPassword(FlaskForm):
    """
    修改用户密码
    """
    password = PasswordField('New Password', validators=[
        DataRequired(),
        Length(min=6, max=40),
        EqualTo('confirm', message='Passwords must match')
    ])
    confirm = PasswordField('Repeat Password', validators=[
        DataRequired(),
        Length(min=6, max=40)
    ])


class UserSearchForm(FlaskForm):
    """
    用户搜索表单
    """
    user_id = StringField(u'用户ID')
    user_name = StringField(u'用户名称')
    start_time = StringField('Start Time')
    end_time = StringField('End Time')
    status_active = SelectBS('Status Active', default='', choices=status_active_list)
    status_lock = SelectBS('Status Lock', default='', choices=status_lock_list)


class UserRightValidate(object):
    """
    用户权限校验
    """
    def __init__(self, message=None):
        self.message = message

    def __call__(self, form, field):
        # 用户异常处理
        user_info = get_user_row_by_id(field.data)

        if not user_info:
            raise ValidationError(u'异常操作,此用户不存在')
        if user_info.status_delete == int(STATUS_DEL_OK):
            raise ValidationError(u'异常操作,此用户已删除')


class UserConfigForm(FlaskForm):
    """
    用户配置表单
    """
    user_id = StringField(u'用户ID', validators=[
        DataRequired(message=u'用户ID不能为空'),
        UserRightValidate()
    ])
    team_bonus = StringField(u'团队奖金配置')


================================================
FILE: app_backend/forms/wallet.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: wallet.py
@time: 2017/4/25 下午1:26
"""


def func():
    pass


class Main(object):
    def __init__(self):
        pass


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/lib/__init__.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: __init__.py
@time: 16-1-27 上午10:26
"""


def func():
    pass


class Main(object):
    def __init__(self):
        pass


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/lib/captcha.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: captcha.py
@time: 16-4-11 下午9:23
"""


import random
from PIL import Image, ImageDraw, ImageFont, ImageFilter
from config import BASE_DIR


class Captcha(object):
    """
    验证码(生成)
    """
    # map:将str函数作用于后面序列的每一个元素
    _letter_cases = "abcdefghjkmnpqrstuvwxy"  # 小写字母, 去除可能干扰的i, l, o, z
    _upper_cases = _letter_cases.upper()  # 大写字母
    _numbers = ''.join(map(str, range(3, 10)))  # 数字, 去除可能干扰的0, 1, 2
    init_chars = ''.join((_upper_cases, _numbers))

    def __init__(self,
                 size=(120, 30),
                 chars=init_chars,
                 mode="RGB",
                 bg_color=(255, 255, 255),
                 fg_color=(255, 0, 0),
                 line_color=(255, 0, 0),
                 point_color=(255, 0, 0),
                 font_type='%s/%s' % (BASE_DIR, 'app_backend/static/fonts/Ubuntu-B.ttf'),
                 font_size=18,
                 length=4,
                 draw_lines=True,
                 n_lines=(1, 2),
                 draw_points=True,
                 point_chance=2):
        """
        :param size: 图片的大小,格式(宽,高),默认为(120, 30)
        :param chars: 允许的字符集合,格式字符串
        :param mode: 图片模式,默认为RGB
        :param bg_color: 背景颜色,默认为白色
        :param fg_color: 前景色,验证码字符颜色
        :param font_type: 验证码字体
        :param font_size: 验证码字体大小
        :param length: 验证码字符个数
        :param draw_lines: 是否划干扰线
        :param n_lines: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为True时有效
        :param draw_points: 是否画干扰点
        :param point_chance: 干扰点出现的概率,大小范围[0, 50]
        :return:
        """
        self.size = size
        self.width, self.height = size
        self.chars = chars
        self.bg_color, self.fg_color, self.line_color, self.point_color = bg_color, fg_color, line_color, point_color
        self.font_type, self.font_size = font_type, font_size
        self.length = length
        self.draw_lines, self.n_lines, self.draw_points = draw_lines, n_lines, draw_points
        self.point_chance = point_chance
        self.img = Image.new(mode, size, bg_color)  # 创建图形
        self.draw = ImageDraw.Draw(self.img)  # 创建画笔

    def _get_chars(self):
        """
        生成给定长度的字符串,返回列表格式
        """
        return random.sample(self.chars, self.length)

    def _create_lines(self):
        """
        绘制干扰线
        """
        line_num = random.randint(*self.n_lines)  # 干扰线条数

        for i in range(line_num):
            # 起始点
            begin = (random.randint(0, self.size[0]), random.randint(0, self.size[1]))
            # 结束点
            end = (random.randint(0, self.size[0]), random.randint(0, self.size[1]))
            self.draw.line([begin, end], fill=self.line_color)

    def _create_points(self):
        """
        绘制干扰点
        """
        chance = min(50, max(0, int(self.point_chance)))  # 大小限制在[0, 50]

        for w in xrange(self.width):
            for h in xrange(self.height):
                tmp = random.randint(0, 50)
                if tmp > 50 - chance:
                    self.draw.point((w, h), fill=self.point_color)

    def _create_code_str(self):
        """
        绘制验证码字符
        """
        c_chars = self._get_chars()
        c_str = '%s' % ''.join(c_chars)

        font = ImageFont.truetype(self.font_type, self.font_size)
        font_width, font_height = font.getsize(c_str)

        self.draw.text(((self.width - font_width) / 3, (self.height - font_height) / 4),
                       c_str, font=font, fill=self.fg_color)
        return c_str

    def get(self):
        if self.draw_lines:
            self._create_lines()
        if self.draw_points:
            self._create_points()
        code_str = self._create_code_str()

        # 图形扭曲参数
        params = [1 - float(random.randint(1, 2)) / 100,
                  0,
                  0,
                  0,
                  1 - float(random.randint(1, 10)) / 100,
                  float(random.randint(1, 2)) / 500,
                  0.001,
                  float(random.randint(1, 2)) / 500
                  ]
        img = self.img.transform(self.size, Image.PERSPECTIVE, params)  # 创建扭曲

        img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)  # 滤镜,边界加强(阈值更大)

        return img, code_str


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/lib/cart.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: cart.py
@time: 16-1-27 上午10:27
"""


import redis


redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)


class Cart(object):
    """
    购物车
    """
    uid = ''
    prefix = ''

    def __init__(self, uid, prefix='cart'):
        self.uid = uid
        self.prefix = prefix

    def add_item(self, pid, num=1):
        """
        添加物品
        :param pid:
        :param num:
        :return:
        """
        key = "%s:%s:%s" % (self.prefix, self.uid, pid)
        # 判断物品是否存在
        if redis_client.exists(key):
            redis_client.hincrby(key, 'num', num)
        else:
            # 如果不存在,添加物品至购物车
            redis_client.hmset(key, {'pid': pid, 'num': num})
        return True

    def del_item(self, pid):
        """
        删除物品
        :param pid:
        :return:
        """
        key = "%s:%s:%s" % (self.prefix, self.uid, pid)
        # 判断物品是否存在
        if redis_client.exists(key):
            redis_client.delete(key)
        return True

    def edit_item(self, pid, num):
        """
        编辑物品
        :param pid:
        :param num:
        :return: True/False
        """
        key = "%s:%s:%s" % (self.prefix, self.uid, pid)
        # 判断物品是否存在
        if redis_client.exists(key):
            redis_client.hmset(key, {'pid': pid, 'num': num})
            return True
        return False

    def increase(self, pid, num=1):
        """
        增加物品数量
        :param pid:
        :param num:
        :return:
        """
        key = "%s:%s:%s" % (self.prefix, self.uid, pid)
        # 判断物品是否存在
        if redis_client.exists(key):
            redis_client.hincrby(key, 'num', num)
        else:
            # 如果不存在,添加物品至购物车
            redis_client.hmset(key, {'pid': pid, 'num': num})
        return True

    def decrease(self, pid, num=1):
        """
        减少物品数量
        :param pid:
        :param num:
        :return:
        """
        key = "%s:%s:%s" % (self.prefix, self.uid, pid)
        # 判断物品是否存在
        if redis_client.exists(key):
            if num >= int(redis_client.hget(key, 'num')):
                # 如果超过,设置默认最小数量
                redis_client.hmset(key, {'num': 1})
            else:
                redis_client.hincrby(key, 'num', -num)
        return True

    def cart_list(self):
        """
        显示购物车
        :return: list
        """
        key = "%s:%s:*" % (self.prefix, self.uid)
        car_key_list = redis_client.keys(key)
        return [redis_client.hgetall(item) for item in car_key_list]

    def clean(self):
        """
        清空购物车
        :return: 0/int
        """
        key = "%s:%s:*" % (self.prefix, self.uid)
        car_key_list = redis_client.keys(key)
        return redis_client.delete(*car_key_list) if car_key_list else 0


def test():
    obj = Cart('02')
    print obj.cart_list()
    obj.add_item('3')
    print obj.cart_list()
    obj.del_item('4')
    print obj.cart_list()
    obj.increase('3')
    print obj.cart_list()
    obj.decrease('3')
    print obj.cart_list()
    obj.add_item('4')
    print obj.cart_list()
    obj.add_item('5', 10)
    print obj.cart_list()
    obj.edit_item('5', 9)
    print obj.cart_list()
    obj.decrease('4', 10)
    print obj.cart_list()


if __name__ == '__main__':
    test()


"""
测试结果
[]
[{'num': '1', 'pid': '3'}]
[{'num': '1', 'pid': '3'}]
[{'num': '2', 'pid': '3'}]
[{'num': '1', 'pid': '3'}]
[{'num': '1', 'pid': '4'}, {'num': '1', 'pid': '3'}]
[{'num': '10', 'pid': '5'}, {'num': '1', 'pid': '4'}, {'num': '1', 'pid': '3'}]
[{'num': '10', 'pid': '5'}, {'num': '1', 'pid': '4'}, {'num': '1', 'pid': '3'}]
"""


================================================
FILE: app_backend/lib/container.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: container.py
@time: 16-2-17 下午3:46
"""


import redis
import time
from copy import deepcopy


redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)


class Container(object):
    """
    容器(数据结构:有序集合)
    """
    # 定义支持的实体类型
    entity_name_list = ['user', 'blog', 'topic', 'subject', 'product']

    # 定义支持的统计类型
    stat_type_list = [
        'favor',  # 支持数
        'decry',  # 反对数
        'follow',  # 关注数
        'fans',  # 粉丝数
        'view',  # 点击数
        'collect',  # 收藏数
        'flag'  # 举报数
    ]

    # 定义项目容器状态结构
    container_status_dict = {
        'favor': False,  # 支持
        'flag': False,  # 举报
        'collect': False  # 收藏
    }

    def __init__(self, entity_name, prefix='container'):
        if entity_name not in self.entity_name_list:
            raise TypeError(u'类型错误')
        self.entity_name = entity_name
        self.prefix = prefix

    def add_item(self, stat_type, key_id, item_id):
        """
        添加统计项目
        :param stat_type:
        :param key_id:
        :param item_id:
        :return:0/1
        """
        key = "%s:%s:%s:%s" % (self.prefix, self.entity_name, stat_type, key_id)
        return redis_client.zadd(key, time.time(), item_id)

    def del_item(self, stat_type, key_id, item_id):
        """
        删除统计项目
        :param stat_type:
        :param key_id:
        :param item_id:
        :return:0/1
        """
        key = "%s:%s:%s:%s" % (self.prefix, self.entity_name, stat_type, key_id)
        return redis_client.zrem(key, item_id)

    def count_item(self, stat_type, key_id):
        """
        统计相关项目的总数
        :param stat_type:
        :param key_id:
        :return:
        """
        key = "%s:%s:%s:%s" % (self.prefix, self.entity_name, stat_type, key_id)
        return redis_client.zcount(key, 0, time.time())

    def get_items(self, stat_type, key_id, page=1, pagesize=10):
        """
        分页获取相关项目列表(根据时间降序)
        :param stat_type:
        :param key_id:
        :param page:
        :param pagesize:
        :return:[]
        """
        offset = 0
        if page > 1:
            offset = (page - 1) * pagesize
        max_count = (page * pagesize) - 1
        key = "%s:%s:%s:%s" % (self.prefix, self.entity_name, stat_type, key_id)
        item_ids = redis_client.zrevrange(key, offset, max_count)  # 倒序取值
        # item_ids = redis_client.zrange(key, offset, max_count)  # 顺序取值
        return item_ids

    def get_all_items(self, stat_type, key_id):
        """
        获取所有相关项目列表
        :param stat_type:
        :param key_id:
        :return:[]
        """
        key = "%s:%s:%s:%s" % (self.prefix, self.entity_name, stat_type, key_id)
        total = redis_client.zcard(key)
        item_ids = redis_client.zrevrange(key, 0, total - 1, True)
        return item_ids

    def get_item_container_status(self, key_id, item_id):
        """
        获取容器状态
        :param key_id:
        :param item_id:
        :return:
        """
        container_status = deepcopy(self.container_status_dict)
        for stat_type in container_status.keys():
            key = "%s:%s:%s:%s" % (self.prefix, self.entity_name, stat_type, key_id)
            # 无序集合sismember; 有序用 zscore 返回值:None
            if redis_client.zscore(key, item_id):
                container_status[stat_type] = True
        return container_status

    def get_item_list_container_status(self, key_ids, item_id):
        """
        显示列表容器状态
        按原 item_ids 列表顺序返回结果
        :param key_ids:
        :param item_id:
        :return:
        """
        container_list = []
        for key_id in key_ids:
            container_status = self.get_item_container_status(key_id, item_id)
            container_list.append(container_status)
        return container_list


def test_blog_favor():
    """
    测试 blog favor
    """
    obj = Container('blog')
    print obj.add_item('favor', 2, 5)  # 1
    print obj.add_item('favor', 2, 5)  # 0
    print obj.add_item('favor', 2, 6)  # 1
    print obj.get_items('favor', 2)  # ['6', '5']
    print obj.get_items('favor', 3)  # []
    print obj.count_item('favor', 2)  # 2
    print obj.del_item('favor', 3, 5)  # 0
    print obj.count_item('favor', 3)  # 0
    print obj.del_item('favor', 2, 5)  # 1
    print obj.count_item('favor', 2)  # 1
    print obj.del_item('favor', 2, 6)  # 1
    print obj.count_item('favor', 2)  # 0


if __name__ == '__main__':
    test_blog_favor()


================================================
FILE: app_backend/lib/counter.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: count.py
@time: 16-1-27 下午3:03
"""


import redis
from copy import deepcopy


redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)
redis_pipeline = redis_client.pipeline()


class Counter(object):
    """
    计数器
    """
    # 定义支持的实体类型
    entity_name_list = ['user', 'blog', 'topic', 'subject', 'product']

    # 定义支持的统计类型
    stat_type_list = [
        'favor',  # 支持
        'decry',  # 反对
        'follow',  # 关注
        'fans',  # 粉丝
        'view',  # 点击
        'collect',  # 收藏
        'flag'  # 举报
    ]

    # 定义用户计数器结构
    user_counter_dict = {
        'favor': '0',  # 支持数
        'decry': '0',  # 反对数
        'follow': '0',  # 关注数
        'fans': '0'  # 粉丝数
    }

    # 定义话题计数器结构
    topic_counter_dict = {
        'favor': '0',  # 支持数
        'decry': '0',  # 反对数
        'view': '0',  # 点击数
        'collect': '0'  # 收藏数
    }

    # 定义博客计数器结构
    blog_counter_dict = {
        'favor': '0',  # 支持数
        'flag': '0',  # 举报数
        'view': '0',  # 点击数
        'collect': '0'  # 收藏数
    }

    def __init__(self, entity_name, prefix='counter'):
        if entity_name not in self.entity_name_list:
            raise TypeError(u'类型错误')
        self.entity_name = entity_name
        self.prefix = prefix

    def increase(self, item_id, stat_type, num=1):
        """
        增加次数
        :param item_id:
        :param stat_type:
        :param num:
        :return:
        """
        if stat_type not in self.stat_type_list:
            raise TypeError(u'类型错误')
        key = "%s:%s:%s" % (self.prefix, self.entity_name, item_id)
        # 判断物品是否存在
        if redis_client.exists(key):
            redis_client.hincrby(key, stat_type, num)
        else:
            # 如果不存在,添加物品至购物车
            redis_client.hmset(key, {stat_type: num})
        return True

    def decrease(self, item_id, stat_type, num=1):
        """
        减少次数
        :param item_id:
        :param stat_type:
        :param num:
        :return:
        """
        key = "%s:%s:%s" % (self.prefix, self.entity_name, item_id)
        # 判断物品是否存在
        if redis_client.exists(key):
            if num >= int(redis_client.hget(key, stat_type)):
                # 如果超过,设置默认最小数量
                redis_client.hmset(key, {stat_type: 1})
            else:
                redis_client.hincrby(key, stat_type, -num)
        return True

    def del_item(self, item_id):
        """
        删除物品
        :param item_id:
        :return:
        """
        key = "%s:%s:%s" % (self.prefix, self.entity_name, item_id)
        # 判断物品是否存在
        if redis_client.exists(key):
            redis_client.delete(key)
        return True

    def counter_blog_item(self, blog_id):
        """
        显示 blog 计数器
        :param blog_id:
        :return:
        """
        key = "%s:%s:%s" % (self.prefix, self.entity_name, blog_id)
        # 判断物品是否存在
        blog_dict = deepcopy(self.blog_counter_dict)
        if redis_client.exists(key):
            redis_result = redis_client.hgetall(key)
            blog_dict.update(redis_result)
        return blog_dict

    def counter_user_list_all(self):
        """
        显示全部用户计数器
        :return:
        """
        key = "%s:%s:*" % (self.prefix, self.entity_name)
        cnt_key_list = redis_client.keys(key)
        cnt_list = []
        for item in cnt_key_list:
            user_dict = deepcopy(self.user_counter_dict)  # 注意是深度复制,不能写成 user_dict = self.user_counter_dict
            user_dict.update(redis_client.hgetall(item))
            cnt_list.append(user_dict)
        return cnt_list

    def counter_user_list(self, uid_list):
        """
        显示用户计数器
        按原 uid_list 列表顺序返回结果
        :param uid_list:
        :return:
        """
        cnt_list = []
        for uid in uid_list:
            key = "%s:%s:%s" % (self.prefix, self.entity_name, uid)
            if redis_client.exists(key):
                user_dict = deepcopy(self.user_counter_dict)
                redis_result = redis_client.hgetall(key)
                user_dict.update(redis_result)
                cnt_list.append(user_dict)
        return cnt_list

    def counter_topic_list(self, topic_list):
        """
        显示话题计数器
        按原 uid_list 列表顺序返回结果
        :param topic_list:
        :return:
        """
        cnt_list = []
        for topic in topic_list:
            key = "%s:%s:%s" % (self.prefix, self.entity_name, topic)
            user_dict = deepcopy(self.topic_counter_dict)
            if redis_client.exists(key):
                redis_result = redis_client.hgetall(key)
                user_dict.update(redis_result)
            cnt_list.append(user_dict)
        return cnt_list

    def counter_blog_list(self, blog_list):
        """
        显示 blog 计数器
        按原 blog_list 列表顺序返回结果
        :param blog_list:
        :return:
        """
        cnt_list = []
        for blog in blog_list:
            key = "%s:%s:%s" % (self.prefix, self.entity_name, blog)
            blog_dict = deepcopy(self.blog_counter_dict)
            if redis_client.exists(key):
                redis_result = redis_client.hgetall(key)
                blog_dict.update(redis_result)
            cnt_list.append(blog_dict)
        return cnt_list

    def set_blog_counter(self, blog_id, stat_type, num=1):
        """
        设置 blog 计数器
        :param blog_id:
        :param stat_type:
        :param num:
        :return:
        """
        self.increase(blog_id, stat_type, num)
        return self.counter_blog_item(blog_id)


def test_user():
    import json
    user_cnt_obj = Counter('user')
    user_cnt_obj.del_item(12)
    user_cnt_obj.del_item(13)
    user_cnt_obj.increase(12, 'favor')
    user_cnt_obj.increase(13, 'fans', 5)
    user_cnt_obj.increase(14, 'fans', 4)
    user_cnt_obj.increase(14, 'follow', 3)
    print json.dumps(user_cnt_obj.counter_user_list(['12', '13']), indent=4, ensure_ascii=False)
    print json.dumps(user_cnt_obj.counter_user_list_all(), indent=4, ensure_ascii=False)


def test_topic():
    import json
    topic_cnt_obj = Counter('topic')
    print json.dumps(topic_cnt_obj.counter_topic_list(['1', '2', '3']), indent=4, ensure_ascii=False)
    topic_cnt_obj.increase(4, 'fans', 4)
    print topic_cnt_obj.counter_blog_item(4)
    print topic_cnt_obj.set_blog_counter(4, 'flag')


if __name__ == '__main__':
    # test_user()
    test_topic()


================================================
FILE: app_backend/lib/mongo.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: mongo.py
@time: 2017/4/10 下午11:44
"""


from pymongo import MongoClient
from pymongo import errors
import json
from datetime import date, datetime
import logging

logger = logging.getLogger(__name__)


class Mongodb(object):
    """
    自定义mongodb工具
    """
    def __init__(self, db_config, db_name=None):
        self.db_config = db_config
        if db_name is not None:
            self.db_config['database'] = db_name
        try:
            # 实例化mongodb
            self.conn = MongoClient(self.db_config['host'], self.db_config['port'])
            # 获取数据库对象(选择/切换)
            self.db = self.conn.get_database(self.db_config['database'])
        except errors.ServerSelectionTimeoutError, e:
            logger.error('连接超时:%s' % e)
        except Exception, e:
            logger.error(e)

    @staticmethod
    def __default(obj):
        """
        支持datetime的json encode
        TypeError: datetime.datetime(2015, 10, 21, 8, 42, 54) is not JSON serializable
        :param obj:
        :return:
        """
        if isinstance(obj, datetime):
            return obj.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(obj, date):
            return obj.strftime('%Y-%m-%d')
        else:
            raise TypeError('%r is not JSON serializable' % obj)

    def close_conn(self):
        """
        关闭连接
        关闭所有套接字的连接池和停止监控线程。
        如果这个实例再次使用它将自动重启和重新启动线程
        """
        self.conn.close()

    def find_one(self, table_name, condition=None):
        """
        查询单条记录
        :param table_name:
        :param condition:
        :return:
        """
        return self.db.get_collection(table_name).find_one(condition)

    def find_all(self, table_name, condition=None):
        """
        查询多条记录
        :param table_name:
        :param condition:
        :return:
        """
        return self.db.get_collection(table_name).find(condition)

    def count(self, table_name, condition=None):
        """
        查询记录总数
        :param table_name:
        :param condition:
        :return:
        """
        return self.db.get_collection(table_name).count(condition)

    def distinct(self, table_name, field_name):
        """
        查询某字段去重后值的范围
        :param table_name:
        :param field_name:
        :return:
        """
        return self.db.get_collection(table_name).distinct(field_name)

    def insert(self, table_name, data):
        """
        插入数据
        :param table_name:
        :param data:
        :return:
        """
        try:
            ids = self.db.get_collection(table_name).insert(data)
            return ids
        except Exception, e:
            logger.error('插入失败:%s' % e)
            return None

    def update(self, table_name, condition, update_data, update_type='set'):
        """
        批量更新数据
        upsert : 如果不存在update的记录,是否插入;true为插入,默认是false,不插入。
        :param table_name:
        :param condition:
        :param update_data:
        :param update_type: 范围:['inc', 'set', 'unset', 'push', 'pushAll', 'addToSet', 'pop', 'pull', 'pullAll', 'rename']
        :return:
        """
        if update_type not in ['inc', 'set', 'unset', 'push', 'pushAll', 'addToSet', 'pop', 'pull', 'pullAll', 'rename']:
            logger.error('更新失败,类型错误:%s' % update_type)
            return None
        try:
            result = self.db.get_collection(table_name).update_many(condition, {'$%s' % update_type: update_data})
            logger.info('更新成功,匹配数量:%s;更新数量:%s' % (result.matched_count, result.modified_count))
            return result.modified_count  # 返回更新数量,仅支持MongoDB 2.6及以上版本
        except Exception, e:
            logger.error('更新失败:%s' % e)
            return None

    def remove(self, table_name, condition=None):
        """
        删除文档记录
        :param table_name:
        :param condition:
        :return:
        """
        result = self.db.get_collection(table_name).remove(condition)
        if result.get('err') is None:
            logger.info('删除成功,删除行数%s' % result.get('n', 0))
            return result.get('n', 0)
        else:
            logger.error('删除失败:%s' % result.get('err'))
            return None

    def output_row(self, table_name, condition=None, style=0):
        """
        格式化输出单个记录
        style=0 键值对齐风格
        style=1 JSON缩进风格
        :param table_name:
        :param condition:
        :param style:
        :return:
        """
        row = self.find_one(table_name, condition)
        if style == 0:
            # 获取KEY最大的长度作为缩进依据
            max_len_key = max([len(each_key) for each_key in row.keys()])
            str_format = '{0: >%s}' % max_len_key
            keys = [str_format.format(each_key) for each_key in row.keys()]
            result = dict(zip(keys, row.values()))
            print '**********  表名[%s]  **********' % table_name
            for key, item in result.items():
                print key, ':', item
        else:
            print json.dumps(row, indent=4, ensure_ascii=False, default=self.__default)

    def output_rows(self, table_name, condition=None, style=0):
        """
        格式化输出批量记录
        style=0 键值对齐风格
        style=1 JSON缩进风格
        :param table_name:
        :param condition:
        :param style:
        :return:
        """
        rows = self.find_all(table_name, condition)
        total = self.count(table_name, condition)
        if style == 0:
            count = 0
            for row in rows:
                # 获取KEY最大的长度作为缩进依据
                max_len_key = max([len(each_key) for each_key in row.keys()])
                str_format = '{0: >%s}' % max_len_key
                keys = [str_format.format(each_key) for each_key in row.keys()]
                result = dict(zip(keys, row.values()))
                count += 1
                print '**********  表名[%s]  [%d/%d]  **********' % (table_name, count, total)
                for key, item in result.items():
                    print key, ':', item
        else:
            for row in rows:
                print json.dumps(row, indent=4, ensure_ascii=False, default=self.__default)



================================================
FILE: app_backend/lib/qiniu_store.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: qiniu.py
@time: 16-5-2 下午1:41
"""


from urlparse import urljoin
import qiniu


class QiNiuClient(object):
    """
    七牛云存储
    """
    def __init__(self, app=None):
        """
        初始化应用
        """
        if app is not None:
            self._access_key = app.config.get('QINIU_ACCESS_KEY', '')
            self._secret_key = app.config.get('QINIU_SECRET_KEY', '')
            self._bucket_name = app.config.get('QINIU_BUCKET_NAME', '')
            domain = app.config.get('QINIU_BUCKET_DOMAIN')
            if not domain:
                self._base_url = 'http://' + self._bucket_name + '.qiniudn.com'
            else:
                self._base_url = 'http://' + domain

    def save(self, data, filename=None):
        """
        保存
        """
        auth = qiniu.Auth(self._access_key, self._secret_key)
        token = auth.upload_token(self._bucket_name)
        return qiniu.put_data(token, filename, data)

    def delete(self, filename):
        """
        删除
        """
        auth = qiniu.Auth(self._access_key, self._secret_key)
        bucket = qiniu.BucketManager(auth)
        return bucket.delete(self._bucket_name, filename)

    def url(self, filename):
        """
        链接
        """
        return urljoin(self._base_url, filename)


if __name__ == '__main__':
    pass


================================================
FILE: app_backend/lib/rabbit_mq.py
================================================
#!/usr/bin/env python
# encoding: utf-8

"""
@author: zhanghe
@software: PyCharm
@file: rabbit_mq.py
@time: 2017/4/1 上午9:55
"""


import pika
import json
import traceback


from config import current_config

RABBIT_MQ = current_config.RABBIT_MQ

_client_conn = {'conn': None}


def get_conn():
    """
    获取连接
    :return:
    """
    if not _client_conn.get('conn'):
        conn_mq = pika.BlockingConnection(
            pika.ConnectionParameters(
                host=RABBIT_MQ.get('host', '127.0.0.1'),
                port=RABBIT_MQ.get('port', 5672),
                virtual_host=RABBIT_MQ.get('virtual_host', '/'),
                heartbeat_interval=RABBIT_MQ.get('heartbeat_interval', 0),
                retry_delay=RABBIT_MQ.get('retry_delay', 3)
            )
        )
        _client_conn['conn'] = conn_mq
        return conn_mq
    else:
        return _client_conn['conn']


class RabbitQueue(object):
    """
    队列
    """
    def __init__(self, exchange, queue_name, exchange_type='direct', durable=True, **arguments):
        self.exchange = exchange
        self.queue_name = queue_name
        self.exchange_type = exchange_type
        self.durable = durable
        self.arguments = arguments
        # print u'实例化附加参数:', arguments
        self.conn = get_conn()
        self.channel = self.conn.channel()
        self.declare()

    def close_conn(self):
        """
        关闭连接
        :return:
        """
        if _client_conn.get('conn'):
            self.conn.close()
            _client_conn.pop('conn')

    def declare(self):
        """
        声明队列
        """
        self.channel.exchange_declare(exchange=self.exchange, exchange_type=self.exchange_type, durable=self.durable)
        self.channel.queue_declare(queue=self.queue_name, durable=self.durable, arguments=self.arguments)
        self.channel.queue_bind(exchange=self.exchange,
                                queue=self.queue_name,
                                routing_key=self.queue_name)
        self.channel.basic_qos(prefetch_count=1)

    def put(self, message):
        """
        推送队列消息
        :param message:
        :return:
        """
        if isinstance(message, dict):
            message = json.dumps(message)
        self.channel.basic_publish(exchange=self.exchange,
                                   routing_key=self.queue_name,
                                   body=message,
                                   properties=pika.BasicProperties(
                                       delivery_mode=2 if self.durable else 1,  # make message persistent
                                   ))
        print " [x] Sent %r" % (message,)

    def get(self):
        """
        获取队列消息
        :return:
        """
        # data = self.channel.basic_get(self.queue_name)
        # print data
        method_frame, header_frame, body = self.channel.basic_get(self.queue_name)
        if method_frame:
            print " [x]  Get %r" % (body,)
            print method_frame, header_frame, body
            self.channel.basic_ack(method_frame.delivery_tag)
        else:
            print('No message returned')

    def get_block(self):
        """
        获取队列消息(阻塞)
        direct 模式下多进程消费,进程轮流获取单个消息
        :return:
        """
        def callback(ch, method, properties, body):
            try:
                print " [x]  Get %r" % (body,)
                # raise Exception('test')
                ch.basic_ack(delivery_tag=method.delivery_tag)
            except Exception as e:
                print traceback.print_exc()
                raise e

        self.consume(callback)

    def consume(self, callback):
        """
        消费
        """
        # 处理队列
        self.channel.basic_consume(consumer_callback=callback, queue=self.queue_name)
        try:
            self.channel.start_consuming()
        except KeyboardInterrupt:
            self.channel.stop_consuming()
        self.close_conn()


class RabbitPubSub(object):
    """
    订阅
    """
    def __init__(self, exchange, exchange_type='fanout', durable=True, **arguments):
        self.exchange = exchange
        self.exchange_type = exchange_type
        self.durable = durable
        self.arguments = arguments
        # print u'实例化附加参数:', arguments
        self.conn = get_conn()
        self.channel = self.conn.channel()
        self.channel.exchange_declare(exchange=self.exchange, exchange_type=self.exchange_type, durable=self.durable)

    def close_conn(self):
        """
        关闭连接
        :return:
        """
        if _client_conn.get('conn'):
            self.conn.close()
            _client_conn.pop('conn')

    def pub(self, message):
        """
        推送队列消息
        :param message:
        :return:
        """
        if isinstance(message, dict):
            message = json.dumps(message)
        self.channel.basic_publish(exchange=self.exchange,
                                   body=message,
                                   routing_key='',
                                   properties=pika.BasicProperties(
                                       delivery_mode=2 if self.durable else 1,  # make message persistent
                                   ))
        print " [x] Pub %r" % (message,)

    def sub(self):
        """
        订阅队列消息
        exchange_type='fanout'
        fanout 模式下多进程消费,进程同时同步获取消息
        :return:
        """
        result = self.channel.queue_declare(exclusive=True)
        queue_name = result.method.queue

        self.channel.queue_bind(exchange=self.exchange, queue=queue_name)

        print ' [*] Waiting for logs. To exit press CTRL+C'

        def callback(ch, method, properties, body):
            print " [x] Sub %r" % (body,)

        self.channel.basic_consume(callback,
                                   queue=queue_name,
                                   no_ack=True
                                   )

        self.channel.start_consuming()


class RabbitDelayQueue(object):
    """
    延时队列
    q_d_client = RabbitDelayQueue('amq.direct', q_name, ttl=3600*24)
    """
    def __init__(self, exchange, queue_name, exchange_type='direct', durable=True, **arguments):
        self.exchange = exchange
        self.queue_name = queue_name
        self.delay_queue_name = '%s_delay' % queue_name
        self.exchange_type = exchange_type
        self.durable = durable
        self.arguments = arguments
        # print u'实例化附加参数:', arguments
        self.conn = get_conn()

        self.channel = self.conn.channel()
        self.channel.confirm_delivery()
        self.channel.queue_declare(queue=queue_name, durable=durable)

        # We need to bind this channel to an exchange, that will be used to transfer
        # messages from our delay queue.
        self.channel.queue_bind(exchange=self.exchange,
                                queue=queue_name)

        # 延时队列定义
        self.delay_channel = self.conn.channel()
        self.delay_channel.confirm_delivery()

        # This is where we declare the delay, and routing for our delay channel.
        self.delay_channel.queue_declare(queue=self.delay_queue_name, durable=durable, arguments={
            'x-message-ttl': arguments.get('ttl', 5)*1000,  # Delay until the message is transferred in milliseconds.
            'x-dead-letter-exchange': self.exchange,  # Exchange used to transfer the message from A to B.
            'x-dead-letter-routing-key': self.queue_name  # Name of the queue we want the message transferred to.
        })

    def close_conn(self):
        """
        关闭连接
        :return:
        """
        if _client_conn.get('conn'):
            self.conn.close()
            _client_conn.pop('conn')

    def put(self, message):
        """
        推送队列消息
        :param message:
        :return:
        """
        if isinstance(message, dict):
            message = json.dumps(message)
        self.delay_channel.basic_publish(exchange='',
                                         routing_key=self.delay_queue_name,
                                         body=message,
                                         properties=pika.BasicProperties(
                                             delivery_mode=2 if self.durable else 1,  # make message persistent
                                         ))
        print " [x] Sent %r" % (message,)

    def get(self):
        """
        获取队列消息
        :return:
        """
        # data = self.channel.basic_get(self.queue_name)
        # print data
        method_frame, header_frame, body = self.channel.basic_get(self.queue_name)
        if method_frame:
            print " [x]  Get %r" % (body,)
            print method_frame, header_frame, body
            self.channel.basic_ack(method_frame.delivery_tag)
        else:
            print('No message returned')

    def get_block(self):
        """
        获取队列消息(阻塞)
        direct 模式下多进程消费,进程轮流获取单个消息
        :return:
        """
        def callback(ch, method, properties, body):
            try:
                print " [x]  Get %r" % (body,)
                # raise Exception('test')
                ch.basic_ack(delivery_tag=method.delivery_tag)
            except Exception as e:
                print traceback.print_exc()
                raise e

        self.consume(callback)

    def consume(self, callback):
        """
        消费
        """
        # 处理队列
        self.channel.basic_consume(consumer_callback=callback, queue=self.queue_name)
        try:
            self.channel.start_consuming()
        except KeyboardInterrupt:
            self.channel.stop_consuming()
        self.close_conn()


class RabbitPriorityQueue(RabbitQueue):
    """
    优先级队列
    max_priority=255
    """
    def __init__(self, exchange, queue_name, exchange_type='direct', durable=True, **arguments):
        super(RabbitPriorityQueue, self).__init__(exchange, queue_name, exchange_type, durable, **arguments)

    def declare(self):
        """
        声明队列
        """
        self.channel.exchange_declare(exchange=self.exchange, exchange_type=self.exchange_type, durable=self.durable)
        self.channel.queue_declare(
            queue=self.queue_name,
            durable=self.durable,
            arguments={
                'x-max-priority': self.arguments.get('max_priority', 255)
            }
        )
        self.channel.queue_bind(exchange=self.exchange,
                                queue=self.queue_name,
                                routing_key=self.queue_name)
        self.channel.basic_qos(prefetch_count=1)

    def put(self, message, priority=0):
        """
        推送队列消息
        :param message:
        :param priority:
        :return:
        """
        print '--priority:', priority
        if isinstance(message, dict):
            message = json.dumps(message)
        self.channel.basic_publish(exchange=self.exchange,
                                   routing_key=self.queue_name,
                                   body=message,
                                   properties=pika.BasicProperties(
                                       delivery_mode=2 if self.durable else 1,  # make message persistent
                                       priority=priority
                                   ))
        print " [x] Sent %r" % (message,)


def test_queue():
    """
    队列测试
    参数:方法 队列名称 消息
    :return:
    """
    import sys
    print sys.argv
    if len(sys.argv) < 3:
        print u'参数:方法 队列名称 消息'
        print u'python rabbit_mq.py put q_task 123456'
        print u'python rabbit_mq.py get q_task'
        return
    method, q_name, msg = sys.argv[1], sys.argv[2],
Download .txt
gitextract_dou5xjo6/

├── .gitignore
├── README.md
├── app_api/
│   ├── README.md
│   └── __init__.py
├── app_backend/
│   ├── README.md
│   ├── __init__.py
│   ├── api/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── active_item.py
│   │   ├── admin.py
│   │   ├── admin_role.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── author.py
│   │   ├── blog.py
│   │   ├── complaint.py
│   │   ├── message.py
│   │   ├── order.py
│   │   ├── scheduling.py
│   │   ├── scheduling_item.py
│   │   ├── score.py
│   │   ├── user.py
│   │   ├── user_auth.py
│   │   ├── user_bank.py
│   │   ├── user_config.py
│   │   ├── user_profile.py
│   │   └── wallet.py
│   ├── database.py
│   ├── filters.py
│   ├── forms/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── admin.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── blog.py
│   │   ├── complaint.py
│   │   ├── login.py
│   │   ├── order.py
│   │   ├── pay.py
│   │   ├── scheduling.py
│   │   ├── score.py
│   │   ├── settings.py
│   │   ├── user.py
│   │   └── wallet.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── captcha.py
│   │   ├── cart.py
│   │   ├── container.py
│   │   ├── counter.py
│   │   ├── mongo.py
│   │   ├── qiniu_store.py
│   │   ├── rabbit_mq.py
│   │   ├── redis_session.py
│   │   ├── sendcloud.py
│   │   ├── session.py
│   │   ├── sms_chuanglan.py
│   │   ├── sms_chuanglan_iso.py
│   │   └── token.py
│   ├── login.py
│   ├── models.py
│   ├── pages/
│   │   ├── blank.html
│   │   ├── buttons.html
│   │   ├── flot.html
│   │   ├── forms.html
│   │   ├── grid.html
│   │   ├── icons.html
│   │   ├── index.html
│   │   ├── login.html
│   │   ├── morris.html
│   │   ├── notifications.html
│   │   ├── panels-wells.html
│   │   ├── tables.html
│   │   └── typography.html
│   ├── permissions.py
│   ├── static/
│   │   ├── css/
│   │   │   ├── bootstrap-select.css
│   │   │   ├── bootstrap-theme.css
│   │   │   ├── bootstrap.css
│   │   │   ├── custom.css
│   │   │   ├── lightbox.css
│   │   │   ├── sb-admin-2.css
│   │   │   └── slideout.css
│   │   ├── csv/
│   │   │   └── flare.csv
│   │   ├── js/
│   │   │   ├── bootstrap-select.js
│   │   │   ├── bootstrap.js
│   │   │   ├── custom.js
│   │   │   ├── i18n/
│   │   │   │   ├── defaults-ar_AR.js
│   │   │   │   ├── defaults-bg_BG.js
│   │   │   │   ├── defaults-cro_CRO.js
│   │   │   │   ├── defaults-cs_CZ.js
│   │   │   │   ├── defaults-da_DK.js
│   │   │   │   ├── defaults-de_DE.js
│   │   │   │   ├── defaults-en_US.js
│   │   │   │   ├── defaults-es_CL.js
│   │   │   │   ├── defaults-es_ES.js
│   │   │   │   ├── defaults-eu.js
│   │   │   │   ├── defaults-fa_IR.js
│   │   │   │   ├── defaults-fi_FI.js
│   │   │   │   ├── defaults-fr_FR.js
│   │   │   │   ├── defaults-hu_HU.js
│   │   │   │   ├── defaults-id_ID.js
│   │   │   │   ├── defaults-it_IT.js
│   │   │   │   ├── defaults-ko_KR.js
│   │   │   │   ├── defaults-lt_LT.js
│   │   │   │   ├── defaults-nb_NO.js
│   │   │   │   ├── defaults-nl_NL.js
│   │   │   │   ├── defaults-pl_PL.js
│   │   │   │   ├── defaults-pt_BR.js
│   │   │   │   ├── defaults-pt_PT.js
│   │   │   │   ├── defaults-ro_RO.js
│   │   │   │   ├── defaults-ru_RU.js
│   │   │   │   ├── defaults-sk_SK.js
│   │   │   │   ├── defaults-sl_SI.js
│   │   │   │   ├── defaults-sv_SE.js
│   │   │   │   ├── defaults-tr_TR.js
│   │   │   │   ├── defaults-ua_UA.js
│   │   │   │   ├── defaults-zh_CN.js
│   │   │   │   └── defaults-zh_TW.js
│   │   │   ├── npm.js
│   │   │   └── sb-admin-2.js
│   │   ├── plugin/
│   │   │   ├── Chart.js-2.6.0/
│   │   │   │   ├── .codeclimate.yml
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .eslintignore
│   │   │   │   ├── .eslintrc
│   │   │   │   ├── .github/
│   │   │   │   │   ├── ISSUE_TEMPLATE.md
│   │   │   │   │   └── PULL_REQUEST_TEMPLATE.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── LICENSE.md
│   │   │   │   ├── MAINTAINING.md
│   │   │   │   ├── README.md
│   │   │   │   ├── book.json
│   │   │   │   ├── composer.json
│   │   │   │   ├── dist/
│   │   │   │   │   ├── Chart.bundle.js
│   │   │   │   │   └── Chart.js
│   │   │   │   ├── docs/
│   │   │   │   │   ├── README.md
│   │   │   │   │   ├── SUMMARY.md
│   │   │   │   │   ├── axes/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── cartesian/
│   │   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   │   ├── category.md
│   │   │   │   │   │   │   ├── linear.md
│   │   │   │   │   │   │   ├── logarithmic.md
│   │   │   │   │   │   │   └── time.md
│   │   │   │   │   │   ├── labelling.md
│   │   │   │   │   │   ├── radial/
│   │   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   │   └── linear.md
│   │   │   │   │   │   └── styling.md
│   │   │   │   │   ├── charts/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── area.md
│   │   │   │   │   │   ├── bar.md
│   │   │   │   │   │   ├── bubble.md
│   │   │   │   │   │   ├── doughnut.md
│   │   │   │   │   │   ├── line.md
│   │   │   │   │   │   ├── mixed.md
│   │   │   │   │   │   ├── polar.md
│   │   │   │   │   │   ├── radar.md
│   │   │   │   │   │   └── scatter.md
│   │   │   │   │   ├── configuration/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── animations.md
│   │   │   │   │   │   ├── elements.md
│   │   │   │   │   │   ├── layout.md
│   │   │   │   │   │   ├── legend.md
│   │   │   │   │   │   ├── title.md
│   │   │   │   │   │   └── tooltip.md
│   │   │   │   │   ├── developers/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── api.md
│   │   │   │   │   │   ├── axes.md
│   │   │   │   │   │   ├── charts.md
│   │   │   │   │   │   ├── contributing.md
│   │   │   │   │   │   ├── plugins.md
│   │   │   │   │   │   └── updates.md
│   │   │   │   │   ├── general/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── colors.md
│   │   │   │   │   │   ├── fonts.md
│   │   │   │   │   │   ├── interactions/
│   │   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   │   ├── events.md
│   │   │   │   │   │   │   └── modes.md
│   │   │   │   │   │   └── responsive.md
│   │   │   │   │   ├── getting-started/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── installation.md
│   │   │   │   │   │   ├── integration.md
│   │   │   │   │   │   └── usage.md
│   │   │   │   │   ├── notes/
│   │   │   │   │   │   ├── README.md
│   │   │   │   │   │   ├── comparison.md
│   │   │   │   │   │   ├── extensions.md
│   │   │   │   │   │   └── license.md
│   │   │   │   │   └── style.css
│   │   │   │   ├── gulpfile.js
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.json
│   │   │   │   ├── samples/
│   │   │   │   │   ├── advanced/
│   │   │   │   │   │   ├── data-labelling.html
│   │   │   │   │   │   └── progress-bar.html
│   │   │   │   │   ├── charts/
│   │   │   │   │   │   ├── area/
│   │   │   │   │   │   │   ├── analyser.js
│   │   │   │   │   │   │   ├── line-boundaries.html
│   │   │   │   │   │   │   ├── line-datasets.html
│   │   │   │   │   │   │   ├── line-stacked.html
│   │   │   │   │   │   │   └── radar.html
│   │   │   │   │   │   ├── bar/
│   │   │   │   │   │   │   ├── horizontal.html
│   │   │   │   │   │   │   ├── multi-axis.html
│   │   │   │   │   │   │   ├── stacked-group.html
│   │   │   │   │   │   │   ├── stacked.html
│   │   │   │   │   │   │   └── vertical.html
│   │   │   │   │   │   ├── bubble.html
│   │   │   │   │   │   ├── combo-bar-line.html
│   │   │   │   │   │   ├── doughnut.html
│   │   │   │   │   │   ├── line/
│   │   │   │   │   │   │   ├── basic.html
│   │   │   │   │   │   │   ├── interpolation-modes.html
│   │   │   │   │   │   │   ├── line-styles.html
│   │   │   │   │   │   │   ├── multi-axis.html
│   │   │   │   │   │   │   ├── point-sizes.html
│   │   │   │   │   │   │   ├── point-styles.html
│   │   │   │   │   │   │   ├── skip-points.html
│   │   │   │   │   │   │   └── stepped.html
│   │   │   │   │   │   ├── pie.html
│   │   │   │   │   │   ├── polar-area.html
│   │   │   │   │   │   ├── radar-skip-points.html
│   │   │   │   │   │   ├── radar.html
│   │   │   │   │   │   └── scatter/
│   │   │   │   │   │       ├── basic.html
│   │   │   │   │   │       └── multi-axis.html
│   │   │   │   │   ├── index.html
│   │   │   │   │   ├── legend/
│   │   │   │   │   │   ├── point-style.html
│   │   │   │   │   │   └── positioning.html
│   │   │   │   │   ├── samples.js
│   │   │   │   │   ├── scales/
│   │   │   │   │   │   ├── filtering-labels.html
│   │   │   │   │   │   ├── gridlines-display.html
│   │   │   │   │   │   ├── gridlines-style.html
│   │   │   │   │   │   ├── linear/
│   │   │   │   │   │   │   ├── min-max-suggested.html
│   │   │   │   │   │   │   ├── min-max.html
│   │   │   │   │   │   │   └── step-size.html
│   │   │   │   │   │   ├── logarithmic/
│   │   │   │   │   │   │   ├── line.html
│   │   │   │   │   │   │   └── scatter.html
│   │   │   │   │   │   ├── multiline-labels.html
│   │   │   │   │   │   ├── non-numeric-y.html
│   │   │   │   │   │   └── time/
│   │   │   │   │   │       ├── combo.html
│   │   │   │   │   │       ├── line-point-data.html
│   │   │   │   │   │       └── line.html
│   │   │   │   │   ├── style.css
│   │   │   │   │   ├── tooltips/
│   │   │   │   │   │   ├── border.html
│   │   │   │   │   │   ├── callbacks.html
│   │   │   │   │   │   ├── custom-line.html
│   │   │   │   │   │   ├── custom-pie.html
│   │   │   │   │   │   ├── custom-points.html
│   │   │   │   │   │   ├── interactions.html
│   │   │   │   │   │   └── positioning.html
│   │   │   │   │   └── utils.js
│   │   │   │   ├── scripts/
│   │   │   │   │   ├── deploy.sh
│   │   │   │   │   └── release.sh
│   │   │   │   ├── src/
│   │   │   │   │   ├── chart.js
│   │   │   │   │   ├── charts/
│   │   │   │   │   │   ├── Chart.Bar.js
│   │   │   │   │   │   ├── Chart.Bubble.js
│   │   │   │   │   │   ├── Chart.Doughnut.js
│   │   │   │   │   │   ├── Chart.Line.js
│   │   │   │   │   │   ├── Chart.PolarArea.js
│   │   │   │   │   │   ├── Chart.Radar.js
│   │   │   │   │   │   └── Chart.Scatter.js
│   │   │   │   │   ├── controllers/
│   │   │   │   │   │   ├── controller.bar.js
│   │   │   │   │   │   ├── controller.bubble.js
│   │   │   │   │   │   ├── controller.doughnut.js
│   │   │   │   │   │   ├── controller.line.js
│   │   │   │   │   │   ├── controller.polarArea.js
│   │   │   │   │   │   └── controller.radar.js
│   │   │   │   │   ├── core/
│   │   │   │   │   │   ├── core.animation.js
│   │   │   │   │   │   ├── core.canvasHelpers.js
│   │   │   │   │   │   ├── core.controller.js
│   │   │   │   │   │   ├── core.datasetController.js
│   │   │   │   │   │   ├── core.element.js
│   │   │   │   │   │   ├── core.helpers.js
│   │   │   │   │   │   ├── core.interaction.js
│   │   │   │   │   │   ├── core.js
│   │   │   │   │   │   ├── core.layoutService.js
│   │   │   │   │   │   ├── core.plugin.js
│   │   │   │   │   │   ├── core.scale.js
│   │   │   │   │   │   ├── core.scaleService.js
│   │   │   │   │   │   ├── core.ticks.js
│   │   │   │   │   │   └── core.tooltip.js
│   │   │   │   │   ├── elements/
│   │   │   │   │   │   ├── element.arc.js
│   │   │   │   │   │   ├── element.line.js
│   │   │   │   │   │   ├── element.point.js
│   │   │   │   │   │   └── element.rectangle.js
│   │   │   │   │   ├── platforms/
│   │   │   │   │   │   ├── platform.dom.js
│   │   │   │   │   │   └── platform.js
│   │   │   │   │   ├── plugins/
│   │   │   │   │   │   ├── plugin.filler.js
│   │   │   │   │   │   ├── plugin.legend.js
│   │   │   │   │   │   └── plugin.title.js
│   │   │   │   │   └── scales/
│   │   │   │   │       ├── scale.category.js
│   │   │   │   │       ├── scale.linear.js
│   │   │   │   │       ├── scale.linearbase.js
│   │   │   │   │       ├── scale.logarithmic.js
│   │   │   │   │       ├── scale.radialLinear.js
│   │   │   │   │       └── scale.time.js
│   │   │   │   └── test/
│   │   │   │       ├── fixtures/
│   │   │   │       │   └── plugin.filler/
│   │   │   │       │       ├── fill-line-boundary-end-span.json
│   │   │   │       │       ├── fill-line-boundary-end.json
│   │   │   │       │       ├── fill-line-boundary-origin-span.json
│   │   │   │       │       ├── fill-line-boundary-origin-spline-span.json
│   │   │   │       │       ├── fill-line-boundary-origin-spline.json
│   │   │   │       │       ├── fill-line-boundary-origin-stepped-span.json
│   │   │   │       │       ├── fill-line-boundary-origin-stepped.json
│   │   │   │       │       ├── fill-line-boundary-origin.json
│   │   │   │       │       ├── fill-line-boundary-start-span.json
│   │   │   │       │       ├── fill-line-boundary-start.json
│   │   │   │       │       ├── fill-line-dataset-span.json
│   │   │   │       │       ├── fill-line-dataset-spline-span.json
│   │   │   │       │       ├── fill-line-dataset-spline.json
│   │   │   │       │       ├── fill-line-dataset.json
│   │   │   │       │       ├── fill-radar-boundary-origin-spline.json
│   │   │   │       │       └── fill-radar-boundary-origin.json
│   │   │   │       ├── jasmine.context.js
│   │   │   │       ├── jasmine.index.js
│   │   │   │       ├── jasmine.matchers.js
│   │   │   │       ├── jasmine.utils.js
│   │   │   │       └── specs/
│   │   │   │           ├── controller.bar.tests.js
│   │   │   │           ├── controller.bubble.tests.js
│   │   │   │           ├── controller.doughnut.tests.js
│   │   │   │           ├── controller.line.tests.js
│   │   │   │           ├── controller.polarArea.tests.js
│   │   │   │           ├── controller.radar.tests.js
│   │   │   │           ├── core.controller.tests.js
│   │   │   │           ├── core.datasetController.tests.js
│   │   │   │           ├── core.element.tests.js
│   │   │   │           ├── core.helpers.tests.js
│   │   │   │           ├── core.interaction.tests.js
│   │   │   │           ├── core.layoutService.tests.js
│   │   │   │           ├── core.plugin.tests.js
│   │   │   │           ├── core.scaleService.tests.js
│   │   │   │           ├── core.tooltip.tests.js
│   │   │   │           ├── element.arc.tests.js
│   │   │   │           ├── element.line.tests.js
│   │   │   │           ├── element.point.tests.js
│   │   │   │           ├── element.rectangle.tests.js
│   │   │   │           ├── global.defaults.tests.js
│   │   │   │           ├── global.deprecations.tests.js
│   │   │   │           ├── platform.dom.tests.js
│   │   │   │           ├── plugin.filler.tests.js
│   │   │   │           ├── plugin.legend.tests.js
│   │   │   │           ├── plugin.title.tests.js
│   │   │   │           ├── scale.category.tests.js
│   │   │   │           ├── scale.linear.tests.js
│   │   │   │           ├── scale.logarithmic.tests.js
│   │   │   │           ├── scale.radialLinear.tests.js
│   │   │   │           └── scale.time.tests.js
│   │   │   ├── Gallery-2.25.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── LICENSE.txt
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── blueimp-gallery-indicator.css
│   │   │   │   │   ├── blueimp-gallery-video.css
│   │   │   │   │   ├── blueimp-gallery.css
│   │   │   │   │   └── demo/
│   │   │   │   │       └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── blueimp-gallery-fullscreen.js
│   │   │   │   │   ├── blueimp-gallery-indicator.js
│   │   │   │   │   ├── blueimp-gallery-video.js
│   │   │   │   │   ├── blueimp-gallery-vimeo.js
│   │   │   │   │   ├── blueimp-gallery-youtube.js
│   │   │   │   │   ├── blueimp-gallery.js
│   │   │   │   │   ├── blueimp-helper.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── jquery.blueimp-gallery.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.js
│   │   │   │   └── package.json
│   │   │   ├── JavaScript-Canvas-to-Blob-3.7.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── js/
│   │   │   │   │   └── canvas-to-blob.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── load-image.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Load-Image-2.12.2/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo.css
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.Jcrop.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── load-image-exif-map.js
│   │   │   │   │   ├── load-image-exif.js
│   │   │   │   │   ├── load-image-fetch.js
│   │   │   │   │   ├── load-image-meta.js
│   │   │   │   │   ├── load-image-orientation.js
│   │   │   │   │   ├── load-image-scale.js
│   │   │   │   │   ├── load-image.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       ├── jquery.Jcrop.js
│   │   │   │   │       └── jquery.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── canvas-to-blob.js
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── expect.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates-3.8.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── Lightbox/
│   │   │   │   └── lightbox.js
│   │   │   ├── Slideout/
│   │   │   │   └── slideout.js
│   │   │   ├── Swiper-3.3.1/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── component.json
│   │   │   │   ├── demos/
│   │   │   │   │   ├── 01-default.html
│   │   │   │   │   ├── 02-responsive.html
│   │   │   │   │   ├── 03-vertical.html
│   │   │   │   │   ├── 04-space-between.html
│   │   │   │   │   ├── 05-slides-per-view.html
│   │   │   │   │   ├── 06-slides-per-view-auto.html
│   │   │   │   │   ├── 07-centered.html
│   │   │   │   │   ├── 08-centered-auto.html
│   │   │   │   │   ├── 09-freemode.html
│   │   │   │   │   ├── 10-slides-per-column.html
│   │   │   │   │   ├── 11-nested.html
│   │   │   │   │   ├── 12-grab-cursor.html
│   │   │   │   │   ├── 13-scrollbar.html
│   │   │   │   │   ├── 14-nav-arrows.html
│   │   │   │   │   ├── 15-infinite-loop.html
│   │   │   │   │   ├── 16-effect-fade.html
│   │   │   │   │   ├── 17-effect-cube.html
│   │   │   │   │   ├── 18-effect-coverflow.html
│   │   │   │   │   ├── 19-keyboard-control.html
│   │   │   │   │   ├── 20-mousewheel-control.html
│   │   │   │   │   ├── 21-autoplay.html
│   │   │   │   │   ├── 22-dynamic-slides.html
│   │   │   │   │   ├── 23-thumbs-gallery-loop.html
│   │   │   │   │   ├── 23-thumbs-gallery.html
│   │   │   │   │   ├── 24-multiple-swipers.html
│   │   │   │   │   ├── 25-hash-navigation.html
│   │   │   │   │   ├── 26-rtl.html
│   │   │   │   │   ├── 27-jquery.html
│   │   │   │   │   ├── 28-parallax.html
│   │   │   │   │   ├── 29-custom-pagination.html
│   │   │   │   │   ├── 30-lazy-load-images.html
│   │   │   │   │   ├── 31-custom-plugin.html
│   │   │   │   │   ├── 32-scroll-container.html
│   │   │   │   │   ├── 33-responsive-breakpoints.html
│   │   │   │   │   ├── 34-autoheight.html
│   │   │   │   │   ├── 35-effect-flip.html
│   │   │   │   │   ├── 36-pagination-fraction.html
│   │   │   │   │   └── 37-pagination-progress.html
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── swiper.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── swiper.jquery.js
│   │   │   │   │       ├── swiper.jquery.umd.js
│   │   │   │   │       └── swiper.js
│   │   │   │   ├── gulpfile.js
│   │   │   │   ├── package.js
│   │   │   │   ├── package.json
│   │   │   │   ├── playground/
│   │   │   │   │   └── index.html
│   │   │   │   └── src/
│   │   │   │       ├── js/
│   │   │   │       │   ├── a11y.js
│   │   │   │       │   ├── amd.js
│   │   │   │       │   ├── controller.js
│   │   │   │       │   ├── core.js
│   │   │   │       │   ├── dom-plugins.js
│   │   │   │       │   ├── dom.js
│   │   │   │       │   ├── effects.js
│   │   │   │       │   ├── emitter.js
│   │   │   │       │   ├── get-dom-lib.js
│   │   │   │       │   ├── get-jquery.js
│   │   │   │       │   ├── hashnav.js
│   │   │   │       │   ├── init.js
│   │   │   │       │   ├── keyboard.js
│   │   │   │       │   ├── lazy-load.js
│   │   │   │       │   ├── mousewheel.js
│   │   │   │       │   ├── parallax.js
│   │   │   │       │   ├── plugins.js
│   │   │   │       │   ├── scrollbar.js
│   │   │   │       │   ├── swiper-intro-f7.js
│   │   │   │       │   ├── swiper-intro.js
│   │   │   │       │   ├── swiper-outro.js
│   │   │   │       │   ├── swiper-proto.js
│   │   │   │       │   ├── wrap-end-umd.js
│   │   │   │       │   ├── wrap-end.js
│   │   │   │       │   ├── wrap-start-umd.js
│   │   │   │       │   └── wrap-start.js
│   │   │   │       └── less/
│   │   │   │           ├── core.less
│   │   │   │           ├── effects.less
│   │   │   │           ├── mixins.less
│   │   │   │           ├── navigation-f7.less
│   │   │   │           ├── navigation.less
│   │   │   │           ├── preloader-f7.less
│   │   │   │           ├── preloader.less
│   │   │   │           ├── scrollbar.less
│   │   │   │           └── swiper.less
│   │   │   ├── bootstrap-datepicker-1.6.4/
│   │   │   │   ├── css/
│   │   │   │   │   ├── bootstrap-datepicker.css
│   │   │   │   │   ├── bootstrap-datepicker.standalone.css
│   │   │   │   │   ├── bootstrap-datepicker3.css
│   │   │   │   │   └── bootstrap-datepicker3.standalone.css
│   │   │   │   └── js/
│   │   │   │       └── bootstrap-datepicker.js
│   │   │   ├── bootstrap-select-1.12.2/
│   │   │   │   ├── .github/
│   │   │   │   │   └── ISSUE_TEMPLATE.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── Gruntfile.js
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── composer.json
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │       └── i18n/
│   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   ├── docs/
│   │   │   │   │   ├── custom_theme/
│   │   │   │   │   │   ├── base.html
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── base.css
│   │   │   │   │   │   ├── js/
│   │   │   │   │   │   │   └── base.js
│   │   │   │   │   │   ├── nav.html
│   │   │   │   │   │   └── toc.html
│   │   │   │   │   ├── docs/
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── custom.css
│   │   │   │   │   │   ├── dist/
│   │   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   │   │   └── js/
│   │   │   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │   │   │       └── i18n/
│   │   │   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   │   │   ├── examples.md
│   │   │   │   │   │   ├── index.md
│   │   │   │   │   │   ├── methods.md
│   │   │   │   │   │   ├── options.md
│   │   │   │   │   │   └── playground/
│   │   │   │   │   │       ├── index.html
│   │   │   │   │   │       ├── plnkrOpener.js
│   │   │   │   │   │       └── test.html
│   │   │   │   │   └── mkdocs.yml
│   │   │   │   ├── js/
│   │   │   │   │   ├── .jshintrc
│   │   │   │   │   ├── bootstrap-select.js
│   │   │   │   │   └── i18n/
│   │   │   │   │       ├── defaults-ar_AR.js
│   │   │   │   │       ├── defaults-bg_BG.js
│   │   │   │   │       ├── defaults-cro_CRO.js
│   │   │   │   │       ├── defaults-cs_CZ.js
│   │   │   │   │       ├── defaults-da_DK.js
│   │   │   │   │       ├── defaults-de_DE.js
│   │   │   │   │       ├── defaults-en_US.js
│   │   │   │   │       ├── defaults-es_CL.js
│   │   │   │   │       ├── defaults-es_ES.js
│   │   │   │   │       ├── defaults-eu.js
│   │   │   │   │       ├── defaults-fa_IR.js
│   │   │   │   │       ├── defaults-fi_FI.js
│   │   │   │   │       ├── defaults-fr_FR.js
│   │   │   │   │       ├── defaults-hu_HU.js
│   │   │   │   │       ├── defaults-id_ID.js
│   │   │   │   │       ├── defaults-it_IT.js
│   │   │   │   │       ├── defaults-ko_KR.js
│   │   │   │   │       ├── defaults-lt_LT.js
│   │   │   │   │       ├── defaults-nb_NO.js
│   │   │   │   │       ├── defaults-nl_NL.js
│   │   │   │   │       ├── defaults-pl_PL.js
│   │   │   │   │       ├── defaults-pt_BR.js
│   │   │   │   │       ├── defaults-pt_PT.js
│   │   │   │   │       ├── defaults-ro_RO.js
│   │   │   │   │       ├── defaults-ru_RU.js
│   │   │   │   │       ├── defaults-sk_SK.js
│   │   │   │   │       ├── defaults-sl_SI.js
│   │   │   │   │       ├── defaults-sv_SE.js
│   │   │   │   │       ├── defaults-tr_TR.js
│   │   │   │   │       ├── defaults-ua_UA.js
│   │   │   │   │       ├── defaults-zh_CN.js
│   │   │   │   │       └── defaults-zh_TW.js
│   │   │   │   ├── less/
│   │   │   │   │   ├── bootstrap-select.less
│   │   │   │   │   └── variables.less
│   │   │   │   ├── nuget/
│   │   │   │   │   ├── MyGet.ps1
│   │   │   │   │   └── bootstrap-select.nuspec
│   │   │   │   ├── package.json
│   │   │   │   ├── sass/
│   │   │   │   │   ├── bootstrap-select.scss
│   │   │   │   │   └── variables.scss
│   │   │   │   └── test.html
│   │   │   ├── d3/
│   │   │   │   ├── API.md
│   │   │   │   ├── CHANGES.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   └── d3.js
│   │   │   ├── font-awesome/
│   │   │   │   ├── HELP-US-OUT.txt
│   │   │   │   ├── css/
│   │   │   │   │   └── font-awesome.css
│   │   │   │   ├── fonts/
│   │   │   │   │   └── FontAwesome.otf
│   │   │   │   ├── less/
│   │   │   │   │   ├── animated.less
│   │   │   │   │   ├── bordered-pulled.less
│   │   │   │   │   ├── core.less
│   │   │   │   │   ├── extras.less
│   │   │   │   │   ├── fixed-width.less
│   │   │   │   │   ├── font-awesome.less
│   │   │   │   │   ├── icons.less
│   │   │   │   │   ├── larger.less
│   │   │   │   │   ├── list.less
│   │   │   │   │   ├── mixins.less
│   │   │   │   │   ├── path.less
│   │   │   │   │   ├── rotated-flipped.less
│   │   │   │   │   ├── screen-reader.less
│   │   │   │   │   ├── spinning.less
│   │   │   │   │   ├── stacked.less
│   │   │   │   │   └── variables.less
│   │   │   │   └── scss/
│   │   │   │       ├── _animated.scss
│   │   │   │       ├── _bordered-pulled.scss
│   │   │   │       ├── _core.scss
│   │   │   │       ├── _extras.scss
│   │   │   │       ├── _fixed-width.scss
│   │   │   │       ├── _icons.scss
│   │   │   │       ├── _larger.scss
│   │   │   │       ├── _list.scss
│   │   │   │       ├── _mixins.scss
│   │   │   │       ├── _path.scss
│   │   │   │       ├── _rotated-flipped.scss
│   │   │   │       ├── _screen-reader.scss
│   │   │   │       ├── _spinning.scss
│   │   │   │       ├── _stacked.scss
│   │   │   │       ├── _variables.scss
│   │   │   │       └── font-awesome.scss
│   │   │   ├── jQuery-File-Upload-9.18.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .npmignore
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── angularjs.html
│   │   │   │   ├── basic-plus.html
│   │   │   │   ├── basic.html
│   │   │   │   ├── bower-version-update.js
│   │   │   │   ├── bower.json
│   │   │   │   ├── cors/
│   │   │   │   │   ├── postmessage.html
│   │   │   │   │   └── result.html
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo-ie8.css
│   │   │   │   │   ├── demo.css
│   │   │   │   │   ├── jquery.fileupload-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui.css
│   │   │   │   │   ├── jquery.fileupload.css
│   │   │   │   │   └── style.css
│   │   │   │   ├── index.html
│   │   │   │   ├── jquery-ui.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── app.js
│   │   │   │   │   ├── cors/
│   │   │   │   │   │   ├── jquery.postmessage-transport.js
│   │   │   │   │   │   └── jquery.xdr-transport.js
│   │   │   │   │   ├── jquery.fileupload-angular.js
│   │   │   │   │   ├── jquery.fileupload-audio.js
│   │   │   │   │   ├── jquery.fileupload-image.js
│   │   │   │   │   ├── jquery.fileupload-jquery-ui.js
│   │   │   │   │   ├── jquery.fileupload-process.js
│   │   │   │   │   ├── jquery.fileupload-ui.js
│   │   │   │   │   ├── jquery.fileupload-validate.js
│   │   │   │   │   ├── jquery.fileupload-video.js
│   │   │   │   │   ├── jquery.fileupload.js
│   │   │   │   │   ├── jquery.iframe-transport.js
│   │   │   │   │   ├── main.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.ui.widget.js
│   │   │   │   ├── package.json
│   │   │   │   ├── server/
│   │   │   │   │   ├── gae-go/
│   │   │   │   │   │   ├── app/
│   │   │   │   │   │   │   └── main.go
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   ├── gae-python/
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   ├── main.py
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   └── php/
│   │   │   │   │       ├── Dockerfile
│   │   │   │   │       ├── UploadHandler.php
│   │   │   │   │       ├── docker-compose.yml
│   │   │   │   │       ├── files/
│   │   │   │   │       │   ├── .gitignore
│   │   │   │   │       │   └── .htaccess
│   │   │   │   │       └── index.php
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       └── test.js
│   │   │   ├── metisMenu/
│   │   │   │   ├── metisMenu.css
│   │   │   │   └── metisMenu.js
│   │   │   └── moment-2.18.1/
│   │   │       ├── .editorconfig
│   │   │       ├── .gitattributes
│   │   │       ├── .gitignore
│   │   │       ├── .jscs.json
│   │   │       ├── .jshintrc
│   │   │       ├── .npmignore
│   │   │       ├── .spmignore
│   │   │       ├── .travis.yml
│   │   │       ├── CHANGELOG.md
│   │   │       ├── CONTRIBUTING.md
│   │   │       ├── Gruntfile.js
│   │   │       ├── ISSUE_TEMPLATE.md
│   │   │       ├── LICENSE
│   │   │       ├── Moment.js.nuspec
│   │   │       ├── README.md
│   │   │       ├── benchmarks/
│   │   │       │   ├── add.js
│   │   │       │   ├── clone.js
│   │   │       │   ├── endOf.js
│   │   │       │   ├── fromDate.js
│   │   │       │   ├── fromDateUtc.js
│   │   │       │   ├── makeDuration.js
│   │   │       │   ├── query.js
│   │   │       │   ├── startOf.js
│   │   │       │   ├── subtract.js
│   │   │       │   └── zeroFill.js
│   │   │       ├── bower.json
│   │   │       ├── component.json
│   │   │       ├── composer.json
│   │   │       ├── ender.js
│   │   │       ├── locale/
│   │   │       │   ├── af.js
│   │   │       │   ├── ar-dz.js
│   │   │       │   ├── ar-kw.js
│   │   │       │   ├── ar-ly.js
│   │   │       │   ├── ar-ma.js
│   │   │       │   ├── ar-sa.js
│   │   │       │   ├── ar-tn.js
│   │   │       │   ├── ar.js
│   │   │       │   ├── az.js
│   │   │       │   ├── be.js
│   │   │       │   ├── bg.js
│   │   │       │   ├── bn.js
│   │   │       │   ├── bo.js
│   │   │       │   ├── br.js
│   │   │       │   ├── bs.js
│   │   │       │   ├── ca.js
│   │   │       │   ├── cs.js
│   │   │       │   ├── cv.js
│   │   │       │   ├── cy.js
│   │   │       │   ├── da.js
│   │   │       │   ├── de-at.js
│   │   │       │   ├── de-ch.js
│   │   │       │   ├── de.js
│   │   │       │   ├── dv.js
│   │   │       │   ├── el.js
│   │   │       │   ├── en-au.js
│   │   │       │   ├── en-ca.js
│   │   │       │   ├── en-gb.js
│   │   │       │   ├── en-ie.js
│   │   │       │   ├── en-nz.js
│   │   │       │   ├── eo.js
│   │   │       │   ├── es-do.js
│   │   │       │   ├── es.js
│   │   │       │   ├── et.js
│   │   │       │   ├── eu.js
│   │   │       │   ├── fa.js
│   │   │       │   ├── fi.js
│   │   │       │   ├── fo.js
│   │   │       │   ├── fr-ca.js
│   │   │       │   ├── fr-ch.js
│   │   │       │   ├── fr.js
│   │   │       │   ├── fy.js
│   │   │       │   ├── gd.js
│   │   │       │   ├── gl.js
│   │   │       │   ├── gom-latn.js
│   │   │       │   ├── he.js
│   │   │       │   ├── hi.js
│   │   │       │   ├── hr.js
│   │   │       │   ├── hu.js
│   │   │       │   ├── hy-am.js
│   │   │       │   ├── id.js
│   │   │       │   ├── is.js
│   │   │       │   ├── it.js
│   │   │       │   ├── ja.js
│   │   │       │   ├── jv.js
│   │   │       │   ├── ka.js
│   │   │       │   ├── kk.js
│   │   │       │   ├── km.js
│   │   │       │   ├── kn.js
│   │   │       │   ├── ko.js
│   │   │       │   ├── ky.js
│   │   │       │   ├── lb.js
│   │   │       │   ├── lo.js
│   │   │       │   ├── lt.js
│   │   │       │   ├── lv.js
│   │   │       │   ├── me.js
│   │   │       │   ├── mi.js
│   │   │       │   ├── mk.js
│   │   │       │   ├── ml.js
│   │   │       │   ├── mr.js
│   │   │       │   ├── ms-my.js
│   │   │       │   ├── ms.js
│   │   │       │   ├── my.js
│   │   │       │   ├── nb.js
│   │   │       │   ├── ne.js
│   │   │       │   ├── nl-be.js
│   │   │       │   ├── nl.js
│   │   │       │   ├── nn.js
│   │   │       │   ├── pa-in.js
│   │   │       │   ├── pl.js
│   │   │       │   ├── pt-br.js
│   │   │       │   ├── pt.js
│   │   │       │   ├── ro.js
│   │   │       │   ├── ru.js
│   │   │       │   ├── sd.js
│   │   │       │   ├── se.js
│   │   │       │   ├── si.js
│   │   │       │   ├── sk.js
│   │   │       │   ├── sl.js
│   │   │       │   ├── sq.js
│   │   │       │   ├── sr-cyrl.js
│   │   │       │   ├── sr.js
│   │   │       │   ├── ss.js
│   │   │       │   ├── sv.js
│   │   │       │   ├── sw.js
│   │   │       │   ├── ta.js
│   │   │       │   ├── te.js
│   │   │       │   ├── tet.js
│   │   │       │   ├── th.js
│   │   │       │   ├── tl-ph.js
│   │   │       │   ├── tlh.js
│   │   │       │   ├── tr.js
│   │   │       │   ├── tzl.js
│   │   │       │   ├── tzm-latn.js
│   │   │       │   ├── tzm.js
│   │   │       │   ├── uk.js
│   │   │       │   ├── ur.js
│   │   │       │   ├── uz-latn.js
│   │   │       │   ├── uz.js
│   │   │       │   ├── vi.js
│   │   │       │   ├── x-pseudo.js
│   │   │       │   ├── yo.js
│   │   │       │   ├── zh-cn.js
│   │   │       │   ├── zh-hk.js
│   │   │       │   └── zh-tw.js
│   │   │       ├── meteor/
│   │   │       │   ├── README.md
│   │   │       │   ├── export.js
│   │   │       │   ├── moment.js
│   │   │       │   ├── package.js
│   │   │       │   └── test.js
│   │   │       ├── min/
│   │   │       │   ├── locales.js
│   │   │       │   ├── moment-with-locales.js
│   │   │       │   └── tests.js
│   │   │       ├── moment.d.ts
│   │   │       ├── moment.js
│   │   │       ├── package.js
│   │   │       ├── package.json
│   │   │       ├── scripts/
│   │   │       │   ├── locales.js
│   │   │       │   └── npm_prepublish.sh
│   │   │       ├── src/
│   │   │       │   ├── lib/
│   │   │       │   │   ├── create/
│   │   │       │   │   │   ├── check-overflow.js
│   │   │       │   │   │   ├── date-from-array.js
│   │   │       │   │   │   ├── from-anything.js
│   │   │       │   │   │   ├── from-array.js
│   │   │       │   │   │   ├── from-object.js
│   │   │       │   │   │   ├── from-string-and-array.js
│   │   │       │   │   │   ├── from-string-and-format.js
│   │   │       │   │   │   ├── from-string.js
│   │   │       │   │   │   ├── local.js
│   │   │       │   │   │   ├── parsing-flags.js
│   │   │       │   │   │   ├── utc.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── duration/
│   │   │       │   │   │   ├── abs.js
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── as.js
│   │   │       │   │   │   ├── bubble.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── create.js
│   │   │       │   │   │   ├── duration.js
│   │   │       │   │   │   ├── get.js
│   │   │       │   │   │   ├── humanize.js
│   │   │       │   │   │   ├── iso-string.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── format/
│   │   │       │   │   │   └── format.js
│   │   │       │   │   ├── locale/
│   │   │       │   │   │   ├── base-config.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── en.js
│   │   │       │   │   │   ├── formats.js
│   │   │       │   │   │   ├── invalid.js
│   │   │       │   │   │   ├── lists.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── locales.js
│   │   │       │   │   │   ├── ordinal.js
│   │   │       │   │   │   ├── pre-post-format.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── relative.js
│   │   │       │   │   │   └── set.js
│   │   │       │   │   ├── moment/
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── clone.js
│   │   │       │   │   │   ├── compare.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── creation-data.js
│   │   │       │   │   │   ├── diff.js
│   │   │       │   │   │   ├── format.js
│   │   │       │   │   │   ├── from.js
│   │   │       │   │   │   ├── get-set.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── min-max.js
│   │   │       │   │   │   ├── moment.js
│   │   │       │   │   │   ├── now.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── start-end-of.js
│   │   │       │   │   │   ├── to-type.js
│   │   │       │   │   │   ├── to.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── parse/
│   │   │       │   │   │   ├── regex.js
│   │   │       │   │   │   └── token.js
│   │   │       │   │   ├── units/
│   │   │       │   │   │   ├── aliases.js
│   │   │       │   │   │   ├── constants.js
│   │   │       │   │   │   ├── day-of-month.js
│   │   │       │   │   │   ├── day-of-week.js
│   │   │       │   │   │   ├── day-of-year.js
│   │   │       │   │   │   ├── hour.js
│   │   │       │   │   │   ├── millisecond.js
│   │   │       │   │   │   ├── minute.js
│   │   │       │   │   │   ├── month.js
│   │   │       │   │   │   ├── offset.js
│   │   │       │   │   │   ├── priorities.js
│   │   │       │   │   │   ├── quarter.js
│   │   │       │   │   │   ├── second.js
│   │   │       │   │   │   ├── timestamp.js
│   │   │       │   │   │   ├── timezone.js
│   │   │       │   │   │   ├── units.js
│   │   │       │   │   │   ├── week-calendar-utils.js
│   │   │       │   │   │   ├── week-year.js
│   │   │       │   │   │   ├── week.js
│   │   │       │   │   │   └── year.js
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── abs-ceil.js
│   │   │       │   │       ├── abs-floor.js
│   │   │       │   │       ├── abs-round.js
│   │   │       │   │       ├── compare-arrays.js
│   │   │       │   │       ├── defaults.js
│   │   │       │   │       ├── deprecate.js
│   │   │       │   │       ├── extend.js
│   │   │       │   │       ├── has-own-prop.js
│   │   │       │   │       ├── hooks.js
│   │   │       │   │       ├── index-of.js
│   │   │       │   │       ├── is-array.js
│   │   │       │   │       ├── is-date.js
│   │   │       │   │       ├── is-function.js
│   │   │       │   │       ├── is-number.js
│   │   │       │   │       ├── is-object-empty.js
│   │   │       │   │       ├── is-object.js
│   │   │       │   │       ├── is-undefined.js
│   │   │       │   │       ├── keys.js
│   │   │       │   │       ├── map.js
│   │   │       │   │       ├── some.js
│   │   │       │   │       ├── to-int.js
│   │   │       │   │       └── zero-fill.js
│   │   │       │   ├── locale/
│   │   │       │   │   ├── af.js
│   │   │       │   │   ├── ar-dz.js
│   │   │       │   │   ├── ar-kw.js
│   │   │       │   │   ├── ar-ly.js
│   │   │       │   │   ├── ar-ma.js
│   │   │       │   │   ├── ar-sa.js
│   │   │       │   │   ├── ar-tn.js
│   │   │       │   │   ├── ar.js
│   │   │       │   │   ├── az.js
│   │   │       │   │   ├── be.js
│   │   │       │   │   ├── bg.js
│   │   │       │   │   ├── bn.js
│   │   │       │   │   ├── bo.js
│   │   │       │   │   ├── br.js
│   │   │       │   │   ├── bs.js
│   │   │       │   │   ├── ca.js
│   │   │       │   │   ├── cs.js
│   │   │       │   │   ├── cv.js
│   │   │       │   │   ├── cy.js
│   │   │       │   │   ├── da.js
│   │   │       │   │   ├── de-at.js
│   │   │       │   │   ├── de-ch.js
│   │   │       │   │   ├── de.js
│   │   │       │   │   ├── dv.js
│   │   │       │   │   ├── el.js
│   │   │       │   │   ├── en-au.js
│   │   │       │   │   ├── en-ca.js
│   │   │       │   │   ├── en-gb.js
│   │   │       │   │   ├── en-ie.js
│   │   │       │   │   ├── en-nz.js
│   │   │       │   │   ├── eo.js
│   │   │       │   │   ├── es-do.js
│   │   │       │   │   ├── es.js
│   │   │       │   │   ├── et.js
│   │   │       │   │   ├── eu.js
│   │   │       │   │   ├── fa.js
│   │   │       │   │   ├── fi.js
│   │   │       │   │   ├── fo.js
│   │   │       │   │   ├── fr-ca.js
│   │   │       │   │   ├── fr-ch.js
│   │   │       │   │   ├── fr.js
│   │   │       │   │   ├── fy.js
│   │   │       │   │   ├── gd.js
│   │   │       │   │   ├── gl.js
│   │   │       │   │   ├── gom-latn.js
│   │   │       │   │   ├── he.js
│   │   │       │   │   ├── hi.js
│   │   │       │   │   ├── hr.js
│   │   │       │   │   ├── hu.js
│   │   │       │   │   ├── hy-am.js
│   │   │       │   │   ├── id.js
│   │   │       │   │   ├── is.js
│   │   │       │   │   ├── it.js
│   │   │       │   │   ├── ja.js
│   │   │       │   │   ├── jv.js
│   │   │       │   │   ├── ka.js
│   │   │       │   │   ├── kk.js
│   │   │       │   │   ├── km.js
│   │   │       │   │   ├── kn.js
│   │   │       │   │   ├── ko.js
│   │   │       │   │   ├── ky.js
│   │   │       │   │   ├── lb.js
│   │   │       │   │   ├── lo.js
│   │   │       │   │   ├── lt.js
│   │   │       │   │   ├── lv.js
│   │   │       │   │   ├── me.js
│   │   │       │   │   ├── mi.js
│   │   │       │   │   ├── mk.js
│   │   │       │   │   ├── ml.js
│   │   │       │   │   ├── mr.js
│   │   │       │   │   ├── ms-my.js
│   │   │       │   │   ├── ms.js
│   │   │       │   │   ├── my.js
│   │   │       │   │   ├── nb.js
│   │   │       │   │   ├── ne.js
│   │   │       │   │   ├── nl-be.js
│   │   │       │   │   ├── nl.js
│   │   │       │   │   ├── nn.js
│   │   │       │   │   ├── pa-in.js
│   │   │       │   │   ├── pl.js
│   │   │       │   │   ├── pt-br.js
│   │   │       │   │   ├── pt.js
│   │   │       │   │   ├── ro.js
│   │   │       │   │   ├── ru.js
│   │   │       │   │   ├── sd.js
│   │   │       │   │   ├── se.js
│   │   │       │   │   ├── si.js
│   │   │       │   │   ├── sk.js
│   │   │       │   │   ├── sl.js
│   │   │       │   │   ├── sq.js
│   │   │       │   │   ├── sr-cyrl.js
│   │   │       │   │   ├── sr.js
│   │   │       │   │   ├── ss.js
│   │   │       │   │   ├── sv.js
│   │   │       │   │   ├── sw.js
│   │   │       │   │   ├── ta.js
│   │   │       │   │   ├── te.js
│   │   │       │   │   ├── tet.js
│   │   │       │   │   ├── th.js
│   │   │       │   │   ├── tl-ph.js
│   │   │       │   │   ├── tlh.js
│   │   │       │   │   ├── tr.js
│   │   │       │   │   ├── tzl.js
│   │   │       │   │   ├── tzm-latn.js
│   │   │       │   │   ├── tzm.js
│   │   │       │   │   ├── uk.js
│   │   │       │   │   ├── ur.js
│   │   │       │   │   ├── uz-latn.js
│   │   │       │   │   ├── uz.js
│   │   │       │   │   ├── vi.js
│   │   │       │   │   ├── x-pseudo.js
│   │   │       │   │   ├── yo.js
│   │   │       │   │   ├── zh-cn.js
│   │   │       │   │   ├── zh-hk.js
│   │   │       │   │   └── zh-tw.js
│   │   │       │   ├── moment.js
│   │   │       │   └── test/
│   │   │       │       ├── helpers/
│   │   │       │       │   ├── common-locale.js
│   │   │       │       │   ├── deprecation-handler.js
│   │   │       │       │   ├── dst.js
│   │   │       │       │   ├── each.js
│   │   │       │       │   └── object-keys.js
│   │   │       │       ├── locale/
│   │   │       │       │   ├── af.js
│   │   │       │       │   ├── ar-dz.js
│   │   │       │       │   ├── ar-kw.js
│   │   │       │       │   ├── ar-ly.js
│   │   │       │       │   ├── ar-ma.js
│   │   │       │       │   ├── ar-sa.js
│   │   │       │       │   ├── ar-tn.js
│   │   │       │       │   ├── ar.js
│   │   │       │       │   ├── az.js
│   │   │       │       │   ├── be.js
│   │   │       │       │   ├── bg.js
│   │   │       │       │   ├── bn.js
│   │   │       │       │   ├── bo.js
│   │   │       │       │   ├── br.js
│   │   │       │       │   ├── bs.js
│   │   │       │       │   ├── ca.js
│   │   │       │       │   ├── cs.js
│   │   │       │       │   ├── cv.js
│   │   │       │       │   ├── cy.js
│   │   │       │       │   ├── da.js
│   │   │       │       │   ├── de-at.js
│   │   │       │       │   ├── de-ch.js
│   │   │       │       │   ├── de.js
│   │   │       │       │   ├── dv.js
│   │   │       │       │   ├── el.js
│   │   │       │       │   ├── en-au.js
│   │   │       │       │   ├── en-ca.js
│   │   │       │       │   ├── en-gb.js
│   │   │       │       │   ├── en-ie.js
│   │   │       │       │   ├── en-nz.js
│   │   │       │       │   ├── en.js
│   │   │       │       │   ├── eo.js
│   │   │       │       │   ├── es-do.js
│   │   │       │       │   ├── es.js
│   │   │       │       │   ├── et.js
│   │   │       │       │   ├── eu.js
│   │   │       │       │   ├── fa.js
│   │   │       │       │   ├── fi.js
│   │   │       │       │   ├── fo.js
│   │   │       │       │   ├── fr-ca.js
│   │   │       │       │   ├── fr-ch.js
│   │   │       │       │   ├── fr.js
│   │   │       │       │   ├── fy.js
│   │   │       │       │   ├── gd.js
│   │   │       │       │   ├── gl.js
│   │   │       │       │   ├── gom-latn.js
│   │   │       │       │   ├── he.js
│   │   │       │       │   ├── hi.js
│   │   │       │       │   ├── hr.js
│   │   │       │       │   ├── hu.js
│   │   │       │       │   ├── hy-am.js
│   │   │       │       │   ├── id.js
│   │   │       │       │   ├── is.js
│   │   │       │       │   ├── it.js
│   │   │       │       │   ├── ja.js
│   │   │       │       │   ├── jv.js
│   │   │       │       │   ├── ka.js
│   │   │       │       │   ├── kk.js
│   │   │       │       │   ├── km.js
│   │   │       │       │   ├── kn.js
│   │   │       │       │   ├── ko.js
│   │   │       │       │   ├── ky.js
│   │   │       │       │   ├── lb.js
│   │   │       │       │   ├── lo.js
│   │   │       │       │   ├── lt.js
│   │   │       │       │   ├── lv.js
│   │   │       │       │   ├── me.js
│   │   │       │       │   ├── mi.js
│   │   │       │       │   ├── mk.js
│   │   │       │       │   ├── ml.js
│   │   │       │       │   ├── mr.js
│   │   │       │       │   ├── ms-my.js
│   │   │       │       │   ├── ms.js
│   │   │       │       │   ├── my.js
│   │   │       │       │   ├── nb.js
│   │   │       │       │   ├── ne.js
│   │   │       │       │   ├── nl-be.js
│   │   │       │       │   ├── nl.js
│   │   │       │       │   ├── nn.js
│   │   │       │       │   ├── pa-in.js
│   │   │       │       │   ├── pl.js
│   │   │       │       │   ├── pt-br.js
│   │   │       │       │   ├── pt.js
│   │   │       │       │   ├── ro.js
│   │   │       │       │   ├── ru.js
│   │   │       │       │   ├── sd.js
│   │   │       │       │   ├── se.js
│   │   │       │       │   ├── si.js
│   │   │       │       │   ├── sk.js
│   │   │       │       │   ├── sl.js
│   │   │       │       │   ├── sq.js
│   │   │       │       │   ├── sr-cyrl.js
│   │   │       │       │   ├── sr.js
│   │   │       │       │   ├── ss.js
│   │   │       │       │   ├── sv.js
│   │   │       │       │   ├── sw.js
│   │   │       │       │   ├── ta.js
│   │   │       │       │   ├── te.js
│   │   │       │       │   ├── tet.js
│   │   │       │       │   ├── th.js
│   │   │       │       │   ├── tl-ph.js
│   │   │       │       │   ├── tlh.js
│   │   │       │       │   ├── tr.js
│   │   │       │       │   ├── tzl.js
│   │   │       │       │   ├── tzm-latn.js
│   │   │       │       │   ├── tzm.js
│   │   │       │       │   ├── uk.js
│   │   │       │       │   ├── ur.js
│   │   │       │       │   ├── uz-latn.js
│   │   │       │       │   ├── uz.js
│   │   │       │       │   ├── vi.js
│   │   │       │       │   ├── x-pseudo.js
│   │   │       │       │   ├── yo.js
│   │   │       │       │   ├── zh-cn.js
│   │   │       │       │   ├── zh-hk.js
│   │   │       │       │   └── zh-tw.js
│   │   │       │       ├── moment/
│   │   │       │       │   ├── add_subtract.js
│   │   │       │       │   ├── calendar.js
│   │   │       │       │   ├── create.js
│   │   │       │       │   ├── creation-data.js
│   │   │       │       │   ├── days_in_month.js
│   │   │       │       │   ├── days_in_year.js
│   │   │       │       │   ├── deprecate.js
│   │   │       │       │   ├── diff.js
│   │   │       │       │   ├── duration.js
│   │   │       │       │   ├── duration_from_moments.js
│   │   │       │       │   ├── duration_invalid.js
│   │   │       │       │   ├── format.js
│   │   │       │       │   ├── from_to.js
│   │   │       │       │   ├── getters_setters.js
│   │   │       │       │   ├── instanceof.js
│   │   │       │       │   ├── invalid.js
│   │   │       │       │   ├── is_after.js
│   │   │       │       │   ├── is_array.js
│   │   │       │       │   ├── is_before.js
│   │   │       │       │   ├── is_between.js
│   │   │       │       │   ├── is_date.js
│   │   │       │       │   ├── is_moment.js
│   │   │       │       │   ├── is_number.js
│   │   │       │       │   ├── is_same.js
│   │   │       │       │   ├── is_same_or_after.js
│   │   │       │       │   ├── is_same_or_before.js
│   │   │       │       │   ├── is_valid.js
│   │   │       │       │   ├── leapyear.js
│   │   │       │       │   ├── listers.js
│   │   │       │       │   ├── locale.js
│   │   │       │       │   ├── locale_inheritance.js
│   │   │       │       │   ├── locale_update.js
│   │   │       │       │   ├── min_max.js
│   │   │       │       │   ├── mutable.js
│   │   │       │       │   ├── normalize_units.js
│   │   │       │       │   ├── now.js
│   │   │       │       │   ├── parsing_flags.js
│   │   │       │       │   ├── preparse_postformat.js
│   │   │       │       │   ├── quarter.js
│   │   │       │       │   ├── relative_time.js
│   │   │       │       │   ├── start_end_of.js
│   │   │       │       │   ├── string_prototype.js
│   │   │       │       │   ├── to_type.js
│   │   │       │       │   ├── utc.js
│   │   │       │       │   ├── utc_offset.js
│   │   │       │       │   ├── week_year.js
│   │   │       │       │   ├── weekday.js
│   │   │       │       │   ├── weeks.js
│   │   │       │       │   ├── weeks_in_year.js
│   │   │       │       │   ├── zone_switching.js
│   │   │       │       │   └── zones.js
│   │   │       │       └── qunit.js
│   │   │       ├── tasks/
│   │   │       │   ├── bump_version.js
│   │   │       │   ├── check_sauce_creds.js
│   │   │       │   ├── component.js
│   │   │       │   ├── nuget.js
│   │   │       │   ├── qtest.js
│   │   │       │   ├── transpile.js
│   │   │       │   └── update_index.js
│   │   │       ├── templates/
│   │   │       │   ├── default.js
│   │   │       │   ├── locale-header.js
│   │   │       │   └── test-header.js
│   │   │       └── typing-tests/
│   │   │           ├── moment-tests.ts
│   │   │           └── tsconfig.json
│   │   └── robots.txt
│   ├── tasks/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── run_stats.py
│   │   └── run_task.py
│   ├── templates/
│   │   ├── 404.html
│   │   ├── 500.html
│   │   ├── _left.html
│   │   ├── _top.html
│   │   ├── active/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── admin/
│   │   │   ├── add.html
│   │   │   ├── edit.html
│   │   │   ├── list.html
│   │   │   ├── profile.html
│   │   │   └── role.html
│   │   ├── apply_get/
│   │   │   ├── add.html
│   │   │   ├── info.html
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── apply_put/
│   │   │   ├── add.html
│   │   │   ├── info.html
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── auth/
│   │   │   ├── email.html
│   │   │   ├── index.html
│   │   │   └── phone.html
│   │   ├── complaint/
│   │   │   ├── list.html
│   │   │   └── reply.html
│   │   ├── index.html
│   │   ├── index_.html
│   │   ├── layout.html
│   │   ├── login.html
│   │   ├── macros.html
│   │   ├── main.html
│   │   ├── message/
│   │   │   └── list.html
│   │   ├── order/
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── scheduling/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── score/
│   │   │   ├── list.html
│   │   │   └── stats.html
│   │   ├── settings/
│   │   │   ├── apply_get.html
│   │   │   ├── apply_put.html
│   │   │   ├── bonus.html
│   │   │   ├── interest.html
│   │   │   ├── order.html
│   │   │   ├── score.html
│   │   │   ├── switch.html
│   │   │   ├── user.html
│   │   │   └── wallet.html
│   │   ├── stats/
│   │   │   ├── apply_get.html
│   │   │   ├── apply_put.html
│   │   │   ├── order.html
│   │   │   └── user.html
│   │   ├── user/
│   │   │   ├── _give_active.html
│   │   │   ├── _team_tree.html
│   │   │   ├── add.html
│   │   │   ├── auth.html
│   │   │   ├── bank.html
│   │   │   ├── config.html
│   │   │   ├── list.html
│   │   │   ├── profile.html
│   │   │   ├── relationship.html
│   │   │   └── stats.html
│   │   └── wallet/
│   │       ├── list.html
│   │       └── stats.html
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_user_profile.py
│   ├── tools/
│   │   ├── __init__.py
│   │   ├── config_manage.py
│   │   ├── db.py
│   │   ├── db_test.py
│   │   ├── decorators.py
│   │   ├── file.py
│   │   ├── send_sms.py
│   │   ├── session_manage.py
│   │   ├── stat.py
│   │   ├── system.py
│   │   └── url.py
│   ├── vendor/
│   │   ├── bootstrap/
│   │   │   ├── css/
│   │   │   │   └── bootstrap.css
│   │   │   └── js/
│   │   │       └── bootstrap.js
│   │   ├── bootstrap-social/
│   │   │   ├── bootstrap-social.css
│   │   │   ├── bootstrap-social.less
│   │   │   └── bootstrap-social.scss
│   │   ├── datatables/
│   │   │   ├── css/
│   │   │   │   ├── dataTables.bootstrap.css
│   │   │   │   ├── dataTables.bootstrap4.css
│   │   │   │   ├── dataTables.foundation.css
│   │   │   │   ├── dataTables.jqueryui.css
│   │   │   │   ├── dataTables.material.css
│   │   │   │   ├── dataTables.semanticui.css
│   │   │   │   ├── dataTables.uikit.css
│   │   │   │   ├── jquery.dataTables.css
│   │   │   │   └── jquery.dataTables_themeroller.css
│   │   │   ├── images/
│   │   │   │   └── Sorting icons.psd
│   │   │   └── js/
│   │   │       ├── dataTables.bootstrap.js
│   │   │       ├── dataTables.bootstrap4.js
│   │   │       ├── dataTables.foundation.js
│   │   │       ├── dataTables.jqueryui.js
│   │   │       ├── dataTables.material.js
│   │   │       ├── dataTables.semanticui.js
│   │   │       ├── dataTables.uikit.js
│   │   │       ├── jquery.dataTables.js
│   │   │       └── jquery.js
│   │   ├── datatables-plugins/
│   │   │   ├── dataTables.bootstrap.css
│   │   │   ├── dataTables.bootstrap.js
│   │   │   └── index.html
│   │   ├── datatables-responsive/
│   │   │   ├── dataTables.responsive.css
│   │   │   ├── dataTables.responsive.js
│   │   │   └── dataTables.responsive.scss
│   │   ├── flot/
│   │   │   ├── excanvas.js
│   │   │   ├── jquery.colorhelpers.js
│   │   │   ├── jquery.flot.canvas.js
│   │   │   ├── jquery.flot.categories.js
│   │   │   ├── jquery.flot.crosshair.js
│   │   │   ├── jquery.flot.errorbars.js
│   │   │   ├── jquery.flot.fillbetween.js
│   │   │   ├── jquery.flot.image.js
│   │   │   ├── jquery.flot.js
│   │   │   ├── jquery.flot.navigate.js
│   │   │   ├── jquery.flot.pie.js
│   │   │   ├── jquery.flot.resize.js
│   │   │   ├── jquery.flot.selection.js
│   │   │   ├── jquery.flot.stack.js
│   │   │   ├── jquery.flot.symbol.js
│   │   │   ├── jquery.flot.threshold.js
│   │   │   ├── jquery.flot.time.js
│   │   │   └── jquery.js
│   │   ├── flot-tooltip/
│   │   │   ├── jquery.flot.tooltip.js
│   │   │   └── jquery.flot.tooltip.source.js
│   │   ├── font-awesome/
│   │   │   ├── HELP-US-OUT.txt
│   │   │   ├── css/
│   │   │   │   └── font-awesome.css
│   │   │   ├── fonts/
│   │   │   │   └── FontAwesome.otf
│   │   │   ├── less/
│   │   │   │   ├── animated.less
│   │   │   │   ├── bordered-pulled.less
│   │   │   │   ├── core.less
│   │   │   │   ├── extras.less
│   │   │   │   ├── fixed-width.less
│   │   │   │   ├── font-awesome.less
│   │   │   │   ├── icons.less
│   │   │   │   ├── larger.less
│   │   │   │   ├── list.less
│   │   │   │   ├── mixins.less
│   │   │   │   ├── path.less
│   │   │   │   ├── rotated-flipped.less
│   │   │   │   ├── screen-reader.less
│   │   │   │   ├── spinning.less
│   │   │   │   ├── stacked.less
│   │   │   │   └── variables.less
│   │   │   └── scss/
│   │   │       ├── _animated.scss
│   │   │       ├── _bordered-pulled.scss
│   │   │       ├── _core.scss
│   │   │       ├── _extras.scss
│   │   │       ├── _fixed-width.scss
│   │   │       ├── _icons.scss
│   │   │       ├── _larger.scss
│   │   │       ├── _list.scss
│   │   │       ├── _mixins.scss
│   │   │       ├── _path.scss
│   │   │       ├── _rotated-flipped.scss
│   │   │       ├── _screen-reader.scss
│   │   │       ├── _spinning.scss
│   │   │       ├── _stacked.scss
│   │   │       ├── _variables.scss
│   │   │       └── font-awesome.scss
│   │   ├── jquery/
│   │   │   └── jquery.js
│   │   ├── metisMenu/
│   │   │   ├── metisMenu.css
│   │   │   └── metisMenu.js
│   │   ├── morrisjs/
│   │   │   ├── morris.css
│   │   │   └── morris.js
│   │   └── raphael/
│   │       └── raphael.js
│   └── views/
│       ├── __init__.py
│       ├── active.py
│       ├── admin.py
│       ├── apply_get.py
│       ├── apply_put.py
│       ├── complaint.py
│       ├── message.py
│       ├── order.py
│       ├── scheduling.py
│       ├── score.py
│       ├── settings.py
│       ├── stats.py
│       ├── user.py
│       └── wallet.py
├── app_common/
│   ├── README.md
│   ├── __init__.py
│   ├── maps/
│   │   ├── __init__.py
│   │   ├── output.py
│   │   ├── role_admin.py
│   │   ├── status_active.py
│   │   ├── status_apply.py
│   │   ├── status_audit.py
│   │   ├── status_delete.py
│   │   ├── status_flow.py
│   │   ├── status_lock.py
│   │   ├── status_order.py
│   │   ├── status_pay.py
│   │   ├── status_rec.py
│   │   ├── status_reply.py
│   │   ├── type_active.py
│   │   ├── type_apply.py
│   │   ├── type_auth.py
│   │   ├── type_level.py
│   │   ├── type_order.py
│   │   ├── type_pay.py
│   │   ├── type_payment.py
│   │   ├── type_scheduling.py
│   │   ├── type_score.py
│   │   ├── type_withdraw.py
│   │   └── 全球区号.xlsx
│   └── tools/
│       ├── __init__.py
│       ├── date_time.py
│       ├── file.py
│       ├── ip.py
│       └── tree.py
├── app_frontend/
│   ├── README.md
│   ├── __init__.py
│   ├── api/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── active_item.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── author.py
│   │   ├── bit_coin.py
│   │   ├── bit_coin_item.py
│   │   ├── blog.py
│   │   ├── bonus.py
│   │   ├── bonus_item.py
│   │   ├── complaint.py
│   │   ├── credit.py
│   │   ├── message.py
│   │   ├── order.py
│   │   ├── order_bill.py
│   │   ├── scheduling.py
│   │   ├── scheduling_item.py
│   │   ├── score.py
│   │   ├── score_charity.py
│   │   ├── score_charity_item.py
│   │   ├── score_digital.py
│   │   ├── score_digital_item.py
│   │   ├── score_expense.py
│   │   ├── score_expense_item.py
│   │   ├── user.py
│   │   ├── user_auth.py
│   │   ├── user_bank.py
│   │   ├── user_config.py
│   │   ├── user_profile.py
│   │   ├── wallet.py
│   │   └── wallet_item.py
│   ├── celery_worker.py
│   ├── database.py
│   ├── emails.py
│   ├── filters.py
│   ├── forms/
│   │   ├── __init__.py
│   │   ├── active.py
│   │   ├── apply_get.py
│   │   ├── apply_put.py
│   │   ├── blog.py
│   │   ├── complaint.py
│   │   ├── login.py
│   │   ├── message.py
│   │   ├── order.py
│   │   ├── pay.py
│   │   ├── reg.py
│   │   ├── scheduling.py
│   │   └── user.py
│   ├── lib/
│   │   ├── __init__.py
│   │   ├── captcha.py
│   │   ├── cart.py
│   │   ├── container.py
│   │   ├── counter.py
│   │   ├── mongo.py
│   │   ├── qiniu_store.py
│   │   ├── rabbit_mq.py
│   │   ├── redis_session.py
│   │   ├── sendcloud.py
│   │   ├── session.py
│   │   ├── sms_chuanglan.py
│   │   ├── sms_chuanglan_iso.py
│   │   └── token.py
│   ├── log_test.py
│   ├── login.py
│   ├── middlewares.py
│   ├── models.py
│   ├── models_sqlite.py
│   ├── static/
│   │   ├── css/
│   │   │   ├── bootstrap-select.css
│   │   │   ├── bootstrap-theme.css
│   │   │   ├── bootstrap.css
│   │   │   ├── custom.css
│   │   │   ├── lightbox.css
│   │   │   └── slideout.css
│   │   ├── js/
│   │   │   ├── bootstrap-select.js
│   │   │   ├── bootstrap.js
│   │   │   ├── custom.js
│   │   │   ├── i18n/
│   │   │   │   ├── defaults-ar_AR.js
│   │   │   │   ├── defaults-bg_BG.js
│   │   │   │   ├── defaults-cro_CRO.js
│   │   │   │   ├── defaults-cs_CZ.js
│   │   │   │   ├── defaults-da_DK.js
│   │   │   │   ├── defaults-de_DE.js
│   │   │   │   ├── defaults-en_US.js
│   │   │   │   ├── defaults-es_CL.js
│   │   │   │   ├── defaults-es_ES.js
│   │   │   │   ├── defaults-eu.js
│   │   │   │   ├── defaults-fa_IR.js
│   │   │   │   ├── defaults-fi_FI.js
│   │   │   │   ├── defaults-fr_FR.js
│   │   │   │   ├── defaults-hu_HU.js
│   │   │   │   ├── defaults-id_ID.js
│   │   │   │   ├── defaults-it_IT.js
│   │   │   │   ├── defaults-ko_KR.js
│   │   │   │   ├── defaults-lt_LT.js
│   │   │   │   ├── defaults-nb_NO.js
│   │   │   │   ├── defaults-nl_NL.js
│   │   │   │   ├── defaults-pl_PL.js
│   │   │   │   ├── defaults-pt_BR.js
│   │   │   │   ├── defaults-pt_PT.js
│   │   │   │   ├── defaults-ro_RO.js
│   │   │   │   ├── defaults-ru_RU.js
│   │   │   │   ├── defaults-sk_SK.js
│   │   │   │   ├── defaults-sl_SI.js
│   │   │   │   ├── defaults-sv_SE.js
│   │   │   │   ├── defaults-tr_TR.js
│   │   │   │   ├── defaults-ua_UA.js
│   │   │   │   ├── defaults-zh_CN.js
│   │   │   │   └── defaults-zh_TW.js
│   │   │   └── npm.js
│   │   ├── plugin/
│   │   │   ├── Chart/
│   │   │   │   └── Chart.js
│   │   │   ├── Gallery-2.25.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── LICENSE.txt
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── blueimp-gallery-indicator.css
│   │   │   │   │   ├── blueimp-gallery-video.css
│   │   │   │   │   ├── blueimp-gallery.css
│   │   │   │   │   └── demo/
│   │   │   │   │       └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── blueimp-gallery-fullscreen.js
│   │   │   │   │   ├── blueimp-gallery-indicator.js
│   │   │   │   │   ├── blueimp-gallery-video.js
│   │   │   │   │   ├── blueimp-gallery-vimeo.js
│   │   │   │   │   ├── blueimp-gallery-youtube.js
│   │   │   │   │   ├── blueimp-gallery.js
│   │   │   │   │   ├── blueimp-helper.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── jquery.blueimp-gallery.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.js
│   │   │   │   └── package.json
│   │   │   ├── JavaScript-Canvas-to-Blob-3.7.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── js/
│   │   │   │   │   └── canvas-to-blob.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── load-image.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Load-Image-2.12.2/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo.css
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.Jcrop.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── index.js
│   │   │   │   │   ├── load-image-exif-map.js
│   │   │   │   │   ├── load-image-exif.js
│   │   │   │   │   ├── load-image-fetch.js
│   │   │   │   │   ├── load-image-meta.js
│   │   │   │   │   ├── load-image-orientation.js
│   │   │   │   │   ├── load-image-scale.js
│   │   │   │   │   ├── load-image.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       ├── jquery.Jcrop.js
│   │   │   │   │       └── jquery.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── canvas-to-blob.js
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── expect.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── JavaScript-Templates-3.8.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── README.md
│   │   │   │   ├── css/
│   │   │   │   │   └── demo.css
│   │   │   │   ├── index.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── compile.js
│   │   │   │   │   ├── demo/
│   │   │   │   │   │   └── demo.js
│   │   │   │   │   ├── runtime.js
│   │   │   │   │   └── tmpl.js
│   │   │   │   ├── package.json
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       ├── test.js
│   │   │   │       └── vendor/
│   │   │   │           ├── chai.js
│   │   │   │           ├── mocha.css
│   │   │   │           └── mocha.js
│   │   │   ├── Lightbox/
│   │   │   │   └── lightbox.js
│   │   │   ├── Slideout/
│   │   │   │   └── slideout.js
│   │   │   ├── Swiper-3.3.1/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── component.json
│   │   │   │   ├── demos/
│   │   │   │   │   ├── 01-default.html
│   │   │   │   │   ├── 02-responsive.html
│   │   │   │   │   ├── 03-vertical.html
│   │   │   │   │   ├── 04-space-between.html
│   │   │   │   │   ├── 05-slides-per-view.html
│   │   │   │   │   ├── 06-slides-per-view-auto.html
│   │   │   │   │   ├── 07-centered.html
│   │   │   │   │   ├── 08-centered-auto.html
│   │   │   │   │   ├── 09-freemode.html
│   │   │   │   │   ├── 10-slides-per-column.html
│   │   │   │   │   ├── 11-nested.html
│   │   │   │   │   ├── 12-grab-cursor.html
│   │   │   │   │   ├── 13-scrollbar.html
│   │   │   │   │   ├── 14-nav-arrows.html
│   │   │   │   │   ├── 15-infinite-loop.html
│   │   │   │   │   ├── 16-effect-fade.html
│   │   │   │   │   ├── 17-effect-cube.html
│   │   │   │   │   ├── 18-effect-coverflow.html
│   │   │   │   │   ├── 19-keyboard-control.html
│   │   │   │   │   ├── 20-mousewheel-control.html
│   │   │   │   │   ├── 21-autoplay.html
│   │   │   │   │   ├── 22-dynamic-slides.html
│   │   │   │   │   ├── 23-thumbs-gallery-loop.html
│   │   │   │   │   ├── 23-thumbs-gallery.html
│   │   │   │   │   ├── 24-multiple-swipers.html
│   │   │   │   │   ├── 25-hash-navigation.html
│   │   │   │   │   ├── 26-rtl.html
│   │   │   │   │   ├── 27-jquery.html
│   │   │   │   │   ├── 28-parallax.html
│   │   │   │   │   ├── 29-custom-pagination.html
│   │   │   │   │   ├── 30-lazy-load-images.html
│   │   │   │   │   ├── 31-custom-plugin.html
│   │   │   │   │   ├── 32-scroll-container.html
│   │   │   │   │   ├── 33-responsive-breakpoints.html
│   │   │   │   │   ├── 34-autoheight.html
│   │   │   │   │   ├── 35-effect-flip.html
│   │   │   │   │   ├── 36-pagination-fraction.html
│   │   │   │   │   └── 37-pagination-progress.html
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── swiper.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── swiper.jquery.js
│   │   │   │   │       ├── swiper.jquery.umd.js
│   │   │   │   │       └── swiper.js
│   │   │   │   ├── gulpfile.js
│   │   │   │   ├── package.js
│   │   │   │   ├── package.json
│   │   │   │   ├── playground/
│   │   │   │   │   └── index.html
│   │   │   │   └── src/
│   │   │   │       ├── js/
│   │   │   │       │   ├── a11y.js
│   │   │   │       │   ├── amd.js
│   │   │   │       │   ├── controller.js
│   │   │   │       │   ├── core.js
│   │   │   │       │   ├── dom-plugins.js
│   │   │   │       │   ├── dom.js
│   │   │   │       │   ├── effects.js
│   │   │   │       │   ├── emitter.js
│   │   │   │       │   ├── get-dom-lib.js
│   │   │   │       │   ├── get-jquery.js
│   │   │   │       │   ├── hashnav.js
│   │   │   │       │   ├── init.js
│   │   │   │       │   ├── keyboard.js
│   │   │   │       │   ├── lazy-load.js
│   │   │   │       │   ├── mousewheel.js
│   │   │   │       │   ├── parallax.js
│   │   │   │       │   ├── plugins.js
│   │   │   │       │   ├── scrollbar.js
│   │   │   │       │   ├── swiper-intro-f7.js
│   │   │   │       │   ├── swiper-intro.js
│   │   │   │       │   ├── swiper-outro.js
│   │   │   │       │   ├── swiper-proto.js
│   │   │   │       │   ├── wrap-end-umd.js
│   │   │   │       │   ├── wrap-end.js
│   │   │   │       │   ├── wrap-start-umd.js
│   │   │   │       │   └── wrap-start.js
│   │   │   │       └── less/
│   │   │   │           ├── core.less
│   │   │   │           ├── effects.less
│   │   │   │           ├── mixins.less
│   │   │   │           ├── navigation-f7.less
│   │   │   │           ├── navigation.less
│   │   │   │           ├── preloader-f7.less
│   │   │   │           ├── preloader.less
│   │   │   │           ├── scrollbar.less
│   │   │   │           └── swiper.less
│   │   │   ├── bootstrap-select-1.12.2/
│   │   │   │   ├── .github/
│   │   │   │   │   └── ISSUE_TEMPLATE.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── CHANGELOG.md
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── Gruntfile.js
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── bower.json
│   │   │   │   ├── composer.json
│   │   │   │   ├── dist/
│   │   │   │   │   ├── css/
│   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   └── js/
│   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │       └── i18n/
│   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   ├── docs/
│   │   │   │   │   ├── custom_theme/
│   │   │   │   │   │   ├── base.html
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── base.css
│   │   │   │   │   │   ├── js/
│   │   │   │   │   │   │   └── base.js
│   │   │   │   │   │   ├── nav.html
│   │   │   │   │   │   └── toc.html
│   │   │   │   │   ├── docs/
│   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   └── custom.css
│   │   │   │   │   │   ├── dist/
│   │   │   │   │   │   │   ├── css/
│   │   │   │   │   │   │   │   └── bootstrap-select.css
│   │   │   │   │   │   │   └── js/
│   │   │   │   │   │   │       ├── bootstrap-select.js
│   │   │   │   │   │   │       └── i18n/
│   │   │   │   │   │   │           ├── defaults-ar_AR.js
│   │   │   │   │   │   │           ├── defaults-bg_BG.js
│   │   │   │   │   │   │           ├── defaults-cro_CRO.js
│   │   │   │   │   │   │           ├── defaults-cs_CZ.js
│   │   │   │   │   │   │           ├── defaults-da_DK.js
│   │   │   │   │   │   │           ├── defaults-de_DE.js
│   │   │   │   │   │   │           ├── defaults-en_US.js
│   │   │   │   │   │   │           ├── defaults-es_CL.js
│   │   │   │   │   │   │           ├── defaults-es_ES.js
│   │   │   │   │   │   │           ├── defaults-eu.js
│   │   │   │   │   │   │           ├── defaults-fa_IR.js
│   │   │   │   │   │   │           ├── defaults-fi_FI.js
│   │   │   │   │   │   │           ├── defaults-fr_FR.js
│   │   │   │   │   │   │           ├── defaults-hu_HU.js
│   │   │   │   │   │   │           ├── defaults-id_ID.js
│   │   │   │   │   │   │           ├── defaults-it_IT.js
│   │   │   │   │   │   │           ├── defaults-ko_KR.js
│   │   │   │   │   │   │           ├── defaults-lt_LT.js
│   │   │   │   │   │   │           ├── defaults-nb_NO.js
│   │   │   │   │   │   │           ├── defaults-nl_NL.js
│   │   │   │   │   │   │           ├── defaults-pl_PL.js
│   │   │   │   │   │   │           ├── defaults-pt_BR.js
│   │   │   │   │   │   │           ├── defaults-pt_PT.js
│   │   │   │   │   │   │           ├── defaults-ro_RO.js
│   │   │   │   │   │   │           ├── defaults-ru_RU.js
│   │   │   │   │   │   │           ├── defaults-sk_SK.js
│   │   │   │   │   │   │           ├── defaults-sl_SI.js
│   │   │   │   │   │   │           ├── defaults-sv_SE.js
│   │   │   │   │   │   │           ├── defaults-tr_TR.js
│   │   │   │   │   │   │           ├── defaults-ua_UA.js
│   │   │   │   │   │   │           ├── defaults-zh_CN.js
│   │   │   │   │   │   │           └── defaults-zh_TW.js
│   │   │   │   │   │   ├── examples.md
│   │   │   │   │   │   ├── index.md
│   │   │   │   │   │   ├── methods.md
│   │   │   │   │   │   ├── options.md
│   │   │   │   │   │   └── playground/
│   │   │   │   │   │       ├── index.html
│   │   │   │   │   │       ├── plnkrOpener.js
│   │   │   │   │   │       └── test.html
│   │   │   │   │   └── mkdocs.yml
│   │   │   │   ├── js/
│   │   │   │   │   ├── .jshintrc
│   │   │   │   │   ├── bootstrap-select.js
│   │   │   │   │   └── i18n/
│   │   │   │   │       ├── defaults-ar_AR.js
│   │   │   │   │       ├── defaults-bg_BG.js
│   │   │   │   │       ├── defaults-cro_CRO.js
│   │   │   │   │       ├── defaults-cs_CZ.js
│   │   │   │   │       ├── defaults-da_DK.js
│   │   │   │   │       ├── defaults-de_DE.js
│   │   │   │   │       ├── defaults-en_US.js
│   │   │   │   │       ├── defaults-es_CL.js
│   │   │   │   │       ├── defaults-es_ES.js
│   │   │   │   │       ├── defaults-eu.js
│   │   │   │   │       ├── defaults-fa_IR.js
│   │   │   │   │       ├── defaults-fi_FI.js
│   │   │   │   │       ├── defaults-fr_FR.js
│   │   │   │   │       ├── defaults-hu_HU.js
│   │   │   │   │       ├── defaults-id_ID.js
│   │   │   │   │       ├── defaults-it_IT.js
│   │   │   │   │       ├── defaults-ko_KR.js
│   │   │   │   │       ├── defaults-lt_LT.js
│   │   │   │   │       ├── defaults-nb_NO.js
│   │   │   │   │       ├── defaults-nl_NL.js
│   │   │   │   │       ├── defaults-pl_PL.js
│   │   │   │   │       ├── defaults-pt_BR.js
│   │   │   │   │       ├── defaults-pt_PT.js
│   │   │   │   │       ├── defaults-ro_RO.js
│   │   │   │   │       ├── defaults-ru_RU.js
│   │   │   │   │       ├── defaults-sk_SK.js
│   │   │   │   │       ├── defaults-sl_SI.js
│   │   │   │   │       ├── defaults-sv_SE.js
│   │   │   │   │       ├── defaults-tr_TR.js
│   │   │   │   │       ├── defaults-ua_UA.js
│   │   │   │   │       ├── defaults-zh_CN.js
│   │   │   │   │       └── defaults-zh_TW.js
│   │   │   │   ├── less/
│   │   │   │   │   ├── bootstrap-select.less
│   │   │   │   │   └── variables.less
│   │   │   │   ├── nuget/
│   │   │   │   │   ├── MyGet.ps1
│   │   │   │   │   └── bootstrap-select.nuspec
│   │   │   │   ├── package.json
│   │   │   │   ├── sass/
│   │   │   │   │   ├── bootstrap-select.scss
│   │   │   │   │   └── variables.scss
│   │   │   │   └── test.html
│   │   │   ├── clipboard.js-1.6.1/
│   │   │   │   ├── .babelrc
│   │   │   │   ├── .banner
│   │   │   │   ├── .editorconfig
│   │   │   │   ├── .github/
│   │   │   │   │   └── issue_template.md
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .npmignore
│   │   │   │   ├── .travis.yml
│   │   │   │   ├── bower.json
│   │   │   │   ├── contributing.md
│   │   │   │   ├── demo/
│   │   │   │   │   ├── constructor-node.html
│   │   │   │   │   ├── constructor-nodelist.html
│   │   │   │   │   ├── constructor-selector.html
│   │   │   │   │   ├── function-target.html
│   │   │   │   │   ├── function-text.html
│   │   │   │   │   ├── target-div.html
│   │   │   │   │   ├── target-input.html
│   │   │   │   │   └── target-textarea.html
│   │   │   │   ├── dist/
│   │   │   │   │   └── clipboard.js
│   │   │   │   ├── karma.conf.js
│   │   │   │   ├── package.js
│   │   │   │   ├── package.json
│   │   │   │   ├── readme.md
│   │   │   │   ├── src/
│   │   │   │   │   ├── clipboard-action.js
│   │   │   │   │   └── clipboard.js
│   │   │   │   └── test/
│   │   │   │       ├── clipboard-action.js
│   │   │   │       └── clipboard.js
│   │   │   ├── jQuery-File-Upload-9.18.0/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── .jshintrc
│   │   │   │   ├── .npmignore
│   │   │   │   ├── CONTRIBUTING.md
│   │   │   │   ├── LICENSE
│   │   │   │   ├── README.md
│   │   │   │   ├── angularjs.html
│   │   │   │   ├── basic-plus.html
│   │   │   │   ├── basic.html
│   │   │   │   ├── bower-version-update.js
│   │   │   │   ├── bower.json
│   │   │   │   ├── cors/
│   │   │   │   │   ├── postmessage.html
│   │   │   │   │   └── result.html
│   │   │   │   ├── css/
│   │   │   │   │   ├── demo-ie8.css
│   │   │   │   │   ├── demo.css
│   │   │   │   │   ├── jquery.fileupload-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui-noscript.css
│   │   │   │   │   ├── jquery.fileupload-ui.css
│   │   │   │   │   ├── jquery.fileupload.css
│   │   │   │   │   └── style.css
│   │   │   │   ├── index.html
│   │   │   │   ├── jquery-ui.html
│   │   │   │   ├── js/
│   │   │   │   │   ├── app.js
│   │   │   │   │   ├── cors/
│   │   │   │   │   │   ├── jquery.postmessage-transport.js
│   │   │   │   │   │   └── jquery.xdr-transport.js
│   │   │   │   │   ├── jquery.fileupload-angular.js
│   │   │   │   │   ├── jquery.fileupload-audio.js
│   │   │   │   │   ├── jquery.fileupload-image.js
│   │   │   │   │   ├── jquery.fileupload-jquery-ui.js
│   │   │   │   │   ├── jquery.fileupload-process.js
│   │   │   │   │   ├── jquery.fileupload-ui.js
│   │   │   │   │   ├── jquery.fileupload-validate.js
│   │   │   │   │   ├── jquery.fileupload-video.js
│   │   │   │   │   ├── jquery.fileupload.js
│   │   │   │   │   ├── jquery.iframe-transport.js
│   │   │   │   │   ├── main.js
│   │   │   │   │   └── vendor/
│   │   │   │   │       └── jquery.ui.widget.js
│   │   │   │   ├── package.json
│   │   │   │   ├── server/
│   │   │   │   │   ├── gae-go/
│   │   │   │   │   │   ├── app/
│   │   │   │   │   │   │   └── main.go
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   ├── gae-python/
│   │   │   │   │   │   ├── app.yaml
│   │   │   │   │   │   ├── main.py
│   │   │   │   │   │   └── static/
│   │   │   │   │   │       └── robots.txt
│   │   │   │   │   └── php/
│   │   │   │   │       ├── Dockerfile
│   │   │   │   │       ├── UploadHandler.php
│   │   │   │   │       ├── docker-compose.yml
│   │   │   │   │       ├── files/
│   │   │   │   │       │   ├── .gitignore
│   │   │   │   │       │   └── .htaccess
│   │   │   │   │       └── index.php
│   │   │   │   └── test/
│   │   │   │       ├── index.html
│   │   │   │       └── test.js
│   │   │   └── moment-2.18.1/
│   │   │       ├── .editorconfig
│   │   │       ├── .gitattributes
│   │   │       ├── .gitignore
│   │   │       ├── .jscs.json
│   │   │       ├── .jshintrc
│   │   │       ├── .npmignore
│   │   │       ├── .spmignore
│   │   │       ├── .travis.yml
│   │   │       ├── CHANGELOG.md
│   │   │       ├── CONTRIBUTING.md
│   │   │       ├── Gruntfile.js
│   │   │       ├── ISSUE_TEMPLATE.md
│   │   │       ├── LICENSE
│   │   │       ├── Moment.js.nuspec
│   │   │       ├── README.md
│   │   │       ├── benchmarks/
│   │   │       │   ├── add.js
│   │   │       │   ├── clone.js
│   │   │       │   ├── endOf.js
│   │   │       │   ├── fromDate.js
│   │   │       │   ├── fromDateUtc.js
│   │   │       │   ├── makeDuration.js
│   │   │       │   ├── query.js
│   │   │       │   ├── startOf.js
│   │   │       │   ├── subtract.js
│   │   │       │   └── zeroFill.js
│   │   │       ├── bower.json
│   │   │       ├── component.json
│   │   │       ├── composer.json
│   │   │       ├── ender.js
│   │   │       ├── locale/
│   │   │       │   ├── af.js
│   │   │       │   ├── ar-dz.js
│   │   │       │   ├── ar-kw.js
│   │   │       │   ├── ar-ly.js
│   │   │       │   ├── ar-ma.js
│   │   │       │   ├── ar-sa.js
│   │   │       │   ├── ar-tn.js
│   │   │       │   ├── ar.js
│   │   │       │   ├── az.js
│   │   │       │   ├── be.js
│   │   │       │   ├── bg.js
│   │   │       │   ├── bn.js
│   │   │       │   ├── bo.js
│   │   │       │   ├── br.js
│   │   │       │   ├── bs.js
│   │   │       │   ├── ca.js
│   │   │       │   ├── cs.js
│   │   │       │   ├── cv.js
│   │   │       │   ├── cy.js
│   │   │       │   ├── da.js
│   │   │       │   ├── de-at.js
│   │   │       │   ├── de-ch.js
│   │   │       │   ├── de.js
│   │   │       │   ├── dv.js
│   │   │       │   ├── el.js
│   │   │       │   ├── en-au.js
│   │   │       │   ├── en-ca.js
│   │   │       │   ├── en-gb.js
│   │   │       │   ├── en-ie.js
│   │   │       │   ├── en-nz.js
│   │   │       │   ├── eo.js
│   │   │       │   ├── es-do.js
│   │   │       │   ├── es.js
│   │   │       │   ├── et.js
│   │   │       │   ├── eu.js
│   │   │       │   ├── fa.js
│   │   │       │   ├── fi.js
│   │   │       │   ├── fo.js
│   │   │       │   ├── fr-ca.js
│   │   │       │   ├── fr-ch.js
│   │   │       │   ├── fr.js
│   │   │       │   ├── fy.js
│   │   │       │   ├── gd.js
│   │   │       │   ├── gl.js
│   │   │       │   ├── gom-latn.js
│   │   │       │   ├── he.js
│   │   │       │   ├── hi.js
│   │   │       │   ├── hr.js
│   │   │       │   ├── hu.js
│   │   │       │   ├── hy-am.js
│   │   │       │   ├── id.js
│   │   │       │   ├── is.js
│   │   │       │   ├── it.js
│   │   │       │   ├── ja.js
│   │   │       │   ├── jv.js
│   │   │       │   ├── ka.js
│   │   │       │   ├── kk.js
│   │   │       │   ├── km.js
│   │   │       │   ├── kn.js
│   │   │       │   ├── ko.js
│   │   │       │   ├── ky.js
│   │   │       │   ├── lb.js
│   │   │       │   ├── lo.js
│   │   │       │   ├── lt.js
│   │   │       │   ├── lv.js
│   │   │       │   ├── me.js
│   │   │       │   ├── mi.js
│   │   │       │   ├── mk.js
│   │   │       │   ├── ml.js
│   │   │       │   ├── mr.js
│   │   │       │   ├── ms-my.js
│   │   │       │   ├── ms.js
│   │   │       │   ├── my.js
│   │   │       │   ├── nb.js
│   │   │       │   ├── ne.js
│   │   │       │   ├── nl-be.js
│   │   │       │   ├── nl.js
│   │   │       │   ├── nn.js
│   │   │       │   ├── pa-in.js
│   │   │       │   ├── pl.js
│   │   │       │   ├── pt-br.js
│   │   │       │   ├── pt.js
│   │   │       │   ├── ro.js
│   │   │       │   ├── ru.js
│   │   │       │   ├── sd.js
│   │   │       │   ├── se.js
│   │   │       │   ├── si.js
│   │   │       │   ├── sk.js
│   │   │       │   ├── sl.js
│   │   │       │   ├── sq.js
│   │   │       │   ├── sr-cyrl.js
│   │   │       │   ├── sr.js
│   │   │       │   ├── ss.js
│   │   │       │   ├── sv.js
│   │   │       │   ├── sw.js
│   │   │       │   ├── ta.js
│   │   │       │   ├── te.js
│   │   │       │   ├── tet.js
│   │   │       │   ├── th.js
│   │   │       │   ├── tl-ph.js
│   │   │       │   ├── tlh.js
│   │   │       │   ├── tr.js
│   │   │       │   ├── tzl.js
│   │   │       │   ├── tzm-latn.js
│   │   │       │   ├── tzm.js
│   │   │       │   ├── uk.js
│   │   │       │   ├── ur.js
│   │   │       │   ├── uz-latn.js
│   │   │       │   ├── uz.js
│   │   │       │   ├── vi.js
│   │   │       │   ├── x-pseudo.js
│   │   │       │   ├── yo.js
│   │   │       │   ├── zh-cn.js
│   │   │       │   ├── zh-hk.js
│   │   │       │   └── zh-tw.js
│   │   │       ├── meteor/
│   │   │       │   ├── README.md
│   │   │       │   ├── export.js
│   │   │       │   ├── moment.js
│   │   │       │   ├── package.js
│   │   │       │   └── test.js
│   │   │       ├── min/
│   │   │       │   ├── locales.js
│   │   │       │   ├── moment-with-locales.js
│   │   │       │   └── tests.js
│   │   │       ├── moment.d.ts
│   │   │       ├── moment.js
│   │   │       ├── package.js
│   │   │       ├── package.json
│   │   │       ├── scripts/
│   │   │       │   ├── locales.js
│   │   │       │   └── npm_prepublish.sh
│   │   │       ├── src/
│   │   │       │   ├── lib/
│   │   │       │   │   ├── create/
│   │   │       │   │   │   ├── check-overflow.js
│   │   │       │   │   │   ├── date-from-array.js
│   │   │       │   │   │   ├── from-anything.js
│   │   │       │   │   │   ├── from-array.js
│   │   │       │   │   │   ├── from-object.js
│   │   │       │   │   │   ├── from-string-and-array.js
│   │   │       │   │   │   ├── from-string-and-format.js
│   │   │       │   │   │   ├── from-string.js
│   │   │       │   │   │   ├── local.js
│   │   │       │   │   │   ├── parsing-flags.js
│   │   │       │   │   │   ├── utc.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── duration/
│   │   │       │   │   │   ├── abs.js
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── as.js
│   │   │       │   │   │   ├── bubble.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── create.js
│   │   │       │   │   │   ├── duration.js
│   │   │       │   │   │   ├── get.js
│   │   │       │   │   │   ├── humanize.js
│   │   │       │   │   │   ├── iso-string.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── format/
│   │   │       │   │   │   └── format.js
│   │   │       │   │   ├── locale/
│   │   │       │   │   │   ├── base-config.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── en.js
│   │   │       │   │   │   ├── formats.js
│   │   │       │   │   │   ├── invalid.js
│   │   │       │   │   │   ├── lists.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── locales.js
│   │   │       │   │   │   ├── ordinal.js
│   │   │       │   │   │   ├── pre-post-format.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── relative.js
│   │   │       │   │   │   └── set.js
│   │   │       │   │   ├── moment/
│   │   │       │   │   │   ├── add-subtract.js
│   │   │       │   │   │   ├── calendar.js
│   │   │       │   │   │   ├── clone.js
│   │   │       │   │   │   ├── compare.js
│   │   │       │   │   │   ├── constructor.js
│   │   │       │   │   │   ├── creation-data.js
│   │   │       │   │   │   ├── diff.js
│   │   │       │   │   │   ├── format.js
│   │   │       │   │   │   ├── from.js
│   │   │       │   │   │   ├── get-set.js
│   │   │       │   │   │   ├── locale.js
│   │   │       │   │   │   ├── min-max.js
│   │   │       │   │   │   ├── moment.js
│   │   │       │   │   │   ├── now.js
│   │   │       │   │   │   ├── prototype.js
│   │   │       │   │   │   ├── start-end-of.js
│   │   │       │   │   │   ├── to-type.js
│   │   │       │   │   │   ├── to.js
│   │   │       │   │   │   └── valid.js
│   │   │       │   │   ├── parse/
│   │   │       │   │   │   ├── regex.js
│   │   │       │   │   │   └── token.js
│   │   │       │   │   ├── units/
│   │   │       │   │   │   ├── aliases.js
│   │   │       │   │   │   ├── constants.js
│   │   │       │   │   │   ├── day-of-month.js
│   │   │       │   │   │   ├── day-of-week.js
│   │   │       │   │   │   ├── day-of-year.js
│   │   │       │   │   │   ├── hour.js
│   │   │       │   │   │   ├── millisecond.js
│   │   │       │   │   │   ├── minute.js
│   │   │       │   │   │   ├── month.js
│   │   │       │   │   │   ├── offset.js
│   │   │       │   │   │   ├── priorities.js
│   │   │       │   │   │   ├── quarter.js
│   │   │       │   │   │   ├── second.js
│   │   │       │   │   │   ├── timestamp.js
│   │   │       │   │   │   ├── timezone.js
│   │   │       │   │   │   ├── units.js
│   │   │       │   │   │   ├── week-calendar-utils.js
│   │   │       │   │   │   ├── week-year.js
│   │   │       │   │   │   ├── week.js
│   │   │       │   │   │   └── year.js
│   │   │       │   │   └── utils/
│   │   │       │   │       ├── abs-ceil.js
│   │   │       │   │       ├── abs-floor.js
│   │   │       │   │       ├── abs-round.js
│   │   │       │   │       ├── compare-arrays.js
│   │   │       │   │       ├── defaults.js
│   │   │       │   │       ├── deprecate.js
│   │   │       │   │       ├── extend.js
│   │   │       │   │       ├── has-own-prop.js
│   │   │       │   │       ├── hooks.js
│   │   │       │   │       ├── index-of.js
│   │   │       │   │       ├── is-array.js
│   │   │       │   │       ├── is-date.js
│   │   │       │   │       ├── is-function.js
│   │   │       │   │       ├── is-number.js
│   │   │       │   │       ├── is-object-empty.js
│   │   │       │   │       ├── is-object.js
│   │   │       │   │       ├── is-undefined.js
│   │   │       │   │       ├── keys.js
│   │   │       │   │       ├── map.js
│   │   │       │   │       ├── some.js
│   │   │       │   │       ├── to-int.js
│   │   │       │   │       └── zero-fill.js
│   │   │       │   ├── locale/
│   │   │       │   │   ├── af.js
│   │   │       │   │   ├── ar-dz.js
│   │   │       │   │   ├── ar-kw.js
│   │   │       │   │   ├── ar-ly.js
│   │   │       │   │   ├── ar-ma.js
│   │   │       │   │   ├── ar-sa.js
│   │   │       │   │   ├── ar-tn.js
│   │   │       │   │   ├── ar.js
│   │   │       │   │   ├── az.js
│   │   │       │   │   ├── be.js
│   │   │       │   │   ├── bg.js
│   │   │       │   │   ├── bn.js
│   │   │       │   │   ├── bo.js
│   │   │       │   │   ├── br.js
│   │   │       │   │   ├── bs.js
│   │   │       │   │   ├── ca.js
│   │   │       │   │   ├── cs.js
│   │   │       │   │   ├── cv.js
│   │   │       │   │   ├── cy.js
│   │   │       │   │   ├── da.js
│   │   │       │   │   ├── de-at.js
│   │   │       │   │   ├── de-ch.js
│   │   │       │   │   ├── de.js
│   │   │       │   │   ├── dv.js
│   │   │       │   │   ├── el.js
│   │   │       │   │   ├── en-au.js
│   │   │       │   │   ├── en-ca.js
│   │   │       │   │   ├── en-gb.js
│   │   │       │   │   ├── en-ie.js
│   │   │       │   │   ├── en-nz.js
│   │   │       │   │   ├── eo.js
│   │   │       │   │   ├── es-do.js
│   │   │       │   │   ├── es.js
│   │   │       │   │   ├── et.js
│   │   │       │   │   ├── eu.js
│   │   │       │   │   ├── fa.js
│   │   │       │   │   ├── fi.js
│   │   │       │   │   ├── fo.js
│   │   │       │   │   ├── fr-ca.js
│   │   │       │   │   ├── fr-ch.js
│   │   │       │   │   ├── fr.js
│   │   │       │   │   ├── fy.js
│   │   │       │   │   ├── gd.js
│   │   │       │   │   ├── gl.js
│   │   │       │   │   ├── gom-latn.js
│   │   │       │   │   ├── he.js
│   │   │       │   │   ├── hi.js
│   │   │       │   │   ├── hr.js
│   │   │       │   │   ├── hu.js
│   │   │       │   │   ├── hy-am.js
│   │   │       │   │   ├── id.js
│   │   │       │   │   ├── is.js
│   │   │       │   │   ├── it.js
│   │   │       │   │   ├── ja.js
│   │   │       │   │   ├── jv.js
│   │   │       │   │   ├── ka.js
│   │   │       │   │   ├── kk.js
│   │   │       │   │   ├── km.js
│   │   │       │   │   ├── kn.js
│   │   │       │   │   ├── ko.js
│   │   │       │   │   ├── ky.js
│   │   │       │   │   ├── lb.js
│   │   │       │   │   ├── lo.js
│   │   │       │   │   ├── lt.js
│   │   │       │   │   ├── lv.js
│   │   │       │   │   ├── me.js
│   │   │       │   │   ├── mi.js
│   │   │       │   │   ├── mk.js
│   │   │       │   │   ├── ml.js
│   │   │       │   │   ├── mr.js
│   │   │       │   │   ├── ms-my.js
│   │   │       │   │   ├── ms.js
│   │   │       │   │   ├── my.js
│   │   │       │   │   ├── nb.js
│   │   │       │   │   ├── ne.js
│   │   │       │   │   ├── nl-be.js
│   │   │       │   │   ├── nl.js
│   │   │       │   │   ├── nn.js
│   │   │       │   │   ├── pa-in.js
│   │   │       │   │   ├── pl.js
│   │   │       │   │   ├── pt-br.js
│   │   │       │   │   ├── pt.js
│   │   │       │   │   ├── ro.js
│   │   │       │   │   ├── ru.js
│   │   │       │   │   ├── sd.js
│   │   │       │   │   ├── se.js
│   │   │       │   │   ├── si.js
│   │   │       │   │   ├── sk.js
│   │   │       │   │   ├── sl.js
│   │   │       │   │   ├── sq.js
│   │   │       │   │   ├── sr-cyrl.js
│   │   │       │   │   ├── sr.js
│   │   │       │   │   ├── ss.js
│   │   │       │   │   ├── sv.js
│   │   │       │   │   ├── sw.js
│   │   │       │   │   ├── ta.js
│   │   │       │   │   ├── te.js
│   │   │       │   │   ├── tet.js
│   │   │       │   │   ├── th.js
│   │   │       │   │   ├── tl-ph.js
│   │   │       │   │   ├── tlh.js
│   │   │       │   │   ├── tr.js
│   │   │       │   │   ├── tzl.js
│   │   │       │   │   ├── tzm-latn.js
│   │   │       │   │   ├── tzm.js
│   │   │       │   │   ├── uk.js
│   │   │       │   │   ├── ur.js
│   │   │       │   │   ├── uz-latn.js
│   │   │       │   │   ├── uz.js
│   │   │       │   │   ├── vi.js
│   │   │       │   │   ├── x-pseudo.js
│   │   │       │   │   ├── yo.js
│   │   │       │   │   ├── zh-cn.js
│   │   │       │   │   ├── zh-hk.js
│   │   │       │   │   └── zh-tw.js
│   │   │       │   ├── moment.js
│   │   │       │   └── test/
│   │   │       │       ├── helpers/
│   │   │       │       │   ├── common-locale.js
│   │   │       │       │   ├── deprecation-handler.js
│   │   │       │       │   ├── dst.js
│   │   │       │       │   ├── each.js
│   │   │       │       │   └── object-keys.js
│   │   │       │       ├── locale/
│   │   │       │       │   ├── af.js
│   │   │       │       │   ├── ar-dz.js
│   │   │       │       │   ├── ar-kw.js
│   │   │       │       │   ├── ar-ly.js
│   │   │       │       │   ├── ar-ma.js
│   │   │       │       │   ├── ar-sa.js
│   │   │       │       │   ├── ar-tn.js
│   │   │       │       │   ├── ar.js
│   │   │       │       │   ├── az.js
│   │   │       │       │   ├── be.js
│   │   │       │       │   ├── bg.js
│   │   │       │       │   ├── bn.js
│   │   │       │       │   ├── bo.js
│   │   │       │       │   ├── br.js
│   │   │       │       │   ├── bs.js
│   │   │       │       │   ├── ca.js
│   │   │       │       │   ├── cs.js
│   │   │       │       │   ├── cv.js
│   │   │       │       │   ├── cy.js
│   │   │       │       │   ├── da.js
│   │   │       │       │   ├── de-at.js
│   │   │       │       │   ├── de-ch.js
│   │   │       │       │   ├── de.js
│   │   │       │       │   ├── dv.js
│   │   │       │       │   ├── el.js
│   │   │       │       │   ├── en-au.js
│   │   │       │       │   ├── en-ca.js
│   │   │       │       │   ├── en-gb.js
│   │   │       │       │   ├── en-ie.js
│   │   │       │       │   ├── en-nz.js
│   │   │       │       │   ├── en.js
│   │   │       │       │   ├── eo.js
│   │   │       │       │   ├── es-do.js
│   │   │       │       │   ├── es.js
│   │   │       │       │   ├── et.js
│   │   │       │       │   ├── eu.js
│   │   │       │       │   ├── fa.js
│   │   │       │       │   ├── fi.js
│   │   │       │       │   ├── fo.js
│   │   │       │       │   ├── fr-ca.js
│   │   │       │       │   ├── fr-ch.js
│   │   │       │       │   ├── fr.js
│   │   │       │       │   ├── fy.js
│   │   │       │       │   ├── gd.js
│   │   │       │       │   ├── gl.js
│   │   │       │       │   ├── gom-latn.js
│   │   │       │       │   ├── he.js
│   │   │       │       │   ├── hi.js
│   │   │       │       │   ├── hr.js
│   │   │       │       │   ├── hu.js
│   │   │       │       │   ├── hy-am.js
│   │   │       │       │   ├── id.js
│   │   │       │       │   ├── is.js
│   │   │       │       │   ├── it.js
│   │   │       │       │   ├── ja.js
│   │   │       │       │   ├── jv.js
│   │   │       │       │   ├── ka.js
│   │   │       │       │   ├── kk.js
│   │   │       │       │   ├── km.js
│   │   │       │       │   ├── kn.js
│   │   │       │       │   ├── ko.js
│   │   │       │       │   ├── ky.js
│   │   │       │       │   ├── lb.js
│   │   │       │       │   ├── lo.js
│   │   │       │       │   ├── lt.js
│   │   │       │       │   ├── lv.js
│   │   │       │       │   ├── me.js
│   │   │       │       │   ├── mi.js
│   │   │       │       │   ├── mk.js
│   │   │       │       │   ├── ml.js
│   │   │       │       │   ├── mr.js
│   │   │       │       │   ├── ms-my.js
│   │   │       │       │   ├── ms.js
│   │   │       │       │   ├── my.js
│   │   │       │       │   ├── nb.js
│   │   │       │       │   ├── ne.js
│   │   │       │       │   ├── nl-be.js
│   │   │       │       │   ├── nl.js
│   │   │       │       │   ├── nn.js
│   │   │       │       │   ├── pa-in.js
│   │   │       │       │   ├── pl.js
│   │   │       │       │   ├── pt-br.js
│   │   │       │       │   ├── pt.js
│   │   │       │       │   ├── ro.js
│   │   │       │       │   ├── ru.js
│   │   │       │       │   ├── sd.js
│   │   │       │       │   ├── se.js
│   │   │       │       │   ├── si.js
│   │   │       │       │   ├── sk.js
│   │   │       │       │   ├── sl.js
│   │   │       │       │   ├── sq.js
│   │   │       │       │   ├── sr-cyrl.js
│   │   │       │       │   ├── sr.js
│   │   │       │       │   ├── ss.js
│   │   │       │       │   ├── sv.js
│   │   │       │       │   ├── sw.js
│   │   │       │       │   ├── ta.js
│   │   │       │       │   ├── te.js
│   │   │       │       │   ├── tet.js
│   │   │       │       │   ├── th.js
│   │   │       │       │   ├── tl-ph.js
│   │   │       │       │   ├── tlh.js
│   │   │       │       │   ├── tr.js
│   │   │       │       │   ├── tzl.js
│   │   │       │       │   ├── tzm-latn.js
│   │   │       │       │   ├── tzm.js
│   │   │       │       │   ├── uk.js
│   │   │       │       │   ├── ur.js
│   │   │       │       │   ├── uz-latn.js
│   │   │       │       │   ├── uz.js
│   │   │       │       │   ├── vi.js
│   │   │       │       │   ├── x-pseudo.js
│   │   │       │       │   ├── yo.js
│   │   │       │       │   ├── zh-cn.js
│   │   │       │       │   ├── zh-hk.js
│   │   │       │       │   └── zh-tw.js
│   │   │       │       ├── moment/
│   │   │       │       │   ├── add_subtract.js
│   │   │       │       │   ├── calendar.js
│   │   │       │       │   ├── create.js
│   │   │       │       │   ├── creation-data.js
│   │   │       │       │   ├── days_in_month.js
│   │   │       │       │   ├── days_in_year.js
│   │   │       │       │   ├── deprecate.js
│   │   │       │       │   ├── diff.js
│   │   │       │       │   ├── duration.js
│   │   │       │       │   ├── duration_from_moments.js
│   │   │       │       │   ├── duration_invalid.js
│   │   │       │       │   ├── format.js
│   │   │       │       │   ├── from_to.js
│   │   │       │       │   ├── getters_setters.js
│   │   │       │       │   ├── instanceof.js
│   │   │       │       │   ├── invalid.js
│   │   │       │       │   ├── is_after.js
│   │   │       │       │   ├── is_array.js
│   │   │       │       │   ├── is_before.js
│   │   │       │       │   ├── is_between.js
│   │   │       │       │   ├── is_date.js
│   │   │       │       │   ├── is_moment.js
│   │   │       │       │   ├── is_number.js
│   │   │       │       │   ├── is_same.js
│   │   │       │       │   ├── is_same_or_after.js
│   │   │       │       │   ├── is_same_or_before.js
│   │   │       │       │   ├── is_valid.js
│   │   │       │       │   ├── leapyear.js
│   │   │       │       │   ├── listers.js
│   │   │       │       │   ├── locale.js
│   │   │       │       │   ├── locale_inheritance.js
│   │   │       │       │   ├── locale_update.js
│   │   │       │       │   ├── min_max.js
│   │   │       │       │   ├── mutable.js
│   │   │       │       │   ├── normalize_units.js
│   │   │       │       │   ├── now.js
│   │   │       │       │   ├── parsing_flags.js
│   │   │       │       │   ├── preparse_postformat.js
│   │   │       │       │   ├── quarter.js
│   │   │       │       │   ├── relative_time.js
│   │   │       │       │   ├── start_end_of.js
│   │   │       │       │   ├── string_prototype.js
│   │   │       │       │   ├── to_type.js
│   │   │       │       │   ├── utc.js
│   │   │       │       │   ├── utc_offset.js
│   │   │       │       │   ├── week_year.js
│   │   │       │       │   ├── weekday.js
│   │   │       │       │   ├── weeks.js
│   │   │       │       │   ├── weeks_in_year.js
│   │   │       │       │   ├── zone_switching.js
│   │   │       │       │   └── zones.js
│   │   │       │       └── qunit.js
│   │   │       ├── tasks/
│   │   │       │   ├── bump_version.js
│   │   │       │   ├── check_sauce_creds.js
│   │   │       │   ├── component.js
│   │   │       │   ├── nuget.js
│   │   │       │   ├── qtest.js
│   │   │       │   ├── transpile.js
│   │   │       │   └── update_index.js
│   │   │       ├── templates/
│   │   │       │   ├── default.js
│   │   │       │   ├── locale-header.js
│   │   │       │   └── test-header.js
│   │   │       └── typing-tests/
│   │   │           ├── moment-tests.ts
│   │   │           └── tsconfig.json
│   │   ├── robots.txt
│   │   ├── theme/
│   │   │   └── default/
│   │   │       ├── css/
│   │   │       │   ├── animate.css
│   │   │       │   ├── footer-1.css
│   │   │       │   ├── header-1.css
│   │   │       │   ├── magnific-popup.css
│   │   │       │   └── style.css
│   │   │       ├── fonts/
│   │   │       │   └── FontAwesome.otf
│   │   │       ├── js/
│   │   │       │   ├── cubeportfolio/
│   │   │       │   │   ├── blog-grid-3col.js
│   │   │       │   │   ├── portfolio-masonry-4col.js
│   │   │       │   │   ├── team.js
│   │   │       │   │   └── testimonials.js
│   │   │       │   ├── custom.js
│   │   │       │   ├── google-map.js
│   │   │       │   ├── index.js
│   │   │       │   └── navigation.js
│   │   │       └── plugins/
│   │   │           ├── FlexSlider/
│   │   │           │   ├── jquery.flexslider-min.js
│   │   │           │   └── jquery.flexslider.css
│   │   │           └── owl-carousel/
│   │   │               ├── owl.carousel.css
│   │   │               └── owl.theme.css
│   │   └── uploads/
│   │       └── index.html
│   ├── tasks/
│   │   ├── README.md
│   │   ├── __init__.py
│   │   ├── cron_send_sms.py
│   │   ├── run_apply_put_interest_on_principal.py
│   │   ├── run_lock_active_not_put.py
│   │   ├── run_lock_order_not_pay.py
│   │   ├── run_lock_pay_not_rec.py
│   │   ├── run_lock_reg_not_active.py
│   │   ├── run_send_sms.py
│   │   └── run_send_sms_priority.py
│   ├── templates/
│   │   ├── 404.html
│   │   ├── 500.html
│   │   ├── _footer.html
│   │   ├── _top.html
│   │   ├── about.html
│   │   ├── about_bak.html
│   │   ├── active/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── apply/
│   │   │   ├── get_add.html
│   │   │   ├── get_edit.html
│   │   │   ├── get_list.html
│   │   │   ├── put_add.html
│   │   │   ├── put_edit.html
│   │   │   └── put_list.html
│   │   ├── auth/
│   │   │   ├── _forget_password.html
│   │   │   ├── _login_three_part.html
│   │   │   ├── email.html
│   │   │   ├── index.html
│   │   │   └── phone.html
│   │   ├── bit_coin/
│   │   │   └── list.html
│   │   ├── blog/
│   │   │   ├── add.html
│   │   │   ├── edit.html
│   │   │   ├── hot.html
│   │   │   ├── index.html
│   │   │   ├── list_edit.html
│   │   │   └── new.html
│   │   ├── complaint/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── contact.html
│   │   ├── credit/
│   │   │   └── index.html
│   │   ├── email.html
│   │   ├── index.html
│   │   ├── layout.html
│   │   ├── logout.html
│   │   ├── macros.html
│   │   ├── message/
│   │   │   ├── add.html
│   │   │   └── list.html
│   │   ├── order/
│   │   │   ├── get_info.html
│   │   │   ├── get_list.html
│   │   │   ├── pay.html
│   │   │   ├── put_info.html
│   │   │   └── put_list.html
│   │   ├── reg/
│   │   │   ├── _agreement.html
│   │   │   ├── _agreement_en.html
│   │   │   ├── email.html
│   │   │   ├── index.html
│   │   │   └── phone.html
│   │   ├── scheduling/
│   │   │   └── list.html
│   │   ├── score/
│   │   │   ├── charity_list.html
│   │   │   ├── digital_list.html
│   │   │   └── expense_list.html
│   │   ├── setting.html
│   │   ├── site/
│   │   │   └── index.html
│   │   ├── theme/
│   │   │   └── default/
│   │   │       ├── _footer.html
│   │   │       ├── _header.html
│   │   │       ├── index.html
│   │   │       └── layout.html
│   │   ├── uploads.html
│   │   ├── user/
│   │   │   ├── _account_info.html
│   │   │   ├── _invite_link.html
│   │   │   ├── _status.html
│   │   │   ├── _team_tree.html
│   │   │   ├── account.html
│   │   │   ├── auth.html
│   │   │   ├── bank.html
│   │   │   ├── notification.html
│   │   │   ├── profile.html
│   │   │   └── team.html
│   │   └── wallet/
│   │       └── list.html
│   ├── tools/
│   │   ├── __init__.py
│   │   ├── config_manage.py
│   │   ├── db.py
│   │   ├── db_test_mysql.py
│   │   ├── db_test_sqlite.py
│   │   ├── decorators.py
│   │   ├── exception.py
│   │   ├── file.py
│   │   ├── send_sms.py
│   │   ├── session_manage.py
│   │   ├── stat.py
│   │   ├── system.py
│   │   └── url.py
│   └── views/
│       ├── __init__.py
│       ├── active.py
│       ├── apply.py
│       ├── auth.py
│       ├── bit_coin.py
│       ├── blog.py
│       ├── captcha.py
│       ├── complaint.py
│       ├── credit.py
│       ├── file.py
│       ├── get.py
│       ├── invite.py
│       ├── message.py
│       ├── order.py
│       ├── pay.py
│       ├── penetration.py
│       ├── put.py
│       ├── reg.py
│       ├── scheduling.py
│       ├── score.py
│       ├── site.py
│       ├── test.py
│       ├── user.py
│       ├── wallet.py
│       └── wechat.py
├── backup/
│   ├── batch_import.sh
│   ├── data_test.sql
│   ├── db_dump.sh
│   ├── db_init.sh
│   ├── db_restore.sh
│   ├── model_create.sh
│   ├── run.sh
│   ├── schema.dump.sql
│   ├── schema.sql
│   ├── test.py
│   └── views_bak.py
├── changelog/
│   └── 2017-07-03/
│       └── mysql.sql
├── config/
│   ├── __init__.py
│   ├── develop/
│   │   ├── __init__.py
│   │   └── settings/
│   │       ├── __init__.py
│   │       ├── apply.py
│   │       ├── interest.py
│   │       ├── order.py
│   │       ├── sms.py
│   │       └── user.py
│   └── product/
│       ├── __init__.py
│       └── settings/
│           ├── __init__.py
│           ├── apply.py
│           ├── interest.py
│           ├── order.py
│           ├── sms.py
│           └── user.py
├── db/
│   ├── data/
│   │   └── mysql.sql
│   ├── mysql.py
│   ├── postgresql.py
│   ├── schema/
│   │   ├── mysql.sql
│   │   ├── postgresql.sql
│   │   └── sqlite.sql
│   └── sqlite.py
├── doc/
│   ├── BluePrint.md
│   ├── Celery.md
│   ├── Docker.md
│   ├── DockerHub.md
│   ├── ElasticSearch.md
│   ├── Flask-SQLAlchemy.md
│   ├── Flask-SSE.md
│   ├── Flask-WTF.md
│   ├── Flower.md
│   ├── Git.md
│   ├── Gunicorn.md
│   ├── LightBox.md
│   ├── MariaDB.md
│   ├── MongoDB.md
│   ├── OAuth.md
│   ├── OpenPay.md
│   ├── Redis.md
│   ├── Siege.md
│   ├── SqlAlchemy.md
│   ├── UbuntuServer.md
│   ├── WeiXin.md
│   ├── bootstrap-select.md
│   ├── cache.md
│   ├── fabric.md
│   ├── https.md
│   ├── jQuery-File-Upload.md
│   └── mirrors.md
├── docker/
│   ├── Dockerfile
│   ├── README.md
│   ├── docker_build.sh
│   ├── docker_login.sh
│   ├── docker_run.sh
│   ├── mariadb/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── cli.sh
│   │   ├── db_dump.sh
│   │   ├── db_init.sh
│   │   ├── docker_run_develop.sh
│   │   ├── docker_run_product.sh
│   │   └── env.sh
│   ├── mongodb/
│   │   ├── README.md
│   │   ├── cli.sh
│   │   ├── docker_run.sh
│   │   └── env.sh
│   ├── nginx/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── conf/
│   │   │   ├── conf.d/
│   │   │   │   ├── default.conf
│   │   │   │   ├── project.conf
│   │   │   │   └── project_ssl.conf
│   │   │   ├── nginx.conf
│   │   │   └── ssl/
│   │   │       ├── ca.key
│   │   │       ├── server.crt
│   │   │       ├── server.csr
│   │   │       ├── server.key
│   │   │       └── v3.ext
│   │   ├── create_ca.sh
│   │   ├── create_crt.sh
│   │   ├── create_csr.sh
│   │   ├── create_key.sh
│   │   └── docker_run.sh
│   ├── rabbitmq/
│   │   ├── README.md
│   │   ├── docker_run.sh
│   │   └── docker_run_management.sh
│   ├── redis/
│   │   ├── Dockerfile
│   │   ├── README.md
│   │   ├── cli.sh
│   │   ├── docker_run_aof.sh
│   │   └── docker_run_rdb.sh
│   └── requirements.txt
├── docker-compose.yml
├── env_develop.sh
├── env_product.sh
├── etc/
│   ├── app_backend.ini
│   ├── app_frontend.ini
│   ├── app_wechat.ini
│   ├── cron_send_sms.ini
│   ├── nginx.conf
│   ├── nginx_ssl.conf
│   ├── supervisord.conf
│   ├── task_lock.ini
│   └── task_sms.ini
├── gen.py
├── project/
│   ├── doc.md
│   ├── run_develop.md
│   └── run_product.md
├── requirements.txt
├── run_backend.py
├── run_frontend.py
├── service_start.md
└── ssl/
    ├── server.crt
    ├── server.csr
    ├── server.key
    └── server.key.org
Download .txt
Showing preview only (1,004K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (12586 symbols across 925 files)

FILE: app_api/__init__.py
  function func (line 12) | def func():
  class Main (line 16) | class Main(object):
    method __init__ (line 17) | def __init__(self):

FILE: app_backend/api/__init__.py
  function func (line 12) | def func():
  class Main (line 16) | class Main(object):
    method __init__ (line 17) | def __init__(self):

FILE: app_backend/api/active.py
  function get_active_row_by_id (line 21) | def get_active_row_by_id(active_id):
  function get_active_row (line 30) | def get_active_row(*args, **kwargs):
  function add_active (line 40) | def add_active(active_data):
  function edit_active (line 49) | def edit_active(active_id, active_data):
  function delete_active (line 59) | def delete_active(active_id):
  function get_active_rows (line 68) | def get_active_rows(page=1, per_page=10, *args, **kwargs):
  function give_active (line 89) | def give_active(user_id_active, amount=1):

FILE: app_backend/api/active_item.py
  function get_active_item_row_by_id (line 16) | def get_active_item_row_by_id(active_item_id):
  function get_active_item_row (line 25) | def get_active_item_row(*args, **kwargs):
  function add_active_item (line 35) | def add_active_item(active_item_data):
  function edit_active_item (line 44) | def edit_active_item(active_item_id, active_item_data):
  function delete_active_item (line 54) | def delete_active_item(active_item_id):
  function get_active_item_rows (line 63) | def get_active_item_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/api/admin.py
  function get_admin_row_by_id (line 16) | def get_admin_row_by_id(user_auth_id):
  function get_admin_row (line 25) | def get_admin_row(*args, **kwargs):
  function add_admin (line 35) | def add_admin(user_auth_data):
  function edit_admin (line 44) | def edit_admin(user_auth_id, user_auth_data):
  function delete_admin (line 54) | def delete_admin(user_auth_id):
  function get_admin_rows (line 63) | def get_admin_rows(page=1, per_page=10, *args, **kwargs):
  function update_admin_rows (line 84) | def update_admin_rows(data, *args, **kwargs):

FILE: app_backend/api/admin_role.py
  function get_admin_role_row_by_id (line 16) | def get_admin_role_row_by_id(admin_role_id):
  function get_admin_role_row (line 25) | def get_admin_role_row(*args, **kwargs):
  function add_admin_role (line 35) | def add_admin_role(admin_role_data):
  function edit_admin_role (line 44) | def edit_admin_role(admin_role_id, admin_role_data):
  function delete_admin_role (line 54) | def delete_admin_role(admin_role_id):
  function get_admin_role_rows (line 63) | def get_admin_role_rows(page=1, per_page=10, *args, **kwargs):
  function get_admin_role_lists (line 84) | def get_admin_role_lists(*args, **kwargs):

FILE: app_backend/api/apply_get.py
  function get_apply_get_row_by_id (line 26) | def get_apply_get_row_by_id(apply_get_id):
  function get_apply_get_row (line 35) | def get_apply_get_row(*args, **kwargs):
  function add_apply_get (line 45) | def add_apply_get(apply_get_data):
  function edit_apply_get (line 54) | def edit_apply_get(apply_get_id, apply_get_data):
  function delete_apply_get (line 64) | def delete_apply_get(apply_get_id):
  function get_apply_get_rows_by_ids (line 73) | def get_apply_get_rows_by_ids(ids):
  function get_apply_get_lists (line 82) | def get_apply_get_lists(*args, **kwargs):
  function get_apply_get_rows (line 92) | def get_apply_get_rows(page=1, per_page=10, *args, **kwargs):
  function apply_get_match (line 113) | def apply_get_match(apply_get_id, apply_put_ids, accept_split=0):
  function apply_get_stats (line 196) | def apply_get_stats(time_based='hour'):

FILE: app_backend/api/apply_put.py
  function get_apply_put_row_by_id (line 26) | def get_apply_put_row_by_id(apply_put_id):
  function get_apply_put_row (line 35) | def get_apply_put_row(*args, **kwargs):
  function add_apply_put (line 45) | def add_apply_put(apply_put_data):
  function edit_apply_put (line 54) | def edit_apply_put(apply_put_id, apply_put_data):
  function delete_apply_put (line 64) | def delete_apply_put(apply_put_id):
  function get_apply_put_rows_by_ids (line 73) | def get_apply_put_rows_by_ids(ids):
  function get_apply_put_lists (line 82) | def get_apply_put_lists(*args, **kwargs):
  function get_apply_put_rows (line 92) | def get_apply_put_rows(page=1, per_page=10, *args, **kwargs):
  function apply_put_match (line 113) | def apply_put_match(apply_put_id, apply_get_ids, accept_split=0):
  function apply_put_stats (line 197) | def apply_put_stats(time_based='hour'):

FILE: app_backend/api/author.py
  function get_author_row_by_id (line 16) | def get_author_row_by_id(author_id):
  function get_author_row (line 25) | def get_author_row(*args, **kwargs):
  function add_author (line 35) | def add_author(author_data):
  function edit_author (line 44) | def edit_author(author_id, author_data):
  function delete_author (line 54) | def delete_author(author_id):
  function get_author_rows (line 63) | def get_author_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/api/blog.py
  function get_blog_row_by_id (line 18) | def get_blog_row_by_id(blog_id):
  function get_blog_row (line 27) | def get_blog_row(*args, **kwargs):
  function add_blog (line 37) | def add_blog(blog_data):
  function edit_blog (line 46) | def edit_blog(blog_id, blog_data):
  function delete_blog (line 56) | def delete_blog(blog_id):
  function get_blog_rows (line 65) | def get_blog_rows(page=1, per_page=10, *args, **kwargs):
  function get_blog_counter (line 86) | def get_blog_counter(blog_id):
  function set_blog_counter (line 96) | def set_blog_counter(blog_id, stat_type, num):
  function get_blog_list_counter (line 108) | def get_blog_list_counter(blog_id_list):
  function get_blog_container_status (line 118) | def get_blog_container_status(blog_id, uid):
  function get_blog_list_container_status (line 129) | def get_blog_list_container_status(blog_id_list, uid):
  function add_blog_stat_item (line 140) | def add_blog_stat_item(stat_type, blog_id, uid):

FILE: app_backend/api/complaint.py
  function get_complaint_row_by_id (line 16) | def get_complaint_row_by_id(complaint_id):
  function get_complaint_row (line 25) | def get_complaint_row(*args, **kwargs):
  function add_complaint (line 35) | def add_complaint(complaint_data):
  function edit_complaint (line 44) | def edit_complaint(complaint_id, complaint_data):
  function delete_complaint (line 54) | def delete_complaint(complaint_id):
  function get_complaint_rows (line 63) | def get_complaint_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/api/message.py
  function get_message_row_by_id (line 16) | def get_message_row_by_id(message_id):
  function get_message_row (line 25) | def get_message_row(*args, **kwargs):
  function add_message (line 35) | def add_message(message_data):
  function edit_message (line 44) | def edit_message(message_id, message_data):
  function delete_message (line 54) | def delete_message(message_id):
  function get_message_rows (line 63) | def get_message_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/api/order.py
  function get_order_row_by_id (line 24) | def get_order_row_by_id(order_id):
  function get_order_row (line 33) | def get_order_row(*args, **kwargs):
  function add_order (line 43) | def add_order(order_data):
  function edit_order (line 52) | def edit_order(order_id, order_data):
  function delete_order (line 62) | def delete_order(order_id):
  function get_order_lists (line 71) | def get_order_lists(*args, **kwargs):
  function get_order_rows (line 81) | def get_order_rows(page=1, per_page=10, *args, **kwargs):
  function get_put_match_order_rows (line 102) | def get_put_match_order_rows(apply_put_id):
  function get_get_match_order_rows (line 119) | def get_get_match_order_rows(apply_get_id):
  function flow (line 136) | def flow(order_id, next_uid):
  function order_stats (line 150) | def order_stats(time_based='hour'):

FILE: app_backend/api/scheduling.py
  function get_scheduling_row_by_id (line 21) | def get_scheduling_row_by_id(scheduling_id):
  function get_scheduling_row (line 30) | def get_scheduling_row(*args, **kwargs):
  function add_scheduling (line 40) | def add_scheduling(scheduling_data):
  function edit_scheduling (line 49) | def edit_scheduling(scheduling_id, scheduling_data):
  function delete_scheduling (line 59) | def delete_scheduling(scheduling_id):
  function get_scheduling_rows (line 68) | def get_scheduling_rows(page=1, per_page=10, *args, **kwargs):
  function give_scheduling (line 89) | def give_scheduling(user_id_scheduling, amount=1):

FILE: app_backend/api/scheduling_item.py
  function get_scheduling_item_item_row_by_id (line 16) | def get_scheduling_item_item_row_by_id(scheduling_item_item_id):
  function get_scheduling_item_item_row (line 25) | def get_scheduling_item_item_row(*args, **kwargs):
  function add_scheduling_item (line 35) | def add_scheduling_item(scheduling_item_item_data):
  function edit_scheduling_item (line 44) | def edit_scheduling_item(scheduling_item_item_id, scheduling_item_item_d...
  function delete_scheduling_item (line 54) | def delete_scheduling_item(scheduling_item_item_id):
  function get_scheduling_item_item_rows (line 63) | def get_scheduling_item_item_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/api/score.py
  function get_score_row_by_id (line 16) | def get_score_row_by_id(score_id):
  function get_score_row (line 25) | def get_score_row(*args, **kwargs):
  function add_score (line 35) | def add_score(score_data):
  function edit_score (line 44) | def edit_score(score_id, score_data):
  function delete_score (line 54) | def delete_score(score_id):
  function get_score_rows (line 63) | def get_score_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/api/user.py
  function get_user_row_by_id (line 31) | def get_user_row_by_id(user_id):
  function get_user_row (line 40) | def get_user_row(*args, **kwargs):
  function add_user (line 50) | def add_user(user_data):
  function edit_user (line 59) | def edit_user(user_id, user_data):
  function delete_user (line 69) | def delete_user(user_id):
  function get_user_rows (line 78) | def get_user_rows(page=1, per_page=10, *args, **kwargs):
  function get_user_detail_rows (line 99) | def get_user_detail_rows(page=1, per_page=10, *args, **kwargs):
  function lock (line 134) | def lock(user_id):
  function unlock (line 150) | def unlock(user_id):
  function user_reg_stats (line 165) | def user_reg_stats(time_based='hour'):
  function user_active_stats (line 218) | def user_active_stats(time_based='hour'):

FILE: app_backend/api/user_auth.py
  function get_user_auth_row_by_id (line 16) | def get_user_auth_row_by_id(user_auth_id):
  function get_user_auth_row (line 25) | def get_user_auth_row(*args, **kwargs):
  function add_user_auth (line 35) | def add_user_auth(user_auth_data):
  function edit_user_auth (line 44) | def edit_user_auth(user_auth_id, user_auth_data):
  function delete_user_auth (line 54) | def delete_user_auth(user_auth_id):
  function get_user_auth_rows (line 63) | def get_user_auth_rows(page=1, per_page=10, *args, **kwargs):
  function update_user_auth_rows (line 84) | def update_user_auth_rows(data, *args, **kwargs):

FILE: app_backend/api/user_bank.py
  function get_user_bank_row_by_id (line 16) | def get_user_bank_row_by_id(user_bank_id):
  function get_user_bank_row (line 25) | def get_user_bank_row(*args, **kwargs):
  function add_user_bank (line 35) | def add_user_bank(user_bank_data):
  function edit_user_bank (line 44) | def edit_user_bank(user_bank_id, user_bank_data):
  function delete_user_bank (line 54) | def delete_user_bank(user_bank_id):
  function get_user_bank_rows (line 63) | def get_user_bank_rows(page=1, per_page=10, *args, **kwargs):
  function update_user_bank_rows (line 84) | def update_user_bank_rows(data, *args, **kwargs):

FILE: app_backend/api/user_config.py
  function get_user_config_row_by_id (line 16) | def get_user_config_row_by_id(user_config_id):
  function get_user_config_row (line 25) | def get_user_config_row(*args, **kwargs):
  function add_user_config (line 35) | def add_user_config(user_config_data):
  function edit_user_config (line 44) | def edit_user_config(user_config_id, user_config_data):
  function merge_user_config (line 54) | def merge_user_config(user_config_data):
  function delete_user_config (line 63) | def delete_user_config(user_config_id):
  function get_user_config_rows (line 72) | def get_user_config_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/api/user_profile.py
  function get_user_profile_row_by_id (line 17) | def get_user_profile_row_by_id(user_id):
  function get_user_profile_row (line 26) | def get_user_profile_row(*args, **kwargs):
  function add_user_profile (line 36) | def add_user_profile(user_data):
  function edit_user_profile (line 45) | def edit_user_profile(user_id, user_data):
  function delete_user_profile (line 55) | def delete_user_profile(user_id):
  function get_user_profile_rows (line 64) | def get_user_profile_rows(page=1, per_page=10, *args, **kwargs):
  function get_child_users (line 85) | def get_child_users(user_id):
  function get_team_tree_recursion (line 98) | def get_team_tree_recursion(user_id, team=None, node=None):

FILE: app_backend/api/wallet.py
  function get_wallet_row_by_id (line 16) | def get_wallet_row_by_id(wallet_id):
  function get_wallet_row (line 25) | def get_wallet_row(*args, **kwargs):
  function add_wallet (line 35) | def add_wallet(wallet_data):
  function edit_wallet (line 44) | def edit_wallet(wallet_id, wallet_data):
  function delete_wallet (line 54) | def delete_wallet(wallet_id):
  function get_wallet_rows (line 63) | def get_wallet_rows(page=1, per_page=10, *args, **kwargs):

FILE: app_backend/filters.py
  function reverse_filter (line 36) | def reverse_filter(s):
  function url_t_filter (line 41) | def url_t_filter(s):
  function time_diff_pretty_filter (line 46) | def time_diff_pretty_filter(delta_s):
  function filter_nickname (line 82) | def filter_nickname(user_id):
  function filter_user_active (line 93) | def filter_user_active(user_id):
  function filter_role_admin (line 106) | def filter_role_admin(role_admin_id):
  function filter_type_apply (line 116) | def filter_type_apply(type_apply_id):
  function filter_type_order (line 126) | def filter_type_order(type_order_id):
  function filter_type_auth (line 136) | def filter_type_auth(type_auth_id):
  function filter_type_active (line 146) | def filter_type_active(type_active_id):
  function filter_type_scheduling (line 156) | def filter_type_scheduling(type_scheduling_id):
  function filter_status_apply (line 166) | def filter_status_apply(status_apply_id):
  function filter_status_audit (line 176) | def filter_status_audit(status_audit_id):
  function filter_status_order (line 186) | def filter_status_order(status_order_id):
  function filter_status_delete (line 196) | def filter_status_delete(status_delete_id):
  function filter_status_pay (line 206) | def filter_status_pay(status_pay_id):
  function filter_status_rec (line 216) | def filter_status_rec(status_rec_id):
  function filter_type_level (line 226) | def filter_type_level(type_level_id):
  function filter_status_active (line 236) | def filter_status_active(status_active_id):
  function filter_status_lock (line 246) | def filter_status_lock(status_lock_id):
  function filter_scheduling_amount (line 256) | def filter_scheduling_amount(user_id):

FILE: app_backend/forms/__init__.py
  function select_multi_checkbox (line 18) | def select_multi_checkbox(field, ul_class='', **kwargs):
  class SelectBSWidget (line 40) | class SelectBSWidget(object):
    method __call__ (line 44) | def __call__(self, field, **kwargs):
  class SelectBS (line 61) | class SelectBS(SelectField):
    method pre_validate (line 67) | def pre_validate(self, form):
  class CheckBoxBSWidget (line 79) | class CheckBoxBSWidget(object):
    method __call__ (line 85) | def __call__(self, field, **kwargs):
  class CheckBoxBS (line 102) | class CheckBoxBS(BooleanField):
  class SelectAreaCodeWidget (line 109) | class SelectAreaCodeWidget(object):
    method __call__ (line 113) | def __call__(self, field, **kwargs):
  class SelectAreaCode (line 134) | class SelectAreaCode(SelectField):
    method pre_validate (line 140) | def pre_validate(self, form):

FILE: app_backend/forms/active.py
  class UserRightValidate (line 24) | class UserRightValidate(object):
    method __init__ (line 28) | def __init__(self, message=None):
    method __call__ (line 31) | def __call__(self, form, field):
  class ActiveAddForm (line 45) | class ActiveAddForm(FlaskForm):

FILE: app_backend/forms/admin.py
  function reg_username_repeat (line 21) | def reg_username_repeat(form, field):
  function password_edit_validator (line 33) | def password_edit_validator(form, field):
  class AdminProfileForm (line 45) | class AdminProfileForm(FlaskForm):
  class AdminAddForm (line 64) | class AdminAddForm(FlaskForm):
  class AdminEditForm (line 80) | class AdminEditForm(FlaskForm):
  class AdminRoleForm (line 99) | class AdminRoleForm(FlaskForm):
  class EditPassword (line 111) | class EditPassword(FlaskForm):

FILE: app_backend/forms/apply_get.py
  class ApplyGetSearchForm (line 23) | class ApplyGetSearchForm(FlaskForm):

FILE: app_backend/forms/apply_put.py
  class ApplyPutSearchForm (line 23) | class ApplyPutSearchForm(FlaskForm):

FILE: app_backend/forms/blog.py
  class BlogAddForm (line 17) | class BlogAddForm(FlaskForm):
  class BlogEditForm (line 26) | class BlogEditForm(FlaskForm):

FILE: app_backend/forms/complaint.py
  class ComplaintReplyForm (line 18) | class ComplaintReplyForm(FlaskForm):

FILE: app_backend/forms/login.py
  class SmsCodeValidate (line 21) | class SmsCodeValidate(object):
    method __init__ (line 25) | def __init__(self, message=None):
    method __call__ (line 30) | def __call__(self, form, field):
  class LoginForm (line 42) | class LoginForm(FlaskForm):

FILE: app_backend/forms/order.py
  class OrderSearchForm (line 22) | class OrderSearchForm(FlaskForm):

FILE: app_backend/forms/pay.py
  function func (line 12) | def func():
  class Main (line 16) | class Main(object):
    method __init__ (line 17) | def __init__(self):

FILE: app_backend/forms/scheduling.py
  class UserRightValidate (line 24) | class UserRightValidate(object):
    method __init__ (line 28) | def __init__(self, message=None):
    method __call__ (line 31) | def __call__(self, form, field):
  class SchedulingAddForm (line 45) | class SchedulingAddForm(FlaskForm):

FILE: app_backend/forms/score.py
  function func (line 12) | def func():
  class Main (line 16) | class Main(object):
    method __init__ (line 17) | def __init__(self):

FILE: app_backend/forms/settings.py
  class SwitchForm (line 19) | class SwitchForm(FlaskForm):
  class UserForm (line 49) | class UserForm(FlaskForm):
  class OrderForm (line 75) | class OrderForm(FlaskForm):
  class ApplyPutForm (line 119) | class ApplyPutForm(FlaskForm):
  class ApplyGetForm (line 202) | class ApplyGetForm(FlaskForm):
  class InterestForm (line 280) | class InterestForm(FlaskForm):

FILE: app_backend/forms/user.py
  function reg_email_repeat (line 32) | def reg_email_repeat(form, field):
  class PhoneFormatValidate (line 45) | class PhoneFormatValidate(object):
    method __init__ (line 49) | def __init__(self, message=None):
    method __call__ (line 52) | def __call__(self, form, field):
  class PhoneRepeatValidate (line 63) | class PhoneRepeatValidate(object):
    method __init__ (line 68) | def __init__(self, message=None):
    method __call__ (line 71) | def __call__(self, form, field):
  class IdCardRepeatValidate (line 83) | class IdCardRepeatValidate(object):
    method __init__ (line 88) | def __init__(self, message=None):
    method __call__ (line 91) | def __call__(self, form, field):
  class RegAccountRepeatValidate (line 103) | class RegAccountRepeatValidate(object):
    method __init__ (line 107) | def __init__(self, message=None):
    method __call__ (line 110) | def __call__(self, form, field):
  class PasswordFormatValidate (line 121) | class PasswordFormatValidate(object):
    method __init__ (line 125) | def __init__(self, message=None):
    method __call__ (line 128) | def __call__(self, form, field):
  class UserProfileForm (line 134) | class UserProfileForm(FlaskForm):
  class UserAuthForm (line 167) | class UserAuthForm(FlaskForm):
  class UserBankForm (line 187) | class UserBankForm(FlaskForm):
  class EditPassword (line 205) | class EditPassword(FlaskForm):
  class UserSearchForm (line 220) | class UserSearchForm(FlaskForm):
  class UserRightValidate (line 232) | class UserRightValidate(object):
    method __init__ (line 236) | def __init__(self, message=None):
    method __call__ (line 239) | def __call__(self, form, field):
  class UserConfigForm (line 249) | class UserConfigForm(FlaskForm):

FILE: app_backend/forms/wallet.py
  function func (line 12) | def func():
  class Main (line 16) | class Main(object):
    method __init__ (line 17) | def __init__(self):

FILE: app_backend/lib/__init__.py
  function func (line 12) | def func():
  class Main (line 16) | class Main(object):
    method __init__ (line 17) | def __init__(self):

FILE: app_backend/lib/captcha.py
  class Captcha (line 17) | class Captcha(object):
    method __init__ (line 27) | def __init__(self,
    method _get_chars (line 68) | def _get_chars(self):
    method _create_lines (line 74) | def _create_lines(self):
    method _create_points (line 87) | def _create_points(self):
    method _create_code_str (line 99) | def _create_code_str(self):
    method get (line 113) | def get(self):

FILE: app_backend/lib/cart.py
  class Cart (line 18) | class Cart(object):
    method __init__ (line 25) | def __init__(self, uid, prefix='cart'):
    method add_item (line 29) | def add_item(self, pid, num=1):
    method del_item (line 45) | def del_item(self, pid):
    method edit_item (line 57) | def edit_item(self, pid, num):
    method increase (line 71) | def increase(self, pid, num=1):
    method decrease (line 87) | def decrease(self, pid, num=1):
    method cart_list (line 104) | def cart_list(self):
    method clean (line 113) | def clean(self):
  function test (line 123) | def test():

FILE: app_backend/lib/container.py
  class Container (line 20) | class Container(object):
    method __init__ (line 45) | def __init__(self, entity_name, prefix='container'):
    method add_item (line 51) | def add_item(self, stat_type, key_id, item_id):
    method del_item (line 62) | def del_item(self, stat_type, key_id, item_id):
    method count_item (line 73) | def count_item(self, stat_type, key_id):
    method get_items (line 83) | def get_items(self, stat_type, key_id, page=1, pagesize=10):
    method get_all_items (line 101) | def get_all_items(self, stat_type, key_id):
    method get_item_container_status (line 113) | def get_item_container_status(self, key_id, item_id):
    method get_item_list_container_status (line 128) | def get_item_list_container_status(self, key_ids, item_id):
  function test_blog_favor (line 143) | def test_blog_favor():

FILE: app_backend/lib/counter.py
  class Counter (line 20) | class Counter(object):
    method __init__ (line 62) | def __init__(self, entity_name, prefix='counter'):
    method increase (line 68) | def increase(self, item_id, stat_type, num=1):
    method decrease (line 87) | def decrease(self, item_id, stat_type, num=1):
    method del_item (line 105) | def del_item(self, item_id):
    method counter_blog_item (line 117) | def counter_blog_item(self, blog_id):
    method counter_user_list_all (line 131) | def counter_user_list_all(self):
    method counter_user_list (line 145) | def counter_user_list(self, uid_list):
    method counter_topic_list (line 162) | def counter_topic_list(self, topic_list):
    method counter_blog_list (line 179) | def counter_blog_list(self, blog_list):
    method set_blog_counter (line 196) | def set_blog_counter(self, blog_id, stat_type, num=1):
  function test_user (line 208) | def test_user():
  function test_topic (line 221) | def test_topic():

FILE: app_backend/lib/mongo.py
  class Mongodb (line 21) | class Mongodb(object):
    method __init__ (line 25) | def __init__(self, db_config, db_name=None):
    method __default (line 40) | def __default(obj):
    method close_conn (line 54) | def close_conn(self):
    method find_one (line 62) | def find_one(self, table_name, condition=None):
    method find_all (line 71) | def find_all(self, table_name, condition=None):
    method count (line 80) | def count(self, table_name, condition=None):
    method distinct (line 89) | def distinct(self, table_name, field_name):
    method insert (line 98) | def insert(self, table_name, data):
    method update (line 112) | def update(self, table_name, condition, update_data, update_type='set'):
    method remove (line 133) | def remove(self, table_name, condition=None):
    method output_row (line 148) | def output_row(self, table_name, condition=None, style=0):
    method output_rows (line 171) | def output_rows(self, table_name, condition=None, style=0):

FILE: app_backend/lib/qiniu_store.py
  class QiNiuClient (line 16) | class QiNiuClient(object):
    method __init__ (line 20) | def __init__(self, app=None):
    method save (line 34) | def save(self, data, filename=None):
    method delete (line 42) | def delete(self, filename):
    method url (line 50) | def url(self, filename):

FILE: app_backend/lib/rabbit_mq.py
  function get_conn (line 24) | def get_conn():
  class RabbitQueue (line 45) | class RabbitQueue(object):
    method __init__ (line 49) | def __init__(self, exchange, queue_name, exchange_type='direct', durab...
    method close_conn (line 60) | def close_conn(self):
    method declare (line 69) | def declare(self):
    method put (line 80) | def put(self, message):
    method get (line 96) | def get(self):
    method get_block (line 111) | def get_block(self):
    method consume (line 128) | def consume(self, callback):
  class RabbitPubSub (line 141) | class RabbitPubSub(object):
    method __init__ (line 145) | def __init__(self, exchange, exchange_type='fanout', durable=True, **a...
    method close_conn (line 155) | def close_conn(self):
    method pub (line 164) | def pub(self, message):
    method sub (line 180) | def sub(self):
  class RabbitDelayQueue (line 205) | class RabbitDelayQueue(object):
    method __init__ (line 210) | def __init__(self, exchange, queue_name, exchange_type='direct', durab...
    method close_conn (line 240) | def close_conn(self):
    method put (line 249) | def put(self, message):
    method get (line 265) | def get(self):
    method get_block (line 280) | def get_block(self):
    method consume (line 297) | def consume(self, callback):
  class RabbitPriorityQueue (line 310) | class RabbitPriorityQueue(RabbitQueue):
    method __init__ (line 315) | def __init__(self, exchange, queue_name, exchange_type='direct', durab...
    method declare (line 318) | def declare(self):
    method put (line 335) | def put(self, message, priority=0):
  function test_queue (line 355) | def test_queue():
  function test_pub_sub (line 383) | def test_pub_sub():
  function test_delay_queue (line 408) | def test_delay_queue():
  function test_priority_queue (line 436) | def test_priority_queue():

FILE: app_backend/lib/redis_session.py
  class RedisSession (line 21) | class RedisSession(CallbackDict, SessionMixin):
    method __init__ (line 23) | def __init__(self, initial=None, sid=None, new=False):
  class RedisSessionInterface (line 32) | class RedisSessionInterface(SessionInterface):
    method __init__ (line 37) | def __init__(self, redis=None, prefix='session:', **kwargs):
    method generate_sid (line 44) | def generate_sid():
    method get_redis_expiration_time (line 48) | def get_redis_expiration_time(app, session):
    method open_session (line 54) | def open_session(self, app, request):
    method save_session (line 65) | def save_session(self, app, session, response):

FILE: app_backend/lib/sendcloud.py
  class SendCloudClient (line 16) | class SendCloudClient(object):
    method __init__ (line 23) | def __init__(self, app=None):
    method userinfo_get (line 31) | def userinfo_get(self):
    method mail_send (line 42) | def mail_send(self, mail_from, mail_to, mail_subject, mail_html):
    method mail_sendtemplate (line 57) | def mail_sendtemplate(self, mail_from, xsmtpapi, mail_subject, templat...
    method label_list (line 79) | def label_list(self, query, start=0, limit=100):
    method addresslist_list (line 93) | def addresslist_list(self, address, start=0, limit=100):

FILE: app_backend/lib/session.py
  class Session (line 21) | class Session(object):
    method __init__ (line 33) | def __init__(self, entity_name, prefix='session'):
    method generate_sign_key (line 40) | def generate_sign_key(length=32):
    method sign (line 52) | def sign(self, session_id):
    method un_sign (line 61) | def un_sign(self, sign_session_id):
    method add_item (line 78) | def add_item(self, key_id, item):
    method get_item (line 88) | def get_item(self, key_id):
    method del_item (line 97) | def del_item(self, key_id):
  function test_session (line 107) | def test_session():

FILE: app_backend/lib/sms_chuanglan.py
  function get_user_balance (line 37) | def get_user_balance():
  function send_sms (line 49) | def send_sms(msg, phone):

FILE: app_backend/lib/sms_chuanglan_iso.py
  class SmsChuangLanIsoApi (line 20) | class SmsChuangLanIsoApi(object):
    method __init__ (line 54) | def __init__(self, account, password):
    method send_international (line 60) | def send_international(self, phone, content, is_report=0):
    method query_balance_international (line 80) | def query_balance_international(self):

FILE: app_backend/lib/token.py
  class Token (line 21) | class Token(object):
    method __init__ (line 35) | def __init__(self, entity_name, prefix='token'):
    method generate_sign_key (line 42) | def generate_sign_key():
    method create_token (line 54) | def create_token(self):
    method check_token (line 63) | def check_token(self, token_sign):
    method add_item (line 79) | def add_item(self, key_id, item):
    method get_item (line 89) | def get_item(self, key_id):
    method del_item (line 98) | def del_item(self, key_id):
  function test_token (line 108) | def test_token():

FILE: app_backend/login.py
  class LoginUser (line 16) | class LoginUser(Admin, UserMixin):

FILE: app_backend/models.py
  function to_dict (line 10) | def to_dict(self):
  class Active (line 20) | class Active(Base):
  class ActiveItem (line 29) | class ActiveItem(Base):
  class Admin (line 46) | class Admin(Base):
  class AdminRole (line 64) | class AdminRole(Base):
  class ApplyGet (line 75) | class ApplyGet(Base):
  class ApplyPut (line 93) | class ApplyPut(Base):
  class AreaCode (line 110) | class AreaCode(Base):
  class BitCoin (line 124) | class BitCoin(Base):
  class BitCoinItem (line 133) | class BitCoinItem(Base):
  class Bonus (line 150) | class Bonus(Base):
  class BonusItem (line 159) | class BonusItem(Base):
  class Complaint (line 176) | class Complaint(Base):
  class Credit (line 193) | class Credit(Base):
  class Message (line 207) | class Message(Base):
  class Order (line 220) | class Order(Base):
  class OrderBill (line 243) | class OrderBill(Base):
  class OrderFlow (line 257) | class OrderFlow(Base):
  class Scheduling (line 270) | class Scheduling(Base):
  class SchedulingItem (line 279) | class SchedulingItem(Base):
  class Score (line 296) | class Score(Base):
  class ScoreCharity (line 305) | class ScoreCharity(Base):
  class ScoreCharityItem (line 314) | class ScoreCharityItem(Base):
  class ScoreDigital (line 331) | class ScoreDigital(Base):
  class ScoreDigitalItem (line 340) | class ScoreDigitalItem(Base):
  class ScoreExpense (line 357) | class ScoreExpense(Base):
  class ScoreExpenseItem (line 366) | class ScoreExpenseItem(Base):
  class ScoreItem (line 383) | class ScoreItem(Base):
  class User (line 400) | class User(Base):
  class UserAuth (line 418) | class UserAuth(Base):
  class UserBank (line 434) | class UserBank(Base):
  class UserConfig (line 448) | class UserConfig(Base):
  class UserProfile (line 457) | class UserProfile(Base):
  class Wallet (line 480) | class Wallet(Base):
  class WalletItem (line 491) | class WalletItem(Base):

FILE: app_backend/static/js/bootstrap-select.js
  function normalizeToBase (line 229) | function normalizeToBase(text) {
  function Plugin (line 1820) | function Plugin(option) {

FILE: app_backend/static/js/bootstrap.js
  function transitionEnd (line 34) | function transitionEnd() {
  function removeElement (line 126) | function removeElement() {
  function Plugin (line 142) | function Plugin(option) {
  function Plugin (line 251) | function Plugin(option) {
  function Plugin (line 470) | function Plugin(option) {
  function getTargetFromTrigger (line 689) | function getTargetFromTrigger($trigger) {
  function Plugin (line 701) | function Plugin(option) {
  function getParent (line 768) | function getParent($this) {
  function clearMenus (line 781) | function clearMenus(e) {
  function Plugin (line 874) | function Plugin(option) {
  function Plugin (line 1200) | function Plugin(option, _relatedTarget) {
  function complete (line 1566) | function complete() {
  function Plugin (line 1736) | function Plugin(option) {
  function Plugin (line 1845) | function Plugin(option) {
  function ScrollSpy (line 1888) | function ScrollSpy(element, options) {
  function Plugin (line 2008) | function Plugin(option) {
  function next (line 2117) | function next() {
  function Plugin (line 2163) | function Plugin(option) {
  function Plugin (line 2320) | function Plugin(option) {

FILE: app_backend/static/js/custom.js
  function lazyContainer (line 6) | function lazyContainer(searchNode) {
  function reposition (line 82) | function reposition() {

FILE: app_backend/static/plugin/Chart.js-2.6.0/dist/Chart.bundle.js
  function s (line 10) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function getRgba (line 33) | function getRgba(string) {
  function getHsla (line 93) | function getHsla(string) {
  function getHwb (line 109) | function getHwb(string) {
  function getRgb (line 125) | function getRgb(string) {
  function getHsl (line 130) | function getHsl(string) {
  function getAlpha (line 135) | function getAlpha(string) {
  function hexString (line 149) | function hexString(rgb) {
  function rgbString (line 154) | function rgbString(rgba, alpha) {
  function rgbaString (line 161) | function rgbaString(rgba, alpha) {
  function percentString (line 169) | function percentString(rgba, alpha) {
  function percentaString (line 180) | function percentaString(rgba, alpha) {
  function hslString (line 187) | function hslString(hsla, alpha) {
  function hslaString (line 194) | function hslaString(hsla, alpha) {
  function hwbString (line 204) | function hwbString(hwb, alpha) {
  function keyword (line 212) | function keyword(rgb) {
  function scale (line 217) | function scale(num, min, max) {
  function hexDouble (line 221) | function hexDouble(num) {
  function rgb2hsl (line 779) | function rgb2hsl(rgb) {
  function rgb2hsv (line 814) | function rgb2hsv(rgb) {
  function rgb2hwb (line 847) | function rgb2hwb(rgb) {
  function rgb2cmyk (line 858) | function rgb2cmyk(rgb) {
  function rgb2keyword (line 871) | function rgb2keyword(rgb) {
  function rgb2xyz (line 875) | function rgb2xyz(rgb) {
  function rgb2lab (line 892) | function rgb2lab(rgb) {
  function rgb2lch (line 914) | function rgb2lch(args) {
  function hsl2rgb (line 918) | function hsl2rgb(hsl) {
  function hsl2hsv (line 956) | function hsl2hsv(hsl) {
  function hsl2hwb (line 975) | function hsl2hwb(args) {
  function hsl2cmyk (line 979) | function hsl2cmyk(args) {
  function hsl2keyword (line 983) | function hsl2keyword(args) {
  function hsv2rgb (line 988) | function hsv2rgb(hsv) {
  function hsv2hsl (line 1016) | function hsv2hsl(hsv) {
  function hsv2hwb (line 1030) | function hsv2hwb(args) {
  function hsv2cmyk (line 1034) | function hsv2cmyk(args) {
  function hsv2keyword (line 1038) | function hsv2keyword(args) {
  function hwb2rgb (line 1043) | function hwb2rgb(hwb) {
  function hwb2hsl (line 1078) | function hwb2hsl(args) {
  function hwb2hsv (line 1082) | function hwb2hsv(args) {
  function hwb2cmyk (line 1086) | function hwb2cmyk(args) {
  function hwb2keyword (line 1090) | function hwb2keyword(args) {
  function cmyk2rgb (line 1094) | function cmyk2rgb(cmyk) {
  function cmyk2hsl (line 1107) | function cmyk2hsl(args) {
  function cmyk2hsv (line 1111) | function cmyk2hsv(args) {
  function cmyk2hwb (line 1115) | function cmyk2hwb(args) {
  function cmyk2keyword (line 1119) | function cmyk2keyword(args) {
  function xyz2rgb (line 1124) | function xyz2rgb(xyz) {
  function xyz2lab (line 1151) | function xyz2lab(xyz) {
  function xyz2lch (line 1172) | function xyz2lch(args) {
  function lab2xyz (line 1176) | function lab2xyz(lab) {
  function lab2lch (line 1197) | function lab2lch(lab) {
  function lab2rgb (line 1212) | function lab2rgb(args) {
  function lch2lab (line 1216) | function lch2lab(lch) {
  function lch2xyz (line 1228) | function lch2xyz(args) {
  function lch2rgb (line 1232) | function lch2rgb(args) {
  function keyword2rgb (line 1236) | function keyword2rgb(keyword) {
  function keyword2hsl (line 1240) | function keyword2hsl(args) {
  function keyword2hsv (line 1244) | function keyword2hsv(args) {
  function keyword2hwb (line 1248) | function keyword2hwb(args) {
  function keyword2cmyk (line 1252) | function keyword2cmyk(args) {
  function keyword2lab (line 1256) | function keyword2lab(args) {
  function keyword2xyz (line 1260) | function keyword2xyz(args) {
  function hooks (line 1679) | function hooks () {
  function setHookCallback (line 1685) | function setHookCallback (callback) {
  function isArray (line 1689) | function isArray(input) {
  function isObject (line 1693) | function isObject(input) {
  function isObjectEmpty (line 1699) | function isObjectEmpty(obj) {
  function isUndefined (line 1708) | function isUndefined(input) {
  function isNumber (line 1712) | function isNumber(input) {
  function isDate (line 1716) | function isDate(input) {
  function map (line 1720) | function map(arr, fn) {
  function hasOwnProp (line 1728) | function hasOwnProp(a, b) {
  function extend (line 1732) | function extend(a, b) {
  function createUTC (line 1750) | function createUTC (input, format, locale, strict) {
  function defaultParsingFlags (line 1754) | function defaultParsingFlags() {
  function getParsingFlags (line 1774) | function getParsingFlags(m) {
  function isValid (line 1801) | function isValid(m) {
  function createInvalid (line 1834) | function createInvalid (flags) {
  function copyConfig (line 1850) | function copyConfig(to, from) {
  function Moment (line 1900) | function Moment(config) {
  function isMoment (line 1915) | function isMoment (obj) {
  function absFloor (line 1919) | function absFloor (number) {
  function toInt (line 1928) | function toInt(argumentForCoercion) {
  function compareArrays (line 1940) | function compareArrays(array1, array2, dontConvert) {
  function warn (line 1954) | function warn(msg) {
  function deprecate (line 1961) | function deprecate(msg, fn) {
  function deprecateSimple (line 1993) | function deprecateSimple(name, msg) {
  function isFunction (line 2006) | function isFunction(input) {
  function set (line 2010) | function set (config) {
  function mergeConfigs (line 2029) | function mergeConfigs(parentConfig, childConfig) {
  function Locale (line 2055) | function Locale(config) {
  function calendar (line 2088) | function calendar (key, mom, now) {
  function longDateFormat (line 2102) | function longDateFormat (key) {
  function invalidDate (line 2119) | function invalidDate () {
  function ordinal (line 2126) | function ordinal (number) {
  function relativeTime (line 2147) | function relativeTime (number, withoutSuffix, string, isFuture) {
  function pastFuture (line 2154) | function pastFuture (diff, output) {
  function addUnitAlias (line 2161) | function addUnitAlias (unit, shorthand) {
  function normalizeUnits (line 2166) | function normalizeUnits(units) {
  function normalizeObjectUnits (line 2170) | function normalizeObjectUnits(inputObject) {
  function addUnitPriority (line 2189) | function addUnitPriority(unit, priority) {
  function getPrioritizedUnits (line 2193) | function getPrioritizedUnits(unitsObj) {
  function makeGetSet (line 2204) | function makeGetSet (unit, keepTime) {
  function get (line 2216) | function get (mom, unit) {
  function set$1 (line 2221) | function set$1 (mom, unit, value) {
  function stringGet (line 2229) | function stringGet (units) {
  function stringSet (line 2238) | function stringSet (units, value) {
  function zeroFill (line 2254) | function zeroFill(number, targetLength, forceSign) {
  function addFormatToken (line 2274) | function addFormatToken (token, padded, ordinal, callback) {
  function removeFormattingTokens (line 2296) | function removeFormattingTokens(input) {
  function makeFormatFunction (line 2303) | function makeFormatFunction(format) {
  function formatMoment (line 2324) | function formatMoment(m, format) {
  function expandFormat (line 2335) | function expandFormat(format, locale) {
  function addRegexToken (line 2379) | function addRegexToken (token, regex, strictRegex) {
  function getParseRegexForToken (line 2385) | function getParseRegexForToken (token, config) {
  function unescapeFormat (line 2394) | function unescapeFormat(s) {
  function regexEscape (line 2400) | function regexEscape(s) {
  function addParseToken (line 2406) | function addParseToken (token, callback) {
  function addWeekParseToken (line 2421) | function addWeekParseToken (token, callback) {
  function addTimeToArrayFromToken (line 2428) | function addTimeToArrayFromToken(token, input, config) {
  function daysInMonth (line 2463) | function daysInMonth(year, month) {
  function localeMonths (line 2518) | function localeMonths (m, format) {
  function localeMonthsShort (line 2528) | function localeMonthsShort (m, format) {
  function handleStrictParse (line 2537) | function handleStrictParse(monthName, format, strict) {
  function localeMonthsParse (line 2578) | function localeMonthsParse (monthName, format, strict) {
  function setMonth (line 2618) | function setMonth (mom, value) {
  function getSetMonth (line 2643) | function getSetMonth (value) {
  function getDaysInMonth (line 2653) | function getDaysInMonth () {
  function monthsShortRegex (line 2658) | function monthsShortRegex (isStrict) {
  function monthsRegex (line 2678) | function monthsRegex (isStrict) {
  function computeMonthsParse (line 2697) | function computeMonthsParse () {
  function daysInYear (line 2775) | function daysInYear(year) {
  function isLeapYear (line 2779) | function isLeapYear(year) {
  function getIsLeapYear (line 2793) | function getIsLeapYear () {
  function createDate (line 2797) | function createDate (y, m, d, h, M, s, ms) {
  function createUTCDate (line 2809) | function createUTCDate (y) {
  function firstWeekOffset (line 2820) | function firstWeekOffset(year, dow, doy) {
  function dayOfYearFromWeeks (line 2830) | function dayOfYearFromWeeks(year, week, weekday, dow, doy) {
  function weekOfYear (line 2853) | function weekOfYear(mom, dow, doy) {
  function weeksInYear (line 2875) | function weeksInYear(year, dow, doy) {
  function localeWeek (line 2911) | function localeWeek (mom) {
  function localeFirstDayOfWeek (line 2920) | function localeFirstDayOfWeek () {
  function localeFirstDayOfYear (line 2924) | function localeFirstDayOfYear () {
  function getSetWeek (line 2930) | function getSetWeek (input) {
  function getSetISOWeek (line 2935) | function getSetISOWeek (input) {
  function parseWeekday (line 3001) | function parseWeekday(input, locale) {
  function parseIsoWeekday (line 3018) | function parseIsoWeekday(input, locale) {
  function localeWeekdays (line 3028) | function localeWeekdays (m, format) {
  function localeWeekdaysShort (line 3038) | function localeWeekdaysShort (m) {
  function localeWeekdaysMin (line 3043) | function localeWeekdaysMin (m) {
  function handleStrictParse$1 (line 3047) | function handleStrictParse$1(weekdayName, format, strict) {
  function localeWeekdaysParse (line 3111) | function localeWeekdaysParse (weekdayName, format, strict) {
  function getSetDayOfWeek (line 3153) | function getSetDayOfWeek (input) {
  function getSetLocaleDayOfWeek (line 3166) | function getSetLocaleDayOfWeek (input) {
  function getSetISODayOfWeek (line 3174) | function getSetISODayOfWeek (input) {
  function weekdaysRegex (line 3192) | function weekdaysRegex (isStrict) {
  function weekdaysShortRegex (line 3212) | function weekdaysShortRegex (isStrict) {
  function weekdaysMinRegex (line 3232) | function weekdaysMinRegex (isStrict) {
  function computeWeekdaysParse (line 3252) | function computeWeekdaysParse () {
  function hFormat (line 3295) | function hFormat() {
  function kFormat (line 3299) | function kFormat() {
  function meridiem (line 3325) | function meridiem (token, lowercase) {
  function matchMeridiem (line 3343) | function matchMeridiem (isStrict, locale) {
  function localeIsPM (line 3403) | function localeIsPM (input) {
  function localeMeridiem (line 3410) | function localeMeridiem (hours, minutes, isLower) {
  function normalizeLocale (line 3456) | function normalizeLocale(key) {
  function chooseLocale (line 3463) | function chooseLocale(names) {
  function loadLocale (line 3487) | function loadLocale(name) {
  function getSetGlobalLocale (line 3506) | function getSetGlobalLocale (key, values) {
  function defineLocale (line 3525) | function defineLocale (name, config) {
  function updateLocale (line 3572) | function updateLocale(name, config) {
  function getLocale (line 3600) | function getLocale (key) {
  function listLocales (line 3623) | function listLocales() {
  function checkOverflow (line 3627) | function checkOverflow (m) {
  function configFromISO (line 3695) | function configFromISO(config) {
  function configFromRFC2822 (line 3751) | function configFromRFC2822(config) {
  function configFromString (line 3819) | function configFromString(config) {
  function defaults (line 3856) | function defaults(a, b, c) {
  function currentDateArray (line 3866) | function currentDateArray(config) {
  function configFromArray (line 3879) | function configFromArray (config) {
  function dayOfYearFromWeekInfo (line 3941) | function dayOfYearFromWeekInfo(config) {
  function configFromStringAndFormat (line 4005) | function configFromStringAndFormat(config) {
  function meridiemFixWrap (line 4077) | function meridiemFixWrap (locale, hour, meridiem) {
  function configFromStringAndArray (line 4103) | function configFromStringAndArray(config) {
  function configFromObject (line 4147) | function configFromObject(config) {
  function createFromConfig (line 4160) | function createFromConfig (config) {
  function prepareConfig (line 4171) | function prepareConfig (config) {
  function configFromInput (line 4204) | function configFromInput(config) {
  function createLocalOrUTC (line 4227) | function createLocalOrUTC (input, format, locale, strict, isUTC) {
  function createLocal (line 4251) | function createLocal (input, format, locale, strict) {
  function pickBy (line 4284) | function pickBy(fn, moments) {
  function min (line 4302) | function min () {
  function max (line 4308) | function max () {
  function isDurationValid (line 4320) | function isDurationValid(m) {
  function isValid$1 (line 4342) | function isValid$1() {
  function createInvalid$1 (line 4346) | function createInvalid$1() {
  function Duration (line 4350) | function Duration (duration) {
  function isDuration (line 4387) | function isDuration (obj) {
  function absRound (line 4391) | function absRound (number) {
  function offset (line 4401) | function offset (token, separator) {
  function offsetFromString (line 4432) | function offsetFromString(matcher, string) {
  function cloneWithOffset (line 4449) | function cloneWithOffset(input, model) {
  function getDateOffset (line 4463) | function getDateOffset (m) {
  function getSetOffset (line 4487) | function getSetOffset (input, keepLocalTime, keepMinutes) {
  function getSetZone (line 4525) | function getSetZone (input, keepLocalTime) {
  function setOffsetToUTC (line 4539) | function setOffsetToUTC (keepLocalTime) {
  function setOffsetToLocal (line 4543) | function setOffsetToLocal (keepLocalTime) {
  function setOffsetToParsedOffset (line 4555) | function setOffsetToParsedOffset () {
  function hasAlignedHourOffset (line 4570) | function hasAlignedHourOffset (input) {
  function isDaylightSavingTime (line 4579) | function isDaylightSavingTime () {
  function isDaylightSavingTimeShifted (line 4586) | function isDaylightSavingTimeShifted () {
  function isLocal (line 4607) | function isLocal () {
  function isUtcOffset (line 4611) | function isUtcOffset () {
  function isUtc (line 4615) | function isUtc () {
  function createDuration (line 4627) | function createDuration (input, key) {
  function parseIso (line 4691) | function parseIso (inp, sign) {
  function positiveMomentsDifference (line 4700) | function positiveMomentsDifference(base, other) {
  function momentsDifference (line 4714) | function momentsDifference(base, other) {
  function createAdder (line 4733) | function createAdder(direction, name) {
  function addSubtract (line 4750) | function addSubtract (mom, duration, isAdding, updateOffset) {
  function getCalendarFormat (line 4779) | function getCalendarFormat(myMoment, now) {
  function calendar$1 (line 4789) | function calendar$1 (time, formats) {
  function clone (line 4801) | function clone () {
  function isAfter (line 4805) | function isAfter (input, units) {
  function isBefore (line 4818) | function isBefore (input, units) {
  function isBetween (line 4831) | function isBetween (from, to, units, inclusivity) {
  function isSame (line 4837) | function isSame (input, units) {
  function isSameOrAfter (line 4852) | function isSameOrAfter (input, units) {
  function isSameOrBefore (line 4856) | function isSameOrBefore (input, units) {
  function diff (line 4860) | function diff (input, units, asFloat) {
  function monthDiff (line 4898) | function monthDiff (a, b) {
  function toString (line 4922) | function toString () {
  function toISOString (line 4926) | function toISOString() {
  function inspect (line 4947) | function inspect () {
  function format (line 4965) | function format (inputString) {
  function from (line 4973) | function from (time, withoutSuffix) {
  function fromNow (line 4983) | function fromNow (withoutSuffix) {
  function to (line 4987) | function to (time, withoutSuffix) {
  function toNow (line 4997) | function toNow (withoutSuffix) {
  function locale (line 5004) | function locale (key) {
  function localeData (line 5029) | function localeData () {
  function startOf (line 5033) | function startOf (units) {
  function endOf (line 5077) | function endOf (units) {
  function valueOf (line 5091) | function valueOf () {
  function unix (line 5095) | function unix () {
  function toDate (line 5099) | function toDate () {
  function toArray (line 5103) | function toArray () {
  function toObject (line 5108) | function toObject () {
  function toJSON (line 5121) | function toJSON () {
  function isValid$2 (line 5126) | function isValid$2 () {
  function parsingFlags (line 5130) | function parsingFlags () {
  function invalidAt (line 5134) | function invalidAt () {
  function creationData (line 5138) | function creationData() {
  function addWeekYearFormatToken (line 5158) | function addWeekYearFormatToken (token, getter) {
  function getSetWeekYear (line 5199) | function getSetWeekYear (input) {
  function getSetISOWeekYear (line 5208) | function getSetISOWeekYear (input) {
  function getISOWeeksInYear (line 5213) | function getISOWeeksInYear () {
  function getWeeksInYear (line 5217) | function getWeeksInYear () {
  function getSetWeekYearHelper (line 5222) | function getSetWeekYearHelper(input, week, weekday, dow, doy) {
  function setWeekAll (line 5235) | function setWeekAll(weekYear, week, weekday, dow, doy) {
  function getSetQuarter (line 5266) | function getSetQuarter (input) {
  function getSetDayOfYear (line 5324) | function getSetDayOfYear (input) {
  function parseMs (line 5423) | function parseMs(input, array) {
  function getZoneAbbr (line 5441) | function getZoneAbbr () {
  function getZoneName (line 5445) | function getZoneName () {
  function createUnix (line 5553) | function createUnix (input) {
  function createInZone (line 5557) | function createInZone () {
  function preParsePostFormat (line 5561) | function preParsePostFormat (string) {
  function get$1 (line 5603) | function get$1 (format, index, field, setter) {
  function listMonthsImpl (line 5609) | function listMonthsImpl (format, index, field) {
  function listWeekdaysImpl (line 5637) | function listWeekdaysImpl (localeSorted, format, index, field) {
  function listMonths (line 5673) | function listMonths (format, index) {
  function listMonthsShort (line 5677) | function listMonthsShort (format, index) {
  function listWeekdays (line 5681) | function listWeekdays (localeSorted, format, index) {
  function listWeekdaysShort (line 5685) | function listWeekdaysShort (localeSorted, format, index) {
  function listWeekdaysMin (line 5689) | function listWeekdaysMin (localeSorted, format, index) {
  function abs (line 5711) | function abs () {
  function addSubtract$1 (line 5728) | function addSubtract$1 (duration, input, value, direction) {
  function add$1 (line 5739) | function add$1 (input, value) {
  function subtract$1 (line 5744) | function subtract$1 (input, value) {
  function absCeil (line 5748) | function absCeil (number) {
  function bubble (line 5756) | function bubble () {
  function daysToMonths (line 5803) | function daysToMonths (days) {
  function monthsToDays (line 5809) | function monthsToDays (months) {
  function as (line 5814) | function as (units) {
  function valueOf$1 (line 5845) | function valueOf$1 () {
  function makeAs (line 5857) | function makeAs (alias) {
  function get$2 (line 5872) | function get$2 (units) {
  function makeGetter (line 5877) | function makeGetter(name) {
  function weeks (line 5891) | function weeks () {
  function substituteTimeAgo (line 5906) | function substituteTimeAgo(string, number, withoutSuffix, isFuture, loca...
  function relativeTime$1 (line 5910) | function relativeTime$1 (posNegDuration, withoutSuffix, locale) {
  function getSetRelativeTimeRounding (line 5938) | function getSetRelativeTimeRounding (roundingFunction) {
  function getSetRelativeTimeThreshold (line 5950) | function getSetRelativeTimeThreshold (threshold, limit) {
  function humanize (line 5964) | function humanize (withSuffix) {
  function toISOString$1 (line 5981) | function toISOString$1() {
  function lineEnabled (line 7162) | function lineEnabled(dataset, options) {
  function capControlPoint (line 7380) | function capControlPoint(pt, min, max) {
  function initConfig (line 8208) | function initConfig(config) {
  function updateConfig (line 8229) | function updateConfig(chart) {
  function positionIsHorizontal (line 8245) | function positionIsHorizontal(position) {
  function listenArrayEvents (line 9053) | function listenArrayEvents(array, listener) {
  function unlistenArrayEvents (line 9094) | function unlistenArrayEvents(array, listener) {
  function interpolate (line 9380) | function interpolate(start, view, model, ease) {
  function parseMaxStyle (line 10236) | function parseMaxStyle(styleValue, node, parentProperty) {
  function isConstrainedValue (line 10256) | function isConstrainedValue(value) {
  function getConstraintDimension (line 10265) | function getConstraintDimension(domNode, maxStyle, percentageProperty) {
  function getRelativePosition (line 10490) | function getRelativePosition(e, chart) {
  function parseVisibleItems (line 10506) | function parseVisibleItems(chart, handler) {
  function getIntersectItems (line 10531) | function getIntersectItems(chart, position) {
  function getNearestItems (line 10551) | function getNearestItems(chart, position, intersect, distanceMetric) {
  function indexMode (line 10579) | function indexMode(chart, e, options) {
  function filterByPosition (line 10861) | function filterByPosition(array, position) {
  function sortByWeight (line 10867) | function sortByWeight(array, reverse) {
  function getMinimumBoxSize (line 11057) | function getMinimumBoxSize(box) {
  function fitBox (line 11109) | function fitBox(box) {
  function finalFitVerticalBox (line 11155) | function finalFitVerticalBox(box) {
  function placeBox (line 11240) | function placeBox(box) {
  function computeTextSize (line 11720) | function computeTextSize(context, tick, font) {
  function parseFontOptions (line 11726) | function parseFontOptions(options) {
  function mergeOpacity (line 12690) | function mergeOpacity(colorString, opacity) {
  function pushOrConcat (line 12783) | function pushOrConcat(base, toPush) {
  function createTooltipItem (line 12799) | function createTooltipItem(element) {
  function getBaseModel (line 12819) | function getBaseModel(tooltipOpts) {
  function getTooltipSize (line 12871) | function getTooltipSize(tooltip, model) {
  function determineAlignment (line 12939) | function determineAlignment(tooltip, size) {
  function getBackgroundPoint (line 13012) | function getBackgroundPoint(vm, size, alignment) {
  function xRange (line 13836) | function xRange(mouseX) {
  function yRange (line 13841) | function yRange(mouseY) {
  function isVertical (line 13931) | function isVertical(bar) {
  function getBarBounds (line 13941) | function getBarBounds(bar) {
  function cornerAt (line 14042) | function cornerAt(index) {
  function readUsedSize (line 14161) | function readUsedSize(element, property) {
  function initCanvas (line 14172) | function initCanvas(canvas, config) {
  function createEvent (line 14222) | function createEvent(type, chart, x, y, nativeEvent) {
  function fromNativeEvent (line 14232) | function fromNativeEvent(event, chart) {
  function createResizer (line 14238) | function createResizer(handler) {
  function addResizeListener (line 14274) | function addResizeListener(node, listener, chart) {
  function removeResizeListener (line 14298) | function removeResizeListener(node) {
  function decodeFill (line 14526) | function decodeFill(el, index, count) {
  function computeBoundary (line 14575) | function computeBoundary(source) {
  function resolveTarget (line 14619) | function resolveTarget(sources, index, propagate) {
  function createMapper (line 14650) | function createMapper(source) {
  function isDrawable (line 14665) | function isDrawable(point) {
  function drawArea (line 14669) | function drawArea(ctx, curve0, curve1, len0, len1) {
  function doFill (line 14691) | function doFill(ctx, points, mapper, view, color, loop) {
  function getBoxWidth (line 14868) | function getBoxWidth(labelOpts, fontSize) {
  function createNewLegendAndAttach (line 15289) | function createNewLegendAndAttach(chart, legendOpts) {
  function createNewTitleBlockAndAttach (line 15524) | function createNewTitleBlockAndAttach(chart, titleOpts) {
  function IDMatches (line 15728) | function IDMatches(meta) {
  function IDMatches (line 16028) | function IDMatches(meta) {
  function getValueCount (line 16306) | function getValueCount(scale) {
  function getPointLabelFontOptions (line 16311) | function getPointLabelFontOptions(scale) {
  function measureLabelSize (line 16326) | function measureLabelSize(ctx, fontSize, label) {
  function determineLimits (line 16340) | function determineLimits(angle, pos, size, min, max) {
  function fitWithPointLabels (line 16362) | function fitWithPointLabels(scale) {
  function fit (line 16449) | function fit(scale) {
  function getTextAlignForAngle (line 16455) | function getTextAlignForAngle(angle) {
  function fillText (line 16465) | function fillText(ctx, text, position, fontSize) {
  function adjustPointPositionForLabelHeight (line 16479) | function adjustPointPositionForLabelHeight(angle, textSize, position) {
  function drawPointLabels (line 16487) | function drawPointLabels(scale) {
  function drawRadiusLine (line 16532) | function drawRadiusLine(scale, gridLineOpts, radius, index) {
  function numberOrZero (line 16565) | function numberOrZero(param) {
  function parseTime (line 16860) | function parseTime(axis, label) {
  function determineUnit (line 16893) | function determineUnit(minUnit, min, max, maxTicks) {
  function determineStepSize (line 16917) | function determineStepSize(min, max, unit, maxTicks) {
  function generateTicks (line 16949) | function generateTicks(options, dataRange, niceRange) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/dist/Chart.js
  function s (line 10) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function getRgba (line 35) | function getRgba(string) {
  function getHsla (line 95) | function getHsla(string) {
  function getHwb (line 111) | function getHwb(string) {
  function getRgb (line 127) | function getRgb(string) {
  function getHsl (line 132) | function getHsl(string) {
  function getAlpha (line 137) | function getAlpha(string) {
  function hexString (line 151) | function hexString(rgb) {
  function rgbString (line 156) | function rgbString(rgba, alpha) {
  function rgbaString (line 163) | function rgbaString(rgba, alpha) {
  function percentString (line 171) | function percentString(rgba, alpha) {
  function percentaString (line 182) | function percentaString(rgba, alpha) {
  function hslString (line 189) | function hslString(hsla, alpha) {
  function hslaString (line 196) | function hslaString(hsla, alpha) {
  function hwbString (line 206) | function hwbString(hwb, alpha) {
  function keyword (line 214) | function keyword(rgb) {
  function scale (line 219) | function scale(num, min, max) {
  function hexDouble (line 223) | function hexDouble(num) {
  function rgb2hsl (line 781) | function rgb2hsl(rgb) {
  function rgb2hsv (line 816) | function rgb2hsv(rgb) {
  function rgb2hwb (line 849) | function rgb2hwb(rgb) {
  function rgb2cmyk (line 860) | function rgb2cmyk(rgb) {
  function rgb2keyword (line 873) | function rgb2keyword(rgb) {
  function rgb2xyz (line 877) | function rgb2xyz(rgb) {
  function rgb2lab (line 894) | function rgb2lab(rgb) {
  function rgb2lch (line 916) | function rgb2lch(args) {
  function hsl2rgb (line 920) | function hsl2rgb(hsl) {
  function hsl2hsv (line 958) | function hsl2hsv(hsl) {
  function hsl2hwb (line 977) | function hsl2hwb(args) {
  function hsl2cmyk (line 981) | function hsl2cmyk(args) {
  function hsl2keyword (line 985) | function hsl2keyword(args) {
  function hsv2rgb (line 990) | function hsv2rgb(hsv) {
  function hsv2hsl (line 1018) | function hsv2hsl(hsv) {
  function hsv2hwb (line 1032) | function hsv2hwb(args) {
  function hsv2cmyk (line 1036) | function hsv2cmyk(args) {
  function hsv2keyword (line 1040) | function hsv2keyword(args) {
  function hwb2rgb (line 1045) | function hwb2rgb(hwb) {
  function hwb2hsl (line 1080) | function hwb2hsl(args) {
  function hwb2hsv (line 1084) | function hwb2hsv(args) {
  function hwb2cmyk (line 1088) | function hwb2cmyk(args) {
  function hwb2keyword (line 1092) | function hwb2keyword(args) {
  function cmyk2rgb (line 1096) | function cmyk2rgb(cmyk) {
  function cmyk2hsl (line 1109) | function cmyk2hsl(args) {
  function cmyk2hsv (line 1113) | function cmyk2hsv(args) {
  function cmyk2hwb (line 1117) | function cmyk2hwb(args) {
  function cmyk2keyword (line 1121) | function cmyk2keyword(args) {
  function xyz2rgb (line 1126) | function xyz2rgb(xyz) {
  function xyz2lab (line 1153) | function xyz2lab(xyz) {
  function xyz2lch (line 1174) | function xyz2lch(args) {
  function lab2xyz (line 1178) | function lab2xyz(lab) {
  function lab2lch (line 1199) | function lab2lch(lab) {
  function lab2rgb (line 1214) | function lab2rgb(args) {
  function lch2lab (line 1218) | function lch2lab(lch) {
  function lch2xyz (line 1230) | function lch2xyz(args) {
  function lch2rgb (line 1234) | function lch2rgb(args) {
  function keyword2rgb (line 1238) | function keyword2rgb(keyword) {
  function keyword2hsl (line 1242) | function keyword2hsl(args) {
  function keyword2hsv (line 1246) | function keyword2hsv(args) {
  function keyword2hwb (line 1250) | function keyword2hwb(args) {
  function keyword2cmyk (line 1254) | function keyword2cmyk(args) {
  function keyword2lab (line 1258) | function keyword2lab(args) {
  function keyword2xyz (line 1262) | function keyword2xyz(args) {
  function lineEnabled (line 2699) | function lineEnabled(dataset, options) {
  function capControlPoint (line 2917) | function capControlPoint(pt, min, max) {
  function initConfig (line 3745) | function initConfig(config) {
  function updateConfig (line 3766) | function updateConfig(chart) {
  function positionIsHorizontal (line 3782) | function positionIsHorizontal(position) {
  function listenArrayEvents (line 4590) | function listenArrayEvents(array, listener) {
  function unlistenArrayEvents (line 4631) | function unlistenArrayEvents(array, listener) {
  function interpolate (line 4917) | function interpolate(start, view, model, ease) {
  function parseMaxStyle (line 5773) | function parseMaxStyle(styleValue, node, parentProperty) {
  function isConstrainedValue (line 5793) | function isConstrainedValue(value) {
  function getConstraintDimension (line 5802) | function getConstraintDimension(domNode, maxStyle, percentageProperty) {
  function getRelativePosition (line 6027) | function getRelativePosition(e, chart) {
  function parseVisibleItems (line 6043) | function parseVisibleItems(chart, handler) {
  function getIntersectItems (line 6068) | function getIntersectItems(chart, position) {
  function getNearestItems (line 6088) | function getNearestItems(chart, position, intersect, distanceMetric) {
  function indexMode (line 6116) | function indexMode(chart, e, options) {
  function filterByPosition (line 6398) | function filterByPosition(array, position) {
  function sortByWeight (line 6404) | function sortByWeight(array, reverse) {
  function getMinimumBoxSize (line 6594) | function getMinimumBoxSize(box) {
  function fitBox (line 6646) | function fitBox(box) {
  function finalFitVerticalBox (line 6692) | function finalFitVerticalBox(box) {
  function placeBox (line 6777) | function placeBox(box) {
  function computeTextSize (line 7257) | function computeTextSize(context, tick, font) {
  function parseFontOptions (line 7263) | function parseFontOptions(options) {
  function mergeOpacity (line 8227) | function mergeOpacity(colorString, opacity) {
  function pushOrConcat (line 8320) | function pushOrConcat(base, toPush) {
  function createTooltipItem (line 8336) | function createTooltipItem(element) {
  function getBaseModel (line 8356) | function getBaseModel(tooltipOpts) {
  function getTooltipSize (line 8408) | function getTooltipSize(tooltip, model) {
  function determineAlignment (line 8476) | function determineAlignment(tooltip, size) {
  function getBackgroundPoint (line 8549) | function getBackgroundPoint(vm, size, alignment) {
  function xRange (line 9373) | function xRange(mouseX) {
  function yRange (line 9378) | function yRange(mouseY) {
  function isVertical (line 9468) | function isVertical(bar) {
  function getBarBounds (line 9478) | function getBarBounds(bar) {
  function cornerAt (line 9579) | function cornerAt(index) {
  function readUsedSize (line 9698) | function readUsedSize(element, property) {
  function initCanvas (line 9709) | function initCanvas(canvas, config) {
  function createEvent (line 9759) | function createEvent(type, chart, x, y, nativeEvent) {
  function fromNativeEvent (line 9769) | function fromNativeEvent(event, chart) {
  function createResizer (line 9775) | function createResizer(handler) {
  function addResizeListener (line 9811) | function addResizeListener(node, listener, chart) {
  function removeResizeListener (line 9835) | function removeResizeListener(node) {
  function decodeFill (line 10063) | function decodeFill(el, index, count) {
  function computeBoundary (line 10112) | function computeBoundary(source) {
  function resolveTarget (line 10156) | function resolveTarget(sources, index, propagate) {
  function createMapper (line 10187) | function createMapper(source) {
  function isDrawable (line 10202) | function isDrawable(point) {
  function drawArea (line 10206) | function drawArea(ctx, curve0, curve1, len0, len1) {
  function doFill (line 10228) | function doFill(ctx, points, mapper, view, color, loop) {
  function getBoxWidth (line 10405) | function getBoxWidth(labelOpts, fontSize) {
  function createNewLegendAndAttach (line 10826) | function createNewLegendAndAttach(chart, legendOpts) {
  function createNewTitleBlockAndAttach (line 11061) | function createNewTitleBlockAndAttach(chart, titleOpts) {
  function IDMatches (line 11265) | function IDMatches(meta) {
  function IDMatches (line 11565) | function IDMatches(meta) {
  function getValueCount (line 11843) | function getValueCount(scale) {
  function getPointLabelFontOptions (line 11848) | function getPointLabelFontOptions(scale) {
  function measureLabelSize (line 11863) | function measureLabelSize(ctx, fontSize, label) {
  function determineLimits (line 11877) | function determineLimits(angle, pos, size, min, max) {
  function fitWithPointLabels (line 11899) | function fitWithPointLabels(scale) {
  function fit (line 11986) | function fit(scale) {
  function getTextAlignForAngle (line 11992) | function getTextAlignForAngle(angle) {
  function fillText (line 12002) | function fillText(ctx, text, position, fontSize) {
  function adjustPointPositionForLabelHeight (line 12016) | function adjustPointPositionForLabelHeight(angle, textSize, position) {
  function drawPointLabels (line 12024) | function drawPointLabels(scale) {
  function drawRadiusLine (line 12069) | function drawRadiusLine(scale, gridLineOpts, radius, index) {
  function numberOrZero (line 12102) | function numberOrZero(param) {
  function parseTime (line 12397) | function parseTime(axis, label) {
  function determineUnit (line 12430) | function determineUnit(minUnit, min, max, maxTicks) {
  function determineStepSize (line 12454) | function determineStepSize(min, max, unit, maxTicks) {
  function generateTicks (line 12486) | function generateTicks(options, dataRange, niceRange) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/gulpfile.js
  function bowerTask (line 59) | function bowerTask() {
  function buildTask (line 81) | function buildTask() {
  function packageTask (line 114) | function packageTask() {
  function lintTask (line 129) | function lintTask() {
  function docsTask (line 167) | function docsTask(done) {
  function validHTMLTask (line 180) | function validHTMLTask() {
  function startTest (line 185) | function startTest() {
  function unittestTask (line 199) | function unittestTask(done) {
  function librarySizeTask (line 210) | function librarySizeTask() {
  function moduleSizesTask (line 217) | function moduleSizesTask() {
  function watchTask (line 228) | function watchTask() {
  function serverTask (line 235) | function serverTask() {
  function _openTask (line 243) | function _openTask() {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/controllers/controller.line.js
  function lineEnabled (line 27) | function lineEnabled(dataset, options) {
  function capControlPoint (line 245) | function capControlPoint(pt, min, max) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.controller.js
  function initConfig (line 22) | function initConfig(config) {
  function updateConfig (line 43) | function updateConfig(chart) {
  function positionIsHorizontal (line 59) | function positionIsHorizontal(position) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.datasetController.js
  function listenArrayEvents (line 14) | function listenArrayEvents(array, listener) {
  function unlistenArrayEvents (line 55) | function unlistenArrayEvents(array, listener) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.element.js
  function interpolate (line 9) | function interpolate(start, view, model, ease) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.helpers.js
  function parseMaxStyle (line 744) | function parseMaxStyle(styleValue, node, parentProperty) {
  function isConstrainedValue (line 764) | function isConstrainedValue(value) {
  function getConstraintDimension (line 773) | function getConstraintDimension(domNode, maxStyle, percentageProperty) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.interaction.js
  function getRelativePosition (line 12) | function getRelativePosition(e, chart) {
  function parseVisibleItems (line 28) | function parseVisibleItems(chart, handler) {
  function getIntersectItems (line 53) | function getIntersectItems(chart, position) {
  function getNearestItems (line 73) | function getNearestItems(chart, position, intersect, distanceMetric) {
  function indexMode (line 101) | function indexMode(chart, e, options) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.layoutService.js
  function filterByPosition (line 7) | function filterByPosition(array, position) {
  function sortByWeight (line 13) | function sortByWeight(array, reverse) {
  function getMinimumBoxSize (line 203) | function getMinimumBoxSize(box) {
  function fitBox (line 255) | function fitBox(box) {
  function finalFitVerticalBox (line 301) | function finalFitVerticalBox(box) {
  function placeBox (line 386) | function placeBox(box) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.scale.js
  function computeTextSize (line 55) | function computeTextSize(context, tick, font) {
  function parseFontOptions (line 61) | function parseFontOptions(options) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/core/core.tooltip.js
  function mergeOpacity (line 10) | function mergeOpacity(colorString, opacity) {
  function pushOrConcat (line 103) | function pushOrConcat(base, toPush) {
  function createTooltipItem (line 119) | function createTooltipItem(element) {
  function getBaseModel (line 139) | function getBaseModel(tooltipOpts) {
  function getTooltipSize (line 191) | function getTooltipSize(tooltip, model) {
  function determineAlignment (line 259) | function determineAlignment(tooltip, size) {
  function getBackgroundPoint (line 332) | function getBackgroundPoint(vm, size, alignment) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/elements/element.point.js
  function xRange (line 21) | function xRange(mouseX) {
  function yRange (line 26) | function yRange(mouseY) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/elements/element.rectangle.js
  function isVertical (line 14) | function isVertical(bar) {
  function getBarBounds (line 24) | function getBarBounds(bar) {
  function cornerAt (line 125) | function cornerAt(index) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/platforms/platform.dom.js
  function readUsedSize (line 34) | function readUsedSize(element, property) {
  function initCanvas (line 45) | function initCanvas(canvas, config) {
  function createEvent (line 95) | function createEvent(type, chart, x, y, nativeEvent) {
  function fromNativeEvent (line 105) | function fromNativeEvent(event, chart) {
  function createResizer (line 111) | function createResizer(handler) {
  function addResizeListener (line 147) | function addResizeListener(node, listener, chart) {
  function removeResizeListener (line 171) | function removeResizeListener(node) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/plugins/plugin.filler.js
  function decodeFill (line 43) | function decodeFill(el, index, count) {
  function computeBoundary (line 92) | function computeBoundary(source) {
  function resolveTarget (line 136) | function resolveTarget(sources, index, propagate) {
  function createMapper (line 167) | function createMapper(source) {
  function isDrawable (line 182) | function isDrawable(point) {
  function drawArea (line 186) | function drawArea(ctx, curve0, curve1, len0, len1) {
  function doFill (line 208) | function doFill(ctx, points, mapper, view, color, loop) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/plugins/plugin.legend.js
  function getBoxWidth (line 74) | function getBoxWidth(labelOpts, fontSize) {
  function createNewLegendAndAttach (line 495) | function createNewLegendAndAttach(chart, legendOpts) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/plugins/plugin.title.js
  function createNewTitleBlockAndAttach (line 184) | function createNewTitleBlockAndAttach(chart, titleOpts) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/scales/scale.linear.js
  function IDMatches (line 26) | function IDMatches(meta) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/scales/scale.logarithmic.js
  function IDMatches (line 26) | function IDMatches(meta) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/scales/scale.radialLinear.js
  function getValueCount (line 56) | function getValueCount(scale) {
  function getPointLabelFontOptions (line 61) | function getPointLabelFontOptions(scale) {
  function measureLabelSize (line 76) | function measureLabelSize(ctx, fontSize, label) {
  function determineLimits (line 90) | function determineLimits(angle, pos, size, min, max) {
  function fitWithPointLabels (line 112) | function fitWithPointLabels(scale) {
  function fit (line 199) | function fit(scale) {
  function getTextAlignForAngle (line 205) | function getTextAlignForAngle(angle) {
  function fillText (line 215) | function fillText(ctx, text, position, fontSize) {
  function adjustPointPositionForLabelHeight (line 229) | function adjustPointPositionForLabelHeight(angle, textSize, position) {
  function drawPointLabels (line 237) | function drawPointLabels(scale) {
  function drawRadiusLine (line 282) | function drawRadiusLine(scale, gridLineOpts, radius, index) {
  function numberOrZero (line 315) | function numberOrZero(param) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/src/scales/scale.time.js
  function parseTime (line 85) | function parseTime(axis, label) {
  function determineUnit (line 118) | function determineUnit(minUnit, min, max, maxTicks) {
  function determineStepSize (line 142) | function determineStepSize(min, max, unit, maxTicks) {
  function generateTicks (line 174) | function generateTicks(options, dataRange, niceRange) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/jasmine.index.js
  function acquireChart (line 10) | function acquireChart() {
  function releaseChart (line 16) | function releaseChart(chart) {
  function createMockContext (line 21) | function createMockContext() {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/jasmine.matchers.js
  function toPercent (line 6) | function toPercent(value) {
  function createImageData (line 10) | function createImageData(w, h) {
  function canvasFromImageData (line 16) | function canvasFromImageData(data) {
  function buildPixelMatchPreview (line 23) | function buildPixelMatchPreview(actual, expected, diff, threshold, toler...
  function toBeCloseToPixel (line 54) | function toBeCloseToPixel() {
  function toEqualOneOf (line 72) | function toEqualOneOf() {
  function toBeValidChart (line 89) | function toBeValidChart() {
  function toBeChartOfSize (line 114) | function toBeChartOfSize() {
  function toEqualImageData (line 159) | function toEqualImageData() {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/jasmine.utils.js
  function loadJSON (line 3) | function loadJSON(url, callback) {
  function createCanvas (line 16) | function createCanvas(w, h) {
  function readImageData (line 23) | function readImageData(url, callback) {
  function acquireChart (line 47) | function acquireChart(config, options) {
  function releaseChart (line 87) | function releaseChart(chart) {
  function injectCSS (line 96) | function injectCSS(css) {
  function specFromFixture (line 109) | function specFromFixture(description, inputs) {
  function specsFromFixtures (line 130) | function specsFromFixtures(path) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/specs/core.controller.tests.js
  function waitForResize (line 3) | function waitForResize(chart, callback) {
  function createChart (line 149) | function createChart() {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/specs/core.helpers.tests.js
  function isColorInstance (line 883) | function isColorInstance(obj) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/specs/element.rectangle.tests.js
  function testBorderSkipped (line 279) | function testBorderSkipped(borderSkipped, expectedDrawCalls) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/specs/platform.dom.tests.js
  function waitForResize (line 3) | function waitForResize(chart, callback) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/specs/plugin.filler.tests.js
  function decodedFillValues (line 2) | function decodedFillValues(chart) {

FILE: app_backend/static/plugin/Chart.js-2.6.0/test/specs/scale.time.tests.js
  function createScale (line 3) | function createScale(data, options) {
  function newDateFromRef (line 116) | function newDateFromRef(days) {

FILE: app_backend/static/plugin/Gallery-2.25.0/js/blueimp-gallery-vimeo.js
  function callback (line 77) | function callback () {

FILE: app_backend/static/plugin/Gallery-2.25.0/js/blueimp-gallery.js
  function Gallery (line 32) | function Gallery (list, options) {
  function elementTests (line 237) | function elementTests () {
  function closeHandler (line 458) | function closeHandler (event) {
  function isTarget (line 852) | function isTarget (className) {
  function callbackWrapper (line 961) | function callbackWrapper (event) {
  function proxyListener (line 1242) | function proxyListener (event) {
  function openHandler (line 1299) | function openHandler (event) {

FILE: app_backend/static/plugin/Gallery-2.25.0/js/blueimp-helper.js
  function extend (line 17) | function extend (obj1, obj2) {
  function Helper (line 27) | function Helper (query) {

FILE: app_backend/static/plugin/Gallery-2.25.0/js/vendor/jquery.js
  function isArraylike (line 571) | function isArraylike( obj ) {
  function Sizzle (line 788) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 902) | function createCache() {
  function markFunction (line 920) | function markFunction( fn ) {
  function assert (line 929) | function assert( fn ) {
  function addHandle (line 951) | function addHandle( attrs, handler ) {
  function siblingCheck (line 966) | function siblingCheck( a, b ) {
  function createInputPseudo (line 993) | function createInputPseudo( type ) {
  function createButtonPseudo (line 1004) | function createButtonPseudo( type ) {
  function createPositionalPseudo (line 1015) | function createPositionalPseudo( fn ) {
  function testContext (line 1038) | function testContext( context ) {
  function setFilters (line 2047) | function setFilters() {}
  function toSelector (line 2118) | function toSelector( tokens ) {
  function addCombinator (line 2128) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2181) | function elementMatcher( matchers ) {
  function multipleContexts (line 2195) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2204) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2225) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2318) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2376) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function winnow (line 2672) | function winnow( elements, qualifier, not ) {
  function sibling (line 3002) | function sibling( cur, dir ) {
  function createOptions (line 3085) | function createOptions( options ) {
  function detach (line 3485) | function detach() {
  function completed (line 3499) | function completed() {
  function dataAttr (line 3662) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 3694) | function isEmptyDataObject( obj ) {
  function internalData (line 3710) | function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
  function internalRemoveData (line 3799) | function internalRemoveData( elem, name, pvt ) {
  function returnTrue (line 4284) | function returnTrue() {
  function returnFalse (line 4288) | function returnFalse() {
  function safeActiveElement (line 4292) | function safeActiveElement() {
  function createSafeFragment (line 5301) | function createSafeFragment( document ) {
  function getAll (line 5353) | function getAll( context, tag ) {
  function fixDefaultChecked (line 5376) | function fixDefaultChecked( elem ) {
  function manipulationTarget (line 5384) | function manipulationTarget( elem, content ) {
  function disableScript (line 5394) | function disableScript( elem ) {
  function restoreScript (line 5398) | function restoreScript( elem ) {
  function setGlobalEval (line 5409) | function setGlobalEval( elems, refElements ) {
  function cloneCopyEvent (line 5417) | function cloneCopyEvent( src, dest ) {
  function fixCloneNodeIssues (line 5445) | function fixCloneNodeIssues( src, dest ) {
  function actualDisplay (line 6036) | function actualDisplay( name, doc ) {
  function defaultDisplay (line 6058) | function defaultDisplay( nodeName ) {
  function addGetHookIf (line 6257) | function addGetHookIf( conditionFn, hookFn ) {
  function computeStyleTests (line 6351) | function computeStyleTests() {
  function vendorPropName (line 6471) | function vendorPropName( style, name ) {
  function showHide (line 6493) | function showHide( elements, show ) {
  function setPositiveNumber (line 6544) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 6552) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 6591) | function getWidthOrHeight( elem, name, extra ) {
  function Tween (line 6930) | function Tween( elem, options, prop, end, easing ) {
  function createFxNow (line 7099) | function createFxNow() {
  function genFx (line 7107) | function genFx( type, includeWidth ) {
  function createTween (line 7127) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 7141) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7283) | function propFilter( props, specialEasing ) {
  function Animation (line 7320) | function Animation( elem, properties, options ) {
  function addToPrefiltersOrTransports (line 8634) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8666) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8693) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8713) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8768) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9228) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 9473) | function buildParams( prefix, obj, traditional, add ) {
  function createStandardXHR (line 9746) | function createStandardXHR() {
  function createActiveXHR (line 9752) | function createActiveXHR() {
  function getWindow (line 10057) | function getWindow( elem ) {

FILE: app_backend/static/plugin/JavaScript-Canvas-to-Blob-3.7.0/test/vendor/chai.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function Assertion (line 131) | function Assertion (obj, msg, stack) {
  function an (line 452) | function an (type, msg) {
  function includeChainingBehavior (line 490) | function includeChainingBehavior () {
  function include (line 494) | function include (val, msg) {
  function checkArguments (line 734) | function checkArguments () {
  function assertEqual (line 770) | function assertEqual (val, msg) {
  function assertEql (line 807) | function assertEql(obj, msg) {
  function assertAbove (line 846) | function assertAbove (n, msg) {
  function assertLeast (line 895) | function assertLeast (n, msg) {
  function assertBelow (line 944) | function assertBelow (n, msg) {
  function assertMost (line 993) | function assertMost (n, msg) {
  function assertInstanceOf (line 1081) | function assertInstanceOf (constructor, msg) {
  function assertOwnProperty (line 1222) | function assertOwnProperty (name, msg) {
  function assertOwnPropertyDescriptor (line 1255) | function assertOwnPropertyDescriptor (name, descriptor, msg) {
  function assertLengthChain (line 1324) | function assertLengthChain () {
  function assertLength (line 1328) | function assertLength (n, msg) {
  function assertMatch (line 1360) | function assertMatch(re, msg) {
  function assertKeys (line 1439) | function assertKeys (keys) {
  function assertThrows (line 1559) | function assertThrows (constructor, errMsg, msg) {
  function respondTo (line 1703) | function respondTo (method, msg) {
  function satisfy (line 1757) | function satisfy (matcher, msg) {
  function closeTo (line 1789) | function closeTo(expected, delta, msg) {
  function isSubsetOf (line 1808) | function isSubsetOf(subset, superset, cmp) {
  function oneOf (line 1891) | function oneOf (list, msg) {
  function assertChanges (line 1929) | function assertChanges (object, prop, msg) {
  function assertIncreases (line 1967) | function assertIncreases (object, prop, msg) {
  function assertDecreases (line 2005) | function assertDecreases (object, prop, msg) {
  function loadShould (line 3844) | function loadShould () {
  function parsePath (line 4518) | function parsePath (path) {
  function _getPathValue (line 4545) | function _getPathValue (parsed, obj, index) {
  function addProperty (line 4634) | function addProperty(property) {
  function inspect (line 4870) | function inspect(obj, showHidden, depth, colors) {
  function formatValue (line 4891) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 5031) | function formatPrimitive(ctx, value) {
  function formatError (line 5058) | function formatError(value) {
  function formatArray (line 5063) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 5083) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 5143) | function reduceToSingleString(output, base, braces) {
  function isArray (line 5163) | function isArray(ar) {
  function isRegExp (line 5168) | function isRegExp(re) {
  function isDate (line 5172) | function isDate(d) {
  function isError (line 5176) | function isError(e) {
  function objectToString (line 5180) | function objectToString(o) {
  function exclude (line 5496) | function exclude () {
  function AssertionError (line 5535) | function AssertionError (message, _props, ssf) {
  function deepEqual (line 5637) | function deepEqual(a, b, m) {
  function sameValue (line 5667) | function sameValue(a, b) {
  function typeEqual (line 5683) | function typeEqual(a, b) {
  function dateEqual (line 5696) | function dateEqual(a, b) {
  function regexpEqual (line 5710) | function regexpEqual(a, b) {
  function argumentsEqual (line 5726) | function argumentsEqual(a, b, m) {
  function enumerable (line 5740) | function enumerable(a) {
  function iterableEqual (line 5755) | function iterableEqual(a, b) {
  function bufferEqual (line 5780) | function bufferEqual(a, b) {
  function isValue (line 5793) | function isValue(a) {
  function objectEqual (line 5808) | function objectEqual(a, b, m) {
  function getType (line 5896) | function getType (obj) {
  function Library (line 5918) | function Library () {
  function getType (line 6031) | function getType(obj) {
  function Library (line 6055) | function Library() {

FILE: app_backend/static/plugin/JavaScript-Canvas-to-Blob-3.7.0/test/vendor/load-image.js
  function loadImage (line 20) | function loadImage (file, callback, options) {
  function revokeHelper (line 61) | function revokeHelper (img, options) {
  function scaleUp (line 186) | function scaleUp () {
  function scaleDown (line 196) | function scaleDown () {

FILE: app_backend/static/plugin/JavaScript-Canvas-to-Blob-3.7.0/test/vendor/mocha.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function timeslice (line 76) | function timeslice() {
  function isArray (line 214) | function isArray(val) {
  function EventEmitter (line 223) | function EventEmitter() {}
  function on (line 262) | function on() {
  function Progress (line 400) | function Progress() {
  function Context (line 542) | function Context() {}
  function Hook (line 657) | function Hook(title, fn) {
  function visit (line 989) | function visit(obj, file) {
  function image (line 1286) | function image(name) {
  function Mocha (line 1309) | function Mocha(options) {
  function done (line 1745) | function done(failures) {
  function parse (line 1796) | function parse(str) {
  function shortFormat (line 1838) | function shortFormat(ms) {
  function longFormat (line 1861) | function longFormat(ms) {
  function plural (line 1877) | function plural(ms, n, name) {
  function Pending (line 1900) | function Pending(message) {
  function Base (line 2144) | function Base(runner) {
  function pad (line 2250) | function pad(str, len) {
  function inlineDiff (line 2263) | function inlineDiff(err, escape) {
  function unifiedDiff (line 2297) | function unifiedDiff(err, escape) {
  function errorDiff (line 2338) | function errorDiff(err, type, escape) {
  function escapeInvisibles (line 2359) | function escapeInvisibles(line) {
  function colorLines (line 2373) | function colorLines(name, str) {
  function sameType (line 2392) | function sameType(a, b) {
  function Doc (line 2417) | function Doc(runner) {
  function Dot (line 2483) | function Dot(runner) {
  function HTML (line 2580) | function HTML(runner) {
  function makeUrl (line 2750) | function makeUrl(s) {
  function error (line 2802) | function error(msg) {
  function fragment (line 2811) | function fragment(html) {
  function hideSuitesWithout (line 2833) | function hideSuitesWithout(classname) {
  function unhide (line 2846) | function unhide() {
  function text (line 2859) | function text(el, contents) {
  function on (line 2870) | function on(el, event, fn) {
  function List (line 2919) | function List(runner) {
  function clean (line 2953) | function clean(test) {
  function JSONReporter (line 2983) | function JSONReporter(runner) {
  function clean (line 3031) | function clean(test) {
  function errorJSON (line 3048) | function errorJSON(err) {
  function Landing (line 3098) | function Landing(runner) {
  function List (line 3176) | function List(runner) {
  function Markdown (line 3245) | function Markdown(runner) {
  function Min (line 3340) | function Min(runner) {
  function NyanCat (line 3381) | function NyanCat(runner) {
  function draw (line 3451) | function draw(type, n) {
  function write (line 3619) | function write(string) {
  function Progress (line 3654) | function Progress(runner, options) {
  function Spec (line 3738) | function Spec(runner) {
  function TAP (line 3817) | function TAP(runner) {
  function title (line 3864) | function title(test) {
  function XUnit (line 3906) | function XUnit(runner, options) {
  function tag (line 4019) | function tag(name, attrs, close, content) {
  function Runnable (line 4085) | function Runnable(title, fn) {
  function multiple (line 4306) | function multiple(err) {
  function done (line 4315) | function done(err) {
  function callFn (line 4377) | function callFn(fn) {
  function callFnAsync (line 4400) | function callFnAsync(fn) {
  function Runner (line 4487) | function Runner(suite, delay) {
  function next (line 4709) | function next(i) {
  function next (line 4773) | function next(suite) {
  function hookErr (line 4879) | function hookErr(_, errSuite, after) {
  function next (line 4905) | function next(err, errSuite) {
  function next (line 5028) | function next(errSuite) {
  function done (line 5062) | function done(errSuite) {
  function cleanSuiteReferences (line 5172) | function cleanSuiteReferences(suite) {
  function uncaught (line 5221) | function uncaught(err) {
  function start (line 5225) | function start() {
  function filterOnly (line 5281) | function filterOnly(suite) {
  function hasOnly (line 5312) | function hasOnly(suite) {
  function filterLeaks (line 5324) | function filterLeaks(ok, globals) {
  function extraGlobals (line 5365) | function extraGlobals() {
  function Suite (line 5426) | function Suite(title, parentContext) {
  function Test (line 5807) | function Test(title, fn) {
  function pad (line 5846) | function pad(number) {
  function toISOString (line 5859) | function toISOString(date) {
  function ignored (line 6107) | function ignored(path) {
  function highlight (line 6211) | function highlight(js) {
  function emptyRepresentation (line 6250) | function emptyRepresentation(value, typeHint) {
  function jsonStringify (line 6354) | function jsonStringify(object, spaces, depth) {
  function withStack (line 6463) | function withStack(value, fn) {
  function isMochaInternal (line 6622) | function isMochaInternal(line) {
  function isNodeInternal (line 6629) | function isNodeInternal(line) {
  function init (line 6684) | function init () {
  function toByteArray (line 6697) | function toByteArray (b64) {
  function tripletToBase64 (line 6739) | function tripletToBase64 (num) {
  function encodeChunk (line 6743) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 6753) | function fromByteArray (uint8) {
  function BrowserStdout (line 6797) | function BrowserStdout(opts) {
  function typedArraySupport (line 6983) | function typedArraySupport () {
  function kMaxLength (line 6995) | function kMaxLength () {
  function createBuffer (line 7001) | function createBuffer (that, length) {
  function Buffer (line 7030) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 7055) | function from (that, value, encodingOrOffset, length) {
  function assertSize (line 7096) | function assertSize (size) {
  function alloc (line 7104) | function alloc (that, size, fill, encoding) {
  function allocUnsafe (line 7128) | function allocUnsafe (that, size) {
  function fromString (line 7152) | function fromString (that, string, encoding) {
  function fromArrayLike (line 7176) | function fromArrayLike (that, array) {
  function fromArrayBuffer (line 7185) | function fromArrayBuffer (that, array, byteOffset, length) {
  function fromObject (line 7215) | function fromObject (that, obj) {
  function checked (line 7245) | function checked (length) {
  function SlowBuffer (line 7255) | function SlowBuffer (length) {
  function byteLength (line 7338) | function byteLength (string, encoding) {
  function slowToString (line 7383) | function slowToString (encoding, start, end) {
  function swap (line 7457) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 7591) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 7648) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 7716) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 7743) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 7747) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 7751) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 7755) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 7759) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 7842) | function base64Slice (buf, start, end) {
  function utf8Slice (line 7850) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 7928) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 7946) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 7956) | function latin1Slice (buf, start, end) {
  function hexSlice (line 7966) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 7979) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 8027) | function checkOffset (offset, ext, length) {
  function checkInt (line 8188) | function checkInt (buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 8241) | function objectWriteUInt16 (buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 8275) | function objectWriteUInt32 (buf, value, offset, littleEndian) {
  function checkIEEE754 (line 8425) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 8430) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 8446) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 8579) | function base64clean (str) {
  function stringtrim (line 8591) | function stringtrim (str) {
  function toHex (line 8596) | function toHex (n) {
  function utf8ToBytes (line 8601) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 8681) | function asciiToBytes (str) {
  function utf16leToBytes (line 8690) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 8706) | function base64ToBytes (str) {
  function blitBuffer (line 8710) | function blitBuffer (src, dst, offset, length) {
  function isnan (line 8718) | function isnan (val) {
  function isArray (line 8749) | function isArray(arg) {
  function isBoolean (line 8757) | function isBoolean(arg) {
  function isNull (line 8762) | function isNull(arg) {
  function isNullOrUndefined (line 8767) | function isNullOrUndefined(arg) {
  function isNumber (line 8772) | function isNumber(arg) {
  function isString (line 8777) | function isString(arg) {
  function isSymbol (line 8782) | function isSymbol(arg) {
  function isUndefined (line 8787) | function isUndefined(arg) {
  function isRegExp (line 8792) | function isRegExp(re) {
  function isObject (line 8797) | function isObject(arg) {
  function isDate (line 8802) | function isDate(d) {
  function isError (line 8807) | function isError(e) {
  function isFunction (line 8812) | function isFunction(arg) {
  function isPrimitive (line 8817) | function isPrimitive(arg) {
  function objectToString (line 8829) | function objectToString(o) {
  function map (line 8855) | function map(arr, mapper, that) {
  function clonePath (line 8867) | function clonePath(path) {
  function removeEmpty (line 8870) | function removeEmpty(array) {
  function escapeHTML (line 8879) | function escapeHTML(s) {
  function canonicalize (line 8891) | function canonicalize(obj, stack, replacementStack) {
  function buildValues (line 8936) | function buildValues(components, newString, oldString, useLongestToken) {
  function Diff (line 8980) | function Diff(ignoreWhitespace) {
  function done (line 8987) | function done(value) {
  function execEditLength (line 9023) | function execEditLength() {
  function contextLines (line 9250) | function contextLines(lines) {
  function eofNL (line 9255) | function eofNL(curRange, i, current) {
  function EventEmitter (line 9490) | function EventEmitter() {
  function g (line 9628) | function g() {
  function isFunction (line 9756) | function isFunction(arg) {
  function isNumber (line 9760) | function isNumber(arg) {
  function isObject (line 9764) | function isObject(arg) {
  function isUndefined (line 9768) | function isUndefined(arg) {
  function which (line 9788) | function which(name) {
  function growl (line 9937) | function growl(msg, options, fn) {
  function isBuffer (line 10191) | function isBuffer (obj) {
  function isSlowBuffer (line 10196) | function isSlowBuffer (obj) {
  function runInContext (line 10237) | function runInContext(context, exports) {
  function baseAssign (line 11134) | function baseAssign(object, source) {
  function baseCopy (line 11161) | function baseCopy(source, props, object) {
  function object (line 11195) | function object() {}
  function isObject (line 11226) | function isObject(value) {
  function isObjectLike (line 11258) | function isObjectLike(value) {
  function getNative (line 11291) | function getNative(object, key) {
  function isFunction (line 11312) | function isFunction(value) {
  function isObject (line 11339) | function isObject(value) {
  function isNative (line 11362) | function isNative(value) {
  function baseProperty (line 11400) | function baseProperty(key) {
  function isArrayLike (line 11425) | function isArrayLike(value) {
  function isIndex (line 11437) | function isIndex(value, length) {
  function isIterateeCall (line 11452) | function isIterateeCall(value, index, object) {
  function isLength (line 11475) | function isLength(value) {
  function isObject (line 11499) | function isObject(value) {
  function create (line 11555) | function create(prototype, properties, guard) {
  function isArguments (line 11617) | function isArguments(value) {
  function isArrayLike (line 11648) | function isArrayLike(value) {
  function isArrayLikeObject (line 11677) | function isArrayLikeObject(value) {
  function isFunction (line 11698) | function isFunction(value) {
  function isLength (line 11731) | function isLength(value) {
  function isObject (line 11761) | function isObject(value) {
  function isObjectLike (line 11790) | function isObjectLike(value) {
  function isObjectLike (line 11820) | function isObjectLike(value) {
  function getNative (line 11862) | function getNative(object, key) {
  function isLength (line 11876) | function isLength(value) {
  function isFunction (line 11916) | function isFunction(value) {
  function isObject (line 11943) | function isObject(value) {
  function isNative (line 11966) | function isNative(value) {
  function baseProperty (line 12016) | function baseProperty(key) {
  function isArrayLike (line 12041) | function isArrayLike(value) {
  function isIndex (line 12053) | function isIndex(value, length) {
  function isLength (line 12068) | function isLength(value) {
  function shimKeys (line 12080) | function shimKeys(object) {
  function isObject (line 12120) | function isObject(value) {
  function keysIn (line 12185) | function keysIn(object) {
  function mkdirP (line 12224) | function mkdirP (p, opts, f, made) {
  function nextTick (line 12377) | function nextTick(fn, arg1, arg2, arg3) {
  function defaultSetTimout (line 12424) | function defaultSetTimout() {
  function defaultClearTimeout (line 12427) | function defaultClearTimeout () {
  function runTimeout (line 12450) | function runTimeout(fun) {
  function runClearTimeout (line 12475) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 12507) | function cleanUpNextTick() {
  function drainQueue (line 12522) | function drainQueue() {
  function Item (line 12560) | function Item(fun, array) {
  function noop (line 12574) | function noop() {}
  function Duplex (line 12637) | function Duplex(options) {
  function onend (line 12654) | function onend() {
  function onEndNT (line 12664) | function onEndNT(self) {
  function forEach (line 12668) | function forEach(xs, f) {
  function PassThrough (line 12691) | function PassThrough(options) {
  function prependListener (line 12760) | function prependListener(emitter, event, fn) {
  function ReadableState (line 12773) | function ReadableState(options, stream) {
  function Readable (line 12843) | function Readable(options) {
  function readableAddChunk (line 12886) | function readableAddChunk(stream, state, chunk, encoding, addToFront) {
  function needMoreData (line 12941) | function needMoreData(state) {
  function computeNewHighWaterMark (line 12955) | function computeNewHighWaterMark(n) {
  function howMuchToRead (line 12974) | function howMuchToRead(n, state) {
  function chunkInvalid (line 13093) | function chunkInvalid(state, chunk) {
  function onEofChunk (line 13101) | function onEofChunk(stream, state) {
  function emitReadable (line 13119) | function emitReadable(stream) {
  function emitReadable_ (line 13129) | function emitReadable_(stream) {
  function maybeReadMore (line 13141) | function maybeReadMore(stream, state) {
  function maybeReadMore_ (line 13148) | function maybeReadMore_(stream, state) {
  function onunpipe (line 13192) | function onunpipe(readable) {
  function onend (line 13199) | function onend() {
  function cleanup (line 13212) | function cleanup() {
  function ondata (line 13240) | function ondata(chunk) {
  function onerror (line 13260) | function onerror(er) {
  function onclose (line 13271) | function onclose() {
  function onfinish (line 13276) | function onfinish() {
  function unpipe (line 13283) | function unpipe() {
  function pipeOnDrain (line 13300) | function pipeOnDrain(src) {
  function nReadingNextTick (line 13386) | function nReadingNextTick(self) {
  function resume (line 13403) | function resume(stream, state) {
  function resume_ (line 13410) | function resume_(stream, state) {
  function flow (line 13433) | function flow(stream) {
  function fromList (line 13509) | function fromList(n, state) {
  function fromListPartial (line 13529) | function fromListPartial(n, list, hasStrings) {
  function copyFromBufferString (line 13549) | function copyFromBufferString(n, list) {
  function copyFromBuffer (line 13578) | function copyFromBuffer(n, list) {
  function endReadable (line 13605) | function endReadable(stream) {
  function endReadableNT (line 13618) | function endReadableNT(state, stream) {
  function forEach (line 13627) | function forEach(xs, f) {
  function indexOf (line 13633) | function indexOf(xs, x) {
  function TransformState (line 13696) | function TransformState(stream) {
  function afterTransform (line 13708) | function afterTransform(stream, er, data) {
  function Transform (line 13730) | function Transform(options) {
  function done (line 13807) | function done(stream, er) {
  function nop (line 13870) | function nop() {}
  function WriteReq (line 13872) | function WriteReq(chunk, encoding, cb) {
  function WritableState (line 13880) | function WritableState(options, stream) {
  function Writable (line 13996) | function Writable(options) {
  function writeAfterEnd (line 14022) | function writeAfterEnd(stream, cb) {
  function validChunk (line 14034) | function validChunk(stream, state, chunk, cb) {
  function decodeChunk (line 14098) | function decodeChunk(state, chunk, encoding) {
  function writeOrBuffer (line 14108) | function writeOrBuffer(stream, state, chunk, encoding, cb) {
  function doWrite (line 14136) | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  function onwriteError (line 14145) | function onwriteError(stream, state, sync, er, cb) {
  function onwriteStateUpdate (line 14153) | function onwriteStateUpdate(state) {
  function onwrite (line 14160) | function onwrite(stream, er) {
  function afterWrite (line 14185) | function afterWrite(stream, state, finished, cb) {
  function onwriteDrain (line 14195) | function onwriteDrain(stream, state) {
  function clearBuffer (line 14203) | function clearBuffer(stream, state) {
  function needFinish (line 14290) | function needFinish(state) {
  function prefinish (line 14294) | function prefinish(stream, state) {
  function finishMaybe (line 14301) | function finishMaybe(stream, state) {
  function endWritable (line 14315) | function endWritable(stream, state, cb) {
  function CorkedRequest (line 14327) | function CorkedRequest(state) {
  function BufferList (line 14360) | function BufferList() {
  function Stream (line 14486) | function Stream() {
  function ondata (line 14493) | function ondata(chunk) {
  function ondrain (line 14503) | function ondrain() {
  function onend (line 14519) | function onend() {
  function onclose (line 14527) | function onclose() {
  function onerror (line 14535) | function onerror(er) {
  function cleanup (line 14546) | function cleanup() {
  function assertEncoding (line 14606) | function assertEncoding(encoding) {
  function passThroughWrite (line 14782) | function passThroughWrite(buffer) {
  function utf16DetectIncompleteChar (line 14786) | function utf16DetectIncompleteChar(buffer) {
  function base64DetectIncompleteChar (line 14791) | function base64DetectIncompleteChar(buffer) {
  function deprecate (line 14823) | function deprecate (fn, msg) {
  function config (line 14854) | function config (name) {
  function deprecated (line 14955) | function deprecated() {
  function inspect (line 15002) | function inspect(obj, opts) {
  function stylizeWithColor (line 15060) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 15072) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 15077) | function arrayToHash(array) {
  function formatValue (line 15088) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 15201) | function formatPrimitive(ctx, value) {
  function formatError (line 15220) | function formatError(value) {
  function formatArray (line 15225) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 15245) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 15304) | function reduceToSingleString(output, base, braces) {
  function isArray (line 15327) | function isArray(ar) {
  function isBoolean (line 15332) | function isBoolean(arg) {
  function isNull (line 15337) | function isNull(arg) {
  function isNullOrUndefined (line 15342) | function isNullOrUndefined(arg) {
  function isNumber (line 15347) | function isNumber(arg) {
  function isString (line 15352) | function isString(arg) {
  function isSymbol (line 15357) | function isSymbol(arg) {
  function isUndefined (line 15362) | function isUndefined(arg) {
  function isRegExp (line 15367) | function isRegExp(re) {
  function isObject (line 15372) | function isObject(arg) {
  function isDate (line 15377) | function isDate(d) {
  function isError (line 15382) | function isError(e) {
  function isFunction (line 15388) | function isFunction(arg) {
  function isPrimitive (line 15393) | function isPrimitive(arg) {
  function objectToString (line 15405) | function objectToString(o) {
  function pad (line 15410) | function pad(n) {
  function timestamp (line 15419) | function timestamp() {
  function hasOwnProperty (line 15461) | function hasOwnProperty(obj, prop) {

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/js/demo/demo.js
  function displayExifData (line 24) | function displayExifData (exif) {
  function updateResults (line 49) | function updateResults (img, data) {
  function displayImage (line 67) | function displayImage (file, options) {
  function dropChangeHandler (line 82) | function dropChangeHandler (e) {

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/js/load-image-scale.js
  function scaleUp (line 136) | function scaleUp () {
  function scaleDown (line 146) | function scaleDown () {

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/js/load-image.js
  function loadImage (line 20) | function loadImage (file, callback, options) {
  function revokeHelper (line 68) | function revokeHelper (img, options) {

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/js/vendor/jquery.Jcrop.js
  function px (line 42) | function px(n) {
  function cssClass (line 45) | function cssClass(cl) {
  function supportsColorFade (line 48) | function supportsColorFade() {
  function getPos (line 51) | function getPos(obj) //{{{
  function mouseAbs (line 57) | function mouseAbs(e) //{{{
  function setOptions (line 62) | function setOptions(opt) //{{{
  function startDragMode (line 72) | function startDragMode(mode, pos, touch) //{{{
  function dragmodeHandler (line 91) | function dragmodeHandler(mode, f) //{{{
  function createMover (line 130) | function createMover(pos) //{{{
  function oppLockCorner (line 143) | function oppLockCorner(ord) //{{{
  function createDragger (line 165) | function createDragger(ord) //{{{
  function presize (line 187) | function presize($obj, w, h) //{{{
  function unscale (line 204) | function unscale(c) //{{{
  function doneSelect (line 216) | function doneSelect(pos) //{{{
  function newSelection (line 228) | function newSelection(e) //{{{
  function selectDrag (line 251) | function selectDrag(pos) //{{{
  function newTracker (line 257) | function newTracker() //{{{
  function hasTouchSupport (line 400) | function hasTouchSupport() {
  function detectSupport (line 422) | function detectSupport() {
  function setPressed (line 464) | function setPressed(pos) //{{{
  function setCurrent (line 471) | function setCurrent(pos) //{{{
  function getOffset (line 480) | function getOffset() //{{{
  function moveOffset (line 485) | function moveOffset(offset) //{{{
  function getCorner (line 510) | function getCorner(ord) //{{{
  function getFixed (line 525) | function getFixed() //{{{
  function rebound (line 624) | function rebound(p) //{{{
  function flipCoords (line 635) | function flipCoords(x1, y1, x2, y2) //{{{
  function getRect (line 652) | function getRect() //{{{
  function makeObj (line 712) | function makeObj(a) //{{{
  function resizeShades (line 752) | function resizeShades(w,h) {
  function updateAuto (line 756) | function updateAuto()
  function updateShade (line 760) | function updateShade(c)
  function createShade (line 781) | function createShade() {
  function enableShade (line 787) | function enableShade() {
  function setBgColor (line 803) | function setBgColor(color,now) {
  function disableShade (line 806) | function disableShade() {
  function setOpacity (line 820) | function setOpacity(opacity,now) {
  function refreshAll (line 833) | function refreshAll() {
  function getShades (line 837) | function getShades() {
  function insertBorder (line 864) | function insertBorder(type) //{{{
  function dragDiv (line 874) | function dragDiv(ord, zi) //{{{
  function insertHandle (line 890) | function insertHandle(ord) //{{{
  function insertDragbar (line 903) | function insertDragbar(ord) //{{{
  function createDragbars (line 908) | function createDragbars(li) //{{{
  function createBorders (line 916) | function createBorders(li) //{{{
  function createHandles (line 930) | function createHandles(li) //{{{
  function moveto (line 938) | function moveto(x, y) //{{{
  function resize (line 952) | function resize(w, h) //{{{
  function refresh (line 957) | function refresh() //{{{
  function updateVisible (line 969) | function updateVisible(select) //{{{
  function update (line 976) | function update(select) //{{{
  function setBgOpacity (line 993) | function setBgOpacity(opacity,force,now) //{{{
  function show (line 1008) | function show() //{{{
  function release (line 1018) | function release() //{{{
  function showHandles (line 1030) | function showHandles() //{{{
  function enableHandles (line 1037) | function enableHandles() //{{{
  function disableHandles (line 1046) | function disableHandles() //{{{
  function animMode (line 1052) | function animMode(v) //{{{
  function done (line 1063) | function done() //{{{
  function toFront (line 1131) | function toFront(touch) //{{{
  function toBack (line 1148) | function toBack() //{{{
  function trackMove (line 1156) | function trackMove(e) //{{{
  function trackUp (line 1162) | function trackUp(e) //{{{
  function activateHandlers (line 1184) | function activateHandlers(move, done, touch) //{{{
  function trackTouchMove (line 1193) | function trackTouchMove(e) //{{{
  function trackTouchEnd (line 1199) | function trackTouchEnd(e) //{{{
  function setCursor (line 1204) | function setCursor(t) //{{{
  function watchKeys (line 1234) | function watchKeys() //{{{
  function onBlur (line 1242) | function onBlur(e) //{{{
  function doNudge (line 1247) | function doNudge(e, x, y) //{{{
  function parseKey (line 1257) | function parseKey(e) //{{{
  function setClass (line 1310) | function setClass(cname) //{{{
  function animateTo (line 1315) | function animateTo(a, callback) //{{{
  function setSelect (line 1376) | function setSelect(rect) //{{{
  function setSelectRaw (line 1383) | function setSelectRaw(l) //{{{
  function tellSelect (line 1390) | function tellSelect() //{{{
  function tellScaled (line 1395) | function tellScaled() //{{{
  function setOptionsNew (line 1400) | function setOptionsNew(opt) //{{{
  function disableCrop (line 1406) | function disableCrop() //{{{
  function enableCrop (line 1414) | function enableCrop() //{{{
  function cancelCrop (line 1420) | function cancelCrop() //{{{
  function destroy (line 1426) | function destroy() //{{{
  function setImage (line 1434) | function setImage(src, callback) //{{{
  function colorChangeMacro (line 1463) | function colorChangeMacro($obj,color,now) {
  function interfaceUpdate (line 1476) | function interfaceUpdate(alt) //{{{
  function completeCheck (line 1621) | function completeCheck(){

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/js/vendor/jquery.js
  function isArraylike (line 571) | function isArraylike( obj ) {
  function Sizzle (line 788) | function Sizzle( selector, context, results, seed ) {
  function createCache (line 902) | function createCache() {
  function markFunction (line 920) | function markFunction( fn ) {
  function assert (line 929) | function assert( fn ) {
  function addHandle (line 951) | function addHandle( attrs, handler ) {
  function siblingCheck (line 966) | function siblingCheck( a, b ) {
  function createInputPseudo (line 993) | function createInputPseudo( type ) {
  function createButtonPseudo (line 1004) | function createButtonPseudo( type ) {
  function createPositionalPseudo (line 1015) | function createPositionalPseudo( fn ) {
  function testContext (line 1038) | function testContext( context ) {
  function setFilters (line 2047) | function setFilters() {}
  function toSelector (line 2118) | function toSelector( tokens ) {
  function addCombinator (line 2128) | function addCombinator( matcher, combinator, base ) {
  function elementMatcher (line 2181) | function elementMatcher( matchers ) {
  function multipleContexts (line 2195) | function multipleContexts( selector, contexts, results ) {
  function condense (line 2204) | function condense( unmatched, map, filter, context, xml ) {
  function setMatcher (line 2225) | function setMatcher( preFilter, selector, matcher, postFilter, postFinde...
  function matcherFromTokens (line 2318) | function matcherFromTokens( tokens ) {
  function matcherFromGroupMatchers (line 2376) | function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
  function winnow (line 2672) | function winnow( elements, qualifier, not ) {
  function sibling (line 3002) | function sibling( cur, dir ) {
  function createOptions (line 3085) | function createOptions( options ) {
  function detach (line 3485) | function detach() {
  function completed (line 3499) | function completed() {
  function dataAttr (line 3662) | function dataAttr( elem, key, data ) {
  function isEmptyDataObject (line 3694) | function isEmptyDataObject( obj ) {
  function internalData (line 3710) | function internalData( elem, name, data, pvt /* Internal Use Only */ ) {
  function internalRemoveData (line 3799) | function internalRemoveData( elem, name, pvt ) {
  function returnTrue (line 4284) | function returnTrue() {
  function returnFalse (line 4288) | function returnFalse() {
  function safeActiveElement (line 4292) | function safeActiveElement() {
  function createSafeFragment (line 5301) | function createSafeFragment( document ) {
  function getAll (line 5353) | function getAll( context, tag ) {
  function fixDefaultChecked (line 5376) | function fixDefaultChecked( elem ) {
  function manipulationTarget (line 5384) | function manipulationTarget( elem, content ) {
  function disableScript (line 5394) | function disableScript( elem ) {
  function restoreScript (line 5398) | function restoreScript( elem ) {
  function setGlobalEval (line 5409) | function setGlobalEval( elems, refElements ) {
  function cloneCopyEvent (line 5417) | function cloneCopyEvent( src, dest ) {
  function fixCloneNodeIssues (line 5445) | function fixCloneNodeIssues( src, dest ) {
  function actualDisplay (line 6036) | function actualDisplay( name, doc ) {
  function defaultDisplay (line 6058) | function defaultDisplay( nodeName ) {
  function addGetHookIf (line 6257) | function addGetHookIf( conditionFn, hookFn ) {
  function computeStyleTests (line 6351) | function computeStyleTests() {
  function vendorPropName (line 6471) | function vendorPropName( style, name ) {
  function showHide (line 6493) | function showHide( elements, show ) {
  function setPositiveNumber (line 6544) | function setPositiveNumber( elem, value, subtract ) {
  function augmentWidthOrHeight (line 6552) | function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
  function getWidthOrHeight (line 6591) | function getWidthOrHeight( elem, name, extra ) {
  function Tween (line 6930) | function Tween( elem, options, prop, end, easing ) {
  function createFxNow (line 7099) | function createFxNow() {
  function genFx (line 7107) | function genFx( type, includeWidth ) {
  function createTween (line 7127) | function createTween( value, prop, animation ) {
  function defaultPrefilter (line 7141) | function defaultPrefilter( elem, props, opts ) {
  function propFilter (line 7283) | function propFilter( props, specialEasing ) {
  function Animation (line 7320) | function Animation( elem, properties, options ) {
  function addToPrefiltersOrTransports (line 8634) | function addToPrefiltersOrTransports( structure ) {
  function inspectPrefiltersOrTransports (line 8666) | function inspectPrefiltersOrTransports( structure, options, originalOpti...
  function ajaxExtend (line 8693) | function ajaxExtend( target, src ) {
  function ajaxHandleResponses (line 8713) | function ajaxHandleResponses( s, jqXHR, responses ) {
  function ajaxConvert (line 8768) | function ajaxConvert( s, response, jqXHR, isSuccess ) {
  function done (line 9228) | function done( status, nativeStatusText, responses, headers ) {
  function buildParams (line 9473) | function buildParams( prefix, obj, traditional, add ) {
  function createStandardXHR (line 9746) | function createStandardXHR() {
  function createActiveXHR (line 9752) | function createActiveXHR() {
  function getWindow (line 10057) | function getWindow( elem ) {

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/test/test.js
  function createBlob (line 45) | function createBlob (data, type) {

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/test/vendor/chai.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function Assertion (line 131) | function Assertion (obj, msg, stack) {
  function an (line 452) | function an (type, msg) {
  function includeChainingBehavior (line 490) | function includeChainingBehavior () {
  function include (line 494) | function include (val, msg) {
  function checkArguments (line 734) | function checkArguments () {
  function assertEqual (line 770) | function assertEqual (val, msg) {
  function assertEql (line 807) | function assertEql(obj, msg) {
  function assertAbove (line 846) | function assertAbove (n, msg) {
  function assertLeast (line 895) | function assertLeast (n, msg) {
  function assertBelow (line 944) | function assertBelow (n, msg) {
  function assertMost (line 993) | function assertMost (n, msg) {
  function assertInstanceOf (line 1081) | function assertInstanceOf (constructor, msg) {
  function assertOwnProperty (line 1222) | function assertOwnProperty (name, msg) {
  function assertOwnPropertyDescriptor (line 1255) | function assertOwnPropertyDescriptor (name, descriptor, msg) {
  function assertLengthChain (line 1324) | function assertLengthChain () {
  function assertLength (line 1328) | function assertLength (n, msg) {
  function assertMatch (line 1360) | function assertMatch(re, msg) {
  function assertKeys (line 1439) | function assertKeys (keys) {
  function assertThrows (line 1559) | function assertThrows (constructor, errMsg, msg) {
  function respondTo (line 1703) | function respondTo (method, msg) {
  function satisfy (line 1757) | function satisfy (matcher, msg) {
  function closeTo (line 1789) | function closeTo(expected, delta, msg) {
  function isSubsetOf (line 1808) | function isSubsetOf(subset, superset, cmp) {
  function oneOf (line 1891) | function oneOf (list, msg) {
  function assertChanges (line 1929) | function assertChanges (object, prop, msg) {
  function assertIncreases (line 1967) | function assertIncreases (object, prop, msg) {
  function assertDecreases (line 2005) | function assertDecreases (object, prop, msg) {
  function loadShould (line 3844) | function loadShould () {
  function parsePath (line 4518) | function parsePath (path) {
  function _getPathValue (line 4545) | function _getPathValue (parsed, obj, index) {
  function addProperty (line 4634) | function addProperty(property) {
  function inspect (line 4870) | function inspect(obj, showHidden, depth, colors) {
  function formatValue (line 4891) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 5031) | function formatPrimitive(ctx, value) {
  function formatError (line 5058) | function formatError(value) {
  function formatArray (line 5063) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 5083) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 5143) | function reduceToSingleString(output, base, braces) {
  function isArray (line 5163) | function isArray(ar) {
  function isRegExp (line 5168) | function isRegExp(re) {
  function isDate (line 5172) | function isDate(d) {
  function isError (line 5176) | function isError(e) {
  function objectToString (line 5180) | function objectToString(o) {
  function exclude (line 5496) | function exclude () {
  function AssertionError (line 5535) | function AssertionError (message, _props, ssf) {
  function deepEqual (line 5637) | function deepEqual(a, b, m) {
  function sameValue (line 5667) | function sameValue(a, b) {
  function typeEqual (line 5683) | function typeEqual(a, b) {
  function dateEqual (line 5696) | function dateEqual(a, b) {
  function regexpEqual (line 5710) | function regexpEqual(a, b) {
  function argumentsEqual (line 5726) | function argumentsEqual(a, b, m) {
  function enumerable (line 5740) | function enumerable(a) {
  function iterableEqual (line 5755) | function iterableEqual(a, b) {
  function bufferEqual (line 5780) | function bufferEqual(a, b) {
  function isValue (line 5793) | function isValue(a) {
  function objectEqual (line 5808) | function objectEqual(a, b, m) {
  function getType (line 5896) | function getType (obj) {
  function Library (line 5918) | function Library () {
  function getType (line 6031) | function getType(obj) {
  function Library (line 6055) | function Library() {

FILE: app_backend/static/plugin/JavaScript-Load-Image-2.12.2/test/vendor/mocha.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function timeslice (line 76) | function timeslice() {
  function isArray (line 214) | function isArray(val) {
  function EventEmitter (line 223) | function EventEmitter() {}
  function on (line 262) | function on() {
  function Progress (line 400) | function Progress() {
  function Context (line 542) | function Context() {}
  function Hook (line 657) | function Hook(title, fn) {
  function visit (line 989) | function visit(obj, file) {
  function image (line 1286) | function image(name) {
  function Mocha (line 1309) | function Mocha(options) {
  function done (line 1745) | function done(failures) {
  function parse (line 1796) | function parse(str) {
  function shortFormat (line 1838) | function shortFormat(ms) {
  function longFormat (line 1861) | function longFormat(ms) {
  function plural (line 1877) | function plural(ms, n, name) {
  function Pending (line 1900) | function Pending(message) {
  function Base (line 2144) | function Base(runner) {
  function pad (line 2250) | function pad(str, len) {
  function inlineDiff (line 2263) | function inlineDiff(err, escape) {
  function unifiedDiff (line 2297) | function unifiedDiff(err, escape) {
  function errorDiff (line 2338) | function errorDiff(err, type, escape) {
  function escapeInvisibles (line 2359) | function escapeInvisibles(line) {
  function colorLines (line 2373) | function colorLines(name, str) {
  function sameType (line 2392) | function sameType(a, b) {
  function Doc (line 2417) | function Doc(runner) {
  function Dot (line 2483) | function Dot(runner) {
  function HTML (line 2580) | function HTML(runner) {
  function makeUrl (line 2750) | function makeUrl(s) {
  function error (line 2802) | function error(msg) {
  function fragment (line 2811) | function fragment(html) {
  function hideSuitesWithout (line 2833) | function hideSuitesWithout(classname) {
  function unhide (line 2846) | function unhide() {
  function text (line 2859) | function text(el, contents) {
  function on (line 2870) | function on(el, event, fn) {
  function List (line 2919) | function List(runner) {
  function clean (line 2953) | function clean(test) {
  function JSONReporter (line 2983) | function JSONReporter(runner) {
  function clean (line 3031) | function clean(test) {
  function errorJSON (line 3048) | function errorJSON(err) {
  function Landing (line 3098) | function Landing(runner) {
  function List (line 3176) | function List(runner) {
  function Markdown (line 3245) | function Markdown(runner) {
  function Min (line 3340) | function Min(runner) {
  function NyanCat (line 3381) | function NyanCat(runner) {
  function draw (line 3451) | function draw(type, n) {
  function write (line 3619) | function write(string) {
  function Progress (line 3654) | function Progress(runner, options) {
  function Spec (line 3738) | function Spec(runner) {
  function TAP (line 3817) | function TAP(runner) {
  function title (line 3864) | function title(test) {
  function XUnit (line 3906) | function XUnit(runner, options) {
  function tag (line 4019) | function tag(name, attrs, close, content) {
  function Runnable (line 4085) | function Runnable(title, fn) {
  function multiple (line 4306) | function multiple(err) {
  function done (line 4315) | function done(err) {
  function callFn (line 4377) | function callFn(fn) {
  function callFnAsync (line 4400) | function callFnAsync(fn) {
  function Runner (line 4487) | function Runner(suite, delay) {
  function next (line 4709) | function next(i) {
  function next (line 4773) | function next(suite) {
  function hookErr (line 4879) | function hookErr(_, errSuite, after) {
  function next (line 4905) | function next(err, errSuite) {
  function next (line 5028) | function next(errSuite) {
  function done (line 5062) | function done(errSuite) {
  function cleanSuiteReferences (line 5172) | function cleanSuiteReferences(suite) {
  function uncaught (line 5221) | function uncaught(err) {
  function start (line 5225) | function start() {
  function filterOnly (line 5281) | function filterOnly(suite) {
  function hasOnly (line 5312) | function hasOnly(suite) {
  function filterLeaks (line 5324) | function filterLeaks(ok, globals) {
  function extraGlobals (line 5365) | function extraGlobals() {
  function Suite (line 5426) | function Suite(title, parentContext) {
  function Test (line 5807) | function Test(title, fn) {
  function pad (line 5846) | function pad(number) {
  function toISOString (line 5859) | function toISOString(date) {
  function ignored (line 6107) | function ignored(path) {
  function highlight (line 6211) | function highlight(js) {
  function emptyRepresentation (line 6250) | function emptyRepresentation(value, typeHint) {
  function jsonStringify (line 6354) | function jsonStringify(object, spaces, depth) {
  function withStack (line 6463) | function withStack(value, fn) {
  function isMochaInternal (line 6622) | function isMochaInternal(line) {
  function isNodeInternal (line 6629) | function isNodeInternal(line) {
  function init (line 6684) | function init () {
  function toByteArray (line 6697) | function toByteArray (b64) {
  function tripletToBase64 (line 6739) | function tripletToBase64 (num) {
  function encodeChunk (line 6743) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 6753) | function fromByteArray (uint8) {
  function BrowserStdout (line 6797) | function BrowserStdout(opts) {
  function typedArraySupport (line 6983) | function typedArraySupport () {
  function kMaxLength (line 6995) | function kMaxLength () {
  function createBuffer (line 7001) | function createBuffer (that, length) {
  function Buffer (line 7030) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 7055) | function from (that, value, encodingOrOffset, length) {
  function assertSize (line 7096) | function assertSize (size) {
  function alloc (line 7104) | function alloc (that, size, fill, encoding) {
  function allocUnsafe (line 7128) | function allocUnsafe (that, size) {
  function fromString (line 7152) | function fromString (that, string, encoding) {
  function fromArrayLike (line 7176) | function fromArrayLike (that, array) {
  function fromArrayBuffer (line 7185) | function fromArrayBuffer (that, array, byteOffset, length) {
  function fromObject (line 7215) | function fromObject (that, obj) {
  function checked (line 7245) | function checked (length) {
  function SlowBuffer (line 7255) | function SlowBuffer (length) {
  function byteLength (line 7338) | function byteLength (string, encoding) {
  function slowToString (line 7383) | function slowToString (encoding, start, end) {
  function swap (line 7457) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 7591) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 7648) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 7716) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 7743) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 7747) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 7751) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 7755) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 7759) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 7842) | function base64Slice (buf, start, end) {
  function utf8Slice (line 7850) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 7928) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 7946) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 7956) | function latin1Slice (buf, start, end) {
  function hexSlice (line 7966) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 7979) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 8027) | function checkOffset (offset, ext, length) {
  function checkInt (line 8188) | function checkInt (buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 8241) | function objectWriteUInt16 (buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 8275) | function objectWriteUInt32 (buf, value, offset, littleEndian) {
  function checkIEEE754 (line 8425) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 8430) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 8446) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 8579) | function base64clean (str) {
  function stringtrim (line 8591) | function stringtrim (str) {
  function toHex (line 8596) | function toHex (n) {
  function utf8ToBytes (line 8601) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 8681) | function asciiToBytes (str) {
  function utf16leToBytes (line 8690) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 8706) | function base64ToBytes (str) {
  function blitBuffer (line 8710) | function blitBuffer (src, dst, offset, length) {
  function isnan (line 8718) | function isnan (val) {
  function isArray (line 8749) | function isArray(arg) {
  function isBoolean (line 8757) | function isBoolean(arg) {
  function isNull (line 8762) | function isNull(arg) {
  function isNullOrUndefined (line 8767) | function isNullOrUndefined(arg) {
  function isNumber (line 8772) | function isNumber(arg) {
  function isString (line 8777) | function isString(arg) {
  function isSymbol (line 8782) | function isSymbol(arg) {
  function isUndefined (line 8787) | function isUndefined(arg) {
  function isRegExp (line 8792) | function isRegExp(re) {
  function isObject (line 8797) | function isObject(arg) {
  function isDate (line 8802) | function isDate(d) {
  function isError (line 8807) | function isError(e) {
  function isFunction (line 8812) | function isFunction(arg) {
  function isPrimitive (line 8817) | function isPrimitive(arg) {
  function objectToString (line 8829) | function objectToString(o) {
  function map (line 8855) | function map(arr, mapper, that) {
  function clonePath (line 8867) | function clonePath(path) {
  function removeEmpty (line 8870) | function removeEmpty(array) {
  function escapeHTML (line 8879) | function escapeHTML(s) {
  function canonicalize (line 8891) | function canonicalize(obj, stack, replacementStack) {
  function buildValues (line 8936) | function buildValues(components, newString, oldString, useLongestToken) {
  function Diff (line 8980) | function Diff(ignoreWhitespace) {
  function done (line 8987) | function done(value) {
  function execEditLength (line 9023) | function execEditLength() {
  function contextLines (line 9250) | function contextLines(lines) {
  function eofNL (line 9255) | function eofNL(curRange, i, current) {
  function EventEmitter (line 9490) | function EventEmitter() {
  function g (line 9628) | function g() {
  function isFunction (line 9756) | function isFunction(arg) {
  function isNumber (line 9760) | function isNumber(arg) {
  function isObject (line 9764) | function isObject(arg) {
  function isUndefined (line 9768) | function isUndefined(arg) {
  function which (line 9788) | function which(name) {
  function growl (line 9937) | function growl(msg, options, fn) {
  function isBuffer (line 10191) | function isBuffer (obj) {
  function isSlowBuffer (line 10196) | function isSlowBuffer (obj) {
  function runInContext (line 10237) | function runInContext(context, exports) {
  function baseAssign (line 11134) | function baseAssign(object, source) {
  function baseCopy (line 11161) | function baseCopy(source, props, object) {
  function object (line 11195) | function object() {}
  function isObject (line 11226) | function isObject(value) {
  function isObjectLike (line 11258) | function isObjectLike(value) {
  function getNative (line 11291) | function getNative(object, key) {
  function isFunction (line 11312) | function isFunction(value) {
  function isObject (line 11339) | function isObject(value) {
  function isNative (line 11362) | function isNative(value) {
  function baseProperty (line 11400) | function baseProperty(key) {
  function isArrayLike (line 11425) | function isArrayLike(value) {
  function isIndex (line 11437) | function isIndex(value, length) {
  function isIterateeCall (line 11452) | function isIterateeCall(value, index, object) {
  function isLength (line 11475) | function isLength(value) {
  function isObject (line 11499) | function isObject(value) {
  function create (line 11555) | function create(prototype, properties, guard) {
  function isArguments (line 11617) | function isArguments(value) {
  function isArrayLike (line 11648) | function isArrayLike(value) {
  function isArrayLikeObject (line 11677) | function isArrayLikeObject(value) {
  function isFunction (line 11698) | function isFunction(value) {
  function isLength (line 11731) | function isLength(value) {
  function isObject (line 11761) | function isObject(value) {
  function isObjectLike (line 11790) | function isObjectLike(value) {
  function isObjectLike (line 11820) | function isObjectLike(value) {
  function getNative (line 11862) | function getNative(object, key) {
  function isLength (line 11876) | function isLength(value) {
  function isFunction (line 11916) | function isFunction(value) {
  function isObject (line 11943) | function isObject(value) {
  function isNative (line 11966) | function isNative(value) {
  function baseProperty (line 12016) | function baseProperty(key) {
  function isArrayLike (line 12041) | function isArrayLike(value) {
  function isIndex (line 12053) | function isIndex(value, length) {
  function isLength (line 12068) | function isLength(value) {
  function shimKeys (line 12080) | function shimKeys(object) {
  function isObject (line 12120) | function isObject(value) {
  function keysIn (line 12185) | function keysIn(object) {
  function mkdirP (line 12224) | function mkdirP (p, opts, f, made) {
  function nextTick (line 12377) | function nextTick(fn, arg1, arg2, arg3) {
  function defaultSetTimout (line 12424) | function defaultSetTimout() {
  function defaultClearTimeout (line 12427) | function defaultClearTimeout () {
  function runTimeout (line 12450) | function runTimeout(fun) {
  function runClearTimeout (line 12475) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 12507) | function cleanUpNextTick() {
  function drainQueue (line 12522) | function drainQueue() {
  function Item (line 12560) | function Item(fun, array) {
  function noop (line 12574) | function noop() {}
  function Duplex (line 12637) | function Duplex(options) {
  function onend (line 12654) | function onend() {
  function onEndNT (line 12664) | function onEndNT(self) {
  function forEach (line 12668) | function forEach(xs, f) {
  function PassThrough (line 12691) | function PassThrough(options) {
  function prependListener (line 12760) | function prependListener(emitter, event, fn) {
  function ReadableState (line 12773) | function ReadableState(options, stream) {
  function Readable (line 12843) | function Readable(options) {
  function readableAddChunk (line 12886) | function readableAddChunk(stream, state, chunk, encoding, addToFront) {
  function needMoreData (line 12941) | function needMoreData(state) {
  function computeNewHighWaterMark (line 12955) | function computeNewHighWaterMark(n) {
  function howMuchToRead (line 12974) | function howMuchToRead(n, state) {
  function chunkInvalid (line 13093) | function chunkInvalid(state, chunk) {
  function onEofChunk (line 13101) | function onEofChunk(stream, state) {
  function emitReadable (line 13119) | function emitReadable(stream) {
  function emitReadable_ (line 13129) | function emitReadable_(stream) {
  function maybeReadMore (line 13141) | function maybeReadMore(stream, state) {
  function maybeReadMore_ (line 13148) | function maybeReadMore_(stream, state) {
  function onunpipe (line 13192) | function onunpipe(readable) {
  function onend (line 13199) | function onend() {
  function cleanup (line 13212) | function cleanup() {
  function ondata (line 13240) | function ondata(chunk) {
  function onerror (line 13260) | function onerror(er) {
  function onclose (line 13271) | function onclose() {
  function onfinish (line 13276) | function onfinish() {
  function unpipe (line 13283) | function unpipe() {
  function pipeOnDrain (line 13300) | function pipeOnDrain(src) {
  function nReadingNextTick (line 13386) | function nReadingNextTick(self) {
  function resume (line 13403) | function resume(stream, state) {
  function resume_ (line 13410) | function resume_(stream, state) {
  function flow (line 13433) | function flow(stream) {
  function fromList (line 13509) | function fromList(n, state) {
  function fromListPartial (line 13529) | function fromListPartial(n, list, hasStrings) {
  function copyFromBufferString (line 13549) | function copyFromBufferString(n, list) {
  function copyFromBuffer (line 13578) | function copyFromBuffer(n, list) {
  function endReadable (line 13605) | function endReadable(stream) {
  function endReadableNT (line 13618) | function endReadableNT(state, stream) {
  function forEach (line 13627) | function forEach(xs, f) {
  function indexOf (line 13633) | function indexOf(xs, x) {
  function TransformState (line 13696) | function TransformState(stream) {
  function afterTransform (line 13708) | function afterTransform(stream, er, data) {
  function Transform (line 13730) | function Transform(options) {
  function done (line 13807) | function done(stream, er) {
  function nop (line 13870) | function nop() {}
  function WriteReq (line 13872) | function WriteReq(chunk, encoding, cb) {
  function WritableState (line 13880) | function WritableState(options, stream) {
  function Writable (line 13996) | function Writable(options) {
  function writeAfterEnd (line 14022) | function writeAfterEnd(stream, cb) {
  function validChunk (line 14034) | function validChunk(stream, state, chunk, cb) {
  function decodeChunk (line 14098) | function decodeChunk(state, chunk, encoding) {
  function writeOrBuffer (line 14108) | function writeOrBuffer(stream, state, chunk, encoding, cb) {
  function doWrite (line 14136) | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  function onwriteError (line 14145) | function onwriteError(stream, state, sync, er, cb) {
  function onwriteStateUpdate (line 14153) | function onwriteStateUpdate(state) {
  function onwrite (line 14160) | function onwrite(stream, er) {
  function afterWrite (line 14185) | function afterWrite(stream, state, finished, cb) {
  function onwriteDrain (line 14195) | function onwriteDrain(stream, state) {
  function clearBuffer (line 14203) | function clearBuffer(stream, state) {
  function needFinish (line 14290) | function needFinish(state) {
  function prefinish (line 14294) | function prefinish(stream, state) {
  function finishMaybe (line 14301) | function finishMaybe(stream, state) {
  function endWritable (line 14315) | function endWritable(stream, state, cb) {
  function CorkedRequest (line 14327) | function CorkedRequest(state) {
  function BufferList (line 14360) | function BufferList() {
  function Stream (line 14486) | function Stream() {
  function ondata (line 14493) | function ondata(chunk) {
  function ondrain (line 14503) | function ondrain() {
  function onend (line 14519) | function onend() {
  function onclose (line 14527) | function onclose() {
  function onerror (line 14535) | function onerror(er) {
  function cleanup (line 14546) | function cleanup() {
  function assertEncoding (line 14606) | function assertEncoding(encoding) {
  function passThroughWrite (line 14782) | function passThroughWrite(buffer) {
  function utf16DetectIncompleteChar (line 14786) | function utf16DetectIncompleteChar(buffer) {
  function base64DetectIncompleteChar (line 14791) | function base64DetectIncompleteChar(buffer) {
  function deprecate (line 14823) | function deprecate (fn, msg) {
  function config (line 14854) | function config (name) {
  function deprecated (line 14955) | function deprecated() {
  function inspect (line 15002) | function inspect(obj, opts) {
  function stylizeWithColor (line 15060) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 15072) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 15077) | function arrayToHash(array) {
  function formatValue (line 15088) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 15201) | function formatPrimitive(ctx, value) {
  function formatError (line 15220) | function formatError(value) {
  function formatArray (line 15225) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 15245) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 15304) | function reduceToSingleString(output, base, braces) {
  function isArray (line 15327) | function isArray(ar) {
  function isBoolean (line 15332) | function isBoolean(arg) {
  function isNull (line 15337) | function isNull(arg) {
  function isNullOrUndefined (line 15342) | function isNullOrUndefined(arg) {
  function isNumber (line 15347) | function isNumber(arg) {
  function isString (line 15352) | function isString(arg) {
  function isSymbol (line 15357) | function isSymbol(arg) {
  function isUndefined (line 15362) | function isUndefined(arg) {
  function isRegExp (line 15367) | function isRegExp(re) {
  function isObject (line 15372) | function isObject(arg) {
  function isDate (line 15377) | function isDate(d) {
  function isError (line 15382) | function isError(e) {
  function isFunction (line 15388) | function isFunction(arg) {
  function isPrimitive (line 15393) | function isPrimitive(arg) {
  function objectToString (line 15405) | function objectToString(o) {
  function pad (line 15410) | function pad(n) {
  function timestamp (line 15419) | function timestamp() {
  function hasOwnProperty (line 15461) | function hasOwnProperty(obj, prop) {

FILE: app_backend/static/plugin/JavaScript-Templates-3.8.0/js/demo/demo.js
  function renderError (line 23) | function renderError (title, error) {
  function render (line 30) | function render (event) {
  function empty (line 49) | function empty (node) {
  function init (line 55) | function init (event) {

FILE: app_backend/static/plugin/JavaScript-Templates-3.8.0/test/vendor/chai.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function Assertion (line 131) | function Assertion (obj, msg, stack) {
  function an (line 452) | function an (type, msg) {
  function includeChainingBehavior (line 490) | function includeChainingBehavior () {
  function include (line 494) | function include (val, msg) {
  function checkArguments (line 734) | function checkArguments () {
  function assertEqual (line 770) | function assertEqual (val, msg) {
  function assertEql (line 807) | function assertEql(obj, msg) {
  function assertAbove (line 846) | function assertAbove (n, msg) {
  function assertLeast (line 895) | function assertLeast (n, msg) {
  function assertBelow (line 944) | function assertBelow (n, msg) {
  function assertMost (line 993) | function assertMost (n, msg) {
  function assertInstanceOf (line 1081) | function assertInstanceOf (constructor, msg) {
  function assertOwnProperty (line 1222) | function assertOwnProperty (name, msg) {
  function assertOwnPropertyDescriptor (line 1255) | function assertOwnPropertyDescriptor (name, descriptor, msg) {
  function assertLengthChain (line 1324) | function assertLengthChain () {
  function assertLength (line 1328) | function assertLength (n, msg) {
  function assertMatch (line 1360) | function assertMatch(re, msg) {
  function assertKeys (line 1439) | function assertKeys (keys) {
  function assertThrows (line 1559) | function assertThrows (constructor, errMsg, msg) {
  function respondTo (line 1703) | function respondTo (method, msg) {
  function satisfy (line 1757) | function satisfy (matcher, msg) {
  function closeTo (line 1789) | function closeTo(expected, delta, msg) {
  function isSubsetOf (line 1808) | function isSubsetOf(subset, superset, cmp) {
  function oneOf (line 1891) | function oneOf (list, msg) {
  function assertChanges (line 1929) | function assertChanges (object, prop, msg) {
  function assertIncreases (line 1967) | function assertIncreases (object, prop, msg) {
  function assertDecreases (line 2005) | function assertDecreases (object, prop, msg) {
  function loadShould (line 3844) | function loadShould () {
  function parsePath (line 4518) | function parsePath (path) {
  function _getPathValue (line 4545) | function _getPathValue (parsed, obj, index) {
  function addProperty (line 4634) | function addProperty(property) {
  function inspect (line 4870) | function inspect(obj, showHidden, depth, colors) {
  function formatValue (line 4891) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 5031) | function formatPrimitive(ctx, value) {
  function formatError (line 5058) | function formatError(value) {
  function formatArray (line 5063) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 5083) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 5143) | function reduceToSingleString(output, base, braces) {
  function isArray (line 5163) | function isArray(ar) {
  function isRegExp (line 5168) | function isRegExp(re) {
  function isDate (line 5172) | function isDate(d) {
  function isError (line 5176) | function isError(e) {
  function objectToString (line 5180) | function objectToString(o) {
  function exclude (line 5496) | function exclude () {
  function AssertionError (line 5535) | function AssertionError (message, _props, ssf) {
  function deepEqual (line 5637) | function deepEqual(a, b, m) {
  function sameValue (line 5667) | function sameValue(a, b) {
  function typeEqual (line 5683) | function typeEqual(a, b) {
  function dateEqual (line 5696) | function dateEqual(a, b) {
  function regexpEqual (line 5710) | function regexpEqual(a, b) {
  function argumentsEqual (line 5726) | function argumentsEqual(a, b, m) {
  function enumerable (line 5740) | function enumerable(a) {
  function iterableEqual (line 5755) | function iterableEqual(a, b) {
  function bufferEqual (line 5780) | function bufferEqual(a, b) {
  function isValue (line 5793) | function isValue(a) {
  function objectEqual (line 5808) | function objectEqual(a, b, m) {
  function getType (line 5896) | function getType (obj) {
  function Library (line 5918) | function Library () {
  function getType (line 6031) | function getType(obj) {
  function Library (line 6055) | function Library() {

FILE: app_backend/static/plugin/JavaScript-Templates-3.8.0/test/vendor/mocha.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function timeslice (line 76) | function timeslice() {
  function isArray (line 214) | function isArray(val) {
  function EventEmitter (line 223) | function EventEmitter() {}
  function on (line 262) | function on() {
  function Progress (line 400) | function Progress() {
  function Context (line 542) | function Context() {}
  function Hook (line 657) | function Hook(title, fn) {
  function visit (line 989) | function visit(obj, file) {
  function image (line 1286) | function image(name) {
  function Mocha (line 1309) | function Mocha(options) {
  function done (line 1745) | function done(failures) {
  function parse (line 1796) | function parse(str) {
  function shortFormat (line 1838) | function shortFormat(ms) {
  function longFormat (line 1861) | function longFormat(ms) {
  function plural (line 1877) | function plural(ms, n, name) {
  function Pending (line 1900) | function Pending(message) {
  function Base (line 2144) | function Base(runner) {
  function pad (line 2250) | function pad(str, len) {
  function inlineDiff (line 2263) | function inlineDiff(err, escape) {
  function unifiedDiff (line 2297) | function unifiedDiff(err, escape) {
  function errorDiff (line 2338) | function errorDiff(err, type, escape) {
  function escapeInvisibles (line 2359) | function escapeInvisibles(line) {
  function colorLines (line 2373) | function colorLines(name, str) {
  function sameType (line 2392) | function sameType(a, b) {
  function Doc (line 2417) | function Doc(runner) {
  function Dot (line 2483) | function Dot(runner) {
  function HTML (line 2580) | function HTML(runner) {
  function makeUrl (line 2750) | function makeUrl(s) {
  function error (line 2802) | function error(msg) {
  function fragment (line 2811) | function fragment(html) {
  function hideSuitesWithout (line 2833) | function hideSuitesWithout(classname) {
  function unhide (line 2846) | function unhide() {
  function text (line 2859) | function text(el, contents) {
  function on (line 2870) | function on(el, event, fn) {
  function List (line 2919) | function List(runner) {
  function clean (line 2953) | function clean(test) {
  function JSONReporter (line 2983) | function JSONReporter(runner) {
  function clean (line 3031) | function clean(test) {
  function errorJSON (line 3048) | function errorJSON(err) {
  function Landing (line 3098) | function Landing(runner) {
  function List (line 3176) | function List(runner) {
  function Markdown (line 3245) | function Markdown(runner) {
  function Min (line 3340) | function Min(runner) {
  function NyanCat (line 3381) | function NyanCat(runner) {
  function draw (line 3451) | function draw(type, n) {
  function write (line 3619) | function write(string) {
  function Progress (line 3654) | function Progress(runner, options) {
  function Spec (line 3738) | function Spec(runner) {
  function TAP (line 3817) | function TAP(runner) {
  function title (line 3864) | function title(test) {
  function XUnit (line 3906) | function XUnit(runner, options) {
  function tag (line 4019) | function tag(name, attrs, close, content) {
  function Runnable (line 4085) | function Runnable(title, fn) {
  function multiple (line 4306) | function multiple(err) {
  function done (line 4315) | function done(err) {
  function callFn (line 4377) | function callFn(fn) {
  function callFnAsync (line 4400) | function callFnAsync(fn) {
  function Runner (line 4487) | function Runner(suite, delay) {
  function next (line 4709) | function next(i) {
  function next (line 4773) | function next(suite) {
  function hookErr (line 4879) | function hookErr(_, errSuite, after) {
  function next (line 4905) | function next(err, errSuite) {
  function next (line 5028) | function next(errSuite) {
  function done (line 5062) | function done(errSuite) {
  function cleanSuiteReferences (line 5172) | function cleanSuiteReferences(suite) {
  function uncaught (line 5221) | function uncaught(err) {
  function start (line 5225) | function start() {
  function filterOnly (line 5281) | function filterOnly(suite) {
  function hasOnly (line 5312) | function hasOnly(suite) {
  function filterLeaks (line 5324) | function filterLeaks(ok, globals) {
  function extraGlobals (line 5365) | function extraGlobals() {
  function Suite (line 5426) | function Suite(title, parentContext) {
  function Test (line 5807) | function Test(title, fn) {
  function pad (line 5846) | function pad(number) {
  function toISOString (line 5859) | function toISOString(date) {
  function ignored (line 6107) | function ignored(path) {
  function highlight (line 6211) | function highlight(js) {
  function emptyRepresentation (line 6250) | function emptyRepresentation(value, typeHint) {
  function jsonStringify (line 6354) | function jsonStringify(object, spaces, depth) {
  function withStack (line 6463) | function withStack(value, fn) {
  function isMochaInternal (line 6622) | function isMochaInternal(line) {
  function isNodeInternal (line 6629) | function isNodeInternal(line) {
  function init (line 6684) | function init () {
  function toByteArray (line 6697) | function toByteArray (b64) {
  function tripletToBase64 (line 6739) | function tripletToBase64 (num) {
  function encodeChunk (line 6743) | function encodeChunk (uint8, start, end) {
  function fromByteArray (line 6753) | function fromByteArray (uint8) {
  function BrowserStdout (line 6797) | function BrowserStdout(opts) {
  function typedArraySupport (line 6983) | function typedArraySupport () {
  function kMaxLength (line 6995) | function kMaxLength () {
  function createBuffer (line 7001) | function createBuffer (that, length) {
  function Buffer (line 7030) | function Buffer (arg, encodingOrOffset, length) {
  function from (line 7055) | function from (that, value, encodingOrOffset, length) {
  function assertSize (line 7096) | function assertSize (size) {
  function alloc (line 7104) | function alloc (that, size, fill, encoding) {
  function allocUnsafe (line 7128) | function allocUnsafe (that, size) {
  function fromString (line 7152) | function fromString (that, string, encoding) {
  function fromArrayLike (line 7176) | function fromArrayLike (that, array) {
  function fromArrayBuffer (line 7185) | function fromArrayBuffer (that, array, byteOffset, length) {
  function fromObject (line 7215) | function fromObject (that, obj) {
  function checked (line 7245) | function checked (length) {
  function SlowBuffer (line 7255) | function SlowBuffer (length) {
  function byteLength (line 7338) | function byteLength (string, encoding) {
  function slowToString (line 7383) | function slowToString (encoding, start, end) {
  function swap (line 7457) | function swap (b, n, m) {
  function bidirectionalIndexOf (line 7591) | function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
  function arrayIndexOf (line 7648) | function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
  function hexWrite (line 7716) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 7743) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 7747) | function asciiWrite (buf, string, offset, length) {
  function latin1Write (line 7751) | function latin1Write (buf, string, offset, length) {
  function base64Write (line 7755) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 7759) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 7842) | function base64Slice (buf, start, end) {
  function utf8Slice (line 7850) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 7928) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 7946) | function asciiSlice (buf, start, end) {
  function latin1Slice (line 7956) | function latin1Slice (buf, start, end) {
  function hexSlice (line 7966) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 7979) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 8027) | function checkOffset (offset, ext, length) {
  function checkInt (line 8188) | function checkInt (buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 8241) | function objectWriteUInt16 (buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 8275) | function objectWriteUInt32 (buf, value, offset, littleEndian) {
  function checkIEEE754 (line 8425) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 8430) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 8446) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 8579) | function base64clean (str) {
  function stringtrim (line 8591) | function stringtrim (str) {
  function toHex (line 8596) | function toHex (n) {
  function utf8ToBytes (line 8601) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 8681) | function asciiToBytes (str) {
  function utf16leToBytes (line 8690) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 8706) | function base64ToBytes (str) {
  function blitBuffer (line 8710) | function blitBuffer (src, dst, offset, length) {
  function isnan (line 8718) | function isnan (val) {
  function isArray (line 8749) | function isArray(arg) {
  function isBoolean (line 8757) | function isBoolean(arg) {
  function isNull (line 8762) | function isNull(arg) {
  function isNullOrUndefined (line 8767) | function isNullOrUndefined(arg) {
  function isNumber (line 8772) | function isNumber(arg) {
  function isString (line 8777) | function isString(arg) {
  function isSymbol (line 8782) | function isSymbol(arg) {
  function isUndefined (line 8787) | function isUndefined(arg) {
  function isRegExp (line 8792) | function isRegExp(re) {
  function isObject (line 8797) | function isObject(arg) {
  function isDate (line 8802) | function isDate(d) {
  function isError (line 8807) | function isError(e) {
  function isFunction (line 8812) | function isFunction(arg) {
  function isPrimitive (line 8817) | function isPrimitive(arg) {
  function objectToString (line 8829) | function objectToString(o) {
  function map (line 8855) | function map(arr, mapper, that) {
  function clonePath (line 8867) | function clonePath(path) {
  function removeEmpty (line 8870) | function removeEmpty(array) {
  function escapeHTML (line 8879) | function escapeHTML(s) {
  function canonicalize (line 8891) | function canonicalize(obj, stack, replacementStack) {
  function buildValues (line 8936) | function buildValues(components, newString, oldString, useLongestToken) {
  function Diff (line 8980) | function Diff(ignoreWhitespace) {
  function done (line 8987) | function done(value) {
  function execEditLength (line 9023) | function execEditLength() {
  function contextLines (line 9250) | function contextLines(lines) {
  function eofNL (line 9255) | function eofNL(curRange, i, current) {
  function EventEmitter (line 9490) | function EventEmitter() {
  function g (line 9628) | function g() {
  function isFunction (line 9756) | function isFunction(arg) {
  function isNumber (line 9760) | function isNumber(arg) {
  function isObject (line 9764) | function isObject(arg) {
  function isUndefined (line 9768) | function isUndefined(arg) {
  function which (line 9788) | function which(name) {
  function growl (line 9937) | function growl(msg, options, fn) {
  function isBuffer (line 10191) | function isBuffer (obj) {
  function isSlowBuffer (line 10196) | function isSlowBuffer (obj) {
  function runInContext (line 10237) | function runInContext(context, exports) {
  function baseAssign (line 11134) | function baseAssign(object, source) {
  function baseCopy (line 11161) | function baseCopy(source, props, object) {
  function object (line 11195) | function object() {}
  function isObject (line 11226) | function isObject(value) {
  function isObjectLike (line 11258) | function isObjectLike(value) {
  function getNative (line 11291) | function getNative(object, key) {
  function isFunction (line 11312) | function isFunction(value) {
  function isObject (line 11339) | function isObject(value) {
  function isNative (line 11362) | function isNative(value) {
  function baseProperty (line 11400) | function baseProperty(key) {
  function isArrayLike (line 11425) | function isArrayLike(value) {
  function isIndex (line 11437) | function isIndex(value, length) {
  function isIterateeCall (line 11452) | function isIterateeCall(value, index, object) {
  function isLength (line 11475) | function isLength(value) {
  function isObject (line 11499) | function isObject(value) {
  function create (line 11555) | function create(prototype, properties, guard) {
  function isArguments (line 11617) | function isArguments(value) {
  function isArrayLike (line 11648) | function isArrayLike(value) {
  function isArrayLikeObject (line 11677) | function isArrayLikeObject(value) {
  function isFunction (line 11698) | function isFunction(value) {
  function isLength (line 11731) | function isLength(value) {
  function isObject (line 11761) | function isObject(value) {
  function isObjectLike (line 11790) | function isObjectLike(value) {
  function isObjectLike (line 11820) | function isObjectLike(value) {
  function getNative (line 11862) | function getNative(object, key) {
  function isLength (line 11876) | function isLength(value) {
  function isFunction (line 11916) | function isFunction(value) {
  function isObject (line 11943) | function isObject(value) {
  function isNative (line 11966) | function isNative(value) {
  function baseProperty (line 12016) | function baseProperty(key) {
  function isArrayLike (line 12041) | function isArrayLike(value) {
  function isIndex (line 12053) | function isIndex(value, length) {
  function isLength (line 12068) | function isLength(value) {
  function shimKeys (line 12080) | function shimKeys(object) {
  function isObject (line 12120) | function isObject(value) {
  function keysIn (line 12185) | function keysIn(object) {
  function mkdirP (line 12224) | function mkdirP (p, opts, f, made) {
  function nextTick (line 12377) | function nextTick(fn, arg1, arg2, arg3) {
  function defaultSetTimout (line 12424) | function defaultSetTimout() {
  function defaultClearTimeout (line 12427) | function defaultClearTimeout () {
  function runTimeout (line 12450) | function runTimeout(fun) {
  function runClearTimeout (line 12475) | function runClearTimeout(marker) {
  function cleanUpNextTick (line 12507) | function cleanUpNextTick() {
  function drainQueue (line 12522) | function drainQueue() {
  function Item (line 12560) | function Item(fun, array) {
  function noop (line 12574) | function noop() {}
  function Duplex (line 12637) | function Duplex(options) {
  function onend (line 12654) | function onend() {
  function onEndNT (line 12664) | function onEndNT(self) {
  function forEach (line 12668) | function forEach(xs, f) {
  function PassThrough (line 12691) | function PassThrough(options) {
  function prependListener (line 12760) | function prependListener(emitter, event, fn) {
  function ReadableState (line 12773) | function ReadableState(options, stream) {
  function Readable (line 12843) | function Readable(options) {
  function readableAddChunk (line 12886) | function readableAddChunk(stream, state, chunk, encoding, addToFront) {
  function needMoreData (line 12941) | function needMoreData(state) {
  function computeNewHighWaterMark (line 12955) | function computeNewHighWaterMark(n) {
  function howMuchToRead (line 12974) | function howMuchToRead(n, state) {
  function chunkInvalid (line 13093) | function chunkInvalid(state, chunk) {
  function onEofChunk (line 13101) | function onEofChunk(stream, state) {
  function emitReadable (line 13119) | function emitReadable(stream) {
  function emitReadable_ (line 13129) | function emitReadable_(stream) {
  function maybeReadMore (line 13141) | function maybeReadMore(stream, state) {
  function maybeReadMore_ (line 13148) | function maybeReadMore_(stream, state) {
  function onunpipe (line 13192) | function onunpipe(readable) {
  function onend (line 13199) | function onend() {
  function cleanup (line 13212) | function cleanup() {
  function ondata (line 13240) | function ondata(chunk) {
  function onerror (line 13260) | function onerror(er) {
  function onclose (line 13271) | function onclose() {
  function onfinish (line 13276) | function onfinish() {
  function unpipe (line 13283) | function unpipe() {
  function pipeOnDrain (line 13300) | function pipeOnDrain(src) {
  function nReadingNextTick (line 13386) | function nReadingNextTick(self) {
  function resume (line 13403) | function resume(stream, state) {
  function resume_ (line 13410) | function resume_(stream, state) {
  function flow (line 13433) | function flow(stream) {
  function fromList (line 13509) | function fromList(n, state) {
  function fromListPartial (line 13529) | function fromListPartial(n, list, hasStrings) {
  function copyFromBufferString (line 13549) | function copyFromBufferString(n, list) {
  function copyFromBuffer (line 13578) | function copyFromBuffer(n, list) {
  function endReadable (line 13605) | function endReadable(stream) {
  function endReadableNT (line 13618) | function endReadableNT(state, stream) {
  function forEach (line 13627) | function forEach(xs, f) {
  function indexOf (line 13633) | function indexOf(xs, x) {
  function TransformState (line 13696) | function TransformState(stream) {
  function afterTransform (line 13708) | function afterTransform(stream, er, data) {
  function Transform (line 13730) | function Transform(options) {
  function done (line 13807) | function done(stream, er) {
  function nop (line 13870) | function nop() {}
  function WriteReq (line 13872) | function WriteReq(chunk, encoding, cb) {
  function WritableState (line 13880) | function WritableState(options, stream) {
  function Writable (line 13996) | function Writable(options) {
  function writeAfterEnd (line 14022) | function writeAfterEnd(stream, cb) {
  function validChunk (line 14034) | function validChunk(stream, state, chunk, cb) {
  function decodeChunk (line 14098) | function decodeChunk(state, chunk, encoding) {
  function writeOrBuffer (line 14108) | function writeOrBuffer(stream, state, chunk, encoding, cb) {
  function doWrite (line 14136) | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  function onwriteError (line 14145) | function onwriteError(stream, state, sync, er, cb) {
  function onwriteStateUpdate (line 14153) | function onwriteStateUpdate(state) {
  function onwrite (line 14160) | function onwrite(stream, er) {
  function afterWrite (line 14185) | function afterWrite(stream, state, finished, cb) {
  function onwriteDrain (line 14195) | function onwriteDrain(stream, state) {
  function clearBuffer (line 14203) | function clearBuffer(stream, state) {
  function needFinish (line 14290) | function needFinish(state) {
  function prefinish (line 14294) | function prefinish(stream, state) {
  function finishMaybe (line 14301) | function finishMaybe(stream, state) {
  function endWritable (line 14315) | function endWritable(stream, state, cb) {
  function CorkedRequest (line 14327) | function CorkedRequest(state) {
  function BufferList (line 14360) | function BufferList() {
  function Stream (line 14486) | function Stream() {
  function ondata (line 14493) | function ondata(chunk) {
  function ondrain (line 14503) | function ondrain() {
  function onend (line 14519) | function onend() {
  function onclose (line 14527) | function onclose() {
  function onerror (line 14535) | function onerror(er) {
  function cleanup (line 14546) | function cleanup() {
  function assertEncoding (line 14606) | function assertEncoding(encoding) {
  function passThroughWrite (line 14782) | function passThroughWrite(buffer) {
  function utf16DetectIncompleteChar (line 14786) | function utf16DetectIncompleteChar(buffer) {
  function base64DetectIncompleteChar (line 14791) | function base64DetectIncompleteChar(buffer) {
  function deprecate (line 14823) | function deprecate (fn, msg) {
  function config (line 14854) | function config (name) {
  function deprecated (line 14955) | function deprecated() {
  function inspect (line 15002) | function inspect(obj, opts) {
  function stylizeWithColor (line 15060) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 15072) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 15077) | function arrayToHash(array) {
  function formatValue (line 15088) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 15201) | function formatPrimitive(ctx, value) {
  function formatError (line 15220) | function formatError(value) {
  function formatArray (line 15225) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 15245) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 15304) | function reduceToSingleString(output, base, braces) {
  function isArray (line 15327) | function isArray(ar) {
  function isBoolean (line 15332) | function isBoolean(arg) {
  function isNull (line 15337) | function isNull(arg) {
  function isNullOrUndefined (line 15342) | function isNullOrUndefined(arg) {
  function isNumber (line 15347) | function isNumber(arg) {
  function isString (line 15352) | function isString(arg) {
  function isSymbol (line 15357) | function isSymbol(arg) {
  function isUndefined (line 15362) | function isUndefined(arg) {
  function isRegExp (line 15367) | function isRegExp(re) {
  function isObject (line 15372) | function isObject(arg) {
  function isDate (line 15377) | function isDate(d) {
  function isError (line 15382) | function isError(e) {
  function isFunction (line 15388) | function isFunction(arg) {
  function isPrimitive (line 15393) | function isPrimitive(arg) {
  function objectToString (line 15405) | function objectToString(o) {
  function pad (line 15410) | function pad(n) {
  function timestamp (line 15419) | function timestamp() {
  function hasOwnProperty (line 15461) | function hasOwnProperty(obj, prop) {

FILE: app_backend/static/plugin/JavaScript-Templates/js/demo.js
  function renderError (line 23) | function renderError (title, error) {
  function render (line 30) | function render (event) {
  function empty (line 49) | function empty (node) {
  function init (line 55) | function init (event) {

FILE: app_backend/static/plugin/JavaScript-Templates/test/vendor/expect.js
  function expect (line 30) | function expect (obj) {
  function Assertion (line 40) | function Assertion (obj, flag, parent) {
  function bind (line 497) | function bind (fn, scope) {
  function every (line 510) | function every (arr, fn, thisObj) {
  function indexOf (line 527) | function indexOf (arr, o, i) {
  function i (line 578) | function i (obj, showHidden, depth) {
  function isArray (line 770) | function isArray (ar) {
  function isRegExp (line 774) | function isRegExp(re) {
  function isDate (line 792) | function isDate(d) {
  function keys (line 796) | function keys (obj) {
  function map (line 812) | function map (arr, mapper, that) {
  function reduce (line 826) | function reduce (arr, fun) {
  function isUndefinedOrNull (line 912) | function isUndefinedOrNull (value) {
  function isArguments (line 916) | function isArguments (object) {
  function regExpEquiv (line 920) | function regExpEquiv (a, b) {
  function objEquiv (line 925) | function objEquiv (a, b) {
  function f (line 980) | function f(n) {
  function date (line 985) | function date(d, key) {
  function quote (line 1011) | function quote(string) {
  function str (line 1027) | function str(key, holder) {
  function walk (line 1202) | function walk(holder, key) {

FILE: app_backend/static/plugin/JavaScript-Templates/test/vendor/mocha.js
  function s (line 1) | function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&re...
  function isArray (line 33) | function isArray(val) {
  function EventEmitter (line 42) | function EventEmitter() {}
  function on (line 81) | function on() {
  function Progress (line 219) | function Progress() {
  function Context (line 355) | function Context() {}
  function Hook (line 455) | function Hook(title, fn) {
  function visit (line 702) | function visit(obj, file) {
  function image (line 996) | function image(name) {
  function Mocha (line 1018) | function Mocha(options) {
  function done (line 1422) | function done(failures) {
  function parse (line 1473) | function parse(str) {
  function shortFormat (line 1515) | function shortFormat(ms) {
  function longFormat (line 1538) | function longFormat(ms) {
  function plural (line 1554) | function plural(ms, n, name) {
  function Pending (line 1577) | function Pending(message) {
  function Base (line 1819) | function Base(runner) {
  function pad (line 1925) | function pad(str, len) {
  function inlineDiff (line 1938) | function inlineDiff(err, escape) {
  function unifiedDiff (line 1972) | function unifiedDiff(err, escape) {
  function errorDiff (line 2013) | function errorDiff(err, type, escape) {
  function escapeInvisibles (line 2034) | function escapeInvisibles(line) {
  function colorLines (line 2048) | function colorLines(name, str) {
  function sameType (line 2067) | function sameType(a, b) {
  function Doc (line 2092) | function Doc(runner) {
  function Dot (line 2158) | function Dot(runner) {
  function HTMLCov (line 2228) | function HTMLCov(runner) {
  function coverageClass (line 2252) | function coverageClass(coveragePctg) {
  function HTML (line 2315) | function HTML(runner) {
  function makeUrl (line 2485) | function makeUrl(s) {
  function error (line 2519) | function error(msg) {
  function fragment (line 2528) | function fragment(html) {
  function hideSuitesWithout (line 2550) | function hideSuitesWithout(classname) {
  function unhide (line 2563) | function unhide() {
  function text (line 2576) | function text(el, contents) {
  function on (line 2587) | function on(el, event, fn) {
  function JSONCov (line 2638) | function JSONCov(runner, output) {
  function map (line 2682) | function map(cov) {
  function coverage (line 2722) | function coverage(filename, data) {
  function clean (line 2762) | function clean(test) {
  function List (line 2791) | function List(runner) {
  function clean (line 2825) | function clean(test) {
  function JSONReporter (line 2854) | function JSONReporter(runner) {
  function clean (line 2902) | function clean(test) {
  function errorJSON (line 2918) | function errorJSON(err) {
  function Landing (line 2968) | function Landing(runner) {
  function List (line 3046) | function List(runner) {
  function Markdown (line 3115) | function Markdown(runner) {
  function Min (line 3210) | function Min(runner) {
  function NyanCat (line 3251) | function NyanCat(runner) {
  function draw (line 3321) | function draw(type, n) {
  function write (line 3489) | function write(string) {
  function Progress (line 3524) | function Progress(runner, options) {
  function Spec (line 3609) | function Spec(runner) {
  function TAP (line 3691) | function TAP(runner) {
  function title (line 3738) | function title(test) {
  function XUnit (line 3778) | function XUnit(runner, options) {
  function tag (line 3888) | function tag(name, attrs, close, content) {
  function cdata (line 3910) | function cdata(str) {
  function Runnable (line 3961) | function Runnable(title, fn) {
  function multiple (line 4139) | function multiple(err) {
  function done (line 4148) | function done(err) {
  function callFn (line 4201) | function callFn(fn) {
  function callFnAsync (line 4221) | function callFnAsync(fn) {
  function Runner (line 4302) | function Runner(suite, delay) {
  function next (line 4520) | function next(i) {
  function next (line 4576) | function next(suite) {
  function hookErr (line 4679) | function hookErr(_, errSuite, after) {
  function next (line 4705) | function next(err, errSuite) {
  function next (line 4820) | function next(errSuite) {
  function done (line 4854) | function done(errSuite) {
  function uncaught (line 4966) | function uncaught(err) {
  function start (line 4970) | function start() {
  function filterLeaks (line 5024) | function filterLeaks(ok, globals) {
  function extraGlobals (line 5065) | function extraGlobals() {
  function Suite (line 5129) | function Suite(title, parentContext) {
  function Test (line 5471) | function Test(title, fn) {
  function ignored (line 5691) | function ignored(path) {
  function highlight (line 5795) | function highlight(js) {
  function emptyRepresentation (line 5834) | function emptyRepresentation(value, type) {
  function jsonStringify (line 5928) | function jsonStringify(object, spaces, depth) {
  function withStack (line 6032) | function withStack(value, fn) {
  function isMochaInternal (line 6186) | function isMochaInternal(line) {
  function isNodeInternal (line 6193) | function isNodeInternal(line) {
  function BrowserStdout (line 6234) | function BrowserStdout(opts) {
  function Bar (line 6304) | function Bar () {}
  function kMaxLength (line 6318) | function kMaxLength () {
  function Buffer (line 6336) | function Buffer (arg) {
  function fromNumber (line 6360) | function fromNumber (that, length) {
  function fromString (line 6370) | function fromString (that, string, encoding) {
  function fromObject (line 6381) | function fromObject (that, object) {
  function fromBuffer (line 6404) | function fromBuffer (that, buffer) {
  function fromArray (line 6411) | function fromArray (that, array) {
  function fromTypedArray (line 6421) | function fromTypedArray (that, array) {
  function fromArrayBuffer (line 6433) | function fromArrayBuffer (that, array) {
  function fromArrayLike (line 6445) | function fromArrayLike (that, array) {
  function fromJsonObject (line 6456) | function fromJsonObject (that, object) {
  function allocate (line 6472) | function allocate (that, length) {
  function checked (line 6488) | function checked (length) {
  function SlowBuffer (line 6498) | function SlowBuffer (subject, encoding) {
  function byteLength (line 6582) | function byteLength (string, encoding) {
  function slowToString (line 6623) | function slowToString (encoding, start, end) {
  function arrayIndexOf (line 6720) | function arrayIndexOf (arr, val, byteOffset) {
  function hexWrite (line 6748) | function hexWrite (buf, string, offset, length) {
  function utf8Write (line 6775) | function utf8Write (buf, string, offset, length) {
  function asciiWrite (line 6779) | function asciiWrite (buf, string, offset, length) {
  function binaryWrite (line 6783) | function binaryWrite (buf, string, offset, length) {
  function base64Write (line 6787) | function base64Write (buf, string, offset, length) {
  function ucs2Write (line 6791) | function ucs2Write (buf, string, offset, length) {
  function base64Slice (line 6874) | function base64Slice (buf, start, end) {
  function utf8Slice (line 6882) | function utf8Slice (buf, start, end) {
  function decodeCodePointsArray (line 6960) | function decodeCodePointsArray (codePoints) {
  function asciiSlice (line 6978) | function asciiSlice (buf, start, end) {
  function binarySlice (line 6988) | function binarySlice (buf, start, end) {
  function hexSlice (line 6998) | function hexSlice (buf, start, end) {
  function utf16leSlice (line 7011) | function utf16leSlice (buf, start, end) {
  function checkOffset (line 7060) | function checkOffset (offset, ext, length) {
  function checkInt (line 7221) | function checkInt (buf, value, offset, ext, max, min) {
  function objectWriteUInt16 (line 7268) | function objectWriteUInt16 (buf, value, offset, littleEndian) {
  function objectWriteUInt32 (line 7302) | function objectWriteUInt32 (buf, value, offset, littleEndian) {
  function checkIEEE754 (line 7446) | function checkIEEE754 (buf, value, offset, ext, max, min) {
  function writeFloat (line 7452) | function writeFloat (buf, value, offset, littleEndian, noAssert) {
  function writeDouble (line 7468) | function writeDouble (buf, value, offset, littleEndian, noAssert) {
  function base64clean (line 7653) | function base64clean (str) {
  function stringtrim (line 7665) | function stringtrim (str) {
  function toHex (line 7670) | function toHex (n) {
  function utf8ToBytes (line 7675) | function utf8ToBytes (string, units) {
  function asciiToBytes (line 7755) | function asciiToBytes (str) {
  function utf16leToBytes (line 7764) | function utf16leToBytes (str, units) {
  function base64ToBytes (line 7780) | function base64ToBytes (str) {
  function blitBuffer (line 7784) | function blitBuffer (src, dst, offset, length) {
  function decode (line 7810) | function decode (elt) {
  function b64ToByteArray (line 7828) | function b64ToByteArray (b64) {
  function uint8ToBase64 (line 7874) | function uint8ToBase64 (uint8) {
  function EventEmitter (line 8061) | function EventEmitter() {
  function g (line 8203) | function g() {
  function isFunction (line 8326) | function isFunction(arg) {
  function isNumber (line 8330) | function isNumber(arg) {
  function isObject (line 8334) | function isObject(arg) {
  function isUndefined (line 8338) | function isUndefined(arg) {
  function cleanUpNextTick (line 8428) | function cleanUpNextTick() {
  function drainQueue (line 8440) | function drainQueue() {
  function Item (line 8478) | function Item(fun, array) {
  function noop (line 8492) | function noop() {}
  function Duplex (line 8569) | function Duplex(options) {
  function onend (line 8590) | function onend() {
  function forEach (line 8601) | function forEach (xs, f) {
  function PassThrough (line 8645) | function PassThrough(options) {
  function ReadableState (line 8722) | function ReadableState(options, stream) {
  function Readable (line 8790) | function Readable(options) {
  function readableAddChunk (line 8828) | function readableAddChunk(stream, state, chunk, encoding, addToFront) {
  function needMoreData (line 8884) | function needMoreData(state) {
  function roundUpToNextPowerOf2 (line 8902) | function roundUpToNextPowerOf2(n) {
  function howMuchToRead (line 8914) | function howMuchToRead(n, state) {
  function chunkInvalid (line 9067) | function chunkInvalid(state, chunk) {
  function onEofChunk (line 9079) | function onEofChunk(stream, state) {
  function emitReadable (line 9096) | function emitReadable(stream) {
  function emitReadable_ (line 9111) | function emitReadable_(stream) {
  function maybeReadMore (line 9124) | function maybeReadMore(stream, state) {
  function maybeReadMore_ (line 9133) | function maybeReadMore_(stream, state) {
  function onunpipe (line 9185) | function onunpipe(readable) {
  function onend (line 9192) | function onend() {
  function cleanup (line 9204) | function cleanup() {
  function ondata (line 9227) | function ondata(chunk) {
  function onerror (line 9240) | function onerror(er) {
  function onclose (line 9259) | function onclose() {
  function onfinish (line 9264) | function onfinish() {
  function unpipe (line 9271) | function unpipe() {
  function pipeOnDrain (line 9288) | function pipeOnDrain(src) {
  function resume (line 9406) | function resume(stream, state) {
  function resume_ (line 9415) | function resume_(stream, state) {
  function flow (line 9433) | function flow(stream) {
  function fromList (line 9512) | function fromList(n, state) {
  function endReadable (line 9576) | function endReadable(stream) {
  function forEach (line 9597) | function forEach (xs, f) {
  function indexOf (line 9603) | function indexOf (xs, x) {
  function TransformState (line 9688) | function TransformState(options, stream) {
  function afterTransform (line 9699) | function afterTransform(stream, er, data) {
  function Transform (line 9725) | function Transform(options) {
  function done (line 9804) | function done(stream, er) {
  function WriteReq (line 9867) | function WriteReq(chunk, encoding, cb) {
  function WritableState (line 9873) | function WritableState(options, stream) {
  function Writable (line 9961) | function Writable(options) {
  function writeAfterEnd (line 9983) | function writeAfterEnd(stream, state, cb) {
  function validChunk (line 9997) | function validChunk(stream, state, chunk, cb) {
  function decodeChunk (line 10061) | function decodeChunk(state, chunk, encoding) {
  function writeOrBuffer (line 10073) | function writeOrBuffer(stream, state, chunk, encoding, cb) {
  function doWrite (line 10094) | function doWrite(stream, state, writev, len, chunk, encoding, cb) {
  function onwriteError (line 10106) | function onwriteError(stream, state, sync, er, cb) {
  function onwriteStateUpdate (line 10121) | function onwriteStateUpdate(state) {
  function onwrite (line 10128) | function onwrite(stream, er) {
  function afterWrite (line 10158) | function afterWrite(stream, state, finished, cb) {
  function onwriteDrain (line 10169) | function onwriteDrain(stream, state) {
  function clearBuffer (line 10178) | function clearBuffer(stream, state) {
  function needFinish (line 10263) | function needFinish(stream, state) {
  function prefinish (line 10270) | function prefinish(stream, state) {
  function finishMaybe (line 10277) | function finishMaybe(stream, state) {
  function endWritable (line 10290) | function endWritable(stream, state, cb) {
  function isArray (line 10328) | function isArray(ar) {
  function isBoolean (line 10333) | function isBoolean(arg) {
  function isNull (line 10338) | function isNull(arg) {
  function isNullOrUndefined (line 10343) | function isNullOrUndefined(arg) {
  function isNumber (line 10348) | function isNumber(arg) {
  function isString (line 10353) | function isString(arg) {
  function isSymbol (line 10358) | function isSymbol(arg) {
  function isUndefined (line 10363) | function isUndefined(arg) {
  function isRegExp (line 10368) | function isRegExp(re) {
  function isObject (line 10373) | function isObject(arg) {
  function isDate (line 10378) | function isDate(d) {
  function isError (line 10383) | function isError(e) {
  function isFunction (line 10389) | function isFunction(arg) {
  function isPrimitive (line 10394) | function isPrimitive(arg) {
  function isBuffer (line 10404) | function isBuffer(arg) {
  function objectToString (line 10409) | function objectToString(o) {
  function Stream (line 10473) | function Stream() {
  function ondata (line 10480) | function ondata(chunk) {
  function ondrain (line 10490) | function ondrain() {
  function onend (line 10506) | function onend() {
  function onclose (line 10514) | function onclose() {
  function onerror (line 10522) | function onerror(er) {
  function cleanup (line 10533) | function cleanup() {
  function assertEncoding (line 10593) | function assertEncoding(encoding) {
  function passThroughWrite (line 10769) | function passThroughWrite(buffer) {
  function utf16DetectIncompleteChar (line 10773) | function utf16DetectIncompleteChar(buffer) {
  function base64DetectIncompleteChar (line 10778) | function base64DetectIncompleteChar(buffer) {
  function deprecated (line 10869) | function deprecated() {
  function inspect (line 10916) | function inspect(obj, opts) {
  function stylizeWithColor (line 10974) | function stylizeWithColor(str, styleType) {
  function stylizeNoColor (line 10986) | function stylizeNoColor(str, styleType) {
  function arrayToHash (line 10991) | function arrayToHash(array) {
  function formatValue (line 11002) | function formatValue(ctx, value, recurseTimes) {
  function formatPrimitive (line 11115) | function formatPrimitive(ctx, value) {
  function formatError (line 11134) | function formatError(value) {
  function formatArray (line 11139) | function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
  function formatProperty (line 11159) | function formatProperty(ctx, value, recurseTimes, visibleKeys, key, arra...
  function reduceToSingleString (line 11218) | function reduceToSingleString(output, base, braces) {
  function isArray (line 11241) | function isArray(ar) {
  function isBoolean (line 11246) | function isBoolean(arg) {
  function isNull (line 11251) | function isNull(arg) {
  function isNullOrUndefined (line 11256) | function isNullOrUndefined(arg) {
  funct
Copy disabled (too large) Download .json
Condensed preview — 2856 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (35,834K chars).
[
  {
    "path": ".gitignore",
    "chars": 365,
    "preview": "# Created by .ignore support plugin (hsz.mobi)\n### Python template\n\n*.env\n*.pyc\n#*.log\n.idea/\n*.DS_Store\n\napp_frontend/s"
  },
  {
    "path": "README.md",
    "chars": 41047,
    "preview": "## Flask 项目模拟\n\n\n- product 生产环境\n- develop 开发环境\n\n### 项目演示步骤\n\n虚拟环境 部署方式\n```\n$ cd flask_project                  # 进入项目目录\n$ "
  },
  {
    "path": "app_api/README.md",
    "chars": 10,
    "preview": "## App 专用\n"
  },
  {
    "path": "app_api/__init__.py",
    "chars": 251,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: __init__.py.py\n@time: 2017/4/19 "
  },
  {
    "path": "app_backend/README.md",
    "chars": 8,
    "preview": "## 运营后台\n"
  },
  {
    "path": "app_backend/__init__.py",
    "chars": 3978,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: __init__.py\n@time: 2017/4/9 上午10"
  },
  {
    "path": "app_backend/api/__init__.py",
    "chars": 252,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: __init__.py.py\n@time: 2017/3/10 "
  },
  {
    "path": "app_backend/api/active.py",
    "chars": 3276,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: active.py\n@time: 2017/5/14 上午1:4"
  },
  {
    "path": "app_backend/api/active_item.py",
    "chars": 1802,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: active_item.py\n@time: 2017/5/20 "
  },
  {
    "path": "app_backend/api/admin.py",
    "chars": 1866,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: admin.py\n@time: 17-4-20 下午10:04\n"
  },
  {
    "path": "app_backend/api/admin_role.py",
    "chars": 1965,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: admin_role.py\n@time: 2017/6/14 上"
  },
  {
    "path": "app_backend/api/apply_get.py",
    "chars": 7902,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: apply_get.py\n@time: 2017/4/13 上午"
  },
  {
    "path": "app_backend/api/apply_put.py",
    "chars": 7846,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: apply_put.py\n@time: 2017/4/13 下午"
  },
  {
    "path": "app_backend/api/author.py",
    "chars": 1663,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: author.py\n@time: 16-1-17 上午12:05"
  },
  {
    "path": "app_backend/api/blog.py",
    "chars": 3382,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@blog: zhanghe\n@software: PyCharm\n@file: blog.py\n@time: 16-1-21 上午10:24\n\"\"\""
  },
  {
    "path": "app_backend/api/complaint.py",
    "chars": 1755,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: complaint.py\n@time: 2017/4/29 下午"
  },
  {
    "path": "app_backend/api/message.py",
    "chars": 1695,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: message.py\n@time: 2017/6/24 下午10"
  },
  {
    "path": "app_backend/api/order.py",
    "chars": 5522,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: order.py\n@time: 2017/4/13 下午9:45"
  },
  {
    "path": "app_backend/api/scheduling.py",
    "chars": 3483,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: scheduling.py\n@time: 2017/6/29 下"
  },
  {
    "path": "app_backend/api/scheduling_item.py",
    "chars": 2019,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: scheduling_item.py\n@time: 2017/6"
  },
  {
    "path": "app_backend/api/score.py",
    "chars": 1634,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: score.py\n@time: 2017/4/25 下午1:29"
  },
  {
    "path": "app_backend/api/user.py",
    "chars": 8539,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@user: zhanghe\n@software: PyCharm\n@file: user.py\n@time: 17-4-21 下午10:42\n\"\"\""
  },
  {
    "path": "app_backend/api/user_auth.py",
    "chars": 1890,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: user_auth.py\n@time: 16-4-28 上午1:"
  },
  {
    "path": "app_backend/api/user_bank.py",
    "chars": 1906,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: user_bank.py\n@time: 2017/4/26 下午"
  },
  {
    "path": "app_backend/api/user_config.py",
    "chars": 1996,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: user_config.py\n@time: 2017/6/29 "
  },
  {
    "path": "app_backend/api/user_profile.py",
    "chars": 2547,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@user: zhanghe\n@software: PyCharm\n@file: user_profile.py\n@time: 17-4-29 下午1"
  },
  {
    "path": "app_backend/api/wallet.py",
    "chars": 1664,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: wallet.py\n@time: 2017/4/25 下午1:2"
  },
  {
    "path": "app_backend/database.py",
    "chars": 218,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: database.py\n@time: 17-4-20 下午13:"
  },
  {
    "path": "app_backend/filters.py",
    "chars": 6164,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: filters.py\n@time: 2017/4/13 下午2:"
  },
  {
    "path": "app_backend/forms/__init__.py",
    "chars": 4721,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: __init__.py.py\n@time: 2017/4/9 上"
  },
  {
    "path": "app_backend/forms/active.py",
    "chars": 1596,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: active.py\n@time: 2017/6/1 下午2:42"
  },
  {
    "path": "app_backend/forms/admin.py",
    "chars": 3987,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: user.py\n@time: 2017/3/17 下午11:49"
  },
  {
    "path": "app_backend/forms/apply_get.py",
    "chars": 1308,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: apply_get.py\n@time: 2017/4/13 下午"
  },
  {
    "path": "app_backend/forms/apply_put.py",
    "chars": 1308,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: apply_put.py\n@time: 2017/4/13 下午"
  },
  {
    "path": "app_backend/forms/blog.py",
    "chars": 896,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: blog.py\n@time: 2017/3/10 下午11:00"
  },
  {
    "path": "app_backend/forms/complaint.py",
    "chars": 1029,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: complaint.py\n@time: 2017/6/24 下午"
  },
  {
    "path": "app_backend/forms/login.py",
    "chars": 1674,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: login.py\n@time: 2017/3/10 下午10:4"
  },
  {
    "path": "app_backend/forms/order.py",
    "chars": 1340,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: order.py\n@time: 2017/4/13 下午9:32"
  },
  {
    "path": "app_backend/forms/pay.py",
    "chars": 244,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: pay.py\n@time: 2017/3/18 上午12:29\n"
  },
  {
    "path": "app_backend/forms/scheduling.py",
    "chars": 1600,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: scheduling.py\n@time: 2017/6/29 下"
  },
  {
    "path": "app_backend/forms/score.py",
    "chars": 245,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: score.py\n@time: 2017/4/25 下午1:25"
  },
  {
    "path": "app_backend/forms/settings.py",
    "chars": 10539,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: settings.py\n@time: 2017/6/4 上午11"
  },
  {
    "path": "app_backend/forms/user.py",
    "chars": 7437,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: user.py\n@time: 2017/3/17 下午11:49"
  },
  {
    "path": "app_backend/forms/wallet.py",
    "chars": 246,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: wallet.py\n@time: 2017/4/25 下午1:2"
  },
  {
    "path": "app_backend/lib/__init__.py",
    "chars": 247,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: __init__.py\n@time: 16-1-27 上午10:"
  },
  {
    "path": "app_backend/lib/captcha.py",
    "chars": 4310,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: captcha.py\n@time: 16-4-11 下午9:23"
  },
  {
    "path": "app_backend/lib/cart.py",
    "chars": 3670,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: cart.py\n@time: 16-1-27 上午10:27\n\""
  },
  {
    "path": "app_backend/lib/container.py",
    "chars": 4500,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: container.py\n@time: 16-2-17 下午3:"
  },
  {
    "path": "app_backend/lib/counter.py",
    "chars": 6422,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: count.py\n@time: 16-1-27 下午3:03\n\""
  },
  {
    "path": "app_backend/lib/mongo.py",
    "chars": 6134,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: mongo.py\n@time: 2017/4/10 下午11:4"
  },
  {
    "path": "app_backend/lib/qiniu_store.py",
    "chars": 1397,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: qiniu.py\n@time: 16-5-2 下午1:41\n\"\""
  },
  {
    "path": "app_backend/lib/rabbit_mq.py",
    "chars": 14375,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: rabbit_mq.py\n@time: 2017/4/1 上午9"
  },
  {
    "path": "app_backend/lib/redis_session.py",
    "chars": 2551,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: redis_session.py\n@time: 2017/3/7"
  },
  {
    "path": "app_backend/lib/sendcloud.py",
    "chars": 3219,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: sendcloud.py\n@time: 16-5-2 下午12:"
  },
  {
    "path": "app_backend/lib/session.py",
    "chars": 4005,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: session.py\n@time: 16-8-3 下午5:56\n"
  },
  {
    "path": "app_backend/lib/sms_chuanglan.py",
    "chars": 1291,
    "preview": "#!/usr/bin/env python\r\n# encoding: utf-8\r\n\r\n\"\"\"\r\n@author: zhanghe\r\n@software: PyCharm\r\n@file: cart.py\r\n@time: 16-1-27 上午"
  },
  {
    "path": "app_backend/lib/sms_chuanglan_iso.py",
    "chars": 2824,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: sms_chuanglan_iso.py.py\n@time: 2"
  },
  {
    "path": "app_backend/lib/token.py",
    "chars": 3035,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: token.py\n@time: 16-4-4 下午9:31\n\"\""
  },
  {
    "path": "app_backend/login.py",
    "chars": 259,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: login.py\n@time: 17-4-20 下午1:46\n\""
  },
  {
    "path": "app_backend/models.py",
    "chars": 25702,
    "preview": "# coding: utf-8\nfrom sqlalchemy import Column, Date, DateTime, Index, Integer, Numeric, String, text\nfrom database impor"
  },
  {
    "path": "app_backend/pages/blank.html",
    "chars": 19358,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/buttons.html",
    "chars": 32336,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/flot.html",
    "chars": 24574,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/forms.html",
    "chars": 32281,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/grid.html",
    "chars": 35895,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/icons.html",
    "chars": 122479,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/index.html",
    "chars": 52340,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/login.html",
    "chars": 3111,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/morris.html",
    "chars": 22987,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/notifications.html",
    "chars": 28542,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/panels-wells.html",
    "chars": 40274,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/tables.html",
    "chars": 59701,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/pages/typography.html",
    "chars": 29921,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n\n    <meta charset=\"utf-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE="
  },
  {
    "path": "app_backend/permissions.py",
    "chars": 604,
    "preview": "#!/usr/bin/env python\n# encoding: utf-8\n\n\"\"\"\n@author: zhanghe\n@software: PyCharm\n@file: permissions.py\n@time: 2017/6/8 下"
  },
  {
    "path": "app_backend/static/css/bootstrap-select.css",
    "chars": 7768,
    "preview": "/*!\r\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\r\n *\r\n * Copyright 2013-2017 bootstrap-"
  },
  {
    "path": "app_backend/static/css/bootstrap-theme.css",
    "chars": 26132,
    "preview": "/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "app_backend/static/css/bootstrap.css",
    "chars": 147430,
    "preview": "/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under MIT (https://gi"
  },
  {
    "path": "app_backend/static/css/custom.css",
    "chars": 32,
    "preview": ".fa {\n    font-size: initial;\n}\n"
  },
  {
    "path": "app_backend/static/css/lightbox.css",
    "chars": 3733,
    "preview": "/* Preload images */\nbody:after {\n  content: url(../images/close.png) url(../images/loading.gif) url(../images/prev.png)"
  },
  {
    "path": "app_backend/static/css/sb-admin-2.css",
    "chars": 8428,
    "preview": "/*!\n * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2)\n * Copyright 2013"
  },
  {
    "path": "app_backend/static/css/slideout.css",
    "chars": 657,
    "preview": ".page-menu {\n    background-image: linear-gradient(90deg, #eeeeee 90%, #bbbbbb 100%);\n}\n\n.page-menu .container {\n    mar"
  },
  {
    "path": "app_backend/static/csv/flare.csv",
    "chars": 7988,
    "preview": "id,value\nflare,\nflare.analytics,\nflare.analytics.cluster,\nflare.analytics.cluster.AgglomerativeCluster,3938\nflare.analyt"
  },
  {
    "path": "app_backend/static/js/bootstrap-select.js",
    "chars": 69851,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/bootstrap.js",
    "chars": 68890,
    "preview": "/*!\n * Bootstrap v3.3.5 (http://getbootstrap.com)\n * Copyright 2011-2015 Twitter, Inc.\n * Licensed under the MIT license"
  },
  {
    "path": "app_backend/static/js/custom.js",
    "chars": 2545,
    "preview": "/**\n * Created by zhanghe on 16-1-31.\n */\n\n/* 轮播大图延时加载 */\nfunction lazyContainer(searchNode) {\n    $(searchNode).find('."
  },
  {
    "path": "app_backend/static/js/i18n/defaults-ar_AR.js",
    "chars": 1636,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-bg_BG.js",
    "chars": 1508,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-cro_CRO.js",
    "chars": 1521,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-cs_CZ.js",
    "chars": 1124,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-da_DK.js",
    "chars": 1449,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-de_DE.js",
    "chars": 1490,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-en_US.js",
    "chars": 1444,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-es_CL.js",
    "chars": 1218,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-es_ES.js",
    "chars": 1218,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-eu.js",
    "chars": 1139,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-fa_IR.js",
    "chars": 1221,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-fi_FI.js",
    "chars": 1457,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-fr_FR.js",
    "chars": 1501,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-hu_HU.js",
    "chars": 1290,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-id_ID.js",
    "chars": 1169,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-it_IT.js",
    "chars": 1324,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-ko_KR.js",
    "chars": 1238,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-lt_LT.js",
    "chars": 1534,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-nb_NO.js",
    "chars": 1460,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-nl_NL.js",
    "chars": 1138,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-pl_PL.js",
    "chars": 1214,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-pt_BR.js",
    "chars": 1136,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-pt_PT.js",
    "chars": 1125,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-ro_RO.js",
    "chars": 1153,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-ru_RU.js",
    "chars": 1243,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-sk_SK.js",
    "chars": 1227,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-sl_SI.js",
    "chars": 1307,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-sv_SE.js",
    "chars": 1357,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-tr_TR.js",
    "chars": 1481,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-ua_UA.js",
    "chars": 1132,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-zh_CN.js",
    "chars": 1035,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/i18n/defaults-zh_TW.js",
    "chars": 1090,
    "preview": "/*!\n * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select)\n *\n * Copyright 2013-2017 bootstrap-sel"
  },
  {
    "path": "app_backend/static/js/npm.js",
    "chars": 484,
    "preview": "// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment.\nrequ"
  },
  {
    "path": "app_backend/static/js/sb-admin-2.js",
    "chars": 1626,
    "preview": "/*!\n * Start Bootstrap - SB Admin 2 v3.3.7+1 (http://startbootstrap.com/template-overviews/sb-admin-2)\n * Copyright 2013"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.codeclimate.yml",
    "chars": 326,
    "preview": "engines:\n  duplication:\n    enabled: true\n    config:\n      languages:\n      - javascript\n    exclude_paths:\n    - \"samp"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.editorconfig",
    "chars": 172,
    "preview": "# http://editorconfig.org\nroot = true\n\n[*]\nindent_style = tab\nindent_size = 4\nend_of_line = lf\ncharset = utf-8\ntrim_trai"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.eslintignore",
    "chars": 16,
    "preview": "**/*{.,-}min.js\n"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.eslintrc",
    "chars": 4568,
    "preview": "ecmaFeatures:\n  modules: true\n  jsx: true\n\nenv:\n  amd: true\n  browser: true\n  es6: true\n  jquery: true\n  node: true\n\n# h"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.github/ISSUE_TEMPLATE.md",
    "chars": 1653,
    "preview": "<!--\nPlease consider the following before submitting an issue:\n\n- Issues are reserved for BUG reports and FEATURE reques"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.github/PULL_REQUEST_TEMPLATE.md",
    "chars": 368,
    "preview": "Please consider the following before submitting a pull request:\n\nGuidelines for contributing: https://github.com/chartjs"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.gitignore",
    "chars": 118,
    "preview": "/_book\n/coverage\n/custom\n#/dist\n/docs/index.md\n/gh-pages\n/node_modules\n.DS_Store\n.idea\n.vscode\nbower.json\n*.log\n*.swp\n"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.npmignore",
    "chars": 131,
    "preview": "/.git\n/.github\n/coverage\n/custom\n/dist/*.zip\n/docs/index.md\n/node_modules\n\n.codeclimate.yml\n.DS_Store\n.gitignore\n.idea\n."
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/.travis.yml",
    "chars": 1353,
    "preview": "language: node_js\nnode_js:\n  - \"5.10\"\n\nbefore_install:\n  - \"export CHROME_BIN=/usr/bin/google-chrome\"\n  - \"export DISPLA"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/LICENSE.md",
    "chars": 1083,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2013-2017 Nick Downie\n\nPermission is hereby granted, free of charge, to any person "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/MAINTAINING.md",
    "chars": 1646,
    "preview": "# Maintaining\n## Release Process\nChart.js relies on [Travis CI](https://travis-ci.org/) to automate the library [release"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/README.md",
    "chars": 2858,
    "preview": "# Chart.js\n\n[![Build Status](https://travis-ci.org/chartjs/Chart.js.svg?branch=master)](https://travis-ci.org/chartjs/Ch"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/book.json",
    "chars": 463,
    "preview": "{\n  \"root\": \"./docs\",\n  \"author\": \"chartjs\",\n  \"gitbook\": \"3.2.2\",\n  \"plugins\": [\"-lunr\", \"-search\", \"search-plus\", \"anc"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/composer.json",
    "chars": 547,
    "preview": "{\n    \"name\": \"nnnick/chartjs\",\n    \"type\": \"library\",\n    \"description\": \"Simple HTML5 charts using the canvas element."
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/dist/Chart.bundle.js",
    "chars": 494466,
    "preview": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.6.0\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT lice"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/dist/Chart.js",
    "chars": 365521,
    "preview": "/*!\n * Chart.js\n * http://chartjs.org/\n * Version: 2.6.0\n *\n * Copyright 2017 Nick Downie\n * Released under the MIT lice"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/README.md",
    "chars": 2469,
    "preview": "# Chart.js\n\n[![Chart.js on Slack](https://img.shields.io/badge/slack-Chart.js-blue.svg)](https://chart-js-automation.her"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/SUMMARY.md",
    "chars": 1906,
    "preview": "# Summary\n\n* [Chart.js](README.md)\n* [Getting Started](getting-started/README.md)\n  * [Installation](getting-started/ins"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/README.md",
    "chars": 3533,
    "preview": "# Axes\n\nAxes are an integral part of a chart. They are used to determine how data maps to a pixel value on the chart. In"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/cartesian/README.md",
    "chars": 4708,
    "preview": "# Cartesian Axes\n\nAxes that follow a cartesian grid are known as 'Cartesian Axes'. Cartesian axes are used for line, bar"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/cartesian/category.md",
    "chars": 1568,
    "preview": "# Category Cartesian Axis\n\nThe category scale will be familiar to those who have used v1.0. Labels are drawn from one of"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/cartesian/linear.md",
    "chars": 3212,
    "preview": "# Linear Cartesian Axis\n\nThe linear scale is use to chart numerical data. It can be placed on either the x or y axis. Th"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/cartesian/logarithmic.md",
    "chars": 733,
    "preview": "# Logarithmic Cartesian Axis\n\nThe logarithmic scale is use to chart numerical data. It can be placed on either the x or "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/cartesian/time.md",
    "chars": 3462,
    "preview": "# Time Cartesian Axis\n\nThe time scale is used to display times and dates. When building its ticks, it will automatically"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/labelling.md",
    "chars": 1877,
    "preview": "# Labeling Axes\n\nWhen creating a chart, you want to tell the viewer what data they are viewing. To do this, you need to "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/radial/README.md",
    "chars": 271,
    "preview": "# Radial Axes\n\nRadial axes are used specifically for the radar and polar area chart types. These axes overlay the chart "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/radial/linear.md",
    "chars": 5477,
    "preview": "# Linear Radial Axis\n\nThe linear scale is use to chart numerical data. As the name suggests, linear interpolation is use"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/axes/styling.md",
    "chars": 3484,
    "preview": "# Styling\n\nThere are a number of options to allow styling an axis. There are settings to control [grid lines](#grid-line"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/README.md",
    "chars": 387,
    "preview": "# Charts\n\nChart.js comes with built-in chart types:\n* [line](./line.md)\n* [bar](./bar.md)\n* [radar](./radar.md)\n* [polar"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/area.md",
    "chars": 2515,
    "preview": "# Area Charts\n\nBoth [line](line.md) and [radar](radar.md) charts support a `fill` option on the dataset object which can"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/bar.md",
    "chars": 9033,
    "preview": "# Bar\nA bar chart provides a way of showing data values represented as vertical bars. It is sometimes used to show trend"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/bubble.md",
    "chars": 3078,
    "preview": "# Bubble Chart\n\nA bubble chart is used to display three dimensions of data at the same time. The location of the bubble "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/doughnut.md",
    "chars": 4049,
    "preview": "# Doughnut and Pie\nPie and doughnut charts are probably the most commonly used charts. They are divided into segments, t"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/line.md",
    "chars": 9950,
    "preview": "# Line\nA line chart is a way of plotting data points on a line. Often, it is used to show trend data, or the comparison "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/mixed.md",
    "chars": 1853,
    "preview": "# Mixed Chart Types\n\nWith Chart.js, it is possible to create mixed charts that are a combination of two or more differen"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/polar.md",
    "chars": 3494,
    "preview": "# Polar Area\n\nPolar area charts are similar to pie charts, but each segment has the same angle - the radius of the segme"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/radar.md",
    "chars": 5649,
    "preview": "# Radar\nA radar chart is a way of showing multiple data points and the variation between them.\n\nThey are often useful fo"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/charts/scatter.md",
    "chars": 1152,
    "preview": "# Scatter Chart\n\nScatter charts are based on basic line charts with the x axis changed to a linear axis. To use a scatte"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/configuration/README.md",
    "chars": 1587,
    "preview": "# Configuration\n\nThe configuration is used to change how the chart behaves. There are properties to control styling, fon"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/configuration/animations.md",
    "chars": 2677,
    "preview": "# Animations\n\nChart.js animates charts out of the box. A number of options are provided to configure how the animation l"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/configuration/elements.md",
    "chars": 4099,
    "preview": "# Elements\n\nWhile chart types provide settings to configure the styling of each dataset, you sometimes want to style **a"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/configuration/layout.md",
    "chars": 986,
    "preview": "# Layout Configuration\n\nThe layout configuration is passed into the `options.layout` namespace. The global options for t"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/configuration/legend.md",
    "chars": 5921,
    "preview": "# Legend Configuration\n\nThe chart legend displays data about the datasets that area appearing on the chart.\n\n## Configur"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/configuration/title.md",
    "chars": 1259,
    "preview": "# Title\n\nThe chart title defines text to draw at the top of the chart.\n\n## Title Configuration\nThe title configuration i"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/configuration/tooltip.md",
    "chars": 12780,
    "preview": "# Tooltips\n\n## Tooltip Configuration\n\nThe tooltip configuration is passed into the `options.tooltips` namespace. The glo"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/developers/README.md",
    "chars": 877,
    "preview": "# Developers\nDeveloper features allow extending and enhancing Chart.js in many different ways.\n\n# Browser support\n\nChart"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/developers/api.md",
    "chars": 5441,
    "preview": "# Chart Prototype Methods\n\nFor each chart, there are a set of global prototype methods on the shared `ChartType` which y"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/developers/axes.md",
    "chars": 5607,
    "preview": "# New Axes\n\nAxes in Chart.js can be individually extended. Axes should always derive from Chart.Scale but this is not a "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/developers/charts.md",
    "chars": 4433,
    "preview": "# New Charts\n\nChart.js 2.0 introduces the concept of controllers for each dataset. Like scales, new controllers can be w"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/developers/contributing.md",
    "chars": 3089,
    "preview": "# Contributing\n\nNew contributions to the library are welcome, but we ask that you please follow these guidelines:\n\n- Use"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/developers/plugins.md",
    "chars": 3282,
    "preview": "# Plugins\n\nPlugins are the most efficient way to customize or change the default behavior of a chart. They have been int"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/developers/updates.md",
    "chars": 940,
    "preview": "# Updating Charts\n\nIt's pretty common to want to update charts after they've been created. When the chart data is change"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/general/README.md",
    "chars": 439,
    "preview": "# General Chart.js Configuration\n\nThese sections describe general configuration options that can apply elsewhere in the "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/general/colors.md",
    "chars": 2137,
    "preview": "# Colors\n\nWhen supplying colors to Chart options, you can use a number of formats. You can specify the color as a string"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/general/fonts.md",
    "chars": 1207,
    "preview": "# Fonts\n\nThere are 4 special global settings that can change all of the fonts on the chart. These options are in `Chart."
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/general/interactions/README.md",
    "chars": 705,
    "preview": "# Interactions\n\nThe hover configuration is passed into the `options.hover` namespace. The global hover configuration is "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/general/interactions/events.md",
    "chars": 1029,
    "preview": "# Events\nThe following properties define how the chart interacts with events.\n\n| Name | Type | Default | Description\n| -"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/general/interactions/modes.md",
    "chars": 2767,
    "preview": "# Interaction Modes\n\nWhen configuring interaction with the graph via hover or tooltips, a number of different modes are "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/general/responsive.md",
    "chars": 2379,
    "preview": "# Responsive Charts\n\nWhen it comes to change the chart size based on the window size, a major limitation is that the can"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/getting-started/README.md",
    "chars": 1336,
    "preview": "# Getting Started\n\nLet's get started using Chart.js!\n\nFirst, we need to have a canvas in our page.\n\n```html\n<canvas id=\""
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/getting-started/installation.md",
    "chars": 1470,
    "preview": "# Installation\nChart.js can be installed via npm or bower. It is recommended to get Chart.js this way.\n\n## npm\n\n```bash\n"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/getting-started/integration.md",
    "chars": 880,
    "preview": "# Integration\n\nChart.js can be integrated with plain JavaScript or with different module loaders. The examples below sho"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/getting-started/usage.md",
    "chars": 1997,
    "preview": "# Usage\nChart.js can be used with ES6 modules, plain JavaScript and module loaders.\n\n## Creating a Chart\n\nTo create a ch"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/notes/README.md",
    "chars": 18,
    "preview": "# Additional Notes"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/notes/comparison.md",
    "chars": 1159,
    "preview": "# Comparison with Other Charting Libraries\n\nLibrary Features\n\n| Feature | Chart.js | D3 | HighCharts | Chartist |\n| ----"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/notes/extensions.md",
    "chars": 2892,
    "preview": "# Popular Extensions\n\nMany extensions can be found on the [Chart.js GitHub organization](https://github.com/chartjs) or "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/notes/license.md",
    "chars": 202,
    "preview": "# License\n\nChart.js is <a href=\"https://github.com/chartjs/Chart.js\" target=\"_blank\">open source</a> and available under"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/docs/style.css",
    "chars": 265,
    "preview": "a.anchorjs-link {\n    color: rgba(65, 131, 196, 0.1);\n    font-weight: 400;\n    text-decoration: none;\n    transition: c"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/gulpfile.js",
    "chars": 6591,
    "preview": "var gulp = require('gulp');\nvar concat = require('gulp-concat');\nvar connect = require('gulp-connect');\nvar eslint = req"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/karma.conf.js",
    "chars": 1080,
    "preview": "/* eslint camelcase: 0 */\n\nmodule.exports = function(karma) {\n\tvar args = karma.args || {};\n\tvar config = {\n\t\tbrowsers: "
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/package.json",
    "chars": 1452,
    "preview": "{\n  \"name\": \"chart.js\",\n  \"homepage\": \"http://www.chartjs.org\",\n  \"description\": \"Simple HTML5 charts using the canvas e"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/advanced/data-labelling.html",
    "chars": 4763,
    "preview": "\n<!doctype html>\n<html>\n\n<head>\n    <title>Labelling Data Points</title>\n    <script src=\"../../dist/Chart.bundle.js\"></"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/advanced/progress-bar.html",
    "chars": 3350,
    "preview": "<!doctype html>\n<html>\n<head>\n\t<title> Animation Callbacks </title>\n    <script src=\"../../dist/Chart.bundle.js\"></scrip"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/area/analyser.js",
    "chars": 1399,
    "preview": "/* global Chart */\n\n'use strict';\n\n(function() {\n\tChart.plugins.register({\n\t\tid: 'samples_filler_analyser',\n\n\t\tbeforeIni"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/area/line-boundaries.html",
    "chars": 2715,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\""
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/area/line-datasets.html",
    "chars": 3561,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\""
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/area/line-stacked.html",
    "chars": 5194,
    "preview": "<!doctype html>\n<html>\n\n<head>\n\t<title>Line Chart</title>\n\t<script src=\"../../../dist/Chart.bundle.js\"></script>\n\t<scrip"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/area/radar.html",
    "chars": 3180,
    "preview": "<!DOCTYPE html>\n<html lang=\"en-US\">\n<head>\n\t<meta charset=\"utf-8\">\n\t<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\""
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/bar/horizontal.html",
    "chars": 5572,
    "preview": "<!doctype html>\n<html>\n\n<head>\n    <title>Horizontal Bar Chart</title>\n    <script src=\"../../../dist/Chart.bundle.js\"><"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/bar/multi-axis.html",
    "chars": 3452,
    "preview": "<!doctype html>\n<html>\n\n<head>\n    <title>Bar Chart Multi Axis</title>\n    <script src=\"../../../dist/Chart.bundle.js\"><"
  },
  {
    "path": "app_backend/static/plugin/Chart.js-2.6.0/samples/charts/bar/stacked-group.html",
    "chars": 3349,
    "preview": "<!doctype html>\n<html>\n\n<head>\n    <title>Stacked Bar Chart with Groups</title>\n    <script src=\"../../../dist/Chart.bun"
  }
]

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

About this extraction

This page contains the full source code of the zhanghe06/flask_project GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2856 files (32.0 MB), approximately 8.5M tokens, and a symbol index with 12586 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!